-----------------------------------------------------------------------------
 MANIFEST                  |  378 -
 Makefile                  |   85 
 README.MAC                |   14 
 aclocal.m4                |  792 +-
 amiga/README              |  109 
 amiga/actived.c           |  153 
 amiga/amiga.c             |  724 --
 amiga/amiga.h             |   91 
 amiga/amigatcp.c          |  273 
 amiga/amigatcp.h          |   81 
 amiga/smakefile           |  295 
 amiga/tin.readme          |  150 
 config.guess              |  632 +
 config.sub                |  201 
 configure                 | 7858 +++++++++++++---------
 configure.in              |  194 
 doc/CHANGES               |  530 +
 doc/CREDITS               |   67 
 doc/INSTALL               |   73 
 doc/TODO                  |  399 -
 doc/WHATSNEW              |  113 
 doc/art_handling.txt      |    4 
 doc/article.txt           |   41 
 doc/config-anomalies      |    1 
 doc/filtering             |    2 
 doc/good-netkeeping-seal  |   35 
 doc/internals.txt         |    8 
 doc/keymap.sample         |  118 
 doc/rcvars.txt            |    2 
 doc/tin.1                 |  869 +-
 doc/tin.5                 |  578 -
 doc/tinews.1              |  452 -
 doc/tools.txt             |   24 
 doc/umlauts.txt           |    4 
 include/autoconf.hin      |   46 
 include/bool.h            |    8 
 include/bugrep.h          |    8 
 include/extern.h          |  137 
 include/keymap.h          |  711 +-
 include/menukeys.h        |  461 -
 include/newsrc.h          |  140 
 include/nntplib.h         |   53 
 include/oldconfig.h       |    2 
 include/policy.h          |   85 
 include/proto.h           |  207 
 include/rfc2046.h         |    2 
 include/stpwatch.h        |    2 
 include/tcurses.h         |   25 
 include/tin.h             |  390 -
 include/tinrc.h           |   18 
 include/tnntp.h           |   32 
 include/trace.h           |    4 
 include/version.h         |   23 
 install.sh                |  139 
 intl/Makefile.in          |   13 
 intl/dcigettext.c         |   27 
 intl/gettextP.h           |    8 
 intl/loadmsgcat.c         |   52 
 intl/localealias.c        |   40 
 libcanlock/Build          |    2 
 mkdirs.sh                 |    3 
 pcre/AUTHORS              |   21 
 pcre/COPYING              |   94 
 pcre/ChangeLog            |  561 +
 pcre/LICENCE              |   94 
 pcre/Makefile.in          |  101 
 pcre/Makefile.in-old      |  418 +
 pcre/NEWS                 |  110 
 pcre/NON-UNIX-USE         |  194 
 pcre/README               |  299 
 pcre/RunTest.in           |  200 
 pcre/config.h             |    3 
 pcre/configure.in         |  141 
 pcre/dftables.c           |  168 
 pcre/doc/pcre.3           |  225 
 pcre/doc/pcrepattern.3    | 1333 ++-
 pcre/get.c                |  349 -
 pcre/internal.h           |  662 -
 pcre/maketables.c         |  136 
 pcre/pcre-config.in       |   11 
 pcre/pcre.c               | 7596 ----------------------
 pcre/pcre.def             |   22 
 pcre/pcre.h.in            |  258 
 pcre/pcre.in              |  184 
 pcre/pcre_compile.c       | 5069 ++++++++++++++
 pcre/pcre_config.c        |  112 
 pcre/pcre_dfa_exec.c      | 1920 +++++
 pcre/pcre_exec.c          | 3632 ++++++++++
 pcre/pcre_fullinfo.c      |  149 
 pcre/pcre_get.c           |  352 +
 pcre/pcre_globals.c       |   69 
 pcre/pcre_info.c          |   89 
 pcre/pcre_internal.h      |  904 ++
 pcre/pcre_maketables.c    |  145 
 pcre/pcre_ord2utf8.c      |   78 
 pcre/pcre_printint.src    |  454 +
 pcre/pcre_refcount.c      |   77 
 pcre/pcre_study.c         |  482 +
 pcre/pcre_tables.c        |  130 
 pcre/pcre_try_flipped.c   |  132 
 pcre/pcre_ucp_findchar.c  |  161 
 pcre/pcre_valid_utf8.c    |  130 
 pcre/pcre_version.c       |   61 
 pcre/pcre_xclass.c        |  121 
 pcre/pcredemo.c           |   42 
 pcre/pcregrep.c           |  722 +-
 pcre/pcreposix.c          |  207 
 pcre/pcreposix.h          |   39 
 pcre/pcretest.c           |  845 +-
 pcre/perltest             |    2 
 pcre/printint.c           |  360 -
 pcre/study.c              |  438 -
 pcre/testdata/testinput1  |    8 
 pcre/testdata/testinput2  |  241 
 pcre/testdata/testinput3  |   18 
 pcre/testdata/testinput4  |   16 
 pcre/testdata/testinput5  |   72 
 pcre/testdata/testinput6  |  517 +
 pcre/testdata/testinput7  | 4013 +++++++++++
 pcre/testdata/testinput8  |  540 +
 pcre/testdata/testinput9  |  599 +
 pcre/testdata/testoutput1 |   15 
 pcre/testdata/testoutput2 | 2304 +++++-
 pcre/testdata/testoutput3 |   31 
 pcre/testdata/testoutput4 |   51 
 pcre/testdata/testoutput5 |  601 +
 pcre/testdata/testoutput6 | 1013 ++
 pcre/testdata/testoutput7 | 6516 ++++++++++++++++++
 pcre/testdata/testoutput8 | 1033 +++
 pcre/testdata/testoutput9 | 1234 +++
 pcre/ucp.h                |   58 
 pcre/ucpinternal.h        |   91 
 pcre/ucptable.c           |15105 ++++++++++++++++++++++++++++++++++++++++++++
 pcre/version.sh           |    6 
 po/POTFILES.in            |    2 
 po/de.gmo                 |binary
 po/de.po                  | 4357 ++++++------
 po/en_GB.gmo              |binary
 po/en_GB.po               | 3574 +++++-----
 po/et.gmo                 |binary
 po/et.po                  | 4152 ++++++------
 po/fr.gmo                 |binary
 po/fr.po                  | 5162 ++++++++-------
 po/ru.gmo                 |binary
 po/ru.po                  | 6163 +++++++++++++++++
 po/rw.gmo                 |binary
 po/rw.po                  | 6964 ++++++++++++++++++++
 po/tin.pot                | 3568 +++++-----
 po/tr.gmo                 |binary
 po/tr.po                  | 7261 +++++++++++++++++++++
 src/Makefile.in           |  471 -
 src/active.c              |  107 
 src/art.c                 | 1189 ++-
 src/attrib.c              |  140 
 src/auth.c                |   44 
 src/charset.c             |   50 
 src/color.c               |   94 
 src/config.c              | 1245 ---
 src/cook.c                |  354 -
 src/curses.c              |  296 
 src/debug.c               |   88 
 src/envarg.c              |    4 
 src/feed.c                |  294 
 src/filter.c              | 1019 +-
 src/getline.c             |   48 
 src/global.c              |  307 
 src/group.c               |  786 +-
 src/hashstr.c             |   23 
 src/header.c              |   66 
 src/help.c                |  882 +-
 src/inews.c               |   20 
 src/init.c                |  210 
 src/joinpath.c            |   27 
 src/keymap.c              | 3361 +++++++--
 src/lang.c                |  751 +-
 src/langinfo.c            |   23 
 src/list.c                |   14 
 src/lock.c                |   17 
 src/mail.c                |  122 
 src/main.c                |  354 -
 src/makecfg.c             |  119 
 src/memory.c              |   94 
 src/mimetypes.c           |    2 
 src/misc.c                |  716 +-
 src/my_tmpfile.c          |   11 
 src/newsrc.c              |  368 -
 src/nntplib.c             | 1051 ++-
 src/nrctbl.c              |   34 
 src/open.c                | 1121 ---
 src/options_menu.c        | 1498 ++++
 src/page.c                | 1126 +--
 src/parsdate.y            |   16 
 src/pgp.c                 |  135 
 src/post.c                | 1246 ++-
 src/prompt.c              |  379 -
 src/read.c                |   28 
 src/refs.c                |   98 
 src/regex.c               |   89 
 src/rfc1524.c             |   52 
 src/rfc2045.c             |  314 
 src/rfc2046.c             |   97 
 src/rfc2047.c             |  429 +
 src/save.c                |  106 
 src/screen.c              |  144 
 src/search.c              |  311 
 src/select.c              |  511 -
 src/sigfile.c             |   18 
 src/signal.c              |   54 
 src/strftime.c            |   38 
 src/string.c              |  588 +
 src/tags.c                |   43 
 src/tcurses.c             |  123 
 src/thread.c              |  650 -
 src/tincfg.tbl            |   22 
 src/tmpfile.c             |    6 
 src/trace.c               |    6 
 src/version.c             |   51 
 src/wildmat.c             |    4 
 src/xface.c               |   14 
 src/xref.c                |  162 
 tin.spec                  |    4 
 tools/tinews.pl           |  483 -
 tools/url_handler.sh      |   27 
 tools/w2r.pl              |   12 
 224 files changed, 108234 insertions(+), 39947 deletions(-)
-----------------------------------------------------------------------------
diff -Nurp tin-1.6.2/MANIFEST tin-1.8.0/MANIFEST
--- tin-1.6.2/MANIFEST	2003-09-10 17:10:28.000000000 +0200
+++ tin-1.8.0/MANIFEST	2005-12-24 19:11:10.987603820 +0100
@@ -1,157 +1,151 @@
-MANIFEST for tin-1.6.2 (Wed Sep 10 17:10:27 CEST 2003)
+MANIFEST for tin-1.8.0 (Sat Dec 24 19:11:09 CET 2005)
 ----------------------------------------------------
-  13085 ./Makefile
-   7531 ./MANIFEST
+  13769 ./Makefile
+   8297 ./MANIFEST
    1440 ./README
-    217 ./README.MAC
+    564 ./README.MAC
    2209 ./README.VMS
    1006 ./README.WIN
- 133232 ./aclocal.m4
+ 150759 ./aclocal.m4
     882 ./conf-tin
-  41853 ./config.guess
-  30260 ./config.sub
- 449433 ./configure
-  28778 ./configure.in
-   5555 ./install.sh
-    777 ./mkdirs.sh
+  43732 ./config.guess
+  32229 ./config.sub
+ 491231 ./configure
+  31032 ./configure.in
+   7123 ./install.sh
+    838 ./mkdirs.sh
    1505 ./tin.spec
   18847 ./doc/ABOUT-NLS
-   3839 ./doc/CHANGES
+  25928 ./doc/CHANGES
  226345 ./doc/CHANGES.old
+   4814 ./doc/CREDITS
    1469 ./doc/DEBUG_REFS
-  29430 ./doc/INSTALL
-  30582 ./doc/TODO
-   3302 ./doc/WHATSNEW
-   2617 ./doc/art_handling.txt
+  30017 ./doc/INSTALL
+  34619 ./doc/TODO
+   1034 ./doc/WHATSNEW
+   2618 ./doc/art_handling.txt
+   1700 ./doc/article.txt
    3862 ./doc/auth.txt
-   5346 ./doc/config-anomalies
+   5377 ./doc/config-anomalies
   11237 ./doc/filtering
-  35037 ./doc/good-netkeeping-seal
-   3812 ./doc/internals.txt
+  35304 ./doc/good-netkeeping-seal
+   3803 ./doc/internals.txt
   23621 ./doc/iso2asc.txt
-   4048 ./doc/keymap.sample
+   3488 ./doc/keymap.sample
     660 ./doc/mailcap.sample
    3365 ./doc/mime.types
    1541 ./doc/nov_tests
    5155 ./doc/opt-case.1
    3984 ./doc/pgp.txt
-   2711 ./doc/rcvars.txt
+   2726 ./doc/rcvars.txt
    1525 ./doc/reading-mail.txt
    4947 ./doc/umlaute.txt
-   4245 ./doc/umlauts.txt
+   4246 ./doc/umlauts.txt
    4675 ./doc/tin.defaults
-   7379 ./doc/tinews.1
-   1879 ./doc/tools.txt
+  11541 ./doc/tinews.1
+   2237 ./doc/tools.txt
    5870 ./doc/mbox.5
    4168 ./doc/mmdf.5
    2128 ./doc/newsoverview.5
    6963 ./doc/plp_snprintf.3
- 120237 ./doc/tin.1
-  69817 ./doc/tin.5
+ 118450 ./doc/tin.1
+  72828 ./doc/tin.5
    4733 ./doc/w2r.1
    2196 ./doc/wildmat.3
     344 ./tools/expiretover
    3815 ./tools/metamutt
    2787 ./tools/opt-case.pl
    1410 ./tools/tinlock
-  17984 ./tools/tinews.pl
-   1561 ./tools/url_handler.sh
-   3172 ./tools/w2r.pl
+  25041 ./tools/tinews.pl
+   1654 ./tools/url_handler.sh
+   3347 ./tools/w2r.pl
    1661 ./tools/expand_aliases.tgz
-   2702 ./include/bool.h
-   2128 ./include/bugrep.h
+   2778 ./include/bool.h
+   2039 ./include/bugrep.h
    9502 ./include/oldconfig.h
-  57728 ./include/extern.h
-  11429 ./include/keymap.h
-  15886 ./include/menukeys.h
-   6539 ./include/nntplib.h
+  58747 ./include/extern.h
+  13625 ./include/keymap.h
+   6340 ./include/newsrc.h
+   8397 ./include/nntplib.h
     665 ./include/plp_snprintf.h
-  11836 ./include/policy.h
-  29936 ./include/proto.h
+  12337 ./include/policy.h
+  31008 ./include/proto.h
    5047 ./include/rfc2046.h
    3373 ./include/stpwatch.h
-   5400 ./include/tcurses.h
-  66419 ./include/tin.h
-  12814 ./include/tinrc.h
-   5736 ./include/tnntp.h
-   2256 ./include/trace.h
-   2684 ./include/version.h
-  24977 ./src/active.c
-  50517 ./src/art.c
-  30113 ./src/attrib.c
-  12301 ./src/auth.c
-  13846 ./src/charset.c
-   5981 ./src/color.c
-  85294 ./src/config.c
-  29311 ./src/cook.c
-  34665 ./src/curses.c
-   9928 ./src/debug.c
-   3414 ./src/envarg.c
-  25215 ./src/feed.c
-  52178 ./src/filter.c
-  17968 ./src/getline.c
-   7254 ./src/global.c
-  44489 ./src/group.c
-   4158 ./src/hashstr.c
-   9671 ./src/header.c
-  27952 ./src/help.c
-  13778 ./src/inews.c
-  31918 ./src/init.c
-   2845 ./src/joinpath.c
-  38017 ./src/keymap.c
- 113904 ./src/lang.c
-   4310 ./src/langinfo.c
-   7033 ./src/list.c
-   6672 ./src/lock.c
-  11882 ./src/mail.c
-  26791 ./src/main.c
-  10227 ./src/makecfg.c
-  12207 ./src/memory.c
+   5756 ./include/tcurses.h
+  63109 ./include/tin.h
+  13398 ./include/tinrc.h
+   5670 ./include/tnntp.h
+   2264 ./include/trace.h
+   2559 ./include/version.h
+  25899 ./src/active.c
+  58423 ./src/art.c
+  32282 ./src/attrib.c
+  12947 ./src/auth.c
+  13712 ./src/charset.c
+   8220 ./src/color.c
+  58140 ./src/config.c
+  20158 ./src/cook.c
+  30433 ./src/curses.c
+  10378 ./src/debug.c
+   3408 ./src/envarg.c
+  26308 ./src/feed.c
+  56651 ./src/filter.c
+  18114 ./src/getline.c
+   9070 ./src/global.c
+  47307 ./src/group.c
+   3900 ./src/hashstr.c
+   8764 ./src/header.c
+  28753 ./src/help.c
+  13890 ./src/inews.c
+  33763 ./src/init.c
+   2216 ./src/joinpath.c
+  90146 ./src/keymap.c
+ 117545 ./src/lang.c
+   4486 ./src/langinfo.c
+   7102 ./src/list.c
+   6667 ./src/lock.c
+  13496 ./src/mail.c
+  21303 ./src/main.c
+  10814 ./src/makecfg.c
+  12256 ./src/memory.c
    5257 ./src/mimetypes.c
-  83905 ./src/misc.c
-  37475 ./src/newsrc.c
-  27739 ./src/nntplib.c
-   7248 ./src/nrctbl.c
-  26600 ./src/open.c
-  55142 ./src/page.c
-  24132 ./src/parsdate.y
+  90399 ./src/misc.c
+  40030 ./src/newsrc.c
+  45076 ./src/nntplib.c
+   7192 ./src/nrctbl.c
+  41832 ./src/options_menu.c
+  58527 ./src/page.c
+  24138 ./src/parsdate.y
   16966 ./src/plp_snprintf.c
-  12670 ./src/pgp.c
- 130410 ./src/post.c
-  13850 ./src/prompt.c
-  10822 ./src/read.c
-  24976 ./src/refs.c
-   4621 ./src/regex.c
-  14487 ./src/rfc1524.c
-   5553 ./src/rfc2045.c
-  28567 ./src/rfc2046.c
-  23766 ./src/rfc2047.c
-  36896 ./src/save.c
-  11495 ./src/screen.c
-  12769 ./src/search.c
-  30574 ./src/select.c
-   7739 ./src/sigfile.c
-  12361 ./src/signal.c
-   7001 ./src/strftime.c
-  12465 ./src/string.c
-  13814 ./src/tags.c
-  15871 ./src/tcurses.c
-   3058 ./src/tmpfile.c
-   3376 ./src/my_tmpfile.c
-  40019 ./src/thread.c
-   2466 ./src/trace.c
-   4120 ./src/version.c
-   5489 ./src/wildmat.c
-   7133 ./src/xface.c
-   7397 ./src/xref.c
-   4987 ./amiga/README
-   5520 ./amiga/tin.readme
-   9918 ./amiga/smakefile
-   4987 ./amiga/actived.c
-  18590 ./amiga/amiga.c
-   6373 ./amiga/amigatcp.c
-   2371 ./amiga/amiga.h
-   2167 ./amiga/amigatcp.h
+  12713 ./src/pgp.c
+ 134164 ./src/post.c
+  18446 ./src/prompt.c
+  10566 ./src/read.c
+  25559 ./src/refs.c
+   5276 ./src/regex.c
+  14475 ./src/rfc1524.c
+  15046 ./src/rfc2045.c
+  29853 ./src/rfc2046.c
+  32609 ./src/rfc2047.c
+  37303 ./src/save.c
+  11358 ./src/screen.c
+  16533 ./src/search.c
+  30811 ./src/select.c
+   7590 ./src/sigfile.c
+  12667 ./src/signal.c
+   7215 ./src/strftime.c
+  23476 ./src/string.c
+  13852 ./src/tags.c
+  16944 ./src/tcurses.c
+   3071 ./src/tmpfile.c
+   3364 ./src/my_tmpfile.c
+  40369 ./src/thread.c
+   2472 ./src/trace.c
+   4347 ./src/version.c
+   5453 ./src/wildmat.c
+   7153 ./src/xface.c
+   7784 ./src/xref.c
    3013 ./vms/dir.h
     424 ./vms/filetypes.h
   21451 ./vms/getopt.c
@@ -174,54 +168,78 @@ MANIFEST for tin-1.6.2 (Wed Sep 10 17:10
    1772 ./vms/vmsfile.c
    5652 ./vms/vmspwd.c
     389 ./vms/vmstimval.h
-    179 ./pcre/AUTHORS
-   2218 ./pcre/COPYING
-  57033 ./pcre/ChangeLog
+    422 ./pcre/AUTHORS
+   2515 ./pcre/COPYING
+  84049 ./pcre/ChangeLog
    8049 ./pcre/INSTALL
-   2218 ./pcre/LICENCE
-   2405 ./pcre/Makefile.in
-  12927 ./pcre/Makefile.in-old
-   5101 ./pcre/NEWS
-   4790 ./pcre/NON-UNIX-USE
-  16335 ./pcre/README
-   3077 ./pcre/RunTest.in
-     72 ./pcre/config.h
-   4781 ./pcre/configure.in
-   4766 ./pcre/dftables.c
-  11406 ./pcre/get.c
-  28259 ./pcre/internal.h
-   4289 ./pcre/maketables.c
-   1093 ./pcre/pcre-config.in
- 231769 ./pcre/pcre.c
-    271 ./pcre/pcre.def
-   6632 ./pcre/pcre.in
-  11338 ./pcre/pcredemo.c
-  15347 ./pcre/pcregrep.c
-  10114 ./pcre/pcreposix.c
-   2347 ./pcre/pcreposix.h
-  39441 ./pcre/pcretest.c
-   5232 ./pcre/perltest
-   9610 ./pcre/printint.c
-  12544 ./pcre/study.c
+   2515 ./pcre/LICENCE
+   2924 ./pcre/Makefile.in
+  24763 ./pcre/Makefile.in-old
+   9915 ./pcre/NEWS
+  10772 ./pcre/NON-UNIX-USE
+  22383 ./pcre/README
+   5996 ./pcre/RunTest.in
+    143 ./pcre/config.h
+   8703 ./pcre/configure.in
+   5876 ./pcre/dftables.c
+   1171 ./pcre/pcre-config.in
+  10608 ./pcre/pcre.h.in
+ 160094 ./pcre/pcre_compile.c
+   3396 ./pcre/pcre_config.c
+  66595 ./pcre/pcre_dfa_exec.c
+ 110857 ./pcre/pcre_exec.c
+   4929 ./pcre/pcre_fullinfo.c
+  11915 ./pcre/pcre_get.c
+   3159 ./pcre/pcre_globals.c
+   3841 ./pcre/pcre_info.c
+  36724 ./pcre/pcre_internal.h
+   5310 ./pcre/pcre_maketables.c
+   2985 ./pcre/pcre_ord2utf8.c
+  12388 ./pcre/pcre_printint.src
+   3311 ./pcre/pcre_refcount.c
+  14376 ./pcre/pcre_study.c
+   4610 ./pcre/pcre_tables.c
+   5348 ./pcre/pcre_try_flipped.c
+   4598 ./pcre/pcre_ucp_findchar.c
+   4482 ./pcre/pcre_valid_utf8.c
+   2573 ./pcre/pcre_version.c
+   4150 ./pcre/pcre_xclass.c
+  11707 ./pcre/pcredemo.c
+  33516 ./pcre/pcregrep.c
+  10376 ./pcre/pcreposix.c
+   4086 ./pcre/pcreposix.h
+  54545 ./pcre/pcretest.c
+   5234 ./pcre/perltest
+   1612 ./pcre/ucp.h
+   3547 ./pcre/ucpinternal.h
+ 453166 ./pcre/ucptable.c
     395 ./pcre/version.sh
-   6405 ./pcre/doc/pcre.3
-  55267 ./pcre/doc/pcrepattern.3
-  73940 ./pcre/testdata/testinput1
-  20201 ./pcre/testdata/testinput2
-    569 ./pcre/testdata/testinput3
-   8396 ./pcre/testdata/testinput4
-   2579 ./pcre/testdata/testinput5
-  98300 ./pcre/testdata/testoutput1
-  82791 ./pcre/testdata/testoutput2
-   1527 ./pcre/testdata/testoutput3
-  14599 ./pcre/testdata/testoutput4
-  18789 ./pcre/testdata/testoutput5
-  19111 ./include/autoconf.hin
+   9685 ./pcre/doc/pcre.3
+  63013 ./pcre/doc/pcrepattern.3
+  74037 ./pcre/testdata/testinput1
+  26948 ./pcre/testdata/testinput2
+    596 ./pcre/testdata/testinput3
+   8401 ./pcre/testdata/testinput4
+   3516 ./pcre/testdata/testinput5
+   7432 ./pcre/testdata/testinput6
+  74550 ./pcre/testdata/testinput7
+   8795 ./pcre/testdata/testinput8
+   8762 ./pcre/testdata/testinput9
+  98443 ./pcre/testdata/testoutput1
+ 122705 ./pcre/testdata/testoutput2
+   1513 ./pcre/testdata/testoutput3
+  14738 ./pcre/testdata/testoutput4
+  22902 ./pcre/testdata/testoutput5
+  16226 ./pcre/testdata/testoutput6
+ 103487 ./pcre/testdata/testoutput7
+  51419 ./pcre/testdata/testoutput8
+  24236 ./pcre/testdata/testoutput9
+  19937 ./include/autoconf.hin
    5800 ./pcre/pcre.mms
-  20141 ./src/Makefile.in
-   7144 ./src/tincfg.tbl
+  21094 ./src/Makefile.in
+   7657 ./src/tincfg.tbl
    8747 ./src/descrip.mms
-    954 ./libcanlock/Build
+    946 ./libcanlock/Build
     882 ./libcanlock/CHANGES
     789 ./libcanlock/MANIFEST
    1351 ./libcanlock/README
@@ -252,7 +270,7 @@ MANIFEST for tin-1.6.2 (Wed Sep 10 17:10
      72 ./intl/ChangeLog
   13325 ./intl/config.charset
    1820 ./intl/dcgettext.c
-  34038 ./intl/dcigettext.c
+  34160 ./intl/dcigettext.c
    1895 ./intl/dcngettext.c
    1792 ./intl/dgettext.c
    1927 ./intl/dngettext.c
@@ -260,18 +278,18 @@ MANIFEST for tin-1.6.2 (Wed Sep 10 17:10
    5736 ./intl/finddomain.c
    1891 ./intl/gettext.c
    3104 ./intl/gettext.h
-   7678 ./intl/gettextP.h
+   7686 ./intl/gettextP.h
    1835 ./intl/hash-string.h
    4763 ./intl/intl-compat.c
   10480 ./intl/l10nflist.c
    1932 ./intl/libgettext.h
    4397 ./intl/libgnuintl.h
    3380 ./intl/loadinfo.h
-  14967 ./intl/loadmsgcat.c
+  14972 ./intl/loadmsgcat.c
    6905 ./intl/localcharset.c
    2657 ./intl/locale.alias
-   9450 ./intl/localealias.c
-   9968 ./intl/Makefile.in
+   9432 ./intl/localealias.c
+  10014 ./intl/Makefile.in
    2001 ./intl/ngettext.c
   38981 ./intl/plural.c
    8376 ./intl/plural.y
@@ -280,14 +298,20 @@ MANIFEST for tin-1.6.2 (Wed Sep 10 17:10
    4481 ./intl/textdomain.c
      41 ./intl/VERSION
    4962 ./po/Makefile.inn
-    839 ./po/POTFILES.in
- 120825 ./po/tin.pot
- 164392 ./po/de.gmo
- 195103 ./po/de.po
-   7444 ./po/en_GB.gmo
- 123344 ./po/en_GB.po
- 156928 ./po/et.gmo
- 187188 ./po/et.po
- 104476 ./po/fr.gmo
- 165597 ./po/fr.po
-5916397 total
+    847 ./po/POTFILES.in
+ 123205 ./po/tin.pot
+ 166688 ./po/de.gmo
+ 199583 ./po/de.po
+   7359 ./po/en_GB.gmo
+ 125789 ./po/en_GB.po
+ 159182 ./po/et.gmo
+ 190796 ./po/et.po
+ 162233 ./po/fr.gmo
+ 196282 ./po/fr.po
+  72197 ./po/ru.gmo
+ 152186 ./po/ru.po
+   2081 ./po/rw.gmo
+ 169405 ./po/rw.po
+   5889 ./po/tr.gmo
+ 190180 ./po/tr.po
+7886882 total
diff -Nurp tin-1.6.2/Makefile tin-1.8.0/Makefile
--- tin-1.6.2/Makefile	2003-09-10 17:10:24.000000000 +0200
+++ tin-1.8.0/Makefile	2005-12-24 19:11:08.649048489 +0100
@@ -1,15 +1,15 @@
 # Top level Makefile for tin
 # - for configuration options read the doc/INSTALL file.
 #
-# Updated: 2003-07-22
+# Updated: 2005-06-17
 #
 
 PROJECT	= tin
 LVER	= 1
-PVER	= 6
-SVER	= 2
+PVER	= 8
+SVER	= 0
 VER	= $(LVER).$(PVER).$(SVER)
-DVER	= 20030910
+DVER	= 20051224
 EXE	= tin
 
 # directory structure
@@ -18,7 +18,6 @@ DOCDIR	= ./doc
 INCDIR	= ./include
 OBJDIR	= ./src
 SRCDIR	= ./src
-AMGDIR	= ./amiga
 VMSDIR	= ./vms
 PCREDIR	= ./pcre
 CANDIR	= ./libcanlock
@@ -32,7 +31,7 @@ HFILES	= \
 	$(INCDIR)/oldconfig.h \
 	$(INCDIR)/extern.h \
 	$(INCDIR)/keymap.h \
-	$(INCDIR)/menukeys.h \
+	$(INCDIR)/newsrc.h \
 	$(INCDIR)/nntplib.h \
 	$(INCDIR)/plp_snprintf.h \
 	$(INCDIR)/policy.h \
@@ -83,7 +82,7 @@ CFILES	= \
 	$(SRCDIR)/newsrc.c\
 	$(SRCDIR)/nntplib.c \
 	$(SRCDIR)/nrctbl.c \
-	$(SRCDIR)/open.c \
+	$(SRCDIR)/options_menu.c \
 	$(SRCDIR)/page.c \
 	$(SRCDIR)/parsdate.y \
 	$(SRCDIR)/plp_snprintf.c \
@@ -116,16 +115,6 @@ CFILES	= \
 	$(SRCDIR)/xface.c \
 	$(SRCDIR)/xref.c
 
-AMIGA	= \
-	$(AMGDIR)/README \
-	$(AMGDIR)/tin.readme \
-	$(AMGDIR)/smakefile \
-	$(AMGDIR)/actived.c \
-	$(AMGDIR)/amiga.c \
-	$(AMGDIR)/amigatcp.c \
-	$(AMGDIR)/amiga.h \
-	$(AMGDIR)/amigatcp.h
-
 VMS	= \
 	$(VMSDIR)/dir.h \
 	$(VMSDIR)/filetypes.h \
@@ -154,11 +143,13 @@ DOC	= \
 	$(DOCDIR)/ABOUT-NLS \
 	$(DOCDIR)/CHANGES \
 	$(DOCDIR)/CHANGES.old \
+	$(DOCDIR)/CREDITS \
 	$(DOCDIR)/DEBUG_REFS \
 	$(DOCDIR)/INSTALL \
 	$(DOCDIR)/TODO \
 	$(DOCDIR)/WHATSNEW \
 	$(DOCDIR)/art_handling.txt \
+	$(DOCDIR)/article.txt \
 	$(DOCDIR)/auth.txt \
 	$(DOCDIR)/config-anomalies \
 	$(DOCDIR)/filtering \
@@ -229,21 +220,37 @@ PCRE	= \
 	$(PCREDIR)/config.h \
 	$(PCREDIR)/configure.in \
 	$(PCREDIR)/dftables.c \
-	$(PCREDIR)/get.c \
-	$(PCREDIR)/internal.h \
-	$(PCREDIR)/maketables.c \
 	$(PCREDIR)/pcre-config.in \
-	$(PCREDIR)/pcre.c \
-	$(PCREDIR)/pcre.def \
-	$(PCREDIR)/pcre.in \
+	$(PCREDIR)/pcre.h.in \
+	$(PCREDIR)/pcre_compile.c \
+	$(PCREDIR)/pcre_config.c \
+	$(PCREDIR)/pcre_dfa_exec.c \
+	$(PCREDIR)/pcre_exec.c \
+	$(PCREDIR)/pcre_fullinfo.c \
+	$(PCREDIR)/pcre_get.c \
+	$(PCREDIR)/pcre_globals.c \
+	$(PCREDIR)/pcre_info.c \
+	$(PCREDIR)/pcre_internal.h \
+	$(PCREDIR)/pcre_maketables.c \
+	$(PCREDIR)/pcre_ord2utf8.c \
+	$(PCREDIR)/pcre_printint.src \
+	$(PCREDIR)/pcre_refcount.c \
+	$(PCREDIR)/pcre_study.c \
+	$(PCREDIR)/pcre_tables.c \
+	$(PCREDIR)/pcre_try_flipped.c \
+	$(PCREDIR)/pcre_ucp_findchar.c \
+	$(PCREDIR)/pcre_valid_utf8.c \
+	$(PCREDIR)/pcre_version.c \
+	$(PCREDIR)/pcre_xclass.c \
 	$(PCREDIR)/pcredemo.c \
 	$(PCREDIR)/pcregrep.c \
 	$(PCREDIR)/pcreposix.c \
 	$(PCREDIR)/pcreposix.h \
 	$(PCREDIR)/pcretest.c \
 	$(PCREDIR)/perltest \
-	$(PCREDIR)/printint.c \
-	$(PCREDIR)/study.c \
+	$(PCREDIR)/ucp.h \
+	$(PCREDIR)/ucpinternal.h \
+	$(PCREDIR)/ucptable.c \
 	$(PCREDIR)/version.sh \
 	$(PCREDIR)/doc/pcre.3 \
 	$(PCREDIR)/doc/pcrepattern.3 \
@@ -252,11 +259,19 @@ PCRE	= \
 	$(PCREDIR)/testdata/testinput3 \
 	$(PCREDIR)/testdata/testinput4 \
 	$(PCREDIR)/testdata/testinput5 \
+	$(PCREDIR)/testdata/testinput6 \
+	$(PCREDIR)/testdata/testinput7 \
+	$(PCREDIR)/testdata/testinput8 \
+	$(PCREDIR)/testdata/testinput9 \
 	$(PCREDIR)/testdata/testoutput1 \
 	$(PCREDIR)/testdata/testoutput2 \
 	$(PCREDIR)/testdata/testoutput3 \
 	$(PCREDIR)/testdata/testoutput4 \
 	$(PCREDIR)/testdata/testoutput5 \
+	$(PCREDIR)/testdata/testoutput6 \
+	$(PCREDIR)/testdata/testoutput7 \
+	$(PCREDIR)/testdata/testoutput8 \
+	$(PCREDIR)/testdata/testoutput9
 
 CAN	= \
 	$(CANDIR)/Build \
@@ -338,12 +353,18 @@ POFILES = \
 	$(PODIR)/et.gmo \
 	$(PODIR)/et.po \
 	$(PODIR)/fr.gmo \
-	$(PODIR)/fr.po
+	$(PODIR)/fr.po \
+	$(PODIR)/ru.gmo \
+	$(PODIR)/ru.po \
+	$(PODIR)/rw.gmo \
+	$(PODIR)/rw.po \
+	$(PODIR)/tr.gmo \
+	$(PODIR)/tr.po
 
 
-ALL_FILES = $(TOP) $(DOC) $(TOL) $(HFILES) $(CFILES) $(AMIGA) $(VMS) $(PCRE) $(MISC) $(CAN) $(INTLFILES) $(POFILES)
+ALL_FILES = $(TOP) $(DOC) $(TOL) $(HFILES) $(CFILES) $(VMS) $(PCRE) $(MISC) $(CAN) $(INTLFILES) $(POFILES)
 
-ALL_DIRS = $(TOPDIR) $(DOCDIR) $(SRCDIR) $(INCDIR) $(AMGDIR) $(VMSDIR) $(PCREDIR) $(PCREDIR)/doc $(PCREDIR)/testdata $(CANDIR) $(CANDIR)/doc $(INTLDIR) $(PODIR)
+ALL_DIRS = $(TOPDIR) $(DOCDIR) $(SRCDIR) $(INCDIR) $(VMSDIR) $(PCREDIR) $(PCREDIR)/doc $(PCREDIR)/testdata $(CANDIR) $(CANDIR)/doc $(INTLDIR) $(PODIR)
 
 # standard commands
 CD	= cd
@@ -403,6 +424,7 @@ clean:
 	@-if $(TEST) -r $(INTLDIR)/Makefile ; then $(CD) $(INTLDIR) && $(MAKE) clean ; fi
 	@-if $(TEST) -r $(PODIR)/Makefile ; then $(CD) $(PODIR) && $(MAKE) clean ; fi
 	@-if $(TEST) -r $(SRCDIR)/Makefile ; then $(CD) $(SRCDIR) && $(MAKE) clean ; fi
+	@-if $(TEST) -r $(CANDIR)/hmactest ; then $(CD) $(CANDIR) && ./Build clean ; fi
 
 man:
 	@$(MAKE) manpage
@@ -511,12 +533,7 @@ distclean:
 	$(INCDIR)/autoconf.h \
 	$(SRCDIR)/Makefile \
 	$(PCREDIR)/Makefile \
-	$(INTLDIR)/po2tbl.sed \
-	$(CANDIR)/*.[oa] \
-	$(CANDIR)/endian.h \
-	$(CANDIR)/canlocktest \
-	$(CANDIR)/endian \
-	$(CANDIR)/hmactest
+	$(INTLDIR)/po2tbl.sed
 
 configure: configure.in aclocal.m4
 	autoconf
diff -Nurp tin-1.6.2/README.MAC tin-1.8.0/README.MAC
--- tin-1.6.2/README.MAC	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/README.MAC	2005-06-28 10:31:19.000000000 +0200
@@ -1,8 +1,18 @@
 Compiling tin for MacOS X:
 
-First, you need the developer packages installed (CD 2).
+First, you either need:
+- the DevTools if you are running Mac OS X 10.2 (Darwin 6.x) or below
+or
+- the Xcode Tools if you are running Mac OS X 10.3 (Darwin 7.x.x)
 
 configure needs at least the argument:
 --with-domain-name=<your domain>
 
-Compile tin, install it and run in a ISO-8859-1 terminal.
+Compile tin, install it and run in a ISO-8859-1(5) terminal.
+
+Here are two other ways to build and install tin:
+- DarwinPorts   <http://darwinports.opendarwin.org/>
+- Fink          <http://fink.sf.net/>
+
+Instead of using the shell-script url_handler.sh you might want to use
+open(1) as URL-handler.
diff -Nurp tin-1.6.2/aclocal.m4 tin-1.8.0/aclocal.m4
--- tin-1.6.2/aclocal.m4	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/aclocal.m4	2005-12-11 18:03:05.010317382 +0100
@@ -1,11 +1,11 @@
 dnl Project   : tin - a Usenet reader
 dnl Module    : aclocal.m4
-dnl Author    : Thomas E. Dickey <dickey@herndon4.his.com>
+dnl Author    : Thomas E. Dickey <dickey@invisible-island.net>
 dnl Created   : 1995-08-24
-dnl Updated   : 2003-06-04
+dnl Updated   : 2005-12-11
 dnl Notes     :
 dnl
-dnl Copyright (c) 1995-2003 Thomas E. Dickey <dickey@herndon4.his.com>
+dnl Copyright (c) 1995-2006 Thomas E. Dickey <dickey@invisible-island.net>
 dnl All rights reserved.
 dnl
 dnl Redistribution and use in source and binary forms, with or without
@@ -16,10 +16,7 @@ dnl    notice, this list of conditions a
 dnl 2. Redistributions in binary form must reproduce the above copyright
 dnl    notice, this list of conditions and the following disclaimer in the
 dnl    documentation and/or other materials provided with the distribution.
-dnl 3. All advertising materials mentioning features or use of this software
-dnl    must display the following acknowledgement:
-dnl	This product includes software developed by Thomas E. Dickey.
-dnl 4. The name of the author may not be used to endorse or promote
+dnl 3. The name of the author may not be used to endorse or promote
 dnl    products derived from this software without specific prior written
 dnl    permission.
 dnl
@@ -64,7 +61,7 @@ AC_DEFUN([AC_ISC_POSIX],
   ]
 )
 dnl ---------------------------------------------------------------------------
-dnl AM_GNU_GETTEXT version: 10 updated: 2002/11/17 17:25:28
+dnl AM_GNU_GETTEXT version: 11 updated: 2004/01/26 20:58:40
 dnl --------------
 dnl Usage: Just like AM_WITH_NLS, which see.
 AC_DEFUN([AM_GNU_GETTEXT],
@@ -129,6 +126,7 @@ strdup strtoul tsearch __argz_count __ar
    dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
    dnl Try to locate it.
    dnl changed mkinstalldirs to mkdirs.sh for Lynx /je spath 1998-Aug-21
+   dnl added check for separate locations of scripts -mirabile 2004-Jan-18
    MKINSTALLDIRS=
    if test -n "$ac_aux_dir"; then
      MKINSTALLDIRS="$ac_aux_dir/mkdirs.sh"
@@ -136,6 +134,11 @@ strdup strtoul tsearch __argz_count __ar
    if test -z "$MKINSTALLDIRS"; then
      MKINSTALLDIRS="\$(top_srcdir)/mkdirs.sh"
    fi
+   if test -n "$GNUSYSTEM_AUX_DIR" ; then
+     if test -e "${GNUSYSTEM_AUX_DIR}/mkinstalldirs"; then
+       MKINSTALLDIRS="${GNUSYSTEM_AUX_DIR}/mkinstalldirs"
+     fi
+   fi
    AC_SUBST(MKINSTALLDIRS)
 
    dnl Enable libtool support if the surrounding package wishes it.
@@ -143,7 +146,7 @@ strdup strtoul tsearch __argz_count __ar
    AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl AM_ICONV version: 3 updated: 2002/10/27 23:21:42
+dnl AM_ICONV version: 4 updated: 2005/06/20 05:31:53
 dnl --------
 dnl Inserted as requested by gettext 0.10.40
 dnl File from /usr/share/aclocal
@@ -158,7 +161,8 @@ AC_DEFUN([AM_ICONV],
   dnl those with the standalone portable GNU libiconv installed).
 
   AC_ARG_WITH([libiconv-prefix],
-[  --with-libiconv-prefix=DIR  search for libiconv in DIR/include and DIR/lib], [
+[  --with-libiconv-prefix=DIR
+                          search for libiconv in DIR/include and DIR/lib], [
     for dir in `echo "$withval" | tr : ' '`; do
       if test -d $dir/include; then CPPFLAGS="$CPPFLAGS -I$dir/include"; fi
       if test -d $dir/lib; then LDFLAGS="$LDFLAGS -L$dir/lib"; fi
@@ -272,9 +276,9 @@ AC_DEFUN([AM_LC_MESSAGES],
     fi
   fi])dnl
 dnl ---------------------------------------------------------------------------
-dnl AM_MULTIBYTE_ABLE version: 5 updated: 2003/01/16 16:21:27
+dnl AM_MULTIBYTE_ABLE version: 6 updated: 2004/01/19 12:11:07
 dnl -----------------
-
+dnl
 dnl check for required multibyte/widechar functions
 dnl Urs Janssen <urs@tin.org> 20021006
 dnl Usage: AM_MULTIBYTE_ABLE
@@ -336,16 +340,19 @@ AC_DEFUN([AM_MULTIBYTE_ABLE],
         mbstowcs(format, "%s", 2);
         swprintf(wcb, 5, format, "test");
         wcsncat(wcb2, wcb, 5);],
-        [am_cv_multibyte_able=yes
-         AC_DEFINE(HAVE_LIBUTF8_H)],
-        [am_cv_multibyte_able=no
-         LIBS="$cf_save_LIBS"])
+        [am_cv_multibyte_able=libutf8],
+        [am_cv_multibyte_able=no])
+      LIBS="$cf_save_LIBS"
    ])
-  if test $am_cv_multibyte_able = yes; then
+  ])
+  if test "$am_cv_multibyte_able" != no; then
+    if test "$am_cv_multibyte_able" = libutf8; then
+      AC_DEFINE(HAVE_LIBUTF8_H)
+      LIBS="-lutf8 $LIBS"
+    fi
     AC_DEFINE(MULTIBYTE_ABLE, 1,
       [Define if you have swprintf() and co.])
   fi
-  ])
 ])
 dnl ---------------------------------------------------------------------------
 dnl AM_PATH_PROG_WITH_TEST version: 5 updated: 2002/10/27 23:21:42
@@ -407,7 +414,7 @@ fi
 AC_SUBST($1)dnl
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl AM_WITH_NLS version: 15 updated: 2002/11/09 16:19:53
+dnl AM_WITH_NLS version: 17 updated: 2004/01/23 19:52:21
 dnl -----------
 dnl Inserted as requested by gettext 0.10.40
 dnl File from /usr/share/aclocal
@@ -563,6 +570,9 @@ return (int) gettext ("")]ifelse([$2], n
       fi
 
       if test "$nls_cv_use_gnu_gettext" = "yes"; then
+        if test ! -d $srcdir/intl ; then
+	  AC_MSG_ERROR(no NLS library is packaged with this application)
+	fi
         dnl Mark actions used to generate GNU NLS library.
         INTLOBJS="\$(GETTOBJS)"
         AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
@@ -659,6 +669,7 @@ return (int) gettext ("")]ifelse([$2], n
     dnl files or have a broken "make" program, hence the plural.c rule will
     dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
     dnl present or too old.
+    if test "$nls_cv_use_gnu_gettext" = "yes"; then
     AC_CHECK_PROGS([INTLBISON], [bison])
     if test -z "$INTLBISON"; then
       ac_verc_fail=yes
@@ -679,6 +690,7 @@ changequote([,])dnl
     if test $ac_verc_fail = yes; then
       INTLBISON=:
     fi
+    fi
 
     dnl These rules are solely for the distribution goal.  While doing this
     dnl we only have to keep exactly one list of the available catalogs
@@ -716,18 +728,44 @@ changequote([,])dnl
     AC_SUBST(GENCAT)
   ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_ADD_CFLAGS version: 5 updated: 2002/12/01 00:12:15
+dnl CF_ADD_CFLAGS version: 7 updated: 2004/04/25 17:48:30
 dnl -------------
 dnl Copy non-preprocessor flags to $CFLAGS, preprocessor flags to $CPPFLAGS
 dnl The second parameter if given makes this macro verbose.
+dnl
+dnl Put any preprocessor definitions that use quoted strings in $EXTRA_CPPFLAGS,
+dnl to simplify use of $CPPFLAGS in compiler checks, etc., that are easily
+dnl confused by the quotes (which require backslashes to keep them usable).
 AC_DEFUN([CF_ADD_CFLAGS],
 [
+cf_fix_cppflags=no
 cf_new_cflags=
 cf_new_cppflags=
+cf_new_extra_cppflags=
+
 for cf_add_cflags in $1
 do
+case $cf_fix_cppflags in
+no)
 	case $cf_add_cflags in #(vi
 	-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi
+		case $cf_add_cflags in
+		-D*)
+			cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[[^=]]*='\''\"[[^"]]*//'`
+
+			test "${cf_add_cflags}" != "${cf_tst_cflags}" \
+			&& test -z "${cf_tst_cflags}" \
+			&& cf_fix_cppflags=yes
+
+			if test $cf_fix_cppflags = yes ; then
+				cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+				cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+				continue
+			fi
+			;;
+		esac
 		case "$CPPFLAGS" in
 		*$cf_add_cflags) #(vi
 			;;
@@ -740,6 +778,17 @@ do
 		cf_new_cflags="$cf_new_cflags $cf_add_cflags"
 		;;
 	esac
+	;;
+yes)
+	cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+
+	cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[[^"]]*"'\''//'`
+
+	test "${cf_add_cflags}" != "${cf_tst_cflags}" \
+	&& test -z "${cf_tst_cflags}" \
+	&& cf_fix_cppflags=no
+	;;
+esac
 done
 
 if test -n "$cf_new_cflags" ; then
@@ -752,6 +801,13 @@ if test -n "$cf_new_cppflags" ; then
 	CPPFLAGS="$cf_new_cppflags $CPPFLAGS"
 fi
 
+if test -n "$cf_new_extra_cppflags" ; then
+	ifelse($2,,,[CF_VERBOSE(add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags)])
+	EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS"
+fi
+
+AC_SUBST(EXTRA_CPPFLAGS)
+
 ])dnl
 dnl ---------------------------------------------------------------------------
 dnl CF_ADD_INCDIR version: 4 updated: 2002/12/21 14:25:52
@@ -921,7 +977,98 @@ esac
 $3="$withval"
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_BUNDLED_INTL version: 6 updated: 2003/06/06 00:48:41
+dnl CF_BUILD_CC version: 5 updated: 2005/09/24 17:55:52
+dnl -----------
+dnl If we're cross-compiling, allow the user to override the tools and their
+dnl options.  The configure script is oriented toward identifying the host
+dnl compiler, etc., but we need a build compiler to generate parts of the
+dnl source.
+dnl
+dnl $1 = default for $CPPFLAGS
+dnl $2 = default for $LIBS
+AC_DEFUN([CF_BUILD_CC],[
+AC_REQUIRE([CF_PROG_EXT])
+if test "$cross_compiling" = yes ; then
+
+	# defaults that we might want to override
+	: ${BUILD_CFLAGS:=''}
+	: ${BUILD_CPPFLAGS:='ifelse([$1],,,[$1])'}
+	: ${BUILD_LDFLAGS:=''}
+	: ${BUILD_LIBS:='ifelse([$2],,,[$2])'}
+	: ${BUILD_EXEEXT:='$x'}
+	: ${BUILD_OBJEXT:='o'}
+
+	AC_ARG_WITH(build-cc,
+		[  --with-build-cc=XXX     the build C compiler ($BUILD_CC)],
+		[BUILD_CC="$withval"],
+		[AC_CHECK_PROGS(BUILD_CC, gcc cc cl)])
+	AC_MSG_CHECKING(for native build C compiler)
+	AC_MSG_RESULT($BUILD_CC)
+
+	AC_MSG_CHECKING(for native build C preprocessor)
+	AC_ARG_WITH(build-cpp,
+		[  --with-build-cpp=XXX    the build C preprocessor ($BUILD_CPP)],
+		[BUILD_CPP="$withval"],
+		[BUILD_CPP='$(BUILD_CC) -E'])
+	AC_MSG_RESULT($BUILD_CPP)
+
+	AC_MSG_CHECKING(for native build C flags)
+	AC_ARG_WITH(build-cflags,
+		[  --with-build-cflags=XXX the build C compiler-flags ($BUILD_CFLAGS)],
+		[BUILD_CFLAGS="$withval"])
+	AC_MSG_RESULT($BUILD_CFLAGS)
+
+	AC_MSG_CHECKING(for native build C preprocessor-flags)
+	AC_ARG_WITH(build-cppflags,
+		[  --with-build-cppflags=XXX the build C preprocessor-flags ($BUILD_CPPFLAGS)],
+		[BUILD_CPPFLAGS="$withval"])
+	AC_MSG_RESULT($BUILD_CPPFLAGS)
+
+	AC_MSG_CHECKING(for native build linker-flags)
+	AC_ARG_WITH(build-ldflags,
+		[  --with-build-ldflags=XXX the build linker-flags ($BUILD_LDFLAGS)],
+		[BUILD_LDFLAGS="$withval"])
+	AC_MSG_RESULT($BUILD_LDFLAGS)
+
+	AC_MSG_CHECKING(for native build linker-libraries)
+	AC_ARG_WITH(build-libs,
+		[  --with-build-libs=XXX   the build libraries ($(BUILD_LIBS)],
+		[BUILD_LIBS="$withval"])
+	AC_MSG_RESULT($BUILD_LIBS)
+
+	# this assumes we're on Unix.
+	BUILD_EXEEXT=
+	BUILD_OBJEXT=o
+
+	: ${BUILD_CC:='$(CC)'}
+
+	if ( test "$BUILD_CC" = "$CC" || test "$BUILD_CC" = '$(CC)' ) ; then
+		AC_MSG_ERROR([Cross-build requires two compilers.
+Use --with-build-cc to specify the native compiler.])
+	fi
+
+else
+	: ${BUILD_CC:='$(CC)'}
+	: ${BUILD_CPP:='$(CPP)'}
+	: ${BUILD_CFLAGS:='$(CFLAGS)'}
+	: ${BUILD_CPPFLAGS:='$(CPPFLAGS)'}
+	: ${BUILD_LDFLAGS:='$(LDFLAGS)'}
+	: ${BUILD_LIBS:='$(LIBS)'}
+	: ${BUILD_EXEEXT:='$x'}
+	: ${BUILD_OBJEXT:='o'}
+fi
+
+AC_SUBST(BUILD_CC)
+AC_SUBST(BUILD_CPP)
+AC_SUBST(BUILD_CFLAGS)
+AC_SUBST(BUILD_CPPFLAGS)
+AC_SUBST(BUILD_LDFLAGS)
+AC_SUBST(BUILD_LIBS)
+AC_SUBST(BUILD_EXEEXT)
+AC_SUBST(BUILD_OBJEXT)
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_BUNDLED_INTL version: 12 updated: 2005/06/21 18:24:28
 dnl ---------------
 dnl Top-level macro for configuring an application with a bundled copy of
 dnl the intl and po directories for gettext.
@@ -936,6 +1083,11 @@ dnl	SUB_MAKEFILE - list of makefiles in 
 dnl Defines
 dnl	HAVE_LIBGETTEXT_H if we're using ./intl
 dnl
+dnl Environment:
+dnl	ALL_LINGUAS if set, lists the root names of the ".po" files.
+dnl	CONFIG_H assumed to be "config.h"
+dnl	VERSION may be set, otherwise extract from "VERSION" file.
+dnl
 AC_DEFUN([CF_BUNDLED_INTL],[
 cf_makefile=ifelse($1,,Makefile,$1)
 
@@ -944,6 +1096,19 @@ dnl setting $LINGUAS overrides $ALL_LING
 dnl rather than $LC_ALL
 test -z "$ALL_LINGUAS" && ALL_LINGUAS=`test -d $srcdir/po && cd $srcdir/po && echo *.po|sed -e 's/\.po//g' -e 's/*//'`
 
+# Allow override of "config.h" definition:
+: ${CONFIG_H=config.h}
+AC_SUBST(CONFIG_H)
+
+if test -z "$VERSION" ; then
+if test -f $srcdir/VERSION ; then
+	VERSION=`sed -e '2,$d' $srcdir/VERSION|cut -f1`
+else
+	VERSION=unknown
+fi
+fi
+AC_SUBST(VERSION)
+
 AM_GNU_GETTEXT(,,,[$2])
 
 INTLDIR_MAKE=
@@ -955,14 +1120,23 @@ CF_OUR_MESSAGES($1)
 
 if test "$USE_INCLUDED_LIBINTL" = yes ; then
         if test "$nls_cv_force_use_gnu_gettext" = yes ; then
-		SUB_MAKEFILE="$SUB_MAKEFILE intl/$cf_makefile"
+		:
 	elif test "$nls_cv_use_gnu_gettext" = yes ; then
-		SUB_MAKEFILE="$SUB_MAKEFILE intl/$cf_makefile"
+		:
 	else
 		INTLDIR_MAKE="#"
 	fi
 	if test -z "$INTLDIR_MAKE"; then
 		AC_DEFINE(HAVE_LIBGETTEXT_H)
+		for cf_makefile in \
+			$srcdir/intl/Makefile.in \
+			$srcdir/intl/makefile.in
+		do
+			if test -f "$cf_makefile" ; then
+				SUB_MAKEFILE="$SUB_MAKEFILE `echo \"${cf_makefile}\"|sed -e 's,^'$srcdir/',,' -e 's/\.in$//'`:${cf_makefile}"
+				break
+			fi
+		done
 	fi
 else
 	INTLDIR_MAKE="#"
@@ -1085,7 +1259,7 @@ AC_MSG_RESULT($cf_result)
 test $cf_result = yes && AC_DEFINE_UNQUOTED(DECL_$2)
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_CHECK_CACHE version: 7 updated: 2001/12/19 00:50:10
+dnl CF_CHECK_CACHE version: 10 updated: 2004/05/23 13:03:31
 dnl --------------
 dnl Check if we're accidentally using a cache from a different machine.
 dnl Derive the system name, as a check for reusing the autoconf cache.
@@ -1094,9 +1268,12 @@ dnl If we've packaged config.guess and c
 dnl better job than uname).  Normally we'll use AC_CANONICAL_HOST, but allow
 dnl an extra parameter that we may override, e.g., for AC_CANONICAL_SYSTEM
 dnl which is useful in cross-compiles.
+dnl
+dnl Note: we would use $ac_config_sub, but that is one of the places where
+dnl autoconf 2.5x broke compatibility with autoconf 2.13
 AC_DEFUN([CF_CHECK_CACHE],
 [
-if test -f $srcdir/config.guess ; then
+if test -f $srcdir/config.guess || test -f $ac_aux_dir/config.guess ; then
 	ifelse([$1],,[AC_CANONICAL_HOST],[$1])
 	system_name="$host_os"
 else
@@ -1228,7 +1405,7 @@ fi
 done
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_CHECK_IPV6 version: 2 updated: 2000/04/13 21:38:04
+dnl CF_CHECK_IPV6 version: 3 updated: 2004/01/22 17:38:22
 dnl -------------
 dnl Check for IPV6 configuration.
 AC_DEFUN([CF_CHECK_IPV6],[
@@ -1239,7 +1416,7 @@ CF_FUNC_GETADDRINFO
 
 if test "$cf_cv_getaddrinfo" != "yes"; then
 	if test "$cf_cv_ipv6type" != "linux"; then
-		AC_MSG_ERROR(
+		AC_MSG_WARN(
 [You must get working getaddrinfo() function,
 or you can specify "--disable-ipv6"])
 	else
@@ -1454,12 +1631,13 @@ AC_CHECK_HEADERS($cf_cv_ncurses_header)
 
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_CURSES_LIBS version: 22 updated: 2002/10/27 18:21:42
+dnl CF_CURSES_LIBS version: 23 updated: 2003/11/06 19:59:57
 dnl --------------
 dnl Look for the curses libraries.  Older curses implementations may require
 dnl termcap/termlib to be linked as well.  Call CF_CURSES_CPPFLAGS first.
 AC_DEFUN([CF_CURSES_LIBS],[
 
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
 AC_MSG_CHECKING(if we have identified curses libraries)
 AC_TRY_LINK([#include <${cf_cv_ncurses_header-curses.h}>],
 	[initscr(); tgoto("?", 0,0)],
@@ -1637,7 +1815,7 @@ esac
 
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_CURSES_TERM_H version: 4 updated: 2002/01/12 17:08:23
+dnl CF_CURSES_TERM_H version: 6 updated: 2003/11/06 19:59:57
 dnl ----------------
 dnl SVr4 curses should have term.h as well (where it puts the definitions of
 dnl the low-level interface).  This may not be true in old/broken implementations,
@@ -1646,15 +1824,20 @@ dnl running with Solaris 2.5.1).
 AC_DEFUN([CF_CURSES_TERM_H],
 [
 AC_CACHE_CHECK(for term.h, cf_cv_term_header,[
+
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
+# If we found <ncurses/curses.h>, look for <ncurses/term.h>, but always look
+# for <term.h> if we do not find the variant.
 for cf_header in \
-	ncurses/term.h \
+	`echo ${cf_cv_ncurses_header-curses.h} | sed -e 's%/.*%/%'`term.h \
 	term.h
 do
 	AC_TRY_COMPILE([
 #include <${cf_cv_ncurses_header-curses.h}>
 #include <${cf_header}>],
 	[WINDOW *x],
-	[cf_cv_term_header=$cf_header],
+	[cf_cv_term_header=$cf_header
+	 break],
 	[cf_cv_term_header=no])
 done
 ])
@@ -1666,10 +1849,13 @@ term.h) #(vi
 ncurses/term.h)
 	AC_DEFINE(HAVE_NCURSES_TERM_H)
 	;;
+ncursesw/term.h)
+	AC_DEFINE(HAVE_NCURSESW_TERM_H)
+	;;
 esac
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_DEFAULT_SHELL version: 5 updated: 2002/12/04 00:06:27
+dnl CF_DEFAULT_SHELL version: 6 updated: 2005/09/29 07:32:03
 dnl ----------------
 dnl Look for a Bourne-shell compatible program from a list that we know about:
 dnl	ash	Almquist Shell (sh based)
@@ -1678,6 +1864,7 @@ dnl	dash	Debian Almquist Shell (sh based
 dnl	jsh	Job Control Bourne Shell (sh based)
 dnl	keysh	Key Shell (ksh based)
 dnl	ksh	Korn Shell (sh based)
+dnl	mksh	MirBSD Korn shell (pdksh based)
 dnl	pdksh	Public-domain ksh
 dnl	sh	Bourne Shell or POSIX Shell
 dnl	zsh	Z Shell (sh, ksh based)
@@ -1689,7 +1876,7 @@ AC_DEFUN([CF_DEFAULT_SHELL],
 AC_MSG_CHECKING(for the default shell program)
 cf_shell_progs="ifelse($1,,sh,[$1])"
 if test -z "$cf_shell_progs" ; then
-	cf_shell_progs="sh ksh bash zsh pdksh jsh keysh ash dash"
+	cf_shell_progs="sh ksh bash zsh pdksh mksh jsh keysh ash dash"
 	# TIN preferred default shell for BSD systems is csh. Others are sh.
 	AC_TRY_COMPILE([
 #include <sys/params.h>],[
@@ -1974,7 +2161,7 @@ done
 ])
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_FIND_LIBRARY version: 7 updated: 2000/04/13 21:38:04
+dnl CF_FIND_LIBRARY version: 8 updated: 2004/11/23 20:14:58
 dnl ---------------
 dnl Look for a non-standard library, given parameters for AC_TRY_LINK.  We
 dnl prefer a standard location, and use -L options only if we do not find the
@@ -1984,7 +2171,7 @@ dnl	$2 = library class, usually the same
 dnl	$3 = includes
 dnl	$4 = code fragment to compile/link
 dnl	$5 = corresponding function-name
-dnl	$6 = flag, nonnull if failure causes an error-exit
+dnl	$6 = flag, nonnull if failure should not cause an error-exit
 dnl
 dnl Sets the variable "$cf_libdir" as a side-effect, so we can see if we had
 dnl to use a -L option.
@@ -2038,6 +2225,29 @@ os2*|cygwin*)
 esac
 ])dnl
 dnl ---------------------------------------------------------------------------
+dnl CF_FUNC_ALLOCA version: 1 updated: 2005/06/29 04:28:43
+dnl --------------
+dnl workaround for bison 1.875c (compound breakage in Linux stdlib.h and
+dnl bison's output make bison try to use alloca()).
+AC_DEFUN([CF_FUNC_ALLOCA],
+[
+AC_FUNC_ALLOCA
+
+case $host_os in
+linux*|gnu*)
+	# workaround for bison 1.875c (compound breakage in Linux stdlib.h
+	# and bison's output make bison try to use alloca()).
+	if test -z "$GCC" ; then
+		CPPFLAGS="-DYYSTACK_USE_ALLOCA=0 $CPPFLAGS"
+		ALLOCA=""
+	elif test "$INTEL_COMPILER" = yes ; then
+		CPPFLAGS="-DYYSTACK_USE_ALLOCA=0 $CPPFLAGS"
+		ALLOCA=""
+	fi
+	;;
+esac
+])dnl
+dnl ---------------------------------------------------------------------------
 dnl CF_FUNC_FORK version: 2 updated: 1997/08/28 23:57:55
 dnl ------------
 dnl Check if 'fork()' is available, and working.  Amiga (and possibly other
@@ -2232,7 +2442,7 @@ AC_MSG_RESULT($cf_cv_system_status)
 test $cf_cv_system_status = no && AC_DEFINE(USE_SYSTEM_STATUS)
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_GCC_VERSION version: 2 updated: 2003/05/24 15:01:41
+dnl CF_GCC_VERSION version: 4 updated: 2005/08/27 09:53:42
 dnl --------------
 dnl Find version of gcc
 AC_DEFUN([CF_GCC_VERSION],[
@@ -2240,13 +2450,13 @@ AC_REQUIRE([AC_PROG_CC])
 GCC_VERSION=none
 if test "$GCC" = yes ; then
 	AC_MSG_CHECKING(version of $CC)
-	GCC_VERSION="`${CC} --version|head -1 | sed -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`"
+	GCC_VERSION="`${CC} --version| sed -e '2,$d' -e 's/^.*(GCC) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`"
 	test -z "$GCC_VERSION" && GCC_VERSION=unknown
 	AC_MSG_RESULT($GCC_VERSION)
 fi
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_GCC_WARNINGS version: 14 updated: 2003/05/24 15:03:15
+dnl CF_GCC_WARNINGS version: 20 updated: 2005/08/06 18:37:29
 dnl ---------------
 dnl Check if the compiler supports useful warning options.  There's a few that
 dnl we don't use, simply because they're too noisy:
@@ -2258,15 +2468,62 @@ dnl	-Wwrite-strings (too noisy, but shou
 dnl		is enabled for ncurses using "--enable-const".
 dnl	-pedantic
 dnl
+dnl Parameter:
+dnl	$1 is an optional list of gcc warning flags that a particular
+dnl		application might want to use, e.g., "no-unused" for
+dnl		-Wno-unused
+dnl Special:
+dnl	If $with_ext_const is "yes", add a check for -Wwrite-strings
+dnl
 AC_DEFUN([CF_GCC_WARNINGS],
 [
 AC_REQUIRE([CF_GCC_VERSION])
-if ( test "$GCC" = yes || test "$GXX" = yes )
-then
-	cat > conftest.$ac_ext <<EOF
+CF_INTEL_COMPILER(GCC,INTEL_COMPILER,CFLAGS)
+
+cat > conftest.$ac_ext <<EOF
 #line __oline__ "configure"
 int main(int argc, char *argv[[]]) { return (argv[[argc-1]] == 0) ; }
 EOF
+
+if test "$INTEL_COMPILER" = yes
+then
+# The "-wdXXX" options suppress warnings:
+# remark #1419: external declaration in primary source file
+# remark #1682: implicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
+# remark #193: zero used for undefined preprocessing identifier
+# remark #593: variable "curs_sb_left_arrow" was set but never used
+# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
+# remark #869: parameter "tw" was never referenced
+# remark #981: operands are evaluated in unspecified order
+# warning #269: invalid format string conversion
+
+	AC_CHECKING([for $CC warning options])
+	cf_save_CFLAGS="$CFLAGS"
+	EXTRA_CFLAGS="-Wall"
+	for cf_opt in $1 \
+		wd1419 \
+		wd1682 \
+		wd1683 \
+		wd1684 \
+		wd193 \
+		wd279 \
+		wd593 \
+		wd810 \
+		wd869 \
+		wd981
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if AC_TRY_EVAL(ac_compile); then
+			test -n "$verbose" && AC_MSG_RESULT(... -$cf_opt)
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+
+elif test "$GCC" = yes
+then
 	AC_CHECKING([for $CC warning options])
 	cf_save_CFLAGS="$CFLAGS"
 	EXTRA_CFLAGS="-W -Wall"
@@ -2283,7 +2540,7 @@ EOF
 		Wpointer-arith \
 		Wshadow \
 		Wstrict-prototypes \
-		Wundef $cf_warn_CONST
+		Wundef $cf_warn_CONST $1
 	do
 		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
 		if AC_TRY_EVAL(ac_compile); then
@@ -2303,13 +2560,14 @@ EOF
 			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
 		fi
 	done
-	rm -f conftest*
 	CFLAGS="$cf_save_CFLAGS"
 fi
+rm -f conftest*
+
 AC_SUBST(EXTRA_CFLAGS)
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_GNU_SOURCE version: 3 updated: 2000/10/29 23:30:53
+dnl CF_GNU_SOURCE version: 6 updated: 2005/07/09 13:23:07
 dnl -------------
 dnl Check if we must define _GNU_SOURCE to get a reasonable value for
 dnl _XOPEN_SOURCE, upon which many POSIX definitions depend.  This is a defect
@@ -2360,6 +2618,43 @@ test -d "$oldincludedir" && {
 
 ])dnl
 dnl ---------------------------------------------------------------------------
+dnl CF_INTEL_COMPILER version: 3 updated: 2005/08/06 18:37:29
+dnl -----------------
+dnl Check if the given compiler is really the Intel compiler for Linux.  It
+dnl tries to imitate gcc, but does not return an error when it finds a mismatch
+dnl between prototypes, e.g., as exercised by CF_MISSING_CHECK.
+dnl
+dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to
+dnl ensure that it is not mistaken for gcc/g++.  It is normally invoked from
+dnl the wrappers for gcc and g++ warnings.
+dnl
+dnl $1 = GCC (default) or GXX
+dnl $2 = INTEL_COMPILER (default) or INTEL_CPLUSPLUS
+dnl $3 = CFLAGS (default) or CXXFLAGS
+AC_DEFUN([CF_INTEL_COMPILER],[
+ifelse($2,,INTEL_COMPILER,[$2])=no
+
+if test "$ifelse($1,,[$1],GCC)" = yes ; then
+	case $host_os in
+	linux*|gnu*)
+		AC_MSG_CHECKING(if this is really Intel ifelse($1,GXX,C++,C) compiler)
+		cf_save_CFLAGS="$ifelse($3,,CFLAGS,[$3])"
+		ifelse($3,,CFLAGS,[$3])="$ifelse($3,,CFLAGS,[$3]) -no-gcc"
+		AC_TRY_COMPILE([],[
+#ifdef __INTEL_COMPILER
+#else
+make an error
+#endif
+],[ifelse($2,,INTEL_COMPILER,[$2])=yes
+cf_save_CFLAGS="$cf_save_CFLAGS -we147 -no-gcc"
+],[])
+		ifelse($3,,CFLAGS,[$3])="$cf_save_CFLAGS"
+		AC_MSG_RESULT($ifelse($2,,INTEL_COMPILER,[$2]))
+		;;
+	esac
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
 dnl CF_LIBRARY_PATH version: 7 updated: 2002/11/10 14:46:59
 dnl ---------------
 dnl Construct a search-list for a nonstandard library-file
@@ -2575,7 +2870,7 @@ printf("old\n");
 	,[$1=no])
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_NCURSES_CPPFLAGS version: 16 updated: 2002/12/29 18:30:46
+dnl CF_NCURSES_CPPFLAGS version: 17 updated: 2003/11/06 19:59:57
 dnl -------------------
 dnl Look for the SVr4 curses clone 'ncurses' in the standard places, adjusting
 dnl the CPPFLAGS variable so we can include its header.
@@ -2599,6 +2894,7 @@ dnl wide-character version of ncurses is
 AC_DEFUN([CF_NCURSES_CPPFLAGS],
 [AC_REQUIRE([CF_WITH_CURSES_DIR])
 
+AC_PROVIDE([CF_CURSES_CPPFLAGS])dnl
 cf_ncuhdr_root=ifelse($1,,ncurses,$1)
 
 test -n "$cf_cv_curses_dir" && \
@@ -2673,7 +2969,7 @@ esac
 CF_NCURSES_VERSION
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_NCURSES_LIBS version: 11 updated: 2002/12/22 14:22:25
+dnl CF_NCURSES_LIBS version: 12 updated: 2004/04/27 16:26:05
 dnl ---------------
 dnl Look for the ncurses library.  This is a little complicated on Linux,
 dnl because it may be linked with the gpm (general purpose mouse) library.
@@ -2703,7 +2999,9 @@ case $host_os in #(vi
 freebsd*)
 	# This is only necessary if you are linking against an obsolete
 	# version of ncurses (but it should do no harm, since it's static).
-	AC_CHECK_LIB(mytinfo,tgoto,[cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"])
+	if test "$cf_nculib_root" = ncurses ; then
+		AC_CHECK_LIB(mytinfo,tgoto,[cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"])
+	fi
 	;;
 esac
 
@@ -2739,13 +3037,14 @@ CF_UPPER(cf_nculib_ROOT,HAVE_LIB$cf_ncul
 AC_DEFINE_UNQUOTED($cf_nculib_ROOT)
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_NCURSES_VERSION version: 10 updated: 2002/10/27 18:21:42
+dnl CF_NCURSES_VERSION version: 11 updated: 2003/11/06 19:59:57
 dnl ------------------
 dnl Check for the version of ncurses, to aid in reporting bugs, etc.
 dnl Call CF_CURSES_CPPFLAGS first, or CF_NCURSES_CPPFLAGS.  We don't use
 dnl AC_REQUIRE since that does not work with the shell's if/then/else/fi.
 AC_DEFUN([CF_NCURSES_VERSION],
 [
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
 AC_CACHE_CHECK(for ncurses version, cf_cv_ncurses_version,[
 	cf_cv_ncurses_version=no
 	cf_tempfile=out$$
@@ -2843,7 +3142,7 @@ LIBS="$LIBS $cf_cv_netlibs"
 test $cf_test_netlibs = no && echo "$cf_cv_netlibs" >&AC_FD_MSG
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_OUR_MESSAGES version: 4 updated: 2003/06/06 00:48:41
+dnl CF_OUR_MESSAGES version: 7 updated: 2004/09/12 19:45:55
 dnl ---------------
 dnl Check if we use the messages included with this program
 dnl
@@ -2862,7 +3161,7 @@ if test "$USE_NLS" = yes ; then
 if test -d $srcdir/po ; then
 AC_MSG_CHECKING(if we should use included message-library)
 	AC_ARG_ENABLE(included-msgs,
-	[  --enable-included-msgs  use included messages, for i18n support],
+	[  --disable-included-msgs use included messages, for i18n support],
 	[use_our_messages=$enableval],
 	[use_our_messages=yes])
 fi
@@ -2872,7 +3171,7 @@ fi
 MSG_DIR_MAKE="#"
 if test "$use_our_messages" = yes
 then
-	SUB_MAKEFILE="$SUB_MAKEFILE po/$cf_makefile.in:po/$cf_makefile.inn"
+	SUB_MAKEFILE="$SUB_MAKEFILE po/$cf_makefile.in:$srcdir/po/$cf_makefile.inn"
 	MSG_DIR_MAKE=
 fi
 
@@ -3032,6 +3331,84 @@ else
 fi
 ])dnl
 dnl ---------------------------------------------------------------------------
+dnl CF_POSIX_C_SOURCE version: 6 updated: 2005/07/14 20:25:10
+dnl -----------------
+dnl Define _POSIX_C_SOURCE to the given level, and _POSIX_SOURCE if needed.
+dnl
+dnl	POSIX.1-1990				_POSIX_SOURCE
+dnl	POSIX.1-1990 and			_POSIX_SOURCE and
+dnl		POSIX.2-1992 C-Language			_POSIX_C_SOURCE=2
+dnl		Bindings Option
+dnl	POSIX.1b-1993				_POSIX_C_SOURCE=199309L
+dnl	POSIX.1c-1996				_POSIX_C_SOURCE=199506L
+dnl	X/Open 2000				_POSIX_C_SOURCE=200112L
+dnl
+dnl Parameters:
+dnl	$1 is the nominal value for _POSIX_C_SOURCE
+AC_DEFUN([CF_POSIX_C_SOURCE],
+[
+cf_POSIX_C_SOURCE=ifelse($1,,199506L,$1)
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+CF_REMOVE_DEFINE(cf_trim_CFLAGS,$cf_save_CFLAGS,_POSIX_C_SOURCE)
+CF_REMOVE_DEFINE(cf_trim_CPPFLAGS,$cf_save_CPPFLAGS,_POSIX_C_SOURCE)
+
+AC_CACHE_CHECK(if we should define _POSIX_C_SOURCE,cf_cv_posix_c_source,[
+	CF_MSG_LOG(if the symbol is already defined go no further)
+	AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif],
+	[cf_cv_posix_c_source=no],
+	[cf_want_posix_source=no
+	 case .$cf_POSIX_C_SOURCE in #(vi
+	 .[[12]]??*) #(vi
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		;;
+	 .2) #(vi
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		cf_want_posix_source=yes
+		;;
+	 .*)
+		cf_want_posix_source=yes
+		;;
+	 esac
+	 if test "$cf_want_posix_source" = yes ; then
+		AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifdef _POSIX_SOURCE
+make an error
+#endif],[],
+		cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE")
+	 fi
+	 CF_MSG_LOG(ifdef from value $cf_POSIX_C_SOURCE)
+	 CFLAGS="$cf_trim_CFLAGS"
+	 CPPFLAGS="$cf_trim_CPPFLAGS $cf_cv_posix_c_source"
+	 CF_MSG_LOG(if the second compile does not leave our definition intact error)
+	 AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif],,
+	 [cf_cv_posix_c_source=no])
+	 CFLAGS="$cf_save_CFLAGS"
+	 CPPFLAGS="$cf_save_CPPFLAGS"
+	])
+])
+
+if test "$cf_cv_posix_c_source" != no ; then
+	CFLAGS="$cf_trim_CFLAGS"
+	CPPFLAGS="$cf_trim_CPPFLAGS"
+	if test "$cf_cv_cc_u_d_options" = yes ; then
+		cf_temp_posix_c_source=`echo "$cf_cv_posix_c_source" | \
+				sed -e 's/-D/-U/g' -e 's/=[[^ 	]]*//g'`
+		CPPFLAGS="$CPPFLAGS $cf_temp_posix_c_source"
+	fi
+	CPPFLAGS="$CPPFLAGS $cf_cv_posix_c_source"
+fi
+
+])dnl
+dnl ---------------------------------------------------------------------------
 dnl CF_POSIX_JC version: 3 updated: 2001/05/27 21:36:02
 dnl -----------
 dnl Check if we have POSIX-style job control (i.e., sigaction), or if we must
@@ -3073,26 +3450,52 @@ test "$cf_cv_sigaction_funcs" = yes && A
 fi
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_PROG_EXT version: 8 updated: 2002/12/21 19:25:52
+dnl CF_PROG_CC_U_D version: 1 updated: 2005/07/14 16:59:30
+dnl --------------
+dnl Check if C (preprocessor) -U and -D options are processed in the order
+dnl given rather than by type of option.  Some compilers insist on apply all
+dnl of the -U options after all of the -D options.  Others allow mixing them,
+dnl and may predefine symbols that conflict with those we define.
+AC_DEFUN([CF_PROG_CC_U_D],
+[
+AC_CACHE_CHECK(if $CC -U and -D options work together,cf_cv_cc_u_d_options,[
+	cf_save_CPPFLAGS="$CPPFLAGS"
+	CPPFLAGS="-UU_D_OPTIONS -DU_D_OPTIONS -DD_U_OPTIONS -UD_U_OPTIONS"
+	AC_TRY_COMPILE([],[
+#ifndef U_D_OPTIONS
+make an undefined-error
+#endif
+#ifdef  D_U_OPTIONS
+make a defined-error
+#endif
+	],[
+	cf_cv_cc_u_d_options=yes],[
+	cf_cv_cc_u_d_options=no])
+	CPPFLAGS="$cf_save_CPPFLAGS"
+])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl CF_PROG_EXT version: 10 updated: 2004/01/03 19:28:18
 dnl -----------
 dnl Compute $PROG_EXT, used for non-Unix ports, such as OS/2 EMX.
 AC_DEFUN([CF_PROG_EXT],
 [
 AC_REQUIRE([CF_CHECK_CACHE])
-PROG_EXT=
 case $cf_cv_system_name in
 os2*)
-    # We make sure -Zexe is not used -- it would interfere with @PROG_EXT@
     CFLAGS="$CFLAGS -Zmt"
     CPPFLAGS="$CPPFLAGS -D__ST_MT_ERRNO__"
     CXXFLAGS="$CXXFLAGS -Zmt"
-    LDFLAGS=`echo "$LDFLAGS -Zmt -Zcrtdll" | sed -e "s%-Zexe%%g"`
-    PROG_EXT=".exe"
-    ;;
-cygwin*)
-    PROG_EXT=".exe"
+    # autoconf's macro sets -Zexe and suffix both, which conflict:w
+    LDFLAGS="$LDFLAGS -Zmt -Zcrtdll"
+    ac_cv_exeext=.exe
     ;;
 esac
+
+AC_EXEEXT
+AC_OBJEXT
+
+PROG_EXT="$EXEEXT"
 AC_SUBST(PROG_EXT)
 test -n "$PROG_EXT" && AC_DEFINE_UNQUOTED(PROG_EXT,"$PROG_EXT")
 ])dnl
@@ -3219,6 +3622,24 @@ AC_CHECK_LIB($2,$1,[
 	[[$]$3])
 ])dnl
 dnl ---------------------------------------------------------------------------
+dnl CF_REMOVE_DEFINE version: 2 updated: 2005/07/09 16:12:18
+dnl ----------------
+dnl Remove all -U and -D options that refer to the given symbol from a list
+dnl of C compiler options.  This works around the problem that not all
+dnl compilers process -U and -D options from left-to-right, so a -U option
+dnl cannot be used to cancel the effect of a preceding -D option.
+dnl
+dnl $1 = target (which could be the same as the source variable)
+dnl $2 = source (including '$')
+dnl $3 = symbol to remove
+define([CF_REMOVE_DEFINE],
+[
+# remove $3 symbol from $2
+$1=`echo "$2" | \
+	sed	-e 's/-[[UD]]$3\(=[[^ 	]]*\)\?[[ 	]]/ /g' \
+		-e 's/-[[UD]]$3\(=[[^ 	]]*\)\?[$]//g'`
+])dnl
+dnl ---------------------------------------------------------------------------
 dnl CF_SET_GID_UID version: 2 updated: 1997/08/28 23:57:55
 dnl --------------
 dnl Check for the functions that set effective/real uid/gid.  This has to
@@ -3584,6 +4005,24 @@ test -d /usr && {
 }
 ])dnl
 dnl ---------------------------------------------------------------------------
+dnl CF_SUBST version: 2 updated: 1997/09/06 23:41:28
+dnl --------
+dnl	Shorthand macro for substituting things that the user may override
+dnl	with an environment variable.
+dnl
+dnl	$1 = long/descriptive name
+dnl	$2 = environment variable
+dnl	$3 = default value
+AC_DEFUN([CF_SUBST],
+[AC_CACHE_VAL(cf_cv_subst_$2,[
+AC_MSG_CHECKING(for $1 (symbol $2))
+test -z "[$]$2" && $2=$3
+AC_MSG_RESULT([$]$2)
+AC_SUBST($2)
+cf_cv_subst_$2=[$]$2])
+$2=${cf_cv_subst_$2}
+])dnl
+dnl ---------------------------------------------------------------------------
 dnl CF_SYS_ERRLIST version: 6 updated: 2001/12/30 13:03:23
 dnl --------------
 dnl Check for declaration of sys_nerr and sys_errlist in one of stdio.h and
@@ -4002,6 +4441,23 @@ AC_ARG_WITH(curses-dir,
 	[cf_cv_curses_dir=no])
 ])dnl
 dnl ---------------------------------------------------------------------------
+dnl CF_WITH_DBMALLOC version: 4 updated: 2004/02/28 05:49:27
+dnl ----------------
+dnl Configure-option for dbmalloc.  The optional parameter is used to override
+dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests.
+AC_DEFUN([CF_WITH_DBMALLOC],[
+AC_MSG_CHECKING(if you want to link with dbmalloc for testing)
+AC_ARG_WITH(dbmalloc,
+	[  --with-dbmalloc         use Conor Cahill's dbmalloc library],
+	[with_dbmalloc=$withval],
+	[with_dbmalloc=no])
+AC_MSG_RESULT($with_dbmalloc)
+if test "$with_dbmalloc" = yes ; then
+	AC_CHECK_HEADER(dbmalloc.h,
+		[AC_CHECK_LIB(dbmalloc,[debug_malloc]ifelse($1,,[],[,$1]))])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
 dnl CF_WITH_DFTENV version: 3 updated: 1998/04/01 11:39:13
 dnl --------------
 dnl Wrapper for AC_ARG_WITH to inherit/override an environment variable's
@@ -4022,6 +4478,23 @@ $3="$withval"
 AC_DEFINE_UNQUOTED($3,"[$]$3")dnl
 ])dnl
 dnl ---------------------------------------------------------------------------
+dnl CF_WITH_DMALLOC version: 4 updated: 2004/02/28 05:49:27
+dnl ---------------
+dnl Configure-option for dmalloc.  The optional parameter is used to override
+dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests.
+AC_DEFUN([CF_WITH_DMALLOC],[
+AC_MSG_CHECKING(if you want to link with dmalloc for testing)
+AC_ARG_WITH(dmalloc,
+	[  --with-dmalloc          use Gray Watson's dmalloc library],
+	[with_dmalloc=$withval],
+	[with_dmalloc=no])
+AC_MSG_RESULT($with_dmalloc)
+if test "$with_dmalloc" = yes ; then
+	AC_CHECK_HEADER(dmalloc.h,
+		[AC_CHECK_LIB(dmalloc,[dmalloc_debug]ifelse($1,,[],[,$1]))])
+fi
+])dnl
+dnl ---------------------------------------------------------------------------
 dnl CF_WITH_PATH version: 6 updated: 1998/10/11 00:40:17
 dnl ------------
 dnl Wrapper for AC_ARG_WITH to ensure that user supplies a pathname, not just
@@ -4092,47 +4565,164 @@ AC_DEFUN([CF_WITH_VALUE],
  AC_DEFINE_UNQUOTED($3,"$withval")dnl
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_XOPEN_CURSES version: 6 updated: 2002/11/12 06:55:30
+dnl CF_XOPEN_CURSES version: 8 updated: 2003/11/07 19:47:46
 dnl ---------------
 dnl Test if we should define X/Open source for curses, needed on Digital Unix
 dnl 4.x, to see the extended functions, but breaks on IRIX 6.x.
+dnl
+dnl The getbegyx() check is needed for HPUX, which omits legacy macros such
+dnl as getbegy().  The latter is better design, but the former is standard.
 AC_DEFUN([CF_XOPEN_CURSES],
 [
+AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl
 AC_CACHE_CHECK(if we must define _XOPEN_SOURCE_EXTENDED,cf_cv_need_xopen_extension,[
 AC_TRY_LINK([
 #include <stdlib.h>
 #include <${cf_cv_ncurses_header-curses.h}>],[
-	long x = winnstr(stdscr, "", 0)],
+	long x = winnstr(stdscr, "", 0);
+	int x1, y1;
+	getbegyx(stdscr, y1, x1)],
 	[cf_cv_need_xopen_extension=no],
 	[AC_TRY_LINK([
 #define _XOPEN_SOURCE_EXTENDED
 #include <stdlib.h>
 #include <${cf_cv_ncurses_header-curses.h}>],[
-	long x = winnstr(stdscr, "", 0)],
+	long x = winnstr(stdscr, "", 0);
+	int x1, y1;
+	getbegyx(stdscr, y1, x1)],
 	[cf_cv_need_xopen_extension=yes],
 	[cf_cv_need_xopen_extension=unknown])])])
 test $cf_cv_need_xopen_extension = yes && CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED"
 ])dnl
 dnl ---------------------------------------------------------------------------
-dnl CF_X_ATHENA version: 11 updated: 2002/12/26 20:56:10
+dnl CF_XOPEN_SOURCE version: 23 updated: 2005/10/15 16:39:05
+dnl ---------------
+dnl Try to get _XOPEN_SOURCE defined properly that we can use POSIX functions,
+dnl or adapt to the vendor's definitions to get equivalent functionality.
+dnl
+dnl Parameters:
+dnl	$1 is the nominal value for _XOPEN_SOURCE
+dnl	$2 is the nominal value for _POSIX_C_SOURCE
+AC_DEFUN([CF_XOPEN_SOURCE],[
+
+AC_REQUIRE([CF_PROG_CC_U_D])
+
+cf_XOPEN_SOURCE=ifelse($1,,500,$1)
+cf_POSIX_C_SOURCE=ifelse($2,,199506L,$2)
+
+case $host_os in #(vi
+aix[[45]]*) #(vi
+	CPPFLAGS="$CPPFLAGS -D_ALL_SOURCE"
+	;;
+freebsd*) #(vi
+	# 5.x headers associate
+	#	_XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L
+	#	_XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L
+	cf_POSIX_C_SOURCE=200112L
+	cf_XOPEN_SOURCE=600
+	CPPFLAGS="$CPPFLAGS -D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+	;;
+hpux*) #(vi
+	CPPFLAGS="$CPPFLAGS -D_HPUX_SOURCE"
+	;;
+irix[[56]].*) #(vi
+	CPPFLAGS="$CPPFLAGS -D_SGI_SOURCE"
+	;;
+linux*|gnu*) #(vi
+	CF_GNU_SOURCE
+	;;
+mirbsd*) #(vi
+	# setting _XOPEN_SOURCE or _POSIX_SOURCE breaks <arpa/inet.h>
+	;;
+netbsd*) #(vi
+	# setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw
+	;;
+openbsd*) #(vi
+	# setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw
+	;;
+osf[[45]]*) #(vi
+	CPPFLAGS="$CPPFLAGS -D_OSF_SOURCE"
+	;;
+nto-qnx*) #(vi
+	CPPFLAGS="$CPPFLAGS -D_QNX_SOURCE"
+	;;
+sco*) #(vi
+	# setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer
+	;;
+solaris*) #(vi
+	CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
+	;;
+*)
+	AC_CACHE_CHECK(if we should define _XOPEN_SOURCE,cf_cv_xopen_source,[
+	AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifndef _XOPEN_SOURCE
+make an error
+#endif],
+	[cf_cv_xopen_source=no],
+	[cf_save="$CPPFLAGS"
+	 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+	 AC_TRY_COMPILE([#include <sys/types.h>],[
+#ifdef _XOPEN_SOURCE
+make an error
+#endif],
+	[cf_cv_xopen_source=no],
+	[cf_cv_xopen_source=$cf_XOPEN_SOURCE])
+	CPPFLAGS="$cf_save"
+	])
+])
+	if test "$cf_cv_xopen_source" != no ; then
+		CF_REMOVE_DEFINE(CFLAGS,$CFLAGS,_XOPEN_SOURCE)
+		CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,_XOPEN_SOURCE)
+		test "$cf_cv_cc_u_d_options" = yes && \
+			CPPFLAGS="$CPPFLAGS -U_XOPEN_SOURCE"
+		CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=$cf_cv_xopen_source"
+	fi
+	CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE)
+	;;
+esac
+])
+dnl ---------------------------------------------------------------------------
+dnl CF_X_ATHENA version: 12 updated: 2004/06/15 21:14:41
 dnl -----------
 dnl Check for Xaw (Athena) libraries
 dnl
+dnl Sets $cf_x_athena according to the flavor of Xaw which is used.
 AC_DEFUN([CF_X_ATHENA],
 [AC_REQUIRE([CF_X_TOOLKIT])
 cf_x_athena=${cf_x_athena-Xaw}
 
+AC_MSG_CHECKING(if you want to link with Xaw 3d library)
+withval=
 AC_ARG_WITH(Xaw3d,
-	[  --with-Xaw3d            link with Xaw 3d library],
-	[cf_x_athena=Xaw3d])
+	[  --with-Xaw3d            link with Xaw 3d library])
+if test "$withval" = yes ; then
+	cf_x_athena=Xaw3d
+	AC_MSG_RESULT(yes)
+else
+	AC_MSG_RESULT(no)
+fi
 
+AC_MSG_CHECKING(if you want to link with neXT Athena library)
+withval=
 AC_ARG_WITH(neXtaw,
-	[  --with-neXtaw           link with neXT Athena library],
-	[cf_x_athena=neXtaw])
+	[  --with-neXtaw           link with neXT Athena library])
+if test "$withval" = yes ; then
+	cf_x_athena=neXtaw
+	AC_MSG_RESULT(yes)
+else
+	AC_MSG_RESULT(no)
+fi
 
+AC_MSG_CHECKING(if you want to link with Athena-Plus library)
+withval=
 AC_ARG_WITH(XawPlus,
-	[  --with-XawPlus          link with Athena-Plus library],
-	[cf_x_athena=XawPlus])
+	[  --with-XawPlus          link with Athena-Plus library])
+if test "$withval" = yes ; then
+	cf_x_athena=XawPlus
+	AC_MSG_RESULT(yes)
+else
+	AC_MSG_RESULT(no)
+fi
 
 AC_CHECK_LIB(Xext,XextCreateExtension,
 	[LIBS="-lXext $LIBS"])
@@ -4246,59 +4836,33 @@ CF_UPPER(cf_x_athena_LIBS,HAVE_LIB_$cf_x
 AC_DEFINE_UNQUOTED($cf_x_athena_LIBS)
 ])
 dnl ---------------------------------------------------------------------------
-dnl CF_X_TOOLKIT version: 9 updated: 2001/12/30 19:09:58
+dnl CF_X_TOOLKIT version: 10 updated: 2004/04/25 15:37:17
 dnl ------------
 dnl Check for X Toolkit libraries
 dnl
 AC_DEFUN([CF_X_TOOLKIT],
 [
+AC_REQUIRE([AC_PATH_XTRA])
 AC_REQUIRE([CF_CHECK_CACHE])
-# We need to check for -lsocket and -lnsl here in order to work around an
-# autoconf bug.  autoconf-2.12 is not checking for these prior to checking for
-# the X11R6 -lSM and -lICE libraries.  The resultant failures cascade...
-# 	(tested on Solaris 2.5 w/ X11R6)
-SYSTEM_NAME=`echo "$cf_cv_system_name"|tr ' ' -`
+
+# SYSTEM_NAME=`echo "$cf_cv_system_name"|tr ' ' -`
+
 cf_have_X_LIBS=no
-case $SYSTEM_NAME in
-irix[[56]]*) ;;
-clix*)
-	# FIXME: modify the library lookup in autoconf to
-	# allow _s.a suffix ahead of .a
-	AC_CHECK_LIB(c_s,open,
-		[LIBS="-lc_s $LIBS"
-	AC_CHECK_LIB(bsd,gethostname,
-		[LIBS="-lbsd $LIBS"
-	AC_CHECK_LIB(nsl_s,gethostname,
-		[LIBS="-lnsl_s $LIBS"
-	AC_CHECK_LIB(X11_s,XOpenDisplay,
-		[LIBS="-lX11_s $LIBS"
-	AC_CHECK_LIB(Xt_s,XtAppInitialize,
-		[LIBS="-lXt_s $LIBS"
-		 cf_have_X_LIBS=Xt
-		]) ]) ]) ]) ])
-	;;
-*)
-	AC_CHECK_LIB(socket,socket)
-	AC_CHECK_LIB(nsl,gethostname)
-	;;
-esac
 
-if test $cf_have_X_LIBS = no ; then
-	AC_PATH_XTRA
-	LDFLAGS="$LDFLAGS $X_LIBS"
-	CF_CHECK_CFLAGS($X_CFLAGS)
-	AC_CHECK_LIB(X11,XOpenDisplay,
-		[LIBS="-lX11 $LIBS"],,
-		[$X_PRE_LIBS $LIBS $X_EXTRA_LIBS])
-	AC_CHECK_LIB(Xt, XtAppInitialize,
-		[AC_DEFINE(HAVE_LIBXT)
-		 cf_have_X_LIBS=Xt
-		 LIBS="-lXt $X_PRE_LIBS $LIBS"],,
-		[$X_PRE_LIBS $LIBS $X_EXTRA_LIBS])
-else
-	LDFLAGS="$LDFLAGS $X_LIBS"
-	CF_CHECK_CFLAGS($X_CFLAGS)
-fi
+LDFLAGS="$X_LIBS $LDFLAGS"
+CF_CHECK_CFLAGS($X_CFLAGS)
+
+AC_CHECK_FUNC(XOpenDisplay,,[
+AC_CHECK_LIB(X11,XOpenDisplay,
+	[LIBS="-lX11 $LIBS"],,
+	[$X_PRE_LIBS $LIBS $X_EXTRA_LIBS])])
+
+AC_CHECK_FUNC(XtAppInitialize,,[
+AC_CHECK_LIB(Xt, XtAppInitialize,
+	[AC_DEFINE(HAVE_LIBXT)
+	 cf_have_X_LIBS=Xt
+	 LIBS="-lXt $X_PRE_LIBS $LIBS"],,
+	[$X_PRE_LIBS $LIBS $X_EXTRA_LIBS])])
 
 if test $cf_have_X_LIBS = no ; then
 	AC_WARN(
diff -Nurp tin-1.6.2/amiga/README tin-1.8.0/amiga/README
--- tin-1.6.2/amiga/README	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/amiga/README	1970-01-01 01:00:00.000000000 +0100
@@ -1,109 +0,0 @@
-This is the Amiga port of TIN. To use it you will need to do the following:
-
-Have appropriate directories assigned (UULIB: UUNEWS:).
-Have these environment variables set:
-
-NODENAME
-USERNAME
-REALNAME
-HOME
-EDITOR
-
-TIN only works with a hierarchical news directory. This means you will
-need Dillon's UUCP1.16 or higher. TIN has been modified to work with
-Dillon's Sendmail & Postnews programs. These take different arguments
-from standard UNIX mail and news programs. With release 1.1 PL 9 of TIN
-two further environment variables can been defined:
-
-TIN_POST (default "uucp:c/postnews %s") and
-TIN_MAIL (default "uucp:c/sendmail <%s -f %s").
-
-If you set these variables, you can configure TIN for any other news/mail
-system. The %s in TIN_POST gets replaced with a filename containing the
-news article. TIN_MAIL's first %s is a filename, the second is the userid
-of the person sending the mail, and the third (if present), is the userid
-of the recipient of the mail.
-
-Printing is now available. You will have to edit the .tin/tinrc file to
-enable it. The "default_printer" string should be set to "copy PIPE: PRT:"
-instead of its default setting. This option has not been added to the
-internal menu of configurable options.
-
-The editor you use with TIN should not return instantly, so if you are
-using CED or TTX (or probably some others too) you will need to also add
-in the appropriate options in the environment variable EDITOR (see script
-file below) which will force your editor to wait until you've quit the
-editor. Unless you have an editor which understands the argument +7 to
-mean "start editing at line 7", you should set "Editor Offset" in the
-configuration menu (type shift-M) to OFF. An example startup script is
-given here (I've renamed tin to tin.exe so you can call this script TIN):
-
-----------------------------------
-; For WB2.0 users, the setenv's can be set's instead. This allows multiple
-; users to run with their own names etc. WB1.3 users have to use setenv.
-
-setenv USERNAME fred
-setenv REALNAME "Fred Flinstone"
-setenv NODENAME bedrock   ; This should be just your node name, not the
-                          ; entire domain.
-setenv HOME    dh0:news   ; wherever you want your news & index files
-                          ; stored
-setenv EDITOR  c:ed
-stack 40000               ; TIN requires a large stack!
-actived                   ; create a new active file
-delete uulib:active
-rename uulib:newsactive uulib:active
-tin.exe                   ; start tin itself
----------------------------------
-
-Actived creates an "active" file. This is a standard file in Unix
-environments, but missing from DUUCP. Actived also sets the environment
-variable "TIN_GROUPS" to equal the number of newsgroups. This variable
-isn't necessary to run TIN, but allows TIN to save some memory. If you
-don't wish to run actived before TIN, you may wish to copy TIN_GROUPS
-to ENVARC: (WB 2.0+ !!).
-
-More options, and use of tin is explained in the file tin.nrf. (The
-standard manual page that comes with TIN).
-
-The following options have been disabled from the TIN source for the Amiga
-version:
-
-- Archive extraction. Note that 1.1 PL 9 has now enabled uudecoding and
-un-shar'ing of posted archives. This requires "uudecode" and "unshar" to
-be in the path.
-
-- Shell escape and piping to any shell command.
-
-- Ability to change News and Mail directories.
-
-- Re-reading of the active file while reading news has been disabled. So has
-updating index files in the background (-U option).
-
-These options were disabled partly to make TIN easier to port, but also
-to make it secure enough to run as a newsreader for a Bulletin Board.
-
-A TIND program (for creating/updating index files) exists, and is only any
-use on a BBS. To make TIN aware that you are using TIND to update the
-index, you must set the environment variable TIND (it doesn't matter what
-you set it to!). The index files are by default stored in the UUNEWS:
-directory, in a subdirectory called .index (as in UNIX). For performance
-reasons, you may wish to change the directory to a different drive. By
-setting the environment variable TIN_INDEX, you can force the index files
-to be stored in $TIN_INDEX/.index.
-
-Another two environment variables LINES and COLUMNS can be set to specify
-the size of your screen. Inside an Amiga window this isn't required, as TIN
-can query the window size, but once again, if you're running on anything
-other than the Amiga's console, this query string won't work. If TIN finds
-the LINES and COLUMNS environment variables set, it will not try to query
-the window size.
-
-If you are planning on using TIN in a multi-user environment, such as with
-a BBS, you should take a look at the companion archive to this one, which
-is called DLGTIN.LHA. Even though this has been set up explicitly for DLG,
-it contains executables and documentation which will be useful for any setup
-of this type.
-
- - Mark Tomlinson         (mark@garden.equinox.gen.nz)
-   Geoff McCaughan        (geoff@satori.equinox.gen.nz)
diff -Nurp tin-1.6.2/amiga/actived.c tin-1.8.0/amiga/actived.c
--- tin-1.6.2/amiga/actived.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/amiga/actived.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,153 +0,0 @@
-/*
- *  Project   : tin - a Usenet reader
- *  Module    : actived.c
- *  Author    : M.Tomlinson & I.Lea
- *  Created   : 23-08-92
- *  Updated   : 02-12-94
- *  Notes     : Creates an active file  by looking through all the
- *              .next files in  the news directories, and  writing
- *              this to UULIB:newactive. The UULIB:newsgroups file
- *              must exist.
- *  Copyright : (c) Copyright 1991-94 by Mark Tomlinson & Iain Lea
- *              You may  freely  copy or  redistribute  this software,
- *              so  long as there is no profit made from its use, sale
- *              trade or  reproduction.  You may not change this copy-
- *              right notice, and it must be included in any copy made
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <time.h>
-
-#define PATH_LEN 256
-#define NG_LEN 256
-
-#if defined(M_AMIGA)
-#      define  NEWSGROUPS_FILE "UULIB:newsgroups"
-#      define  NEWSACTIVE_FILE "UULIB:newsactive"
-#      define  ACTIVE_FILE     "UULIB:active"
-#      define  ACTIVE_TIMES    "UULIB:active.times"
-#      define  SPOOLDIR        "UUNEWS:"
-#      define  ENV_VAR_GROUPS  "TIN_GROUPS"
-#endif
-
-long maxgroups;
-char **grouplist;
-
-static long readgroups(void);
-
-int main (void)
-{
-       FILE *active, *oldactive;
-       long numgroups, i;
-       long min = 1, max;
-       char oldgroup[NG_LEN] = "";
-
-       /* Just who does live in CST timezone anyway? */
-
-       _TZ = "GMT0";
-       __tzset();
-
-       numgroups = readgroups();
-
-       if ((active = fopen (NEWSACTIVE_FILE, "w")) == (FILE *) 0) {
-               perror (NEWSACTIVE_FILE);
-               exit (1);
-       }
-
-       oldactive = fopen(ACTIVE_FILE, "r");
-
-       for (i = 0; i < numgroups; i++) {
-               int new;
-               if (oldactive) while ((new = strcmp(oldgroup, grouplist[i])) < 0) {
-                       if (fgets (oldgroup, sizeof(oldgroup), oldactive)) {
-                               char *p;
-                               for (p = oldgroup; *p && *p != ' ' && *p != '\t' && *p != '\n'; p++) {
-                                       ;
-                               }
-                               *p = '\0';
-                       } else {
-                               fclose(oldactive);
-                               oldactive = (FILE *) 0;
-                               break;
-                       }
-               } else new = 0;
-
-               if (new) {
-                       FILE *times;
-                       times = fopen(ACTIVE_TIMES, "a");
-                       if (times) {
-                               time_t t;
-                               time(&t);
-                               fprintf(times, "%s %lu actived\n", grouplist[i], t);
-                               fclose(times);
-                       }
-               }
-
-               {       FILE *fp;
-                       {       char next_path[PATH_LEN];
-                               char *p;
-
-                               sprintf (next_path, "%s%s", SPOOLDIR, grouplist[i]);
-
-                               for (p = next_path; *p ; p++) {
-                                       if (*p == '.') {
-                                               *p = '/';       /* convert to tree structure */
-                                       }
-                               }
-                               strcpy (p, "/.next");
-                               fp = fopen (next_path, "r");
-                       }
-                       if (fp) {
-                               char last[20];
-                               fgets (last, sizeof(last), fp);
-                               max = atol (last) - 1;
-                               fclose (fp);
-                       } else {
-                               max = 0;
-                       }
-               }
-               fprintf (active, "%s %05ld %05ld y\n", grouplist[i], max, min);
-       }
-       fclose (oldactive);
-       fclose (active);
-
-       {       char buf[40];
-               sprintf (buf, "%s=%d", ENV_VAR_GROUPS, numgroups+1);
-               putenv (buf);
-       }
-       return 0;
-}
-
-static long
-readgroups(void)
-{
-       FILE *fp;
-       long numgroups = 0;
-       char group[NG_LEN];
-       char *p;
-
-       maxgroups = 1000;
-       grouplist = malloc(maxgroups*sizeof(char *));
-
-       if ((fp = fopen(NEWSGROUPS_FILE, "r")) == (FILE *) 0) return -1;
-
-       while (fgets(group, sizeof(group), fp)) {
-               for (p = group; *p && *p != ' ' && *p != '\t' && *p != '\n'; p++) {
-                       ;
-               }
-               *p = '\0';
-
-               p = strdup(group);
-
-               if (numgroups >= maxgroups) {
-                       maxgroups += maxgroups/2;
-                       grouplist = realloc(grouplist,maxgroups*sizeof(char *));
-                       if (grouplist == (char **) 0) return -1;
-               }
-               grouplist[numgroups++] = p;
-       }
-       tqsort(grouplist, numgroups);
-       return numgroups;
-}
diff -Nurp tin-1.6.2/amiga/amiga.c tin-1.8.0/amiga/amiga.c
--- tin-1.6.2/amiga/amiga.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/amiga/amiga.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,724 +0,0 @@
-/*
- *  Project   : tin - a Usenet reader
- *  Module    : amiga.c
- *  Author    : M.Tomlinson, R.Luebke & I.Lea
- *  Created   : 01-04-91
- *  Updated   : 17-07-95
- *  Notes     : Extra functions for Amiga port
- *
- * Copyright (c) 1991-2000:
- * Reinhard Luebke <reinhard.luebke@erl9.siemens.de>
- * Mark Tomlinson <notmandm@pond.com>
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *    This product includes software developed by Reinhard Luebke, Mark Tomlinson.
- * 4. The name of the author may not be used to endorse or promote
- *    products derived from this software without specific prior written
- *    permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "tin.h"
-#include "version.h"
-
-#if defined(M_AMIGA)
-
-#include <exec/libraries.h>
-#include <exec/memory.h>
-#include <libraries/dos.h>
-#include <dos/exall.h>
-#	ifdef __SASC
-#		include <proto/dos.h>
-#		include <proto/exec.h>
-#	else
-#		include <clib/dos_protos.h>
-#		include <clib/exec_protos.h>
-#		include <pragmas/dos_lib.h>
-#		include <pragmas/exec_lib.h>
-#	endif /* __SASC */
-
-#include <ctype.h>
-#include <fcntl.h>
-#include <ios1.h>
-#include <error.h>
-
-#define BUFSIZE 1000
-
-static LONG dopkt(struct MsgPort *pid, LONG action, LONG args[], LONG nargs);
-
-extern struct DosLibrary *DOSBase;
-extern int errno;
-#ifdef __SASC
-	extern unsigned long __fmask;
-#endif /* __SASC */
-
-/*
- * something for the AmigaDOS Version command
- * AMIVER is defined in ../include/version.h
- * __AMIGADATE__ is defined by the SC 6.55 preprocessor
- */
-static const char verstag[] = "$VER: tin " AMIVER " " __AMIGADATE__ "\0";
-
-int optind = 1;
-char *optarg;
-
-#if 0
-	#ifdef __SASC
-		long __stack = 40000;   /* TIN requires lots of stack */
-	#endif /* __SASC */
-#endif /* 0 */
-
-static APTR old_windowptr;
-
-/* This routine gets called before main() */
-
-void __interrupt _STI_no_req(void)
-{       struct Process *pr;
-
-        pr = (struct Process *)FindTask(0L);
-        old_windowptr = pr->pr_WindowPtr;
-        pr->pr_WindowPtr = (APTR)-1;
-}
-
-/* And this one after exit() */
-
-void __interrupt _STD_restore_req(void)
-{       struct Process *pr;
-
-        pr = (struct Process *)FindTask(0L);
-        pr->pr_WindowPtr = old_windowptr;               /* Enable requesters. */
-}
-
-/*
- * The next is to avoid the generation of SIGINT whenever ctrl-d is pressed.
- * Remember tin uses ctrl-d for page down...
- *
- * Our version of chkabort() is listening only for ctrl-c.
- */
-
-#ifdef __SASC
-void __interrupt __chkabort (void)
-{
-        if (SetSignal(0, SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D) & SIGBREAKF_CTRL_C)
-        {
-                raise(SIGINT);
-        }
-}
-#endif /* __SASC */
-
-int
-chmod (const char *file, int mode)
-{
-    int amimode;
-                /* un*x's rwx bits are mapped to AmigaOS's rwe bits *
-                 * possible misfeature: the AmigaOS d-bit is not set */
-    amimode = ~mode >> 5 & 0xe;   /* owner, uh, sick! */
-    amimode |= (mode & 070)<<6;     /* group */
-    amimode |= (mode & 07)<<13;     /* other */
-    if (SetProtection(file,amimode) == TRUE)
-        return 0;
-    else
-        {
-            errno = EINVAL; /* best possible, if I don't include a complete */
-            return -1;      /* OSERR -> errno translation */
-        }
-}
-
-unsigned short umask (unsigned short mask)
-{
-#ifdef __SASC
-        __fmask = (~mask & 0700) >> 5 | 01; /* directly mapped, no use of fcntl.h */
-#endif /* __SASC */
-        return mask;
-}
-
-/* YAUAF (Yet Another Unnecessary ANSI Function) */
-
-/* time_t time(time_t *pt) deleted */
-
-/*
- * use the task address for pid which is unique.
- */
-
-int getpid (void)
-{
-        return ((long) FindTask(0L) >> 2);
-}
-
-void *alloca(size_t dummy)
-{
-        return NULL; /* fails, fails, fails! */
-}
-
-/*
- *  dopkt() by A. Finkel, P. Lindsay, C. Scheppner
- *  Send a packet in a 1.3-compatible manner
- *  and wait for completion; returns Res1 of the
- *  reply packet
- */
-
-static LONG dopkt(struct MsgPort *pid, LONG action, LONG args[], LONG nargs)
-
-/*
- * struct MsgPort *pid;    process identifier (handler message port)
- * LONG action;            packet type (desired action)
- * LONG args[];            a pointer to an argument list
- * LONG nargs;             number of arguments in list
-*/
-{       struct MsgPort  *replyport;
-        struct StandardPacket *packet;
-
-        LONG    count, *pargs, res1;
-
-        replyport = (struct MsgPort *)CreatePort(NULL,0);
-        if (! replyport) return NULL;
-
-        packet = (struct StandardPacket *)
-                        AllocMem((long)sizeof(struct StandardPacket),
-                                        MEMF_PUBLIC|MEMF_CLEAR);
-        if (! packet)
-        {       DeletePort(replyport);
-                return NULL;
-        }
-
-        packet->sp_Msg.mn_Node.ln_Name  = (char *)&(packet->sp_Pkt);
-        packet->sp_Pkt.dp_Link                  = &(packet->sp_Msg);
-        packet->sp_Pkt.dp_Port                  = replyport;
-        packet->sp_Pkt.dp_Type                  = action;
-
-        pargs = &(packet->sp_Pkt.dp_Arg1);      /* address of first arg */
-        for (count=0;count < nargs; count++)
-                pargs[count] = args[count];
-
-        PutMsg(pid,(struct Message *)packet);   /* send packet */
-
-        WaitPort(replyport);
-        GetMsg(replyport);
-
-        res1 = packet->sp_Pkt.dp_Res1;
-
-        FreeMem(packet,(long)sizeof(struct StandardPacket));
-        DeletePort(replyport);
-
-        return (res1);
-}
-
-/*
- * We don't like SAS/C's rawcon() anymore. It relies on
- * pr_ConsoleTask being correct.
- */
-
-/* should be fixed since SAS/C 6.55, maybe a SetMode(Input()) or similar
- * should be put here to satisfy the picky. (Damned, rawcon() is not in
- * another compiler-lib anyway AFAIK :-( )
- */
-
-/*
-int rawcon(int setraw)
-{
-        long args[1];
-        args[0] = setraw;
-        return (dopkt(((struct FileHandle *)BADDR(chkufb(fileno(stdout))
-                                ->ufbfh))->fh_Type,
-                        ACTION_SCREEN_MODE,args,1) == DOSTRUE) ?
-                0 : -1;
-}
-*/
-
-/*
- * stub for tputs
- */
-
-int
-tputs (char *str, int count, void (*func)(int))
-{
-        if (! str) {
-                return 0;
-        }
-
-        while (*str) {
-                if (*str == '\n')
-                        func('\r');
-                func(*str++);
-        }
-        return 0;
-}
-
-/*
- * joinpath tacks a file (or sub dir) on to the end of a directory name.
- * Not just as simple as putting a '/' between the two, as the directory
- * name may be an assign!
- */
-
-t_bool tin_bbs_mode = FALSE;
-
-void
-joinpath (char *str, const char *dir, const char *file)
-{
-	char c, *p;
-
-   if (tin_bbs_mode) {
-		if ((p = strrchr(file,':')))
-      	file = p;
-      while (*file == '/')
-      	file++;
-	} else {
-		if (strchr(file,':')) {
-				strcpy(str, file);
-				return;
-		}
-	}
-
-        if (strlen (dir) == 0) {
-                strcpy (str, file);
-                return;
-        }
-        c = dir[strlen(dir)-1];
-        if (c=='/' || c==':') {
-                sprintf (str, "%s%s", dir, file);
-        } else {
-                sprintf (str, "%s/%s", dir, file);
-        }
-}
-
-
-unsigned int sleep (unsigned int seconds)
-{
-        if (seconds) Delay (50*seconds);
-        return seconds;
-}
-
-/*
- * I'm not really sure how well popen and pclose work, but they seem OK
- * at least with metamail 2.3a they work rather bad. :-(
- */
-
-FILE *popen (char *command, char *mode)
-{
-        char cmd[256];
-        char pname[16];
-
-        sprintf(pname, "PIPE:%08X", FindTask(NULL));
-
-        if (mode[0] == 'w') {
-                sprintf (cmd, "run <>NIL: %s <%s", command, pname);
-                system (cmd);
-                return fopen (pname, mode);
-        } else {
-                FILE *rp;
-                rp = fopen (pname, mode);
-                sprintf (cmd,"run %s >%s",command, pname);
-                system (cmd);
-                return rp;
-        }
-}
-
-
-int pclose (FILE *pipe)
-{
-        return fclose (pipe);
-}
-
-/*
- * Directory stuff
- */
-
-/*
- * if we have SAS/C 6.50+ we use the SAS lib instead, those versions work ok
- */
-
-#ifndef __SASC_650
-DIR *opendir (char *name)
-{
-        DIR *di;
-
-        di = calloc (1, sizeof (DIR));
-        if (di == 0) {
-                return 0;
-        }
-        di->Lock = Lock (name,ACCESS_READ);
-        if (di->Lock == 0) {
-                free (di);
-                return 0;
-        }
-        if (DOSBase->dl_lib.lib_Version >= 37) {
-                di->buffer = (struct ExAllData *)malloc(BUFSIZE);
-                if (di->buffer == 0) {
-                        UnLock(di->Lock);
-                        free(di);
-                        return 0;
-                }
-                di->eac = AllocDosObject(DOS_EXALLCONTROL,NULL);
-                if ((di->eac) == 0) {
-                        free(di->buffer);
-                        UnLock(di->Lock);
-                        free(di);
-                        return 0;
-                }
-                di->eac->eac_LastKey = 0;
-                di->more = 1;
-        } else {
-                if (Examine(di->Lock,&di->fib)==0) {
-                        UnLock(di->Lock);
-                        free (di);
-                        return 0;
-                }
-        }
-        return di;
-}
-
-
-
-struct dirent *readdir (DIR *di)
-{
-        static struct dirent de;
-
-        if (DOSBase->dl_lib.lib_Version >= 37) {
-                while (! di->bufp) {
-                        if (! di->more) {
-                                return 0;
-                        }
-                        di->more = ExAll(di->Lock, di->buffer, BUFSIZE, ED_NAME, di->eac);
-                        if (di->eac->eac_Entries) {
-                                di->bufp = di->buffer;
-                        }
-                }
-                de.d_name = di->bufp->ed_Name;
-                de.d_reclen = strlen (de.d_name);
-                di->bufp = di->bufp->ed_Next;
-        } else {
-                if (ExNext (di->Lock, &di->fib) == 0) {
-                        return 0;
-                }
-                de.d_name = di->fib.fib_FileName;
-                de.d_reclen = strlen (de.d_name);
-        }
-
-        return &de;
-}
-
-
-
-void closedir (DIR *di)
-{
-        if (DOSBase->dl_lib.lib_Version >= 37) {
-                if (di->more)
-                        while (ExAll(di->Lock, di->buffer, BUFSIZE, ED_NAME, di->eac))
-                                /* do nothing */ ;
-		free(di->buffer);
-                FreeDosObject(DOS_EXALLCONTROL,di->eac);
-        }
-
-        UnLock (di->Lock);
-        free (di);
-}
-#endif /* !__SASC_650 */
-
-int getopt (int argc, char **argv, char *options)
-{
-        char c, *z;
-        static int subind = 0;
-
-        for (;optind < argc ; optind++, subind = 0) {
-                if (subind == 0) {
-                        c = argv[optind][0];
-                        if (c != '-') {
-                                return EOF;
-                        }
-                        subind = 1;
-                }
-
-                c = argv[optind][subind];
-                if (c != 0) {
-                        break;
-                }
-        }
-
-        if (optind == argc) {
-                return EOF;
-        }
-
-        /* get rid of funnies */
-        if (c == ':' || c == '?') {
-                return '?';
-        }
-
-        if ((z = strchr (options,c)) == 0) {
-                return '?';
-        }
-
-        if (z[1] == ':') {
-                if (argv[optind][subind+1]) {
-                        optarg = &argv[optind][subind+1];
-                } else {
-                        optarg = argv[++optind];
-                }
-                optind++;
-                subind = 0;
-                return c;
-        }
-        subind++;
-        return c;
-}
-
-/* nobody should use 1.3 anymore (does anybody use Win 1.0?), and system() is ANSI */
-/* int system (const  char *str)
- * (deleted)
- */
-/*
- * The stat call in Aztec C doesn't tell us if the entry is a directory
- * or not. This one does. You will have to change <stat.h> to define
- * ST_DIRECT though
- */
-
-#ifndef __SASC
-int stat (char *name, struct stat *buf)
-{
-        BPTR dirlock;
-        register struct FileInfoBlock *inf;
-
-        if (! (dirlock = Lock (name, ACCESS_READ))) {
-                return -1;
-        }
-        if (! (inf = malloc(sizeof(*inf)))) {
-                UnLock (dirlock);
-                return -1;
-        }
-        Examine (dirlock,inf);
-        UnLock (dirlock);
-        buf->st_attr = ((inf->fib_EntryType>0) ? ST_DIRECT : 0)
-                        | (inf->fib_Protection & 0xf);
-        buf->st_size = inf->fib_Size;
-        buf->st_mtime = ((inf->fib_Date.ds_Days + 2922) * (24 * 60) +
-                        inf->fib_Date.ds_Minute) * 60
-                        + inf->fib_Date.ds_Tick / TICKS_PER_SECOND;
-        free (inf);
-        return 0;
-}
-#endif /* !__SASC */
-
-/*
- * This getenv and setenv will use the WB2.0 calls if you have the new
- * rom. If not, it resorts to looking in the ENV: directory.
- */
-
-/* what new rom? 2.04? Anyway, SAS's getenv() doesn't use local vars */
-
-char *getenv (register const char *name)
-{
-    int blen = 256;
-    static char buffer[256];
-
-    if (GetVar(name, buffer, blen, 0L) == -1)
-        return 0;
-    else
-        return buffer;
-}
-
-int
-setenv (char *name, char *value, int notused)
-{
-        if (DOSBase->dl_lib.lib_Version >= 36) {
-                SetVar ((char *)name,(char *)value,strlen(value)+1,GVF_LOCAL_ONLY);
-        }
-        return 0;
-}
-
-
-char *mktemp (char *template)
-{
-        static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
-        static size_t count = 0;
-        size_t len;
-        char c;
-
-        len = strlen(template);
-        if (len < 6 || strcmp(&template[len-6],"XXXXXX")) {
-                errno = EINVAL;
-                return template;
-        }
-
-        c = letters[count++];
-        count %= sizeof(letters);
-
-        sprintf(&template[len-6], "%c%05x", c,
-                (unsigned int) (getpid() & 0xfffff));
-
-        return template;
-}
-
-
-void make_post_cmd (char *cmd, char *name)
-{
-        char *p;
-
-        if ((p = getenv (ENV_VAR_POSTER)) != (char *) 0) {
-                sprintf (cmd, p, name);
-        } else {
-                sprintf (cmd, DEFAULT_POSTER, name);
-        }
-}
-
-#ifdef NNTP_ABLE
-
-#define NUM_TEMP_FP 4
-static struct {
-        FILE *fp;
-        char name[PATH_LEN];
-} temp_fp[NUM_TEMP_FP];
-
-void log_unlink(FILE *fp, char *fname)
-{
-        int i;
-
-        for (i=0; i<NUM_TEMP_FP; i++) {
-                if (temp_fp[i].fp == (FILE *) 0) {
-                        temp_fp[i].fp = fp;
-                        strcpy (temp_fp[i].name, fname);
-                        break;
-                }
-        }
-}
-
-#undef fclose
-
-int tmp_close(FILE *fp)
-{
-        int i, ret;
-
-        ret = fclose(fp);
-        for (i=0; i<NUM_TEMP_FP; i++) {
-                if (temp_fp[i].fp == fp) {
-                        unlink (temp_fp[i].name);
-                        temp_fp[i].fp = (FILE *) 0;
-                        break;
-                }
-        }
-        return ret;
-}
-
-void __interrupt _STD_550_close_all(void)
-{       int i;
-
-        for(i = 0; i < NUM_TEMP_FP; i++) {
-                if (temp_fp[i].fp) {
-                        fclose(temp_fp[i].fp);
-                        unlink (temp_fp[i].name);
-                        temp_fp[i].fp = (FILE *) 0;
-                }
-        }
-}
-
-#endif
-
-#ifdef MEM_DEBUG
-
-/* These malloc/free routines are useful when debugging with mungwall.
- * Since the library routines use memory pools, memory leaks are more
- * difficult to determine. By calling AllocMem for each memory allocation,
- * mungwall can detect all of the nasty things it says that may be going on.
- */
-
-struct memhead {
-        struct memhead *next;
-        long size;
-        char mem[0];
-};
-
-static struct memhead *alloc_list = (struct memhead *) 0;
-
-void * __interrupt malloc(size_t size)
-{
-        struct memhead *p;
-
-        if (size == 0) return 0;
-        p = (struct memhead *)AllocMem(size + sizeof(struct memhead), 0L);
-        if (! p) return (void *) 0;
-        p->next = alloc_list;
-        p->size = size;
-        alloc_list = p;
-        return (void *)&p->mem;
-}
-
-void __interrupt free(void *p)
-{
-        struct memhead *p1,**q;
-
-        p1 = &((struct memhead *)p)[-1];
-        for (q = &alloc_list; q; q = &(*q)->next) {
-                if (*q == p1) break;
-        }
-        if (q == (struct memhead **) 0) return;
-
-        *q = p1->next;
-        FreeMem(p1,p1->size + sizeof(struct memhead));
-}
-
-void * __interrupt realloc(void *p, size_t size)
-{
-        if (size == 0) {
-                if (p) free(p);
-                return 0;
-        }
-
-        if (p == 0) {
-                return malloc(size);
-        }
-
-        {       int oldsize;
-                void *p1;
-
-                if ((oldsize = ((struct memhead *)p)[-1].size) == size)
-                        return p;
-
-                p1 = malloc(size);
-                memcpy(p1, p, (oldsize < size) ? oldsize : size);
-                free(p);
-                return p1;
-        }
-}
-
-void __interrupt _STD_250_free_all(void)
-{
-        struct memhead *p, *q;
-
-        for (p = alloc_list; p; p = q)
-        {       q = p->next;
-                FreeMem(p, p->size + sizeof(struct memhead));
-        }
-        alloc_list = 0;
-}
-
-#endif
-
-#else
-
-/*
- * The ';' is to satisfy a really picky Ansi compiler
- */
-
-;
-
-#endif  /* M_AMIGA */
diff -Nurp tin-1.6.2/amiga/amiga.h tin-1.8.0/amiga/amiga.h
--- tin-1.6.2/amiga/amiga.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/amiga/amiga.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,91 +0,0 @@
-/*
- *  Project   : tin - a Usenet reader
- *  Module    : amiga.h
- *  Author    : M.Tomlinson & I.Lea
- *  Created   : 17-09-92
- *  Updated   : 03-02-94
- *  Notes     : Directory support for AmigaDOS
- *  Copyright : (c) Copyright 1991-94 by Mark Tomlinson & Iain Lea
- *              You may  freely  copy or  redistribute  this software,
- *              so  long as there is no profit made from its use, sale
- *              trade or  reproduction.  You may not change this copy-
- *              right notice, and it must be included in any copy made
- */
-
-#if defined(M_AMIGA)
-
-#ifndef AMIGA_H
-#define AMIGA_H
-
-#include <proto/dos.h>
-#include <proto/exec.h>
-#include <fcntl.h>
-#ifndef AS225
-#include <proto/usergroup.h>
-#endif
-
-/* SAS-C and Aztec don't take the mode for mkdir() */
-extern int mkdir(char *path);
-#define mkdir(p,m) mkdir(p)
-
-/* For opendir(), and readdir() */
-
-struct dirent {
-        char *d_name;
-        long d_reclen;
-};
-
-typedef struct
-{
-        BPTR    Lock;
-        int     more;
-        struct  ExAllData *buffer;
-        struct  ExAllData *bufp;
-        struct  ExAllControl *eac;
-        struct  FileInfoBlock fib;
-} DIR;
-
-/* We create our own SIGWINCH handling. */
-/* There are two currently unused signals we can define */
-#define SIGWINCH        _SIG_MAX
-
-#define localtime gmtime
-
-extern DIR *opendir (char *name);
-extern struct dirent *readdir (DIR *di);
-extern void closedir (DIR *di);
-
-extern FILE *popen (char *command, char *mode);
-extern int pclose (FILE *pipe);
-extern void *alloca (size_t size);
-
-extern unsigned int sleep(unsigned int secs);
-extern int tputs (char *cp, int count, void (*outc)(int));
-extern int getpid(void);
-extern int setenv(char *, char *, int);
-extern char *mktemp(char *);
-extern unsigned short umask(unsigned short);
-
-extern int optind;
-extern char *optarg;
-extern int getopt (int argc, char *argv[], char *options);
-
-extern void make_post_cmd (char *cmd, char *name);
-extern void make_post_process_cmd(char *cmd, char *dir, char *file);
-
-extern void AmiGetWinSize(int *lines, int *columns);
-
-/*
- * tmp_close will delete a file on closure if it had been opened
- * with nntp_to_fp(). Otherwise it behaves just like fclose().
- */
-
-#ifdef NNTP_ABLE
-extern void log_unlink(FILE *fp, char *fname);
-extern int tmp_close(FILE *fp);
-#define fclose(fp) tmp_close(fp)
-#endif
-
-#endif  /* AMIGA_H */
-
-#endif  /* M_AMIGA */
diff -Nurp tin-1.6.2/amiga/amigatcp.c tin-1.8.0/amiga/amigatcp.c
--- tin-1.6.2/amiga/amigatcp.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/amiga/amigatcp.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,273 +0,0 @@
-/*
- *  Project   : tin - a Usenet reader
- *  Module    : amigatcp.c
- *  Author    : M.Tomlinson
- *  Created   : 15-05-94
- *  Updated   : 15-05-94
- *  Notes     : TCP support for AmigaDOS
- *  Copyright : (c) Copyright 1994 by Mark Tomlinson
- *              You may  freely  copy or  redistribute  this software,
- *              so  long as there is no profit made from its use, sale
- *              trade or  reproduction.  You may not change this copy-
- *              right notice, and it must be included in any copy made
- */
-
-#include "tin.h"
-
-#if defined (M_AMIGA) && defined (NNTP_ABLE)
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "amigatcp.h"
-
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-
-#include <proto/exec.h>
-
-/* #include <clib/netlib_protos.h> */
-
-#ifndef EOF
-#define EOF (-1)
-#endif
-
-#undef  s_close
-#undef  socket
-
-#ifdef AS225
-#       define SocketBase       SockBase
-#       define SOCKLIB          "inet:libs/socket.library"
-#       define MAXSOCK          5
-#       define CloseSocket      s_close
-#       define IoctlSocket      s_ioctl
-#else
-#       define SOCKLIB          "bsdsocket.library"
-#       define cleanup_sockets()
-#endif
-
-struct Library *SocketBase= 0;
-#ifndef AS225
-struct Library *UserGroupBase = NULL;
-#endif
-
-static int sock_dups[32];
-
-#ifndef AS225
-#ifndef select
-select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exeptfds,
-         struct timeval *timeout)
-{
-  /* call WaitSelect with NULL signal mask pointer */
-  return WaitSelect(nfds, readfds, writefds, exeptfds, timeout, NULL);
-}
-#endif
-#ifndef inet_ntoa
-char *inet_ntoa(struct in_addr addr)
-{
-  return Inet_NtoA(addr.s_addr);
-}
-#endif
-#endif
-
-int s_init(void)
-{
-        if (! SocketBase) {
-                SocketBase = OpenLibrary(SOCKLIB,0L);
-                if (! SocketBase) return 0;
-
-#ifdef AS225
-                setup_sockets(MAXSOCK,&errno);
-#else
-                SetErrnoPtr(&errno, sizeof(errno));
-                if (!(UserGroupBase = OpenLibrary(USERGROUPNAME, 0L)))
-                    return 0;
-#endif
-                atexit(s_end);
-        }
-        return 1;
-}
-
-void __interrupt s_end(void)
-{
-        if (SocketBase) {
-                cleanup_sockets();
-                CloseLibrary(SocketBase);
-#ifndef AS225
-                CloseLibrary(UserGroupBase);
-#endif
-                SocketBase = 0;
-        }
-}
-
-TCP *s_fdopen(int s, const char *mode)
-{
-        TCP *tp;
-
-        tp = malloc(sizeof(TCP));
-        if (! tp) return (TCP *)0;
-
-        tp->size = 2048;
-        tp->base = malloc(tp->size);
-        if (! tp->base) {
-                free(tp);
-                return (TCP *)0;
-        }
-
-        tp->_file = s;
-        tp->cnt = 0;
-        tp->buf = tp->base;
-        tp->flags = (mode[0] == 'w') ? TIO_WRITE : TIO_READ;
-
-        return tp;
-}
-
-void s_fclose(TCP *tp)
-{
-        if (tp->cnt)
-                s_flush(tp);
-        free(tp->base);
-        xs_close(tp->_file);
-        free(tp);
-}
-
-void xs_close(int fd)
-{       if (--sock_dups[fd] <= 0)
-                CloseSocket(fd);
-}
-
-int s_socket(long domain, long type, long protocol)
-{
-        int s;
-        s = socket(domain, type, protocol);
-
-        if (s >= 0) {
-                sock_dups[s] = 1;
-        }
-        return s;
-}
-
-int s_dup(int fd)
-{
-        sock_dups[fd]++;
-        return fd;
-}
-
-int s_flush(TCP *tp)
-{
-        int ret;
-
-        if (tp->cnt && tp->flags & TIO_WRITE) {
-                ret = send(tp->_file, tp->base, tp->cnt, 0);
-                tp->cnt = 0;
-                tp->buf = tp->base;
-                return ret;
-        }
-        return 0;
-}
-
-int s_printf(TCP *tp, const char *format, ...)
-{
-        va_list ap;
-        int ret;
-
-        va_start(ap, format);
-
-        if (tp->size - tp->cnt < 1024) {
-                ret = s_flush(tp);
-                if (ret < 0) return ret;
-        }
-
-        ret = vsprintf(tp->buf, format, ap);
-
-        if (ret > 0) {
-                tp->buf += ret;
-                tp->cnt += ret;
-        }
-
-        va_end(ap);
-        return ret;
-}
-
-int s_puts(const char *str, TCP *tp)
-{
-        int ret, length;
-
-        length = strlen(str);
-
-        if (tp->cnt && tp->size - tp->cnt < length) {
-                ret = s_flush(tp);
-                if (ret < 0) return ret;
-        }
-
-        while (tp->size - tp->cnt < length) {
-                ret = send(tp->_file, (char *)str, length, 0);
-                if (ret < 0) return ret;
-                length -= ret;
-                if (length == 0) return 0;
-                str += ret;
-        }
-
-        memcpy(tp->buf, str, length);
-        tp->buf += length;
-        tp->cnt += length;
-
-        return 0;
-}
-
-char *s_gets(char *str, int size, TCP *tp)
-{
-        int c;
-        char *cp;
-        long length;
-
-        cp = str;
-        if (size == 0) return (char *)0;
-
-        forever {
-                while(tp->cnt && size > 1) {
-                        --tp->cnt;
-                        --size;
-                        c = *cp++ = *tp->buf++;
-                        if (c == '\n') {
-                                *cp = 0;
-                                return str;
-                        }
-                }
-
-                if (size <= 1) {
-                        *cp = 0;
-                        return str;
-                }
-
-                tp->buf = tp->base;
-                do {
-                        IoctlSocket(tp->_file, FIONREAD, (char *)&length);
-                        if (length == 0) {
-                                fd_set rfd, efd;
-                                struct timeval timeout;
-
-                                timeout.tv_secs = 60;
-                                timeout.tv_micro = 0;
-
-                                FD_ZERO(&rfd);
-                                FD_SET(tp->_file, &rfd);
-                                efd = rfd;
-                                select(tp->_file+1, &rfd, NULL, &efd, &timeout);
-                                if (! FD_ISSET(tp->_file, &rfd)) {
-                                        *cp = 0;
-                                        return 0;
-                                }
-                        }
-                } while(length == 0);
-
-                if (length > tp->size) length = tp->size;
-                length = recv(tp->_file, tp->buf, length, 0L);
-                tp->cnt = length;
-        }
-}
-
-#endif  /* M_AMIGA */
diff -Nurp tin-1.6.2/amiga/amigatcp.h tin-1.8.0/amiga/amigatcp.h
--- tin-1.6.2/amiga/amigatcp.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/amiga/amigatcp.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,81 +0,0 @@
-/*
- *  Project   : tin - a Usenet reader
- *  Module    : amigatcp.h
- *  Author    : M.Tomlinson
- *  Created   : 15-05-94
- *  Updated   : 05-06-94
- *  Notes     : TCP support for AmigaDOS
- *  Copyright : (c) Copyright 1994 by Mark Tomlinson
- *              You may  freely  copy or  redistribute  this software,
- *              so  long as there is no profit made from its use, sale
- *              trade or  reproduction.  You may not change this copy-
- *              right notice, and it must be included in any copy made
- */
-
-#if defined(M_AMIGA)
-
-#ifndef AMIGATCP_H
-#define AMIGATCP_H
-
-#ifdef NNTP_ABLE
-#ifdef AS225
-#include <ss/socket.h>
-#else
-/* Stop bsdsocket including an incompatible unistd.h! */
-#define UNISTD_H
-/* And also get rid of prototypes for the netlib we're not using */
-#define CLIB_NETLIB_PROTOS_H
-#include <proto/usergroup.h>
-#include <bsdsocket.h>
-/* But we still need prototypes for select() and inet_ntoa() */
-/* if we're not using optimisation... */
-#ifndef inet_ntoa
-char * inet_ntoa(struct in_addr addr);
-#endif
-#ifndef select
-int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exeptfds,
-           struct timeval *timeout);
-#endif
-#endif
-
-struct __tcpbuf
-{
-        int             _file;  /*vb*/          /* socket number */
-	char 	*buf;	/* current buffer pointer */
-	char	*base;	/* beginning of buffer */
-	int		size;	/* size of buffer */
-	int		cnt;	/* number of bytes in buf */
-	int		flags;	/* read/write */
-};
-
-#define TIO_WRITE	1
-#define	TIO_READ	2
-
-extern int	s_printf(TCP *, const char *, ...);
-extern TCP	*s_fdopen(int, const char *);
-extern int	s_flush(TCP *);
-extern void	s_fclose(TCP *);
-extern char	*s_gets(char *, int, TCP *);
-extern int	s_puts(const char *, TCP *);
-extern int	s_init(void);
-extern void	s_end(void);
-extern int	s_dup(int);
-extern int	s_socket(long, long, long);
-extern void	xs_close(int);
-
-#define s_close	xs_close
-#define socket	s_socket
-
-/* AS225 screws up a bit on types for inet_ntoa... */
-#ifdef AS225
-static char * __inline xinet_ntoa(long x)
-{	return inet_ntoa(x);
-}
-#define inet_ntoa(x)	xinet_ntoa((x).s_addr)
-#endif
-
-#endif	/* NNTP_ABLE */
-
-#endif	/* AMIGATCP_H */
-
-#endif	/* M_AMIGA */
diff -Nurp tin-1.6.2/amiga/smakefile tin-1.8.0/amiga/smakefile
--- tin-1.6.2/amiga/smakefile	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/amiga/smakefile	1970-01-01 01:00:00.000000000 +0100
@@ -1,295 +0,0 @@
-#
-# $VER: tin_makefile 2.3 (13.06.99)
-#
-# This is especially for use with the SAS/C developing system
-# version 6.55 and above
-#
-# (w) 1994 by Reinhard Luebke (rel)
-# expanded by Volker Barthelmann (vb) and Oliver Warzecha (obw)
-#
-
-AMIDIR   = /amiga
-SRCDIR   = /src
-INCDIR   = /include
-OBJDIR   = /obj
-REDIR    = /pcre
-
-# Timezone stuff for faster spool access (obw)
-TZSET    = $(OBJDIR)/_tzset.o
-TZSOURCE = sc:source/_tzset.c
-
-# Include the next two lines to enable an NNTP version of TIN.
-# To use AS225 rather than AmiTCP, also include "def AS225".
-
-# /*vb*/
-NNTPDEF  = def NNTP_ABLE def DOMAIN_NAME="UULIB:news/whoami" \
- def UNISTD_H def CLIB_NETLIB_PROTOS_H
-
-PROJECT  = $(AMIDIR)/tin.exe
-ACTIVED  = $(AMIDIR)/actived
-GSTFILE  = $(AMIDIR)/tin.gst
-
-#
-# compile & link flags
-#
-
-# set parameters here, e.g. CPU and additional includes for your TCP/IP stack
-/*vb*/
-#SCOPTIONS = strmer data=near parms=register nover errrexx ignore=85,93,104,105 \
-#                    idir=netinclude: idir=$(INCDIR) gst=$(GSTFILE) cpu=$(CPU)
-SCOPTIONS = strmer nover ignore=85,93,104,105 \
- idir=netinclude: idir=$(INCDIR) idir=$(REDIR) gst=$(GSTFILE) data=far
-
-# comment the next two lines, for the final release
-
-# DEBUG     = debug=line stkchk def MEM_DEBUG def DEBUG
-# LDEBUG    = debug=sym
-
-# optimization should always be disabled while debugging
-# uncomment the following only for the final version
-
-# OPTIMIZE  = opt optpeep optglobal optinlocal optinline optloop opttime
-
-# special defines for generating the gst file
-
-GSTDEFS    = def __USE_SYSBASE
-
-# read the docs (/INSTALL & /doc/HACKERS) for compiler defines
-
-DEFINES   = def M_AMIGA def NO_SHELL_ESCAPE def NO_LOCALE \
- def LIBDIR="uulib:" def DONT_LOG_USER def SPOOLDIR="uunews:" \
- def HAVE_COLOR def HAVE_REF_THREADING \
- def DONT_REREAD_ACTIVE_FILE $(GSTDEFS) $(NNTPDEF) $(TINDDEF)
-
-# build the final compile and link flags
-
-CFLAGS    = $(SCOPTIONS) $(OPTIMIZE) $(DEFINES) $(DEBUG)
-LDFLAGS   = link $(SCOPTIONS) $(LDEBUG)
-
-#
-# there is no internal rule in smake for yacc files
-# so, here it comes
-#
-YACC = bison --yacc
-
-# /*vb*/ eeek! ugly!
-
-.y.c:
-        $(YACC) ..$<
-        @rename y.tab.c $@
-
-#
-# rule for all C sources
-#
-# We need to redefine the internal rule because we are using
-# smakes local input file facility. In fact, we must use it
-# because the v6.51 SC command was linked with the wrong startup
-# which caused the number of commandline arguments to be limited
-# to 30 entries.
-#
-.c.o:
-        $(CC) $(CFLAGS) $*.c objname=$@
-
-#
-# list of header files
-#
-# /*vb*/
-HEADERS = \
-        $(AMIDIR)/amiga.h \
-        $(AMIDIR)/amigatcp.h \
-        $(INCDIR)/config.h \
-        $(INCDIR)/extern.h \
-        $(INCDIR)/menukeys.h \
-        $(INCDIR)/nntplib.h \
-        $(REDIR)/pcre.h \
-        $(INCDIR)/proto.h \
-        $(INCDIR)/stpwatch.h \
-        $(INCDIR)/tin.h \
-        $(INCDIR)/version.h \
-#/*vb*/  $(INCDIR)/conf.h \
-
-#
-# list object files
-#
-# /*vb*/
-OBJECTS = \
-        $(OBJDIR)/active.o \
-        $(OBJDIR)/amiga.o \
-        $(OBJDIR)/amigatcp.o \
-        $(OBJDIR)/art.o \
-        $(OBJDIR)/attrib.o \
-        $(OBJDIR)/auth.o \
-        $(OBJDIR)/charset.o \
-        $(OBJDIR)/chartables.o \
-        $(OBJDIR)/color.o \
-        $(OBJDIR)/config.o \
-        $(OBJDIR)/curses.o \
-        $(OBJDIR)/debug.o\
-        $(OBJDIR)/envarg.o \
-        $(OBJDIR)/feed.o \
-        $(OBJDIR)/filter.o \
-        $(OBJDIR)/getline.o \
-        $(OBJDIR)/group.o \
-        $(OBJDIR)/hashstr.o \
-        $(OBJDIR)/header.o \
-        $(OBJDIR)/help.o\
-        $(OBJDIR)/inews.o \
-        $(OBJDIR)/init.o \
-        $(OBJDIR)/joinpath.o \
-        $(OBJDIR)/lang.o \
-        $(OBJDIR)/list.o \
-        $(OBJDIR)/mail.o \
-        $(OBJDIR)/main.o \
-        $(OBJDIR)/memory.o \
-        $(OBJDIR)/misc.o \
-        $(OBJDIR)/newsrc.o\
-        $(OBJDIR)/nntplib.o \
-        $(OBJDIR)/nrctbl.o \
-        $(OBJDIR)/open.o \
-        $(OBJDIR)/page.o \
-        $(OBJDIR)/parsdate.o \
-        $(OBJDIR)/pcre.o \
-        $(OBJDIR)/pgp.o \
-        $(OBJDIR)/post.o \
-        $(OBJDIR)/prompt.o\
-        $(OBJDIR)/read.o \
-        $(OBJDIR)/refs.o \
-        $(OBJDIR)/regex.o \
-        $(OBJDIR)/rfc1521.o \
-        $(OBJDIR)/rfc1522.o \
-        $(OBJDIR)/save.o \
-        $(OBJDIR)/screen.o \
-        $(OBJDIR)/search.o \
-        $(OBJDIR)/select.o \
-        $(OBJDIR)/sigfile.o \
-        $(OBJDIR)/signal.o \
-        $(OBJDIR)/strftime.o \
-        $(OBJDIR)/string.o \
-        $(OBJDIR)/study.o \
-        $(OBJDIR)/thread.o \
-        $(OBJDIR)/wildmat.o \
-        $(OBJDIR)/xref.o \
-# (obw)  $(OBJDIR)/_tzset.o \
-#        $(OBJDIR)/parsdate.c \
-
-
-#
-# actions to be performed when something went wrong during build
-#
-.ONERROR:
-#        -@delete #?.lnk $(PROJECT) ram:temp_smk.tmp
-        -@gst $(GSTFILE) unload
-
-#
-# targets
-#
-
-all: $(PROJECT) $(ACTIVED) $(GSTFILE)
-
-$(PROJECT):     $(OBJDIR) $(OBJECTS) $(TZSET)
-        $(CC) $(LDFLAGS) pname=$@ <with <(ram:tmp)
-        $(OBJECTS) $(TZSET)
-        <
-
-$(TZSET): $(TZSOURCE) $(OBJDIR)
-        $(CC) $(SCOPTIONS) $(DEBUG) $(OPTIMIZE) def LESS_GETENV PARMS=BOTH $(TZSOURCE) objname=$@
-
-$(ACTIVED): $(OBJDIR)/activeda.o $(GSTFILE)
-        $(CC) $(LDFLAGS) pname=$@ $(OBJDIR)/activeda.o
-
-$(GSTFILE): $(HEADERS)
-        -gst $(GSTFILE) unload
-        $(CC) $(CFLAGS) noobjname makegst=$@ $(AMIDIR)/amiga.c
-
-$(OBJDIR):
-        -@makedir $(OBJDIR)
-
-$(REDIR)/chartables.c: dftables
-        dftables >$(REDIR)/chartables.c
-
-dftables: $(OBJDIR)/maketables.o $(OBJDIR)/dftables.o $(GSTFILE)
-        $(CC) $(LDFLAGS) pname=$@ $(OBJDIR)/dftables.o
-
-#/*vb*/
-makecfg: $(OBJDIR)/makecfg.o $(OBJDIR)/amiga.o $(GSTFILE)
-        $(CC) $(LDFLAGS) pname=$@ $(OBJDIR)/makecfg.o $(OBJDIR)/amiga.o
-/*vb*/
-$(INCDIR)/tincfg.h: $(SRCDIR)/tincfg.tbl makecfg
-        makecfg $(SRCDIR)/tincfg.tbl $(INCDIR)/tincfg.h
-
-clean:
-        -gst $(GSTFILE) unload
-        -delete $(OBJDIR)/\#?.o \#?.lnk
-        -delete $(GSTFILE)(%|.info) $(ACTIVED)(%|.info) $(PROJECT)(%|.info)
-	-delete $(INCDIR)/tincfg.h
-        -delete $(SRCDIR)/parsdate.c
-
-dist-clean: clean
-	-delete $(REDIR)/chartables.c
-
-#
-# dependencies
-#
-
-$(OBJDIR)/activeda.o:           $(AMIDIR)/actived.c $(GSTFILE)
-$(OBJDIR)/active.o:             $(SRCDIR)/active.c $(GSTFILE)
-$(OBJDIR)/amiga.o:              $(AMIDIR)/amiga.c $(GSTFILE)
-$(OBJDIR)/amigatcp.o:           $(AMIDIR)/amigatcp.c $(GSTFILE)
-$(OBJDIR)/art.o:                $(SRCDIR)/art.c $(GSTFILE)
-$(OBJDIR)/attrib.o:             $(SRCDIR)/attrib.c $(GSTFILE)
-$(OBJDIR)/auth.o:               $(SRCDIR)/auth.c $(GSTFILE)
-$(OBJDIR)/charset.o:            $(SRCDIR)/charset.c $(GSTFILE)
-$(OBJDIR)/chartables.o:         $(REDIR)/chartables.c $(GSTFILE)
-$(OBJDIR)/color.o:              $(SRCDIR)/color.c $(GSTFILE)
-$(OBJDIR)/config.o:             $(SRCDIR)/config.c $(GSTFILE) $(INCDIR)/tincfg.h
-$(OBJDIR)/curses.o:             $(SRCDIR)/curses.c $(GSTFILE)
-$(OBJDIR)/dftables.o:           $(REDIR)/dftables.c $(GSTFILE)
-$(OBJDIR)/debug.o:              $(SRCDIR)/debug.c $(GSTFILE)
-$(OBJDIR)/envarg.o:             $(SRCDIR)/envarg.c $(GSTFILE)
-$(OBJDIR)/feed.o:               $(SRCDIR)/feed.c $(GSTFILE)
-$(OBJDIR)/filter.o:             $(SRCDIR)/filter.c $(GSTFILE)
-$(OBJDIR)/getline.o:            $(SRCDIR)/getline.c $(GSTFILE)
-$(OBJDIR)/group.o:              $(SRCDIR)/group.c $(GSTFILE)
-$(OBJDIR)/hashstr.o:            $(SRCDIR)/hashstr.c $(GSTFILE)
-$(OBJDIR)/header.o:             $(SRCDIR)/header.c $(GSTFILE)
-$(OBJDIR)/help.o:               $(SRCDIR)/help.c $(GSTFILE)
-$(OBJDIR)/inews.o:              $(SRCDIR)/inews.c $(GSTFILE)
-$(OBJDIR)/init.o:               $(SRCDIR)/init.c $(GSTFILE)
-$(OBJDIR)/joinpath.o:           $(SRCDIR)/joinpath.c $(GSTFILE)
-$(OBJDIR)/lang.o:               $(SRCDIR)/lang.c $(GSTFILE)
-$(OBJDIR)/list.o:               $(SRCDIR)/list.c $(GSTFILE)
-$(OBJDIR)/mail.o:               $(SRCDIR)/mail.c $(GSTFILE)
-$(OBJDIR)/main.o:               $(SRCDIR)/main.c $(GSTFILE)
-$(OBJDIR)/makecfg.o:            $(SRCDIR)/makecfg.c $(GSTFILE)
-$(OBJDIR)/maketables.o:         $(REDIR)/maketables.c $(GSTFILE)
-$(OBJDIR)/memory.o:             $(SRCDIR)/memory.c $(GSTFILE)
-$(OBJDIR)/misc.o:               $(SRCDIR)/misc.c $(GSTFILE)
-$(OBJDIR)/newsrc.o:             $(SRCDIR)/newsrc.c $(GSTFILE)
-$(OBJDIR)/nntplib.o:            $(SRCDIR)/nntplib.c $(GSTFILE)
-$(OBJDIR)/nrctbl.o:             $(SRCDIR)/nrctbl.c $(GSTFILE)
-$(OBJDIR)/open.o:               $(SRCDIR)/open.c $(GSTFILE)
-$(OBJDIR)/page.o:               $(SRCDIR)/page.c $(GSTFILE)
-#$(OBJDIR)/parsdate.o:           $(AMIDIR)/parsdate.c $(GSTFILE)
-$(OBJDIR)/parsdate.o:           $(SRCDIR)/parsdate.c $(GSTFILE)
-$(SRCDIR)/parsdate.c:           $(SRCDIR)/parsdate.y $(GSTFILE)
-$(OBJDIR)/pcre.o:               $(REDIR)/pcre.c $(GSTFILE)
-$(OBJDIR)/pgp.o:                $(SRCDIR)/pgp.c $(GSTFILE)
-$(OBJDIR)/post.o:               $(SRCDIR)/post.c $(GSTFILE)
-$(OBJDIR)/prompt.o:             $(SRCDIR)/prompt.c $(GSTFILE)
-$(OBJDIR)/read.o:               $(SRCDIR)/read.c $(GSTFILE)
-$(OBJDIR)/refs.o:               $(SRCDIR)/refs.c $(GSTFILE)
-$(OBJDIR)/regex.o:              $(SRCDIR)/regex.c $(GSTFILE)
-$(OBJDIR)/rfc1521.o:            $(SRCDIR)/rfc1521.c $(GSTFILE)
-$(OBJDIR)/rfc1522.o:            $(SRCDIR)/rfc1522.c $(GSTFILE)
-$(OBJDIR)/save.o:               $(SRCDIR)/save.c $(GSTFILE)
-$(OBJDIR)/screen.o:             $(SRCDIR)/screen.c $(GSTFILE)
-$(OBJDIR)/search.o:             $(SRCDIR)/search.c $(GSTFILE)
-$(OBJDIR)/select.o:             $(SRCDIR)/select.c $(GSTFILE)
-$(OBJDIR)/sigfile.o:            $(SRCDIR)/sigfile.c $(GSTFILE)
-$(OBJDIR)/signal.o:             $(SRCDIR)/signal.c $(GSTFILE)
-$(OBJDIR)/strftime.o:           $(SRCDIR)/strftime.c $(GSTFILE)
-$(OBJDIR)/string.o:             $(SRCDIR)/string.c $(GSTFILE)
-$(OBJDIR)/study.o:              $(REDIR)/study.c $(GSTFILE)
-$(OBJDIR)/thread.o:             $(SRCDIR)/thread.c $(GSTFILE)
-$(OBJDIR)/wildmat.o:            $(SRCDIR)/wildmat.c $(GSTFILE)
-$(OBJDIR)/xref.o:               $(SRCDIR)/xref.c $(GSTFILE)
diff -Nurp tin-1.6.2/amiga/tin.readme tin-1.8.0/amiga/tin.readme
--- tin-1.6.2/amiga/tin.readme	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/amiga/tin.readme	1970-01-01 01:00:00.000000000 +0100
@@ -1,150 +0,0 @@
-This is the Amiga directory of tin.
-
-It contains:
-README          original readme for Amiga-tin 1.2 by
-                Mark Tomlinson and Geoff McCaughan
-amiga.c    \
-amigatcp.c  \__ Amiga-specific source needed for a
-amiga.h     /   compile with SAS/C
-amigatcp.h /
-actived.c       Amiga-specific actived-source.
-
-0. Additional Info
-
-tin needs 2.04 Minimum now. (V37)
-
-_Always_ check the other docs, especially if you are using gcc, also
-check the docs in the main directory. It may be, that this file is not
-really up-to-date. Query the document version string for the last
-change:
-
-$VER: tin.readme 0.4 (14.06.99)
-
-1. Building tin.
-
-tin is tested to build on the following compilers:
-SAS/C 6.57
-egcs-2.90.27 980315 (egcs-1.0.2 release) (ADE/Geek Gadgets)
-
-If you have SAS/C <6.55 then you have to put some work in it, but then
-you may consider to use the gcc instead if you can't update because your
-one is too old. 6.58 is going to be tested in the next time but should
-pose no problems. If you are using 6.50 or 6.51: UPDATE! There are lots
-of nasty bugs fixed in the later versions, and you also get the source
-for the tzset()-function. ;) And don't forget to thank the guys at SAS
-for putting their valuable free time in the enhancement of this great
-compiler.
-
-If you use an older gcc: UPDATE! The old 2.7.0 from Aminet is buggy and
-also out of date. Fetch your update at ftp.ninemoons.com or one of its
-mirrors. Do not be embarrassed by the size of the files to download, it's
-more than just a compiler you get. /* TODO: which archives are needed to
-build tin? */
-
-a) SAS/C
-You need an additional package, sorry, but I have to make an
-archaeological excursion for the source I need to replace these
-functions. The date-parser needs an installed yacc/bison to compile. If
-you are using yacc, edit the smakefile accordingly (search for "YACC").
-I am using the bison from ADE and it works fine, although the parser
-skeleton contains an alloca(). (Yikes!)
-
-If you are building a NNTP-version, the correct SDK's must be installed.
-Read the readme's closely to see how they are installed. AmiTCP SDK is
-available from Aminet, the AS/Inet 225 SDK is available from the
-Developer CD 1.1.
-
-First edit the smakefile to suit your needs. Especially take care of
-DEBUG, LDEBUG, SCOPTIONS, OPTIMIZE and DEFINES. You might want piping
-disabled if you want to run tin on a BBS.
-
-Then run smake. Ignore any warnings (if you don't, send suggestions how
-to clean up the code) and see tin getting built. If you get an error,
-sometimes calling smake a second time will be enough to clear the smoke.
-(Don't wonder, remember: This is BETAware and the source is under
-constant change.)
-
-You should now have the following files:
-tin.exe
-actived
-
-For more see under 2.
-
-b) ADE-gcc
-You may have guessed it if you compiled some packages before:
-This is going to be a piece of cake. :)
-
-Start the pdksh first. Then have a look at the available options with
-
-    Configure --help
-
-Don't forget --with-libdir and --with-spooldir if you are reading
-locally. Select those you want additionally and start off with
-
-    Configure <insert your options here>
-
-Have a nice cup of hot Earl Grey (On my 040/40 the script takes quite
-some 10 minutes) or two (--with-coffee is also recommended). Then check
-the Makefile if you want to be sure everything went ok.
-
-Start "make". It should work with no problems.
-
-
-2. Installing
-
-If you have utilities running that capture the TAB-key, (KingCON, CFN
-etc.) don't forget that tin uses the key for "next unread" and you might
-be getting confused if you get a whole stream of characters inserted
-instead.
-
-a) SAS/C
-Drop tin.exe anywhere in your path. If you use wCNews, you *DON'T* need
-the actived, because it already has an "active" file. I didn't test what
-happens to the wCNews "active" if you use the actived, but on the other
-hand I am not too keen on making a samba dance with my running hard disk
-in hand either.
-
-You might need a wrapper script like the one described in the README.
-
-b) ADE-egcs
-Put tin where appropriate. Don't forget to set the NNTPSERVER variable
-if you didn't set a default server at compile-time, this might cause
-problems (see doc/TODO)
-
-Caveats:
-
-a) The Amiga port of metamail 2.3a as it lies on Aminet has a really
-broken I/O handling. With some combinations of parameters and
-non-existing stdio (run <>NIL:) it doesn't open a CON: window like it is
-supposed to do, but just spawns new processes over and over again. In
-the other combinations it just does nothing, so the piping of MIME
-articles doesn't work. I tried some workarounds, but no avail. The
-problem is clearly not within tin, it is the problem of metamail.
-Volunteers searched for porting a new version.
-
-b) When compiling with egcs, the window resize does not work properly.
-This is also a problem with some of the standard GG programs (ncftp, but
-interestingly *not* jove). Also reading from local spool is very slow at
-startup, because every directory is opendir()ed and read completely.
-Perhaps one of the various startup switches can speed this up. Read the
-man page for more info.
-
-3. Credits
-
-Thanks go to all those people who put their time into the Amiga port of
-this great program before. Among them:
-
-Mark Tomlinson
-Geoff McCaughan
-Reinhard Luebke
-Volker Barthelmann
-
-Also a big "Thank You" to Iain Lea for the original program.
-
-The scoring routines are dedicated to Tobias "Top" Walter, who
-celebrated birthday on the day I constructed the diff.
-
-I hope no name is missing here.
-
-Oliver B. Warzecha
-
diff -Nurp tin-1.6.2/config.guess tin-1.8.0/config.guess
--- tin-1.6.2/config.guess	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/config.guess	2005-12-23 19:13:43.799955571 +0100
@@ -1,9 +1,9 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
-timestamp='2003-06-17'
+timestamp='2005-12-23'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -17,13 +17,15 @@ timestamp='2003-06-17'
 #
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
 # the same distribution terms that you use for the rest of that program.
 
+
 # Originally written by Per Bothner <per@bothner.com>.
 # Please send patches to <config-patches@gnu.org>.  Submit a context
 # diff and a properly formatted ChangeLog entry.
@@ -53,7 +55,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
@@ -66,11 +68,11 @@ Try \`$me --help' for more information."
 while test $# -gt 0 ; do
   case $1 in
     --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit 0 ;;
+       echo "$timestamp" ; exit ;;
     --version | -v )
-       echo "$version" ; exit 0 ;;
+       echo "$version" ; exit ;;
     --help | --h* | -h )
-       echo "$usage"; exit 0 ;;
+       echo "$usage"; exit ;;
     -- )     # Stop option processing
        shift; break ;;
     - )	# Use stdin as input.
@@ -123,7 +125,7 @@ case $CC_FOR_BUILD,$HOST_CC,$CC in
 	;;
  ,,*)   CC_FOR_BUILD=$CC ;;
  ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ;'
+esac ; set_cc_for_build= ;'
 
 # This is needed to find uname on a Pyramid OSx when run in the BSD universe.
 # (ghazi@noc.rutgers.edu 1994-08-24)
@@ -196,50 +198,29 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
 	echo "${machine}-${os}${release}"
-	exit 0 ;;
-    amiga:OpenBSD:*:*)
-	echo m68k-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    arc:OpenBSD:*:*)
-	echo mipsel-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    hp300:OpenBSD:*:*)
-	echo m68k-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    mac68k:OpenBSD:*:*)
-	echo m68k-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    macppc:OpenBSD:*:*)
-	echo powerpc-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    mvme68k:OpenBSD:*:*)
-	echo m68k-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    mvme88k:OpenBSD:*:*)
-	echo m88k-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    mvmeppc:OpenBSD:*:*)
-	echo powerpc-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    pmax:OpenBSD:*:*)
-	echo mipsel-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    sgi:OpenBSD:*:*)
-	echo mipseb-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    sun3:OpenBSD:*:*)
-	echo m68k-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    wgrisc:OpenBSD:*:*)
-	echo mipsel-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:OpenBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
     alpha:OSF1:*:*)
-	if test $UNAME_RELEASE = "V4.0"; then
+	case $UNAME_RELEASE in
+	    *4.0)
 		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-	fi
+		;;
+	    *5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
 	# According to Compaq, /usr/sbin/psrinfo has been available on
 	# OSF/1 and Tru64 systems produced since 1995.  I hope that
 	# covers most systems running today.  This code pipes the CPU
@@ -277,42 +258,49 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
 	    "EV7.9 (21364A)")
 		UNAME_MACHINE="alphaev79" ;;
 	esac
+	# A Pn.n version is a patched version.
 	# A Vn.n version is a released version.
 	# A Tn.n version is a released field test version.
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	exit 0 ;;
-    Alpha*:OpenVMS:*:*)
-	echo alpha-hp-vms
-	exit 0 ;;
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
     Alpha\ *:Windows_NT*:*)
 	# How do we know it's Interix rather than the generic POSIX subsystem?
 	# Should we change UNAME_MACHINE based on the output of uname instead
 	# of the specific Alpha model?
 	echo alpha-pc-interix
-	exit 0 ;;
+	exit ;;
     21064:Windows_NT:50:3)
 	echo alpha-dec-winnt3.5
-	exit 0 ;;
+	exit ;;
     Amiga*:UNIX_System_V:4.0:*)
 	echo m68k-unknown-sysv4
-	exit 0;;
+	exit ;;
     *:[Aa]miga[Oo][Ss]:*:*)
 	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit 0 ;;
+	exit ;;
     *:[Mm]orph[Oo][Ss]:*:*)
 	echo ${UNAME_MACHINE}-unknown-morphos
-	exit 0 ;;
+	exit ;;
     *:OS/390:*:*)
 	echo i370-ibm-openedition
-	exit 0 ;;
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
 	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit 0;;
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
 	echo hppa1.1-hitachi-hiuxmpp
-	exit 0;;
+	exit ;;
     Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
 	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
 	if test "`(/bin/universe) 2>/dev/null`" = att ; then
@@ -320,32 +308,32 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
 	else
 		echo pyramid-pyramid-bsd
 	fi
-	exit 0 ;;
+	exit ;;
     NILE*:*:*:dcosx)
 	echo pyramid-pyramid-svr4
-	exit 0 ;;
+	exit ;;
     DRS?6000:unix:4.0:6*)
 	echo sparc-icl-nx6
-	exit 0 ;;
-    DRS?6000:UNIX_SV:4.2*:7*)
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
 	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7 && exit 0 ;;
+	    sparc) echo sparc-icl-nx7; exit ;;
 	esac ;;
     sun4H:SunOS:5.*:*)
 	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit 0 ;;
+	exit ;;
     sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
 	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit 0 ;;
+	exit ;;
     i86pc:SunOS:5.*:*)
 	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit 0 ;;
+	exit ;;
     sun4*:SunOS:6*:*)
 	# According to config.sub, this is the proper way to canonicalize
 	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
 	# it's likely to be more like Solaris than SunOS4.
 	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit 0 ;;
+	exit ;;
     sun4*:SunOS:*:*)
 	case "`/usr/bin/arch -k`" in
 	    Series*|S4*)
@@ -354,10 +342,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
 	esac
 	# Japanese Language versions have a version number like `4.1.3-JL'.
 	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit 0 ;;
+	exit ;;
     sun3*:SunOS:*:*)
 	echo m68k-sun-sunos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     sun*:*:4.2BSD:*)
 	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
 	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
@@ -369,10 +357,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
 		echo sparc-sun-sunos${UNAME_RELEASE}
 		;;
 	esac
-	exit 0 ;;
+	exit ;;
     aushp:SunOS:*:*)
 	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     # The situation for MiNT is a little confusing.  The machine name
     # can be virtually everything (everything which is not
     # "atarist" or "atariste" at least should have a processor
@@ -383,37 +371,40 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
     # be no problem.
     atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
         echo m68k-atari-mint${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
 	echo m68k-atari-mint${UNAME_RELEASE}
-        exit 0 ;;
+        exit ;;
     *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
         echo m68k-atari-mint${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
         echo m68k-milan-mint${UNAME_RELEASE}
-        exit 0 ;;
+        exit ;;
     hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
         echo m68k-hades-mint${UNAME_RELEASE}
-        exit 0 ;;
+        exit ;;
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
         echo m68k-unknown-mint${UNAME_RELEASE}
-        exit 0 ;;
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
     powerpc:machten:*:*)
 	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     RISC*:Mach:*:*)
 	echo mips-dec-mach_bsd4.3
-	exit 0 ;;
+	exit ;;
     RISC*:ULTRIX:*:*)
 	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     VAX*:ULTRIX*:*:*)
 	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     2020:CLIX:*:* | 2430:CLIX:*:*)
 	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     mips:*:*:UMIPS | mips:*:*:RISCos)
 	eval $set_cc_for_build
 	sed 's/^	//' << EOF >$dummy.c
@@ -437,32 +428,33 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
 	  exit (-1);
 	}
 EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c \
-	  && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
-	  && exit 0
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
 	echo mips-mips-riscos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     Motorola:PowerMAX_OS:*:*)
 	echo powerpc-motorola-powermax
-	exit 0 ;;
+	exit ;;
     Motorola:*:4.3:PL8-*)
 	echo powerpc-harris-powermax
-	exit 0 ;;
+	exit ;;
     Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
 	echo powerpc-harris-powermax
-	exit 0 ;;
+	exit ;;
     Night_Hawk:Power_UNIX:*:*)
 	echo powerpc-harris-powerunix
-	exit 0 ;;
+	exit ;;
     m88k:CX/UX:7*:*)
 	echo m88k-harris-cxux7
-	exit 0 ;;
+	exit ;;
     m88k:*:4*:R4*)
 	echo m88k-motorola-sysv4
-	exit 0 ;;
+	exit ;;
     m88k:*:3*:R3*)
 	echo m88k-motorola-sysv3
-	exit 0 ;;
+	exit ;;
     AViiON:dgux:*:*)
         # DG/UX returns AViiON for all architectures
         UNAME_PROCESSOR=`/usr/bin/uname -p`
@@ -478,29 +470,29 @@ EOF
 	else
 	    echo i586-dg-dgux${UNAME_RELEASE}
 	fi
- 	exit 0 ;;
+ 	exit ;;
     M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
 	echo m88k-dolphin-sysv3
-	exit 0 ;;
+	exit ;;
     M88*:*:R3*:*)
 	# Delta 88k system running SVR3
 	echo m88k-motorola-sysv3
-	exit 0 ;;
+	exit ;;
     XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
 	echo m88k-tektronix-sysv3
-	exit 0 ;;
+	exit ;;
     Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
 	echo m68k-tektronix-bsd
-	exit 0 ;;
+	exit ;;
     *:IRIX*:*:*)
 	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit 0 ;;
+	exit ;;
     ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
-	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
     i*86:AIX:*:*)
 	echo i386-ibm-aix
-	exit 0 ;;
+	exit ;;
     ia64:AIX:*:*)
 	if [ -x /usr/bin/oslevel ] ; then
 		IBM_REV=`/usr/bin/oslevel`
@@ -508,7 +500,7 @@ EOF
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
 	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit 0 ;;
+	exit ;;
     *:AIX:2:3)
 	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
 		eval $set_cc_for_build
@@ -523,14 +515,18 @@ EOF
 			exit(0);
 			}
 EOF
-		$CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
-		echo rs6000-ibm-aix3.2.5
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
 	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
 		echo rs6000-ibm-aix3.2.4
 	else
 		echo rs6000-ibm-aix3.2
 	fi
-	exit 0 ;;
+	exit ;;
     *:AIX:*:[45])
 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
 	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
@@ -544,28 +540,28 @@ EOF
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
 	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit 0 ;;
+	exit ;;
     *:AIX:*:*)
 	echo rs6000-ibm-aix
-	exit 0 ;;
+	exit ;;
     ibmrt:4.4BSD:*|romp-ibm:BSD:*)
 	echo romp-ibm-bsd4.4
-	exit 0 ;;
+	exit ;;
     ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
 	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit 0 ;;                           # report: romp-ibm BSD 4.3
+	exit ;;                             # report: romp-ibm BSD 4.3
     *:BOSX:*:*)
 	echo rs6000-bull-bosx
-	exit 0 ;;
+	exit ;;
     DPX/2?00:B.O.S.:*:*)
 	echo m68k-bull-sysv3
-	exit 0 ;;
+	exit ;;
     9000/[34]??:4.3bsd:1.*:*)
 	echo m68k-hp-bsd
-	exit 0 ;;
+	exit ;;
     hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
 	echo m68k-hp-bsd4.4
-	exit 0 ;;
+	exit ;;
     9000/[34678]??:HP-UX:*:*)
 	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
 	case "${UNAME_MACHINE}" in
@@ -627,9 +623,19 @@ EOF
 	esac
 	if [ ${HP_ARCH} = "hppa2.0w" ]
 	then
-	    # avoid double evaluation of $set_cc_for_build
-	    test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep __LP64__ >/dev/null
 	    then
 		HP_ARCH="hppa2.0w"
 	    else
@@ -637,11 +643,11 @@ EOF
 	    fi
 	fi
 	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit 0 ;;
+	exit ;;
     ia64:HP-UX:*:*)
 	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
 	echo ia64-hp-hpux${HPUX_REV}
-	exit 0 ;;
+	exit ;;
     3050*:HI-UX:*:*)
 	eval $set_cc_for_build
 	sed 's/^	//' << EOF >$dummy.c
@@ -669,150 +675,171 @@ EOF
 	  exit (0);
 	}
 EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
 	echo unknown-hitachi-hiuxwe2
-	exit 0 ;;
+	exit ;;
     9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
 	echo hppa1.1-hp-bsd
-	exit 0 ;;
+	exit ;;
     9000/8??:4.3bsd:*:*)
 	echo hppa1.0-hp-bsd
-	exit 0 ;;
+	exit ;;
     *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
 	echo hppa1.0-hp-mpeix
-	exit 0 ;;
+	exit ;;
     hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
 	echo hppa1.1-hp-osf
-	exit 0 ;;
+	exit ;;
     hp8??:OSF1:*:*)
 	echo hppa1.0-hp-osf
-	exit 0 ;;
+	exit ;;
     i*86:OSF1:*:*)
 	if [ -x /usr/sbin/sysversion ] ; then
 	    echo ${UNAME_MACHINE}-unknown-osf1mk
 	else
 	    echo ${UNAME_MACHINE}-unknown-osf1
 	fi
-	exit 0 ;;
+	exit ;;
     parisc*:Lites*:*:*)
 	echo hppa1.1-hp-lites
-	exit 0 ;;
+	exit ;;
     C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
 	echo c1-convex-bsd
-        exit 0 ;;
+        exit ;;
     C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
 	if getsysinfo -f scalar_acc
 	then echo c32-convex-bsd
 	else echo c2-convex-bsd
 	fi
-        exit 0 ;;
+        exit ;;
     C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
 	echo c34-convex-bsd
-        exit 0 ;;
+        exit ;;
     C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
 	echo c38-convex-bsd
-        exit 0 ;;
+        exit ;;
     C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
 	echo c4-convex-bsd
-        exit 0 ;;
+        exit ;;
     CRAY*Y-MP:*:*:*)
 	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit 0 ;;
+	exit ;;
     CRAY*[A-Z]90:*:*:*)
 	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
 	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
 	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
 	      -e 's/\.[^.]*$/.X/'
-	exit 0 ;;
+	exit ;;
     CRAY*TS:*:*:*)
 	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit 0 ;;
+	exit ;;
     CRAY*T3E:*:*:*)
 	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit 0 ;;
+	exit ;;
     CRAY*SV1:*:*:*)
 	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit 0 ;;
+	exit ;;
     *:UNICOS/mp:*:*)
-	echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit 0 ;;
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
 	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit 0 ;;
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
 	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     sparc*:BSD/OS:*:*)
 	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:BSD/OS:*:*)
 	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit 0 ;;
-    *:FreeBSD:*:*|*:GNU/FreeBSD:*:*)
-	# Determine whether the default compiler uses glibc.
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <features.h>
-	#if __GLIBC__ >= 2
-	LIBC=gnu
-	#else
-	LIBC=
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
-	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
-	exit 0 ;;
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
     i*:CYGWIN*:*)
 	echo ${UNAME_MACHINE}-pc-cygwin
-	exit 0 ;;
+	exit ;;
     i*:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
-	exit 0 ;;
+	exit ;;
+    i*:windows32*:*)
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
     i*:PW*:*)
 	echo ${UNAME_MACHINE}-pc-pw32
-	exit 0 ;;
-    x86:Interix*:[34]*)
+	exit ;;
+    x86:Interix*:[345]*)
 	echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
-	exit 0 ;;
+	exit ;;
     [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
 	echo i${UNAME_MACHINE}-pc-mks
-	exit 0 ;;
+	exit ;;
     i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
 	# How do we know it's Interix rather than the generic POSIX subsystem?
 	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
 	# UNAME_MACHINE based on the output of uname instead of i386?
 	echo i586-pc-interix
-	exit 0 ;;
+	exit ;;
     i*:UWIN*:*)
 	echo ${UNAME_MACHINE}-pc-uwin
-	exit 0 ;;
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
     p*:CYGWIN*:*)
 	echo powerpcle-unknown-cygwin
-	exit 0 ;;
+	exit ;;
     prep*:SunOS:5.*:*)
 	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit 0 ;;
+	exit ;;
     *:GNU:*:*)
+	# the GNU system
 	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	exit 0 ;;
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
-	exit 0 ;;
+	exit ;;
     arm*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
     cris:Linux:*:*)
 	echo cris-axis-linux-gnu
-	exit 0 ;;
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+	echo frv-unknown-linux-gnu
+	exit ;;
     ia64:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
     m68*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
     mips:Linux:*:*)
 	eval $set_cc_for_build
 	sed 's/^	//' << EOF >$dummy.c
@@ -829,8 +856,8 @@ EOF
 	#endif
 	#endif
 EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
-	test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^CPU/{s: ::g;p;}'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
 	;;
     mips64:Linux:*:*)
 	eval $set_cc_for_build
@@ -848,15 +875,18 @@ EOF
 	#endif
 	#endif
 EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
-	test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^CPU/{s: ::g;p;}'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
 	;;
+    or32:Linux:*:*)
+    	echo or32-unknown-linux-gnu
+    	exit ;;
     ppc:Linux:*:*)
 	echo powerpc-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
     ppc64:Linux:*:*)
 	echo powerpc64-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
     alpha:Linux:*:*)
 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
 	  EV5)   UNAME_MACHINE=alphaev5 ;;
@@ -870,7 +900,7 @@ EOF
 	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
 	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
 	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit 0 ;;
+	exit ;;
     parisc:Linux:*:* | hppa:Linux:*:*)
 	# Look for CPU level
 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
@@ -878,25 +908,28 @@ EOF
 	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
 	  *)    echo hppa-unknown-linux-gnu ;;
 	esac
-	exit 0 ;;
+	exit ;;
     parisc64:Linux:*:* | hppa64:Linux:*:*)
 	echo hppa64-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
 	echo ${UNAME_MACHINE}-ibm-linux
-	exit 0 ;;
+	exit ;;
     sh64*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
     sh*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
     x86_64:Linux:*:*)
 	echo x86_64-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
     i*86:Linux:*:*)
 	# The BFD linker knows what the default object file format is, so
 	# first see if it will tell us. cd to the root directory to prevent
@@ -914,15 +947,15 @@ EOF
 		;;
 	  a.out-i386-linux)
 		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-		exit 0 ;;
+		exit ;;
 	  coff-i386)
 		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-		exit 0 ;;
+		exit ;;
 	  "")
 		# Either a pre-BFD a.out linker (linux-gnuoldld) or
 		# one that does not give us useful --help.
 		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
-		exit 0 ;;
+		exit ;;
 	esac
 	# Determine whether the default compiler is a.out or elf
 	eval $set_cc_for_build
@@ -939,23 +972,29 @@ EOF
 	LIBC=gnulibc1
 	# endif
 	#else
-	#ifdef __INTEL_COMPILER
+	#if defined(__INTEL_COMPILER) || defined(__PGI)
 	LIBC=gnu
 	#else
 	LIBC=gnuaout
 	#endif
 	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
 EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
-	test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
-	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '/^LIBC/{s: ::g;p;}'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
 	;;
     i*86:DYNIX/ptx:4*:*)
 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
 	# earlier versions are messed up and put the nodename in both
 	# sysname and nodename.
 	echo i386-sequent-sysv4
-	exit 0 ;;
+	exit ;;
     i*86:UNIX_SV:4.2MP:2.*)
         # Unixware is an offshoot of SVR4, but it has its own version
         # number series starting with 2...
@@ -963,24 +1002,27 @@ EOF
 	# I just have to hope.  -- rms.
         # Use sysv4.2uw... so that sysv4* matches it.
 	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit 0 ;;
+	exit ;;
     i*86:OS/2:*:*)
 	# If we were able to find `uname', then EMX Unix compatibility
 	# is probably installed.
 	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit 0 ;;
+	exit ;;
     i*86:XTS-300:*:STOP)
 	echo ${UNAME_MACHINE}-unknown-stop
-	exit 0 ;;
+	exit ;;
     i*86:atheos:*:*)
 	echo ${UNAME_MACHINE}-unknown-atheos
-	exit 0 ;;
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
     i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
 	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     i*86:*DOS:*:*)
 	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit 0 ;;
+	exit ;;
     i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
 	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
 	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
@@ -988,15 +1030,16 @@ EOF
 	else
 		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
 	fi
-	exit 0 ;;
-    i*86:*:5:[78]*)
+	exit ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
 	case `/bin/uname -X | grep "^Machine"` in
 	    *486*)	     UNAME_MACHINE=i486 ;;
 	    *Pentium)	     UNAME_MACHINE=i586 ;;
 	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
 	esac
 	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit 0 ;;
+	exit ;;
     i*86:*:3.2:*)
 	if test -f /usr/options/cb.name; then
 		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
@@ -1014,73 +1057,73 @@ EOF
 	else
 		echo ${UNAME_MACHINE}-pc-sysv32
 	fi
-	exit 0 ;;
+	exit ;;
     pc:*:*:*)
 	# Left here for compatibility:
         # uname -m prints for DJGPP always 'pc', but it prints nothing about
         # the processor, so we play safe by assuming i386.
 	echo i386-pc-msdosdjgpp
-        exit 0 ;;
+        exit ;;
     Intel:Mach:3*:*)
 	echo i386-pc-mach3
-	exit 0 ;;
+	exit ;;
     paragon:*:*:*)
 	echo i860-intel-osf1
-	exit 0 ;;
+	exit ;;
     i860:*:4.*:*) # i860-SVR4
 	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
 	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
 	else # Add other i860-SVR4 vendors below as they are discovered.
 	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
 	fi
-	exit 0 ;;
+	exit ;;
     mini*:CTIX:SYS*5:*)
 	# "miniframe"
 	echo m68010-convergent-sysv
-	exit 0 ;;
+	exit ;;
     mc68k:UNIX:SYSTEM5:3.51m)
 	echo m68k-convergent-sysv
-	exit 0 ;;
+	exit ;;
     M680?0:D-NIX:5.3:*)
 	echo m68k-diab-dnix
-	exit 0 ;;
-    M68*:*:R3V[567]*:*)
-	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
-    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0)
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
 	OS_REL=''
 	test -r /etc/.relid \
 	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
 	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
 	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
     3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
         /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && echo i486-ncr-sysv4 && exit 0 ;;
+          && { echo i486-ncr-sysv4; exit; } ;;
     m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
 	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     mc68030:UNIX_System_V:4.*:*)
 	echo m68k-atari-sysv4
-	exit 0 ;;
+	exit ;;
     TSUNAMI:LynxOS:2.*:*)
 	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     rs6000:LynxOS:2.*:*)
 	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
 	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     SM[BE]S:UNIX_SV:*:*)
 	echo mips-dde-sysv${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     RM*:ReliantUNIX-*:*:*)
 	echo mips-sni-sysv4
-	exit 0 ;;
+	exit ;;
     RM*:SINIX-*:*:*)
 	echo mips-sni-sysv4
-	exit 0 ;;
+	exit ;;
     *:SINIX-*:*:*)
 	if uname -p 2>/dev/null >/dev/null ; then
 		UNAME_MACHINE=`(uname -p) 2>/dev/null`
@@ -1088,91 +1131,98 @@ EOF
 	else
 		echo ns32k-sni-sysv
 	fi
-	exit 0 ;;
+	exit ;;
     PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
                       # says <Richard.M.Bartel@ccMail.Census.GOV>
         echo i586-unisys-sysv4
-        exit 0 ;;
+        exit ;;
     *:UNIX_System_V:4*:FTX*)
 	# From Gerald Hewes <hewes@openmarket.com>.
 	# How about differentiating between stratus architectures? -djm
 	echo hppa1.1-stratus-sysv4
-	exit 0 ;;
+	exit ;;
     *:*:*:FTX*)
 	# From seanf@swdc.stratus.com.
 	echo i860-stratus-sysv4
-	exit 0 ;;
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
     *:VOS:*:*)
 	# From Paul.Green@stratus.com.
 	echo hppa1.1-stratus-vos
-	exit 0 ;;
+	exit ;;
     mc68*:A/UX:*:*)
 	echo m68k-apple-aux${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     news*:NEWS-OS:6*:*)
 	echo mips-sony-newsos6
-	exit 0 ;;
+	exit ;;
     R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
 	if [ -d /usr/nec ]; then
 	        echo mips-nec-sysv${UNAME_RELEASE}
 	else
 	        echo mips-unknown-sysv${UNAME_RELEASE}
 	fi
-        exit 0 ;;
+        exit ;;
     BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
 	echo powerpc-be-beos
-	exit 0 ;;
+	exit ;;
     BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
 	echo powerpc-apple-beos
-	exit 0 ;;
+	exit ;;
     BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
 	echo i586-pc-beos
-	exit 0 ;;
+	exit ;;
     SX-4:SUPER-UX:*:*)
 	echo sx4-nec-superux${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     SX-5:SUPER-UX:*:*)
 	echo sx5-nec-superux${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     SX-6:SUPER-UX:*:*)
 	echo sx6-nec-superux${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     Power*:Rhapsody:*:*)
 	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:Rhapsody:*:*)
 	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:Darwin:*:*)
-	case `uname -p` in
-	    *86) UNAME_PROCESSOR=i686 ;;
-	    powerpc) UNAME_PROCESSOR=powerpc ;;
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
 	esac
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
 	UNAME_PROCESSOR=`uname -p`
 	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
+	    UNAME_PROCESSOR=i386
+	    UNAME_MACHINE=pc
 	fi
 	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:QNX:*:4*)
 	echo i386-pc-qnx
-	exit 0 ;;
-    NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*)
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
 	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:NonStop-UX:*:*)
 	echo mips-compaq-nonstopux
-	exit 0 ;;
+	exit ;;
     BS2000:POSIX*:*:*)
 	echo bs2000-siemens-sysv
-	exit 0 ;;
+	exit ;;
     DS/*:UNIX_System_V:*:*)
 	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:Plan9:*:*)
 	# "uname -m" is not consistent, so use $cputype instead. 386
 	# is converted to i386 for consistency with other x86
@@ -1183,28 +1233,47 @@ EOF
 	    UNAME_MACHINE="$cputype"
 	fi
 	echo ${UNAME_MACHINE}-unknown-plan9
-	exit 0 ;;
+	exit ;;
     *:TOPS-10:*:*)
 	echo pdp10-unknown-tops10
-	exit 0 ;;
+	exit ;;
     *:TENEX:*:*)
 	echo pdp10-unknown-tenex
-	exit 0 ;;
+	exit ;;
     KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
 	echo pdp10-dec-tops20
-	exit 0 ;;
+	exit ;;
     XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
 	echo pdp10-xkl-tops20
-	exit 0 ;;
+	exit ;;
     *:TOPS-20:*:*)
 	echo pdp10-unknown-tops20
-	exit 0 ;;
+	exit ;;
     *:ITS:*:*)
 	echo pdp10-unknown-its
-	exit 0 ;;
+	exit ;;
     SEI:*:*:SEIUX)
 	echo mips-sei-seiux${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
 esac
 
 #echo '(No uname command or uname output not recognized.)' 1>&2
@@ -1236,7 +1305,7 @@ main ()
 #endif
 
 #if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix"); exit (0);
+  printf ("arm-acorn-riscix\n"); exit (0);
 #endif
 
 #if defined (hp300) && !defined (hpux)
@@ -1325,11 +1394,12 @@ main ()
 }
 EOF
 
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
 
 # Apollos put the system type in the environment.
 
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
 
 # Convex versions that predate uname can use getsysinfo(1)
 
@@ -1338,22 +1408,22 @@ then
     case `getsysinfo -f cpu_type` in
     c1*)
 	echo c1-convex-bsd
-	exit 0 ;;
+	exit ;;
     c2*)
 	if getsysinfo -f scalar_acc
 	then echo c32-convex-bsd
 	else echo c2-convex-bsd
 	fi
-	exit 0 ;;
+	exit ;;
     c34*)
 	echo c34-convex-bsd
-	exit 0 ;;
+	exit ;;
     c38*)
 	echo c38-convex-bsd
-	exit 0 ;;
+	exit ;;
     c4*)
 	echo c4-convex-bsd
-	exit 0 ;;
+	exit ;;
     esac
 fi
 
@@ -1364,7 +1434,9 @@ This script, last modified $timestamp, h
 the operating system you are using. It is advised that you
 download the most up to date version of the config scripts from
 
-    ftp://ftp.gnu.org/pub/gnu/config/
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
 
 If the version you run ($0) is already up to date, please
 send the following data and any information you think might be
diff -Nurp tin-1.6.2/config.sub tin-1.8.0/config.sub
--- tin-1.6.2/config.sub	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/config.sub	2005-12-23 19:16:28.647332162 +0100
@@ -1,9 +1,9 @@
 #! /bin/sh
 # Configuration validation subroutine script.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
-timestamp='2003-06-17'
+timestamp='2005-12-23'
 
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
@@ -21,14 +21,15 @@ timestamp='2003-06-17'
 #
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
 # the same distribution terms that you use for the rest of that program.
 
+
 # Please send patches to <config-patches@gnu.org>.  Submit a context
 # diff and a properly formatted ChangeLog entry.
 #
@@ -70,7 +71,7 @@ Report bugs and patches to <config-patch
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
@@ -83,11 +84,11 @@ Try \`$me --help' for more information."
 while test $# -gt 0 ; do
   case $1 in
     --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit 0 ;;
+       echo "$timestamp" ; exit ;;
     --version | -v )
-       echo "$version" ; exit 0 ;;
+       echo "$version" ; exit ;;
     --help | --h* | -h )
-       echo "$usage"; exit 0 ;;
+       echo "$usage"; exit ;;
     -- )     # Stop option processing
        shift; break ;;
     - )	# Use stdin as input.
@@ -99,7 +100,7 @@ while test $# -gt 0 ; do
     *local*)
        # First pass through any local machine types.
        echo $1
-       exit 0;;
+       exit ;;
 
     * )
        break ;;
@@ -118,7 +119,9 @@ esac
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
@@ -144,7 +147,7 @@ case $os in
 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis)
+	-apple | -axis | -knuth | -cray)
 		os=
 		basic_machine=$1
 		;;
@@ -169,6 +172,10 @@ case $os in
 	-hiux*)
 		os=-hiuxwe2
 		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
 	-sco5)
 		os=-sco3.2v5
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
@@ -185,6 +192,10 @@ case $os in
 		# Don't forget version if it is 3.2v4 or newer.
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
 	-sco*)
 		os=-sco3.2v2
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
@@ -228,14 +239,16 @@ case $basic_machine in
 	| a29k \
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
 	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| bfin \
 	| c4x | clipper \
 	| d10v | d30v | dlx | dsp16xx \
 	| fr30 | frv \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| i370 | i860 | i960 | ia64 \
-	| ip2k \
-	| m32r | m68000 | m68k | m88k | mcore \
+	| ip2k | iq2000 \
+	| m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \
 	| mips | mipsbe | mipseb | mipsel | mipsle \
 	| mips16 \
 	| mips64 | mips64el \
@@ -244,30 +257,37 @@ case $basic_machine in
 	| mips64vr4100 | mips64vr4100el \
 	| mips64vr4300 | mips64vr4300el \
 	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
 	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
 	| mipstx39 | mipstx39el \
 	| mn10200 | mn10300 \
+	| mt \
 	| msp430 \
 	| ns16k | ns32k \
-	| openrisc | or32 \
+	| or32 \
 	| pdp10 | pdp11 | pj | pjl \
 	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
 	| pyramid \
-	| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
-	| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
+	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b \
 	| strongarm \
 	| tahoe | thumb | tic4x | tic80 | tron \
 	| v850 | v850e \
 	| we32k \
-	| x86 | xscale | xstormy16 | xtensa \
+	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
 	| z8k)
 		basic_machine=$basic_machine-unknown
 		;;
+	m32c)
+		basic_machine=$basic_machine-unknown
+		;;
 	m6811 | m68hc11 | m6812 | m68hc12)
 		# Motorola 68HC11/12.
 		basic_machine=$basic_machine-unknown
@@ -275,6 +295,9 @@ case $basic_machine in
 		;;
 	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
 		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
 
 	# We use `pc' rather than `unknown'
 	# because (1) that's what they normally are, and
@@ -295,19 +318,19 @@ case $basic_machine in
 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* \
-	| bs2000-* \
+	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | cydra-* \
+	| clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
 	| elxsi-* \
 	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* \
-	| m32r-* \
+	| ip2k-* | iq2000-* \
+	| m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | mcore-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 	| mips16-* \
 	| mips64-* | mips64el-* \
@@ -316,33 +339,40 @@ case $basic_machine in
 	| mips64vr4100-* | mips64vr4100el-* \
 	| mips64vr4300-* | mips64vr4300el-* \
 	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
 	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
 	| msp430-* \
-	| none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
 	| pyramid-* \
 	| romp-* | rs6000-* \
-	| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
-	| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
 	| tahoe-* | thumb-* \
 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 	| tron-* \
 	| v850-* | v850e-* | vax-* \
 	| we32k-* \
-	| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
-	| xtensa-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
 	| ymp-* \
 	| z8k-*)
 		;;
+	m32c-*)
+		;;
 	# Recognize the various machine names and aliases which stand
 	# for a CPU type and a company and sometimes even an OS.
 	386bsd)
@@ -359,6 +389,9 @@ case $basic_machine in
 		basic_machine=a29k-amd
 		os=-udi
 		;;
+	abacus)
+		basic_machine=abacus-unknown
+		;;
 	adobe68k)
 		basic_machine=m68010-adobe
 		os=-scout
@@ -376,6 +409,9 @@ case $basic_machine in
 	amd64)
 		basic_machine=x86_64-pc
 		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	amdahl)
 		basic_machine=580-amdahl
 		os=-sysv
@@ -435,12 +471,27 @@ case $basic_machine in
 		basic_machine=j90-cray
 		os=-unicos
 		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
 	crds | unos)
 		basic_machine=m68k-crds
 		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
 	cris | cris-* | etrax*)
 		basic_machine=cris-axis
 		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
 	da30 | da30-*)
 		basic_machine=m68k-da30
 		;;
@@ -463,6 +514,10 @@ case $basic_machine in
 		basic_machine=m88k-motorola
 		os=-sysv3
 		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
 	dpx20 | dpx20-*)
 		basic_machine=rs6000-bull
 		os=-bosx
@@ -641,10 +696,6 @@ case $basic_machine in
 	mips3*)
 		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
 		;;
-	mmix*)
-		basic_machine=mmix-knuth
-		os=-mmixware
-		;;
 	monitor)
 		basic_machine=m68k-rom68k
 		os=-coff
@@ -657,6 +708,9 @@ case $basic_machine in
 		basic_machine=i386-pc
 		os=-msdos
 		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
 	mvs)
 		basic_machine=i370-ibm
 		os=-mvs
@@ -725,10 +779,6 @@ case $basic_machine in
 	np1)
 		basic_machine=np1-gould
 		;;
-	nv1)
-		basic_machine=nv1-cray
-		os=-unicosmp
-		;;
 	nsr-tandem)
 		basic_machine=nsr-tandem
 		;;
@@ -736,9 +786,12 @@ case $basic_machine in
 		basic_machine=hppa1.1-oki
 		os=-proelf
 		;;
-	or32 | or32-*)
+	openrisc | openrisc-*)
 		basic_machine=or32-unknown
-		os=-coff
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
 		;;
 	OSE68000 | ose68000)
 		basic_machine=m68000-ericsson
@@ -765,6 +818,12 @@ case $basic_machine in
 	pc532 | pc532-*)
 		basic_machine=ns32k-pc532
 		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	pentium | p5 | k5 | k6 | nexgen | viac3)
 		basic_machine=i586-pc
 		;;
@@ -821,6 +880,10 @@ case $basic_machine in
 		basic_machine=i586-unknown
 		os=-pw32
 		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
 	rom68k)
 		basic_machine=m68k-rom68k
 		os=-coff
@@ -960,6 +1023,10 @@ case $basic_machine in
 	tower | tower-32)
 		basic_machine=m68k-ncr
 		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
 	udi29k)
 		basic_machine=a29k-amd
 		os=-udi
@@ -1003,6 +1070,10 @@ case $basic_machine in
 		basic_machine=hppa1.1-winbond
 		os=-proelf
 		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
 	xps | xps100)
 		basic_machine=xps100-honeywell
 		;;
@@ -1033,6 +1104,9 @@ case $basic_machine in
 	romp)
 		basic_machine=romp-ibm
 		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
 	rs6000)
 		basic_machine=rs6000-ibm
 		;;
@@ -1049,13 +1123,10 @@ case $basic_machine in
 	we32k)
 		basic_machine=we32k-att
 		;;
-	sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
+	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
 		basic_machine=sh-unknown
 		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparc | sparcv9 | sparcv9b)
+	sparc | sparcv8 | sparcv9 | sparcv9b)
 		basic_machine=sparc-sun
 		;;
 	cydra)
@@ -1128,19 +1199,22 @@ case $os in
 	      | -aos* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
-	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 	      | -chorusos* | -chorusrdb* \
 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei*)
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1158,12 +1232,15 @@ case $os in
 		os=`echo $os | sed -e 's|nto|nto-qnx|'`
 		;;
 	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
 	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
 		;;
 	-mac*)
 		os=`echo $os | sed -e 's|mac|macos|'`
 		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
 	-linux*)
 		os=`echo $os | sed -e 's|linux|linux-gnu|'`
 		;;
@@ -1176,6 +1253,9 @@ case $os in
 	-opened*)
 		os=-openedition
 		;;
+	-os400*)
+		os=-os400
+		;;
 	-wince*)
 		os=-wince
 		;;
@@ -1197,6 +1277,9 @@ case $os in
 	-atheos*)
 		os=-atheos
 		;;
+	-syllable*)
+		os=-syllable
+		;;
 	-386bsd)
 		os=-bsd
 		;;
@@ -1219,6 +1302,9 @@ case $os in
 	-sinix*)
 		os=-sysv4
 		;;
+	-tpf*)
+		os=-tpf
+		;;
 	-triton*)
 		os=-sysv3
 		;;
@@ -1255,6 +1341,9 @@ case $os in
 	-kaos*)
 		os=-kaos
 		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
 	-none)
 		;;
 	*)
@@ -1332,9 +1421,15 @@ case $basic_machine in
 	*-be)
 		os=-beos
 		;;
+	*-haiku)
+		os=-haiku
+		;;
 	*-ibm)
 		os=-aix
 		;;
+	*-knuth)
+		os=-mmixware
+		;;
 	*-wec)
 		os=-proelf
 		;;
@@ -1467,9 +1562,15 @@ case $basic_machine in
 			-mvs* | -opened*)
 				vendor=ibm
 				;;
+			-os400*)
+				vendor=ibm
+				;;
 			-ptx*)
 				vendor=sequent
 				;;
+			-tpf*)
+				vendor=ibm
+				;;
 			-vxsim* | -vxworks* | -windiss*)
 				vendor=wrs
 				;;
@@ -1494,7 +1595,7 @@ case $basic_machine in
 esac
 
 echo $basic_machine$os
-exit 0
+exit
 
 # Local variables:
 # eval: (add-hook 'write-file-hooks 'time-stamp)
diff -Nurp tin-1.6.2/configure tin-1.8.0/configure
--- tin-1.6.2/configure	2003-09-10 17:10:27.000000000 +0200
+++ tin-1.8.0/configure	2005-12-24 19:11:09.078966753 +0100
@@ -1,7 +1,7 @@
 #! /bin/sh
 
 # Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.13.20020210 
+# Generated automatically using autoconf version 2.13.20030927 
 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
 #
 # This configure script is free software; the Free Software Foundation
@@ -182,37 +182,43 @@ Features and packages:
   --x-includes=DIR        X include files are in DIR
   --x-libraries=DIR       X library files are in DIR
 EOF
-cat <<EOF
+cat <<\EOF
 --enable and --with options recognized:
   --with-install-prefix   prefixes actual install location (default: /)
+  --with-build-cc=XXX     the build C compiler ($BUILD_CC)
+  --with-build-cpp=XXX    the build C preprocessor ($BUILD_CPP)
+  --with-build-cflags=XXX the build C compiler-flags ($BUILD_CFLAGS)
+  --with-build-cppflags=XXX the build C preprocessor-flags ($BUILD_CPPFLAGS)
+  --with-build-ldflags=XXX the build linker-flags ($BUILD_LDFLAGS)
+  --with-build-libs=XXX   the build libraries ($(BUILD_LIBS)
   --with-ispell           (default: from system path)
   --with-metamail         (default: from system path)
   --with-sum              (default: from system path)
   --with-editor=PROG      specify editor (default: vi)
   --with-mailer=PROG      specify default mailer-program (default: mailx)
   --with-mailbox=DIR      directory for incoming mailboxes (default: empty)
+EOF
+cat <<\EOF
   --disable-pgp-gpg       disable PGP/GPG Support
   --with-pgp              (default: from system path)
   --with-pgpk             (default: from system path)
   --with-gpg              (default: from system path)
-  --with-shell=PROG       default \$SHELL program (default: sh)
+  --with-shell=PROG       default $SHELL program (default: sh)
   --disable-nntp          disable reading via NNTP
-EOF
-cat <<EOF
   --enable-nntp-only      enable reading via NNTP only
   --enable-debug          turn on debug/profiling/traces
   --disable-echo          display "compiling" commands
   --enable-prototypes     check for optional prototypes
   --enable-warnings       turn on GCC compiler warnings
   --with-libdir=PATH      news-library (default: /usr/lib/news)
+EOF
+cat <<\EOF
   --with-spooldir=PATH    news spool-directory (default: /var/spool/news)
   --with-nov-dir=PATH     news overview-directory (default: $SPOOLDIR)
   --with-nov-fname        specify names of overview files (default: .overview)
   --with-inews-dir=PATH   directory containing "inews" (default: $INEWSPATH)
   --with-inn-nntplib=PATH specify INN-NNTP library (default: empty)
   --with-socks[=path]     link with socks library if available
-EOF
-cat <<EOF
   --with-socks5[=path]    link with socks5 library if available
   --disable-fcntl         disable fcntl() locking
   --enable-lockf          enable lockf() locking
@@ -222,34 +228,34 @@ cat <<EOF
                           pdcurses (replaces options --enable-curses and
                           --with-ncurses)
   --with-curses-dir=DIR   directory in which (n)curses is installed
-  --with-ncurses          link with ncurses if available
-  --enable-curses         use curses interface
+EOF
+cat <<\EOF
+  --with-ncurses          link with ncurses if available (depriciated)
+  --enable-curses         use curses interface (depriciated)
   --with-pcre=PATH        use installed pcre versus bundled
   --with-dbmalloc         use Conor Cahill's dbmalloc library
   --with-dmalloc          use Gray Watson's dmalloc library
   --with-trace            use debugging/traces
-EOF
-cat <<EOF
-  --with-domain-name      sets \$DOMAIN_NAME (default: empty)
+  --with-domain-name      sets $DOMAIN_NAME (default: empty)
   --with-nntp-default-server
-                          (sets \$NNTP_DEFAULT_SERVER)
-                          (default: news\$DOMAIN_NAME) (default: empty)
+                          (sets NNTP_DEFAULT_SERVER)
+                          (default: news.$DOMAIN_NAME)
   --enable-mh-mail-handling
                           use MH style mail handling for mailgroups
   --disable-8bit-keys     disable 8-bit keycode support
   --disable-color         disable ANSI-color support
   --disable-etiquette     disable printing of posting-etiquette
+EOF
+cat <<\EOF
   --enable-break-long-lines
                           break long mime-encoded lines
   --disable-mime-strict-charset
                           force MM_CHARSET obeyance
   --with-mime-default-charset=CHARSET
-                          fallback for \$MM_CHARSET (default: US-ASCII)
+                          fallback for $MM_CHARSET (default: US-ASCII)
   --with-iso-to-ascii     ISO -> ASCII conversion (default: -1)
   --disable-locale        disable locale support
   --disable-posting       disable posting
-EOF
-cat <<EOF
   --disable-shell-escape  disable shell escape
   --enable-fascist-newsadmin
                           have fascist newsadmin
@@ -257,22 +263,27 @@ cat <<EOF
   --disable-piping        disable piping support
   --disable-printing      disable printer support
   --disable-append-pid    disable appending .pid to tmp-files
+EOF
+cat <<\EOF
   --disable-xhdr-xref     disable XHDR XREF fallback
   --enable-broken-listgroup-fix
                           send extra GROUP command before LISTGROUP
+  --enable-broken-system-fix
+                          ignore system()s return value
   --with-defaults-dir=PATH
                           directory containing tin.defaults file
                           (default: /etc/tin)
   --enable-ipv6           enable IPv6 (with IPv4) support (default: disabled)
   --with-coffee           coffee support
-  --with-libiconv-prefix=DIR  search for libiconv in DIR/include and DIR/lib
-EOF
-cat <<EOF
+  --with-libiconv-prefix=DIR
+                          search for libiconv in DIR/include and DIR/lib
   --disable-nls           do not use Native Language Support
   --with-included-gettext use the GNU gettext library included here
-  --enable-included-msgs  use included messages, for i18n support
+  --disable-included-msgs use included messages, for i18n support
   --with-x                use the X Window System
   --with-Xaw3d            link with Xaw 3d library
+EOF
+cat <<\EOF
   --with-neXtaw           link with neXT Athena library
   --with-XawPlus          link with Athena-Plus library
 EOF
@@ -425,7 +436,7 @@ EOF
     verbose=yes ;;
 
   -version | --version | --versio | --versi | --vers)
-    echo "configure generated by autoconf version 2.13.20020210"
+    echo "configure generated by autoconf version 2.13.20030927"
     exit 0 ;;
 
   -with-* | --with-*)
@@ -612,12 +623,247 @@ else
   ac_n= ac_c='\c' ac_t=
 fi
 
+# If we find X, set shell vars x_includes and x_libraries to the
+# paths, otherwise set no_x=yes.
+# Uses ac_ vars as temps to allow command line to override cache and checks.
+# --without-x overrides everything else, but does not touch the cache.
+echo $ac_n "checking for X""... $ac_c" 1>&6
+echo "configure:632: checking for X" >&5
+
+
+# Check whether --with-x or --without-x was given.
+if test "${with_x+set}" = set; then
+  withval="$with_x"
+  :
+fi
+
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+  # The user explicitly disabled X.
+  have_x=disabled
+else
+  if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
+    # Both variables are already set.
+    have_x=yes
+  else
+if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=NO ac_x_libraries=NO
+rm -fr conftestdir
+if mkdir conftestdir; then
+  cd conftestdir
+  # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+  cat > Imakefile <<'EOF'
+acfindx:
+	@echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
+EOF
+  if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
+    # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+    eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
+    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+    for ac_extension in a so sl; do
+      if test ! -f $ac_im_usrlibdir/libX11.$ac_extension &&
+        test -f $ac_im_libdir/libX11.$ac_extension; then
+        ac_im_usrlibdir=$ac_im_libdir; break
+      fi
+    done
+    # Screen out bogus values from the imake configuration.  They are
+    # bogus both because they are the default anyway, and because
+    # using them would break gcc on systems where it needs fixed includes.
+    case "$ac_im_incroot" in
+	/usr/include) ;;
+	*) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;;
+    esac
+    case "$ac_im_usrlibdir" in
+	/usr/lib | /lib) ;;
+	*) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;;
+    esac
+  fi
+  cd ..
+  rm -fr conftestdir
+fi
+
+if test "$ac_x_includes" = NO; then
+  # Guess where to find include files, by looking for this one X11 .h file.
+  test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h
+
+  # First, try using that file with no special directory specified.
+cat > conftest.$ac_ext <<EOF
+#line 695 "configure"
+#include "confdefs.h"
+#include <$x_direct_test_include>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:700: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  # Look for the header file in a standard set of common directories.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+  for ac_dir in               \
+    /usr/X11/include          \
+    /usr/X11R6/include        \
+    /usr/X11R5/include        \
+    /usr/X11R4/include        \
+                              \
+    /usr/include/X11          \
+    /usr/include/X11R6        \
+    /usr/include/X11R5        \
+    /usr/include/X11R4        \
+                              \
+    /usr/local/X11/include    \
+    /usr/local/X11R6/include  \
+    /usr/local/X11R5/include  \
+    /usr/local/X11R4/include  \
+                              \
+    /usr/local/include/X11    \
+    /usr/local/include/X11R6  \
+    /usr/local/include/X11R5  \
+    /usr/local/include/X11R4  \
+                              \
+    /usr/X386/include         \
+    /usr/x386/include         \
+    /usr/XFree86/include/X11  \
+                              \
+    /usr/include              \
+    /usr/local/include        \
+    /usr/unsupported/include  \
+    /usr/athena/include       \
+    /usr/local/x11r5/include  \
+    /usr/lpp/Xamples/include  \
+                              \
+    /usr/openwin/include      \
+    /usr/openwin/share/include \
+    ; \
+  do
+    if test -r "$ac_dir/$x_direct_test_include"; then
+      ac_x_includes=$ac_dir
+      break
+    fi
+  done
+fi
+rm -f conftest*
+fi # $ac_x_includes = NO
+
+if test "$ac_x_libraries" = NO; then
+  # Check for the libraries.
+
+  test -z "$x_direct_test_library" && x_direct_test_library=Xt
+  test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc
+
+  # See if we find them without any special options.
+  # Don't add to $LIBS permanently.
+  ac_save_LIBS="$LIBS"
+  LIBS="-l$x_direct_test_library $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 769 "configure"
+#include "confdefs.h"
+
+int main() {
+${x_direct_test_function}()
+; return 0; }
+EOF
+if { (eval echo configure:776: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  LIBS="$ac_save_LIBS"
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  LIBS="$ac_save_LIBS"
+# First see if replacing the include by lib works.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \
+    /usr/X11/lib          \
+    /usr/X11R6/lib        \
+    /usr/X11R5/lib        \
+    /usr/X11R4/lib        \
+                          \
+    /usr/lib/X11          \
+    /usr/lib/X11R6        \
+    /usr/lib/X11R5        \
+    /usr/lib/X11R4        \
+                          \
+    /usr/local/X11/lib    \
+    /usr/local/X11R6/lib  \
+    /usr/local/X11R5/lib  \
+    /usr/local/X11R4/lib  \
+                          \
+    /usr/local/lib/X11    \
+    /usr/local/lib/X11R6  \
+    /usr/local/lib/X11R5  \
+    /usr/local/lib/X11R4  \
+                          \
+    /usr/X386/lib         \
+    /usr/x386/lib         \
+    /usr/XFree86/lib/X11  \
+                          \
+    /usr/lib              \
+    /usr/local/lib        \
+    /usr/unsupported/lib  \
+    /usr/athena/lib       \
+    /usr/local/x11r5/lib  \
+    /usr/lpp/Xamples/lib  \
+    /lib/usr/lib/X11	  \
+                          \
+    /usr/openwin/lib      \
+    /usr/openwin/share/lib \
+    ; \
+do
+  for ac_extension in a so sl; do
+    if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then
+      ac_x_libraries=$ac_dir
+      break 2
+    fi
+  done
+done
+fi
+rm -f conftest*
+fi # $ac_x_libraries = NO
+
+if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then
+  # Didn't find X anywhere.  Cache the known absence of X.
+  ac_cv_have_x="have_x=no"
+else
+  # Record where we found X for the cache.
+  ac_cv_have_x="have_x=yes \
+	        ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
+fi
+fi
+  fi
+  eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+  echo "$ac_t""$have_x" 1>&6
+  no_x=yes
+else
+  # If each of the values was on the command line, it overrides each guess.
+  test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+  test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+  # Update the cache value to reflect the command line values.
+  ac_cv_have_x="have_x=yes \
+		ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
+  echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6
+fi
+
 
 
 
 
 PACKAGE=tin
-VERSION=1.6.2
+VERSION=1.8.0
 cat >> confdefs.h <<EOF
 #define PACKAGE "$PACKAGE"
 EOF
@@ -649,7 +895,7 @@ ac_config_sub=$ac_aux_dir/config.sub
 ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
 
 
-if test -f $srcdir/config.guess ; then
+if test -f $srcdir/config.guess || test -f $ac_aux_dir/config.guess ; then
 	
 # Make sure we can run config.sub.
 if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
@@ -657,7 +903,7 @@ else { echo "configure: error: can not r
 fi
 
 echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:661: checking host system type" >&5
+echo "configure:907: checking host system type" >&5
 
 host_alias=$host
 case "$host_alias" in
@@ -753,7 +999,7 @@ case "$host_os" in
 			# Extract the first word of "xlc", so it can be a program name with args.
 set dummy xlc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:757: checking for $ac_word" >&5
+echo "configure:1003: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_XLC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -796,14 +1042,14 @@ fi
 esac
 
 ### Native Language Support
-ALL_LINGUAS="de en_GB et fr"
+ALL_LINGUAS="de en_GB et fr ru rw tr"
 
 ### Checks for programs
 save_CFLAGS="$CFLAGS"
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:807: checking for $ac_word" >&5
+echo "configure:1053: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -833,7 +1079,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:837: checking for $ac_word" >&5
+echo "configure:1083: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -884,7 +1130,7 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:888: checking for $ac_word" >&5
+echo "configure:1134: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -916,7 +1162,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:920: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1166: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -927,12 +1173,12 @@ cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext << EOF
 
-#line 931 "configure"
+#line 1177 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:936: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1182: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -958,12 +1204,12 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:962: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1208: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:967: checking whether we are using GNU C" >&5
+echo "configure:1213: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -972,7 +1218,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:976: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1222: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -991,7 +1237,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:995: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1241: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1023,7 +1269,7 @@ else
 fi
 
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1027: checking how to run the C preprocessor" >&5
+echo "configure:1273: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -1038,13 +1284,13 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 1042 "configure"
+#line 1288 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1048: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1294: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -1055,13 +1301,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 1059 "configure"
+#line 1305 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1065: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1311: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -1072,13 +1318,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -nologo -E"
   cat > conftest.$ac_ext <<EOF
-#line 1076 "configure"
+#line 1322 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1082: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1328: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -1104,13 +1350,13 @@ echo "$ac_t""$CPP" 1>&6
 
 if test $ac_cv_prog_gcc = yes; then
     echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
-echo "configure:1108: checking whether ${CC-cc} needs -traditional" >&5
+echo "configure:1354: checking whether ${CC-cc} needs -traditional" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
     ac_pattern="Autoconf.*'x'"
   cat > conftest.$ac_ext <<EOF
-#line 1114 "configure"
+#line 1360 "configure"
 #include "confdefs.h"
 #include <sgtty.h>
 Autoconf TIOCGETP
@@ -1128,7 +1374,7 @@ rm -f conftest*
 
   if test $ac_cv_prog_gcc_traditional = no; then
     cat > conftest.$ac_ext <<EOF
-#line 1132 "configure"
+#line 1378 "configure"
 #include "confdefs.h"
 #include <termio.h>
 Autoconf TCGETA
@@ -1150,7 +1396,7 @@ echo "$ac_t""$ac_cv_prog_gcc_traditional
 fi
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:1154: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:1400: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1188,7 +1434,7 @@ fi
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1192: checking for a BSD compatible install" >&5
+echo "configure:1438: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1240,44 +1486,14 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCR
 
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
-# Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1247: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+
+
+if eval "test \"`echo '$''{'cf_cv_prog_YACC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_RANLIB="ranlib"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
-fi
-fi
-RANLIB="$ac_cv_prog_RANLIB"
-if test -n "$RANLIB"; then
-  echo "$ac_t""$RANLIB" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-
-
-if eval "test \"`echo '$''{'cf_cv_prog_YACC'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  
-if test -n "$YACC" ; then
-  cf_cv_prog_YACC="$YACC" # Let the user override the test.
+  
+if test -n "$YACC" ; then
+  cf_cv_prog_YACC="$YACC" # Let the user override the test.
 else
 cat >conftest.y <<EOF
 %{
@@ -1295,14 +1511,14 @@ EOF
   do
     rm -f y.tab.ch
     echo $ac_n "checking for $cf_prog""... $ac_c" 1>&6
-echo "configure:1299: checking for $cf_prog" >&5
+echo "configure:1515: checking for $cf_prog" >&5
     cf_command="$cf_prog conftest.y"
     cf_result=no
-    if { (eval echo configure:1302: \"$cf_command\") 1>&5; (eval $cf_command) 2>&5; } && test -s y.tab.c ; then
+    if { (eval echo configure:1518: \"$cf_command\") 1>&5; (eval $cf_command) 2>&5; } && test -s y.tab.c ; then
       mv y.tab.c conftest.c
       rm -f y.tab.h
       if test "$cf_prog" = 'bison -y' ; then
-        if { (eval echo configure:1306: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest ; then
+        if { (eval echo configure:1522: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest ; then
           cf_result=yes
         fi
       else
@@ -1326,7 +1542,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1330: checking for $ac_word" >&5
+echo "configure:1546: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LINT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1354,16 +1570,109 @@ fi
 
 test -n "$LINT" && break
 done
+test -n "$LINT" || LINT=":"
+
+echo $ac_n "checking for AIX""... $ac_c" 1>&6
+echo "configure:1577: checking for AIX" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1579 "configure"
+#include "confdefs.h"
+#ifdef _AIX
+  yes
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "yes" >/dev/null 2>&1; then
+  rm -rf conftest*
+  echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
+#define _ALL_SOURCE 1
+EOF
+
+else
+  rm -rf conftest*
+  echo "$ac_t""no" 1>&6
+fi
+rm -f conftest*
+
+
+
+echo $ac_n "checking if $CC -U and -D options work together""... $ac_c" 1>&6
+echo "configure:1602: checking if $CC -U and -D options work together" >&5
+if eval "test \"`echo '$''{'cf_cv_cc_u_d_options'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+	cf_save_CPPFLAGS="$CPPFLAGS"
+	CPPFLAGS="-UU_D_OPTIONS -DU_D_OPTIONS -DD_U_OPTIONS -UD_U_OPTIONS"
+	cat > conftest.$ac_ext <<EOF
+#line 1610 "configure"
+#include "confdefs.h"
+
+int main() {
+
+#ifndef U_D_OPTIONS
+make an undefined-error
+#endif
+#ifdef  D_U_OPTIONS
+make a defined-error
+#endif
+	
+; return 0; }
+EOF
+if { (eval echo configure:1624: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  
+	cf_cv_cc_u_d_options=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  
+	cf_cv_cc_u_d_options=no
+fi
+rm -f conftest*
+	CPPFLAGS="$cf_save_CPPFLAGS"
+
+fi
+
+echo "$ac_t""$cf_cv_cc_u_d_options" 1>&6
+
+
 
 
+
+cf_XOPEN_SOURCE=500
+cf_POSIX_C_SOURCE=199506L
+
+case $host_os in #(vi
+aix[45]*) #(vi
+	CPPFLAGS="$CPPFLAGS -D_ALL_SOURCE"
+	;;
+freebsd*) #(vi
+	# 5.x headers associate
+	#	_XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L
+	#	_XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L
+	cf_POSIX_C_SOURCE=200112L
+	cf_XOPEN_SOURCE=600
+	CPPFLAGS="$CPPFLAGS -D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+	;;
+hpux*) #(vi
+	CPPFLAGS="$CPPFLAGS -D_HPUX_SOURCE"
+	;;
+irix[56].*) #(vi
+	CPPFLAGS="$CPPFLAGS -D_SGI_SOURCE"
+	;;
+linux*|gnu*) #(vi
+	
 echo $ac_n "checking if we must define _GNU_SOURCE""... $ac_c" 1>&6
-echo "configure:1361: checking if we must define _GNU_SOURCE" >&5
+echo "configure:1670: checking if we must define _GNU_SOURCE" >&5
 if eval "test \"`echo '$''{'cf_cv_gnu_source'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 cat > conftest.$ac_ext <<EOF
-#line 1367 "configure"
+#line 1676 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 int main() {
@@ -1373,7 +1682,7 @@ make an error
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:1377: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1686: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_gnu_source=no
 else
@@ -1383,7 +1692,7 @@ else
   cf_save="$CPPFLAGS"
 	 CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
 	 cat > conftest.$ac_ext <<EOF
-#line 1387 "configure"
+#line 1696 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 int main() {
@@ -1393,7 +1702,7 @@ make an error
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:1397: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1706: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_gnu_source=no
 else
@@ -1413,9 +1722,238 @@ fi
 echo "$ac_t""$cf_cv_gnu_source" 1>&6
 test "$cf_cv_gnu_source" = yes && CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
 
+	;;
+mirbsd*) #(vi
+	# setting _XOPEN_SOURCE or _POSIX_SOURCE breaks <arpa/inet.h>
+	;;
+netbsd*) #(vi
+	# setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw
+	;;
+openbsd*) #(vi
+	# setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw
+	;;
+osf[45]*) #(vi
+	CPPFLAGS="$CPPFLAGS -D_OSF_SOURCE"
+	;;
+nto-qnx*) #(vi
+	CPPFLAGS="$CPPFLAGS -D_QNX_SOURCE"
+	;;
+sco*) #(vi
+	# setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer
+	;;
+solaris*) #(vi
+	CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"
+	;;
+*)
+	echo $ac_n "checking if we should define _XOPEN_SOURCE""... $ac_c" 1>&6
+echo "configure:1750: checking if we should define _XOPEN_SOURCE" >&5
+if eval "test \"`echo '$''{'cf_cv_xopen_source'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+	cat > conftest.$ac_ext <<EOF
+#line 1756 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int main() {
+
+#ifndef _XOPEN_SOURCE
+make an error
+#endif
+; return 0; }
+EOF
+if { (eval echo configure:1766: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  cf_cv_xopen_source=no
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cf_save="$CPPFLAGS"
+	 CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE"
+	 cat > conftest.$ac_ext <<EOF
+#line 1776 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int main() {
+
+#ifdef _XOPEN_SOURCE
+make an error
+#endif
+; return 0; }
+EOF
+if { (eval echo configure:1786: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  cf_cv_xopen_source=no
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cf_cv_xopen_source=$cf_XOPEN_SOURCE
+fi
+rm -f conftest*
+	CPPFLAGS="$cf_save"
+	
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$cf_cv_xopen_source" 1>&6
+	if test "$cf_cv_xopen_source" != no ; then
+		
+# remove _XOPEN_SOURCE symbol from $CFLAGS
+CFLAGS=`echo "$CFLAGS" | \
+	sed	-e 's/-[UD]_XOPEN_SOURCE\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]_XOPEN_SOURCE\(=[^ 	]*\)\?$//g'`
+
+		
+# remove _XOPEN_SOURCE symbol from $CPPFLAGS
+CPPFLAGS=`echo "$CPPFLAGS" | \
+	sed	-e 's/-[UD]_XOPEN_SOURCE\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]_XOPEN_SOURCE\(=[^ 	]*\)\?$//g'`
+
+		test "$cf_cv_cc_u_d_options" = yes && \
+			CPPFLAGS="$CPPFLAGS -U_XOPEN_SOURCE"
+		CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=$cf_cv_xopen_source"
+	fi
+	
+cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE
+
+cf_save_CFLAGS="$CFLAGS"
+cf_save_CPPFLAGS="$CPPFLAGS"
+
+
+# remove _POSIX_C_SOURCE symbol from $cf_save_CFLAGS
+cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \
+	sed	-e 's/-[UD]_POSIX_C_SOURCE\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]_POSIX_C_SOURCE\(=[^ 	]*\)\?$//g'`
+
+
+# remove _POSIX_C_SOURCE symbol from $cf_save_CPPFLAGS
+cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \
+	sed	-e 's/-[UD]_POSIX_C_SOURCE\(=[^ 	]*\)\?[ 	]/ /g' \
+		-e 's/-[UD]_POSIX_C_SOURCE\(=[^ 	]*\)\?$//g'`
+
+
+echo $ac_n "checking if we should define _POSIX_C_SOURCE""... $ac_c" 1>&6
+echo "configure:1841: checking if we should define _POSIX_C_SOURCE" >&5
+if eval "test \"`echo '$''{'cf_cv_posix_c_source'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+	
+echo "(line 1847) testing if the symbol is already defined go no further ..." 1>&5
+
+	cat > conftest.$ac_ext <<EOF
+#line 1850 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int main() {
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+; return 0; }
+EOF
+if { (eval echo configure:1860: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  cf_cv_posix_c_source=no
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cf_want_posix_source=no
+	 case .$cf_POSIX_C_SOURCE in #(vi
+	 .[12]??*) #(vi
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		;;
+	 .2) #(vi
+		cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE"
+		cf_want_posix_source=yes
+		;;
+	 .*)
+		cf_want_posix_source=yes
+		;;
+	 esac
+	 if test "$cf_want_posix_source" = yes ; then
+		cat > conftest.$ac_ext <<EOF
+#line 1882 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int main() {
+
+#ifdef _POSIX_SOURCE
+make an error
+#endif
+; return 0; }
+EOF
+if { (eval echo configure:1892: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE"
+fi
+rm -f conftest*
+	 fi
+	 
+echo "(line 1903) testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5
+
+	 CFLAGS="$cf_trim_CFLAGS"
+	 CPPFLAGS="$cf_trim_CPPFLAGS $cf_cv_posix_c_source"
+	 
+echo "(line 1908) testing if the second compile does not leave our definition intact error ..." 1>&5
+
+	 cat > conftest.$ac_ext <<EOF
+#line 1911 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int main() {
+
+#ifndef _POSIX_C_SOURCE
+make an error
+#endif
+; return 0; }
+EOF
+if { (eval echo configure:1921: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cf_cv_posix_c_source=no
+fi
+rm -f conftest*
+	 CFLAGS="$cf_save_CFLAGS"
+	 CPPFLAGS="$cf_save_CPPFLAGS"
+	
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$cf_cv_posix_c_source" 1>&6
+
+if test "$cf_cv_posix_c_source" != no ; then
+	CFLAGS="$cf_trim_CFLAGS"
+	CPPFLAGS="$cf_trim_CPPFLAGS"
+	if test "$cf_cv_cc_u_d_options" = yes ; then
+		cf_temp_posix_c_source=`echo "$cf_cv_posix_c_source" | \
+				sed -e 's/-D/-U/g' -e 's/=[^ 	]*//g'`
+		CPPFLAGS="$CPPFLAGS $cf_temp_posix_c_source"
+	fi
+	CPPFLAGS="$CPPFLAGS $cf_cv_posix_c_source"
+fi
+
+
+	;;
+esac
+
 
         echo $ac_n "checking for strerror in -lcposix""... $ac_c" 1>&6
-echo "configure:1419: checking for strerror in -lcposix" >&5
+echo "configure:1957: checking for strerror in -lcposix" >&5
 ac_lib_var=`echo cposix'_'strerror | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1423,7 +1961,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lcposix  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1427 "configure"
+#line 1965 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1434,7 +1972,7 @@ int main() {
 strerror()
 ; return 0; }
 EOF
-if { (eval echo configure:1438: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1976: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1458,7 +1996,7 @@ fi
 
 
 echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6
-echo "configure:1462: checking for ${CC-cc} option to accept ANSI C" >&5
+echo "configure:2000: checking for ${CC-cc} option to accept ANSI C" >&5
 if eval "test \"`echo '$''{'cf_cv_ansi_cc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1482,12 +2020,34 @@ for cf_arg in "-DCC_HAS_PROTOS" \
 	-Xc
 do
 	
+cf_fix_cppflags=no
 cf_new_cflags=
 cf_new_cppflags=
+cf_new_extra_cppflags=
+
 for cf_add_cflags in $cf_arg
 do
+case $cf_fix_cppflags in
+no)
 	case $cf_add_cflags in #(vi
 	-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi
+		case $cf_add_cflags in
+		-D*)
+			cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "${cf_add_cflags}" != "${cf_tst_cflags}" \
+			&& test -z "${cf_tst_cflags}" \
+			&& cf_fix_cppflags=yes
+
+			if test $cf_fix_cppflags = yes ; then
+				cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+				cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+				continue
+			fi
+			;;
+		esac
 		case "$CPPFLAGS" in
 		*$cf_add_cflags) #(vi
 			;;
@@ -1500,6 +2060,17 @@ do
 		cf_new_cflags="$cf_new_cflags $cf_add_cflags"
 		;;
 	esac
+	;;
+yes)
+	cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+
+	cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'`
+
+	test "${cf_add_cflags}" != "${cf_tst_cflags}" \
+	&& test -z "${cf_tst_cflags}" \
+	&& cf_fix_cppflags=no
+	;;
+esac
 done
 
 if test -n "$cf_new_cflags" ; then
@@ -1512,9 +2083,16 @@ if test -n "$cf_new_cppflags" ; then
 	CPPFLAGS="$cf_new_cppflags $CPPFLAGS"
 fi
 
+if test -n "$cf_new_extra_cppflags" ; then
+	
+	EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS"
+fi
+
+
+
 
 	cat > conftest.$ac_ext <<EOF
-#line 1518 "configure"
+#line 2096 "configure"
 #include "confdefs.h"
 
 #ifndef CC_HAS_PROTOS
@@ -1530,7 +2108,7 @@ int main() {
 	struct s2 {int (*f) (double a);};
 ; return 0; }
 EOF
-if { (eval echo configure:1534: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2112: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_ansi_cc="$cf_arg"; break
 else
@@ -1549,12 +2127,34 @@ echo "$ac_t""$cf_cv_ansi_cc" 1>&6
 if test "$cf_cv_ansi_cc" != "no"; then
 if test ".$cf_cv_ansi_cc" != ".-DCC_HAS_PROTOS"; then
 	
+cf_fix_cppflags=no
 cf_new_cflags=
 cf_new_cppflags=
+cf_new_extra_cppflags=
+
 for cf_add_cflags in $cf_cv_ansi_cc
 do
+case $cf_fix_cppflags in
+no)
 	case $cf_add_cflags in #(vi
 	-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi
+		case $cf_add_cflags in
+		-D*)
+			cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "${cf_add_cflags}" != "${cf_tst_cflags}" \
+			&& test -z "${cf_tst_cflags}" \
+			&& cf_fix_cppflags=yes
+
+			if test $cf_fix_cppflags = yes ; then
+				cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+				cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+				continue
+			fi
+			;;
+		esac
 		case "$CPPFLAGS" in
 		*$cf_add_cflags) #(vi
 			;;
@@ -1567,6 +2167,17 @@ do
 		cf_new_cflags="$cf_new_cflags $cf_add_cflags"
 		;;
 	esac
+	;;
+yes)
+	cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+
+	cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'`
+
+	test "${cf_add_cflags}" != "${cf_tst_cflags}" \
+	&& test -z "${cf_tst_cflags}" \
+	&& cf_fix_cppflags=no
+	;;
+esac
 done
 
 if test -n "$cf_new_cflags" ; then
@@ -1579,6 +2190,13 @@ if test -n "$cf_new_cppflags" ; then
 	CPPFLAGS="$cf_new_cppflags $CPPFLAGS"
 fi
 
+if test -n "$cf_new_extra_cppflags" ; then
+	
+	EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS"
+fi
+
+
+
 
 else
 	cat >> confdefs.h <<\EOF
@@ -1597,23 +2215,141 @@ You have the following choices:
 	c. use a wrapper such as unproto" 1>&2; exit 1; }
 fi
 
+echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
+echo "configure:2220: checking for Cygwin environment" >&5
+if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2225 "configure"
+#include "confdefs.h"
 
+int main() {
 
-PROG_EXT=
-case $cf_cv_system_name in
-os2*)
-    # We make sure -Zexe is not used -- it would interfere with @PROG_EXT@
-    CFLAGS="$CFLAGS -Zmt"
+#ifndef __CYGWIN__
+#define __CYGWIN__ __CYGWIN32__
+#endif
+return __CYGWIN__;
+; return 0; }
+EOF
+if { (eval echo configure:2236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_cygwin=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_cygwin=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_cygwin" 1>&6
+CYGWIN=
+test "$ac_cv_cygwin" = yes && CYGWIN=yes
+echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
+echo "configure:2253: checking for mingw32 environment" >&5
+if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2258 "configure"
+#include "confdefs.h"
+
+int main() {
+return __MINGW32__;
+; return 0; }
+EOF
+if { (eval echo configure:2265: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_mingw32=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_mingw32=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_mingw32" 1>&6
+MINGW32=
+test "$ac_cv_mingw32" = yes && MINGW32=yes
+
+
+case $cf_cv_system_name in
+os2*)
+    CFLAGS="$CFLAGS -Zmt"
     CPPFLAGS="$CPPFLAGS -D__ST_MT_ERRNO__"
     CXXFLAGS="$CXXFLAGS -Zmt"
-    LDFLAGS=`echo "$LDFLAGS -Zmt -Zcrtdll" | sed -e "s%-Zexe%%g"`
-    PROG_EXT=".exe"
-    ;;
-cygwin*)
-    PROG_EXT=".exe"
+    # autoconf's macro sets -Zexe and suffix both, which conflict:w
+    LDFLAGS="$LDFLAGS -Zmt -Zcrtdll"
+    ac_cv_exeext=.exe
     ;;
 esac
 
+
+
+echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+echo "configure:2297: checking for executable suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+  ac_cv_exeext=.exe
+else
+  rm -f conftest*
+  echo 'int main () { return 0; }' > conftest.$ac_ext
+  ac_cv_exeext=
+  if { (eval echo configure:2307: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+    for file in conftest.*; do
+      case $file in
+      *.c | *.o | *.obj) ;;
+      *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
+      esac
+    done
+  else
+    { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
+  fi
+  rm -f conftest*
+  test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
+fi
+fi
+
+EXEEXT=""
+test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
+echo "$ac_t""${ac_cv_exeext}" 1>&6
+ac_exeext=$EXEEXT
+
+echo $ac_n "checking for object suffix""... $ac_c" 1>&6
+echo "configure:2328: checking for object suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  rm -f conftest*
+echo 'int i = 1;' > conftest.$ac_ext
+if { (eval echo configure:2334: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  for ac_file in conftest.*; do
+    case $ac_file in
+    *.c) ;;
+    *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;;
+    esac
+  done
+else
+  { echo "configure: error: installation or configuration problem; compiler does not work" 1>&2; exit 1; }
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_objext" 1>&6
+OBJEXT=$ac_cv_objext
+ac_objext=$ac_cv_objext
+
+
+PROG_EXT="$EXEEXT"
+
 test -n "$PROG_EXT" && cat >> confdefs.h <<EOF
 #define PROG_EXT "$PROG_EXT"
 EOF
@@ -1629,7 +2365,7 @@ LIB_PREFIX=$LIB_PREFIX
 	
 
 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:1633: checking whether ln -s works" >&5
+echo "configure:2369: checking whether ln -s works" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1650,619 +2386,456 @@ else
 fi
 
 
-case "$host_cpu:$host_vendor:$host_os" in
-	# check for MacOS X, exclude Darwin on ix86
-	powerpc:apple:darwin*)  #
-		cat >> confdefs.h <<\EOF
-#define MAC_OS_X 1
-EOF
-
-		;;
-	# check for cygwin enviroment
-	# -DSTATIC is needed for pcre
-	*:*:*cygwin*)	#(vi
-		PCRE_DEFINES="$PCRE_DEFINES -DSTATIC"
-		;;
-	# SEIUX doesn't have any usefull preprocessor symbol
-	mips:sei:seiux*)
-		cat >> confdefs.h <<\EOF
-#define SEIUX 1
-EOF
-
-		;;
-esac
 
 
+if test "$cross_compiling" = yes ; then
 
-# Check whether --with-ispell or --without-ispell was given.
-if test "${with_ispell+set}" = set; then
-  withval="$with_ispell"
-  case "$withval" in #(vi
-  yes)
-   { echo "configure: error: expected a value for --with-ispell" 1>&2; exit 1; }
-   ;; #(vi
-  no)
-   ;; #(vi
-  *)
-   # user supplied option-value for "--with-ispell=path"
-   echo $ac_n "checking for ispell""... $ac_c" 1>&6
-echo "configure:1690: checking for ispell" >&5
-   ac_cv_path_PATH_ISPELL="$withval"
-   cat >> confdefs.h <<EOF
-#define PATH_ISPELL "$withval"
-EOF
-   cat >> confdefs.h <<\EOF
-#define HAVE_ISPELL 1
-EOF
-   echo "$ac_t""$withval" 1>&6
-   ;;
- esac
+	# defaults that we might want to override
+	: ${BUILD_CFLAGS:=''}
+	: ${BUILD_CPPFLAGS:='-I$(INCDIR)'}
+	: ${BUILD_LDFLAGS:=''}
+	: ${BUILD_LIBS:=''}
+	: ${BUILD_EXEEXT:='$x'}
+	: ${BUILD_OBJEXT:='o'}
+
+	
+# Check whether --with-build-cc or --without-build-cc was given.
+if test "${with_build_cc+set}" = set; then
+  withval="$with_build_cc"
+  BUILD_CC="$withval"
 else
-  
-  # user did not specify "--with-ispell"; do automatic check
-  # Extract the first word of "ispell", so it can be a program name with args.
-set dummy ispell; ac_word=$2
+  for ac_prog in gcc cc cl
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1707: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_PATH_ISPELL'+set}'`\" = set"; then
+echo "configure:2413: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_BUILD_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  case "$PATH_ISPELL" in
-  /*)
-  ac_cv_path_PATH_ISPELL="$PATH_ISPELL" # Let the user override the test with a path.
-  ;;
-  ?:/*)			 
-  ac_cv_path_PATH_ISPELL="$PATH_ISPELL" # Let the user override the test with a dos path.
-  ;;
-  *)
+  if test -n "$BUILD_CC"; then
+  ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test.
+else
   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
   ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do 
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
-      ac_cv_path_PATH_ISPELL="$ac_dir/$ac_word"
+      ac_cv_prog_BUILD_CC="$ac_prog"
       break
     fi
   done
   IFS="$ac_save_ifs"
-  ;;
-esac
 fi
-PATH_ISPELL="$ac_cv_path_PATH_ISPELL"
-if test -n "$PATH_ISPELL"; then
-  echo "$ac_t""$PATH_ISPELL" 1>&6
+fi
+BUILD_CC="$ac_cv_prog_BUILD_CC"
+if test -n "$BUILD_CC"; then
+  echo "$ac_t""$BUILD_CC" 1>&6
 else
   echo "$ac_t""no" 1>&6
 fi
 
-  if test -n "$PATH_ISPELL"; then
-    cat >> confdefs.h <<EOF
-#define PATH_ISPELL "$PATH_ISPELL"
-EOF
-    cat >> confdefs.h <<\EOF
-#define HAVE_ISPELL 1
-EOF
-  fi
+test -n "$BUILD_CC" && break
+done
 
 fi
 
+	echo $ac_n "checking for native build C compiler""... $ac_c" 1>&6
+echo "configure:2445: checking for native build C compiler" >&5
+	echo "$ac_t""$BUILD_CC" 1>&6
 
+	echo $ac_n "checking for native build C preprocessor""... $ac_c" 1>&6
+echo "configure:2449: checking for native build C preprocessor" >&5
+	
+# Check whether --with-build-cpp or --without-build-cpp was given.
+if test "${with_build_cpp+set}" = set; then
+  withval="$with_build_cpp"
+  BUILD_CPP="$withval"
+else
+  BUILD_CPP='$(BUILD_CC) -E'
+fi
+
+	echo "$ac_t""$BUILD_CPP" 1>&6
+
+	echo $ac_n "checking for native build C flags""... $ac_c" 1>&6
+echo "configure:2462: checking for native build C flags" >&5
+	
+# Check whether --with-build-cflags or --without-build-cflags was given.
+if test "${with_build_cflags+set}" = set; then
+  withval="$with_build_cflags"
+  BUILD_CFLAGS="$withval"
+fi
+
+	echo "$ac_t""$BUILD_CFLAGS" 1>&6
+
+	echo $ac_n "checking for native build C preprocessor-flags""... $ac_c" 1>&6
+echo "configure:2473: checking for native build C preprocessor-flags" >&5
+	
+# Check whether --with-build-cppflags or --without-build-cppflags was given.
+if test "${with_build_cppflags+set}" = set; then
+  withval="$with_build_cppflags"
+  BUILD_CPPFLAGS="$withval"
+fi
+
+	echo "$ac_t""$BUILD_CPPFLAGS" 1>&6
+
+	echo $ac_n "checking for native build linker-flags""... $ac_c" 1>&6
+echo "configure:2484: checking for native build linker-flags" >&5
+	
+# Check whether --with-build-ldflags or --without-build-ldflags was given.
+if test "${with_build_ldflags+set}" = set; then
+  withval="$with_build_ldflags"
+  BUILD_LDFLAGS="$withval"
+fi
+
+	echo "$ac_t""$BUILD_LDFLAGS" 1>&6
+
+	echo $ac_n "checking for native build linker-libraries""... $ac_c" 1>&6
+echo "configure:2495: checking for native build linker-libraries" >&5
+	
+# Check whether --with-build-libs or --without-build-libs was given.
+if test "${with_build_libs+set}" = set; then
+  withval="$with_build_libs"
+  BUILD_LIBS="$withval"
+fi
+
+	echo "$ac_t""$BUILD_LIBS" 1>&6
+
+	# this assumes we're on Unix.
+	BUILD_EXEEXT=
+	BUILD_OBJEXT=o
+
+	: ${BUILD_CC:='$(CC)'}
+
+	if ( test "$BUILD_CC" = "$CC" || test "$BUILD_CC" = '$(CC)' ) ; then
+		{ echo "configure: error: Cross-build requires two compilers.
+Use --with-build-cc to specify the native compiler." 1>&2; exit 1; }
+	fi
 
-# Check whether --with-metamail or --without-metamail was given.
-if test "${with_metamail+set}" = set; then
-  withval="$with_metamail"
-  case "$withval" in #(vi
-  yes)
-   { echo "configure: error: expected a value for --with-metamail" 1>&2; exit 1; }
-   ;; #(vi
-  no)
-   ;; #(vi
-  *)
-   # user supplied option-value for "--with-metamail=path"
-   echo $ac_n "checking for metamail""... $ac_c" 1>&6
-echo "configure:1764: checking for metamail" >&5
-   ac_cv_path_PATH_METAMAIL="$withval"
-   cat >> confdefs.h <<EOF
-#define PATH_METAMAIL "$withval"
-EOF
-   cat >> confdefs.h <<\EOF
-#define HAVE_METAMAIL 1
-EOF
-   echo "$ac_t""$withval" 1>&6
-   ;;
- esac
 else
-  
-  # user did not specify "--with-metamail"; do automatic check
-  # Extract the first word of "metamail", so it can be a program name with args.
-set dummy metamail; ac_word=$2
+	: ${BUILD_CC:='$(CC)'}
+	: ${BUILD_CPP:='$(CPP)'}
+	: ${BUILD_CFLAGS:='$(CFLAGS)'}
+	: ${BUILD_CPPFLAGS:='$(CPPFLAGS)'}
+	: ${BUILD_LDFLAGS:='$(LDFLAGS)'}
+	: ${BUILD_LIBS:='$(LIBS)'}
+	: ${BUILD_EXEEXT:='$x'}
+	: ${BUILD_OBJEXT:='o'}
+fi
+
+
+
+
+
+
+
+
+
+
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:2538: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+  case $nonopt in
+  NONE) build_alias=$host_alias ;;
+  *) build_alias=$nonopt ;;
+  esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+if test $host != $build; then
+  ac_tool_prefix=${host_alias}-
+else
+  ac_tool_prefix=
+fi
+
+# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1781: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_PATH_METAMAIL'+set}'`\" = set"; then
+echo "configure:2564: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  case "$PATH_METAMAIL" in
-  /*)
-  ac_cv_path_PATH_METAMAIL="$PATH_METAMAIL" # Let the user override the test with a path.
-  ;;
-  ?:/*)			 
-  ac_cv_path_PATH_METAMAIL="$PATH_METAMAIL" # Let the user override the test with a dos path.
-  ;;
-  *)
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
   ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do 
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
-      ac_cv_path_PATH_METAMAIL="$ac_dir/$ac_word"
+      ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
       break
     fi
   done
   IFS="$ac_save_ifs"
-  ;;
-esac
 fi
-PATH_METAMAIL="$ac_cv_path_PATH_METAMAIL"
-if test -n "$PATH_METAMAIL"; then
-  echo "$ac_t""$PATH_METAMAIL" 1>&6
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+  echo "$ac_t""$RANLIB" 1>&6
 else
   echo "$ac_t""no" 1>&6
 fi
 
-  if test -n "$PATH_METAMAIL"; then
-    cat >> confdefs.h <<EOF
-#define PATH_METAMAIL "$PATH_METAMAIL"
-EOF
-    cat >> confdefs.h <<\EOF
-#define HAVE_METAMAIL 1
-EOF
-  fi
-
-fi
-
-
 
-# Check whether --with-sum or --without-sum was given.
-if test "${with_sum+set}" = set; then
-  withval="$with_sum"
-  case "$withval" in #(vi
-  yes)
-   { echo "configure: error: expected a value for --with-sum" 1>&2; exit 1; }
-   ;; #(vi
-  no)
-   ;; #(vi
-  *)
-   # user supplied option-value for "--with-sum=path"
-   echo $ac_n "checking for sum""... $ac_c" 1>&6
-echo "configure:1838: checking for sum" >&5
-   ac_cv_path_PATH_SUM="$withval"
-   cat >> confdefs.h <<EOF
-#define PATH_SUM "$withval"
-EOF
-   cat >> confdefs.h <<\EOF
-#define HAVE_SUM 1
-EOF
-   echo "$ac_t""$withval" 1>&6
-   ;;
- esac
-else
-  
-  # user did not specify "--with-sum"; do automatic check
-  # Extract the first word of "sum", so it can be a program name with args.
-set dummy sum; ac_word=$2
+if test -z "$ac_cv_prog_RANLIB"; then
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1855: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_PATH_SUM'+set}'`\" = set"; then
+echo "configure:2596: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  case "$PATH_SUM" in
-  /*)
-  ac_cv_path_PATH_SUM="$PATH_SUM" # Let the user override the test with a path.
-  ;;
-  ?:/*)			 
-  ac_cv_path_PATH_SUM="$PATH_SUM" # Let the user override the test with a dos path.
-  ;;
-  *)
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
   ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do 
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
-      ac_cv_path_PATH_SUM="$ac_dir/$ac_word"
+      ac_cv_prog_RANLIB="ranlib"
       break
     fi
   done
   IFS="$ac_save_ifs"
-  ;;
-esac
-fi
-PATH_SUM="$ac_cv_path_PATH_SUM"
-if test -n "$PATH_SUM"; then
-  echo "$ac_t""$PATH_SUM" 1>&6
-else
-  echo "$ac_t""no" 1>&6
+  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB="':'"
 fi
-
-  if test -n "$PATH_SUM"; then
-    cat >> confdefs.h <<EOF
-#define PATH_SUM "$PATH_SUM"
-EOF
-    cat >> confdefs.h <<\EOF
-#define HAVE_SUM 1
-EOF
-  fi
-
 fi
-
-
-if test $ac_cv_path_PATH_SUM
-then
-echo $ac_n "checking if $ac_cv_path_PATH_SUM takes -r""... $ac_c" 1>&6
-echo "configure:1902: checking if $ac_cv_path_PATH_SUM takes -r" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_sum_r'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  
-if { ac_try='$ac_cv_path_PATH_SUM -r config.log 1>&5'; { (eval echo configure:1907: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }
-then
-	ac_cv_prog_sum_r=yes
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+  echo "$ac_t""$RANLIB" 1>&6
 else
-	ac_cv_prog_sum_r=no
-fi
-
+  echo "$ac_t""no" 1>&6
 fi
 
-if test $ac_cv_prog_sum_r = yes; then
-	cat >> confdefs.h <<\EOF
-#define SUM_TAKES_DASH_R 1
-EOF
-
-	cat >> confdefs.h <<EOF
-#define PATH_SUM_R "$ac_cv_path_PATH_SUM -r"
-EOF
-
 else
-	cat >> confdefs.h <<EOF
-#define PATH_SUM_R "$ac_cv_path_PATH_SUM"
-EOF
-
+  RANLIB="':'"
 fi
-echo "$ac_t""$ac_cv_prog_sum_r" 1>&6
-fi
-
-
-
-echo $ac_n "checking for default editor""... $ac_c" 1>&6
-echo "configure:1937: checking for default editor" >&5
-
-# Check whether --with-editor or --without-editor was given.
-if test "${with_editor+set}" = set; then
-  withval="$with_editor"
-  :
-else
-  withval="${DEFAULT_EDITOR}"
 fi
-test -n "$withval" && \
-case "$withval" in #(vi
-yes)
-  { echo "configure: error: expected a value for --with-editor" 1>&2; exit 1; }
-  ;; #(vi
-no) withval=""
-  ;;
-esac
-DEFAULT_EDITOR="$withval"
 
-if test -z "$DEFAULT_EDITOR" ; then
-    if test -n "$EDITOR" ; then
-    	DEFAULT_EDITOR="$EDITOR"
-    elif test -n "$VISUAL" ; then
-    	DEFAULT_EDITOR="$VISUAL"
-    else
-	# Extract the first word of "vi", so it can be a program name with args.
-set dummy vi; ac_word=$2
+# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ld; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1965: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_DEFAULT_EDITOR'+set}'`\" = set"; then
+echo "configure:2631: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  case "$DEFAULT_EDITOR" in
-  /*)
-  ac_cv_path_DEFAULT_EDITOR="$DEFAULT_EDITOR" # Let the user override the test with a path.
-  ;;
-  ?:/*)			 
-  ac_cv_path_DEFAULT_EDITOR="$DEFAULT_EDITOR" # Let the user override the test with a dos path.
-  ;;
-  *)
+  if test -n "$LD"; then
+  ac_cv_prog_LD="$LD" # Let the user override the test.
+else
   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH:/usr/bin:/usr/ucb"
-  for ac_dir in $ac_dummy; do 
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
-      ac_cv_path_DEFAULT_EDITOR="$ac_dir/$ac_word"
+      ac_cv_prog_LD="${ac_tool_prefix}ld"
       break
     fi
   done
   IFS="$ac_save_ifs"
-  test -z "$ac_cv_path_DEFAULT_EDITOR" && ac_cv_path_DEFAULT_EDITOR="vi"
-  ;;
-esac
 fi
-DEFAULT_EDITOR="$ac_cv_path_DEFAULT_EDITOR"
-if test -n "$DEFAULT_EDITOR"; then
-  echo "$ac_t""$DEFAULT_EDITOR" 1>&6
+fi
+LD="$ac_cv_prog_LD"
+if test -n "$LD"; then
+  echo "$ac_t""$LD" 1>&6
 else
   echo "$ac_t""no" 1>&6
 fi
 
-    fi
-fi
-echo "$ac_t""$DEFAULT_EDITOR" 1>&6
-cat >> confdefs.h <<EOF
-#define DEFAULT_EDITOR "$DEFAULT_EDITOR"
-EOF
-
-
 
-# Extract the first word of "sendmail", so it can be a program name with args.
-set dummy sendmail; ac_word=$2
+if test -z "$ac_cv_prog_LD"; then
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "ld", so it can be a program name with args.
+set dummy ld; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2010: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_DEFAULT_MAILER'+set}'`\" = set"; then
+echo "configure:2663: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  case "$DEFAULT_MAILER" in
-  /*)
-  ac_cv_path_DEFAULT_MAILER="$DEFAULT_MAILER" # Let the user override the test with a path.
-  ;;
-  ?:/*)			 
-  ac_cv_path_DEFAULT_MAILER="$DEFAULT_MAILER" # Let the user override the test with a dos path.
-  ;;
-  *)
+  if test -n "$LD"; then
+  ac_cv_prog_LD="$LD" # Let the user override the test.
+else
   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH:/usr/sbin:/usr/lib"
-  for ac_dir in $ac_dummy; do 
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
-      ac_cv_path_DEFAULT_MAILER="$ac_dir/$ac_word"
+      ac_cv_prog_LD="ld"
       break
     fi
   done
   IFS="$ac_save_ifs"
-  ;;
-esac
+  test -z "$ac_cv_prog_LD" && ac_cv_prog_LD="ld"
 fi
-DEFAULT_MAILER="$ac_cv_path_DEFAULT_MAILER"
-if test -n "$DEFAULT_MAILER"; then
-  echo "$ac_t""$DEFAULT_MAILER" 1>&6
+fi
+LD="$ac_cv_prog_LD"
+if test -n "$LD"; then
+  echo "$ac_t""$LD" 1>&6
 else
   echo "$ac_t""no" 1>&6
 fi
 
-
-# Check whether --with-mailer or --without-mailer was given.
-if test "${with_mailer+set}" = set; then
-  withval="$with_mailer"
-  :
 else
-  withval="${DEFAULT_MAILER}"
+  LD="ld"
+fi
 fi
-test -n "$withval" && \
-case "$withval" in #(vi
-yes)
-  { echo "configure: error: expected a value for --with-mailer" 1>&2; exit 1; }
-  ;; #(vi
-no) withval=""
-  ;;
-esac
-DEFAULT_MAILER="$withval"
 
-if test -z "$DEFAULT_MAILER" ; then
-# Extract the first word of "mailx", so it can be a program name with args.
-set dummy mailx; ac_word=$2
+# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2064: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_DEFAULT_MAILER'+set}'`\" = set"; then
+echo "configure:2698: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  case "$DEFAULT_MAILER" in
-  /*)
-  ac_cv_path_DEFAULT_MAILER="$DEFAULT_MAILER" # Let the user override the test with a path.
-  ;;
-  ?:/*)			 
-  ac_cv_path_DEFAULT_MAILER="$DEFAULT_MAILER" # Let the user override the test with a dos path.
-  ;;
-  *)
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH:/usr/bin"
-  for ac_dir in $ac_dummy; do 
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
-      ac_cv_path_DEFAULT_MAILER="$ac_dir/$ac_word"
+      ac_cv_prog_AR="${ac_tool_prefix}ar"
       break
     fi
   done
   IFS="$ac_save_ifs"
-  ;;
-esac
 fi
-DEFAULT_MAILER="$ac_cv_path_DEFAULT_MAILER"
-if test -n "$DEFAULT_MAILER"; then
-  echo "$ac_t""$DEFAULT_MAILER" 1>&6
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+  echo "$ac_t""$AR" 1>&6
 else
   echo "$ac_t""no" 1>&6
 fi
 
-fi
-if test -z "$DEFAULT_MAILER" ; then
-# Extract the first word of "mail", so it can be a program name with args.
-set dummy mail; ac_word=$2
+
+if test -z "$ac_cv_prog_AR"; then
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2101: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_DEFAULT_MAILER'+set}'`\" = set"; then
+echo "configure:2730: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  case "$DEFAULT_MAILER" in
-  /*)
-  ac_cv_path_DEFAULT_MAILER="$DEFAULT_MAILER" # Let the user override the test with a path.
-  ;;
-  ?:/*)			 
-  ac_cv_path_DEFAULT_MAILER="$DEFAULT_MAILER" # Let the user override the test with a dos path.
-  ;;
-  *)
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH:/usr/bin"
-  for ac_dir in $ac_dummy; do 
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
-      ac_cv_path_DEFAULT_MAILER="$ac_dir/$ac_word"
+      ac_cv_prog_AR="ar"
       break
     fi
   done
   IFS="$ac_save_ifs"
-  ;;
-esac
+  test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
 fi
-DEFAULT_MAILER="$ac_cv_path_DEFAULT_MAILER"
-if test -n "$DEFAULT_MAILER"; then
-  echo "$ac_t""$DEFAULT_MAILER" 1>&6
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+  echo "$ac_t""$AR" 1>&6
 else
   echo "$ac_t""no" 1>&6
 fi
 
+else
+  AR="ar"
+fi
 fi
-echo $ac_n "checking for default mailer""... $ac_c" 1>&6
-echo "configure:2135: checking for default mailer" >&5
-if test -n "$DEFAULT_MAILER" ; then
-	
-case $cf_cv_system_name in #(vi
-os2*|cygwin*)
-	ac_cv_path_DEFAULT_MAILER=`echo "$ac_cv_path_DEFAULT_MAILER" | sed -e 's%\\\\%/%g'`
-	;;
-esac
 
-	
-case $cf_cv_system_name in #(vi
-os2*|cygwin*)
-	DEFAULT_MAILER=`echo "$DEFAULT_MAILER" | sed -e 's%\\\\%/%g'`
-	;;
-esac
+if eval "test \"`echo '$''{'cf_cv_subst_AR_OPTS'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+echo $ac_n "checking for archiver options (symbol AR_OPTS)""... $ac_c" 1>&6
+echo "configure:2767: checking for archiver options (symbol AR_OPTS)" >&5
+test -z "$AR_OPTS" && AR_OPTS=rv
+echo "$ac_t""$AR_OPTS" 1>&6
 
-	cat >> confdefs.h <<EOF
-#define DEFAULT_MAILER "$DEFAULT_MAILER"
-EOF
+cf_cv_subst_AR_OPTS=$AR_OPTS
+fi
 
-else
-	DEFAULT_MAILER=none
-fi
-echo "$ac_t""$DEFAULT_MAILER" 1>&6
+AR_OPTS=${cf_cv_subst_AR_OPTS}
 
 
-echo $ac_n "checking for incoming-mail directory""... $ac_c" 1>&6
-echo "configure:2162: checking for incoming-mail directory" >&5
-
-# Check whether --with-mailbox or --without-mailbox was given.
-if test "${with_mailbox+set}" = set; then
-  withval="$with_mailbox"
-  :
-else
-  withval="${DEFAULT_MAILBOX}"
-fi
-test -n "$withval" && \
-case "$withval" in #(vi
-yes)
-  { echo "configure: error: expected a value for --with-mailbox" 1>&2; exit 1; }
-  ;; #(vi
-no) withval=""
-  ;;
-esac
-DEFAULT_MAILBOX="$withval"
-
-if test -z "$DEFAULT_MAILBOX" ; then
-for cf_dir in \
-	/var/spool/mail \
-	/usr/spool/mail \
-	/var/mail \
-	/usr/mail \
-	/mail
-    do
-    	if test -d $cf_dir ; then
-	    DEFAULT_MAILBOX=$cf_dir
-	    break
-	fi
-    done
-fi
-if test -n "$DEFAULT_MAILBOX" ; then
-	cat >> confdefs.h <<EOF
-#define DEFAULT_MAILBOX "$DEFAULT_MAILBOX"
+case "$host_cpu:$host_vendor:$host_os" in
+	# check for MacOS X, exclude Darwin on ix86
+	powerpc:apple:darwin*)  #
+		cat >> confdefs.h <<\EOF
+#define MAC_OS_X 1
 EOF
 
-else
-	DEFAULT_MAILBOX=none
-fi
-echo "$ac_t""$DEFAULT_MAILBOX" 1>&6
+		;;
+	# check for cygwin enviroment
+	# -DSTATIC is needed for pcre
+	*:*:*cygwin*)	#(vi
+		PCRE_DEFINES="$PCRE_DEFINES -DSTATIC"
+		;;
+	# SEIUX doesn't have any usefull preprocessor symbol
+	mips:sei:seiux*)
+		cat >> confdefs.h <<\EOF
+#define SEIUX 1
+EOF
 
+		;;
+esac
 
-## PGP Support
-echo $ac_n "checking if you want PGP/GPG-Support""... $ac_c" 1>&6
-echo "configure:2208: checking if you want PGP/GPG-Support" >&5
 
-# Check whether --enable-pgp-gpg or --disable-pgp-gpg was given.
-if test "${enable_pgp_gpg+set}" = set; then
-  enableval="$enable_pgp_gpg"
-  test "$enableval" != no && enableval=yes
-  if test "$enableval" != "yes" ; then
-    USE_PGP_GPG=no 
-  else
-    USE_PGP_GPG=yes
-  fi
-else
-  enableval=yes 
-  USE_PGP_GPG=yes
-  
-fi
 
-echo "$ac_t""$enableval" 1>&6
-if test "$USE_PGP_GPG" = "yes" ; then
-	
-# Check whether --with-pgp or --without-pgp was given.
-if test "${with_pgp+set}" = set; then
-  withval="$with_pgp"
+# Check whether --with-ispell or --without-ispell was given.
+if test "${with_ispell+set}" = set; then
+  withval="$with_ispell"
   case "$withval" in #(vi
   yes)
-   { echo "configure: error: expected a value for --with-pgp" 1>&2; exit 1; }
+   { echo "configure: error: expected a value for --with-ispell" 1>&2; exit 1; }
    ;; #(vi
   no)
    ;; #(vi
   *)
-   # user supplied option-value for "--with-pgp=path"
-   echo $ac_n "checking for pgp""... $ac_c" 1>&6
-echo "configure:2240: checking for pgp" >&5
-   ac_cv_path_PATH_PGP="$withval"
+   # user supplied option-value for "--with-ispell=path"
+   echo $ac_n "checking for ispell""... $ac_c" 1>&6
+echo "configure:2813: checking for ispell" >&5
+   ac_cv_path_PATH_ISPELL="$withval"
    cat >> confdefs.h <<EOF
-#define PATH_PGP "$withval"
+#define PATH_ISPELL "$withval"
 EOF
    cat >> confdefs.h <<\EOF
-#define HAVE_PGP 1
+#define HAVE_ISPELL 1
 EOF
    echo "$ac_t""$withval" 1>&6
    ;;
  esac
 else
   
-  # user did not specify "--with-pgp"; do automatic check
-  # Extract the first word of "pgp", so it can be a program name with args.
-set dummy pgp; ac_word=$2
+  # user did not specify "--with-ispell"; do automatic check
+  # Extract the first word of "ispell", so it can be a program name with args.
+set dummy ispell; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2257: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_PATH_PGP'+set}'`\" = set"; then
+echo "configure:2830: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_PATH_ISPELL'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  case "$PATH_PGP" in
+  case "$PATH_ISPELL" in
   /*)
-  ac_cv_path_PATH_PGP="$PATH_PGP" # Let the user override the test with a path.
+  ac_cv_path_PATH_ISPELL="$PATH_ISPELL" # Let the user override the test with a path.
   ;;
   ?:/*)			 
-  ac_cv_path_PATH_PGP="$PATH_PGP" # Let the user override the test with a dos path.
+  ac_cv_path_PATH_ISPELL="$PATH_ISPELL" # Let the user override the test with a dos path.
   ;;
   *)
   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
@@ -2270,7 +2843,7 @@ else
   for ac_dir in $ac_dummy; do 
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
-      ac_cv_path_PATH_PGP="$ac_dir/$ac_word"
+      ac_cv_path_PATH_ISPELL="$ac_dir/$ac_word"
       break
     fi
   done
@@ -2278,66 +2851,65 @@ else
   ;;
 esac
 fi
-PATH_PGP="$ac_cv_path_PATH_PGP"
-if test -n "$PATH_PGP"; then
-  echo "$ac_t""$PATH_PGP" 1>&6
+PATH_ISPELL="$ac_cv_path_PATH_ISPELL"
+if test -n "$PATH_ISPELL"; then
+  echo "$ac_t""$PATH_ISPELL" 1>&6
 else
   echo "$ac_t""no" 1>&6
 fi
 
-  if test -n "$PATH_PGP"; then
+  if test -n "$PATH_ISPELL"; then
     cat >> confdefs.h <<EOF
-#define PATH_PGP "$PATH_PGP"
+#define PATH_ISPELL "$PATH_ISPELL"
 EOF
     cat >> confdefs.h <<\EOF
-#define HAVE_PGP 1
+#define HAVE_ISPELL 1
 EOF
   fi
 
 fi
 
-	# FIXME: check if pgp is pgp2 or pgp6
 
-	
-# Check whether --with-pgpk or --without-pgpk was given.
-if test "${with_pgpk+set}" = set; then
-  withval="$with_pgpk"
+
+# Check whether --with-metamail or --without-metamail was given.
+if test "${with_metamail+set}" = set; then
+  withval="$with_metamail"
   case "$withval" in #(vi
   yes)
-   { echo "configure: error: expected a value for --with-pgpk" 1>&2; exit 1; }
+   { echo "configure: error: expected a value for --with-metamail" 1>&2; exit 1; }
    ;; #(vi
   no)
    ;; #(vi
   *)
-   # user supplied option-value for "--with-pgpk=path"
-   echo $ac_n "checking for pgpk""... $ac_c" 1>&6
-echo "configure:2315: checking for pgpk" >&5
-   ac_cv_path_PATH_PGPK="$withval"
+   # user supplied option-value for "--with-metamail=path"
+   echo $ac_n "checking for metamail""... $ac_c" 1>&6
+echo "configure:2887: checking for metamail" >&5
+   ac_cv_path_PATH_METAMAIL="$withval"
    cat >> confdefs.h <<EOF
-#define PATH_PGPK "$withval"
+#define PATH_METAMAIL "$withval"
 EOF
    cat >> confdefs.h <<\EOF
-#define HAVE_PGPK 1
+#define HAVE_METAMAIL 1
 EOF
    echo "$ac_t""$withval" 1>&6
    ;;
  esac
 else
   
-  # user did not specify "--with-pgpk"; do automatic check
-  # Extract the first word of "pgpk", so it can be a program name with args.
-set dummy pgpk; ac_word=$2
+  # user did not specify "--with-metamail"; do automatic check
+  # Extract the first word of "metamail", so it can be a program name with args.
+set dummy metamail; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2332: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_PATH_PGPK'+set}'`\" = set"; then
+echo "configure:2904: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_PATH_METAMAIL'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  case "$PATH_PGPK" in
+  case "$PATH_METAMAIL" in
   /*)
-  ac_cv_path_PATH_PGPK="$PATH_PGPK" # Let the user override the test with a path.
+  ac_cv_path_PATH_METAMAIL="$PATH_METAMAIL" # Let the user override the test with a path.
   ;;
   ?:/*)			 
-  ac_cv_path_PATH_PGPK="$PATH_PGPK" # Let the user override the test with a dos path.
+  ac_cv_path_PATH_METAMAIL="$PATH_METAMAIL" # Let the user override the test with a dos path.
   ;;
   *)
   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
@@ -2345,7 +2917,7 @@ else
   for ac_dir in $ac_dummy; do 
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
-      ac_cv_path_PATH_PGPK="$ac_dir/$ac_word"
+      ac_cv_path_PATH_METAMAIL="$ac_dir/$ac_word"
       break
     fi
   done
@@ -2353,66 +2925,65 @@ else
   ;;
 esac
 fi
-PATH_PGPK="$ac_cv_path_PATH_PGPK"
-if test -n "$PATH_PGPK"; then
-  echo "$ac_t""$PATH_PGPK" 1>&6
+PATH_METAMAIL="$ac_cv_path_PATH_METAMAIL"
+if test -n "$PATH_METAMAIL"; then
+  echo "$ac_t""$PATH_METAMAIL" 1>&6
 else
   echo "$ac_t""no" 1>&6
 fi
 
-  if test -n "$PATH_PGPK"; then
+  if test -n "$PATH_METAMAIL"; then
     cat >> confdefs.h <<EOF
-#define PATH_PGPK "$PATH_PGPK"
+#define PATH_METAMAIL "$PATH_METAMAIL"
 EOF
     cat >> confdefs.h <<\EOF
-#define HAVE_PGPK 1
+#define HAVE_METAMAIL 1
 EOF
   fi
 
 fi
 
-	# FIXME: remove tailing k
 
-	
-# Check whether --with-gpg or --without-gpg was given.
-if test "${with_gpg+set}" = set; then
-  withval="$with_gpg"
+
+# Check whether --with-sum or --without-sum was given.
+if test "${with_sum+set}" = set; then
+  withval="$with_sum"
   case "$withval" in #(vi
   yes)
-   { echo "configure: error: expected a value for --with-gpg" 1>&2; exit 1; }
+   { echo "configure: error: expected a value for --with-sum" 1>&2; exit 1; }
    ;; #(vi
   no)
    ;; #(vi
   *)
-   # user supplied option-value for "--with-gpg=path"
-   echo $ac_n "checking for gpg""... $ac_c" 1>&6
-echo "configure:2390: checking for gpg" >&5
-   ac_cv_path_PATH_GPG="$withval"
+   # user supplied option-value for "--with-sum=path"
+   echo $ac_n "checking for sum""... $ac_c" 1>&6
+echo "configure:2961: checking for sum" >&5
+   ac_cv_path_PATH_SUM="$withval"
    cat >> confdefs.h <<EOF
-#define PATH_GPG "$withval"
+#define PATH_SUM "$withval"
 EOF
    cat >> confdefs.h <<\EOF
-#define HAVE_GPG 1
+#define HAVE_SUM 1
 EOF
    echo "$ac_t""$withval" 1>&6
    ;;
  esac
 else
   
-  # user did not specify "--with-gpg"; do automatic check
-  # Extract the first word of "gpg", so it can be a program name with args.
-set dummy gpg; ac_word=$2
+  # user did not specify "--with-sum"; do automatic check
+  # Extract the first word of "sum", so it can be a program name with args.
+set dummy sum; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2407: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_PATH_GPG'+set}'`\" = set"; then
+echo "configure:2978: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_PATH_SUM'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  case "$PATH_GPG" in
+  case "$PATH_SUM" in
   /*)
-  ac_cv_path_PATH_GPG="$PATH_GPG" # Let the user override the test with a path.
+  ac_cv_path_PATH_SUM="$PATH_SUM" # Let the user override the test with a path.
   ;;
   ?:/*)			 
-  ac_cv_path_PATH_GPG="$PATH_GPG" # Let the user override the test with a dos path.
+  ac_cv_path_PATH_SUM="$PATH_SUM" # Let the user override the test with a dos path.
   ;;
   *)
   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
@@ -2420,7 +2991,7 @@ else
   for ac_dir in $ac_dummy; do 
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
-      ac_cv_path_PATH_GPG="$ac_dir/$ac_word"
+      ac_cv_path_PATH_SUM="$ac_dir/$ac_word"
       break
     fi
   done
@@ -2428,272 +2999,824 @@ else
   ;;
 esac
 fi
-PATH_GPG="$ac_cv_path_PATH_GPG"
-if test -n "$PATH_GPG"; then
-  echo "$ac_t""$PATH_GPG" 1>&6
+PATH_SUM="$ac_cv_path_PATH_SUM"
+if test -n "$PATH_SUM"; then
+  echo "$ac_t""$PATH_SUM" 1>&6
 else
   echo "$ac_t""no" 1>&6
 fi
 
-  if test -n "$PATH_GPG"; then
+  if test -n "$PATH_SUM"; then
     cat >> confdefs.h <<EOF
-#define PATH_GPG "$PATH_GPG"
+#define PATH_SUM "$PATH_SUM"
 EOF
     cat >> confdefs.h <<\EOF
-#define HAVE_GPG 1
+#define HAVE_SUM 1
 EOF
   fi
 
 fi
 
-fi
-
-## Default shell
 
-# Check whether --with-shell or --without-shell was given.
-if test "${with_shell+set}" = set; then
-  withval="$with_shell"
-  cf_cv_default_shell=$withval
+if test $ac_cv_path_PATH_SUM
+then
+echo $ac_n "checking if $ac_cv_path_PATH_SUM takes -r""... $ac_c" 1>&6
+echo "configure:3025: checking if $ac_cv_path_PATH_SUM takes -r" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_sum_r'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
 else
-  cf_cv_default_shell=
+  
+if { ac_try='$ac_cv_path_PATH_SUM -r config.log 1>&5'; { (eval echo configure:3030: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }
+then
+	ac_cv_prog_sum_r=yes
+else
+	ac_cv_prog_sum_r=no
 fi
 
+fi
 
-echo $ac_n "checking for the default shell program""... $ac_c" 1>&6
-echo "configure:2464: checking for the default shell program" >&5
-cf_shell_progs="$cf_cv_default_shell"
-if test -z "$cf_shell_progs" ; then
-	cf_shell_progs="sh ksh bash zsh pdksh jsh keysh ash dash"
-	# TIN preferred default shell for BSD systems is csh. Others are sh.
-	cat > conftest.$ac_ext <<EOF
-#line 2470 "configure"
-#include "confdefs.h"
+if test $ac_cv_prog_sum_r = yes; then
+	cat >> confdefs.h <<\EOF
+#define SUM_TAKES_DASH_R 1
+EOF
 
-#include <sys/params.h>
-int main() {
-
-#if (defined(BSD) && (BSD >= 199103))
-#else
-make an error
-#endif
-
-; return 0; }
+	cat >> confdefs.h <<EOF
+#define PATH_SUM_R "$ac_cv_path_PATH_SUM -r"
 EOF
-if { (eval echo configure:2483: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
-  rm -rf conftest*
-  $cf_shell_progs="csh tcsh $cf_shell_progs"
+
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
+	cat >> confdefs.h <<EOF
+#define PATH_SUM_R "$ac_cv_path_PATH_SUM"
+EOF
+
 fi
-rm -f conftest*
+echo "$ac_t""$ac_cv_prog_sum_r" 1>&6
 fi
 
-echo "(line 2493) testing paths of shell programs: $cf_shell_progs ..." 1>&5
 
-if test -s /etc/shells && test `egrep -c -v '^(#| |    |$)' /etc/shells` -gt 0; then
-	
-echo "(line 2497) testing /etc/shells ..." 1>&5
 
-	for cf_prog in $cf_shell_progs
-	do
-		case $cf_prog in
-			/*)
-				cf_pattern="^"$cf_prog"$"
-				;;
-			*/*)
-				{ echo "configure: error: Program name must be absolute or filename: $cf_prog" 1>&2; exit 1; }
-				;;
-			*)
-				cf_pattern="/"$cf_prog"$"
-				;;
-		esac
-		cf_path=`egrep $cf_pattern /etc/shells 2>/dev/null`
-		if test -n "$cf_path"
-		then
-			for cf_shell in $cf_path
-			do
-				if test -f "$cf_shell"
-				then
-					DEFAULT_SHELL="$cf_shell"
-					break
-				fi
-			done
-		fi
-		if test -n "$DEFAULT_SHELL"
-		then
-			break
-		fi
-	done
-	echo "$ac_t""$DEFAULT_SHELL" 1>&6
+echo $ac_n "checking for default editor""... $ac_c" 1>&6
+echo "configure:3060: checking for default editor" >&5
+
+# Check whether --with-editor or --without-editor was given.
+if test "${with_editor+set}" = set; then
+  withval="$with_editor"
+  :
 else
-	
-echo "(line 2532) testing $PATH ..." 1>&5
+  withval="${DEFAULT_EDITOR}"
+fi
+test -n "$withval" && \
+case "$withval" in #(vi
+yes)
+  { echo "configure: error: expected a value for --with-editor" 1>&2; exit 1; }
+  ;; #(vi
+no) withval=""
+  ;;
+esac
+DEFAULT_EDITOR="$withval"
 
-for ac_prog in $cf_shell_progs
-do
-# Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
+if test -z "$DEFAULT_EDITOR" ; then
+    if test -n "$EDITOR" ; then
+    	DEFAULT_EDITOR="$EDITOR"
+    elif test -n "$VISUAL" ; then
+    	DEFAULT_EDITOR="$VISUAL"
+    else
+	# Extract the first word of "vi", so it can be a program name with args.
+set dummy vi; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2539: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_DEFAULT_SHELL'+set}'`\" = set"; then
+echo "configure:3088: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_DEFAULT_EDITOR'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  case "$DEFAULT_SHELL" in
+  case "$DEFAULT_EDITOR" in
   /*)
-  ac_cv_path_DEFAULT_SHELL="$DEFAULT_SHELL" # Let the user override the test with a path.
+  ac_cv_path_DEFAULT_EDITOR="$DEFAULT_EDITOR" # Let the user override the test with a path.
   ;;
   ?:/*)			 
-  ac_cv_path_DEFAULT_SHELL="$DEFAULT_SHELL" # Let the user override the test with a dos path.
+  ac_cv_path_DEFAULT_EDITOR="$DEFAULT_EDITOR" # Let the user override the test with a dos path.
   ;;
   *)
   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH:/bin:/usr/bin:/usr/xpg4/bin:/bin/posix:/usr/bin/posix:/usr/old/bin:/usr/local/bin"
+  ac_dummy="$PATH:/usr/bin:/usr/ucb"
   for ac_dir in $ac_dummy; do 
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
-      ac_cv_path_DEFAULT_SHELL="$ac_dir/$ac_word"
+      ac_cv_path_DEFAULT_EDITOR="$ac_dir/$ac_word"
       break
     fi
   done
   IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_DEFAULT_EDITOR" && ac_cv_path_DEFAULT_EDITOR="vi"
   ;;
 esac
 fi
-DEFAULT_SHELL="$ac_cv_path_DEFAULT_SHELL"
-if test -n "$DEFAULT_SHELL"; then
-  echo "$ac_t""$DEFAULT_SHELL" 1>&6
+DEFAULT_EDITOR="$ac_cv_path_DEFAULT_EDITOR"
+if test -n "$DEFAULT_EDITOR"; then
+  echo "$ac_t""$DEFAULT_EDITOR" 1>&6
 else
   echo "$ac_t""no" 1>&6
 fi
 
-test -n "$DEFAULT_SHELL" && break
-done
-
-fi
-if test -z "$DEFAULT_SHELL" ; then
-	echo "configure: warning: Cannot find the default shell you specified: $cf_shell_progs" 1>&2
-	if test -f /bin/false ; then
-		echo "configure: warning: Using /bin/false instead" 1>&2
-		DEFAULT_SHELL=/bin/false
-	else
-		{ echo "configure: error: Cannot use /bin/false because it does not exist" 1>&2; exit 1; }
-	fi
+    fi
 fi
+echo "$ac_t""$DEFAULT_EDITOR" 1>&6
 cat >> confdefs.h <<EOF
-#define DEFAULT_SHELL "$DEFAULT_SHELL"
+#define DEFAULT_EDITOR "$DEFAULT_EDITOR"
 EOF
 
 
 
-### check for this early, since it'll override several options
-echo $ac_n "checking if NNTP-support will be used""... $ac_c" 1>&6
-echo "configure:2592: checking if NNTP-support will be used" >&5
-
-# Check whether --enable-nntp or --disable-nntp was given.
-if test "${enable_nntp+set}" = set; then
-  enableval="$enable_nntp"
-  test "$enableval" != no && enableval=yes
-  if test "$enableval" != "yes" ; then
-    USE_NNTP=no 
-  else
-    USE_NNTP=yes
-  fi
+# Extract the first word of "sendmail", so it can be a program name with args.
+set dummy sendmail; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3133: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_DEFAULT_MAILER'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
 else
-  enableval=yes 
-  USE_NNTP=yes
-  
+  case "$DEFAULT_MAILER" in
+  /*)
+  ac_cv_path_DEFAULT_MAILER="$DEFAULT_MAILER" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_DEFAULT_MAILER="$DEFAULT_MAILER" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH:/usr/sbin:/usr/lib"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_DEFAULT_MAILER="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
 fi
-
-echo "$ac_t""$enableval" 1>&6
-
-USE_SPOOLDIR=yes
-if test "$USE_NNTP" = "yes" ; then
-echo $ac_n "checking whether to be NNTP_ONLY""... $ac_c" 1>&6
-echo "configure:2614: checking whether to be NNTP_ONLY" >&5
-
-# Check whether --enable-nntp-only or --disable-nntp-only was given.
-if test "${enable_nntp_only+set}" = set; then
-  enableval="$enable_nntp_only"
-  test "$enableval" != yes && enableval=no
-  if test "$enableval" != "no" ; then
-    cat >> confdefs.h <<\EOF
-#define NNTP_ONLY 1
-EOF
-
-	 USE_SPOOLDIR=no 
-  else
-    cat >> confdefs.h <<\EOF
-#define NNTP_ABLE 1
-EOF
-
-  fi
+DEFAULT_MAILER="$ac_cv_path_DEFAULT_MAILER"
+if test -n "$DEFAULT_MAILER"; then
+  echo "$ac_t""$DEFAULT_MAILER" 1>&6
 else
-  enableval=no 
-  cat >> confdefs.h <<\EOF
-#define NNTP_ABLE 1
-EOF
-
-  
-fi
-
-echo "$ac_t""$enableval" 1>&6
+  echo "$ac_t""no" 1>&6
 fi
 
-###	use option --enable-debug to compile-in test/development code
-echo $ac_n "checking if you want to compile-in debug support""... $ac_c" 1>&6
-echo "configure:2646: checking if you want to compile-in debug support" >&5
 
-# Check whether --enable-debug or --disable-debug was given.
-if test "${enable_debug+set}" = set; then
-  enableval="$enable_debug"
-  test "$enableval" != yes && enableval=no
-  if test "$enableval" != "no" ; then
-    ENABLE_DEBUG=''
-	CFLAGS="-g $CFLAGS"
-	LDFLAGS="-g $LDFLAGS" 
-  else
-    ENABLE_DEBUG='#'
-	test -z "$save_CFLAGS" && CFLAGS=`echo $CFLAGS|sed -e 's/-g //' -e 's/-g$//'`
-  fi
+# Check whether --with-mailer or --without-mailer was given.
+if test "${with_mailer+set}" = set; then
+  withval="$with_mailer"
+  :
 else
-  enableval=no 
-  ENABLE_DEBUG='#'
-	test -z "$save_CFLAGS" && CFLAGS=`echo $CFLAGS|sed -e 's/-g //' -e 's/-g$//'`
-  
+  withval="${DEFAULT_MAILER}"
 fi
+test -n "$withval" && \
+case "$withval" in #(vi
+yes)
+  { echo "configure: error: expected a value for --with-mailer" 1>&2; exit 1; }
+  ;; #(vi
+no) withval=""
+  ;;
+esac
+DEFAULT_MAILER="$withval"
 
-echo "$ac_t""$enableval" 1>&6
-
-
-###	use option --disable-echo to suppress full display compiling commands
-
-echo $ac_n "checking if you want to see long compiling messages""... $ac_c" 1>&6
-echo "configure:2673: checking if you want to see long compiling messages" >&5
-
-# Check whether --enable-echo or --disable-echo was given.
-if test "${enable_echo+set}" = set; then
-  enableval="$enable_echo"
-  test "$enableval" != no && enableval=yes
-  if test "$enableval" != "yes" ; then
-    
-    ECHO_LT='--silent'
-    ECHO_LD='@echo linking $@;'
-    RULE_CC='	@echo compiling $<'
-    SHOW_CC='	@echo compiling $@'
-    ECHO_CC='@'
- 
-  else
-    
-    ECHO_LT=''
-    ECHO_LD=''
-    RULE_CC='# compiling'
-    SHOW_CC='# compiling'
-    ECHO_CC=''
-
-  fi
-else
-  enableval=yes 
+if test -z "$DEFAULT_MAILER" ; then
+# Extract the first word of "mailx", so it can be a program name with args.
+set dummy mailx; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3187: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_DEFAULT_MAILER'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$DEFAULT_MAILER" in
+  /*)
+  ac_cv_path_DEFAULT_MAILER="$DEFAULT_MAILER" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_DEFAULT_MAILER="$DEFAULT_MAILER" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH:/usr/bin"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_DEFAULT_MAILER="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+DEFAULT_MAILER="$ac_cv_path_DEFAULT_MAILER"
+if test -n "$DEFAULT_MAILER"; then
+  echo "$ac_t""$DEFAULT_MAILER" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+if test -z "$DEFAULT_MAILER" ; then
+# Extract the first word of "mail", so it can be a program name with args.
+set dummy mail; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3224: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_DEFAULT_MAILER'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$DEFAULT_MAILER" in
+  /*)
+  ac_cv_path_DEFAULT_MAILER="$DEFAULT_MAILER" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_DEFAULT_MAILER="$DEFAULT_MAILER" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH:/usr/bin"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_DEFAULT_MAILER="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+DEFAULT_MAILER="$ac_cv_path_DEFAULT_MAILER"
+if test -n "$DEFAULT_MAILER"; then
+  echo "$ac_t""$DEFAULT_MAILER" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+echo $ac_n "checking for default mailer""... $ac_c" 1>&6
+echo "configure:3258: checking for default mailer" >&5
+if test -n "$DEFAULT_MAILER" ; then
+	
+case $cf_cv_system_name in #(vi
+os2*|cygwin*)
+	ac_cv_path_DEFAULT_MAILER=`echo "$ac_cv_path_DEFAULT_MAILER" | sed -e 's%\\\\%/%g'`
+	;;
+esac
+
+	
+case $cf_cv_system_name in #(vi
+os2*|cygwin*)
+	DEFAULT_MAILER=`echo "$DEFAULT_MAILER" | sed -e 's%\\\\%/%g'`
+	;;
+esac
+
+	cat >> confdefs.h <<EOF
+#define DEFAULT_MAILER "$DEFAULT_MAILER"
+EOF
+
+else
+	DEFAULT_MAILER=none
+fi
+echo "$ac_t""$DEFAULT_MAILER" 1>&6
+
+
+echo $ac_n "checking for incoming-mail directory""... $ac_c" 1>&6
+echo "configure:3285: checking for incoming-mail directory" >&5
+
+# Check whether --with-mailbox or --without-mailbox was given.
+if test "${with_mailbox+set}" = set; then
+  withval="$with_mailbox"
+  :
+else
+  withval="${DEFAULT_MAILBOX}"
+fi
+test -n "$withval" && \
+case "$withval" in #(vi
+yes)
+  { echo "configure: error: expected a value for --with-mailbox" 1>&2; exit 1; }
+  ;; #(vi
+no) withval=""
+  ;;
+esac
+DEFAULT_MAILBOX="$withval"
+
+if test -z "$DEFAULT_MAILBOX" ; then
+for cf_dir in \
+	/var/spool/mail \
+	/usr/spool/mail \
+	/var/mail \
+	/usr/mail \
+	/mail
+    do
+    	if test -d $cf_dir ; then
+	    DEFAULT_MAILBOX=$cf_dir
+	    break
+	fi
+    done
+fi
+if test -n "$DEFAULT_MAILBOX" ; then
+	cat >> confdefs.h <<EOF
+#define DEFAULT_MAILBOX "$DEFAULT_MAILBOX"
+EOF
+
+else
+	DEFAULT_MAILBOX=none
+fi
+echo "$ac_t""$DEFAULT_MAILBOX" 1>&6
+
+
+## PGP Support
+echo $ac_n "checking if you want PGP/GPG-Support""... $ac_c" 1>&6
+echo "configure:3331: checking if you want PGP/GPG-Support" >&5
+
+# Check whether --enable-pgp-gpg or --disable-pgp-gpg was given.
+if test "${enable_pgp_gpg+set}" = set; then
+  enableval="$enable_pgp_gpg"
+  test "$enableval" != no && enableval=yes
+  if test "$enableval" != "yes" ; then
+    USE_PGP_GPG=no 
+  else
+    USE_PGP_GPG=yes
+  fi
+else
+  enableval=yes 
+  USE_PGP_GPG=yes
+  
+fi
+
+echo "$ac_t""$enableval" 1>&6
+if test "$USE_PGP_GPG" = "yes" ; then
+	
+# Check whether --with-pgp or --without-pgp was given.
+if test "${with_pgp+set}" = set; then
+  withval="$with_pgp"
+  case "$withval" in #(vi
+  yes)
+   { echo "configure: error: expected a value for --with-pgp" 1>&2; exit 1; }
+   ;; #(vi
+  no)
+   ;; #(vi
+  *)
+   # user supplied option-value for "--with-pgp=path"
+   echo $ac_n "checking for pgp""... $ac_c" 1>&6
+echo "configure:3363: checking for pgp" >&5
+   ac_cv_path_PATH_PGP="$withval"
+   cat >> confdefs.h <<EOF
+#define PATH_PGP "$withval"
+EOF
+   cat >> confdefs.h <<\EOF
+#define HAVE_PGP 1
+EOF
+   echo "$ac_t""$withval" 1>&6
+   ;;
+ esac
+else
+  
+  # user did not specify "--with-pgp"; do automatic check
+  # Extract the first word of "pgp", so it can be a program name with args.
+set dummy pgp; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3380: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_PATH_PGP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$PATH_PGP" in
+  /*)
+  ac_cv_path_PATH_PGP="$PATH_PGP" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_PATH_PGP="$PATH_PGP" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_PATH_PGP="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+PATH_PGP="$ac_cv_path_PATH_PGP"
+if test -n "$PATH_PGP"; then
+  echo "$ac_t""$PATH_PGP" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -n "$PATH_PGP"; then
+    cat >> confdefs.h <<EOF
+#define PATH_PGP "$PATH_PGP"
+EOF
+    cat >> confdefs.h <<\EOF
+#define HAVE_PGP 1
+EOF
+  fi
+
+fi
+
+	# FIXME: check if pgp is pgp2 or pgp6
+
+	
+# Check whether --with-pgpk or --without-pgpk was given.
+if test "${with_pgpk+set}" = set; then
+  withval="$with_pgpk"
+  case "$withval" in #(vi
+  yes)
+   { echo "configure: error: expected a value for --with-pgpk" 1>&2; exit 1; }
+   ;; #(vi
+  no)
+   ;; #(vi
+  *)
+   # user supplied option-value for "--with-pgpk=path"
+   echo $ac_n "checking for pgpk""... $ac_c" 1>&6
+echo "configure:3438: checking for pgpk" >&5
+   ac_cv_path_PATH_PGPK="$withval"
+   cat >> confdefs.h <<EOF
+#define PATH_PGPK "$withval"
+EOF
+   cat >> confdefs.h <<\EOF
+#define HAVE_PGPK 1
+EOF
+   echo "$ac_t""$withval" 1>&6
+   ;;
+ esac
+else
+  
+  # user did not specify "--with-pgpk"; do automatic check
+  # Extract the first word of "pgpk", so it can be a program name with args.
+set dummy pgpk; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3455: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_PATH_PGPK'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$PATH_PGPK" in
+  /*)
+  ac_cv_path_PATH_PGPK="$PATH_PGPK" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_PATH_PGPK="$PATH_PGPK" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_PATH_PGPK="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+PATH_PGPK="$ac_cv_path_PATH_PGPK"
+if test -n "$PATH_PGPK"; then
+  echo "$ac_t""$PATH_PGPK" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -n "$PATH_PGPK"; then
+    cat >> confdefs.h <<EOF
+#define PATH_PGPK "$PATH_PGPK"
+EOF
+    cat >> confdefs.h <<\EOF
+#define HAVE_PGPK 1
+EOF
+  fi
+
+fi
+
+	# FIXME: remove tailing k
+
+	
+# Check whether --with-gpg or --without-gpg was given.
+if test "${with_gpg+set}" = set; then
+  withval="$with_gpg"
+  case "$withval" in #(vi
+  yes)
+   { echo "configure: error: expected a value for --with-gpg" 1>&2; exit 1; }
+   ;; #(vi
+  no)
+   ;; #(vi
+  *)
+   # user supplied option-value for "--with-gpg=path"
+   echo $ac_n "checking for gpg""... $ac_c" 1>&6
+echo "configure:3513: checking for gpg" >&5
+   ac_cv_path_PATH_GPG="$withval"
+   cat >> confdefs.h <<EOF
+#define PATH_GPG "$withval"
+EOF
+   cat >> confdefs.h <<\EOF
+#define HAVE_GPG 1
+EOF
+   echo "$ac_t""$withval" 1>&6
+   ;;
+ esac
+else
+  
+  # user did not specify "--with-gpg"; do automatic check
+  # Extract the first word of "gpg", so it can be a program name with args.
+set dummy gpg; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3530: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_PATH_GPG'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$PATH_GPG" in
+  /*)
+  ac_cv_path_PATH_GPG="$PATH_GPG" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_PATH_GPG="$PATH_GPG" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_PATH_GPG="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+PATH_GPG="$ac_cv_path_PATH_GPG"
+if test -n "$PATH_GPG"; then
+  echo "$ac_t""$PATH_GPG" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -n "$PATH_GPG"; then
+    cat >> confdefs.h <<EOF
+#define PATH_GPG "$PATH_GPG"
+EOF
+    cat >> confdefs.h <<\EOF
+#define HAVE_GPG 1
+EOF
+  fi
+
+fi
+
+fi
+
+## Default shell
+
+# Check whether --with-shell or --without-shell was given.
+if test "${with_shell+set}" = set; then
+  withval="$with_shell"
+  cf_cv_default_shell=$withval
+else
+  cf_cv_default_shell=
+fi
+
+
+echo $ac_n "checking for the default shell program""... $ac_c" 1>&6
+echo "configure:3587: checking for the default shell program" >&5
+cf_shell_progs="$cf_cv_default_shell"
+if test -z "$cf_shell_progs" ; then
+	cf_shell_progs="sh ksh bash zsh pdksh mksh jsh keysh ash dash"
+	# TIN preferred default shell for BSD systems is csh. Others are sh.
+	cat > conftest.$ac_ext <<EOF
+#line 3593 "configure"
+#include "confdefs.h"
+
+#include <sys/params.h>
+int main() {
+
+#if (defined(BSD) && (BSD >= 199103))
+#else
+make an error
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3606: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  $cf_shell_progs="csh tcsh $cf_shell_progs"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+fi
+
+echo "(line 3616) testing paths of shell programs: $cf_shell_progs ..." 1>&5
+
+if test -s /etc/shells && test `egrep -c -v '^(#| |    |$)' /etc/shells` -gt 0; then
+	
+echo "(line 3620) testing /etc/shells ..." 1>&5
+
+	for cf_prog in $cf_shell_progs
+	do
+		case $cf_prog in
+			/*)
+				cf_pattern="^"$cf_prog"$"
+				;;
+			*/*)
+				{ echo "configure: error: Program name must be absolute or filename: $cf_prog" 1>&2; exit 1; }
+				;;
+			*)
+				cf_pattern="/"$cf_prog"$"
+				;;
+		esac
+		cf_path=`egrep $cf_pattern /etc/shells 2>/dev/null`
+		if test -n "$cf_path"
+		then
+			for cf_shell in $cf_path
+			do
+				if test -f "$cf_shell"
+				then
+					DEFAULT_SHELL="$cf_shell"
+					break
+				fi
+			done
+		fi
+		if test -n "$DEFAULT_SHELL"
+		then
+			break
+		fi
+	done
+	echo "$ac_t""$DEFAULT_SHELL" 1>&6
+else
+	
+echo "(line 3655) testing $PATH ..." 1>&5
+
+for ac_prog in $cf_shell_progs
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3662: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_DEFAULT_SHELL'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$DEFAULT_SHELL" in
+  /*)
+  ac_cv_path_DEFAULT_SHELL="$DEFAULT_SHELL" # Let the user override the test with a path.
+  ;;
+  ?:/*)			 
+  ac_cv_path_DEFAULT_SHELL="$DEFAULT_SHELL" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH:/bin:/usr/bin:/usr/xpg4/bin:/bin/posix:/usr/bin/posix:/usr/old/bin:/usr/local/bin"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_DEFAULT_SHELL="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+DEFAULT_SHELL="$ac_cv_path_DEFAULT_SHELL"
+if test -n "$DEFAULT_SHELL"; then
+  echo "$ac_t""$DEFAULT_SHELL" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$DEFAULT_SHELL" && break
+done
+
+fi
+if test -z "$DEFAULT_SHELL" ; then
+	echo "configure: warning: Cannot find the default shell you specified: $cf_shell_progs" 1>&2
+	if test -f /bin/false ; then
+		echo "configure: warning: Using /bin/false instead" 1>&2
+		DEFAULT_SHELL=/bin/false
+	else
+		{ echo "configure: error: Cannot use /bin/false because it does not exist" 1>&2; exit 1; }
+	fi
+fi
+cat >> confdefs.h <<EOF
+#define DEFAULT_SHELL "$DEFAULT_SHELL"
+EOF
+
+
+
+### check for this early, since it'll override several options
+echo $ac_n "checking if NNTP-support will be used""... $ac_c" 1>&6
+echo "configure:3715: checking if NNTP-support will be used" >&5
+
+# Check whether --enable-nntp or --disable-nntp was given.
+if test "${enable_nntp+set}" = set; then
+  enableval="$enable_nntp"
+  test "$enableval" != no && enableval=yes
+  if test "$enableval" != "yes" ; then
+    USE_NNTP=no 
+  else
+    USE_NNTP=yes
+  fi
+else
+  enableval=yes 
+  USE_NNTP=yes
+  
+fi
+
+echo "$ac_t""$enableval" 1>&6
+
+USE_SPOOLDIR=yes
+if test "$USE_NNTP" = "yes" ; then
+echo $ac_n "checking whether to be NNTP_ONLY""... $ac_c" 1>&6
+echo "configure:3737: checking whether to be NNTP_ONLY" >&5
+
+# Check whether --enable-nntp-only or --disable-nntp-only was given.
+if test "${enable_nntp_only+set}" = set; then
+  enableval="$enable_nntp_only"
+  test "$enableval" != yes && enableval=no
+  if test "$enableval" != "no" ; then
+    cat >> confdefs.h <<\EOF
+#define NNTP_ONLY 1
+EOF
+
+	 USE_SPOOLDIR=no 
+  else
+    cat >> confdefs.h <<\EOF
+#define NNTP_ABLE 1
+EOF
+
+  fi
+else
+  enableval=no 
+  cat >> confdefs.h <<\EOF
+#define NNTP_ABLE 1
+EOF
+
+  
+fi
+
+echo "$ac_t""$enableval" 1>&6
+fi
+
+###	use option --enable-debug to compile-in test/development code
+echo $ac_n "checking if you want to compile-in debug support""... $ac_c" 1>&6
+echo "configure:3769: checking if you want to compile-in debug support" >&5
+
+# Check whether --enable-debug or --disable-debug was given.
+if test "${enable_debug+set}" = set; then
+  enableval="$enable_debug"
+  test "$enableval" != yes && enableval=no
+  if test "$enableval" != "no" ; then
+    ENABLE_DEBUG=''
+	CFLAGS="-g $CFLAGS"
+	LDFLAGS="-g $LDFLAGS" 
+  else
+    ENABLE_DEBUG='#'
+	test -z "$save_CFLAGS" && CFLAGS=`echo $CFLAGS|sed -e 's/-g //' -e 's/-g$//'`
+  fi
+else
+  enableval=no 
+  ENABLE_DEBUG='#'
+	test -z "$save_CFLAGS" && CFLAGS=`echo $CFLAGS|sed -e 's/-g //' -e 's/-g$//'`
+  
+fi
+
+echo "$ac_t""$enableval" 1>&6
+
+
+###	use option --disable-echo to suppress full display compiling commands
+
+echo $ac_n "checking if you want to see long compiling messages""... $ac_c" 1>&6
+echo "configure:3796: checking if you want to see long compiling messages" >&5
+
+# Check whether --enable-echo or --disable-echo was given.
+if test "${enable_echo+set}" = set; then
+  enableval="$enable_echo"
+  test "$enableval" != no && enableval=yes
+  if test "$enableval" != "yes" ; then
+    
+    ECHO_LT='--silent'
+    ECHO_LD='@echo linking $@;'
+    RULE_CC='	@echo compiling $<'
+    SHOW_CC='	@echo compiling $@'
+    ECHO_CC='@'
+ 
+  else
+    
+    ECHO_LT=''
+    ECHO_LD=''
+    RULE_CC='# compiling'
+    SHOW_CC='# compiling'
+    ECHO_CC=''
+
+  fi
+else
+  enableval=yes 
   
     ECHO_LT=''
     ECHO_LD=''
@@ -2714,7 +3837,7 @@ echo "$ac_t""$enableval" 1>&6
 
 ### use option --enable-prototypes to turn on optional prototypes
 echo $ac_n "checking if you want to compile with fallback prototypes""... $ac_c" 1>&6
-echo "configure:2718: checking if you want to compile with fallback prototypes" >&5
+echo "configure:3841: checking if you want to compile with fallback prototypes" >&5
 
 # Check whether --enable-prototypes or --disable-prototypes was given.
 if test "${enable_prototypes+set}" = set; then
@@ -2738,7 +3861,7 @@ EXTRA_CFLAGS=""
 if test -n "$GCC"
 then
 echo $ac_n "checking if you want to turn on gcc warnings""... $ac_c" 1>&6
-echo "configure:2742: checking if you want to turn on gcc warnings" >&5
+echo "configure:3865: checking if you want to turn on gcc warnings" >&5
 
 # Check whether --enable-warnings or --disable-warnings was given.
 if test "${enable_warnings+set}" = set; then
@@ -2764,22 +3887,101 @@ then
 GCC_VERSION=none
 if test "$GCC" = yes ; then
 	echo $ac_n "checking version of $CC""... $ac_c" 1>&6
-echo "configure:2768: checking version of $CC" >&5
-	GCC_VERSION="`${CC} --version|head -1 | sed -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
+echo "configure:3891: checking version of $CC" >&5
+	GCC_VERSION="`${CC} --version| sed -e '2,$d' -e 's/^.*(GCC) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`"
 	test -z "$GCC_VERSION" && GCC_VERSION=unknown
 	echo "$ac_t""$GCC_VERSION" 1>&6
 fi
 
 
 
-if ( test "$GCC" = yes || test "$GXX" = yes )
-then
-	cat > conftest.$ac_ext <<EOF
-#line 2779 "configure"
+
+INTEL_COMPILER=no
+
+if test "$GCC" = yes ; then
+	case $host_os in
+	linux*|gnu*)
+		echo $ac_n "checking if this is really Intel C compiler""... $ac_c" 1>&6
+echo "configure:3906: checking if this is really Intel C compiler" >&5
+		cf_save_CFLAGS="$CFLAGS"
+		CFLAGS="$CFLAGS -no-gcc"
+		cat > conftest.$ac_ext <<EOF
+#line 3910 "configure"
+#include "confdefs.h"
+
+int main() {
+
+#ifdef __INTEL_COMPILER
+#else
+make an error
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3922: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  INTEL_COMPILER=yes
+cf_save_CFLAGS="$cf_save_CFLAGS -we147 -no-gcc"
+
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+		CFLAGS="$cf_save_CFLAGS"
+		echo "$ac_t""$INTEL_COMPILER" 1>&6
+		;;
+	esac
+fi
+
+
+cat > conftest.$ac_ext <<EOF
+#line 3940 "configure"
 int main(int argc, char *argv[]) { return (argv[argc-1] == 0) ; }
 EOF
+
+if test "$INTEL_COMPILER" = yes
+then
+# The "-wdXXX" options suppress warnings:
+# remark #1419: external declaration in primary source file
+# remark #1682: implicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1683: explicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
+# remark #1684: conversion from pointer to same-sized integral type (potential portability problem)
+# remark #193: zero used for undefined preprocessing identifier
+# remark #593: variable "curs_sb_left_arrow" was set but never used
+# remark #810: conversion from "int" to "Dimension={unsigned short}" may lose significant bits
+# remark #869: parameter "tw" was never referenced
+# remark #981: operands are evaluated in unspecified order
+# warning #269: invalid format string conversion
+
+	echo "checking for $CC warning options" 1>&6
+echo "configure:3959: checking for $CC warning options" >&5
+	cf_save_CFLAGS="$CFLAGS"
+	EXTRA_CFLAGS="-Wall"
+	for cf_opt in  \
+		wd1419 \
+		wd1682 \
+		wd1683 \
+		wd1684 \
+		wd193 \
+		wd279 \
+		wd593 \
+		wd810 \
+		wd869 \
+		wd981
+	do
+		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
+		if { (eval echo configure:3975: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+			test -n "$verbose" && echo "$ac_t""... -$cf_opt" 1>&6
+			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
+		fi
+	done
+	CFLAGS="$cf_save_CFLAGS"
+
+elif test "$GCC" = yes
+then
 	echo "checking for $CC warning options" 1>&6
-echo "configure:2783: checking for $CC warning options" >&5
+echo "configure:3985: checking for $CC warning options" >&5
 	cf_save_CFLAGS="$CFLAGS"
 	EXTRA_CFLAGS="-W -Wall"
 	cf_warn_CONST=""
@@ -2795,10 +3997,10 @@ echo "configure:2783: checking for $CC w
 		Wpointer-arith \
 		Wshadow \
 		Wstrict-prototypes \
-		Wundef $cf_warn_CONST
+		Wundef $cf_warn_CONST 
 	do
 		CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt"
-		if { (eval echo configure:2802: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+		if { (eval echo configure:4004: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
 			test -n "$verbose" && echo "$ac_t""... -$cf_opt" 1>&6
 			case $cf_opt in #(vi
 			Wcast-qual) #(vi
@@ -2816,9 +4018,10 @@ echo "configure:2783: checking for $CC w
 			EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt"
 		fi
 	done
-	rm -f conftest*
 	CFLAGS="$cf_save_CFLAGS"
 fi
+rm -f conftest*
+
 
 
 fi
@@ -2828,7 +4031,7 @@ fi
 if test "$USE_SPOOLDIR" = "yes"; then
 	## options for directories
 	echo $ac_n "checking for news-library path""... $ac_c" 1>&6
-echo "configure:2832: checking for news-library path" >&5
+echo "configure:4035: checking for news-library path" >&5
 	
 # Check whether --with-libdir or --without-libdir was given.
 if test "${with_libdir+set}" = set; then
@@ -2866,7 +4069,7 @@ eval NEWSLIBDIR="$withval"
 	echo "$ac_t""$NEWSLIBDIR" 1>&6
 
 	echo $ac_n "checking for news spool-directory path""... $ac_c" 1>&6
-echo "configure:2870: checking for news spool-directory path" >&5
+echo "configure:4073: checking for news spool-directory path" >&5
 	
 # Check whether --with-spooldir or --without-spooldir was given.
 if test "${with_spooldir+set}" = set; then
@@ -2904,7 +4107,7 @@ eval SPOOLDIR="$withval"
 	echo "$ac_t""$SPOOLDIR" 1>&6
 
 	echo $ac_n "checking for news overview-directory path""... $ac_c" 1>&6
-echo "configure:2908: checking for news overview-directory path" >&5
+echo "configure:4111: checking for news overview-directory path" >&5
 	
 # Check whether --with-nov-dir or --without-nov-dir was given.
 if test "${with_nov_dir+set}" = set; then
@@ -2942,7 +4145,7 @@ eval NOVROOTDIR="$withval"
 	echo "$ac_t""$NOVROOTDIR" 1>&6
 
 	echo $ac_n "checking for overview filename""... $ac_c" 1>&6
-echo "configure:2946: checking for overview filename" >&5
+echo "configure:4149: checking for overview filename" >&5
 	
 # Check whether --with-nov-fname or --without-nov-fname was given.
 if test "${with_nov_fname+set}" = set; then
@@ -2978,7 +4181,7 @@ fi
 ## TODO: kick the --with-inews-dir= stuff, the check below should be enough
 ## (requires some code rework in tin)
 echo $ac_n "checking for directory containing \"inews\"""... $ac_c" 1>&6
-echo "configure:2982: checking for directory containing \"inews\"" >&5
+echo "configure:4185: checking for directory containing \"inews\"" >&5
 
 # Check whether --with-inews-dir or --without-inews-dir was given.
 if test "${with_inews_dir+set}" = set; then
@@ -3019,7 +4222,7 @@ echo "$ac_t""$INEWSDIR" 1>&6
 # Extract the first word of "inews", so it can be a program name with args.
 set dummy inews; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3023: checking for $ac_word" >&5
+echo "configure:4226: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_INEWS'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3076,7 +4279,7 @@ fi
 if test "$USE_SPOOLDIR" = "yes"; then
 	## options for libraries
 	echo $ac_n "checking for optional INN-NNTP library""... $ac_c" 1>&6
-echo "configure:3080: checking for optional INN-NNTP library" >&5
+echo "configure:4283: checking for optional INN-NNTP library" >&5
 	
 # Check whether --with-inn-nntplib or --without-inn-nntplib was given.
 if test "${with_inn_nntplib+set}" = set; then
@@ -3108,7 +4311,7 @@ fi
 ### Look for network libraries first, since some functions (such as gethostname)
 ### are used in a lot of places.
 echo $ac_n "checking if you want socks library""... $ac_c" 1>&6
-echo "configure:3112: checking if you want socks library" >&5
+echo "configure:4315: checking if you want socks library" >&5
 if eval "test \"`echo '$''{'cf_cv_use_libsocks'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3128,7 +4331,7 @@ fi
 echo "$ac_t""$cf_cv_use_libsocks" 1>&6
 
 echo $ac_n "checking if you want socks5 library""... $ac_c" 1>&6
-echo "configure:3132: checking if you want socks5 library" >&5
+echo "configure:4335: checking if you want socks5 library" >&5
 if eval "test \"`echo '$''{'cf_cv_use_libsocks5'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3204,7 +4407,7 @@ cat >> confdefs.h <<\EOF
 EOF
 
 cat > conftest.$ac_ext <<EOF
-#line 3208 "configure"
+#line 4411 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -3213,7 +4416,7 @@ int main() {
 	accept((char *)0)
 ; return 0; }
 EOF
-if { (eval echo configure:3217: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4420: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   :
 else
   echo "configure: failed program was:" >&5
@@ -3227,7 +4430,7 @@ else
 	
 cf_test_netlibs=no
 echo $ac_n "checking for network libraries""... $ac_c" 1>&6
-echo "configure:3231: checking for network libraries" >&5
+echo "configure:4434: checking for network libraries" >&5
 if eval "test \"`echo '$''{'cf_cv_netlibs'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3238,12 +4441,12 @@ cf_test_netlibs=yes
 for ac_func in gethostname
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3242: checking for $ac_func" >&5
+echo "configure:4445: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3247 "configure"
+#line 4450 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3266,7 +4469,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3270: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4473: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3289,7 +4492,7 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for gethostname in -lnsl""... $ac_c" 1>&6
-echo "configure:3293: checking for gethostname in -lnsl" >&5
+echo "configure:4496: checking for gethostname in -lnsl" >&5
 ac_lib_var=`echo nsl'_'gethostname | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3297,7 +4500,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl $cf_cv_netlibs $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3301 "configure"
+#line 4504 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3308,7 +4511,7 @@ int main() {
 gethostname()
 ; return 0; }
 EOF
-if { (eval echo configure:3312: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4515: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3341,7 +4544,7 @@ else
 	
 		
 echo $ac_n "checking for gethostname in -lsocket""... $ac_c" 1>&6
-echo "configure:3345: checking for gethostname in -lsocket" >&5
+echo "configure:4548: checking for gethostname in -lsocket" >&5
 ac_lib_var=`echo socket'_'gethostname | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3349,7 +4552,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket $cf_cv_netlibs $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3353 "configure"
+#line 4556 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3360,7 +4563,7 @@ int main() {
 gethostname()
 ; return 0; }
 EOF
-if { (eval echo configure:3364: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3405,7 +4608,7 @@ done
 # I don't know the entrypoints - 97/7/22 TD
 # AC_HAVE_LIBRARY(inet,cf_cv_netlibs="-linet $cf_cv_netlibs")
 echo $ac_n "checking for main in -linet""... $ac_c" 1>&6
-echo "configure:3409: checking for main in -linet" >&5
+echo "configure:4612: checking for main in -linet" >&5
 ac_lib_var=`echo inet'_'main | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3413,14 +4616,14 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-linet  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3417 "configure"
+#line 4620 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:3424: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4627: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3445,12 +4648,12 @@ if test "$ac_cv_func_lsocket" != no ; th
 for ac_func in socket
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3449: checking for $ac_func" >&5
+echo "configure:4652: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3454 "configure"
+#line 4657 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3473,7 +4676,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3477: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4680: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3496,7 +4699,7 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6
-echo "configure:3500: checking for socket in -lsocket" >&5
+echo "configure:4703: checking for socket in -lsocket" >&5
 ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3504,7 +4707,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket $cf_cv_netlibs $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3508 "configure"
+#line 4711 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3515,7 +4718,7 @@ int main() {
 socket()
 ; return 0; }
 EOF
-if { (eval echo configure:3519: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4722: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3548,7 +4751,7 @@ else
 	
 		
 echo $ac_n "checking for socket in -lbsd""... $ac_c" 1>&6
-echo "configure:3552: checking for socket in -lbsd" >&5
+echo "configure:4755: checking for socket in -lbsd" >&5
 ac_lib_var=`echo bsd'_'socket | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3556,7 +4759,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lbsd $cf_cv_netlibs $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3560 "configure"
+#line 4763 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3567,7 +4770,7 @@ int main() {
 socket()
 ; return 0; }
 EOF
-if { (eval echo configure:3571: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4774: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3612,12 +4815,12 @@ fi
 for ac_func in gethostbyname
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3616: checking for $ac_func" >&5
+echo "configure:4819: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3621 "configure"
+#line 4824 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3640,7 +4843,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3644: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4847: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3663,7 +4866,7 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:3667: checking for gethostbyname in -lnsl" >&5
+echo "configure:4870: checking for gethostbyname in -lnsl" >&5
 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3671,7 +4874,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl $cf_cv_netlibs $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3675 "configure"
+#line 4878 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3682,7 +4885,7 @@ int main() {
 gethostbyname()
 ; return 0; }
 EOF
-if { (eval echo configure:3686: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4889: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3723,12 +4926,12 @@ done
 for ac_func in strcasecmp
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3727: checking for $ac_func" >&5
+echo "configure:4930: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3732 "configure"
+#line 4935 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3751,7 +4954,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3755: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4958: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3774,7 +4977,7 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for strcasecmp in -lresolv""... $ac_c" 1>&6
-echo "configure:3778: checking for strcasecmp in -lresolv" >&5
+echo "configure:4981: checking for strcasecmp in -lresolv" >&5
 ac_lib_var=`echo resolv'_'strcasecmp | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3782,7 +4985,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lresolv $cf_cv_netlibs $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3786 "configure"
+#line 4989 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3793,7 +4996,7 @@ int main() {
 strcasecmp()
 ; return 0; }
 EOF
-if { (eval echo configure:3797: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5000: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3865,10 +5068,10 @@ cat >> confdefs.h <<\EOF
 EOF
 
 echo $ac_n "checking if the socks library uses socks4 prefix""... $ac_c" 1>&6
-echo "configure:3869: checking if the socks library uses socks4 prefix" >&5
+echo "configure:5072: checking if the socks library uses socks4 prefix" >&5
 cf_use_socks4=error
 cat > conftest.$ac_ext <<EOF
-#line 3872 "configure"
+#line 5075 "configure"
 #include "confdefs.h"
 
 #include <socks.h>
@@ -3877,7 +5080,7 @@ int main() {
 	Rinit((char *)0)
 ; return 0; }
 EOF
-if { (eval echo configure:3881: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5084: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cat >> confdefs.h <<\EOF
 #define USE_SOCKS4_PREFIX 1
@@ -3889,14 +5092,14 @@ else
   cat conftest.$ac_ext >&5
   rm -rf conftest*
   cat > conftest.$ac_ext <<EOF
-#line 3893 "configure"
+#line 5096 "configure"
 #include "confdefs.h"
 #include <socks.h>
 int main() {
 SOCKSinit((char *)0)
 ; return 0; }
 EOF
-if { (eval echo configure:3900: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5103: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_use_socks4=no
 else
@@ -3961,9 +5164,9 @@ EOF
 
 fi
 echo $ac_n "checking if socks5p.h is available""... $ac_c" 1>&6
-echo "configure:3965: checking if socks5p.h is available" >&5
+echo "configure:5168: checking if socks5p.h is available" >&5
 cat > conftest.$ac_ext <<EOF
-#line 3967 "configure"
+#line 5170 "configure"
 #include "confdefs.h"
 
 #define INCLUDE_PROTOTYPES
@@ -3973,7 +5176,7 @@ int main() {
 	init((char *)0)
 ; return 0; }
 EOF
-if { (eval echo configure:3977: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5180: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_use_socks5p_h=yes
 else
@@ -3999,17 +5202,17 @@ for ac_hdr in unistd.h fcntl.h sys/file.
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4003: checking for $ac_hdr" >&5
+echo "configure:5206: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4008 "configure"
+#line 5211 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4013: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5216: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4036,12 +5239,12 @@ fi
 done
 
 echo $ac_n "checking for fcntl""... $ac_c" 1>&6
-echo "configure:4040: checking for fcntl" >&5
+echo "configure:5243: checking for fcntl" >&5
 if eval "test \"`echo '$''{'ac_cv_func_fcntl'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4045 "configure"
+#line 5248 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char fcntl(); below.  */
@@ -4064,7 +5267,7 @@ fcntl();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4068: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5271: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_fcntl=yes"
 else
@@ -4084,12 +5287,12 @@ else
 fi
 
 echo $ac_n "checking for lockf""... $ac_c" 1>&6
-echo "configure:4088: checking for lockf" >&5
+echo "configure:5291: checking for lockf" >&5
 if eval "test \"`echo '$''{'ac_cv_func_lockf'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4093 "configure"
+#line 5296 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char lockf(); below.  */
@@ -4112,7 +5315,7 @@ lockf();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4116: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5319: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_lockf=yes"
 else
@@ -4132,12 +5335,12 @@ else
 fi
 
 echo $ac_n "checking for flock""... $ac_c" 1>&6
-echo "configure:4136: checking for flock" >&5
+echo "configure:5339: checking for flock" >&5
 if eval "test \"`echo '$''{'ac_cv_func_flock'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4141 "configure"
+#line 5344 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char flock(); below.  */
@@ -4160,7 +5363,7 @@ flock();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4164: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5367: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_flock=yes"
 else
@@ -4181,7 +5384,7 @@ fi
 
 
 echo $ac_n "checking for file-locking functions""... $ac_c" 1>&6
-echo "configure:4185: checking for file-locking functions" >&5
+echo "configure:5388: checking for file-locking functions" >&5
 if eval "test \"`echo '$''{'cf_cv_lockfile'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4193,7 +5396,7 @@ if eval 'test ${ac_cv_func_'$cf_lock'+se
 	case $cf_lock in #(vi
 	fcntl) #(vi
 		cat > conftest.$ac_ext <<EOF
-#line 4197 "configure"
+#line 5400 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -4221,7 +5424,7 @@ int main() {
 	
 ; return 0; }
 EOF
-if { (eval echo configure:4225: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5428: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   :
 else
   echo "configure: failed program was:" >&5
@@ -4233,7 +5436,7 @@ rm -f conftest*
 		;;
 	lockf) #(vi
 		cat > conftest.$ac_ext <<EOF
-#line 4237 "configure"
+#line 5440 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -4253,7 +5456,7 @@ int main() {
 	
 ; return 0; }
 EOF
-if { (eval echo configure:4257: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5460: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   :
 else
   echo "configure: failed program was:" >&5
@@ -4265,7 +5468,7 @@ rm -f conftest*
 		;;
 	flock)
 		cat > conftest.$ac_ext <<EOF
-#line 4269 "configure"
+#line 5472 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -4288,7 +5491,7 @@ int main() {
 	
 ; return 0; }
 EOF
-if { (eval echo configure:4292: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5495: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   :
 else
   echo "configure: failed program was:" >&5
@@ -4309,7 +5512,7 @@ echo "$ac_t""$cf_cv_lockfile" 1>&6
 
 
 echo $ac_n "checking which locking method should be used""... $ac_c" 1>&6
-echo "configure:4313: checking which locking method should be used" >&5
+echo "configure:5516: checking which locking method should be used" >&5
 ### fcntl() is preferred, if the user just disables fcntl()
 ### without specifying an alternative lockf() is preferred
 
@@ -4378,7 +5581,7 @@ fi
 
 
 echo $ac_n "checking for screen type""... $ac_c" 1>&6
-echo "configure:4382: checking for screen type" >&5
+echo "configure:5585: checking for screen type" >&5
 
 # Check whether --with-screen or --without-screen was given.
 if test "${with_screen+set}" = set; then
@@ -4394,7 +5597,7 @@ use_curses=no
 use_ncurses=no
 
 echo $ac_n "checking if you specified curses install-directory""... $ac_c" 1>&6
-echo "configure:4398: checking if you specified curses install-directory" >&5
+echo "configure:5601: checking if you specified curses install-directory" >&5
 
 
 # Check whether --with-curses-dir or --without-curses-dir was given.
@@ -4451,7 +5654,7 @@ pdcurses) #(vi
 	;;
 none)
 	echo $ac_n "checking if you want to use ncurses library""... $ac_c" 1>&6
-echo "configure:4455: checking if you want to use ncurses library" >&5
+echo "configure:5658: checking if you want to use ncurses library" >&5
 	
 # Check whether --with-ncurses or --without-ncurses was given.
 if test "${with_ncurses+set}" = set; then
@@ -4464,7 +5667,7 @@ fi
 	echo "$ac_t""$use_ncurses" 1>&6
 
 	echo $ac_n "checking if you want curses rather than termcap interface""... $ac_c" 1>&6
-echo "configure:4468: checking if you want curses rather than termcap interface" >&5
+echo "configure:5671: checking if you want curses rather than termcap interface" >&5
 	
 # Check whether --enable-curses or --disable-curses was given.
 if test "${enable_curses+set}" = set; then
@@ -4501,7 +5704,7 @@ test "$cf_cv_curses_dir" != "no" && \
 CPPFLAGS="-I$cf_cv_curses_dir/include -I$cf_cv_curses_dir/include/$cf_ncuhdr_root $CPPFLAGS"
 
 echo $ac_n "checking for $cf_ncuhdr_root header in include-path""... $ac_c" 1>&6
-echo "configure:4505: checking for $cf_ncuhdr_root header in include-path" >&5
+echo "configure:5708: checking for $cf_ncuhdr_root header in include-path" >&5
 if eval "test \"`echo '$''{'cf_cv_ncurses_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4512,7 +5715,7 @@ else
 	do
 		
 	cat > conftest.$ac_ext <<EOF
-#line 4516 "configure"
+#line 5719 "configure"
 #include "confdefs.h"
 
 
@@ -4533,7 +5736,7 @@ printf("old\n");
 	
 ; return 0; }
 EOF
-if { (eval echo configure:4537: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5740: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_ncurses_h=$cf_header
 	
@@ -4556,7 +5759,7 @@ if test "$cf_cv_ncurses_h" != no ; then
 	cf_cv_ncurses_header=$cf_cv_ncurses_h
 else
 echo $ac_n "checking for $cf_ncuhdr_root include-path""... $ac_c" 1>&6
-echo "configure:4560: checking for $cf_ncuhdr_root include-path" >&5
+echo "configure:5763: checking for $cf_ncuhdr_root include-path" >&5
 if eval "test \"`echo '$''{'cf_cv_ncurses_h2'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4651,14 +5854,14 @@ do
 				cf_save_CPPFLAGS="$CPPFLAGS"
 				CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
 				cat > conftest.$ac_ext <<EOF
-#line 4655 "configure"
+#line 5858 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 int main() {
 printf("Hello")
 ; return 0; }
 EOF
-if { (eval echo configure:4662: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5865: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   :
 else
   echo "configure: failed program was:" >&5
@@ -4685,7 +5888,7 @@ done
 		do
 			
 	cat > conftest.$ac_ext <<EOF
-#line 4689 "configure"
+#line 5892 "configure"
 #include "confdefs.h"
 
 
@@ -4706,7 +5909,7 @@ printf("old\n");
 	
 ; return 0; }
 EOF
-if { (eval echo configure:4710: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5913: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_ncurses_h2=$cf_header
 	
@@ -4753,14 +5956,14 @@ do
 				cf_save_CPPFLAGS="$CPPFLAGS"
 				CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
 				cat > conftest.$ac_ext <<EOF
-#line 4757 "configure"
+#line 5960 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 int main() {
 printf("Hello")
 ; return 0; }
 EOF
-if { (eval echo configure:4764: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5967: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   :
 else
   echo "configure: failed program was:" >&5
@@ -4815,7 +6018,7 @@ esac
 
 
 echo $ac_n "checking for ncurses version""... $ac_c" 1>&6
-echo "configure:4819: checking for ncurses version" >&5
+echo "configure:6022: checking for ncurses version" >&5
 if eval "test \"`echo '$''{'cf_cv_ncurses_version'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4841,7 +6044,7 @@ Autoconf "old"
 #endif
 EOF
 	cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
-	{ (eval echo configure:4845: \"$cf_try\") 1>&5; (eval $cf_try) 2>&5; }
+	{ (eval echo configure:6048: \"$cf_try\") 1>&5; (eval $cf_try) 2>&5; }
 	if test -f conftest.out ; then
 		cf_out=`cat conftest.out | sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%'`
 		test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
@@ -4850,7 +6053,7 @@ EOF
 
 else
   cat > conftest.$ac_ext <<EOF
-#line 4854 "configure"
+#line 6057 "configure"
 #include "confdefs.h"
 
 #include <${cf_cv_ncurses_header-curses.h}>
@@ -4874,7 +6077,7 @@ int main()
 	exit(0);
 }
 EOF
-if { (eval echo configure:4878: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6081: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   
 	cf_cv_ncurses_version=`cat $cf_tempfile`
@@ -4905,7 +6108,7 @@ cf_nculib_root=ncurses
 cf_ncurses_LIBS=""
 cf_ncurses_SAVE="$LIBS"
 echo $ac_n "checking for Gpm_Open in -lgpm""... $ac_c" 1>&6
-echo "configure:4909: checking for Gpm_Open in -lgpm" >&5
+echo "configure:6112: checking for Gpm_Open in -lgpm" >&5
 ac_lib_var=`echo gpm'_'Gpm_Open | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4913,7 +6116,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lgpm  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4917 "configure"
+#line 6120 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4924,7 +6127,7 @@ int main() {
 Gpm_Open()
 ; return 0; }
 EOF
-if { (eval echo configure:4928: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6131: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4940,7 +6143,7 @@ fi
 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   echo $ac_n "checking for initscr in -lgpm""... $ac_c" 1>&6
-echo "configure:4944: checking for initscr in -lgpm" >&5
+echo "configure:6147: checking for initscr in -lgpm" >&5
 ac_lib_var=`echo gpm'_'initscr | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4948,7 +6151,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lgpm  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4952 "configure"
+#line 6155 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4959,7 +6162,7 @@ int main() {
 initscr()
 ; return 0; }
 EOF
-if { (eval echo configure:4963: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6166: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4989,8 +6192,9 @@ case $host_os in #(vi
 freebsd*)
 	# This is only necessary if you are linking against an obsolete
 	# version of ncurses (but it should do no harm, since it's static).
-	echo $ac_n "checking for tgoto in -lmytinfo""... $ac_c" 1>&6
-echo "configure:4994: checking for tgoto in -lmytinfo" >&5
+	if test "$cf_nculib_root" = ncurses ; then
+		echo $ac_n "checking for tgoto in -lmytinfo""... $ac_c" 1>&6
+echo "configure:6198: checking for tgoto in -lmytinfo" >&5
 ac_lib_var=`echo mytinfo'_'tgoto | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4998,7 +6202,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lmytinfo  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5002 "configure"
+#line 6206 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5009,7 +6213,7 @@ int main() {
 tgoto()
 ; return 0; }
 EOF
-if { (eval echo configure:5013: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6217: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5029,6 +6233,7 @@ else
   echo "$ac_t""no" 1>&6
 fi
 
+	fi
 	;;
 esac
 
@@ -5042,12 +6247,12 @@ else
 	eval 'cf_cv_have_lib_'$cf_nculib_root'=no'
 	cf_libdir=""
 	echo $ac_n "checking for initscr""... $ac_c" 1>&6
-echo "configure:5046: checking for initscr" >&5
+echo "configure:6251: checking for initscr" >&5
 if eval "test \"`echo '$''{'ac_cv_func_initscr'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5051 "configure"
+#line 6256 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char initscr(); below.  */
@@ -5070,7 +6275,7 @@ initscr();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5074: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6279: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_initscr=yes"
 else
@@ -5090,17 +6295,17 @@ else
 
 		cf_save_LIBS="$LIBS"
 		echo $ac_n "checking for initscr in -l$cf_nculib_root""... $ac_c" 1>&6
-echo "configure:5094: checking for initscr in -l$cf_nculib_root" >&5
+echo "configure:6299: checking for initscr in -l$cf_nculib_root" >&5
 		LIBS="-l$cf_nculib_root $LIBS"
 		cat > conftest.$ac_ext <<EOF
-#line 5097 "configure"
+#line 6302 "configure"
 #include "confdefs.h"
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 initscr()
 ; return 0; }
 EOF
-if { (eval echo configure:5104: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 			 eval 'cf_cv_have_lib_'$cf_nculib_root'=yes'
@@ -5169,17 +6374,17 @@ test -d /usr && {
 			for cf_libdir in $cf_search
 			do
 				echo $ac_n "checking for -l$cf_nculib_root in $cf_libdir""... $ac_c" 1>&6
-echo "configure:5173: checking for -l$cf_nculib_root in $cf_libdir" >&5
+echo "configure:6378: checking for -l$cf_nculib_root in $cf_libdir" >&5
 				LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS"
 				cat > conftest.$ac_ext <<EOF
-#line 5176 "configure"
+#line 6381 "configure"
 #include "confdefs.h"
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 initscr()
 ; return 0; }
 EOF
-if { (eval echo configure:5183: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6388: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 			 		 eval 'cf_cv_have_lib_'$cf_nculib_root'=yes'
@@ -5210,7 +6415,7 @@ fi
 
 if test -n "$cf_ncurses_LIBS" ; then
 	echo $ac_n "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS""... $ac_c" 1>&6
-echo "configure:5214: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
+echo "configure:6419: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
 	cf_ncurses_SAVE="$LIBS"
 	for p in $cf_ncurses_LIBS ; do
 		q=`echo $LIBS | sed -e "s%$p %%" -e "s%$p$%%"`
@@ -5219,14 +6424,14 @@ echo "configure:5214: checking if we can
 		fi
 	done
 	cat > conftest.$ac_ext <<EOF
-#line 5223 "configure"
+#line 6428 "configure"
 #include "confdefs.h"
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 initscr(); mousemask(0,0); tgoto((char *)0, 0, 0);
 ; return 0; }
 EOF
-if { (eval echo configure:5230: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 else
@@ -5253,9 +6458,9 @@ EOF
 for cf_hdr in stdlib.h wchar.h wctype.h
 do
 	echo $ac_n "checking for $cf_hdr""... $ac_c" 1>&6
-echo "configure:5257: checking for $cf_hdr" >&5
+echo "configure:6462: checking for $cf_hdr" >&5
 	cat > conftest.$ac_ext <<EOF
-#line 5259 "configure"
+#line 6464 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -5263,7 +6468,7 @@ echo "configure:5257: checking for $cf_h
 
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5267: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6472: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5290,12 +6495,12 @@ done
 
 		
   echo $ac_n "checking for wide char and multibyte support""... $ac_c" 1>&6
-echo "configure:5294: checking for wide char and multibyte support" >&5
+echo "configure:6499: checking for wide char and multibyte support" >&5
 if eval "test \"`echo '$''{'am_cv_multibyte_able'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5299 "configure"
+#line 6504 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 #ifdef HAVE_STDLIB_H
@@ -5331,7 +6536,7 @@ char icb[5] = {0xa4, 0xa4, 0xa4, 0xe5, 0
       wcsncat(wcb2, wcb, 5);
 ; return 0; }
 EOF
-if { (eval echo configure:5335: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6540: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   am_cv_multibyte_able=yes
 else
@@ -5341,7 +6546,7 @@ else
   cf_save_LIBS="$LIBS"
       LIBS="-lutf8 $LIBS"
       cat > conftest.$ac_ext <<EOF
-#line 5345 "configure"
+#line 6550 "configure"
 #include "confdefs.h"
 #include <libutf8.h>
 int main() {
@@ -5367,34 +6572,37 @@ char icb[5] = {0xa4, 0xa4, 0xa4, 0xe5, 0
         wcsncat(wcb2, wcb, 5);
 ; return 0; }
 EOF
-if { (eval echo configure:5371: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6576: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  am_cv_multibyte_able=yes
-         cat >> confdefs.h <<\EOF
-#define HAVE_LIBUTF8_H 1
-EOF
-
+  am_cv_multibyte_able=libutf8
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
   am_cv_multibyte_able=no
-         LIBS="$cf_save_LIBS"
 fi
 rm -f conftest*
+      LIBS="$cf_save_LIBS"
    
 fi
 rm -f conftest*
-  if test $am_cv_multibyte_able = yes; then
+  
+fi
+
+echo "$ac_t""$am_cv_multibyte_able" 1>&6
+  if test "$am_cv_multibyte_able" != no; then
+    if test "$am_cv_multibyte_able" = libutf8; then
+      cat >> confdefs.h <<\EOF
+#define HAVE_LIBUTF8_H 1
+EOF
+
+      LIBS="-lutf8 $LIBS"
+    fi
     cat >> confdefs.h <<\EOF
 #define MULTIBYTE_ABLE 1
 EOF
 
   fi
-  
-fi
-
-echo "$ac_t""$am_cv_multibyte_able" 1>&6
 
 		
 
@@ -5405,7 +6613,7 @@ test "$cf_cv_curses_dir" != "no" && \
 CPPFLAGS="-I$cf_cv_curses_dir/include -I$cf_cv_curses_dir/include/$cf_ncuhdr_root $CPPFLAGS"
 
 echo $ac_n "checking for $cf_ncuhdr_root header in include-path""... $ac_c" 1>&6
-echo "configure:5409: checking for $cf_ncuhdr_root header in include-path" >&5
+echo "configure:6617: checking for $cf_ncuhdr_root header in include-path" >&5
 if eval "test \"`echo '$''{'cf_cv_ncurses_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5416,7 +6624,7 @@ else
 	do
 		
 	cat > conftest.$ac_ext <<EOF
-#line 5420 "configure"
+#line 6628 "configure"
 #include "confdefs.h"
 
 
@@ -5445,7 +6653,7 @@ printf("old\n");
 	
 ; return 0; }
 EOF
-if { (eval echo configure:5449: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6657: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_ncurses_h=$cf_header
 	
@@ -5468,7 +6676,7 @@ if test "$cf_cv_ncurses_h" != no ; then
 	cf_cv_ncurses_header=$cf_cv_ncurses_h
 else
 echo $ac_n "checking for $cf_ncuhdr_root include-path""... $ac_c" 1>&6
-echo "configure:5472: checking for $cf_ncuhdr_root include-path" >&5
+echo "configure:6680: checking for $cf_ncuhdr_root include-path" >&5
 if eval "test \"`echo '$''{'cf_cv_ncurses_h2'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5563,14 +6771,14 @@ do
 				cf_save_CPPFLAGS="$CPPFLAGS"
 				CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
 				cat > conftest.$ac_ext <<EOF
-#line 5567 "configure"
+#line 6775 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 int main() {
 printf("Hello")
 ; return 0; }
 EOF
-if { (eval echo configure:5574: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6782: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   :
 else
   echo "configure: failed program was:" >&5
@@ -5597,7 +6805,7 @@ done
 		do
 			
 	cat > conftest.$ac_ext <<EOF
-#line 5601 "configure"
+#line 6809 "configure"
 #include "confdefs.h"
 
 
@@ -5626,7 +6834,7 @@ printf("old\n");
 	
 ; return 0; }
 EOF
-if { (eval echo configure:5630: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6838: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_ncurses_h2=$cf_header
 	
@@ -5673,14 +6881,14 @@ do
 				cf_save_CPPFLAGS="$CPPFLAGS"
 				CPPFLAGS="$CPPFLAGS -I$cf_add_incdir"
 				cat > conftest.$ac_ext <<EOF
-#line 5677 "configure"
+#line 6885 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 int main() {
 printf("Hello")
 ; return 0; }
 EOF
-if { (eval echo configure:5684: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:6892: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   :
 else
   echo "configure: failed program was:" >&5
@@ -5735,7 +6943,7 @@ esac
 
 
 echo $ac_n "checking for ncurses version""... $ac_c" 1>&6
-echo "configure:5739: checking for ncurses version" >&5
+echo "configure:6947: checking for ncurses version" >&5
 if eval "test \"`echo '$''{'cf_cv_ncurses_version'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5761,7 +6969,7 @@ Autoconf "old"
 #endif
 EOF
 	cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
-	{ (eval echo configure:5765: \"$cf_try\") 1>&5; (eval $cf_try) 2>&5; }
+	{ (eval echo configure:6973: \"$cf_try\") 1>&5; (eval $cf_try) 2>&5; }
 	if test -f conftest.out ; then
 		cf_out=`cat conftest.out | sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%'`
 		test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
@@ -5770,7 +6978,7 @@ EOF
 
 else
   cat > conftest.$ac_ext <<EOF
-#line 5774 "configure"
+#line 6982 "configure"
 #include "confdefs.h"
 
 #include <${cf_cv_ncurses_header-curses.h}>
@@ -5794,7 +7002,7 @@ int main()
 	exit(0);
 }
 EOF
-if { (eval echo configure:5798: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:7006: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   
 	cf_cv_ncurses_version=`cat $cf_tempfile`
@@ -5825,7 +7033,7 @@ cf_nculib_root=ncursesw
 cf_ncurses_LIBS=""
 cf_ncurses_SAVE="$LIBS"
 echo $ac_n "checking for Gpm_Open in -lgpm""... $ac_c" 1>&6
-echo "configure:5829: checking for Gpm_Open in -lgpm" >&5
+echo "configure:7037: checking for Gpm_Open in -lgpm" >&5
 ac_lib_var=`echo gpm'_'Gpm_Open | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5833,7 +7041,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lgpm  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5837 "configure"
+#line 7045 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5844,7 +7052,7 @@ int main() {
 Gpm_Open()
 ; return 0; }
 EOF
-if { (eval echo configure:5848: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7056: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5860,7 +7068,7 @@ fi
 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   echo $ac_n "checking for initscr in -lgpm""... $ac_c" 1>&6
-echo "configure:5864: checking for initscr in -lgpm" >&5
+echo "configure:7072: checking for initscr in -lgpm" >&5
 ac_lib_var=`echo gpm'_'initscr | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5868,7 +7076,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lgpm  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5872 "configure"
+#line 7080 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5879,7 +7087,7 @@ int main() {
 initscr()
 ; return 0; }
 EOF
-if { (eval echo configure:5883: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7091: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5909,8 +7117,9 @@ case $host_os in #(vi
 freebsd*)
 	# This is only necessary if you are linking against an obsolete
 	# version of ncurses (but it should do no harm, since it's static).
-	echo $ac_n "checking for tgoto in -lmytinfo""... $ac_c" 1>&6
-echo "configure:5914: checking for tgoto in -lmytinfo" >&5
+	if test "$cf_nculib_root" = ncurses ; then
+		echo $ac_n "checking for tgoto in -lmytinfo""... $ac_c" 1>&6
+echo "configure:7123: checking for tgoto in -lmytinfo" >&5
 ac_lib_var=`echo mytinfo'_'tgoto | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5918,7 +7127,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lmytinfo  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5922 "configure"
+#line 7131 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5929,7 +7138,7 @@ int main() {
 tgoto()
 ; return 0; }
 EOF
-if { (eval echo configure:5933: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7142: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5949,6 +7158,7 @@ else
   echo "$ac_t""no" 1>&6
 fi
 
+	fi
 	;;
 esac
 
@@ -5962,12 +7172,12 @@ else
 	eval 'cf_cv_have_lib_'$cf_nculib_root'=no'
 	cf_libdir=""
 	echo $ac_n "checking for initscr""... $ac_c" 1>&6
-echo "configure:5966: checking for initscr" >&5
+echo "configure:7176: checking for initscr" >&5
 if eval "test \"`echo '$''{'ac_cv_func_initscr'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5971 "configure"
+#line 7181 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char initscr(); below.  */
@@ -5990,7 +7200,7 @@ initscr();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5994: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7204: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_initscr=yes"
 else
@@ -6010,17 +7220,17 @@ else
 
 		cf_save_LIBS="$LIBS"
 		echo $ac_n "checking for initscr in -l$cf_nculib_root""... $ac_c" 1>&6
-echo "configure:6014: checking for initscr in -l$cf_nculib_root" >&5
+echo "configure:7224: checking for initscr in -l$cf_nculib_root" >&5
 		LIBS="-l$cf_nculib_root $LIBS"
 		cat > conftest.$ac_ext <<EOF
-#line 6017 "configure"
+#line 7227 "configure"
 #include "confdefs.h"
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 initscr()
 ; return 0; }
 EOF
-if { (eval echo configure:6024: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7234: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 			 eval 'cf_cv_have_lib_'$cf_nculib_root'=yes'
@@ -6089,17 +7299,17 @@ test -d /usr && {
 			for cf_libdir in $cf_search
 			do
 				echo $ac_n "checking for -l$cf_nculib_root in $cf_libdir""... $ac_c" 1>&6
-echo "configure:6093: checking for -l$cf_nculib_root in $cf_libdir" >&5
+echo "configure:7303: checking for -l$cf_nculib_root in $cf_libdir" >&5
 				LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS"
 				cat > conftest.$ac_ext <<EOF
-#line 6096 "configure"
+#line 7306 "configure"
 #include "confdefs.h"
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 initscr()
 ; return 0; }
 EOF
-if { (eval echo configure:6103: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7313: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 			 		 eval 'cf_cv_have_lib_'$cf_nculib_root'=yes'
@@ -6130,7 +7340,7 @@ fi
 
 if test -n "$cf_ncurses_LIBS" ; then
 	echo $ac_n "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS""... $ac_c" 1>&6
-echo "configure:6134: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
+echo "configure:7344: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5
 	cf_ncurses_SAVE="$LIBS"
 	for p in $cf_ncurses_LIBS ; do
 		q=`echo $LIBS | sed -e "s%$p %%" -e "s%$p$%%"`
@@ -6139,14 +7349,14 @@ echo "configure:6134: checking if we can
 		fi
 	done
 	cat > conftest.$ac_ext <<EOF
-#line 6143 "configure"
+#line 7353 "configure"
 #include "confdefs.h"
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 initscr(); mousemask(0,0); tgoto((char *)0, 0, 0);
 ; return 0; }
 EOF
-if { (eval echo configure:6150: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7360: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 else
@@ -6169,7 +7379,7 @@ EOF
 
 		
 echo $ac_n "checking for ncurses version""... $ac_c" 1>&6
-echo "configure:6173: checking for ncurses version" >&5
+echo "configure:7383: checking for ncurses version" >&5
 if eval "test \"`echo '$''{'cf_cv_ncurses_version'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6195,7 +7405,7 @@ Autoconf "old"
 #endif
 EOF
 	cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
-	{ (eval echo configure:6199: \"$cf_try\") 1>&5; (eval $cf_try) 2>&5; }
+	{ (eval echo configure:7409: \"$cf_try\") 1>&5; (eval $cf_try) 2>&5; }
 	if test -f conftest.out ; then
 		cf_out=`cat conftest.out | sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%'`
 		test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
@@ -6204,7 +7414,7 @@ EOF
 
 else
   cat > conftest.$ac_ext <<EOF
-#line 6208 "configure"
+#line 7418 "configure"
 #include "confdefs.h"
 
 #include <${cf_cv_ncurses_header-curses.h}>
@@ -6228,7 +7438,7 @@ int main()
 	exit(0);
 }
 EOF
-if { (eval echo configure:6232: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:7442: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   
 	cf_cv_ncurses_version=`cat $cf_tempfile`
@@ -6251,23 +7461,25 @@ EOF
 
 		
 echo $ac_n "checking if we must define _XOPEN_SOURCE_EXTENDED""... $ac_c" 1>&6
-echo "configure:6255: checking if we must define _XOPEN_SOURCE_EXTENDED" >&5
+echo "configure:7465: checking if we must define _XOPEN_SOURCE_EXTENDED" >&5
 if eval "test \"`echo '$''{'cf_cv_need_xopen_extension'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 cat > conftest.$ac_ext <<EOF
-#line 6261 "configure"
+#line 7471 "configure"
 #include "confdefs.h"
 
 #include <stdlib.h>
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 
-	long x = winnstr(stdscr, "", 0)
+	long x = winnstr(stdscr, "", 0);
+	int x1, y1;
+	getbegyx(stdscr, y1, x1)
 ; return 0; }
 EOF
-if { (eval echo configure:6271: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7483: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_need_xopen_extension=no
 else
@@ -6275,7 +7487,7 @@ else
   cat conftest.$ac_ext >&5
   rm -rf conftest*
   cat > conftest.$ac_ext <<EOF
-#line 6279 "configure"
+#line 7491 "configure"
 #include "confdefs.h"
 
 #define _XOPEN_SOURCE_EXTENDED
@@ -6283,10 +7495,12 @@ else
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 
-	long x = winnstr(stdscr, "", 0)
+	long x = winnstr(stdscr, "", 0);
+	int x1, y1;
+	getbegyx(stdscr, y1, x1)
 ; return 0; }
 EOF
-if { (eval echo configure:6290: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7504: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_need_xopen_extension=yes
 else
@@ -6309,7 +7523,7 @@ test $cf_cv_need_xopen_extension = yes &
 		
 
 echo $ac_n "checking for extra include directories""... $ac_c" 1>&6
-echo "configure:6313: checking for extra include directories" >&5
+echo "configure:7527: checking for extra include directories" >&5
 if eval "test \"`echo '$''{'cf_cv_curses_incdir'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6333,7 +7547,7 @@ echo "$ac_t""$cf_cv_curses_incdir" 1>&6
 test "$cf_cv_curses_incdir" != no && CPPFLAGS="$cf_cv_curses_incdir $CPPFLAGS"
 
 echo $ac_n "checking if we have identified curses headers""... $ac_c" 1>&6
-echo "configure:6337: checking if we have identified curses headers" >&5
+echo "configure:7551: checking if we have identified curses headers" >&5
 if eval "test \"`echo '$''{'cf_cv_ncurses_header'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6346,14 +7560,14 @@ for cf_header in \
 	ncurses/ncurses.h
 do
 cat > conftest.$ac_ext <<EOF
-#line 6350 "configure"
+#line 7564 "configure"
 #include "confdefs.h"
 #include <${cf_header}>
 int main() {
 initscr(); tgoto("?", 0,0)
 ; return 0; }
 EOF
-if { (eval echo configure:6357: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7571: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_ncurses_header=$cf_header; break
 else
@@ -6376,17 +7590,17 @@ for ac_hdr in $cf_cv_ncurses_header
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6380: checking for $ac_hdr" >&5
+echo "configure:7594: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6385 "configure"
+#line 7599 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6390: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7604: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6417,16 +7631,16 @@ done
 		
 
 echo $ac_n "checking if we have identified curses libraries""... $ac_c" 1>&6
-echo "configure:6421: checking if we have identified curses libraries" >&5
+echo "configure:7635: checking if we have identified curses libraries" >&5
 cat > conftest.$ac_ext <<EOF
-#line 6423 "configure"
+#line 7637 "configure"
 #include "confdefs.h"
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 initscr(); tgoto("?", 0,0)
 ; return 0; }
 EOF
-if { (eval echo configure:6430: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7644: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_result=yes
 else
@@ -6442,7 +7656,7 @@ if test "$cf_result" = no ; then
 case $host_os in #(vi
 freebsd*) #(vi
 	echo $ac_n "checking for tgoto in -lmytinfo""... $ac_c" 1>&6
-echo "configure:6446: checking for tgoto in -lmytinfo" >&5
+echo "configure:7660: checking for tgoto in -lmytinfo" >&5
 ac_lib_var=`echo mytinfo'_'tgoto | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -6450,7 +7664,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lmytinfo  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6454 "configure"
+#line 7668 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6461,7 +7675,7 @@ int main() {
 tgoto()
 ; return 0; }
 EOF
-if { (eval echo configure:6465: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7679: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6484,7 +7698,7 @@ fi
 	;;
 hpux10.*|hpux11.*) #(vi
 	echo $ac_n "checking for initscr in -lcur_colr""... $ac_c" 1>&6
-echo "configure:6488: checking for initscr in -lcur_colr" >&5
+echo "configure:7702: checking for initscr in -lcur_colr" >&5
 ac_lib_var=`echo cur_colr'_'initscr | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -6492,7 +7706,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lcur_colr  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6496 "configure"
+#line 7710 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6503,7 +7717,7 @@ int main() {
 initscr()
 ; return 0; }
 EOF
-if { (eval echo configure:6507: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7721: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6526,7 +7740,7 @@ else
   echo "$ac_t""no" 1>&6
 
 	echo $ac_n "checking for initscr in -lHcurses""... $ac_c" 1>&6
-echo "configure:6530: checking for initscr in -lHcurses" >&5
+echo "configure:7744: checking for initscr in -lHcurses" >&5
 ac_lib_var=`echo Hcurses'_'initscr | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -6534,7 +7748,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lHcurses  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6538 "configure"
+#line 7752 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6545,7 +7759,7 @@ int main() {
 initscr()
 ; return 0; }
 EOF
-if { (eval echo configure:6549: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7763: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6598,12 +7812,12 @@ if test ".$ac_cv_func_initscr" != .yes ;
 	# Check for library containing tgoto.  Do this before curses library
 	# because it may be needed to link the test-case for initscr.
 	echo $ac_n "checking for tgoto""... $ac_c" 1>&6
-echo "configure:6602: checking for tgoto" >&5
+echo "configure:7816: checking for tgoto" >&5
 if eval "test \"`echo '$''{'ac_cv_func_tgoto'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6607 "configure"
+#line 7821 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char tgoto(); below.  */
@@ -6626,7 +7840,7 @@ tgoto();
 
 ; return 0; }
 EOF
-if { (eval echo configure:6630: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7844: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_tgoto=yes"
 else
@@ -6647,7 +7861,7 @@ else
 		for cf_term_lib in $cf_check_list termcap termlib unknown
 		do
 			echo $ac_n "checking for tgoto in -l$cf_term_lib""... $ac_c" 1>&6
-echo "configure:6651: checking for tgoto in -l$cf_term_lib" >&5
+echo "configure:7865: checking for tgoto in -l$cf_term_lib" >&5
 ac_lib_var=`echo $cf_term_lib'_'tgoto | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -6655,7 +7869,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-l$cf_term_lib  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6659 "configure"
+#line 7873 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6666,7 +7880,7 @@ int main() {
 tgoto()
 ; return 0; }
 EOF
-if { (eval echo configure:6670: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7884: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6696,7 +7910,7 @@ fi
 	for cf_curs_lib in $cf_check_list xcurses jcurses unknown
 	do
 		echo $ac_n "checking for initscr in -l$cf_curs_lib""... $ac_c" 1>&6
-echo "configure:6700: checking for initscr in -l$cf_curs_lib" >&5
+echo "configure:7914: checking for initscr in -l$cf_curs_lib" >&5
 ac_lib_var=`echo $cf_curs_lib'_'initscr | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -6704,7 +7918,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-l$cf_curs_lib  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 6708 "configure"
+#line 7922 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6715,7 +7929,7 @@ int main() {
 initscr()
 ; return 0; }
 EOF
-if { (eval echo configure:6719: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7933: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6741,16 +7955,16 @@ fi
 	LIBS="-l$cf_curs_lib $cf_save_LIBS"
 	if test "$cf_term_lib" = unknown ; then
 		echo $ac_n "checking if we can link with $cf_curs_lib library""... $ac_c" 1>&6
-echo "configure:6745: checking if we can link with $cf_curs_lib library" >&5
+echo "configure:7959: checking if we can link with $cf_curs_lib library" >&5
 		cat > conftest.$ac_ext <<EOF
-#line 6747 "configure"
+#line 7961 "configure"
 #include "confdefs.h"
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 initscr()
 ; return 0; }
 EOF
-if { (eval echo configure:6754: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7968: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_result=yes
 else
@@ -6766,16 +7980,16 @@ rm -f conftest*
 		:
 	elif test "$cf_term_lib" != predefined ; then
 		echo $ac_n "checking if we need both $cf_curs_lib and $cf_term_lib libraries""... $ac_c" 1>&6
-echo "configure:6770: checking if we need both $cf_curs_lib and $cf_term_lib libraries" >&5
+echo "configure:7984: checking if we need both $cf_curs_lib and $cf_term_lib libraries" >&5
 		cat > conftest.$ac_ext <<EOF
-#line 6772 "configure"
+#line 7986 "configure"
 #include "confdefs.h"
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 initscr(); tgoto((char *)0, 0, 0);
 ; return 0; }
 EOF
-if { (eval echo configure:6779: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7993: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_result=no
 else
@@ -6785,14 +7999,14 @@ else
   
 			LIBS="-l$cf_curs_lib -l$cf_term_lib $cf_save_LIBS"
 			cat > conftest.$ac_ext <<EOF
-#line 6789 "configure"
+#line 8003 "configure"
 #include "confdefs.h"
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 initscr()
 ; return 0; }
 EOF
-if { (eval echo configure:6796: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8010: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_result=yes
 else
@@ -6813,7 +8027,7 @@ fi
 
 		
 echo $ac_n "checking for ncurses version""... $ac_c" 1>&6
-echo "configure:6817: checking for ncurses version" >&5
+echo "configure:8031: checking for ncurses version" >&5
 if eval "test \"`echo '$''{'cf_cv_ncurses_version'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -6839,7 +8053,7 @@ Autoconf "old"
 #endif
 EOF
 	cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out"
-	{ (eval echo configure:6843: \"$cf_try\") 1>&5; (eval $cf_try) 2>&5; }
+	{ (eval echo configure:8057: \"$cf_try\") 1>&5; (eval $cf_try) 2>&5; }
 	if test -f conftest.out ; then
 		cf_out=`cat conftest.out | sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%'`
 		test -n "$cf_out" && cf_cv_ncurses_version="$cf_out"
@@ -6848,7 +8062,7 @@ EOF
 
 else
   cat > conftest.$ac_ext <<EOF
-#line 6852 "configure"
+#line 8066 "configure"
 #include "confdefs.h"
 
 #include <${cf_cv_ncurses_header-curses.h}>
@@ -6872,7 +8086,7 @@ int main()
 	exit(0);
 }
 EOF
-if { (eval echo configure:6876: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:8090: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   
 	cf_cv_ncurses_version=`cat $cf_tempfile`
@@ -6895,23 +8109,25 @@ EOF
 
 		
 echo $ac_n "checking if we must define _XOPEN_SOURCE_EXTENDED""... $ac_c" 1>&6
-echo "configure:6899: checking if we must define _XOPEN_SOURCE_EXTENDED" >&5
+echo "configure:8113: checking if we must define _XOPEN_SOURCE_EXTENDED" >&5
 if eval "test \"`echo '$''{'cf_cv_need_xopen_extension'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 cat > conftest.$ac_ext <<EOF
-#line 6905 "configure"
+#line 8119 "configure"
 #include "confdefs.h"
 
 #include <stdlib.h>
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 
-	long x = winnstr(stdscr, "", 0)
+	long x = winnstr(stdscr, "", 0);
+	int x1, y1;
+	getbegyx(stdscr, y1, x1)
 ; return 0; }
 EOF
-if { (eval echo configure:6915: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8131: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_need_xopen_extension=no
 else
@@ -6919,7 +8135,7 @@ else
   cat conftest.$ac_ext >&5
   rm -rf conftest*
   cat > conftest.$ac_ext <<EOF
-#line 6923 "configure"
+#line 8139 "configure"
 #include "confdefs.h"
 
 #define _XOPEN_SOURCE_EXTENDED
@@ -6927,10 +8143,12 @@ else
 #include <${cf_cv_ncurses_header-curses.h}>
 int main() {
 
-	long x = winnstr(stdscr, "", 0)
+	long x = winnstr(stdscr, "", 0);
+	int x1, y1;
+	getbegyx(stdscr, y1, x1)
 ; return 0; }
 EOF
-if { (eval echo configure:6934: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8152: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_need_xopen_extension=yes
 else
@@ -6953,7 +8171,7 @@ fi
 
 ## substitute externally-installed PCRE library for our bundled version
 echo $ac_n "checking if you want to use installed version of pcre""... $ac_c" 1>&6
-echo "configure:6957: checking if you want to use installed version of pcre" >&5
+echo "configure:8175: checking if you want to use installed version of pcre" >&5
 
 # Check whether --with-pcre or --without-pcre was given.
 if test "${with_pcre+set}" = set; then
@@ -7019,20 +8237,55 @@ esac
 
 PCRE_MAKEFILE=
 if test "$PCRE_HOME" = "no" ; then
-	PCRE_MAKEFILE="$PCRE_MAKEFILE pcre/Makefile pcre/RunTest pcre/pcre.h:pcre/pcre.in"
+	PCRE_MAKEFILE="$PCRE_MAKEFILE pcre/Makefile pcre/RunTest pcre/pcre.h"
 fi
 
 ## debugging libraries (do this after other libraries)
-echo $ac_n "checking if you want dbmalloc library""... $ac_c" 1>&6
-echo "configure:7028: checking if you want dbmalloc library" >&5
 debug_malloc=none
 
+echo $ac_n "checking if you want to link with dbmalloc for testing""... $ac_c" 1>&6
+echo "configure:8248: checking if you want to link with dbmalloc for testing" >&5
+
 # Check whether --with-dbmalloc or --without-dbmalloc was given.
 if test "${with_dbmalloc+set}" = set; then
   withval="$with_dbmalloc"
+  with_dbmalloc=$withval
+else
+  with_dbmalloc=no
+fi
+
+echo "$ac_t""$with_dbmalloc" 1>&6
+if test "$with_dbmalloc" = yes ; then
+	ac_safe=`echo "dbmalloc.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for dbmalloc.h""... $ac_c" 1>&6
+echo "configure:8262: checking for dbmalloc.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 8267 "configure"
+#include "confdefs.h"
+#include <dbmalloc.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:8272: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
-	 echo $ac_n "checking for debug_malloc in -ldbmalloc""... $ac_c" 1>&6
-echo "configure:7036: checking for debug_malloc in -ldbmalloc" >&5
+  echo $ac_n "checking for debug_malloc in -ldbmalloc""... $ac_c" 1>&6
+echo "configure:8289: checking for debug_malloc in -ldbmalloc" >&5
 ac_lib_var=`echo dbmalloc'_'debug_malloc | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7040,7 +8293,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldbmalloc  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7044 "configure"
+#line 8297 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7051,7 +8304,7 @@ int main() {
 debug_malloc()
 ; return 0; }
 EOF
-if { (eval echo configure:7055: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8308: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7066,19 +8319,44 @@ LIBS="$ac_save_LIBS"
 fi
 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
   echo "$ac_t""yes" 1>&6
-  ac_safe=`echo "dbmalloc.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for dbmalloc.h""... $ac_c" 1>&6
-echo "configure:7072: checking for dbmalloc.h" >&5
+  debug_malloc=DBMALLOC
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+
+echo $ac_n "checking if you want to link with dmalloc for testing""... $ac_c" 1>&6
+echo "configure:8336: checking if you want to link with dmalloc for testing" >&5
+
+# Check whether --with-dmalloc or --without-dmalloc was given.
+if test "${with_dmalloc+set}" = set; then
+  withval="$with_dmalloc"
+  with_dmalloc=$withval
+else
+  with_dmalloc=no
+fi
+
+echo "$ac_t""$with_dmalloc" 1>&6
+if test "$with_dmalloc" = yes ; then
+	ac_safe=`echo "dmalloc.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for dmalloc.h""... $ac_c" 1>&6
+echo "configure:8350: checking for dmalloc.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7077 "configure"
+#line 8355 "configure"
 #include "confdefs.h"
-#include <dbmalloc.h>
+#include <dmalloc.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7082: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8360: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7094,29 +8372,8 @@ rm -f conftest*
 fi
 if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
-  debug_malloc=DBMALLOC
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-
-echo $ac_n "checking if you want dmalloc library""... $ac_c" 1>&6
-echo "configure:7113: checking if you want dmalloc library" >&5
-
-# Check whether --with-dmalloc or --without-dmalloc was given.
-if test "${with_dmalloc+set}" = set; then
-  withval="$with_dmalloc"
-  echo "$ac_t""yes" 1>&6
-	 echo $ac_n "checking for dmalloc_debug in -ldmalloc""... $ac_c" 1>&6
-echo "configure:7120: checking for dmalloc_debug in -ldmalloc" >&5
+  echo $ac_n "checking for dmalloc_debug in -ldmalloc""... $ac_c" 1>&6
+echo "configure:8377: checking for dmalloc_debug in -ldmalloc" >&5
 ac_lib_var=`echo dmalloc'_'dmalloc_debug | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7124,7 +8381,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldmalloc  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7128 "configure"
+#line 8385 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7135,7 +8392,7 @@ int main() {
 dmalloc_debug()
 ; return 0; }
 EOF
-if { (eval echo configure:7139: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8396: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7150,34 +8407,6 @@ LIBS="$ac_save_LIBS"
 fi
 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
   echo "$ac_t""yes" 1>&6
-  ac_safe=`echo "dmalloc.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for dmalloc.h""... $ac_c" 1>&6
-echo "configure:7156: checking for dmalloc.h" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 7161 "configure"
-#include "confdefs.h"
-#include <dmalloc.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7166: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
   debug_malloc=DMALLOC
 else
   echo "$ac_t""no" 1>&6
@@ -7187,13 +8416,11 @@ else
   echo "$ac_t""no" 1>&6
 fi
 
-else
-  echo "$ac_t""no" 1>&6
 fi
 
 
 echo $ac_n "checking if you want debugging-trace""... $ac_c" 1>&6
-echo "configure:7197: checking if you want debugging-trace" >&5
+echo "configure:8424: checking if you want debugging-trace" >&5
 
 # Check whether --with-trace or --without-trace was given.
 if test "${with_trace+set}" = set; then
@@ -7211,12 +8438,12 @@ EOF
 
 	EXTRAOBJS="$EXTRAOBJS trace.o"
 	echo $ac_n "checking for _tracef""... $ac_c" 1>&6
-echo "configure:7215: checking for _tracef" >&5
+echo "configure:8442: checking for _tracef" >&5
 if eval "test \"`echo '$''{'ac_cv_func__tracef'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 7220 "configure"
+#line 8447 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char _tracef(); below.  */
@@ -7239,7 +8466,7 @@ _tracef();
 
 ; return 0; }
 EOF
-if { (eval echo configure:7243: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8470: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func__tracef=yes"
 else
@@ -7261,7 +8488,7 @@ else
   echo "$ac_t""no" 1>&6
 
 	echo $ac_n "checking for _tracef in -l${cf_with_screen}_g""... $ac_c" 1>&6
-echo "configure:7265: checking for _tracef in -l${cf_with_screen}_g" >&5
+echo "configure:8492: checking for _tracef in -l${cf_with_screen}_g" >&5
 ac_lib_var=`echo ${cf_with_screen}_g'_'_tracef | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -7269,7 +8496,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-l${cf_with_screen}_g  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 7273 "configure"
+#line 8500 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7280,7 +8507,7 @@ int main() {
 _tracef()
 ; return 0; }
 EOF
-if { (eval echo configure:7284: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8511: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7312,7 +8539,7 @@ fi
 
 ## options for miscellaneous definitions
 echo $ac_n "checking for domain-name""... $ac_c" 1>&6
-echo "configure:7316: checking for domain-name" >&5
+echo "configure:8543: checking for domain-name" >&5
 
 # Check whether --with-domain-name or --without-domain-name was given.
 if test "${with_domain_name+set}" = set; then
@@ -7341,16 +8568,16 @@ echo "$ac_t""$DOMAIN_NAME" 1>&6
 
 if test "$USE_NNTP" = "yes" ; then
 echo $ac_n "checking for NNTP default-server""... $ac_c" 1>&6
-echo "configure:7345: checking for NNTP default-server" >&5
+echo "configure:8572: checking for NNTP default-server" >&5
 
 # Check whether --with-nntp-default-server or --without-nntp-default-server was given.
 if test "${with_nntp_default_server+set}" = set; then
   withval="$with_nntp_default_server"
   :
 else
-  withval="${NNTP_DEFAULT_SERVER}"
+  withval="${NNTP_DEFAULT_SERVER-news.$DOMAIN_NAME}"
 fi
-test -n "$withval" && \
+test -z "$withval" && withval=no
 case "$withval" in #(vi
 yes)
   { echo "configure: error: expected a value for --with-nntp-default-server" 1>&2; exit 1; }
@@ -7407,7 +8634,7 @@ EOF
 
 ## optional features
 echo $ac_n "checking whether to use MH style mail handling for mailgroups""... $ac_c" 1>&6
-echo "configure:7411: checking whether to use MH style mail handling for mailgroups" >&5
+echo "configure:8638: checking whether to use MH style mail handling for mailgroups" >&5
 
 # Check whether --enable-mh-mail-handling or --disable-mh-mail-handling was given.
 if test "${enable_mh_mail_handling+set}" = set; then
@@ -7426,7 +8653,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking whether to enable 8-bit keycodes""... $ac_c" 1>&6
-echo "configure:7430: checking whether to enable 8-bit keycodes" >&5
+echo "configure:8657: checking whether to enable 8-bit keycodes" >&5
 
 # Check whether --enable-8bit-keys or --disable-8bit-keys was given.
 if test "${enable_8bit_keys+set}" = set; then
@@ -7452,7 +8679,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking whether to enable ANSI-color""... $ac_c" 1>&6
-echo "configure:7456: checking whether to enable ANSI-color" >&5
+echo "configure:8683: checking whether to enable ANSI-color" >&5
 
 # Check whether --enable-color or --disable-color was given.
 if test "${enable_color+set}" = set; then
@@ -7469,7 +8696,7 @@ use_color=$enableval
 echo "$ac_t""$use_color" 1>&6
 
 echo $ac_n "checking whether to enable posting-etiquette""... $ac_c" 1>&6
-echo "configure:7473: checking whether to enable posting-etiquette" >&5
+echo "configure:8700: checking whether to enable posting-etiquette" >&5
 
 # Check whether --enable-etiquette or --disable-etiquette was given.
 if test "${enable_etiquette+set}" = set; then
@@ -7488,7 +8715,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking whether to strictly observe RFC2047 and break long lines""... $ac_c" 1>&6
-echo "configure:7492: checking whether to strictly observe RFC2047 and break long lines" >&5
+echo "configure:8719: checking whether to strictly observe RFC2047 and break long lines" >&5
 
 # Check whether --enable-break-long-lines or --disable-break-long-lines was given.
 if test "${enable_break_long_lines+set}" = set; then
@@ -7507,7 +8734,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking whether to force MM_CHARSET obeyance when decoding mime""... $ac_c" 1>&6
-echo "configure:7511: checking whether to force MM_CHARSET obeyance when decoding mime" >&5
+echo "configure:8738: checking whether to force MM_CHARSET obeyance when decoding mime" >&5
 
 # Check whether --enable-mime-strict-charset or --disable-mime-strict-charset was given.
 if test "${enable_mime_strict_charset+set}" = set; then
@@ -7533,7 +8760,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking for MIME character-set""... $ac_c" 1>&6
-echo "configure:7537: checking for MIME character-set" >&5
+echo "configure:8764: checking for MIME character-set" >&5
 
 # Check whether --with-mime-default-charset or --without-mime-default-charset was given.
 if test "${with_mime_default_charset+set}" = set; then
@@ -7555,7 +8782,7 @@ EOF
 echo "$ac_t""$MM_CHARSET" 1>&6
 
 echo $ac_n "checking for default ISO/ASCII table""... $ac_c" 1>&6
-echo "configure:7559: checking for default ISO/ASCII table" >&5
+echo "configure:8786: checking for default ISO/ASCII table" >&5
 
 # Check whether --with-iso-to-ascii or --without-iso-to-ascii was given.
 if test "${with_iso_to_ascii+set}" = set; then
@@ -7577,7 +8804,7 @@ EOF
 echo "$ac_t""$DEFAULT_ISO2ASC" 1>&6
 
 echo $ac_n "checking whether to enable locale support""... $ac_c" 1>&6
-echo "configure:7581: checking whether to enable locale support" >&5
+echo "configure:8808: checking whether to enable locale support" >&5
 
 # Check whether --enable-locale or --disable-locale was given.
 if test "${enable_locale+set}" = set; then
@@ -7596,7 +8823,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking whether to enable posting""... $ac_c" 1>&6
-echo "configure:7600: checking whether to enable posting" >&5
+echo "configure:8827: checking whether to enable posting" >&5
 
 # Check whether --enable-posting or --disable-posting was given.
 if test "${enable_posting+set}" = set; then
@@ -7615,7 +8842,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking whether to enable shell escape""... $ac_c" 1>&6
-echo "configure:7619: checking whether to enable shell escape" >&5
+echo "configure:8846: checking whether to enable shell escape" >&5
 
 # Check whether --enable-shell-escape or --disable-shell-escape was given.
 if test "${enable_shell_escape+set}" = set; then
@@ -7634,7 +8861,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking whether to have fascist newsadmin""... $ac_c" 1>&6
-echo "configure:7638: checking whether to have fascist newsadmin" >&5
+echo "configure:8865: checking whether to have fascist newsadmin" >&5
 
 # Check whether --enable-fascist-newsadmin or --disable-fascist-newsadmin was given.
 if test "${enable_fascist_newsadmin+set}" = set; then
@@ -7653,7 +8880,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking whether to enable inverse video and highlighting""... $ac_c" 1>&6
-echo "configure:7657: checking whether to enable inverse video and highlighting" >&5
+echo "configure:8884: checking whether to enable inverse video and highlighting" >&5
 
 # Check whether --enable-inverse-video or --disable-inverse-video was given.
 if test "${enable_inverse_video+set}" = set; then
@@ -7672,7 +8899,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking whether to enable piping support""... $ac_c" 1>&6
-echo "configure:7676: checking whether to enable piping support" >&5
+echo "configure:8903: checking whether to enable piping support" >&5
 
 # Check whether --enable-piping or --disable-piping was given.
 if test "${enable_piping+set}" = set; then
@@ -7691,7 +8918,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking whether to enable printer support""... $ac_c" 1>&6
-echo "configure:7695: checking whether to enable printer support" >&5
+echo "configure:8922: checking whether to enable printer support" >&5
 
 # Check whether --enable-printing or --disable-printing was given.
 if test "${enable_printing+set}" = set; then
@@ -7710,7 +8937,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking whether to unique tmp-files by appending .pid""... $ac_c" 1>&6
-echo "configure:7714: checking whether to unique tmp-files by appending .pid" >&5
+echo "configure:8941: checking whether to unique tmp-files by appending .pid" >&5
 
 # Check whether --enable-append-pid or --disable-append-pid was given.
 if test "${enable_append_pid+set}" = set; then
@@ -7736,7 +8963,7 @@ fi
 echo "$ac_t""$enableval" 1>&6
 
 echo $ac_n "checking whether to fallback to XHDR XREF if XOVER isn't supported""... $ac_c" 1>&6
-echo "configure:7740: checking whether to fallback to XHDR XREF if XOVER isn't supported" >&5
+echo "configure:8967: checking whether to fallback to XHDR XREF if XOVER isn't supported" >&5
 
 # Check whether --enable-xhdr-xref or --disable-xhdr-xref was given.
 if test "${enable_xhdr_xref+set}" = set; then
@@ -7763,7 +8990,7 @@ echo "$ac_t""$enableval" 1>&6
 
 ### bypass a bug in old versions of leafnode & NNTPcache
 echo $ac_n "checking whether to send a GROUP command before a LISTGROUP""... $ac_c" 1>&6
-echo "configure:7767: checking whether to send a GROUP command before a LISTGROUP" >&5
+echo "configure:8994: checking whether to send a GROUP command before a LISTGROUP" >&5
 
 # Check whether --enable-broken-listgroup-fix or --disable-broken-listgroup-fix was given.
 if test "${enable_broken_listgroup_fix+set}" = set; then
@@ -7781,9 +9008,29 @@ fi
 
 echo "$ac_t""$enableval" 1>&6
 
+### on some old systems the WIFEXITED()/WEXITSTATUS() macros do not work
+echo $ac_n "checking whether to ignore system()s return value""... $ac_c" 1>&6
+echo "configure:9014: checking whether to ignore system()s return value" >&5
+
+# Check whether --enable-broken-system-fix or --disable-broken-system-fix was given.
+if test "${enable_broken_system_fix+set}" = set; then
+  enableval="$enable_broken_system_fix"
+  test "$enableval" != yes && enableval=no
+  if test "$enableval" != "no" ; then
+    cat >> confdefs.h <<\EOF
+#define IGNORE_SYSTEM_STATUS 1
+EOF
+ 
+  fi
+else
+  enableval=no   
+fi
+
+echo "$ac_t""$enableval" 1>&6
+
 ### checks for the location of the system-wide default setting file
 echo $ac_n "checking for directory containing tin.defaults file""... $ac_c" 1>&6
-echo "configure:7787: checking for directory containing tin.defaults file" >&5
+echo "configure:9034: checking for directory containing tin.defaults file" >&5
 
 # Check whether --with-defaults-dir or --without-defaults-dir was given.
 if test "${with_defaults_dir+set}" = set; then
@@ -7826,7 +9073,7 @@ EOF
 
 ### check for ipv6 support
 echo $ac_n "checking whether to enable IPv6""... $ac_c" 1>&6
-echo "configure:7830: checking whether to enable IPv6" >&5
+echo "configure:9077: checking whether to enable IPv6" >&5
 
 # Check whether --enable-ipv6 or --disable-ipv6 was given.
 if test "${enable_ipv6+set}" = set; then
@@ -7847,7 +9094,7 @@ if test "$enableval" = "yes"; then
 	
 
 echo $ac_n "checking ipv6 stack type""... $ac_c" 1>&6
-echo "configure:7851: checking ipv6 stack type" >&5
+echo "configure:9098: checking ipv6 stack type" >&5
 if eval "test \"`echo '$''{'cf_cv_ipv6type'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -7867,7 +9114,7 @@ do
 		;;
 	inria) #(vi
 				cat > conftest.$ac_ext <<EOF
-#line 7871 "configure"
+#line 9118 "configure"
 #include "confdefs.h"
 
 #include <netinet/in.h>
@@ -7885,7 +9132,7 @@ rm -f conftest*
 		;;
 	kame) #(vi
 				cat > conftest.$ac_ext <<EOF
-#line 7889 "configure"
+#line 9136 "configure"
 #include "confdefs.h"
 
 #include <netinet/in.h>
@@ -7903,7 +9150,7 @@ rm -f conftest*
 		;;
 	linux-glibc) #(vi
 				cat > conftest.$ac_ext <<EOF
-#line 7907 "configure"
+#line 9154 "configure"
 #include "confdefs.h"
 
 #include <features.h>
@@ -7930,7 +9177,7 @@ rm -f conftest*
 		;;
 	toshiba) #(vi
 		cat > conftest.$ac_ext <<EOF
-#line 7934 "configure"
+#line 9181 "configure"
 #include "confdefs.h"
 
 #include <sys/param.h>
@@ -7948,7 +9195,7 @@ rm -f conftest*
 		;;
 	v6d) #(vi
 		cat > conftest.$ac_ext <<EOF
-#line 7952 "configure"
+#line 9199 "configure"
 #include "confdefs.h"
 
 #include </usr/local/v6/include/sys/v6config.h>
@@ -7966,7 +9213,7 @@ rm -f conftest*
 		;;
 	zeta)
 		cat > conftest.$ac_ext <<EOF
-#line 7970 "configure"
+#line 9217 "configure"
 #include "confdefs.h"
 
 #include <sys/param.h>
@@ -7999,7 +9246,7 @@ cf_ipv6lib=none
 cf_ipv6dir=none
 
 echo $ac_n "checking for IPv6 library if required""... $ac_c" 1>&6
-echo "configure:8003: checking for IPv6 library if required" >&5
+echo "configure:9250: checking for IPv6 library if required" >&5
 case $cf_cv_ipv6type in #(vi
 solaris) #(vi
 	;;
@@ -8033,7 +9280,7 @@ echo "$ac_t""$cf_ipv6lib" 1>&6
 if test "$cf_ipv6lib" != "none"; then
 
 	cat > conftest.$ac_ext <<EOF
-#line 8037 "configure"
+#line 9284 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -8044,7 +9291,7 @@ int main() {
 getaddrinfo(0, 0, 0, 0)
 ; return 0; }
 EOF
-if { (eval echo configure:8048: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9295: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   :
 else
   echo "configure: failed program was:" >&5
@@ -8141,12 +9388,12 @@ rm -f conftest*
 	eval 'cf_cv_have_lib_'$cf_ipv6lib'=no'
 	cf_libdir=""
 	echo $ac_n "checking for getaddrinfo""... $ac_c" 1>&6
-echo "configure:8145: checking for getaddrinfo" >&5
+echo "configure:9392: checking for getaddrinfo" >&5
 if eval "test \"`echo '$''{'ac_cv_func_getaddrinfo'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8150 "configure"
+#line 9397 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char getaddrinfo(); below.  */
@@ -8169,7 +9416,7 @@ getaddrinfo();
 
 ; return 0; }
 EOF
-if { (eval echo configure:8173: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9420: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_getaddrinfo=yes"
 else
@@ -8189,10 +9436,10 @@ else
 
 		cf_save_LIBS="$LIBS"
 		echo $ac_n "checking for getaddrinfo in -l$cf_ipv6lib""... $ac_c" 1>&6
-echo "configure:8193: checking for getaddrinfo in -l$cf_ipv6lib" >&5
+echo "configure:9440: checking for getaddrinfo in -l$cf_ipv6lib" >&5
 		LIBS="-l$cf_ipv6lib $LIBS"
 		cat > conftest.$ac_ext <<EOF
-#line 8196 "configure"
+#line 9443 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -8203,7 +9450,7 @@ int main() {
 getaddrinfo(0, 0, 0, 0)
 ; return 0; }
 EOF
-if { (eval echo configure:8207: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9454: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 			 eval 'cf_cv_have_lib_'$cf_ipv6lib'=yes'
@@ -8272,10 +9519,10 @@ test -d /usr && {
 			for cf_libdir in $cf_search
 			do
 				echo $ac_n "checking for -l$cf_ipv6lib in $cf_libdir""... $ac_c" 1>&6
-echo "configure:8276: checking for -l$cf_ipv6lib in $cf_libdir" >&5
+echo "configure:9523: checking for -l$cf_ipv6lib in $cf_libdir" >&5
 				LIBS="-L$cf_libdir -l$cf_ipv6lib $cf_save_LIBS"
 				cat > conftest.$ac_ext <<EOF
-#line 8279 "configure"
+#line 9526 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -8286,7 +9533,7 @@ int main() {
 getaddrinfo(0, 0, 0, 0)
 ; return 0; }
 EOF
-if { (eval echo configure:8290: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9537: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 			 		 eval 'cf_cv_have_lib_'$cf_ipv6lib'=yes'
@@ -8319,7 +9566,7 @@ fi
 
 
 echo $ac_n "checking working getaddrinfo""... $ac_c" 1>&6
-echo "configure:8323: checking working getaddrinfo" >&5
+echo "configure:9570: checking working getaddrinfo" >&5
 if eval "test \"`echo '$''{'cf_cv_getaddrinfo'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -8328,7 +9575,7 @@ if test "$cross_compiling" = yes; then
   cf_cv_getaddrinfo=unknown
 else
   cat > conftest.$ac_ext <<EOF
-#line 8332 "configure"
+#line 9579 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -8407,7 +9654,7 @@ int main()
 }
 
 EOF
-if { (eval echo configure:8411: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:9658: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cf_cv_getaddrinfo=yes
 else
@@ -8437,8 +9684,8 @@ fi
 
 if test "$cf_cv_getaddrinfo" != "yes"; then
 	if test "$cf_cv_ipv6type" != "linux"; then
-		{ echo "configure: error: You must get working getaddrinfo() function,
-or you can specify "--disable-ipv6"" 1>&2; exit 1; }
+		echo "configure: warning: You must get working getaddrinfo() function,
+or you can specify "--disable-ipv6"" 1>&2
 	else
 		echo "configure: warning: The getaddrinfo() implementation on your system seems be buggy.
 You should upgrade your system library to the newest version
@@ -8451,12 +9698,12 @@ fi
 for ac_func in getaddrinfo getnameinfo
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8455: checking for $ac_func" >&5
+echo "configure:9702: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8460 "configure"
+#line 9707 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -8479,7 +9726,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:8483: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9730: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -8508,7 +9755,7 @@ done
 
 ### checks for operator characteristics (should be the last option)
 echo $ac_n "checking whether to make a coffee while compiling""... $ac_c" 1>&6
-echo "configure:8512: checking whether to make a coffee while compiling" >&5
+echo "configure:9759: checking whether to make a coffee while compiling" >&5
 
 # Check whether --with-coffee or --without-coffee was given.
 if test "${with_coffee+set}" = set; then
@@ -8533,7 +9780,7 @@ fi
 ### checks for compiler characteristics
 
 echo $ac_n "checking for makeflags variable""... $ac_c" 1>&6
-echo "configure:8537: checking for makeflags variable" >&5
+echo "configure:9784: checking for makeflags variable" >&5
 if eval "test \"`echo '$''{'cf_cv_makeflags'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -8578,12 +9825,12 @@ ac_link='${CC-cc} -o conftest${ac_exeext
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:8582: checking for working const" >&5
+echo "configure:9829: checking for working const" >&5
 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8587 "configure"
+#line 9834 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -8632,7 +9879,7 @@ ccp = (char const *const *) p;
 
 ; return 0; }
 EOF
-if { (eval echo configure:8636: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9883: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -8653,21 +9900,21 @@ EOF
 fi
 
 echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:8657: checking for inline" >&5
+echo "configure:9904: checking for inline" >&5
 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat > conftest.$ac_ext <<EOF
-#line 8664 "configure"
+#line 9911 "configure"
 #include "confdefs.h"
 
 int main() {
 } $ac_kw foo() {
 ; return 0; }
 EOF
-if { (eval echo configure:8671: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9918: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline=$ac_kw; break
 else
@@ -8694,13 +9941,13 @@ esac
 
 
 echo $ac_n "checking for ansi token expansion/substitution""... $ac_c" 1>&6
-echo "configure:8698: checking for ansi token expansion/substitution" >&5
+echo "configure:9945: checking for ansi token expansion/substitution" >&5
 if eval "test \"`echo '$''{'cf_cv_cpp_expands'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 	cat > conftest.$ac_ext <<EOF
-#line 8704 "configure"
+#line 9951 "configure"
 #include "confdefs.h"
 
 #define string(n) #n
@@ -8708,7 +9955,7 @@ int main() {
 char *s = string(token)
 ; return 0; }
 EOF
-if { (eval echo configure:8712: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9959: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_cpp_expands=yes
 else
@@ -8729,13 +9976,13 @@ EOF
 
 
 echo $ac_n "checking for ansi token concatenation""... $ac_c" 1>&6
-echo "configure:8733: checking for ansi token concatenation" >&5
+echo "configure:9980: checking for ansi token concatenation" >&5
 if eval "test \"`echo '$''{'cf_cv_cpp_concats'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 	cat > conftest.$ac_ext <<EOF
-#line 8739 "configure"
+#line 9986 "configure"
 #include "confdefs.h"
 
 #define concat(a,b) a ## b
@@ -8743,7 +9990,7 @@ int main() {
 char *firstlast = "y", *s = concat(first,last)
 ; return 0; }
 EOF
-if { (eval echo configure:8747: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:9994: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_cpp_concats=yes
 else
@@ -8764,20 +10011,20 @@ EOF
 
 
 echo $ac_n "checking if nested parameters work""... $ac_c" 1>&6
-echo "configure:8768: checking if nested parameters work" >&5
+echo "configure:10015: checking if nested parameters work" >&5
 if eval "test \"`echo '$''{'cf_cv_nested_params'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 	cat > conftest.$ac_ext <<EOF
-#line 8774 "configure"
+#line 10021 "configure"
 #include "confdefs.h"
 
 int main() {
 extern void (*sigdisp(int sig, void (*func)(int sig)))(int sig)
 ; return 0; }
 EOF
-if { (eval echo configure:8781: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:10028: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_nested_params=yes
 else
@@ -8797,1330 +10044,1525 @@ EOF
 
 
 
-### check for alloca (only required for bison)
-case "$YACC" in
-bison*)
-	# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
-# for constant arguments.  Useless!
-echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:8807: checking for working alloca.h" >&5
-if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
+
+###	Checks for header files.
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:10051: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8812 "configure"
+#line 10056 "configure"
 #include "confdefs.h"
-#include <alloca.h>
-int main() {
-char *p = alloca(2 * sizeof(int));
-; return 0; }
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
 EOF
-if { (eval echo configure:8819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:10064: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
   rm -rf conftest*
-  ac_cv_header_alloca_h=yes
+  ac_cv_header_stdc=yes
 else
+  echo "$ac_err" >&5
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_header_alloca_h=no
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 10081 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "memchr" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
 fi
 rm -f conftest*
+
 fi
 
-echo "$ac_t""$ac_cv_header_alloca_h" 1>&6
-if test $ac_cv_header_alloca_h = yes; then
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 10099 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "free" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+  :
+else
+  cat > conftest.$ac_ext <<EOF
+#line 10120 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:10131: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
   cat >> confdefs.h <<\EOF
-#define HAVE_ALLOCA_H 1
+#define STDC_HEADERS 1
 EOF
 
 fi
 
-echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:8840: checking for alloca" >&5
-if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
+echo "configure:10159: checking for $ac_hdr that defines DIR" >&5
+if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8845 "configure"
+#line 10164 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_hdr>
+int main() {
+DIR *dirp = 0;
+; return 0; }
+EOF
+if { (eval echo configure:10172: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  eval "ac_cv_header_dirent_$ac_safe=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_dirent_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ ac_header_dirent=$ac_hdr; break
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
+echo "configure:10197: checking for opendir in -ldir" >&5
+ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldir  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 10205 "configure"
 #include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char opendir();
 
-#ifdef __GNUC__
-# define alloca __builtin_alloca
-#else
-# ifdef _MSC_VER
-#  include <malloc.h>
-#  define alloca _alloca
-# else
-#  if HAVE_ALLOCA_H
-#   include <alloca.h>
-#  else
-#   ifdef _AIX
- #pragma alloca
-#   else
-#    ifndef alloca /* predefined by HP cc +Olibcalls */
-char *alloca ();
-#    endif
-#   endif
-#  endif
-# endif
-#endif
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:10216: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  LIBS="$LIBS -ldir"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
+echo "configure:10238: checking for opendir in -lx" >&5
+ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lx  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 10246 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char opendir();
 
 int main() {
-char *p = (char *) alloca(1);
+opendir()
 ; return 0; }
 EOF
-if { (eval echo configure:8873: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10257: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  ac_cv_func_alloca_works=yes
+  eval "ac_cv_lib_$ac_lib_var=yes"
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_func_alloca_works=no
+  eval "ac_cv_lib_$ac_lib_var=no"
 fi
 rm -f conftest*
-fi
-
-echo "$ac_t""$ac_cv_func_alloca_works" 1>&6
-if test $ac_cv_func_alloca_works = yes; then
-  cat >> confdefs.h <<\EOF
-#define HAVE_ALLOCA 1
-EOF
+LIBS="$ac_save_LIBS"
 
 fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  LIBS="$LIBS -lx"
+else
+  echo "$ac_t""no" 1>&6
+fi
 
-if test $ac_cv_func_alloca_works = no; then
-  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
-  # that cause trouble.  Some versions do not even contain alloca or
-  # contain a buggy version.  If you still want to use their alloca,
-  # use ar to extract alloca.o from them instead of compiling alloca.c.
-  ALLOCA=alloca.${ac_objext}
-  cat >> confdefs.h <<\EOF
-#define C_ALLOCA 1
-EOF
-
+fi
 
-echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:8905: checking whether alloca needs Cray hooks" >&5
-if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
+echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
+echo "configure:10280: checking whether time.h and sys/time.h may both be included" >&5
+if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8910 "configure"
+#line 10285 "configure"
 #include "confdefs.h"
-#if defined(CRAY) && ! defined(CRAY2)
-webecray
-#else
-wenotbecray
-#endif
-
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+int main() {
+struct tm *tp;
+; return 0; }
 EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "webecray" >/dev/null 2>&1; then
+if { (eval echo configure:10294: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
-  ac_cv_os_cray=yes
+  ac_cv_header_time=yes
 else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_os_cray=no
+  ac_cv_header_time=no
 fi
 rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_time" 1>&6
+if test $ac_cv_header_time = yes; then
+  cat >> confdefs.h <<\EOF
+#define TIME_WITH_SYS_TIME 1
+EOF
 
 fi
 
-echo "$ac_t""$ac_cv_os_cray" 1>&6
-if test $ac_cv_os_cray = yes; then
-for ac_func in _getb67 GETB67 getb67; do
-  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8935: checking for $ac_func" >&5
-if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
+echo "configure:10315: checking for sys/wait.h that is POSIX.1 compatible" >&5
+if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 8940 "configure"
+#line 10320 "configure"
 #include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func(); below.  */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char $ac_func();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
 #endif
-
+#ifndef WIFEXITED
+#define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+int main() {
+int s;
+wait (&s);
+s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
 ; return 0; }
 EOF
-if { (eval echo configure:8963: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10336: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
-  eval "ac_cv_func_$ac_func=yes"
+  ac_cv_header_sys_wait_h=yes
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  eval "ac_cv_func_$ac_func=no"
+  ac_cv_header_sys_wait_h=no
 fi
 rm -f conftest*
 fi
 
-if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  cat >> confdefs.h <<EOF
-#define CRAY_STACKSEG_END $ac_func
+echo "$ac_t""$ac_cv_header_sys_wait_h" 1>&6
+if test $ac_cv_header_sys_wait_h = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_SYS_WAIT_H 1
 EOF
 
-  break
-else
-  echo "$ac_t""no" 1>&6
 fi
 
-done
-fi
 
-echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:8990: checking stack direction for C alloca" >&5
-if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  if test "$cross_compiling" = yes; then
-  ac_cv_c_stack_direction=0
-else
-  cat > conftest.$ac_ext <<EOF
-#line 8998 "configure"
+for cf_hdr in \
+	argz.h \
+	arpa/inet.h \
+	curses.h \
+	errno.h \
+	fcntl.h \
+	getopt.h \
+	ioctl.h \
+	langinfo.h \
+	libc.h \
+	locale.h \
+	malloc.h \
+	net/socket.h \
+	netdb.h \
+	netinet/in.h \
+	netlib.h \
+	nl_types.h \
+	nomacros.h \
+	paths.h	\
+	poll.h \
+	prototypes.h \
+	pwd.h \
+	sgtty.h \
+	socket.h \
+	stdarg.h \
+	stdbool.h \
+	stddef.h \
+	stdlib.h \
+	string.h \
+	strings.h \
+	stropts.h \
+	sys/bsdtypes.h \
+	sys/errno.h \
+	sys/file.h \
+	sys/ioctl.h \
+	sys/param.h \
+	sys/poll.h \
+	sys/ptem.h \
+	sys/pty.h \
+	sys/select.h \
+	sys/stat.h \
+	sys/stream.h \
+	sys/socket.h \
+	sys/time.h \
+	sys/timeb.h \
+	sys/times.h \
+	sys/types.h \
+	sys/utsname.h \
+	term.h \
+	termio.h \
+	time.h \
+	unistd.h \
+	varargs.h \
+	wchar.h \
+	wctype.h \
+
+do
+	echo $ac_n "checking for $cf_hdr""... $ac_c" 1>&6
+echo "configure:10415: checking for $cf_hdr" >&5
+	cat > conftest.$ac_ext <<EOF
+#line 10417 "configure"
 #include "confdefs.h"
-find_stack_direction ()
-{
-  static char *addr = 0;
-  auto char dummy;
-  if (addr == 0)
-    {
-      addr = &dummy;
-      return find_stack_direction ();
-    }
-  else
-    return (&dummy > addr) ? 1 : -1;
-}
-main ()
-{
-  exit (find_stack_direction() < 0);
-}
+
+#include <sys/types.h>
+#include <$cf_hdr>
+
 EOF
-if { (eval echo configure:9017: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
-  ac_cv_c_stack_direction=1
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:10425: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  cf_found=yes
 else
+  echo "$ac_err" >&5
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  ac_cv_c_stack_direction=-1
-fi
-rm -fr conftest*
-fi
-
+  rm -rf conftest*
+  cf_found=no
 fi
+rm -f conftest*
+echo "$ac_t""$cf_found" 1>&6
+if test $cf_found = yes ; then
+	
+cf_tr_hdr=`echo "$cf_hdr" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
 
-echo "$ac_t""$ac_cv_c_stack_direction" 1>&6
-cat >> confdefs.h <<EOF
-#define STACK_DIRECTION $ac_cv_c_stack_direction
+	cat >> confdefs.h <<EOF
+#define HAVE_${cf_tr_hdr} 1
 EOF
 
 fi
+done
 
-	;;
-*)
-	ALLOCA=""
-	
-	;;
-esac
 
-###	Checks for header files.
-echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:9047: checking for ANSI C header files" >&5
-if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+###	Checks that depend on existence-checks for headers
+
+for ac_hdr in \
+termio.h \
+termios.h \
+unistd.h \
+
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:10461: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 9052 "configure"
+#line 10466 "configure"
 #include "confdefs.h"
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
+#include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9060: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:10471: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
-  ac_cv_header_stdc=yes
+  eval "ac_cv_header_$ac_safe=yes"
 else
   echo "$ac_err" >&5
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_header_stdc=no
+  eval "ac_cv_header_$ac_safe=no"
 fi
 rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
 
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-cat > conftest.$ac_ext <<EOF
-#line 9077 "configure"
+if test "$ISC" = yes ; then
+	for ac_hdr in sys/termio.h 
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:10502: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 10507 "configure"
 #include "confdefs.h"
-#include <string.h>
+#include <$ac_hdr>
 EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "memchr" >/dev/null 2>&1; then
-  :
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:10512: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
 else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_header_stdc=no
+  eval "ac_cv_header_$ac_safe=no"
 fi
 rm -f conftest*
-
 fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-cat > conftest.$ac_ext <<EOF
-#line 9095 "configure"
-#include "confdefs.h"
-#include <stdlib.h>
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
 EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "free" >/dev/null 2>&1; then
-  :
+ 
 else
-  rm -rf conftest*
-  ac_cv_header_stdc=no
+  echo "$ac_t""no" 1>&6
 fi
-rm -f conftest*
+done
 
 fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-if test "$cross_compiling" = yes; then
-  :
+if test "$ac_cv_header_termios_h" = yes ; then
+	case "$CFLAGS $CPPFLAGS" in
+	*-D_POSIX_SOURCE*)
+		termios_bad=dunno ;;
+	*)	termios_bad=maybe ;;
+	esac
+	if test "$termios_bad" = maybe ; then
+	echo $ac_n "checking whether termios.h needs _POSIX_SOURCE""... $ac_c" 1>&6
+echo "configure:10547: checking whether termios.h needs _POSIX_SOURCE" >&5
+	cat > conftest.$ac_ext <<EOF
+#line 10549 "configure"
+#include "confdefs.h"
+#include <termios.h>
+int main() {
+struct termios foo; int x = foo.c_iflag
+; return 0; }
+EOF
+if { (eval echo configure:10556: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  termios_bad=no
 else
-  cat > conftest.$ac_ext <<EOF
-#line 9116 "configure"
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  
+		cat > conftest.$ac_ext <<EOF
+#line 10565 "configure"
 #include "confdefs.h"
-#include <ctype.h>
-#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int main () { int i; for (i = 0; i < 256; i++)
-if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
-exit (0); }
 
+#define _POSIX_SOURCE
+#include <termios.h>
+int main() {
+struct termios foo; int x = foo.c_iflag
+; return 0; }
 EOF
-if { (eval echo configure:9127: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
-  :
+if { (eval echo configure:10574: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  termios_bad=unknown
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  ac_cv_header_stdc=no
-fi
-rm -fr conftest*
-fi
+  rm -rf conftest*
+  termios_bad=yes cat >> confdefs.h <<\EOF
+#define SVR4_TERMIO 1
+EOF
 
 fi
+rm -f conftest*
+			
+fi
+rm -f conftest*
+	echo "$ac_t""$termios_bad" 1>&6
+	fi
 fi
 
-echo "$ac_t""$ac_cv_header_stdc" 1>&6
-if test $ac_cv_header_stdc = yes; then
-  cat >> confdefs.h <<\EOF
-#define STDC_HEADERS 1
-EOF
 
-fi
 
-ac_header_dirent=no
-for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
-echo "configure:9155: checking for $ac_hdr that defines DIR" >&5
-if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
+echo $ac_n "checking declaration of size-change""... $ac_c" 1>&6
+echo "configure:10597: checking declaration of size-change" >&5
+if eval "test \"`echo '$''{'cf_cv_sizechange'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  cat > conftest.$ac_ext <<EOF
-#line 9160 "configure"
+  
+    cf_cv_sizechange=unknown
+    cf_save_CPPFLAGS="$CPPFLAGS"
+
+for cf_opts in "" "NEED_PTEM_H"
+do
+
+    CPPFLAGS="$cf_save_CPPFLAGS"
+    test -n "$cf_opts" && CPPFLAGS="$CPPFLAGS -D$cf_opts"
+    cat > conftest.$ac_ext <<EOF
+#line 10611 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
-#include <$ac_hdr>
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#else
+#ifdef HAVE_TERMIO_H
+#include <termio.h>
+#endif
+#endif
+#ifdef NEED_PTEM_H
+/* This is a workaround for SCO:  they neglected to define struct winsize in
+ * termios.h -- it's only in termio.h and ptem.h
+ */
+#include        <sys/stream.h>
+#include        <sys/ptem.h>
+#endif
+#if !defined(sun) || !defined(HAVE_TERMIOS_H)
+#include <sys/ioctl.h>
+#endif
+
 int main() {
-DIR *dirp = 0;
+
+#ifdef TIOCGSIZE
+	struct ttysize win;	/* FIXME: what system is this? */
+	int y = win.ts_lines;
+	int x = win.ts_cols;
+#else
+#ifdef TIOCGWINSZ
+	struct winsize win;
+	int y = win.ws_row;
+	int x = win.ws_col;
+#else
+	no TIOCGSIZE or TIOCGWINSZ
+#endif /* TIOCGWINSZ */
+#endif /* TIOCGSIZE */
+	
 ; return 0; }
 EOF
-if { (eval echo configure:9168: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:10650: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
-  eval "ac_cv_header_dirent_$ac_safe=yes"
+  cf_cv_sizechange=yes
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  eval "ac_cv_header_dirent_$ac_safe=no"
+  cf_cv_sizechange=no
 fi
 rm -f conftest*
+
+	CPPFLAGS="$cf_save_CPPFLAGS"
+	if test "$cf_cv_sizechange" = yes ; then
+		echo "size-change succeeded ($cf_opts)" >&5
+		test -n "$cf_opts" && cf_cv_sizechange="$cf_opts"
+		break
+	fi
+done
+
 fi
-if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
+
+echo "$ac_t""$cf_cv_sizechange" 1>&6
+if test "$cf_cv_sizechange" != no ; then
+	cat >> confdefs.h <<\EOF
+#define HAVE_SIZECHANGE 1
 EOF
- ac_header_dirent=$ac_hdr; break
-else
-  echo "$ac_t""no" 1>&6
+
+	case $cf_cv_sizechange in #(vi
+	NEED*)
+		cat >> confdefs.h <<EOF
+#define $cf_cv_sizechange  1
+EOF
+
+		;;
+	esac
 fi
-done
-# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
-if test $ac_header_dirent = dirent.h; then
-echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
-echo "configure:9193: checking for opendir in -ldir" >&5
-ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+
+
+echo $ac_n "checking if sys/time.h conflicts with sys/select.h""... $ac_c" 1>&6
+echo "configure:10689: checking if sys/time.h conflicts with sys/select.h" >&5
+if eval "test \"`echo '$''{'cf_cv_sys_select_timeval'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  ac_save_LIBS="$LIBS"
-LIBS="-ldir  $LIBS"
+  
+for cf_opts in no yes
+do
 cat > conftest.$ac_ext <<EOF
-#line 9201 "configure"
+#line 10697 "configure"
 #include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char opendir();
+
+#define yes 1
+#define no 0
+#if $cf_opts
+#define timeval fake_timeval
+#endif
+#include <sys/types.h>
+#ifdef TIME_WITH_SYS_TIME
+#	include <sys/time.h>
+#	include <time.h>
+#else
+#	ifdef HAVE_SYS_TIME_H
+#		include <sys/time.h>
+#	else
+#		include <time.h>
+#	endif
+#endif
+#undef timeval
+#ifdef HAVE_SYS_SELECT_H
+#	include <sys/select.h>
+#endif
 
 int main() {
-opendir()
+struct timeval foo
 ; return 0; }
 EOF
-if { (eval echo configure:9212: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10725: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
+  cf_cv_sys_select_timeval=$cf_opts
+	 break
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
+  cf_cv_sys_select_timeval=no
 fi
 rm -f conftest*
-LIBS="$ac_save_LIBS"
+done
 
 fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  LIBS="$LIBS -ldir"
-else
-  echo "$ac_t""no" 1>&6
-fi
 
-else
-echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
-echo "configure:9234: checking for opendir in -lx" >&5
-ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+echo "$ac_t""$cf_cv_sys_select_timeval" 1>&6
+test $cf_cv_sys_select_timeval = yes && cat >> confdefs.h <<\EOF
+#define NEED_TIMEVAL_FIX 1
+EOF
+
+
+
+###	Checks for Datatypes.
+echo $ac_n "checking for gid_t""... $ac_c" 1>&6
+echo "configure:10749: checking for gid_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_gid_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  ac_save_LIBS="$LIBS"
-LIBS="-lx  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 9242 "configure"
+  cat > conftest.$ac_ext <<EOF
+#line 10754 "configure"
 #include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char opendir();
-
-int main() {
-opendir()
-; return 0; }
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
 EOF
-if { (eval echo configure:9253: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])gid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
+  ac_cv_type_gid_t=yes
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
+  ac_cv_type_gid_t=no
 fi
 rm -f conftest*
-LIBS="$ac_save_LIBS"
 
 fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  LIBS="$LIBS -lx"
-else
-  echo "$ac_t""no" 1>&6
-fi
+echo "$ac_t""$ac_cv_type_gid_t" 1>&6
+if test $ac_cv_type_gid_t = no; then
+  cat >> confdefs.h <<\EOF
+#define gid_t int
+EOF
 
 fi
 
-echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:9276: checking whether time.h and sys/time.h may both be included" >&5
-if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
+echo $ac_n "checking for mode_t""... $ac_c" 1>&6
+echo "configure:10782: checking for mode_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 9281 "configure"
+#line 10787 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
-#include <sys/time.h>
-#include <time.h>
-int main() {
-struct tm *tp;
-; return 0; }
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
 EOF
-if { (eval echo configure:9290: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
   rm -rf conftest*
-  ac_cv_header_time=yes
+  ac_cv_type_mode_t=yes
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_header_time=no
+  ac_cv_type_mode_t=no
 fi
 rm -f conftest*
-fi
 
-echo "$ac_t""$ac_cv_header_time" 1>&6
-if test $ac_cv_header_time = yes; then
+fi
+echo "$ac_t""$ac_cv_type_mode_t" 1>&6
+if test $ac_cv_type_mode_t = no; then
   cat >> confdefs.h <<\EOF
-#define TIME_WITH_SYS_TIME 1
+#define mode_t int
 EOF
 
 fi
 
-echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:9311: checking for sys/wait.h that is POSIX.1 compatible" >&5
-if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
+echo $ac_n "checking for off_t""... $ac_c" 1>&6
+echo "configure:10815: checking for off_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 9316 "configure"
+#line 10820 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
-#include <sys/wait.h>
-#ifndef WEXITSTATUS
-#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
-#endif
-#ifndef WIFEXITED
-#define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
 #endif
-int main() {
-int s;
-wait (&s);
-s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
-; return 0; }
 EOF
-if { (eval echo configure:9332: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
   rm -rf conftest*
-  ac_cv_header_sys_wait_h=yes
+  ac_cv_type_off_t=yes
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_header_sys_wait_h=no
+  ac_cv_type_off_t=no
 fi
 rm -f conftest*
-fi
 
-echo "$ac_t""$ac_cv_header_sys_wait_h" 1>&6
-if test $ac_cv_header_sys_wait_h = yes; then
+fi
+echo "$ac_t""$ac_cv_type_off_t" 1>&6
+if test $ac_cv_type_off_t = no; then
   cat >> confdefs.h <<\EOF
-#define HAVE_SYS_WAIT_H 1
+#define off_t long
 EOF
 
 fi
 
-
-for cf_hdr in \
-	argz.h \
-	arpa/inet.h \
-	curses.h \
-	errno.h \
-	fcntl.h \
-	getopt.h \
-	ioctl.h \
-	langinfo.h \
-	libc.h \
-	locale.h \
-	malloc.h \
-	net/socket.h \
-	netdb.h \
-	netinet/in.h \
-	netlib.h \
-	nl_types.h \
-	nomacros.h \
-	paths.h	\
-	poll.h \
-	prototypes.h \
-	pwd.h \
-	sgtty.h \
-	socket.h \
-	stdarg.h \
-	stdbool.h \
-	stddef.h \
-	stdlib.h \
-	string.h \
-	strings.h \
-	stropts.h \
-	sys/bsdtypes.h \
-	sys/errno.h \
-	sys/file.h \
-	sys/ioctl.h \
-	sys/param.h \
-	sys/poll.h \
-	sys/ptem.h \
-	sys/pty.h \
-	sys/select.h \
-	sys/stat.h \
-	sys/stream.h \
-	sys/socket.h \
-	sys/time.h \
-	sys/timeb.h \
-	sys/times.h \
-	sys/types.h \
-	sys/utsname.h \
-	term.h \
-	termio.h \
-	time.h \
-	unistd.h \
-	varargs.h \
-	wchar.h \
-	wctype.h \
-
-do
-	echo $ac_n "checking for $cf_hdr""... $ac_c" 1>&6
-echo "configure:9411: checking for $cf_hdr" >&5
-	cat > conftest.$ac_ext <<EOF
-#line 9413 "configure"
+echo $ac_n "checking for pid_t""... $ac_c" 1>&6
+echo "configure:10848: checking for pid_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 10853 "configure"
 #include "confdefs.h"
-
 #include <sys/types.h>
-#include <$cf_hdr>
-
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
 EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9421: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
   rm -rf conftest*
-  cf_found=yes
+  ac_cv_type_pid_t=yes
 else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  cf_found=no
+  ac_cv_type_pid_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_pid_t" 1>&6
+if test $ac_cv_type_pid_t = no; then
+  cat >> confdefs.h <<\EOF
+#define pid_t int
+EOF
+
+fi
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:10881: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 10886 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_size_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_size_t=no
 fi
 rm -f conftest*
-echo "$ac_t""$cf_found" 1>&6
-if test $cf_found = yes ; then
-	
-cf_tr_hdr=`echo "$cf_hdr" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
 
-	cat >> confdefs.h <<EOF
-#define HAVE_${cf_tr_hdr} 1
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+  cat >> confdefs.h <<\EOF
+#define size_t unsigned
 EOF
 
 fi
-done
-
-
-###	Checks that depend on existence-checks for headers
-
-for ac_hdr in \
-termio.h \
-termios.h \
-unistd.h \
 
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:9457: checking for $ac_hdr" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+echo $ac_n "checking for ssize_t""... $ac_c" 1>&6
+echo "configure:10914: checking for ssize_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_ssize_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 9462 "configure"
+#line 10919 "configure"
 #include "confdefs.h"
-#include <$ac_hdr>
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
 EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9467: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])ssize_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
   rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
+  ac_cv_type_ssize_t=yes
 else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
+  ac_cv_type_ssize_t=no
 fi
 rm -f conftest*
+
 fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
+echo "$ac_t""$ac_cv_type_ssize_t" 1>&6
+if test $ac_cv_type_ssize_t = no; then
+  cat >> confdefs.h <<\EOF
+#define ssize_t int
 EOF
- 
-else
-  echo "$ac_t""no" 1>&6
+
 fi
-done
 
-if test "$ISC" = yes ; then
-	for ac_hdr in sys/termio.h 
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:9498: checking for $ac_hdr" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+echo $ac_n "checking for time_t""... $ac_c" 1>&6
+echo "configure:10947: checking for time_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_time_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 9503 "configure"
+#line 10952 "configure"
 #include "confdefs.h"
-#include <$ac_hdr>
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
 EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9508: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])time_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
   rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
+  ac_cv_type_time_t=yes
 else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
+  ac_cv_type_time_t=no
 fi
 rm -f conftest*
+
 fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
+echo "$ac_t""$ac_cv_type_time_t" 1>&6
+if test $ac_cv_type_time_t = no; then
+  cat >> confdefs.h <<\EOF
+#define time_t long
 EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
 
 fi
-if test "$ac_cv_header_termios_h" = yes ; then
-	case "$CFLAGS $CPPFLAGS" in
-	*-D_POSIX_SOURCE*)
-		termios_bad=dunno ;;
-	*)	termios_bad=maybe ;;
-	esac
-	if test "$termios_bad" = maybe ; then
-	echo $ac_n "checking whether termios.h needs _POSIX_SOURCE""... $ac_c" 1>&6
-echo "configure:9543: checking whether termios.h needs _POSIX_SOURCE" >&5
-	cat > conftest.$ac_ext <<EOF
-#line 9545 "configure"
+
+cat > conftest.$ac_ext <<EOF
+#line 10980 "configure"
 #include "confdefs.h"
-#include <termios.h>
-int main() {
-struct termios foo; int x = foo.c_iflag
-; return 0; }
+#include <netinet/in.h>
 EOF
-if { (eval echo configure:9552: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "in_addr_t" >/dev/null 2>&1; then
+  :
+else
   rm -rf conftest*
-  termios_bad=no
+  
+	cat > conftest.$ac_ext <<EOF
+#line 10991 "configure"
+#include "confdefs.h"
+#include <sys/endian.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "in_addr_t" >/dev/null 2>&1; then
+  :
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
   rm -rf conftest*
   
-		cat > conftest.$ac_ext <<EOF
-#line 9561 "configure"
+		echo $ac_n "checking for in_addr_t""... $ac_c" 1>&6
+echo "configure:11002: checking for in_addr_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_in_addr_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 11007 "configure"
 #include "confdefs.h"
-
-#define _POSIX_SOURCE
-#include <termios.h>
-int main() {
-struct termios foo; int x = foo.c_iflag
-; return 0; }
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
 EOF
-if { (eval echo configure:9570: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])in_addr_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
   rm -rf conftest*
-  termios_bad=unknown
+  ac_cv_type_in_addr_t=yes
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  termios_bad=yes cat >> confdefs.h <<\EOF
-#define SVR4_TERMIO 1
+  ac_cv_type_in_addr_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_in_addr_t" 1>&6
+if test $ac_cv_type_in_addr_t = no; then
+  cat >> confdefs.h <<\EOF
+#define in_addr_t unsigned long
 EOF
 
 fi
-rm -f conftest*
-			
+
+	
 fi
 rm -f conftest*
-	echo "$ac_t""$termios_bad" 1>&6
-	fi
-fi
 
 
+fi
+rm -f conftest*
 
-echo $ac_n "checking declaration of size-change""... $ac_c" 1>&6
-echo "configure:9593: checking declaration of size-change" >&5
-if eval "test \"`echo '$''{'cf_cv_sizechange'+set}'`\" = set"; then
+echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
+echo "configure:11043: checking for uid_t in sys/types.h" >&5
+if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  
-    cf_cv_sizechange=unknown
-    cf_save_CPPFLAGS="$CPPFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 11048 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "uid_t" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_uid_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_uid_t=no
+fi
+rm -f conftest*
 
-for cf_opts in "" "NEED_PTEM_H"
-do
+fi
 
-    CPPFLAGS="$cf_save_CPPFLAGS"
-    test -n "$cf_opts" && CPPFLAGS="$CPPFLAGS -D$cf_opts"
-    cat > conftest.$ac_ext <<EOF
-#line 9607 "configure"
+echo "$ac_t""$ac_cv_type_uid_t" 1>&6
+if test $ac_cv_type_uid_t = no; then
+  cat >> confdefs.h <<\EOF
+#define uid_t int
+EOF
+
+  cat >> confdefs.h <<\EOF
+#define gid_t int
+EOF
+
+fi
+
+
+echo $ac_n "checking for quad_t""... $ac_c" 1>&6
+echo "configure:11078: checking for quad_t" >&5
+cat > conftest.$ac_ext <<EOF
+#line 11080 "configure"
 #include "confdefs.h"
+
 #include <sys/types.h>
-#ifdef HAVE_TERMIOS_H
-#include <termios.h>
-#else
-#ifdef HAVE_TERMIO_H
-#include <termio.h>
-#endif
-#endif
-#ifdef NEED_PTEM_H
-/* This is a workaround for SCO:  they neglected to define struct winsize in
- * termios.h -- it's only in termio.h and ptem.h
- */
-#include        <sys/stream.h>
-#include        <sys/ptem.h>
-#endif
-#if !defined(sun) || !defined(HAVE_TERMIOS_H)
-#include <sys/ioctl.h>
-#endif
+#if 0
+#include <stdlib.h>
+#include <stddef.h>
+#endif /* 0 */
 
 int main() {
+quad_t x; x = 0
+; return 0; }
+EOF
+if { (eval echo configure:11093: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_quad_t=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_quad_t=no
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_quad_t" 1>&6
+if test $ac_cv_quad_t = yes; then
+	cat >> confdefs.h <<\EOF
+#define HAVE_QUAD_T 1
+EOF
 
-#ifdef TIOCGSIZE
-	struct ttysize win;	/* FIXME: what system is this? */
-	int y = win.ts_lines;
-	int x = win.ts_cols;
-#else
-#ifdef TIOCGWINSZ
-	struct winsize win;
-	int y = win.ws_row;
-	int x = win.ws_col;
-#else
-	no TIOCGSIZE or TIOCGWINSZ
-#endif /* TIOCGWINSZ */
-#endif /* TIOCGSIZE */
-	
+fi
+
+echo $ac_n "checking for long long""... $ac_c" 1>&6
+echo "configure:11112: checking for long long" >&5
+cat > conftest.$ac_ext <<EOF
+#line 11114 "configure"
+#include "confdefs.h"
+
+#include <sys/types.h>
+
+int main() {
+long long x; x = 0
 ; return 0; }
 EOF
-if { (eval echo configure:9646: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11123: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
-  cf_cv_sizechange=yes
+  ac_cv_long_long=yes
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  cf_cv_sizechange=no
+  ac_cv_long_long=no
 fi
 rm -f conftest*
-
-	CPPFLAGS="$cf_save_CPPFLAGS"
-	if test "$cf_cv_sizechange" = yes ; then
-		echo "size-change succeeded ($cf_opts)" >&5
-		test -n "$cf_opts" && cf_cv_sizechange="$cf_opts"
-		break
-	fi
-done
-
-fi
-
-echo "$ac_t""$cf_cv_sizechange" 1>&6
-if test "$cf_cv_sizechange" != no ; then
+echo "$ac_t""$ac_cv_long_long" 1>&6
+if test $ac_cv_long_long = yes; then
 	cat >> confdefs.h <<\EOF
-#define HAVE_SIZECHANGE 1
-EOF
-
-	case $cf_cv_sizechange in #(vi
-	NEED*)
-		cat >> confdefs.h <<EOF
-#define $cf_cv_sizechange  1
+#define HAVE_LONG_LONG 1
 EOF
 
-		;;
-	esac
 fi
 
-
-echo $ac_n "checking if sys/time.h conflicts with sys/select.h""... $ac_c" 1>&6
-echo "configure:9685: checking if sys/time.h conflicts with sys/select.h" >&5
-if eval "test \"`echo '$''{'cf_cv_sys_select_timeval'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  
-for cf_opts in no yes
-do
+echo $ac_n "checking for nl_item""... $ac_c" 1>&6
+echo "configure:11142: checking for nl_item" >&5
 cat > conftest.$ac_ext <<EOF
-#line 9693 "configure"
+#line 11144 "configure"
 #include "confdefs.h"
 
-#define yes 1
-#define no 0
-#if $cf_opts
-#define timeval fake_timeval
-#endif
-#include <sys/types.h>
-#ifdef TIME_WITH_SYS_TIME
-#	include <sys/time.h>
-#	include <time.h>
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
 #else
-#	ifdef HAVE_SYS_TIME_H
-#		include <sys/time.h>
-#	else
-#		include <time.h>
-#	endif
+#ifdef HAVE_NL_TYPES_H
+#include <nl_types.h>
 #endif
-#undef timeval
-#ifdef HAVE_SYS_SELECT_H
-#	include <sys/select.h>
 #endif
 
 int main() {
-struct timeval foo
+nl_item x; x = 0
 ; return 0; }
 EOF
-if { (eval echo configure:9721: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11159: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
-  cf_cv_sys_select_timeval=$cf_opts
-	 break
+  ac_cv_nl_item=yes
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  cf_cv_sys_select_timeval=no
+  ac_cv_nl_item=no
 fi
 rm -f conftest*
-done
-
-fi
-
-echo "$ac_t""$cf_cv_sys_select_timeval" 1>&6
-test $cf_cv_sys_select_timeval = yes && cat >> confdefs.h <<\EOF
-#define NEED_TIMEVAL_FIX 1
+echo "$ac_t""$ac_cv_nl_item" 1>&6
+if test $ac_cv_nl_item = yes; then
+        cat >> confdefs.h <<\EOF
+#define HAVE_NL_ITEM 1
 EOF
 
+fi
 
-
-###	Checks for Datatypes.
-echo $ac_n "checking for gid_t""... $ac_c" 1>&6
-echo "configure:9745: checking for gid_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_gid_t'+set}'`\" = set"; then
+###	Checks for libraries.
+# libuu/uudeview
+# only define HAVE_LIBUU and HAVE_UUDEVIEW_H if both are found
+echo $ac_n "checking for UUInitialize in -luu""... $ac_c" 1>&6
+echo "configure:11181: checking for UUInitialize in -luu" >&5
+ac_lib_var=`echo uu'_'UUInitialize | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  cat > conftest.$ac_ext <<EOF
-#line 9750 "configure"
+  ac_save_LIBS="$LIBS"
+LIBS="-luu  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 11189 "configure"
 #include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char UUInitialize();
+
+int main() {
+UUInitialize()
+; return 0; }
 EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "(^|[^a-zA-Z_0-9])gid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+if { (eval echo configure:11200: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  ac_cv_type_gid_t=yes
+  eval "ac_cv_lib_$ac_lib_var=yes"
 else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_type_gid_t=no
+  eval "ac_cv_lib_$ac_lib_var=no"
 fi
 rm -f conftest*
+LIBS="$ac_save_LIBS"
 
 fi
-echo "$ac_t""$ac_cv_type_gid_t" 1>&6
-if test $ac_cv_type_gid_t = no; then
-  cat >> confdefs.h <<\EOF
-#define gid_t int
-EOF
-
-fi
-
-echo $ac_n "checking for mode_t""... $ac_c" 1>&6
-echo "configure:9778: checking for mode_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  ac_safe=`echo "uudeview.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for uudeview.h""... $ac_c" 1>&6
+echo "configure:11217: checking for uudeview.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 9783 "configure"
+#line 11222 "configure"
 #include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
+#include <uudeview.h>
 EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "(^|[^a-zA-Z_0-9])mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:11227: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
   rm -rf conftest*
-  ac_cv_type_mode_t=yes
+  eval "ac_cv_header_$ac_safe=yes"
 else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_type_mode_t=no
+  eval "ac_cv_header_$ac_safe=no"
 fi
 rm -f conftest*
-
 fi
-echo "$ac_t""$ac_cv_type_mode_t" 1>&6
-if test $ac_cv_type_mode_t = no; then
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
   cat >> confdefs.h <<\EOF
-#define mode_t int
+#define HAVE_LIBUU 1
 EOF
 
-fi
-
-echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:9811: checking for off_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 9816 "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
+		cat >> confdefs.h <<\EOF
+#define HAVE_UUDEVIEW_H 1
 EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
-  rm -rf conftest*
-  ac_cv_type_off_t=yes
+
+		LIBS="$LIBS -luu"
+	
 else
-  rm -rf conftest*
-  ac_cv_type_off_t=no
+  echo "$ac_t""no" 1>&6
 fi
-rm -f conftest*
 
-fi
-echo "$ac_t""$ac_cv_type_off_t" 1>&6
-if test $ac_cv_type_off_t = no; then
-  cat >> confdefs.h <<\EOF
-#define off_t long
-EOF
 
+else
+  echo "$ac_t""no" 1>&6
 fi
 
-echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:9844: checking for pid_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
+
+# libidn - Internationalized Domain Names
+echo $ac_n "checking for stringprep_check_version in -lidn""... $ac_c" 1>&6
+echo "configure:11265: checking for stringprep_check_version in -lidn" >&5
+ac_lib_var=`echo idn'_'stringprep_check_version | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  cat > conftest.$ac_ext <<EOF
-#line 9849 "configure"
+  ac_save_LIBS="$LIBS"
+LIBS="-lidn  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 11273 "configure"
 #include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char stringprep_check_version();
+
+int main() {
+stringprep_check_version()
+; return 0; }
 EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "(^|[^a-zA-Z_0-9])pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+if { (eval echo configure:11284: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  ac_cv_type_pid_t=yes
+  eval "ac_cv_lib_$ac_lib_var=yes"
 else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_type_pid_t=no
+  eval "ac_cv_lib_$ac_lib_var=no"
 fi
 rm -f conftest*
+LIBS="$ac_save_LIBS"
 
 fi
-echo "$ac_t""$ac_cv_type_pid_t" 1>&6
-if test $ac_cv_type_pid_t = no; then
-  cat >> confdefs.h <<\EOF
-#define pid_t int
-EOF
-
-fi
-
-echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:9877: checking for size_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  ac_safe=`echo "stringprep.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for stringprep.h""... $ac_c" 1>&6
+echo "configure:11301: checking for stringprep.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 9882 "configure"
+#line 11306 "configure"
 #include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
+#include <stringprep.h>
 EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:11311: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
   rm -rf conftest*
-  ac_cv_type_size_t=yes
+  eval "ac_cv_header_$ac_safe=yes"
 else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_type_size_t=no
+  eval "ac_cv_header_$ac_safe=no"
 fi
 rm -f conftest*
-
-fi
-echo "$ac_t""$ac_cv_type_size_t" 1>&6
-if test $ac_cv_type_size_t = no; then
-  cat >> confdefs.h <<\EOF
-#define size_t unsigned
-EOF
-
 fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  
+		cat >> confdefs.h <<\EOF
+#define HAVE_STRINGPREP_H 1
+EOF
 
-echo $ac_n "checking for ssize_t""... $ac_c" 1>&6
-echo "configure:9910: checking for ssize_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_ssize_t'+set}'`\" = set"; then
+		ac_safe=`echo "idna.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for idna.h""... $ac_c" 1>&6
+echo "configure:11334: checking for idna.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 9915 "configure"
+#line 11339 "configure"
 #include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
+#include <idna.h>
 EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "(^|[^a-zA-Z_0-9])ssize_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:11344: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
   rm -rf conftest*
-  ac_cv_type_ssize_t=yes
+  eval "ac_cv_header_$ac_safe=yes"
 else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_type_ssize_t=no
+  eval "ac_cv_header_$ac_safe=no"
 fi
 rm -f conftest*
-
 fi
-echo "$ac_t""$ac_cv_type_ssize_t" 1>&6
-if test $ac_cv_type_ssize_t = no; then
-  cat >> confdefs.h <<\EOF
-#define ssize_t int
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  
+			cat >> confdefs.h <<\EOF
+#define HAVE_IDNA_H 1
 EOF
 
-fi
-
-echo $ac_n "checking for time_t""... $ac_c" 1>&6
-echo "configure:9943: checking for time_t" >&5
-if eval "test \"`echo '$''{'ac_cv_type_time_t'+set}'`\" = set"; then
+			echo $ac_n "checking for idna_to_unicode_lzlz in -lidn""... $ac_c" 1>&6
+echo "configure:11366: checking for idna_to_unicode_lzlz in -lidn" >&5
+ac_lib_var=`echo idn'_'idna_to_unicode_lzlz | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  cat > conftest.$ac_ext <<EOF
-#line 9948 "configure"
+  ac_save_LIBS="$LIBS"
+LIBS="-lidn  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 11374 "configure"
 #include "confdefs.h"
-#include <sys/types.h>
-#if STDC_HEADERS
-#include <stdlib.h>
-#include <stddef.h>
-#endif
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char idna_to_unicode_lzlz();
+
+int main() {
+idna_to_unicode_lzlz()
+; return 0; }
 EOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "(^|[^a-zA-Z_0-9])time_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+if { (eval echo configure:11385: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  ac_cv_type_time_t=yes
+  eval "ac_cv_lib_$ac_lib_var=yes"
 else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_type_time_t=no
+  eval "ac_cv_lib_$ac_lib_var=no"
 fi
 rm -f conftest*
+LIBS="$ac_save_LIBS"
 
 fi
-echo "$ac_t""$ac_cv_type_time_t" 1>&6
-if test $ac_cv_type_time_t = no; then
-  cat >> confdefs.h <<\EOF
-#define time_t long
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  
+				cat >> confdefs.h <<\EOF
+#define HAVE_IDNA_TO_UNICODE_LZLZ 1
 EOF
 
-fi
-
-echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:9976: checking for uid_t in sys/types.h" >&5
-if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 9981 "configure"
+				echo $ac_n "checking for IDNA_USE_STD3_ASCII_RULES""... $ac_c" 1>&6
+echo "configure:11406: checking for IDNA_USE_STD3_ASCII_RULES" >&5
+				cat > conftest.$ac_ext <<EOF
+#line 11408 "configure"
 #include "confdefs.h"
-#include <sys/types.h>
+#include <idna.h>
 EOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "uid_t" >/dev/null 2>&1; then
+  egrep "IDNA_USE_STD3_ASCII_RULES" >/dev/null 2>&1; then
   rm -rf conftest*
-  ac_cv_type_uid_t=yes
+  
+					cat >> confdefs.h <<\EOF
+#define HAVE_IDNA_USE_STD3_ASCII_RULES 1
+EOF
+
+					echo "$ac_t""yes" 1>&6
 else
   rm -rf conftest*
-  ac_cv_type_uid_t=no
+  echo "$ac_t""no" 1>&6
+				
 fi
 rm -f conftest*
 
+			
+else
+  echo "$ac_t""no" 1>&6
 fi
 
-echo "$ac_t""$ac_cv_type_uid_t" 1>&6
-if test $ac_cv_type_uid_t = no; then
-  cat >> confdefs.h <<\EOF
-#define uid_t int
-EOF
+		
+else
+  echo "$ac_t""no" 1>&6
+fi
 
-  cat >> confdefs.h <<\EOF
-#define gid_t int
+		cat >> confdefs.h <<\EOF
+#define HAVE_LIBIDN 1
 EOF
 
+		LIBS="$LIBS -lidn"
+	
+else
+  echo "$ac_t""no" 1>&6
 fi
 
 
-echo $ac_n "checking for quad_t""... $ac_c" 1>&6
-echo "configure:10011: checking for quad_t" >&5
-cat > conftest.$ac_ext <<EOF
-#line 10013 "configure"
-#include "confdefs.h"
+else
+  echo "$ac_t""no" 1>&6
+fi
 
-#include <sys/types.h>
-#if 0
-#include <stdlib.h>
-#include <stddef.h>
-#endif /* 0 */
 
-int main() {
-quad_t x; x = 0
-; return 0; }
+# ICU - International Components for Unicode
+ac_safe=`echo "unicode/unorm.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for unicode/unorm.h""... $ac_c" 1>&6
+echo "configure:11457: checking for unicode/unorm.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 11462 "configure"
+#include "confdefs.h"
+#include <unicode/unorm.h>
 EOF
-if { (eval echo configure:10026: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:11467: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
   rm -rf conftest*
-  ac_cv_quad_t=yes
+  eval "ac_cv_header_$ac_safe=yes"
 else
+  echo "$ac_err" >&5
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_quad_t=no
+  eval "ac_cv_header_$ac_safe=no"
 fi
 rm -f conftest*
-echo "$ac_t""$ac_cv_quad_t" 1>&6
-if test $ac_cv_quad_t = yes; then
-	cat >> confdefs.h <<\EOF
-#define HAVE_QUAD_T 1
-EOF
-
 fi
-
-echo $ac_n "checking for long long""... $ac_c" 1>&6
-echo "configure:10045: checking for long long" >&5
-cat > conftest.$ac_ext <<EOF
-#line 10047 "configure"
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  
+	ac_safe=`echo "unicode/ustring.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for unicode/ustring.h""... $ac_c" 1>&6
+echo "configure:11486: checking for unicode/ustring.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 11491 "configure"
 #include "confdefs.h"
-
-#include <sys/types.h>
-
-int main() {
-long long x; x = 0
-; return 0; }
+#include <unicode/ustring.h>
 EOF
-if { (eval echo configure:10056: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:11496: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
   rm -rf conftest*
-  ac_cv_long_long=yes
+  eval "ac_cv_header_$ac_safe=yes"
 else
+  echo "$ac_err" >&5
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  ac_cv_long_long=no
+  eval "ac_cv_header_$ac_safe=no"
 fi
 rm -f conftest*
-echo "$ac_t""$ac_cv_long_long" 1>&6
-if test $ac_cv_long_long = yes; then
-	cat >> confdefs.h <<\EOF
-#define HAVE_LONG_LONG 1
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  
+		cat >> confdefs.h <<\EOF
+#define HAVE_UNICODE_UNORM_H 1
 EOF
 
-fi
+		cat >> confdefs.h <<\EOF
+#define HAVE_UNICODE_USTRING_H 1
+EOF
 
-###	Checks for libraries.
-# libuu/uudeview
-# only define HAVE_LIBUU and HAVE_UUDEVIEW_H if both are found
-echo $ac_n "checking for UUInitialize in -luu""... $ac_c" 1>&6
-echo "configure:10078: checking for UUInitialize in -luu" >&5
-ac_lib_var=`echo uu'_'UUInitialize | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  ac_save_LIBS="$LIBS"
-LIBS="-luu  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 10086 "configure"
+		echo $ac_n "checking for unorm_normalize in libicuuc""... $ac_c" 1>&6
+echo "configure:11522: checking for unorm_normalize in libicuuc" >&5
+		cf_save_LIBS="$LIBS"
+		cf_try_icuuc="no"
+		LIBS="$LIBS -licuuc"
+		cat > conftest.$ac_ext <<EOF
+#line 11527 "configure"
 #include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char UUInitialize();
-
+#include <unicode/unorm.h>
 int main() {
-UUInitialize()
+
+			int32_t needed, ustr = NULL;
+ 			UErrorCode status;
+			needed = unorm_normalize(ustr, -1, UNORM_DEFAULT, 0, NULL, 0, &status);
 ; return 0; }
 EOF
-if { (eval echo configure:10097: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11537: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
+  
+			cat >> confdefs.h <<\EOF
+#define HAVE_LIBICUUC 1
+EOF
+
+			cf_try_icuuc="yes"
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
+  LIBS=$cf_save_LIBS
+		
 fi
 rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  ac_safe=`echo "uudeview.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for uudeview.h""... $ac_c" 1>&6
-echo "configure:10114: checking for uudeview.h" >&5
+		echo "$ac_t""$cf_try_icuuc" 1>&6
+		ac_safe=`echo "unicode/ubidi.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for unicode/ubidi.h""... $ac_c" 1>&6
+echo "configure:11556: checking for unicode/ubidi.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 10119 "configure"
+#line 11561 "configure"
 #include "confdefs.h"
-#include <uudeview.h>
+#include <unicode/ubidi.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10124: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11566: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -10136,15 +11578,16 @@ rm -f conftest*
 fi
 if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
-  cat >> confdefs.h <<\EOF
-#define HAVE_LIBUU 1
+  
+			cat >> confdefs.h <<\EOF
+#define HAVE_UNICODE_UBIDI_H 1
 EOF
 
-		cat >> confdefs.h <<\EOF
-#define HAVE_UUDEVIEW_H 1
-EOF
+		
+else
+  echo "$ac_t""no" 1>&6
+fi
 
-		LIBS="$LIBS -luu"
 	
 else
   echo "$ac_t""no" 1>&6
@@ -10166,24 +11609,24 @@ else
   
 cf_cv_termlib=none
 cat > conftest.$ac_ext <<EOF
-#line 10170 "configure"
+#line 11613 "configure"
 #include "confdefs.h"
 
 int main() {
 char *x=(char*)tgoto("",0,0)
 ; return 0; }
 EOF
-if { (eval echo configure:10177: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11620: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cat > conftest.$ac_ext <<EOF
-#line 10180 "configure"
+#line 11623 "configure"
 #include "confdefs.h"
 
 int main() {
 int x=tigetstr("")
 ; return 0; }
 EOF
-if { (eval echo configure:10187: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11630: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_termlib=terminfo
 else
@@ -10212,16 +11655,16 @@ if test "$cf_cv_termlib" = none; then
 	for cf_func in tigetstr tgetstr
 	do
 		echo $ac_n "checking for $cf_func in -l$cf_lib""... $ac_c" 1>&6
-echo "configure:10216: checking for $cf_func in -l$cf_lib" >&5
+echo "configure:11659: checking for $cf_func in -l$cf_lib" >&5
 		cat > conftest.$ac_ext <<EOF
-#line 10218 "configure"
+#line 11661 "configure"
 #include "confdefs.h"
 
 int main() {
 int x=$cf_func("")
 ; return 0; }
 EOF
-if { (eval echo configure:10225: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11668: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_result=yes
 else
@@ -10248,7 +11691,7 @@ fi
 if test "$cf_cv_termlib" = none; then
 	# allow curses library for broken AIX system.
 	echo $ac_n "checking for initscr in -lcurses""... $ac_c" 1>&6
-echo "configure:10252: checking for initscr in -lcurses" >&5
+echo "configure:11695: checking for initscr in -lcurses" >&5
 ac_lib_var=`echo curses'_'initscr | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -10256,7 +11699,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lcurses  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 10260 "configure"
+#line 11703 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -10267,7 +11710,7 @@ int main() {
 initscr()
 ; return 0; }
 EOF
-if { (eval echo configure:10271: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11714: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -10288,7 +11731,7 @@ else
 fi
 
 	echo $ac_n "checking for tgoto in -ltermcap""... $ac_c" 1>&6
-echo "configure:10292: checking for tgoto in -ltermcap" >&5
+echo "configure:11735: checking for tgoto in -ltermcap" >&5
 ac_lib_var=`echo termcap'_'tgoto | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -10296,7 +11739,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ltermcap  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 10300 "configure"
+#line 11743 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -10307,7 +11750,7 @@ int main() {
 tgoto()
 ; return 0; }
 EOF
-if { (eval echo configure:10311: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11754: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -10340,11 +11783,11 @@ fi
 	# terminfo-based termcap interfaces may be prototyped in <curses.h>,
 	# which may/may not be compatible with <termcap.h>
 	echo $ac_n "checking if we should include termcap.h""... $ac_c" 1>&6
-echo "configure:10344: checking if we should include termcap.h" >&5
+echo "configure:11787: checking if we should include termcap.h" >&5
 	cf_save_CFLAGS="$CFLAGS"
 	CFLAGS="$CFLAGS -I$srcdir/include"
 	cat > conftest.$ac_ext <<EOF
-#line 10348 "configure"
+#line 11791 "configure"
 #include "confdefs.h"
 
 #define HAVE_TERMCAP_H 1
@@ -10357,7 +11800,7 @@ make an error
 
 ; return 0; }
 EOF
-if { (eval echo configure:10361: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11804: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_result=yes
 else
@@ -10375,17 +11818,20 @@ EOF
 
 	
 echo $ac_n "checking for term.h""... $ac_c" 1>&6
-echo "configure:10379: checking for term.h" >&5
+echo "configure:11822: checking for term.h" >&5
 if eval "test \"`echo '$''{'cf_cv_term_header'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
+
+# If we found <ncurses/curses.h>, look for <ncurses/term.h>, but always look
+# for <term.h> if we do not find the variant.
 for cf_header in \
-	ncurses/term.h \
+	`echo ${cf_cv_ncurses_header-curses.h} | sed -e 's%/.*%/%'`term.h \
 	term.h
 do
 	cat > conftest.$ac_ext <<EOF
-#line 10389 "configure"
+#line 11835 "configure"
 #include "confdefs.h"
 
 #include <${cf_cv_ncurses_header-curses.h}>
@@ -10394,9 +11840,10 @@ int main() {
 WINDOW *x
 ; return 0; }
 EOF
-if { (eval echo configure:10398: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11844: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_term_header=$cf_header
+	 break
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
@@ -10423,12 +11870,18 @@ ncurses/term.h)
 EOF
 
 	;;
+ncursesw/term.h)
+	cat >> confdefs.h <<\EOF
+#define HAVE_NCURSESW_TERM_H 1
+EOF
+
+	;;
 esac
 
 
 
 echo $ac_n "checking if we should include curses.h or termcap.h""... $ac_c" 1>&6
-echo "configure:10432: checking if we should include curses.h or termcap.h" >&5
+echo "configure:11885: checking if we should include curses.h or termcap.h" >&5
 if eval "test \"`echo '$''{'cf_cv_need_curses_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -10446,7 +11899,7 @@ do
     test -n "$cf_t_opts" && CPPFLAGS="$CPPFLAGS -D$cf_t_opts"
 
     cat > conftest.$ac_ext <<EOF
-#line 10450 "configure"
+#line 11903 "configure"
 #include "confdefs.h"
 /* $cf_c_opts $cf_t_opts */
 $CHECK_DECL_HDRS
@@ -10454,7 +11907,7 @@ int main() {
 char *x = (char *)tgoto("")
 ; return 0; }
 EOF
-if { (eval echo configure:10458: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11911: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   test "$cf_cv_need_curses_h" = no && {
 	     cf_cv_need_curses_h=maybe
@@ -10467,7 +11920,7 @@ else
   rm -rf conftest*
   echo "Recompiling with corrected call (C:$cf_c_opts, T:$cf_t_opts)" >&5
 	cat > conftest.$ac_ext <<EOF
-#line 10471 "configure"
+#line 11924 "configure"
 #include "confdefs.h"
 
 $CHECK_DECL_HDRS
@@ -10475,7 +11928,7 @@ int main() {
 char *x = (char *)tgoto("",0,0)
 ; return 0; }
 EOF
-if { (eval echo configure:10479: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11932: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_need_curses_h=yes
 	 cf_ok_c_opts=$cf_c_opts
@@ -10551,7 +12004,7 @@ esac
 
 
 echo $ac_n "checking declaration of tputs 3rd param""... $ac_c" 1>&6
-echo "configure:10555: checking declaration of tputs 3rd param" >&5
+echo "configure:12008: checking declaration of tputs 3rd param" >&5
 if eval "test \"`echo '$''{'cf_cv_type_outchar'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -10567,10 +12020,10 @@ for Q in int void; do
 for R in int char; do
 for S in "" const; do
 	
-echo "(line 10571) testing loop variables P:$P, Q:$Q, R:$R, S:$S ..." 1>&5
+echo "(line 12024) testing loop variables P:$P, Q:$Q, R:$R, S:$S ..." 1>&5
 
 	cat > conftest.$ac_ext <<EOF
-#line 10574 "configure"
+#line 12027 "configure"
 #include "confdefs.h"
 $CHECK_DECL_HDRS
 int main() {
@@ -10579,7 +12032,7 @@ extern $Q OutChar($R);
 	tputs("", 1, OutChar)
 ; return 0; }
 EOF
-if { (eval echo configure:10583: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12036: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_type_outchar="$Q OutChar($R)"
 	 cf_cv_found=yes
@@ -10634,14 +12087,14 @@ EOF
 elif test ".$cf_cv_termlib" = .termcap ; then
 	# BSD 'tputs()' may need 'PC' to be set.
 	cat > conftest.$ac_ext <<EOF
-#line 10638 "configure"
+#line 12091 "configure"
 #include "confdefs.h"
 
 int main() {
 extern char PC; PC = 0
 ; return 0; }
 EOF
-if { (eval echo configure:10645: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12098: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cat >> confdefs.h <<\EOF
 #define HAVE_EXTERN_TCAP_PC 1
@@ -10660,13 +12113,13 @@ fi
 
 
 echo $ac_n "checking if external errno is declared""... $ac_c" 1>&6
-echo "configure:10664: checking if external errno is declared" >&5
+echo "configure:12117: checking if external errno is declared" >&5
 if eval "test \"`echo '$''{'cf_cv_dcl_errno'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
     cat > conftest.$ac_ext <<EOF
-#line 10670 "configure"
+#line 12123 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_STDLIB_H
@@ -10679,7 +12132,7 @@ int main() {
 long x = (long) errno
 ; return 0; }
 EOF
-if { (eval echo configure:10683: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12136: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_dcl_errno=yes
 else
@@ -10707,13 +12160,13 @@ fi
 # It's possible (for near-UNIX clones) that the data doesn't exist
 
 echo $ac_n "checking if external errno exists""... $ac_c" 1>&6
-echo "configure:10711: checking if external errno exists" >&5
+echo "configure:12164: checking if external errno exists" >&5
 if eval "test \"`echo '$''{'cf_cv_have_errno'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
     cat > conftest.$ac_ext <<EOF
-#line 10717 "configure"
+#line 12170 "configure"
 #include "confdefs.h"
 
 #undef errno
@@ -10723,7 +12176,7 @@ int main() {
 errno = 2
 ; return 0; }
 EOF
-if { (eval echo configure:10727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12180: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_have_errno=yes
 else
@@ -10755,12 +12208,12 @@ fi
 for ac_func in strerror
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10759: checking for $ac_func" >&5
+echo "configure:12212: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 10764 "configure"
+#line 12217 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -10783,7 +12236,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:10787: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12240: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -10810,13 +12263,13 @@ else
 
     
 echo $ac_n "checking if external sys_nerr is declared""... $ac_c" 1>&6
-echo "configure:10814: checking if external sys_nerr is declared" >&5
+echo "configure:12267: checking if external sys_nerr is declared" >&5
 if eval "test \"`echo '$''{'cf_cv_dcl_sys_nerr'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
     cat > conftest.$ac_ext <<EOF
-#line 10820 "configure"
+#line 12273 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_STDLIB_H
@@ -10829,7 +12282,7 @@ int main() {
 long x = (long) sys_nerr
 ; return 0; }
 EOF
-if { (eval echo configure:10833: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12286: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_dcl_sys_nerr=yes
 else
@@ -10857,13 +12310,13 @@ fi
 # It's possible (for near-UNIX clones) that the data doesn't exist
 
 echo $ac_n "checking if external sys_nerr exists""... $ac_c" 1>&6
-echo "configure:10861: checking if external sys_nerr exists" >&5
+echo "configure:12314: checking if external sys_nerr exists" >&5
 if eval "test \"`echo '$''{'cf_cv_have_sys_nerr'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
     cat > conftest.$ac_ext <<EOF
-#line 10867 "configure"
+#line 12320 "configure"
 #include "confdefs.h"
 
 #undef sys_nerr
@@ -10873,7 +12326,7 @@ int main() {
 sys_nerr = 2
 ; return 0; }
 EOF
-if { (eval echo configure:10877: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12330: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_have_sys_nerr=yes
 else
@@ -10902,13 +12355,13 @@ fi
 
     
 echo $ac_n "checking if external sys_errlist is declared""... $ac_c" 1>&6
-echo "configure:10906: checking if external sys_errlist is declared" >&5
+echo "configure:12359: checking if external sys_errlist is declared" >&5
 if eval "test \"`echo '$''{'cf_cv_dcl_sys_errlist'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
     cat > conftest.$ac_ext <<EOF
-#line 10912 "configure"
+#line 12365 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_STDLIB_H
@@ -10921,7 +12374,7 @@ int main() {
 long x = (long) sys_errlist
 ; return 0; }
 EOF
-if { (eval echo configure:10925: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12378: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_dcl_sys_errlist=yes
 else
@@ -10949,13 +12402,13 @@ fi
 # It's possible (for near-UNIX clones) that the data doesn't exist
 
 echo $ac_n "checking if external sys_errlist exists""... $ac_c" 1>&6
-echo "configure:10953: checking if external sys_errlist exists" >&5
+echo "configure:12406: checking if external sys_errlist exists" >&5
 if eval "test \"`echo '$''{'cf_cv_have_sys_errlist'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
     cat > conftest.$ac_ext <<EOF
-#line 10959 "configure"
+#line 12412 "configure"
 #include "confdefs.h"
 
 #undef sys_errlist
@@ -10965,7 +12418,7 @@ int main() {
 sys_errlist = 2
 ; return 0; }
 EOF
-if { (eval echo configure:10969: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12422: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_have_sys_errlist=yes
 else
@@ -11010,6 +12463,7 @@ for ac_func in \
 	fdopen \
 	fork \
 	ftime \
+	ftruncate \
 	getcwd \
 	gettimeofday \
 	getwd \
@@ -11045,27 +12499,27 @@ for ac_func in \
 	strftime \
 	strpbrk \
 	strrstr \
+	strsep \
 	strstr \
 	strtol \
-	tempnam \
 	tmpfile \
-	tmpnam \
 	tzset \
 	uname \
 	unlink \
 	use_default_colors \
 	usleep \
+	vasprintf \
 	vsnprintf \
 	waitpid \
 $cf_tc_funcs 
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11064: checking for $ac_func" >&5
+echo "configure:12518: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 11069 "configure"
+#line 12523 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -11088,7 +12542,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11092: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12546: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -11114,12 +12568,12 @@ done
 
 
 echo $ac_n "checking for flock""... $ac_c" 1>&6
-echo "configure:11118: checking for flock" >&5
+echo "configure:12572: checking for flock" >&5
 if eval "test \"`echo '$''{'ac_cv_func_flock'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 11123 "configure"
+#line 12577 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char flock(); below.  */
@@ -11142,7 +12596,7 @@ flock();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11146: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12600: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_flock=yes"
 else
@@ -11164,7 +12618,7 @@ else
   echo "$ac_t""no" 1>&6
 
 	echo $ac_n "checking for flock in -lbsd""... $ac_c" 1>&6
-echo "configure:11168: checking for flock in -lbsd" >&5
+echo "configure:12622: checking for flock in -lbsd" >&5
 ac_lib_var=`echo bsd'_'flock | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -11172,7 +12626,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lbsd  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 11176 "configure"
+#line 12630 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -11183,7 +12637,7 @@ int main() {
 flock()
 ; return 0; }
 EOF
-if { (eval echo configure:11187: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12641: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -11212,12 +12666,12 @@ fi
 
 
   echo $ac_n "checking for wide char and multibyte support""... $ac_c" 1>&6
-echo "configure:11216: checking for wide char and multibyte support" >&5
+echo "configure:12670: checking for wide char and multibyte support" >&5
 if eval "test \"`echo '$''{'am_cv_multibyte_able'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 11221 "configure"
+#line 12675 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 #ifdef HAVE_STDLIB_H
@@ -11253,7 +12707,7 @@ char icb[5] = {0xa4, 0xa4, 0xa4, 0xe5, 0
       wcsncat(wcb2, wcb, 5);
 ; return 0; }
 EOF
-if { (eval echo configure:11257: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12711: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   am_cv_multibyte_able=yes
 else
@@ -11263,7 +12717,7 @@ else
   cf_save_LIBS="$LIBS"
       LIBS="-lutf8 $LIBS"
       cat > conftest.$ac_ext <<EOF
-#line 11267 "configure"
+#line 12721 "configure"
 #include "confdefs.h"
 #include <libutf8.h>
 int main() {
@@ -11289,44 +12743,79 @@ char icb[5] = {0xa4, 0xa4, 0xa4, 0xe5, 0
         wcsncat(wcb2, wcb, 5);
 ; return 0; }
 EOF
-if { (eval echo configure:11293: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12747: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  am_cv_multibyte_able=yes
-         cat >> confdefs.h <<\EOF
-#define HAVE_LIBUTF8_H 1
-EOF
-
+  am_cv_multibyte_able=libutf8
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
   am_cv_multibyte_able=no
-         LIBS="$cf_save_LIBS"
 fi
 rm -f conftest*
+      LIBS="$cf_save_LIBS"
    
 fi
 rm -f conftest*
-  if test $am_cv_multibyte_able = yes; then
+  
+fi
+
+echo "$ac_t""$am_cv_multibyte_able" 1>&6
+  if test "$am_cv_multibyte_able" != no; then
+    if test "$am_cv_multibyte_able" = libutf8; then
+      cat >> confdefs.h <<\EOF
+#define HAVE_LIBUTF8_H 1
+EOF
+
+      LIBS="-lutf8 $LIBS"
+    fi
     cat >> confdefs.h <<\EOF
 #define MULTIBYTE_ABLE 1
 EOF
 
   fi
-  
-fi
 
-echo "$ac_t""$am_cv_multibyte_able" 1>&6
 
+echo $ac_n "checking if gettimeofday takes two arguments""... $ac_c" 1>&6
+echo "configure:12781: checking if gettimeofday takes two arguments" >&5
+cat > conftest.$ac_ext <<EOF
+#line 12783 "configure"
+#include "confdefs.h"
+
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+int main() {
+struct timeval *tv;
+struct timezone *tz;
+gettimeofday(tv, tz);
+; return 0; }
+EOF
+if { (eval echo configure:12795: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_func_gettimeofday_2args=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_func_gettimeofday_2args=no
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_func_gettimeofday_2args" 1>&6
+if test $ac_cv_func_gettimeofday_2args = yes; then
+	cat >> confdefs.h <<\EOF
+#define GETTIMEOFDAY_2ARGS 1
+EOF
 
+fi
 
 echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
-echo "configure:11325: checking return type of signal handlers" >&5
+echo "configure:12814: checking return type of signal handlers" >&5
 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 11330 "configure"
+#line 12819 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -11343,7 +12832,7 @@ int main() {
 int i;
 ; return 0; }
 EOF
-if { (eval echo configure:11347: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12836: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_type_signal=void
 else
@@ -11363,7 +12852,7 @@ EOF
 
 
 echo $ac_n "checking declaration of signal arguments""... $ac_c" 1>&6
-echo "configure:11367: checking declaration of signal arguments" >&5
+echo "configure:12856: checking declaration of signal arguments" >&5
 if eval "test \"`echo '$''{'cf_cv_sig_args'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -11372,7 +12861,7 @@ cf_cv_sig_args=
 for cf_test in "int sig" "int sig, ..."
 do
 	cat > conftest.$ac_ext <<EOF
-#line 11376 "configure"
+#line 12865 "configure"
 #include "confdefs.h"
 
 #include <signal.h>
@@ -11380,7 +12869,7 @@ int main() {
 extern RETSIGTYPE catch($cf_test); signal(SIGINT, catch)
 ; return 0; }
 EOF
-if { (eval echo configure:11384: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12873: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_sig_args="$cf_test";break
 else
@@ -11406,13 +12895,13 @@ EOF
 if test "$ac_cv_func_sigaction" = yes; then
 
 echo $ac_n "checking whether sigaction needs _POSIX_SOURCE""... $ac_c" 1>&6
-echo "configure:11410: checking whether sigaction needs _POSIX_SOURCE" >&5
+echo "configure:12899: checking whether sigaction needs _POSIX_SOURCE" >&5
 if eval "test \"`echo '$''{'cf_cv_sigact_bad'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 cat > conftest.$ac_ext <<EOF
-#line 11416 "configure"
+#line 12905 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -11421,7 +12910,7 @@ int main() {
 struct sigaction act
 ; return 0; }
 EOF
-if { (eval echo configure:11425: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12914: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_sigact_bad=no
 else
@@ -11442,13 +12931,13 @@ EOF
 
 
 echo $ac_n "checking if we have sigaction/related functions""... $ac_c" 1>&6
-echo "configure:11446: checking if we have sigaction/related functions" >&5
+echo "configure:12935: checking if we have sigaction/related functions" >&5
 if eval "test \"`echo '$''{'cf_cv_sigaction_funcs'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 cat > conftest.$ac_ext <<EOF
-#line 11452 "configure"
+#line 12941 "configure"
 #include "confdefs.h"
 
 #ifdef SVR4_ACTION
@@ -11466,7 +12955,7 @@ int main() {
     sigaction (SIGBUS,&sa,&osa);
 ; return 0; }
 EOF
-if { (eval echo configure:11470: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_sigaction_funcs=yes
 else
@@ -11488,7 +12977,7 @@ EOF
 fi
 
 echo $ac_n "checking for fork""... $ac_c" 1>&6
-echo "configure:11492: checking for fork" >&5
+echo "configure:12981: checking for fork" >&5
 if eval "test \"`echo '$''{'cf_cv_func_fork'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -11497,7 +12986,7 @@ if test "$cross_compiling" = yes; then
   cf_cv_func_fork=unknown
 else
   cat > conftest.$ac_ext <<EOF
-#line 11501 "configure"
+#line 12990 "configure"
 #include "confdefs.h"
 
 int main()
@@ -11507,7 +12996,7 @@ int main()
 	exit(0);
 }
 EOF
-if { (eval echo configure:11511: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:13000: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cf_cv_func_fork=yes
 else
@@ -11529,12 +13018,12 @@ EOF
 
 
 echo $ac_n "checking for memmove""... $ac_c" 1>&6
-echo "configure:11533: checking for memmove" >&5
+echo "configure:13022: checking for memmove" >&5
 if eval "test \"`echo '$''{'ac_cv_func_memmove'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 11538 "configure"
+#line 13027 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char memmove(); below.  */
@@ -11557,7 +13046,7 @@ memmove();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11561: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13050: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_memmove=yes"
 else
@@ -11576,12 +13065,12 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for bcopy""... $ac_c" 1>&6
-echo "configure:11580: checking for bcopy" >&5
+echo "configure:13069: checking for bcopy" >&5
 if eval "test \"`echo '$''{'ac_cv_func_bcopy'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 11585 "configure"
+#line 13074 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char bcopy(); below.  */
@@ -11604,7 +13093,7 @@ bcopy();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11608: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13097: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_bcopy=yes"
 else
@@ -11620,7 +13109,7 @@ if eval "test \"`echo '$ac_cv_func_'bcop
   echo "$ac_t""yes" 1>&6
   
 	echo $ac_n "checking if bcopy does overlapping moves""... $ac_c" 1>&6
-echo "configure:11624: checking if bcopy does overlapping moves" >&5
+echo "configure:13113: checking if bcopy does overlapping moves" >&5
 if eval "test \"`echo '$''{'cf_cv_good_bcopy'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -11629,7 +13118,7 @@ else
   cf_cv_good_bcopy=unknown
 else
   cat > conftest.$ac_ext <<EOF
-#line 11633 "configure"
+#line 13122 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -11642,7 +13131,7 @@ int main() {
 }
 		
 EOF
-if { (eval echo configure:11646: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:13135: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cf_cv_good_bcopy=yes
 else
@@ -11680,9 +13169,9 @@ fi
 
 
 echo $ac_n "checking if select expects int * arguments""... $ac_c" 1>&6
-echo "configure:11684: checking if select expects int * arguments" >&5
+echo "configure:13173: checking if select expects int * arguments" >&5
 cat > conftest.$ac_ext <<EOF
-#line 11686 "configure"
+#line 13175 "configure"
 #include "confdefs.h"
 #include <time.h>
 EOF
@@ -11702,7 +13191,7 @@ rm -f conftest*
 
 
 echo $ac_n "checking whether closedir returns void""... $ac_c" 1>&6
-echo "configure:11706: checking whether closedir returns void" >&5
+echo "configure:13195: checking whether closedir returns void" >&5
 if eval "test \"`echo '$''{'ac_cv_func_closedir_void'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -11710,13 +13199,13 @@ else
   ac_cv_func_closedir_void=yes
 else
   cat > conftest.$ac_ext <<EOF
-#line 11714 "configure"
+#line 13203 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <$ac_header_dirent>
 int closedir(); main() { exit(closedir(opendir(".")) != 0); }
 EOF
-if { (eval echo configure:11720: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:13209: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_func_closedir_void=no
 else
@@ -11738,9 +13227,11 @@ EOF
 
 fi
 
-## AC_FUNC_SETPGRP
-echo $ac_n "checking whether setvbuf arguments are reversed""... $ac_c" 1>&6
-echo "configure:11744: checking whether setvbuf arguments are reversed" >&5
+
+# autoconf 2.5x assumes setvbuf is not reversed when cross-compiling
+if test "$cross_compiling" != yes ; then
+	echo $ac_n "checking whether setvbuf arguments are reversed""... $ac_c" 1>&6
+echo "configure:13235: checking whether setvbuf arguments are reversed" >&5
 if eval "test \"`echo '$''{'ac_cv_func_setvbuf_reversed'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -11748,7 +13239,7 @@ else
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 11752 "configure"
+#line 13243 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 /* If setvbuf has the reversed format, exit 0. */
@@ -11762,7 +13253,7 @@ main () {
   exit(0);			/* Non-reversed systems segv here.  */
 }
 EOF
-if { (eval echo configure:11766: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:13257: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_func_setvbuf_reversed=yes
 else
@@ -11785,6 +13276,7 @@ EOF
 
 fi
 
+fi
 
 ###	Checks for network library functions.
 for ac_func in \
@@ -11799,12 +13291,12 @@ for ac_func in \
 
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11803: checking for $ac_func" >&5
+echo "configure:13295: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 11808 "configure"
+#line 13300 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -11827,7 +13319,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11831: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13323: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -11854,13 +13346,13 @@ done
 
 
 echo $ac_n "checking for type sigaction_t""... $ac_c" 1>&6
-echo "configure:11858: checking for type sigaction_t" >&5
+echo "configure:13350: checking for type sigaction_t" >&5
 if eval "test \"`echo '$''{'cf_cv_type_sigaction'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 	cat > conftest.$ac_ext <<EOF
-#line 11864 "configure"
+#line 13356 "configure"
 #include "confdefs.h"
 
 #include <signal.h>
@@ -11868,7 +13360,7 @@ int main() {
 sigaction_t x
 ; return 0; }
 EOF
-if { (eval echo configure:11872: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13364: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_type_sigaction=yes
 else
@@ -11888,13 +13380,13 @@ EOF
 
 
 echo $ac_n "checking for nonconflicting termios.h""... $ac_c" 1>&6
-echo "configure:11892: checking for nonconflicting termios.h" >&5
+echo "configure:13384: checking for nonconflicting termios.h" >&5
 if eval "test \"`echo '$''{'cf_cv_use_termios_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 	cat > conftest.$ac_ext <<EOF
-#line 11898 "configure"
+#line 13390 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_IOCTL_H
@@ -11916,7 +13408,7 @@ int main() {
 	(void) tcgetattr (0, &save_tty)
 ; return 0; }
 EOF
-if { (eval echo configure:11920: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13412: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_use_termios_h=yes
 else
@@ -11947,13 +13439,13 @@ fi
 
 
 echo $ac_n "checking for passwd.pw_gecos""... $ac_c" 1>&6
-echo "configure:11951: checking for passwd.pw_gecos" >&5
+echo "configure:13443: checking for passwd.pw_gecos" >&5
 if eval "test \"`echo '$''{'cf_cv_pw_gecos'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 	cat > conftest.$ac_ext <<EOF
-#line 11957 "configure"
+#line 13449 "configure"
 #include "confdefs.h"
 
 #include <pwd.h>
@@ -11964,7 +13456,7 @@ int main() {
 	char bar = foo.pw_gecos
 ; return 0; }
 EOF
-if { (eval echo configure:11968: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13460: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_pw_gecos=yes
 else
@@ -11984,13 +13476,13 @@ EOF
 
 
 echo $ac_n "checking for tm.tm_gmtoff""... $ac_c" 1>&6
-echo "configure:11988: checking for tm.tm_gmtoff" >&5
+echo "configure:13480: checking for tm.tm_gmtoff" >&5
 if eval "test \"`echo '$''{'cf_cv_tm_gmtoff'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 	cat > conftest.$ac_ext <<EOF
-#line 11994 "configure"
+#line 13486 "configure"
 #include "confdefs.h"
 
 #ifdef TIME_WITH_SYS_TIME
@@ -12010,7 +13502,7 @@ int main() {
 	long bar = foo.tm_gmtoff
 ; return 0; }
 EOF
-if { (eval echo configure:12014: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13506: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_tm_gmtoff=yes
 else
@@ -12030,7 +13522,7 @@ EOF
 
 
 echo $ac_n "checking for long file names""... $ac_c" 1>&6
-echo "configure:12034: checking for long file names" >&5
+echo "configure:13526: checking for long file names" >&5
 if eval "test \"`echo '$''{'ac_cv_sys_long_file_names'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -12078,17 +13570,17 @@ for ac_hdr in sys/wait.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:12082: checking for $ac_hdr" >&5
+echo "configure:13574: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 12087 "configure"
+#line 13579 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12092: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13584: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -12125,17 +13617,17 @@ for ac_hdr in wait.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:12129: checking for $ac_hdr" >&5
+echo "configure:13621: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 12134 "configure"
+#line 13626 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12139: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13631: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -12165,17 +13657,17 @@ for ac_hdr in waitstatus.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:12169: checking for $ac_hdr" >&5
+echo "configure:13661: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 12174 "configure"
+#line 13666 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12179: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:13671: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -12216,13 +13708,13 @@ fi
 
 
 echo $ac_n "checking for union wait""... $ac_c" 1>&6
-echo "configure:12220: checking for union wait" >&5
+echo "configure:13712: checking for union wait" >&5
 if eval "test \"`echo '$''{'cf_cv_type_unionwait'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 	cat > conftest.$ac_ext <<EOF
-#line 12226 "configure"
+#line 13718 "configure"
 #include "confdefs.h"
 $cf_wait_headers
 int main() {
@@ -12233,7 +13725,7 @@ int x;
 	
 ; return 0; }
 EOF
-if { (eval echo configure:12237: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13729: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_type_unionwait=no
 	 echo compiles ok w/o union wait 1>&5
@@ -12244,7 +13736,7 @@ else
   rm -rf conftest*
   
 	cat > conftest.$ac_ext <<EOF
-#line 12248 "configure"
+#line 13740 "configure"
 #include "confdefs.h"
 $cf_wait_headers
 int main() {
@@ -12259,7 +13751,7 @@ union wait x;
 	
 ; return 0; }
 EOF
-if { (eval echo configure:12263: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13755: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_type_unionwait=yes
 	 echo compiles ok with union wait and possibly macros too 1>&5
@@ -12284,7 +13776,7 @@ EOF
 
 
 echo $ac_n "checking if the system function returns usable child-status""... $ac_c" 1>&6
-echo "configure:12288: checking if the system function returns usable child-status" >&5
+echo "configure:13780: checking if the system function returns usable child-status" >&5
 if eval "test \"`echo '$''{'cf_cv_system_status'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -12293,7 +13785,7 @@ else
   cf_cv_system_status=unknown
 else
   cat > conftest.$ac_ext <<EOF
-#line 12297 "configure"
+#line 13789 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -12326,7 +13818,7 @@ int main()
 }
 
 EOF
-if { (eval echo configure:12330: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:13822: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cf_cv_system_status=no
 else
@@ -12337,11 +13829,11 @@ else
   cf_cv_system_status=unknown
 else
   cat > conftest.$ac_ext <<EOF
-#line 12341 "configure"
+#line 13833 "configure"
 #include "confdefs.h"
 int main() { exit(system("exit 23") != (23 << 8)); }
 EOF
-if { (eval echo configure:12345: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:13837: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cf_cv_system_status=yes
 else
@@ -12384,13 +13876,13 @@ EOF
 
 if test "$cf_cv_ncurses_version" != no ; then
 echo $ac_n "checking for obsolete/broken version of ncurses""... $ac_c" 1>&6
-echo "configure:12388: checking for obsolete/broken version of ncurses" >&5
+echo "configure:13880: checking for obsolete/broken version of ncurses" >&5
 if eval "test \"`echo '$''{'cf_cv_ncurses_broken'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 cat > conftest.$ac_ext <<EOF
-#line 12394 "configure"
+#line 13886 "configure"
 #include "confdefs.h"
 
 #include <${cf_cv_ncurses_header-curses.h}>
@@ -12404,7 +13896,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:12408: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13900: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_ncurses_broken=no
 else
@@ -12429,13 +13921,13 @@ fi
 
 		
 echo $ac_n "checking if curses supports color attributes""... $ac_c" 1>&6
-echo "configure:12433: checking if curses supports color attributes" >&5
+echo "configure:13925: checking if curses supports color attributes" >&5
 if eval "test \"`echo '$''{'cf_cv_color_curses'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 	cat > conftest.$ac_ext <<EOF
-#line 12439 "configure"
+#line 13931 "configure"
 #include "confdefs.h"
 
 #include <${cf_cv_ncurses_header-curses.h}>
@@ -12450,7 +13942,7 @@ chtype x = COLOR_BLUE;
 	
 ; return 0; }
 EOF
-if { (eval echo configure:12454: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13946: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_color_curses=yes
 else
@@ -12501,7 +13993,7 @@ if test $check_sig_const = yes ; then
 	
 
 echo $ac_n "checking for redefinable signal constants""... $ac_c" 1>&6
-echo "configure:12505: checking for redefinable signal constants" >&5
+echo "configure:13997: checking for redefinable signal constants" >&5
 if eval "test \"`echo '$''{'cf_cv_sig_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -12513,7 +14005,7 @@ if test -n "$cf_cv_sig_args"; then
   cf_cv_sig_const=unknown
 else
   cat > conftest.$ac_ext <<EOF
-#line 12517 "configure"
+#line 14009 "configure"
 #include "confdefs.h"
 
 #define NEW_DFL	((RETSIGTYPE (*)($cf_test))0)
@@ -12540,7 +14032,7 @@ int main()
 	exit(0);
 }
 EOF
-if { (eval echo configure:12544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:14036: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cf_cv_sig_const=yes
 else
@@ -12566,13 +14058,13 @@ fi
 
 
 echo $ac_n "checking for ANSI qsort""... $ac_c" 1>&6
-echo "configure:12570: checking for ANSI qsort" >&5
+echo "configure:14062: checking for ANSI qsort" >&5
 if eval "test \"`echo '$''{'cf_cv_comptype'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 	cat > conftest.$ac_ext <<EOF
-#line 12576 "configure"
+#line 14068 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_STDLIB_H
@@ -12584,7 +14076,7 @@ extern int compare(const void *, const v
 	 qsort(foo, sizeof(foo)/sizeof(*foo), sizeof(*foo), compare)
 ; return 0; }
 EOF
-if { (eval echo configure:12588: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14080: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_cv_comptype=yes
 else
@@ -12612,7 +14104,7 @@ fi
 
 
 echo $ac_n "checking if application can dump core""... $ac_c" 1>&6
-echo "configure:12616: checking if application can dump core" >&5
+echo "configure:14108: checking if application can dump core" >&5
 if eval "test \"`echo '$''{'cf_cv_corefile'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -12621,7 +14113,7 @@ else
   cf_cv_corefile=unknown
 else
   cat > conftest.$ac_ext <<EOF
-#line 12625 "configure"
+#line 14117 "configure"
 #include "confdefs.h"
 
 #include <signal.h>
@@ -12662,7 +14154,7 @@ int main()
 #endif
 }
 EOF
-if { (eval echo configure:12666: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:14158: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cf_cv_corefile=yes
 else
@@ -12701,6 +14193,7 @@ for ac_func in \
 	popen \
 	strchr \
 	strcasestr \
+	strsep \
 
 do
 
@@ -12708,18 +14201,18 @@ ac_tr_func=`echo "$ac_func" | sed y%abcd
 
 
 echo $ac_n "checking for missing "${ac_func}" extern""... $ac_c" 1>&6
-echo "configure:12712: checking for missing "${ac_func}" extern" >&5
+echo "configure:14205: checking for missing "${ac_func}" extern" >&5
 if eval "test \"`echo '$''{'cf_cv_func_${ac_func}'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 
-echo "(line 12718) testing for missing "${ac_func}" external ..." 1>&5
+echo "(line 14211) testing for missing "${ac_func}" external ..." 1>&5
 
 cf_save_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS $CHECK_DECL_FLAG"
 cat > conftest.$ac_ext <<EOF
-#line 12723 "configure"
+#line 14216 "configure"
 #include "confdefs.h"
 
 $CHECK_DECL_HDRS
@@ -12733,7 +14226,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:12737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14230: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   if test -n "$CHECK_DECL_HDRS" ; then
 # try to work around system headers which are infested with non-standard syntax
@@ -12741,7 +14234,7 @@ if { (eval echo configure:12737: \"$ac_l
 cf_1_up=`echo "${ac_func}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
 
 cat > conftest.$ac_ext <<EOF
-#line 12745 "configure"
+#line 14238 "configure"
 #include "confdefs.h"
 
 #define DECL_${cf_1_up}
@@ -12751,7 +14244,7 @@ int main() {
 long x = 0
 ; return 0; }
 EOF
-if { (eval echo configure:12755: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14248: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   eval 'cf_cv_func_'${ac_func}'=yes'
 else
@@ -12800,18 +14293,18 @@ ac_tr_func=`echo "$ac_func" | sed y%abcd
 
 
 echo $ac_n "checking for missing "${ac_func}" extern""... $ac_c" 1>&6
-echo "configure:12804: checking for missing "${ac_func}" extern" >&5
+echo "configure:14297: checking for missing "${ac_func}" extern" >&5
 if eval "test \"`echo '$''{'cf_cv_func_${ac_func}'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 
-echo "(line 12810) testing for missing "${ac_func}" external ..." 1>&5
+echo "(line 14303) testing for missing "${ac_func}" external ..." 1>&5
 
 cf_save_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS $CHECK_DECL_FLAG"
 cat > conftest.$ac_ext <<EOF
-#line 12815 "configure"
+#line 14308 "configure"
 #include "confdefs.h"
 
 $CHECK_DECL_HDRS
@@ -12825,7 +14318,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:12829: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14322: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   if test -n "$CHECK_DECL_HDRS" ; then
 # try to work around system headers which are infested with non-standard syntax
@@ -12833,7 +14326,7 @@ if { (eval echo configure:12829: \"$ac_l
 cf_1_up=`echo "${ac_func}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
 
 cat > conftest.$ac_ext <<EOF
-#line 12837 "configure"
+#line 14330 "configure"
 #include "confdefs.h"
 
 #define DECL_${cf_1_up}
@@ -12843,7 +14336,7 @@ int main() {
 long x = 0
 ; return 0; }
 EOF
-if { (eval echo configure:12847: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14340: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   eval 'cf_cv_func_'${ac_func}'=yes'
 else
@@ -12890,18 +14383,18 @@ ac_tr_func=`echo "$ac_func" | sed y%abcd
 
 
 echo $ac_n "checking for missing "${ac_func}" extern""... $ac_c" 1>&6
-echo "configure:12894: checking for missing "${ac_func}" extern" >&5
+echo "configure:14387: checking for missing "${ac_func}" extern" >&5
 if eval "test \"`echo '$''{'cf_cv_func_${ac_func}'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 
-echo "(line 12900) testing for missing "${ac_func}" external ..." 1>&5
+echo "(line 14393) testing for missing "${ac_func}" external ..." 1>&5
 
 cf_save_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS $CHECK_DECL_FLAG"
 cat > conftest.$ac_ext <<EOF
-#line 12905 "configure"
+#line 14398 "configure"
 #include "confdefs.h"
 
 $CHECK_DECL_HDRS
@@ -12915,7 +14408,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:12919: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14412: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   if test -n "$CHECK_DECL_HDRS" ; then
 # try to work around system headers which are infested with non-standard syntax
@@ -12923,7 +14416,7 @@ if { (eval echo configure:12919: \"$ac_l
 cf_1_up=`echo "${ac_func}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
 
 cat > conftest.$ac_ext <<EOF
-#line 12927 "configure"
+#line 14420 "configure"
 #include "confdefs.h"
 
 #define DECL_${cf_1_up}
@@ -12933,7 +14426,7 @@ int main() {
 long x = 0
 ; return 0; }
 EOF
-if { (eval echo configure:12937: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   eval 'cf_cv_func_'${ac_func}'=yes'
 else
@@ -12977,6 +14470,7 @@ for ac_func in \
 	bcopy \
 	bzero \
 	calloc \
+	fchmod \
 	fclose \
 	fdopen \
 	fflush \
@@ -13017,7 +14511,6 @@ for ac_func in \
 	strncasecmp \
 	strtol \
 	system \
-	tempnam \
 	time \
 	tolower \
 	toupper \
@@ -13032,18 +14525,18 @@ ac_tr_func=`echo "$ac_func" | sed y%abcd
 
 
 echo $ac_n "checking for missing "${ac_func}" extern""... $ac_c" 1>&6
-echo "configure:13036: checking for missing "${ac_func}" extern" >&5
+echo "configure:14529: checking for missing "${ac_func}" extern" >&5
 if eval "test \"`echo '$''{'cf_cv_func_${ac_func}'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 
-echo "(line 13042) testing for missing "${ac_func}" external ..." 1>&5
+echo "(line 14535) testing for missing "${ac_func}" external ..." 1>&5
 
 cf_save_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS $CHECK_DECL_FLAG"
 cat > conftest.$ac_ext <<EOF
-#line 13047 "configure"
+#line 14540 "configure"
 #include "confdefs.h"
 
 $CHECK_DECL_HDRS
@@ -13057,7 +14550,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:13061: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14554: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   if test -n "$CHECK_DECL_HDRS" ; then
 # try to work around system headers which are infested with non-standard syntax
@@ -13065,7 +14558,7 @@ if { (eval echo configure:13061: \"$ac_l
 cf_1_up=`echo "${ac_func}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
 
 cat > conftest.$ac_ext <<EOF
-#line 13069 "configure"
+#line 14562 "configure"
 #include "confdefs.h"
 
 #define DECL_${cf_1_up}
@@ -13075,7 +14568,7 @@ int main() {
 long x = 0
 ; return 0; }
 EOF
-if { (eval echo configure:13079: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14572: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   eval 'cf_cv_func_'${ac_func}'=yes'
 else
@@ -13119,18 +14612,18 @@ ac_tr_func=`echo "$ac_func" | sed y%abcd
 
 
 echo $ac_n "checking for missing "${ac_func}" extern""... $ac_c" 1>&6
-echo "configure:13123: checking for missing "${ac_func}" extern" >&5
+echo "configure:14616: checking for missing "${ac_func}" extern" >&5
 if eval "test \"`echo '$''{'cf_cv_func_${ac_func}'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 
-echo "(line 13129) testing for missing "${ac_func}" external ..." 1>&5
+echo "(line 14622) testing for missing "${ac_func}" external ..." 1>&5
 
 cf_save_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS $CHECK_DECL_FLAG"
 cat > conftest.$ac_ext <<EOF
-#line 13134 "configure"
+#line 14627 "configure"
 #include "confdefs.h"
 
 $CHECK_DECL_HDRS
@@ -13144,7 +14637,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:13148: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14641: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   if test -n "$CHECK_DECL_HDRS" ; then
 # try to work around system headers which are infested with non-standard syntax
@@ -13152,7 +14645,7 @@ if { (eval echo configure:13148: \"$ac_l
 cf_1_up=`echo "${ac_func}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
 
 cat > conftest.$ac_ext <<EOF
-#line 13156 "configure"
+#line 14649 "configure"
 #include "confdefs.h"
 
 #define DECL_${cf_1_up}
@@ -13162,7 +14655,7 @@ int main() {
 long x = 0
 ; return 0; }
 EOF
-if { (eval echo configure:13166: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14659: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   eval 'cf_cv_func_'${ac_func}'=yes'
 else
@@ -13209,18 +14702,18 @@ ac_tr_func=`echo "$ac_func" | sed y%abcd
 
 
 echo $ac_n "checking for missing "${ac_func}" extern""... $ac_c" 1>&6
-echo "configure:13213: checking for missing "${ac_func}" extern" >&5
+echo "configure:14706: checking for missing "${ac_func}" extern" >&5
 if eval "test \"`echo '$''{'cf_cv_func_${ac_func}'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 
-echo "(line 13219) testing for missing "${ac_func}" external ..." 1>&5
+echo "(line 14712) testing for missing "${ac_func}" external ..." 1>&5
 
 cf_save_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS $CHECK_DECL_FLAG"
 cat > conftest.$ac_ext <<EOF
-#line 13224 "configure"
+#line 14717 "configure"
 #include "confdefs.h"
 
 $CHECK_DECL_HDRS
@@ -13234,7 +14727,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:13238: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:14731: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   if test -n "$CHECK_DECL_HDRS" ; then
 # try to work around system headers which are infested with non-standard syntax
@@ -13242,7 +14735,7 @@ if { (eval echo configure:13238: \"$ac_l
 cf_1_up=`echo "${ac_func}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
 
 cat > conftest.$ac_ext <<EOF
-#line 13246 "configure"
+#line 14739 "configure"
 #include "confdefs.h"
 
 #define DECL_${cf_1_up}
@@ -13252,7 +14745,7 @@ int main() {
 long x = 0
 ; return 0; }
 EOF
-if { (eval echo configure:13256: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:14749: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   eval 'cf_cv_func_'${ac_func}'=yes'
 else
@@ -13290,7 +14783,7 @@ fi
 
 
 echo $ac_n "checking for working TIOCGWINSZ""... $ac_c" 1>&6
-echo "configure:13294: checking for working TIOCGWINSZ" >&5
+echo "configure:14787: checking for working TIOCGWINSZ" >&5
 if eval "test \"`echo '$''{'cf_cv_use_tiocgwinsz'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -13301,7 +14794,7 @@ else
   cf_cv_use_tiocgwinsz=unknown
 else
   cat > conftest.$ac_ext <<EOF
-#line 13305 "configure"
+#line 14798 "configure"
 #include "confdefs.h"
 
 $CHECK_DECL_HDRS
@@ -13326,7 +14819,7 @@ int main()
 	exit(0);	/* we cannot guarantee this is run interactively */
 }
 EOF
-if { (eval echo configure:13330: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:14823: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   cf_cv_use_tiocgwinsz=yes
 else
@@ -13363,28 +14856,292 @@ DMALLOC)
 #define USE_DMALLOC 1
 EOF
 
-	LIBS="$LIBS -ldmalloc"
-	;;
-esac
+	LIBS="$LIBS -ldmalloc"
+	;;
+esac
+
+### Use gettext
+### this also calls AM_LANGINFO_CODESET and AM_ICONV
+### so we don't need to do the tests ourselves.
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:14870: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_RANLIB="ranlib"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+  echo "$ac_t""$RANLIB" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments.  Useless!
+echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
+echo "configure:14900: checking for working alloca.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 14905 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int main() {
+char *p = alloca(2 * sizeof(int));
+; return 0; }
+EOF
+if { (eval echo configure:14912: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_header_alloca_h=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_alloca_h=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_alloca_h" 1>&6
+if test $ac_cv_header_alloca_h = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA_H 1
+EOF
+
+fi
+
+echo $ac_n "checking for alloca""... $ac_c" 1>&6
+echo "configure:14933: checking for alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 14938 "configure"
+#include "confdefs.h"
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if HAVE_ALLOCA_H
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+int main() {
+char *p = (char *) alloca(1);
+; return 0; }
+EOF
+if { (eval echo configure:14966: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_func_alloca_works=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_func_alloca_works=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_func_alloca_works" 1>&6
+if test $ac_cv_func_alloca_works = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA 1
+EOF
+
+fi
+
+if test $ac_cv_func_alloca_works = no; then
+  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+  # that cause trouble.  Some versions do not even contain alloca or
+  # contain a buggy version.  If you still want to use their alloca,
+  # use ar to extract alloca.o from them instead of compiling alloca.c.
+  ALLOCA=alloca.${ac_objext}
+  cat >> confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+
+echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+echo "configure:14998: checking whether alloca needs Cray hooks" >&5
+if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 15003 "configure"
+#include "confdefs.h"
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "webecray" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_os_cray=yes
+else
+  rm -rf conftest*
+  ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_os_cray" 1>&6
+if test $ac_cv_os_cray = yes; then
+for ac_func in _getb67 GETB67 getb67; do
+  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:15028: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 15033 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:15056: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<EOF
+#define CRAY_STACKSEG_END $ac_func
+EOF
+
+  break
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+done
+fi
+
+echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
+echo "configure:15083: checking stack direction for C alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_c_stack_direction=0
+else
+  cat > conftest.$ac_ext <<EOF
+#line 15091 "configure"
+#include "confdefs.h"
+find_stack_direction ()
+{
+  static char *addr = 0;
+  auto char dummy;
+  if (addr == 0)
+    {
+      addr = &dummy;
+      return find_stack_direction ();
+    }
+  else
+    return (&dummy > addr) ? 1 : -1;
+}
+main ()
+{
+  exit (find_stack_direction() < 0);
+}
+EOF
+if { (eval echo configure:15110: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_c_stack_direction=1
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_c_stack_direction=-1
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_c_stack_direction" 1>&6
+cat >> confdefs.h <<EOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+EOF
+
+fi
 
-### Use gettext
-### this also calls AM_LANGINFO_CODESET and AM_ICONV
-### so we don't need to do the tests ourselves.
 for ac_hdr in unistd.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:13378: checking for $ac_hdr" >&5
+echo "configure:15135: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 13383 "configure"
+#line 15140 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13388: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:15145: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -13413,12 +15170,12 @@ done
 for ac_func in getpagesize
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13417: checking for $ac_func" >&5
+echo "configure:15174: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 13422 "configure"
+#line 15179 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -13441,7 +15198,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:13445: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15202: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -13466,7 +15223,7 @@ fi
 done
 
 echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:13470: checking for working mmap" >&5
+echo "configure:15227: checking for working mmap" >&5
 if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -13474,7 +15231,7 @@ else
   ac_cv_func_mmap_fixed_mapped=no
 else
   cat > conftest.$ac_ext <<EOF
-#line 13478 "configure"
+#line 15235 "configure"
 #include "confdefs.h"
 
 /* Thanks to Mike Haertel and Jim Avera for this test.
@@ -13614,7 +15371,7 @@ main()
 }
 
 EOF
-if { (eval echo configure:13618: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:15375: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_func_mmap_fixed_mapped=yes
 else
@@ -13638,12 +15395,12 @@ fi
 
 
     echo $ac_n "checking whether we are using the GNU C Library 2.1 or newer""... $ac_c" 1>&6
-echo "configure:13642: checking whether we are using the GNU C Library 2.1 or newer" >&5
+echo "configure:15399: checking whether we are using the GNU C Library 2.1 or newer" >&5
 if eval "test \"`echo '$''{'ac_cv_gnu_library_2_1'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 13647 "configure"
+#line 15404 "configure"
 #include "confdefs.h"
 
 #include <features.h>
@@ -13686,23 +15443,36 @@ cf_makefile=Makefile
 
 test -z "$ALL_LINGUAS" && ALL_LINGUAS=`test -d $srcdir/po && cd $srcdir/po && echo *.po|sed -e 's/\.po//g' -e 's/*//'`
 
+# Allow override of "config.h" definition:
+: ${CONFIG_H=config.h}
+
+
+if test -z "$VERSION" ; then
+if test -f $srcdir/VERSION ; then
+	VERSION=`sed -e '2,$d' $srcdir/VERSION|cut -f1`
+else
+	VERSION=unknown
+fi
+fi
+
+
                                     
    for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
 stdlib.h string.h unistd.h sys/param.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:13696: checking for $ac_hdr" >&5
+echo "configure:15466: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 13701 "configure"
+#line 15471 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13706: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:15476: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -13733,12 +15503,12 @@ getgid getuid mempcpy munmap putenv sete
 strdup strtoul tsearch __argz_count __argz_stringify __argz_next
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13737: checking for $ac_func" >&5
+echo "configure:15507: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 13742 "configure"
+#line 15512 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -13761,7 +15531,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:13765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15535: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -13802,7 +15572,7 @@ fi
 
 
   echo $ac_n "checking for iconv""... $ac_c" 1>&6
-echo "configure:13806: checking for iconv" >&5
+echo "configure:15576: checking for iconv" >&5
 if eval "test \"`echo '$''{'am_cv_func_iconv'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -13810,7 +15580,7 @@ else
     am_cv_func_iconv="no, consider installing GNU libiconv"
     am_cv_lib_iconv=no
     cat > conftest.$ac_ext <<EOF
-#line 13814 "configure"
+#line 15584 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <iconv.h>
@@ -13820,7 +15590,7 @@ iconv_t cd = iconv_open("","");
        iconv_close(cd);
 ; return 0; }
 EOF
-if { (eval echo configure:13824: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15594: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   am_cv_func_iconv=yes
 else
@@ -13832,7 +15602,7 @@ rm -f conftest*
       am_save_LIBS="$LIBS"
       LIBS="$LIBS -liconv"
       cat > conftest.$ac_ext <<EOF
-#line 13836 "configure"
+#line 15606 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <iconv.h>
@@ -13842,7 +15612,7 @@ iconv_t cd = iconv_open("","");
          iconv_close(cd);
 ; return 0; }
 EOF
-if { (eval echo configure:13846: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15616: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   am_cv_lib_iconv=yes
         am_cv_func_iconv=yes
@@ -13863,13 +15633,13 @@ echo "$ac_t""$am_cv_func_iconv" 1>&6
 EOF
 
     echo $ac_n "checking for iconv declaration""... $ac_c" 1>&6
-echo "configure:13867: checking for iconv declaration" >&5
+echo "configure:15637: checking for iconv declaration" >&5
     if eval "test \"`echo '$''{'am_cv_proto_iconv'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
       cat > conftest.$ac_ext <<EOF
-#line 13873 "configure"
+#line 15643 "configure"
 #include "confdefs.h"
 
 #include <stdlib.h>
@@ -13888,7 +15658,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:13892: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:15662: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   am_cv_proto_iconv_arg1=""
 else
@@ -13917,19 +15687,19 @@ EOF
 
    
   echo $ac_n "checking for nl_langinfo and CODESET""... $ac_c" 1>&6
-echo "configure:13921: checking for nl_langinfo and CODESET" >&5
+echo "configure:15691: checking for nl_langinfo and CODESET" >&5
 if eval "test \"`echo '$''{'am_cv_langinfo_codeset'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 13926 "configure"
+#line 15696 "configure"
 #include "confdefs.h"
 #include <langinfo.h>
 int main() {
 char* cs = nl_langinfo(CODESET);
 ; return 0; }
 EOF
-if { (eval echo configure:13933: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15703: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   am_cv_langinfo_codeset=yes
 else
@@ -13952,19 +15722,19 @@ EOF
 
    if test $ac_cv_header_locale_h = yes; then
     echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
-echo "configure:13956: checking for LC_MESSAGES" >&5
+echo "configure:15726: checking for LC_MESSAGES" >&5
 if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 13961 "configure"
+#line 15731 "configure"
 #include "confdefs.h"
 #include <locale.h>
 int main() {
 return LC_MESSAGES
 ; return 0; }
 EOF
-if { (eval echo configure:13968: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15738: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   am_cv_val_LC_MESSAGES=yes
 else
@@ -13985,7 +15755,7 @@ EOF
     fi
   fi
    echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
-echo "configure:13989: checking whether NLS is requested" >&5
+echo "configure:15759: checking whether NLS is requested" >&5
         
     
 # Check whether --enable-nls or --disable-nls was given.
@@ -14009,7 +15779,7 @@ fi
 EOF
 
       echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
-echo "configure:14013: checking whether included gettext is requested" >&5
+echo "configure:15783: checking whether included gettext is requested" >&5
       
 # Check whether --with-included-gettext or --without-included-gettext was given.
 if test "${with_included_gettext+set}" = set; then
@@ -14030,17 +15800,17 @@ fi
 
 	ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for libintl.h""... $ac_c" 1>&6
-echo "configure:14034: checking for libintl.h" >&5
+echo "configure:15804: checking for libintl.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 14039 "configure"
+#line 15809 "configure"
 #include "confdefs.h"
 #include <libintl.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:14044: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:15814: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -14057,12 +15827,12 @@ fi
 if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   echo $ac_n "checking for GNU gettext in libc""... $ac_c" 1>&6
-echo "configure:14061: checking for GNU gettext in libc" >&5
+echo "configure:15831: checking for GNU gettext in libc" >&5
 if eval "test \"`echo '$''{'gt_cv_func_gnugettext1_libc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 14066 "configure"
+#line 15836 "configure"
 #include "confdefs.h"
 #include <libintl.h>
 extern int _nl_msg_cat_cntr;
@@ -14071,7 +15841,7 @@ bindtextdomain ("", "");
 return (int) gettext ("") + _nl_msg_cat_cntr
 ; return 0; }
 EOF
-if { (eval echo configure:14075: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15845: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gt_cv_func_gnugettext1_libc=yes
 else
@@ -14087,14 +15857,14 @@ echo "$ac_t""$gt_cv_func_gnugettext1_lib
 
 	   if test "$gt_cv_func_gnugettext1_libc" != "yes"; then
 	     echo $ac_n "checking for GNU gettext in libintl""... $ac_c" 1>&6
-echo "configure:14091: checking for GNU gettext in libintl" >&5
+echo "configure:15861: checking for GNU gettext in libintl" >&5
 if eval "test \"`echo '$''{'gt_cv_func_gnugettext1_libintl'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   gt_save_LIBS="$LIBS"
 		LIBS="$LIBS -lintl $LIBICONV"
 		cat > conftest.$ac_ext <<EOF
-#line 14098 "configure"
+#line 15868 "configure"
 #include "confdefs.h"
 #include <libintl.h>
 extern int _nl_msg_cat_cntr;
@@ -14103,7 +15873,7 @@ bindtextdomain ("", "");
 return (int) gettext ("") + _nl_msg_cat_cntr
 ; return 0; }
 EOF
-if { (eval echo configure:14107: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15877: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gt_cv_func_gnugettext1_libintl=yes
 else
@@ -14136,12 +15906,12 @@ EOF
 	     for ac_func in dcgettext
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:14140: checking for $ac_func" >&5
+echo "configure:15910: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 14145 "configure"
+#line 15915 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -14164,7 +15934,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:14168: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:15938: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -14194,7 +15964,7 @@ done
 
 set dummy msgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:14198: checking for $ac_word" >&5
+echo "configure:15968: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -14228,7 +15998,7 @@ fi
 	     # Extract the first word of "gmsgfmt", so it can be a program name with args.
 set dummy gmsgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:14232: checking for $ac_word" >&5
+echo "configure:16002: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -14266,7 +16036,7 @@ fi
 
 set dummy xgettext; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:14270: checking for $ac_word" >&5
+echo "configure:16040: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -14312,12 +16082,15 @@ fi
       fi
 
       if test "$nls_cv_use_gnu_gettext" = "yes"; then
+        if test ! -d $srcdir/intl ; then
+	  { echo "configure: error: no NLS library is packaged with this application" 1>&2; exit 1; }
+	fi
                 INTLOBJS="\$(GETTOBJS)"
         # Extract the first word of "msgfmt", so it can be a program name with args.
 
 set dummy msgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:14321: checking for $ac_word" >&5
+echo "configure:16094: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -14351,7 +16124,7 @@ fi
         # Extract the first word of "gmsgfmt", so it can be a program name with args.
 set dummy gmsgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:14355: checking for $ac_word" >&5
+echo "configure:16128: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -14388,7 +16161,7 @@ fi
 
 set dummy xgettext; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:14392: checking for $ac_word" >&5
+echo "configure:16165: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -14455,12 +16228,13 @@ fi
       BUILD_INCLUDED_LIBINTL=yes
     fi
 
-                                            for ac_prog in bison
+                                            if test "$nls_cv_use_gnu_gettext" = "yes"; then
+    for ac_prog in bison
 do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:14464: checking for $ac_word" >&5
+echo "configure:16238: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_INTLBISON'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -14493,7 +16267,7 @@ done
       ac_verc_fail=yes
     else
             echo $ac_n "checking version of bison""... $ac_c" 1>&6
-echo "configure:14497: checking version of bison" >&5
+echo "configure:16271: checking version of bison" >&5
       ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
       case $ac_prog_version in
         '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
@@ -14506,6 +16280,7 @@ echo "configure:14497: checking version 
     if test $ac_verc_fail = yes; then
       INTLBISON=:
     fi
+    fi
 
                 for lang in $ALL_LINGUAS; do
       GMOFILES="$GMOFILES $lang.gmo"
@@ -14540,7 +16315,7 @@ echo "configure:14497: checking version 
        LINGUAS=
      else
        echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6
-echo "configure:14544: checking for catalogs to be installed" >&5
+echo "configure:16319: checking for catalogs to be installed" >&5
        NEW_LINGUAS=
        for presentlang in $ALL_LINGUAS; do
          useit=no
@@ -14567,13 +16342,18 @@ echo "configure:14544: checking for cata
      fi
    fi
 
-               MKINSTALLDIRS=
+                  MKINSTALLDIRS=
    if test -n "$ac_aux_dir"; then
      MKINSTALLDIRS="$ac_aux_dir/mkdirs.sh"
    fi
    if test -z "$MKINSTALLDIRS"; then
      MKINSTALLDIRS="\$(top_srcdir)/mkdirs.sh"
    fi
+   if test -n "$GNUSYSTEM_AUX_DIR" ; then
+     if test -e "${GNUSYSTEM_AUX_DIR}/mkinstalldirs"; then
+       MKINSTALLDIRS="${GNUSYSTEM_AUX_DIR}/mkinstalldirs"
+     fi
+   fi
    
 
       INTL_LIBTOOL_SUFFIX_PREFIX=
@@ -14591,7 +16371,7 @@ use_our_messages=no
 if test "$USE_NLS" = yes ; then
 if test -d $srcdir/po ; then
 echo $ac_n "checking if we should use included message-library""... $ac_c" 1>&6
-echo "configure:14595: checking if we should use included message-library" >&5
+echo "configure:16375: checking if we should use included message-library" >&5
 	
 # Check whether --enable-included-msgs or --disable-included-msgs was given.
 if test "${enable_included_msgs+set}" = set; then
@@ -14608,7 +16388,7 @@ fi
 MSG_DIR_MAKE="#"
 if test "$use_our_messages" = yes
 then
-	SUB_MAKEFILE="$SUB_MAKEFILE po/$cf_makefile.in:po/$cf_makefile.inn"
+	SUB_MAKEFILE="$SUB_MAKEFILE po/$cf_makefile.in:$srcdir/po/$cf_makefile.inn"
 	MSG_DIR_MAKE=
 fi
 
@@ -14616,742 +16396,467 @@ fi
 
 
 
-if test "$USE_INCLUDED_LIBINTL" = yes ; then
-        if test "$nls_cv_force_use_gnu_gettext" = yes ; then
-		SUB_MAKEFILE="$SUB_MAKEFILE intl/$cf_makefile"
-	elif test "$nls_cv_use_gnu_gettext" = yes ; then
-		SUB_MAKEFILE="$SUB_MAKEFILE intl/$cf_makefile"
-	else
-		INTLDIR_MAKE="#"
-	fi
-	if test -z "$INTLDIR_MAKE"; then
-		cat >> confdefs.h <<\EOF
-#define HAVE_LIBGETTEXT_H 1
-EOF
-
-	fi
-else
-	INTLDIR_MAKE="#"
-	if test "$USE_NLS" = yes ; then
-		for ac_hdr in libintl.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:14641: checking for $ac_hdr" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  cat > conftest.$ac_ext <<EOF
-#line 14646 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:14651: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
- 
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-	fi
-fi
-
-if test -z "$INTLDIR_MAKE" ; then
-	CPPFLAGS="-I../intl $CPPFLAGS"
-fi
-
-if test "$BUILD_INCLUDED_LIBINTL" = yes ; then
-	GT_YES="#"
-	GT_NO=
-else
-	GT_YES=
-	GT_NO="#"
-fi
-
-
-
-
-
-
-
-if test "$USE_INCLUDED_LIBINTL" = yes ; then
-	if test "$nls_cv_force_use_gnu_gettext" = yes ; then
-		cat >> confdefs.h <<\EOF
-#define HAVE_GETTEXT 1
-EOF
-
-	elif test "$nls_cv_use_gnu_gettext" = yes ; then
-		cat >> confdefs.h <<\EOF
-#define HAVE_GETTEXT 1
-EOF
-
-	fi
-	if test -n "$nls_cv_header_intl" ; then
-		cat >> confdefs.h <<\EOF
-#define HAVE_LIBINTL_H 1
-EOF
-
-	fi
-fi
-
-LIBS="$LIBS $LIBICONV"
-
-
-for cf_hdr in iconv.h
-do
-	echo $ac_n "checking for $cf_hdr""... $ac_c" 1>&6
-echo "configure:14724: checking for $cf_hdr" >&5
-	cat > conftest.$ac_ext <<EOF
-#line 14726 "configure"
-#include "confdefs.h"
-
-#include <sys/types.h>
-#include <$cf_hdr>
-
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:14734: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  cf_found=yes
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  cf_found=no
-fi
-rm -f conftest*
-echo "$ac_t""$cf_found" 1>&6
-if test $cf_found = yes ; then
-	
-cf_tr_hdr=`echo "$cf_hdr" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
-
-	cat >> confdefs.h <<EOF
-#define HAVE_${cf_tr_hdr} 1
-EOF
-
-fi
-done
-
-echo $ac_n "checking for iconv_open() //TRANSLIT extension""... $ac_c" 1>&6
-echo "configure:14760: checking for iconv_open() //TRANSLIT extension" >&5
-if test "$cross_compiling" = yes; then
-  echo "$ac_t""unknown" 1>&6
-
-else
-  cat > conftest.$ac_ext <<EOF
-#line 14766 "configure"
-#include "confdefs.h"
-
-#ifdef HAVE_ICONV_H
-#	include <iconv.h>
-#endif /* HAVE_ICONV_H */
-#ifdef HAVE_STDLIB_H
-#	include <stdlib.h>
-#endif /* HAVE_STDLIB_H */
-int main() {
-	iconv_t cd;
-
-	if ((cd = iconv_open("US-ASCII//TRANSLIT", "ISO-8859-1")) == (iconv_t) (-1))
-		exit(1);
-	exit(0);
-}
-EOF
-if { (eval echo configure:14783: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
-then
-  cat >> confdefs.h <<\EOF
-#define HAVE_ICONV_OPEN_TRANSLIT 1
-EOF
- echo "$ac_t""yes" 1>&6
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  echo "$ac_t""no" 1>&6
-fi
-rm -fr conftest*
-fi
-
-
-
-# tin has mkdirs.sh instead of mkinstalldirs, overwrite the result of test
-# in gettext.m4
-MKINSTALLDIRS="\$(top_srcdir)/mkdirs.sh"
-
-
-if test "$cf_cv_termlib" = pdcurses ; then
-	# If we find X, set shell vars x_includes and x_libraries to the
-# paths, otherwise set no_x=yes.
-# Uses ac_ vars as temps to allow command line to override cache and checks.
-# --without-x overrides everything else, but does not touch the cache.
-echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:14811: checking for X" >&5
-
-
-# Check whether --with-x or --without-x was given.
-if test "${with_x+set}" = set; then
-  withval="$with_x"
-  :
-fi
-
-# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
-if test "x$with_x" = xno; then
-  # The user explicitly disabled X.
-  have_x=disabled
-else
-  if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
-    # Both variables are already set.
-    have_x=yes
-  else
-if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  # One or both of the vars are not set, and there is no cached value.
-ac_x_includes=NO ac_x_libraries=NO
-rm -fr conftestdir
-if mkdir conftestdir; then
-  cd conftestdir
-  # Make sure to not put "make" in the Imakefile rules, since we grep it out.
-  cat > Imakefile <<'EOF'
-acfindx:
-	@echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
-EOF
-  if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
-    # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-    eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
-    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
-    for ac_extension in a so sl; do
-      if test ! -f $ac_im_usrlibdir/libX11.$ac_extension &&
-        test -f $ac_im_libdir/libX11.$ac_extension; then
-        ac_im_usrlibdir=$ac_im_libdir; break
-      fi
-    done
-    # Screen out bogus values from the imake configuration.  They are
-    # bogus both because they are the default anyway, and because
-    # using them would break gcc on systems where it needs fixed includes.
-    case "$ac_im_incroot" in
-	/usr/include) ;;
-	*) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;;
-    esac
-    case "$ac_im_usrlibdir" in
-	/usr/lib | /lib) ;;
-	*) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;;
-    esac
-  fi
-  cd ..
-  rm -fr conftestdir
-fi
-
-if test "$ac_x_includes" = NO; then
-  # Guess where to find include files, by looking for this one X11 .h file.
-  test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h
-
-  # First, try using that file with no special directory specified.
-cat > conftest.$ac_ext <<EOF
-#line 14874 "configure"
+if test "$USE_INCLUDED_LIBINTL" = yes ; then
+        if test "$nls_cv_force_use_gnu_gettext" = yes ; then
+		:
+	elif test "$nls_cv_use_gnu_gettext" = yes ; then
+		:
+	else
+		INTLDIR_MAKE="#"
+	fi
+	if test -z "$INTLDIR_MAKE"; then
+		cat >> confdefs.h <<\EOF
+#define HAVE_LIBGETTEXT_H 1
+EOF
+
+		for cf_makefile in \
+			$srcdir/intl/Makefile.in \
+			$srcdir/intl/makefile.in
+		do
+			if test -f "$cf_makefile" ; then
+				SUB_MAKEFILE="$SUB_MAKEFILE `echo \"${cf_makefile}\"|sed -e 's,^'$srcdir/',,' -e 's/\.in$//'`:${cf_makefile}"
+				break
+			fi
+		done
+	fi
+else
+	INTLDIR_MAKE="#"
+	if test "$USE_NLS" = yes ; then
+		for ac_hdr in libintl.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:16430: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 16435 "configure"
 #include "confdefs.h"
-#include <$x_direct_test_include>
+#include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:14879: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:16440: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
-  # We can compile using X headers with no special include directory.
-ac_x_includes=
+  eval "ac_cv_header_$ac_safe=yes"
 else
   echo "$ac_err" >&5
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  # Look for the header file in a standard set of common directories.
-# Check X11 before X11Rn because it is often a symlink to the current release.
-  for ac_dir in               \
-    /usr/X11/include          \
-    /usr/X11R6/include        \
-    /usr/X11R5/include        \
-    /usr/X11R4/include        \
-                              \
-    /usr/include/X11          \
-    /usr/include/X11R6        \
-    /usr/include/X11R5        \
-    /usr/include/X11R4        \
-                              \
-    /usr/local/X11/include    \
-    /usr/local/X11R6/include  \
-    /usr/local/X11R5/include  \
-    /usr/local/X11R4/include  \
-                              \
-    /usr/local/include/X11    \
-    /usr/local/include/X11R6  \
-    /usr/local/include/X11R5  \
-    /usr/local/include/X11R4  \
-                              \
-    /usr/X386/include         \
-    /usr/x386/include         \
-    /usr/XFree86/include/X11  \
-                              \
-    /usr/include              \
-    /usr/local/include        \
-    /usr/unsupported/include  \
-    /usr/athena/include       \
-    /usr/local/x11r5/include  \
-    /usr/lpp/Xamples/include  \
-                              \
-    /usr/openwin/include      \
-    /usr/openwin/share/include \
-    ; \
-  do
-    if test -r "$ac_dir/$x_direct_test_include"; then
-      ac_x_includes=$ac_dir
-      break
-    fi
-  done
+  eval "ac_cv_header_$ac_safe=no"
 fi
 rm -f conftest*
-fi # $ac_x_includes = NO
-
-if test "$ac_x_libraries" = NO; then
-  # Check for the libraries.
-
-  test -z "$x_direct_test_library" && x_direct_test_library=Xt
-  test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc
-
-  # See if we find them without any special options.
-  # Don't add to $LIBS permanently.
-  ac_save_LIBS="$LIBS"
-  LIBS="-l$x_direct_test_library $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 14948 "configure"
-#include "confdefs.h"
-
-int main() {
-${x_direct_test_function}()
-; return 0; }
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
 EOF
-if { (eval echo configure:14955: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  LIBS="$ac_save_LIBS"
-# We can link X programs with no special library path.
-ac_x_libraries=
+ 
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  LIBS="$ac_save_LIBS"
-# First see if replacing the include by lib works.
-# Check X11 before X11Rn because it is often a symlink to the current release.
-for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \
-    /usr/X11/lib          \
-    /usr/X11R6/lib        \
-    /usr/X11R5/lib        \
-    /usr/X11R4/lib        \
-                          \
-    /usr/lib/X11          \
-    /usr/lib/X11R6        \
-    /usr/lib/X11R5        \
-    /usr/lib/X11R4        \
-                          \
-    /usr/local/X11/lib    \
-    /usr/local/X11R6/lib  \
-    /usr/local/X11R5/lib  \
-    /usr/local/X11R4/lib  \
-                          \
-    /usr/local/lib/X11    \
-    /usr/local/lib/X11R6  \
-    /usr/local/lib/X11R5  \
-    /usr/local/lib/X11R4  \
-                          \
-    /usr/X386/lib         \
-    /usr/x386/lib         \
-    /usr/XFree86/lib/X11  \
-                          \
-    /usr/lib              \
-    /usr/local/lib        \
-    /usr/unsupported/lib  \
-    /usr/athena/lib       \
-    /usr/local/x11r5/lib  \
-    /usr/lpp/Xamples/lib  \
-    /lib/usr/lib/X11	  \
-                          \
-    /usr/openwin/lib      \
-    /usr/openwin/share/lib \
-    ; \
-do
-  for ac_extension in a so sl; do
-    if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then
-      ac_x_libraries=$ac_dir
-      break 2
-    fi
-  done
-done
+  echo "$ac_t""no" 1>&6
 fi
-rm -f conftest*
-fi # $ac_x_libraries = NO
+done
 
-if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then
-  # Didn't find X anywhere.  Cache the known absence of X.
-  ac_cv_have_x="have_x=no"
-else
-  # Record where we found X for the cache.
-  ac_cv_have_x="have_x=yes \
-	        ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
+	fi
 fi
+
+if test -z "$INTLDIR_MAKE" ; then
+	CPPFLAGS="-I../intl $CPPFLAGS"
 fi
-  fi
-  eval "$ac_cv_have_x"
-fi # $with_x != no
 
-if test "$have_x" != yes; then
-  echo "$ac_t""$have_x" 1>&6
-  no_x=yes
+if test "$BUILD_INCLUDED_LIBINTL" = yes ; then
+	GT_YES="#"
+	GT_NO=
 else
-  # If each of the values was on the command line, it overrides each guess.
-  test "x$x_includes" = xNONE && x_includes=$ac_x_includes
-  test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
-  # Update the cache value to reflect the command line values.
-  ac_cv_have_x="have_x=yes \
-		ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
-  echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6
+	GT_YES=
+	GT_NO="#"
 fi
 
 
 
-# We need to check for -lsocket and -lnsl here in order to work around an
-# autoconf bug.  autoconf-2.12 is not checking for these prior to checking for
-# the X11R6 -lSM and -lICE libraries.  The resultant failures cascade...
-# 	(tested on Solaris 2.5 w/ X11R6)
-SYSTEM_NAME=`echo "$cf_cv_system_name"|tr ' ' -`
-cf_have_X_LIBS=no
-case $SYSTEM_NAME in
-irix[56]*) ;;
-clix*)
-	# FIXME: modify the library lookup in autoconf to
-	# allow _s.a suffix ahead of .a
-	echo $ac_n "checking for open in -lc_s""... $ac_c" 1>&6
-echo "configure:15055: checking for open in -lc_s" >&5
-ac_lib_var=`echo c_s'_'open | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  ac_save_LIBS="$LIBS"
-LIBS="-lc_s  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 15063 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char open();
 
-int main() {
-open()
-; return 0; }
+
+
+
+if test "$USE_INCLUDED_LIBINTL" = yes ; then
+	if test "$nls_cv_force_use_gnu_gettext" = yes ; then
+		cat >> confdefs.h <<\EOF
+#define HAVE_GETTEXT 1
 EOF
-if { (eval echo configure:15074: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
 
+	elif test "$nls_cv_use_gnu_gettext" = yes ; then
+		cat >> confdefs.h <<\EOF
+#define HAVE_GETTEXT 1
+EOF
+
+	fi
+	if test -n "$nls_cv_header_intl" ; then
+		cat >> confdefs.h <<\EOF
+#define HAVE_LIBINTL_H 1
+EOF
+
+	fi
 fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  LIBS="-lc_s $LIBS"
-	echo $ac_n "checking for gethostname in -lbsd""... $ac_c" 1>&6
-echo "configure:15091: checking for gethostname in -lbsd" >&5
-ac_lib_var=`echo bsd'_'gethostname | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+
+LIBS="$LIBS $LIBICONV"
+
+### check for alloca (required for bison and/or intl/*)
+case "$YACC" in
+bison*)
+	use_alloca=yes
+	;;
+*)
+	use_alloca=$USE_INCLUDED_LIBINTL
+	;;
+esac
+
+if test ".$use_alloca" = .yes ; then
+	
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments.  Useless!
+echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
+echo "configure:16524: checking for working alloca.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  ac_save_LIBS="$LIBS"
-LIBS="-lbsd  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 15099 "configure"
+  cat > conftest.$ac_ext <<EOF
+#line 16529 "configure"
 #include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char gethostname();
-
+#include <alloca.h>
 int main() {
-gethostname()
+char *p = alloca(2 * sizeof(int));
 ; return 0; }
 EOF
-if { (eval echo configure:15110: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16536: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
+  ac_cv_header_alloca_h=yes
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
+  ac_cv_header_alloca_h=no
 fi
 rm -f conftest*
-LIBS="$ac_save_LIBS"
+fi
+
+echo "$ac_t""$ac_cv_header_alloca_h" 1>&6
+if test $ac_cv_header_alloca_h = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA_H 1
+EOF
 
 fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  LIBS="-lbsd $LIBS"
-	echo $ac_n "checking for gethostname in -lnsl_s""... $ac_c" 1>&6
-echo "configure:15127: checking for gethostname in -lnsl_s" >&5
-ac_lib_var=`echo nsl_s'_'gethostname | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+
+echo $ac_n "checking for alloca""... $ac_c" 1>&6
+echo "configure:16557: checking for alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  ac_save_LIBS="$LIBS"
-LIBS="-lnsl_s  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 15135 "configure"
+  cat > conftest.$ac_ext <<EOF
+#line 16562 "configure"
 #include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char gethostname();
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if HAVE_ALLOCA_H
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
 
 int main() {
-gethostname()
+char *p = (char *) alloca(1);
 ; return 0; }
 EOF
-if { (eval echo configure:15146: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16590: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
+  ac_cv_func_alloca_works=yes
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
+  ac_cv_func_alloca_works=no
 fi
 rm -f conftest*
-LIBS="$ac_save_LIBS"
+fi
+
+echo "$ac_t""$ac_cv_func_alloca_works" 1>&6
+if test $ac_cv_func_alloca_works = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA 1
+EOF
 
 fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  LIBS="-lnsl_s $LIBS"
-	echo $ac_n "checking for XOpenDisplay in -lX11_s""... $ac_c" 1>&6
-echo "configure:15163: checking for XOpenDisplay in -lX11_s" >&5
-ac_lib_var=`echo X11_s'_'XOpenDisplay | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+
+if test $ac_cv_func_alloca_works = no; then
+  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+  # that cause trouble.  Some versions do not even contain alloca or
+  # contain a buggy version.  If you still want to use their alloca,
+  # use ar to extract alloca.o from them instead of compiling alloca.c.
+  ALLOCA=alloca.${ac_objext}
+  cat >> confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+
+echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+echo "configure:16622: checking whether alloca needs Cray hooks" >&5
+if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  ac_save_LIBS="$LIBS"
-LIBS="-lX11_s  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 15171 "configure"
+  cat > conftest.$ac_ext <<EOF
+#line 16627 "configure"
 #include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char XOpenDisplay();
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
 
-int main() {
-XOpenDisplay()
-; return 0; }
 EOF
-if { (eval echo configure:15182: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "webecray" >/dev/null 2>&1; then
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
+  ac_cv_os_cray=yes
 else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
+  ac_cv_os_cray=no
 fi
 rm -f conftest*
-LIBS="$ac_save_LIBS"
 
 fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  LIBS="-lX11_s $LIBS"
-	echo $ac_n "checking for XtAppInitialize in -lXt_s""... $ac_c" 1>&6
-echo "configure:15199: checking for XtAppInitialize in -lXt_s" >&5
-ac_lib_var=`echo Xt_s'_'XtAppInitialize | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+
+echo "$ac_t""$ac_cv_os_cray" 1>&6
+if test $ac_cv_os_cray = yes; then
+for ac_func in _getb67 GETB67 getb67; do
+  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:16652: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
-  ac_save_LIBS="$LIBS"
-LIBS="-lXt_s  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 15207 "configure"
+  cat > conftest.$ac_ext <<EOF
+#line 16657 "configure"
 #include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
     builtin and then its argument prototype would still apply.  */
-char XtAppInitialize();
+char $ac_func();
 
 int main() {
-XtAppInitialize()
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
 ; return 0; }
 EOF
-if { (eval echo configure:15218: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16680: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
+  eval "ac_cv_func_$ac_func=yes"
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
+  eval "ac_cv_func_$ac_func=no"
 fi
 rm -f conftest*
-LIBS="$ac_save_LIBS"
-
 fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
   echo "$ac_t""yes" 1>&6
-  LIBS="-lXt_s $LIBS"
-		 cf_have_X_LIBS=Xt
-		
+  cat >> confdefs.h <<EOF
+#define CRAY_STACKSEG_END $ac_func
+EOF
+
+  break
 else
   echo "$ac_t""no" 1>&6
 fi
- 
-else
-  echo "$ac_t""no" 1>&6
+
+done
 fi
- 
+
+echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
+echo "configure:16707: checking stack direction for C alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
 else
-  echo "$ac_t""no" 1>&6
-fi
- 
+  if test "$cross_compiling" = yes; then
+  ac_cv_c_stack_direction=0
 else
-  echo "$ac_t""no" 1>&6
-fi
- 
+  cat > conftest.$ac_ext <<EOF
+#line 16715 "configure"
+#include "confdefs.h"
+find_stack_direction ()
+{
+  static char *addr = 0;
+  auto char dummy;
+  if (addr == 0)
+    {
+      addr = &dummy;
+      return find_stack_direction ();
+    }
+  else
+    return (&dummy > addr) ? 1 : -1;
+}
+main ()
+{
+  exit (find_stack_direction() < 0);
+}
+EOF
+if { (eval echo configure:16734: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_c_stack_direction=1
 else
-  echo "$ac_t""no" 1>&6
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_c_stack_direction=-1
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_c_stack_direction" 1>&6
+cat >> confdefs.h <<EOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+EOF
+
 fi
 
+
+case $host_os in
+linux*|gnu*)
+	# workaround for bison 1.875c (compound breakage in Linux stdlib.h
+	# and bison's output make bison try to use alloca()).
+	if test -z "$GCC" ; then
+		CPPFLAGS="-DYYSTACK_USE_ALLOCA=0 $CPPFLAGS"
+		ALLOCA=""
+	elif test "$INTEL_COMPILER" = yes ; then
+		CPPFLAGS="-DYYSTACK_USE_ALLOCA=0 $CPPFLAGS"
+		ALLOCA=""
+	fi
 	;;
-*)
-	echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6
-echo "configure:15259: checking for socket in -lsocket" >&5
-ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
+esac
+
 else
-  ac_save_LIBS="$LIBS"
-LIBS="-lsocket  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 15267 "configure"
+	ALLOCA=""
+	
+fi
+
+
+for cf_hdr in iconv.h
+do
+	echo $ac_n "checking for $cf_hdr""... $ac_c" 1>&6
+echo "configure:16779: checking for $cf_hdr" >&5
+	cat > conftest.$ac_ext <<EOF
+#line 16781 "configure"
 #include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char socket();
 
-int main() {
-socket()
-; return 0; }
+#include <sys/types.h>
+#include <$cf_hdr>
+
 EOF
-if { (eval echo configure:15278: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:16789: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
+  cf_found=yes
 else
+  echo "$ac_err" >&5
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
+  cf_found=no
 fi
 rm -f conftest*
-LIBS="$ac_save_LIBS"
+echo "$ac_t""$cf_found" 1>&6
+if test $cf_found = yes ; then
+	
+cf_tr_hdr=`echo "$cf_hdr" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%`
 
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_lib=HAVE_LIB`echo socket | sed -e 's/[^a-zA-Z0-9_]/_/g' \
-    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_lib 1
+	cat >> confdefs.h <<EOF
+#define HAVE_${cf_tr_hdr} 1
 EOF
 
-  LIBS="-lsocket $LIBS"
-
-else
-  echo "$ac_t""no" 1>&6
 fi
+done
+
+echo $ac_n "checking for iconv_open() //TRANSLIT extension""... $ac_c" 1>&6
+echo "configure:16815: checking for iconv_open() //TRANSLIT extension" >&5
+if test "$cross_compiling" = yes; then
+  echo "$ac_t""unknown" 1>&6
 
-	echo $ac_n "checking for gethostname in -lnsl""... $ac_c" 1>&6
-echo "configure:15306: checking for gethostname in -lnsl" >&5
-ac_lib_var=`echo nsl'_'gethostname | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
 else
-  ac_save_LIBS="$LIBS"
-LIBS="-lnsl  $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 15314 "configure"
+  cat > conftest.$ac_ext <<EOF
+#line 16821 "configure"
 #include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char gethostname();
 
+#ifdef HAVE_ICONV_H
+#	include <iconv.h>
+#endif /* HAVE_ICONV_H */
+#ifdef HAVE_STDLIB_H
+#	include <stdlib.h>
+#endif /* HAVE_STDLIB_H */
 int main() {
-gethostname()
-; return 0; }
+	iconv_t cd;
+
+	if ((cd = iconv_open("US-ASCII//TRANSLIT", "ISO-8859-1")) == (iconv_t) (-1))
+		exit(1);
+	exit(0);
+}
 EOF
-if { (eval echo configure:15325: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
+if { (eval echo configure:16838: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ICONV_OPEN_TRANSLIT 1
+EOF
+ echo "$ac_t""yes" 1>&6
 else
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
+  rm -fr conftest*
+  echo "$ac_t""no" 1>&6
 fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
+rm -fr conftest*
 fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_lib=HAVE_LIB`echo nsl | sed -e 's/[^a-zA-Z0-9_]/_/g' \
-    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
-  cat >> confdefs.h <<EOF
-#define $ac_tr_lib 1
-EOF
 
-  LIBS="-lnsl $LIBS"
 
-else
-  echo "$ac_t""no" 1>&6
-fi
 
-	;;
-esac
+# tin has mkdirs.sh instead of mkinstalldirs, overwrite the result of test
+# in gettext.m4
+MKINSTALLDIRS="\$(top_srcdir)/mkdirs.sh"
 
-if test $cf_have_X_LIBS = no ; then
+
+if test "$cf_cv_termlib" = pdcurses ; then
 	if test "$no_x" = yes; then
   # Not all programs may use this symbol, but it does not hurt to define it.
   cat >> confdefs.h <<\EOF
@@ -15372,17 +16877,17 @@ else
     case "`(uname -sr) 2>/dev/null`" in
     "SunOS 5"*)
       echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
-echo "configure:15376: checking whether -R must be followed by a space" >&5
+echo "configure:16881: checking whether -R must be followed by a space" >&5
       ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
       cat > conftest.$ac_ext <<EOF
-#line 15379 "configure"
+#line 16884 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:15386: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16891: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_R_nospace=yes
 else
@@ -15398,14 +16903,14 @@ rm -f conftest*
       else
 	LIBS="$ac_xsave_LIBS -R $x_libraries"
 	cat > conftest.$ac_ext <<EOF
-#line 15402 "configure"
+#line 16907 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:15409: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16914: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_R_space=yes
 else
@@ -15437,7 +16942,7 @@ rm -f conftest*
     # libraries were built with DECnet support.  And karl@cs.umb.edu says
     # the Alpha needs dnet_stub (dnet does not exist).
     echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
-echo "configure:15441: checking for dnet_ntoa in -ldnet" >&5
+echo "configure:16946: checking for dnet_ntoa in -ldnet" >&5
 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -15445,7 +16950,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 15449 "configure"
+#line 16954 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -15456,7 +16961,7 @@ int main() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:15460: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:16965: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -15478,7 +16983,7 @@ fi
 
     if test $ac_cv_lib_dnet_dnet_ntoa = no; then
       echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
-echo "configure:15482: checking for dnet_ntoa in -ldnet_stub" >&5
+echo "configure:16987: checking for dnet_ntoa in -ldnet_stub" >&5
 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -15486,7 +16991,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet_stub  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 15490 "configure"
+#line 16995 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -15497,7 +17002,7 @@ int main() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:15501: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17006: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -15526,12 +17031,12 @@ fi
     # The nsl library prevents programs from opening the X display
     # on Irix 5.2, according to dickey@clark.net.
     echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:15530: checking for gethostbyname" >&5
+echo "configure:17035: checking for gethostbyname" >&5
 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 15535 "configure"
+#line 17040 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char gethostbyname(); below.  */
@@ -15554,7 +17059,7 @@ gethostbyname();
 
 ; return 0; }
 EOF
-if { (eval echo configure:15558: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17063: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_gethostbyname=yes"
 else
@@ -15575,7 +17080,7 @@ fi
 
     if test $ac_cv_func_gethostbyname = no; then
       echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:15579: checking for gethostbyname in -lnsl" >&5
+echo "configure:17084: checking for gethostbyname in -lnsl" >&5
 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -15583,7 +17088,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 15587 "configure"
+#line 17092 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -15594,7 +17099,7 @@ int main() {
 gethostbyname()
 ; return 0; }
 EOF
-if { (eval echo configure:15598: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17103: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -15624,12 +17129,12 @@ fi
     # -lsocket must be given before -lnsl if both are needed.
     # We assume that if connect needs -lnsl, so does gethostbyname.
     echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:15628: checking for connect" >&5
+echo "configure:17133: checking for connect" >&5
 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 15633 "configure"
+#line 17138 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char connect(); below.  */
@@ -15652,7 +17157,7 @@ connect();
 
 ; return 0; }
 EOF
-if { (eval echo configure:15656: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17161: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_connect=yes"
 else
@@ -15673,7 +17178,7 @@ fi
 
     if test $ac_cv_func_connect = no; then
       echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
-echo "configure:15677: checking for connect in -lsocket" >&5
+echo "configure:17182: checking for connect in -lsocket" >&5
 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -15681,7 +17186,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 15685 "configure"
+#line 17190 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -15692,7 +17197,7 @@ int main() {
 connect()
 ; return 0; }
 EOF
-if { (eval echo configure:15696: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17201: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -15716,12 +17221,12 @@ fi
 
     # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
     echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:15720: checking for remove" >&5
+echo "configure:17225: checking for remove" >&5
 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 15725 "configure"
+#line 17230 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char remove(); below.  */
@@ -15744,7 +17249,7 @@ remove();
 
 ; return 0; }
 EOF
-if { (eval echo configure:15748: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17253: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_remove=yes"
 else
@@ -15765,7 +17270,7 @@ fi
 
     if test $ac_cv_func_remove = no; then
       echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:15769: checking for remove in -lposix" >&5
+echo "configure:17274: checking for remove in -lposix" >&5
 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -15773,7 +17278,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lposix  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 15777 "configure"
+#line 17282 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -15784,7 +17289,7 @@ int main() {
 remove()
 ; return 0; }
 EOF
-if { (eval echo configure:15788: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17293: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -15808,12 +17313,12 @@ fi
 
     # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
     echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:15812: checking for shmat" >&5
+echo "configure:17317: checking for shmat" >&5
 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 15817 "configure"
+#line 17322 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char shmat(); below.  */
@@ -15836,7 +17341,7 @@ shmat();
 
 ; return 0; }
 EOF
-if { (eval echo configure:15840: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17345: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_shmat=yes"
 else
@@ -15857,7 +17362,7 @@ fi
 
     if test $ac_cv_func_shmat = no; then
       echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:15861: checking for shmat in -lipc" >&5
+echo "configure:17366: checking for shmat in -lipc" >&5
 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -15865,7 +17370,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lipc  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 15869 "configure"
+#line 17374 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -15876,7 +17381,7 @@ int main() {
 shmat()
 ; return 0; }
 EOF
-if { (eval echo configure:15880: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17385: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -15909,7 +17414,7 @@ fi
   # libraries we check for below, so use a different variable.
   #  --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
   echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
-echo "configure:15913: checking for IceConnectionNumber in -lICE" >&5
+echo "configure:17418: checking for IceConnectionNumber in -lICE" >&5
 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -15917,7 +17422,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lICE $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 15921 "configure"
+#line 17426 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -15928,7 +17433,7 @@ int main() {
 IceConnectionNumber()
 ; return 0; }
 EOF
-if { (eval echo configure:15932: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17437: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -15952,19 +17457,49 @@ fi
 
 fi
 
-	LDFLAGS="$LDFLAGS $X_LIBS"
-	
+
+
+
+
+# SYSTEM_NAME=`echo "$cf_cv_system_name"|tr ' ' -`
+
+cf_have_X_LIBS=no
+
+LDFLAGS="$X_LIBS $LDFLAGS"
+
 test -n "$verbose" && echo "	checking additions to CFLAGS" 1>&6
 
 cf_check_cflags="$CFLAGS"
 cf_check_cppflags="$CPPFLAGS"
 
+cf_fix_cppflags=no
 cf_new_cflags=
 cf_new_cppflags=
+cf_new_extra_cppflags=
+
 for cf_add_cflags in $X_CFLAGS
 do
+case $cf_fix_cppflags in
+no)
 	case $cf_add_cflags in #(vi
 	-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi
+		case $cf_add_cflags in
+		-D*)
+			cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "${cf_add_cflags}" != "${cf_tst_cflags}" \
+			&& test -z "${cf_tst_cflags}" \
+			&& cf_fix_cppflags=yes
+
+			if test $cf_fix_cppflags = yes ; then
+				cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+				cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+				continue
+			fi
+			;;
+		esac
 		case "$CPPFLAGS" in
 		*$cf_add_cflags) #(vi
 			;;
@@ -15977,6 +17512,17 @@ do
 		cf_new_cflags="$cf_new_cflags $cf_add_cflags"
 		;;
 	esac
+	;;
+yes)
+	cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+
+	cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'`
+
+	test "${cf_add_cflags}" != "${cf_tst_cflags}" \
+	&& test -z "${cf_tst_cflags}" \
+	&& cf_fix_cppflags=no
+	;;
+esac
 done
 
 if test -n "$cf_new_cflags" ; then
@@ -15991,17 +17537,25 @@ if test -n "$cf_new_cppflags" ; then
 	CPPFLAGS="$cf_new_cppflags $CPPFLAGS"
 fi
 
+if test -n "$cf_new_extra_cppflags" ; then
+	test -n "$verbose" && echo "	add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6
+
+	EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS"
+fi
+
+
+
 
 if test "$cf_check_cflags" != "$CFLAGS" ; then
 cat > conftest.$ac_ext <<EOF
-#line 15998 "configure"
+#line 17552 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 int main() {
 printf("Hello world");
 ; return 0; }
 EOF
-if { (eval echo configure:16005: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   :
 else
   echo "configure: failed program was:" >&5
@@ -16018,8 +17572,56 @@ fi
 rm -f conftest*
 fi
 
-	echo $ac_n "checking for XOpenDisplay in -lX11""... $ac_c" 1>&6
-echo "configure:16023: checking for XOpenDisplay in -lX11" >&5
+
+echo $ac_n "checking for XOpenDisplay""... $ac_c" 1>&6
+echo "configure:17578: checking for XOpenDisplay" >&5
+if eval "test \"`echo '$''{'ac_cv_func_XOpenDisplay'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 17583 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char XOpenDisplay(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char XOpenDisplay();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_XOpenDisplay) || defined (__stub___XOpenDisplay)
+choke me
+#else
+XOpenDisplay();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:17606: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_XOpenDisplay=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_XOpenDisplay=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'XOpenDisplay`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+
+echo $ac_n "checking for XOpenDisplay in -lX11""... $ac_c" 1>&6
+echo "configure:17625: checking for XOpenDisplay in -lX11" >&5
 ac_lib_var=`echo X11'_'XOpenDisplay | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -16027,7 +17629,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lX11 $X_PRE_LIBS $LIBS $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 16031 "configure"
+#line 17633 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -16038,7 +17640,7 @@ int main() {
 XOpenDisplay()
 ; return 0; }
 EOF
-if { (eval echo configure:16042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17644: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -16058,8 +17660,58 @@ else
   echo "$ac_t""no" 1>&6
 fi
 
-	echo $ac_n "checking for XtAppInitialize in -lXt""... $ac_c" 1>&6
-echo "configure:16063: checking for XtAppInitialize in -lXt" >&5
+fi
+
+
+echo $ac_n "checking for XtAppInitialize""... $ac_c" 1>&6
+echo "configure:17668: checking for XtAppInitialize" >&5
+if eval "test \"`echo '$''{'ac_cv_func_XtAppInitialize'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 17673 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char XtAppInitialize(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char XtAppInitialize();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_XtAppInitialize) || defined (__stub___XtAppInitialize)
+choke me
+#else
+XtAppInitialize();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:17696: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_XtAppInitialize=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_XtAppInitialize=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'XtAppInitialize`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+
+echo $ac_n "checking for XtAppInitialize in -lXt""... $ac_c" 1>&6
+echo "configure:17715: checking for XtAppInitialize in -lXt" >&5
 ac_lib_var=`echo Xt'_'XtAppInitialize | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -16067,7 +17719,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXt $X_PRE_LIBS $LIBS $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 16071 "configure"
+#line 17723 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -16078,7 +17730,7 @@ int main() {
 XtAppInitialize()
 ; return 0; }
 EOF
-if { (eval echo configure:16082: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17734: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -16097,80 +17749,14 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_l
 #define HAVE_LIBXT 1
 EOF
 
-		 cf_have_X_LIBS=Xt
-		 LIBS="-lXt $X_PRE_LIBS $LIBS"
+	 cf_have_X_LIBS=Xt
+	 LIBS="-lXt $X_PRE_LIBS $LIBS"
 else
   echo "$ac_t""no" 1>&6
 fi
 
-else
-	LDFLAGS="$LDFLAGS $X_LIBS"
-	
-test -n "$verbose" && echo "	checking additions to CFLAGS" 1>&6
-
-cf_check_cflags="$CFLAGS"
-cf_check_cppflags="$CPPFLAGS"
-
-cf_new_cflags=
-cf_new_cppflags=
-for cf_add_cflags in $X_CFLAGS
-do
-	case $cf_add_cflags in #(vi
-	-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi
-		case "$CPPFLAGS" in
-		*$cf_add_cflags) #(vi
-			;;
-		*) #(vi
-			cf_new_cppflags="$cf_new_cppflags $cf_add_cflags"
-			;;
-		esac
-		;;
-	*)
-		cf_new_cflags="$cf_new_cflags $cf_add_cflags"
-		;;
-	esac
-done
-
-if test -n "$cf_new_cflags" ; then
-	test -n "$verbose" && echo "	add to \$CFLAGS $cf_new_cflags" 1>&6
-
-	CFLAGS="$CFLAGS $cf_new_cflags"
-fi
-
-if test -n "$cf_new_cppflags" ; then
-	test -n "$verbose" && echo "	add to \$CPPFLAGS $cf_new_cppflags" 1>&6
-
-	CPPFLAGS="$cf_new_cppflags $CPPFLAGS"
-fi
-
-
-if test "$cf_check_cflags" != "$CFLAGS" ; then
-cat > conftest.$ac_ext <<EOF
-#line 16150 "configure"
-#include "confdefs.h"
-#include <stdio.h>
-int main() {
-printf("Hello world");
-; return 0; }
-EOF
-if { (eval echo configure:16157: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  :
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  test -n "$verbose" && echo "	test-compile failed.  Undoing change to \$CFLAGS" 1>&6
-
-	 if test "$cf_check_cppflags" != "$CPPFLAGS" ; then
-		 test -n "$verbose" && echo "	but keeping change to \$CPPFLAGS" 1>&6
-
-	 fi
-	 CFLAGS="$cf_check_flags"
-fi
-rm -f conftest*
 fi
 
-fi
 
 if test $cf_have_X_LIBS = no ; then
 	echo "configure: warning: Unable to successfully link X Toolkit library (-lXt) with
@@ -16181,32 +17767,59 @@ fi
 
 cf_x_athena=${cf_x_athena-Xaw}
 
+echo $ac_n "checking if you want to link with Xaw 3d library""... $ac_c" 1>&6
+echo "configure:17772: checking if you want to link with Xaw 3d library" >&5
+withval=
 
 # Check whether --with-Xaw3d or --without-Xaw3d was given.
 if test "${with_Xaw3d+set}" = set; then
   withval="$with_Xaw3d"
-  cf_x_athena=Xaw3d
+  :
 fi
 
+if test "$withval" = yes ; then
+	cf_x_athena=Xaw3d
+	echo "$ac_t""yes" 1>&6
+else
+	echo "$ac_t""no" 1>&6
+fi
 
+echo $ac_n "checking if you want to link with neXT Athena library""... $ac_c" 1>&6
+echo "configure:17789: checking if you want to link with neXT Athena library" >&5
+withval=
 
 # Check whether --with-neXtaw or --without-neXtaw was given.
 if test "${with_neXtaw+set}" = set; then
   withval="$with_neXtaw"
-  cf_x_athena=neXtaw
+  :
 fi
 
+if test "$withval" = yes ; then
+	cf_x_athena=neXtaw
+	echo "$ac_t""yes" 1>&6
+else
+	echo "$ac_t""no" 1>&6
+fi
 
+echo $ac_n "checking if you want to link with Athena-Plus library""... $ac_c" 1>&6
+echo "configure:17806: checking if you want to link with Athena-Plus library" >&5
+withval=
 
 # Check whether --with-XawPlus or --without-XawPlus was given.
 if test "${with_XawPlus+set}" = set; then
   withval="$with_XawPlus"
-  cf_x_athena=XawPlus
+  :
 fi
 
+if test "$withval" = yes ; then
+	cf_x_athena=XawPlus
+	echo "$ac_t""yes" 1>&6
+else
+	echo "$ac_t""no" 1>&6
+fi
 
 echo $ac_n "checking for XextCreateExtension in -lXext""... $ac_c" 1>&6
-echo "configure:16210: checking for XextCreateExtension in -lXext" >&5
+echo "configure:17823: checking for XextCreateExtension in -lXext" >&5
 ac_lib_var=`echo Xext'_'XextCreateExtension | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -16214,7 +17827,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lXext  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 16218 "configure"
+#line 17831 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -16225,7 +17838,7 @@ int main() {
 XextCreateExtension()
 ; return 0; }
 EOF
-if { (eval echo configure:16229: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17842: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -16264,13 +17877,13 @@ do
 		if test $cf_path != default ; then
 			CPPFLAGS="-I$cf_path/include $cf_save"
 			echo $ac_n "checking for $cf_test in $cf_path""... $ac_c" 1>&6
-echo "configure:16268: checking for $cf_test in $cf_path" >&5
+echo "configure:17881: checking for $cf_test in $cf_path" >&5
 		else
 			echo $ac_n "checking for $cf_test""... $ac_c" 1>&6
-echo "configure:16271: checking for $cf_test" >&5
+echo "configure:17884: checking for $cf_test" >&5
 		fi
 		cat > conftest.$ac_ext <<EOF
-#line 16274 "configure"
+#line 17887 "configure"
 #include "confdefs.h"
 
 #include <X11/Intrinsic.h>
@@ -16279,7 +17892,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:16283: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:17896: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cf_result=yes
 else
@@ -16326,23 +17939,23 @@ do
 			if test $cf_path != default ; then
 				LIBS="-L$cf_path/lib $cf_lib $LIBS"
 				echo $ac_n "checking for $cf_lib in $cf_path""... $ac_c" 1>&6
-echo "configure:16330: checking for $cf_lib in $cf_path" >&5
+echo "configure:17943: checking for $cf_lib in $cf_path" >&5
 			else
 				LIBS="$cf_lib $LIBS"
 				echo $ac_n "checking for $cf_test in $cf_lib""... $ac_c" 1>&6
-echo "configure:16334: checking for $cf_test in $cf_lib" >&5
+echo "configure:17947: checking for $cf_test in $cf_lib" >&5
 			fi
 			cf_SAVE="$LIBS"
 			LIBS="$X_PRE_LIBS $LIBS $X_EXTRA_LIBS"
 			cat > conftest.$ac_ext <<EOF
-#line 16339 "configure"
+#line 17952 "configure"
 #include "confdefs.h"
 
 int main() {
 $cf_test()
 ; return 0; }
 EOF
-if { (eval echo configure:16346: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:17959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_result=yes
 else
@@ -16386,12 +17999,34 @@ test -n "$verbose" && echo "	checking ad
 cf_check_cflags="$CFLAGS"
 cf_check_cppflags="$CPPFLAGS"
 
+cf_fix_cppflags=no
 cf_new_cflags=
 cf_new_cppflags=
+cf_new_extra_cppflags=
+
 for cf_add_cflags in $X_CFLAGS
 do
+case $cf_fix_cppflags in
+no)
 	case $cf_add_cflags in #(vi
 	-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) #(vi
+		case $cf_add_cflags in
+		-D*)
+			cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'`
+
+			test "${cf_add_cflags}" != "${cf_tst_cflags}" \
+			&& test -z "${cf_tst_cflags}" \
+			&& cf_fix_cppflags=yes
+
+			if test $cf_fix_cppflags = yes ; then
+				cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+				continue
+			elif test "${cf_tst_cflags}" = "\"'" ; then
+				cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+				continue
+			fi
+			;;
+		esac
 		case "$CPPFLAGS" in
 		*$cf_add_cflags) #(vi
 			;;
@@ -16404,6 +18039,17 @@ do
 		cf_new_cflags="$cf_new_cflags $cf_add_cflags"
 		;;
 	esac
+	;;
+yes)
+	cf_new_extra_cppflags="$cf_new_extra_cppflags $cf_add_cflags"
+
+	cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'`
+
+	test "${cf_add_cflags}" != "${cf_tst_cflags}" \
+	&& test -z "${cf_tst_cflags}" \
+	&& cf_fix_cppflags=no
+	;;
+esac
 done
 
 if test -n "$cf_new_cflags" ; then
@@ -16418,17 +18064,25 @@ if test -n "$cf_new_cppflags" ; then
 	CPPFLAGS="$cf_new_cppflags $CPPFLAGS"
 fi
 
+if test -n "$cf_new_extra_cppflags" ; then
+	test -n "$verbose" && echo "	add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6
+
+	EXTRA_CPPFLAGS="$cf_new_extra_cppflags $EXTRA_CPPFLAGS"
+fi
+
+
+
 
 if test "$cf_check_cflags" != "$CFLAGS" ; then
 cat > conftest.$ac_ext <<EOF
-#line 16425 "configure"
+#line 18079 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 int main() {
 printf("Hello world");
 ; return 0; }
 EOF
-if { (eval echo configure:16432: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18086: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   :
 else
   echo "configure: failed program was:" >&5
@@ -16446,7 +18100,7 @@ rm -f conftest*
 fi
 
 echo $ac_n "checking for XOpenDisplay in -lX11""... $ac_c" 1>&6
-echo "configure:16450: checking for XOpenDisplay in -lX11" >&5
+echo "configure:18104: checking for XOpenDisplay in -lX11" >&5
 ac_lib_var=`echo X11'_'XOpenDisplay | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -16454,7 +18108,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lX11 $X_PRE_LIBS $LIBS $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 16458 "configure"
+#line 18112 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -16465,7 +18119,7 @@ int main() {
 XOpenDisplay()
 ; return 0; }
 EOF
-if { (eval echo configure:16469: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18123: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -16486,14 +18140,14 @@ else
 fi
 
 echo $ac_n "checking for XCurses library""... $ac_c" 1>&6
-echo "configure:16490: checking for XCurses library" >&5
+echo "configure:18144: checking for XCurses library" >&5
 if eval "test \"`echo '$''{'cf_cv_lib_XCurses'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   
 LIBS="-lXCurses $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 16497 "configure"
+#line 18151 "configure"
 #include "confdefs.h"
 
 #include <xcurses.h>
@@ -16503,7 +18157,7 @@ int main() {
 XCursesExit();
 ; return 0; }
 EOF
-if { (eval echo configure:16507: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:18161: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cf_cv_lib_XCurses=yes
 else
@@ -16690,7 +18344,7 @@ do
     echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
     exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
   -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
-    echo "$CONFIG_STATUS generated by autoconf version 2.13.20020210"
+    echo "$CONFIG_STATUS generated by autoconf version 2.13.20030927"
     exit 0 ;;
   -help | --help | --hel | --he | --h)
     echo "\$ac_cs_usage"; exit 0 ;;
@@ -16750,12 +18404,31 @@ s%@SET_MAKE@%$SET_MAKE%g
 s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
 s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
 s%@INSTALL_DATA@%$INSTALL_DATA%g
-s%@RANLIB@%$RANLIB%g
 s%@YACC@%$YACC%g
 s%@LINT@%$LINT%g
+s%@EXTRA_CPPFLAGS@%$EXTRA_CPPFLAGS%g
+s%@EXEEXT@%$EXEEXT%g
+s%@OBJEXT@%$OBJEXT%g
 s%@PROG_EXT@%$PROG_EXT%g
 s%@LIB_PREFIX@%$LIB_PREFIX%g
 s%@LN_S@%$LN_S%g
+s%@BUILD_CC@%$BUILD_CC%g
+s%@BUILD_CPP@%$BUILD_CPP%g
+s%@BUILD_CFLAGS@%$BUILD_CFLAGS%g
+s%@BUILD_CPPFLAGS@%$BUILD_CPPFLAGS%g
+s%@BUILD_LDFLAGS@%$BUILD_LDFLAGS%g
+s%@BUILD_LIBS@%$BUILD_LIBS%g
+s%@BUILD_EXEEXT@%$BUILD_EXEEXT%g
+s%@BUILD_OBJEXT@%$BUILD_OBJEXT%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@RANLIB@%$RANLIB%g
+s%@LD@%$LD%g
+s%@AR@%$AR%g
+s%@AR_OPTS@%$AR_OPTS%g
 s%@PATH_ISPELL@%$PATH_ISPELL%g
 s%@PATH_METAMAIL@%$PATH_METAMAIL%g
 s%@PATH_SUM@%$PATH_SUM%g
@@ -16789,6 +18462,7 @@ s%@EXTRAOBJS@%$EXTRAOBJS%g
 s%@TIN_DEFAULTS_DIR@%$TIN_DEFAULTS_DIR%g
 s%@LIBOBJS@%$LIBOBJS%g
 s%@cf_cv_makeflags@%$cf_cv_makeflags%g
+s%@CONFIG_H@%$CONFIG_H%g
 s%@ALLOCA@%$ALLOCA%g
 s%@GLIBC21@%$GLIBC21%g
 s%@LIBICONV@%$LIBICONV%g
diff -Nurp tin-1.6.2/configure.in tin-1.8.0/configure.in
--- tin-1.6.2/configure.in	2003-09-10 17:10:24.000000000 +0200
+++ tin-1.8.0/configure.in	2005-12-24 19:11:08.629052291 +0100
@@ -1,11 +1,11 @@
 dnl Project   : tin - a Usenet reader
 dnl Module    : configure.in
-dnl Author    : Thomas E. Dickey <dickey@herndon4.his.com>
+dnl Author    : Thomas E. Dickey <dickey@invisible-island.net>
 dnl Created   : 1995-08-24
-dnl Updated   : 2003-06-18
+dnl Updated   : 2005-07-16
 dnl Notes     :
 dnl
-dnl Copyright (c) 1995-2003 Thomas E. Dickey <dickey@herndon4.his.com>
+dnl Copyright (c) 1995-2006 Thomas E. Dickey <dickey@invisible-island.net>
 dnl All rights reserved.
 dnl
 dnl Redistribution and use in source and binary forms, with or without
@@ -16,10 +16,7 @@ dnl    notice, this list of conditions a
 dnl 2. Redistributions in binary form must reproduce the above copyright
 dnl    notice, this list of conditions and the following disclaimer in the
 dnl    documentation and/or other materials provided with the distribution.
-dnl 3. All advertising materials mentioning features or use of this software
-dnl    must display the following acknowledgement:
-dnl	This product includes software developed by Thomas E. Dickey.
-dnl 4. The name of the author may not be used to endorse or promote
+dnl 3. The name of the author may not be used to endorse or promote
 dnl    products derived from this software without specific prior written
 dnl    permission.
 dnl
@@ -44,7 +41,7 @@ AC_PREFIX_DEFAULT(/usr/local)
 
 dnl PACKAGE is required for GNU gettext
 PACKAGE=tin
-VERSION=1.6.2
+VERSION=1.8.0
 AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
 AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
 AC_SUBST(PACKAGE)
@@ -79,7 +76,7 @@ case "$host_os" in
 esac
 
 ### Native Language Support
-ALL_LINGUAS="de en_GB et fr"
+ALL_LINGUAS="de en_GB et fr ru rw tr"
 
 ### Checks for programs
 save_CFLAGS="$CFLAGS"
@@ -87,16 +84,24 @@ AC_PROG_CC
 AC_PROG_GCC_TRADITIONAL
 AC_PROG_MAKE_SET
 AC_PROG_INSTALL
-AC_PROG_RANLIB
 CF_PROG_YACC
-AC_CHECK_PROGS(LINT, lint alint lclint tdlint splint, [])
-CF_GNU_SOURCE
+AC_CHECK_PROGS(LINT, lint alint lclint tdlint splint, :)
+AC_AIX
+CF_XOPEN_SOURCE
 AC_ISC_POSIX
 CF_ANSI_CC_REQD
 CF_PROG_EXT
 CF_LIB_PREFIX(LIB_PREFIX)
 AC_PROG_LN_S
 
+CF_BUILD_CC([-I$(INCDIR)],[])
+
+dnl These are standard among *NIX systems, but not when cross-compiling
+AC_CHECK_TOOL(RANLIB, ranlib, ':')
+AC_CHECK_TOOL(LD, ld, ld)
+AC_CHECK_TOOL(AR, ar, ar)
+CF_SUBST(archiver options,AR_OPTS,rv)
+
 case "$host_cpu:$host_vendor:$host_os" in
 	# check for MacOS X, exclude Darwin on ix86
 	powerpc:apple:darwin*)  #
@@ -150,7 +155,7 @@ fi
 
 ## Default shell
 AC_ARG_WITH(shell,
-	[  --with-shell=PROG       default \$SHELL program (default: sh)],
+	[  --with-shell=PROG       default $SHELL program (default: sh)],
 	[cf_cv_default_shell=$withval],
 	[cf_cv_default_shell=])
 CF_DEFAULT_SHELL($cf_cv_default_shell)
@@ -381,14 +386,14 @@ pdcurses) #(vi
 none)
 	AC_MSG_CHECKING(if you want to use ncurses library)
 	AC_ARG_WITH(ncurses,
-		[  --with-ncurses          link with ncurses if available],
+		[  --with-ncurses          link with ncurses if available (depriciated)],
 		[use_ncurses=$withval],
 		[use_ncurses=no])
 	AC_MSG_RESULT($use_ncurses)
 
 	AC_MSG_CHECKING(if you want curses rather than termcap interface)
 	CF_ARG_ENABLE(curses,
-		[  --enable-curses         use curses interface],
+		[  --enable-curses         use curses interface (depriciated)],
 		[cf_with_screen=curses;  use_curses=$withval],
 		[cf_with_screen=termcap; use_curses=no])
 	AC_MSG_RESULT($enableval)
@@ -431,26 +436,13 @@ CF_BUNDLED_PCRE($PCRE_HOME)
 
 PCRE_MAKEFILE=
 if test "$PCRE_HOME" = "no" ; then
-	PCRE_MAKEFILE="$PCRE_MAKEFILE pcre/Makefile pcre/RunTest pcre/pcre.h:pcre/pcre.in"
+	PCRE_MAKEFILE="$PCRE_MAKEFILE pcre/Makefile pcre/RunTest pcre/pcre.h"
 fi
 
 ## debugging libraries (do this after other libraries)
-AC_MSG_CHECKING(if you want dbmalloc library)
 debug_malloc=none
-AC_ARG_WITH(dbmalloc,
-	[  --with-dbmalloc         use Conor Cahill's dbmalloc library],
-	[AC_MSG_RESULT(yes)
-	 AC_CHECK_LIB(dbmalloc,debug_malloc,
-	 AC_CHECK_HEADER(dbmalloc.h,debug_malloc=DBMALLOC))],
-	AC_MSG_RESULT(no))
-
-AC_MSG_CHECKING(if you want dmalloc library)
-AC_ARG_WITH(dmalloc,
-	[  --with-dmalloc          use Gray Watson's dmalloc library],
-	[AC_MSG_RESULT(yes)
-	 AC_CHECK_LIB(dmalloc,dmalloc_debug,
-	 AC_CHECK_HEADER(dmalloc.h,debug_malloc=DMALLOC))],
-	AC_MSG_RESULT(no))
+CF_WITH_DBMALLOC(debug_malloc=DBMALLOC)
+CF_WITH_DMALLOC(debug_malloc=DMALLOC)
 
 AC_MSG_CHECKING(if you want debugging-trace)
 AC_ARG_WITH(trace,
@@ -472,7 +464,7 @@ AC_SUBST(EXTRAOBJS)
 ## options for miscellaneous definitions
 AC_MSG_CHECKING(for domain-name)
 CF_ARG_WITH(domain-name,
-	[  --with-domain-name      sets \$DOMAIN_NAME],
+	[  --with-domain-name      sets $DOMAIN_NAME],
 	DOMAIN_NAME)
 if test "$DOMAIN_NAME" != ""; then
 	AC_DEFINE_UNQUOTED(DOMAIN_NAME, "$DOMAIN_NAME")
@@ -483,9 +475,9 @@ if test "$USE_NNTP" = "yes" ; then
 AC_MSG_CHECKING(for NNTP default-server)
 CF_ARG_WITH(nntp-default-server,
 	[  --with-nntp-default-server
-                          (sets \$NNTP_DEFAULT_SERVER)
-                          (default: news\$DOMAIN_NAME)],
-	[NNTP_DEFAULT_SERVER])
+                          (sets NNTP_DEFAULT_SERVER)
+                         ],
+	[NNTP_DEFAULT_SERVER], news.$DOMAIN_NAME)
 
     if test "$NNTP_DEFAULT_SERVER" = "" ; then
 	if test "$DOMAIN_NAME" != "" ; then
@@ -559,7 +551,7 @@ AC_MSG_RESULT($enableval)
 AC_MSG_CHECKING(for MIME character-set)
 CF_WITH_DFTENV(mime-default-charset,
 	[  --with-mime-default-charset=CHARSET
-                          fallback for \$MM_CHARSET],
+                          fallback for $MM_CHARSET],
 	MM_CHARSET,US-ASCII)
 AC_MSG_RESULT($MM_CHARSET)
 
@@ -632,6 +624,14 @@ CF_ARG_ENABLE(broken-listgroup-fix,
 	[AC_DEFINE(BROKEN_LISTGROUP)])
 AC_MSG_RESULT($enableval)
 
+### on some old systems the WIFEXITED()/WEXITSTATUS() macros do not work
+AC_MSG_CHECKING(whether to ignore system()s return value)
+CF_ARG_ENABLE(broken-system-fix,
+	[  --enable-broken-system-fix
+                          ignore system()s return value],
+	[AC_DEFINE(IGNORE_SYSTEM_STATUS)])
+AC_MSG_RESULT($enableval)
+
 ### checks for the location of the system-wide default setting file
 AC_MSG_CHECKING(for directory containing tin.defaults file)
 CF_WITH_PATH(defaults-dir,
@@ -677,16 +677,6 @@ CF_CPP_EXPANDS
 CF_CPP_CONCATS
 CF_CHECK_NESTED_PARAMS
 
-### check for alloca (only required for bison)
-case "$YACC" in
-bison*)
-	AC_FUNC_ALLOCA
-	;;
-*)
-	ALLOCA=""
-	AC_SUBST(ALLOCA)
-	;;
-esac
 
 ###	Checks for header files.
 AC_HEADER_STDC
@@ -762,6 +752,11 @@ AC_TYPE_PID_T
 AC_TYPE_SIZE_T
 AC_CHECK_TYPE(ssize_t, int)
 AC_CHECK_TYPE(time_t, long)
+AC_EGREP_HEADER(in_addr_t, netinet/in.h, ,[
+	AC_EGREP_HEADER(in_addr_t, sys/endian.h, ,[
+		AC_CHECK_TYPE(in_addr_t, unsigned long)]
+	)]
+)
 AC_TYPE_UID_T
 
 dnl test to see if quad_t is defined
@@ -790,6 +785,23 @@ if test $ac_cv_long_long = yes; then
 	AC_DEFINE(HAVE_LONG_LONG)
 fi
 
+dnl test to see if nl_item is defined
+AC_MSG_CHECKING(for nl_item)
+AC_TRY_COMPILE([
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#else
+#ifdef HAVE_NL_TYPES_H
+#include <nl_types.h>
+#endif
+#endif
+],[nl_item x; x = 0],
+ac_cv_nl_item=yes, ac_cv_nl_item=no)
+AC_MSG_RESULT($ac_cv_nl_item)
+if test $ac_cv_nl_item = yes; then
+        AC_DEFINE(HAVE_NL_ITEM)
+fi
+
 ###	Checks for libraries.
 # libuu/uudeview
 # only define HAVE_LIBUU and HAVE_UUDEVIEW_H if both are found
@@ -801,6 +813,51 @@ AC_CHECK_LIB(uu, UUInitialize,
 	)]
 )
 
+# libidn - Internationalized Domain Names
+AC_CHECK_LIB(idn, stringprep_check_version,
+	[AC_CHECK_HEADER(stringprep.h,[
+		AC_DEFINE(HAVE_STRINGPREP_H)
+		AC_CHECK_HEADER(idna.h, [
+			AC_DEFINE(HAVE_IDNA_H)
+			AC_CHECK_LIB(idn, idna_to_unicode_lzlz,[
+				AC_DEFINE(HAVE_IDNA_TO_UNICODE_LZLZ)
+				AC_MSG_CHECKING(for IDNA_USE_STD3_ASCII_RULES)
+				AC_EGREP_HEADER(IDNA_USE_STD3_ASCII_RULES, idna.h,[
+					AC_DEFINE(HAVE_IDNA_USE_STD3_ASCII_RULES)
+					AC_MSG_RESULT(yes)],
+					AC_MSG_RESULT(no)
+				)
+			])
+		])
+		AC_DEFINE(HAVE_LIBIDN)
+		LIBS="$LIBS -lidn"]
+	)]
+)
+
+# ICU - International Components for Unicode
+AC_CHECK_HEADER(unicode/unorm.h,[
+	AC_CHECK_HEADER(unicode/ustring.h, [
+		AC_DEFINE(HAVE_UNICODE_UNORM_H)
+		AC_DEFINE(HAVE_UNICODE_USTRING_H)
+		AC_MSG_CHECKING(for unorm_normalize in libicuuc)
+		cf_save_LIBS="$LIBS"
+		cf_try_icuuc="no"
+		LIBS="$LIBS -licuuc"
+		AC_TRY_LINK([#include <unicode/unorm.h>], [
+			int32_t needed, ustr = NULL;
+ 			UErrorCode status;
+			needed = unorm_normalize(ustr, -1, UNORM_DEFAULT, 0, NULL, 0, &status);], [
+			AC_DEFINE(HAVE_LIBICUUC)
+			cf_try_icuuc="yes"],
+			LIBS=$cf_save_LIBS
+		)
+		AC_MSG_RESULT($cf_try_icuuc)
+		AC_CHECK_HEADER(unicode/ubidi.h, [
+			AC_DEFINE(HAVE_UNICODE_UBIDI_H)
+		])
+	])
+])
+
 if test $use_curses != no ; then
 	cf_cv_termlib=$cf_with_screen
 else
@@ -855,6 +912,7 @@ AC_CHECK_FUNCS(\
 	fdopen \
 	fork \
 	ftime \
+	ftruncate \
 	getcwd \
 	gettimeofday \
 	getwd \
@@ -890,16 +948,16 @@ AC_CHECK_FUNCS(\
 	strftime \
 	strpbrk \
 	strrstr \
+	strsep \
 	strstr \
 	strtol \
-	tempnam \
 	tmpfile \
-	tmpnam \
 	tzset \
 	uname \
 	unlink \
 	use_default_colors \
 	usleep \
+	vasprintf \
 	vsnprintf \
 	waitpid \
 $cf_tc_funcs )
@@ -912,6 +970,19 @@ AC_CHECK_FUNC(flock,
 
 AM_MULTIBYTE_ABLE
 
+AC_MSG_CHECKING(if gettimeofday takes two arguments)
+AC_TRY_COMPILE([
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif],
+[struct timeval *tv;
+struct timezone *tz;
+gettimeofday(tv, tz);],
+ac_cv_func_gettimeofday_2args=yes, ac_cv_func_gettimeofday_2args=no)
+AC_MSG_RESULT($ac_cv_func_gettimeofday_2args)
+if test $ac_cv_func_gettimeofday_2args = yes; then
+	AC_DEFINE(GETTIMEOFDAY_2ARGS)
+fi
 
 CF_POSIX_JC
 CF_FUNC_FORK
@@ -924,8 +995,11 @@ AC_EGREP_HEADER([select\(.*, *int *\*,],
 )
 
 AC_FUNC_CLOSEDIR_VOID
-## AC_FUNC_SETPGRP
-AC_FUNC_SETVBUF_REVERSED
+
+# autoconf 2.5x assumes setvbuf is not reversed when cross-compiling
+if test "$cross_compiling" != yes ; then
+	AC_FUNC_SETVBUF_REVERSED
+fi
 
 ###	Checks for network library functions.
 AC_CHECK_FUNCS(\
@@ -1001,6 +1075,7 @@ CF_CHECK_DECL(\
 	popen \
 	strchr \
 	strcasestr \
+	strsep \
 )
 
 dnl Check network stuff separately, to limit the effect of inconsistent headers
@@ -1032,6 +1107,7 @@ CF_CHECK_DECL(\
 	bcopy \
 	bzero \
 	calloc \
+	fchmod \
 	fclose \
 	fdopen \
 	fflush \
@@ -1072,7 +1148,6 @@ CF_CHECK_DECL(\
 	strncasecmp \
 	strtol \
 	system \
-	tempnam \
 	time \
 	tolower \
 	toupper \
@@ -1117,6 +1192,23 @@ esac
 CF_BUNDLED_INTL
 LIBS="$LIBS $LIBICONV"
 
+### check for alloca (required for bison and/or intl/*)
+case "$YACC" in
+bison*)
+	use_alloca=yes
+	;;
+*)
+	use_alloca=$USE_INCLUDED_LIBINTL
+	;;
+esac
+
+if test ".$use_alloca" = .yes ; then
+	CF_FUNC_ALLOCA
+else
+	ALLOCA=""
+	AC_SUBST(ALLOCA)
+fi
+
 CF_CHECK_HEADERS(iconv.h)
 AC_MSG_CHECKING(for iconv_open() //TRANSLIT extension)
 AC_TRY_RUN([
diff -Nurp tin-1.6.2/doc/CHANGES tin-1.8.0/doc/CHANGES
--- tin-1.6.2/doc/CHANGES	2003-09-10 16:55:56.000000000 +0200
+++ tin-1.8.0/doc/CHANGES	2005-12-24 19:10:36.578133298 +0100
@@ -1,4 +1,500 @@
--- 1.6.2 release 20030910 "Pabbay" --
+-- 1.8.0 release 20051224 "Ronay" --
+
+U056) Thomas E. Dickey <dickey@invisible-island.net>
+      ADD. update configure macros
+      FIX. aclocal.m4
+
+U055) Urs Janssen <urs@tin.org>
+      BUG. hypothetical buffer overrun in tin_ltoa()
+      ADD. preserve Organization line in Supersedes
+      ADD. handle bogus multiline response to XOVER with no group selected
+      ADD. config.guess, config.sub update
+      ADD. allow new .eu and .tl toplevel domains, disallow unused .bv and
+           .sj toplevel domains
+      ADD. config.guess, config.sub update
+      FIX. nntplib.c, post.c, string.c, policy.h, onfig.guess, config.sub
+
+U054) Michael Bienia <michael@vorlon.ping.de>
+      ADD. allow non-ASCII keybindings
+      FIX. extern.h, keymap.h, proto.h, global.c, keymap.c, lang.c, page.c
+           prompt.c
+
+U053) Toomas Soome <Toomas.Soome@microlink.ee>
+      ADD. updated estonian translation
+      FIX. et.po
+
+-- 1.7.10 release 20050929 "Tahay" --
+
+U052) Jessica Brennan <jib@panix.com>
+      Urs Janssen <urs@tin.org>
+      ADD. check for new mail now also works with maildir-format
+      FIX. misc.c
+
+U051) Matthias Buelow <mkb@incubus.de>
+      ADD. cache nntp-username and password
+      FIX. auth.c
+
+U050) Thomas Bliem <bliem@math.uni-wuppertal.de>
+      BUG. typos in the german translation
+      FIX. de.po
+
+U049) Toomas Soome <Toomas.Soome@microlink.ee>
+      ADD. updated estonian translation
+      FIX. et.po
+
+U048) Michael Bienia <michael@vorlon.ping.de>
+      ADD. user defined keymappings now do override default bindings
+      ADD. look at char-width for long line warning
+      FIX. keymap.c
+
+U047) Urs Janssen <urs@tin.org>
+      BUG. crash on broken overview data
+      BUG. long line warning was wrong in multibyte environments
+      BUG. incorrect prototypes for key_to_func(), func_to_key() and
+           prompt_slk_response()
+      BUG. newsgroups file caching didn't work
+      ADD. pcre update (6.1 -> 6.4)
+      ADD. check replyto address befor mailing
+      ADD. a few missing german translations
+      ADD. config.guess, config.sub update
+      ADD. allow unbinding keys by mapping them to "NULL"
+      ADD. configure check for in_addr_t, mksh and fchmod declaration
+      FIX. autoconf.h[in], extern.h, keymap.h, config.c, filter.c, header.c
+           help.c, init.c, keymap.c, mail.c, main.c, misc.c, nntplib.c, post.c
+           thread.c, de.po, config.guess, config.sub, aclocal.m4
+           configure[.in], pcre/*
+
+U046) Travis Brown <travisb@sfu.ca>
+      ADD. THREAD_PERC to attributes
+      FIX. tin.h, art.c, attrib.c, tin.5
+
+-- 1.7.9 release 20050629 "Grimsay" --
+
+U045) Thomas E. Dickey <dickey@invisible-island.net>
+      ADD. update configure macros and some dependencies in Makefile
+      FIX. aclocal.m4, configure[.in], Makefile[.in], art.c
+
+U044) Travis Brown <travisb@sfu.ca>
+      ADD. new threading method THREAD_PERC
+      FIX. extern.h, tin.h, tinrc.h, art.c, config.c, init.c, lang.c
+           options_menu.c, tincfg.tbl, tin.1, tin.5
+
+U043) Urs Janssen <urs@tin.org>
+      BUG. POST_EDIT was mssing from post_cancel_keys
+      BUG. GLOBAL_QUIT was missing from post_edit_keys and
+           post_edit_ext_keys and not rebindable in post_continue_keys
+      BUG. dublicated onlinehelp entries
+      BUG. FeedRepost didn't work
+      BUG. digits were missing in option_menu_keys
+      BUG. PGP_INCLUDE_KEY in the pgp-2 case didn't work
+      ADD. pcre update (5.0 -> 6.1)
+      ADD. warning about lines exceeding 998 octets
+      ADD. try LIST MOTD at start and show it's output if any
+      ADD. merged GroupBugReport, SelectBugReport, ThreadBugReport to
+           BugReport; GroupMarkArtUnread, PageMarkArtUnread,
+           ThreadMarkArtUnread to MarkArticleUnread; GroupMarkThdUnread,
+           PageMarkThdUnread ThreadMarkThdUnread to MarkThreadUnread;
+           GroupCatchup, PageCatchup, SelectCatchup, ThreadCatchup to
+           Catchup; GroupCatchupNextUnread, PageCatchupNextUnread,
+           SelectCatchupNextUnread, ThreadCatchupNextUnread to
+           CatchupNextUnread
+      ADD. don't care about subscritions file if reading saved news
+      ADD. extended tin_ltoa() and fix a hypotetic out of bounds write
+      ADD. set LINT to : if no lint found
+      ADD. config.guess, config.sub update
+      ADD. some more CAPABILITIES parsing
+      FIX. Makefile, aclocal.m4, configure[.in], extern.h, keymap.h, nntplib.h
+           tin.h, art.c, attrib.c, debug.c, curses.c, feed.c, filter.c
+           global.c, group.c, help.c, init.c, keymap.c, lang.c, main.c, misc.c
+           newsrc.c, nntplib.c, options_menu.c, page.c, post.c, save.c
+           select.c, string.c, thread.c, xref.c, tin.1, tin.5, config.guess
+           config.sub, de.po, pcre/*
+
+U042) Steven Michael Murphy <murf@e-tools.com>
+      ADD. started kinyarwanda translation
+      FIX. rw.po
+
+U041) Andrei Emeltchenko <andrei.emeltchenko@finik.org>
+      ADD. started russian translation
+      FIX. ru.po
+
+U040) Michael Bienia <michael@vorlon.ping.de>
+      BUG. keybindings were inited to late
+      ADD. dynamic space calculation in filter_menu()
+      ADD. use enum option_enum instead of int where appropiate
+      FIX. Makefile[.in], proto.h, tin.h, filter.c, group.c, keymap.c, main.c
+           options_menu.c, page.c, prompt.c, search.c, signal.c, thread.c
+           makecfg.c
+
+-- 1.7.8 release 20050321 "Hellisay" --
+
+U039) Matt Anton <tin@syrius.org>
+      ADD. added missing french translations
+      FIX. fr.po
+
+U038) Sebnem Korkmaz <sebnem_k@hotmail.com>
+      ADD. started turkish translation
+      FIX. tr.po
+
+U037) Toomas Soome <Toomas.Soome@microlink.ee>
+      ADD. updated estonian translation
+      FIX. et.po
+
+U036) Michael Bienia <michael@vorlon.ping.de>
+      ADD. rewrite keymap-rebinding
+      ADD. keymap autoupdate feature
+      FIX. Makefile[.in], extern.h, keymap.h, proto.h, tin.h, feed.c, filter.c
+           global.c, group.c, help.c, inews.c, init.c, keymap.c, lang.c, main.c
+           misc.c, nntplib.c, nrctbl.c, options_menu.c, page.c, pgp.c, post.c
+           prompt.c, read.c, save.c, search.c, select.c, thread.c, version.c
+           tin.1, tin.5
+
+U035) Urs Janssen <urs@tin.org>
+      ADD. basic code for new nntp-command CAPABILITIES
+      ADD. config.guess, config.sub update
+      ADD. GLOBAL_PRINT ('o') to thread-level
+      ADD. EDIT_FILTER ('E') to select- and thread-level
+      ADD. update online 'h'elp
+      ADD. configure check and fallback for non ANSI-C strsep() function
+      BUG. typos in the german translation
+      BUG. didn't compile if configured with --disable-printing
+      BUG. description of a few keys in the online help was wrong
+      BUG. out of bounds read in utf8_valid()
+      BUG. missing postinit_regexp() call in batch_mode.
+      FIX. extern.h, keymap.h, nntplib.h, proto.h, tin.h, attrib.c, config.c
+           debug.c, feed.c, filter.c, group.c, help.c, keymap.c, lang.c, main.c
+           memory.c, misc.c, nntplib.c, options_menu.c, page.c, post.c
+           screen.c, select.c, string.c, thread.c, xref.c, de.po, tr.po
+           Makefile, configure[.in], autoconf.hin. config.guess, config.sub
+           tin.1, tin.5
+
+-- 1.7.7 release 20041215 "Scalpay" --
+
+ 026) Michael Bienia <michael@vorlon.ping.de>
+      BUG. possible buffer overrun in get_mailcap_entry()
+      FIX. rfc1524.c
+
+U034) Michael Velten <tin@michnet.de>
+      BUG. currmenu->curr off by one error for empty groups
+      BUG. upward scrolling in !USE_CURSES was broken
+      ADD. consistently display "End of ..." message
+      BUG. reused the search offset when switching the context
+      FIX. proto.h, global.c, group.c, page.c, search.c, select.c, thread.c
+
+U033) Matt Anton <tin@syrius.org>
+      ADD. added missing french translations
+      FIX. fr.po
+
+U032) Michael Bienia <michael@vorlon.ping.de>
+      ADD. (w)strunc() now malloc()s the needed space
+      ADD. line-scrolling in select-, group- and thread-level
+      ADD. screen-scrolling iKeyScrollUp ('<'), iKeyScrollDown ('>')
+      ADD. unifiy option-value description formats
+      BUG. missing file truncation in do_rfc15211522_encode()
+      FIX. extern.h, keymap.h, menukeys.h, proto.h, tin.h, cook.c, global.c
+           group.c, help.c, keymap.c, lang.c, options_menu.c, page.c, post.c
+           prompt.c, rfc2045.c, rfc2047.c, screen.c, select.c, string.c
+           thread.c, keymap.sample, tin.1, tin.5
+
+U031) Urs Janssen <urs@tin.org>
+      ADD. keymap-file version number
+      ADD. config.guess, config.sub update
+      ADD. pcre update (4.5 -> 5.0)
+      ADD. configure check for ftruncate(3)
+      ADD. make sscanf(3)s first two args non-constant for backward
+           portability
+      BUG. missing #ifdef in the disable-color case
+      BUG. systemtype detection broken
+      FIX. Makefile.in, extern.h, proto.h, version.h, init.c, keymap.c, lang.c
+           misc.c, newsrc.c, options_menu.c, post.c, version.c, keymap.sample
+           pcre/*, config.guess, config.sub, de.po, en_GB.po, fr.po, tin.1
+           tin.5, configure.in, autoconf.hin
+
+-- 1.7.6 release 20040906 "Baleshare" --
+
+U030) Dennis Grevenstein <dennis@pcde.inka.de>
+      Urs Janssen <urs@tin.org>
+      ADD. --enable-broken-system-fix
+      FIX. configure[.in], autoconf.hin, misc.c
+
+U029) Urs Janssen <urs@tin.org>
+      ADD. config.guess, config.sub update
+      ADD. warn about attributes outside scope
+      ADD. move .article to dead.article if $EDITOR dies
+      ADD. tweak URL_REGEX, NEWS_REGEX
+      ADD. also check for alloca if we're going to build intl/*
+      BUG. memleak in wstrunc()
+      BUG. repost to a different group didn't restore the current group
+           pointer
+      FIX. configure[.in], extern.h, tin.h, art.c, attrib.c, charset.c, cook.c
+           curses.c, lang.c, post.c, string.c, xref.c, config.guess
+           config.sub
+
+ 025) Michael Bienia <michael@vorlon.ping.de>
+      BUG. ensure CURR_GROUP always points to current group even for
+           non interactive group-processing
+      FIX. art.c, save.c
+
+U028) Michael Bienia <michael@vorlon.ping.de>
+      BUG. missing string termination
+      ADD. allow to hide options in the 'M'enu based on the value of other
+           options
+      ADD. crsr-up/dowm in option-list
+      ADD. remove CURR_GROUP dependecy from sort functions
+      ADD. wcspart() now mallocs the needed space on its own
+      ADD. kill/hot-menu "Kill/Select pattern scope" now walks up the
+           hierarchie level
+      ADD. move '-V' code into a function, use it inside mail_bug_report()
+      ADD. use mark_screen() also in GROUP_LEVEL and THREAD_LEVEL
+      ADD. move the options menu code from config.c to options_menu.c
+      REM. draw_line()
+      FIX. Makefile[.in], extern.h, proto.h, tcurses.c, tin.h, art.c
+           charset.c, config.c, filter.c, getline.c, group.c, init.c, lang.c
+           main.c, misc.c, options_menu.c, post.c, prompt.c, rfc2046.c
+           screen.c, select.c, string.c, thread.c
+
+-- 1.7.5 release 20040615 "Gighay" --
+
+ 024) Herbert Xu <herbert@gondor.apana.org.au
+      BUG. potential use/free of unitialized data in get_recipients()
+      FIX. post.c
+
+ 023) Michael Bienia <michael@vorlon.ping.de>
+      BUG. negative tinrc.groupname_max_length set via 'M'enu could lead to
+           a crash
+      FIX. extern.h, proto.h, active.c, config.c, group.c, init.c, select.c
+
+ 022) Urs Janssen <urs@tin.org>
+      BUG. long cmd-line group could overflow a buffer in match_group_list()
+      BUG. empty newsgroups file leads to a crash
+      FIX. active.c, mail.c
+
+U027) Urs Janssen <urs@tin.org>
+      BUG. can't link when configured with --with-included-gettext
+      BUG. checknadd_headers() didn't handle folded headers
+      ADD. replace raw 8bit chars in From:-header
+      ADD. remove empty headers before passing article to inews
+      ADD. minor code cleanup
+      ADD. config.guess, config.sub update
+      ADD. configure check for unicode/ubidi.h
+      FIX. intl/loadmsgcat.c, configure.in, proto.h, autoconf.hin, art.c
+           cook.c, getline.c, filter.c, misc.c, nntplib.c, post.c, refs.c
+           config.guess, config.sub, fr.po, et.po
+
+U026) Matt Anton <tin@syrius.org>
+      ADD. added a some missing french translations
+      FIX. fr.po
+
+U025) Elmar W. Tischhauser <tischhau@rbg.informatik.tu-darmstadt.de>
+      ADD. mime_forward (message/rfc822) attributes option
+      FIX. proto.h, tin.h, attrib.c, post.c, rfc2047.c, tin.5
+
+U024) Thomas E. Dickey <dickey@invisible-island.net>
+      BUG. didn't build with pdcurses
+      BUG. unportable linewrapping used in configure macro
+      FIX. aclocal.m4, tcurses.c
+
+U023) Michael Bienia <michael@vorlon.ping.de>
+      BUG. in case of a reconnect unmalloced memory could be freed
+      BUG. didn't always initialize articles score
+      BUG. expand_rel_abs_pathname() truncated pathnames in tinrc
+      ADD. dynamic Menu option-width.
+      ADD. minimalistic BiDi support (tinrc.render_bidi)
+      ADD. check for valid UTF-8 in process_text_body_part()
+      ADD. minor code cleanup
+      ADD. redrawing support inside prompt_slk_response()
+      ADD. use dash instead hyphen for options in manpages
+      ADD. check for senseless tinrc-values
+      FIX. extern.h, proto.h, tin.h, tinrc.h, art.c, charset.c, color.c
+           config.c, cook.c, curses.c, feed.c, filter.c, getline.c, init.c
+           lang.c, makecfg.c, misc.c, newsrc.c, page.c, prompt.c, save.c
+           screen.c, search.c, select.c, signal.c, string.c, tags.c
+           tcurses.c, tincfg.tbl, tin.1, tin.5, de.po, en_GB.po
+
+-- 1.7.4 release 20040225 "Benbecula" --
+
+U022) Lech Szychowski <lech7@pse.pl>
+      BUG. didn't check if message-ids taken from the References:-header are
+           valid before using them for threading.
+      FIX. refs.c
+
+U021) Matt Anton <tin@syrius.org>
+      ADD. added a few missing french translations
+      FIX. fr.po
+
+U020) Thomas E. Dickey <dickey@invisible-island.net>
+      ADD. allow cross-compiling
+      FIX. aclocal.m4, configure[.in], autoconf.hin, proto.h, tcurses.h, tin.h
+           Makefile.in, config.c, langinfo.c, pcre/Makefile.in
+           intl/Makefile.in, intl/dcigettext.c, intl/gettextP.h
+           intl/loadmsgcat.c, intl/localealias.c
+
+ 021) Urs Janssen <urs@tin.org>
+      BUG. did allow unused .eh and .kp TLDs
+      BUG. still used some old keynames in keymap.sample
+      ADD. mention supersede possibility in manpage/online help
+      FIX. policy.h, lang.c, tin.1, de.po, keymap.sample
+
+U019) Michael Bienia <michael@vorlon.ping.de>
+      BUG. error_message() clobbers global var mesg
+      BUG. didn't catch KEY_RESIZE in USE_CURSES wide-char mode thus a
+           windows-resize was taken a keypress
+      ADD. several checks for valid utf-8 data
+      ADD. display non-printable characters as octals in raw-mode
+      ADD, redraw tin_getline()-prompt after window-resizing
+      ADD. minor code cleanup
+      FIX. extern.h, proto.h, tin.h, art.c, color.c, feed.c, filter.c
+           getline.c, group.c, help.c, lang.c, misc.c, page.c, post.c
+           prompt.c, rfc2046.c, screen.c, search.c, select.c, signal.c
+           string.c, tags.c, tcurses.c, thread.c, wildmat.c, xref.c
+           configure[.in], autoconf.h[in]
+
+U018) Urs Janssen <urs@tin.org>
+      ADD. allow standalone -c cmd-line flag.
+      ADD. config.guess, config.sub update
+      ADD. increase MAXREFSIZE to 998
+      ADD. minor manpage update
+      ADD. don't read keymapfile when using -o cmd-line flag
+      ADD. [un]install_helpers includes tinews.pl
+      ADD. configure test if gettimeofday() takes two arguments
+      BUG. didn't compile on !CHARSET_CONVERSION systems
+      REM. some unused vars
+      FIX. Makefile[.in], configure[.in], autoconf.h[in], extern.h, tin.h
+           filter.c, group.c, init.c, main.c, nntplib.c, post.c, pgp.c, save.c
+           tin.1, tin.5, config.guess, config.sub
+
+-- 1.7.3 release 20031220 "Taransay" --
+
+U017) Martin Treusch von Buttlar <martin+tin@t17r.de>
+      ADD. show_info attribute
+      FIX. tin.h, attrib.c, group.c, thread.c, tin.5
+
+U016) Piotr Kucharski
+      ADD. tinrc.col_urls
+      FIX. tin.1, tin.5, extern.h, tinrc.h, config.c, init.c, lang.c, page.c
+           tincfg.tbl
+
+U015) Michael Bienia <michael@vorlon.ping.de>
+      BUG. didn't search first article line and rest of the line after a
+           match
+      BUG. option and filter menus weren't multibyte safe
+      BUG. in REGEX-mode a iKeyGroupSelPattern of "*" wasn't transformed
+           into a valid regex
+      ADD. search again wraps around if no more matches are found
+      ADD. turn pcre into UTF-8 mode if usefull
+      ADD. unicode normalization for search items
+      FIX. extern.h, proto.h, tin.h, tinrc.h, config.c, feed.c, filter.c
+           group.c, init.c, lang.c, misc.c, page.c, prompt.c, regex.c
+           search.c, string.c, tincfg.tbl, *.po
+
+ 020) Jason Faultless <jason@altarstone.com>
+      BUG. Content-* headers might be ignored in multipart article headers
+      FIX. rfc2046.c
+
+U014) Jason Faultless <jason@altarstone.com>
+      ADD. newsrc.h, misc cleanups
+      ADD. cleanup of group indexing code
+      REM. more hungarian notation
+      FIX. Makefile[.in], extern.h, newsrc.h, proto.h, tin.h, art.c, debug.c
+           lang.c, mail.c, main.c, newsrc.c, post.c, xref.c
+
+U013) Joshua Crawford <mortarn@softhome.net>
+      ADD. x_headers now can be generated by a script or be a multiline
+           header if read from a file
+      FIX. post.c, tin.5
+
+U012) Toomas Soome <Toomas.Soome@microlink.ee>
+      ADD. updated estonian translation
+      FIX. et.po
+
+ 019) Urs Janssen <urs@tin.org>
+      BUG. in the -R case the server-config dir had spaces in its name
+      FIX. config.c, newsrc.c
+
+U011) Urs Janssen <urs@tin.org>
+      ADD. config.guess, config.sub update
+      ADD. pcre update (4.4 -> 4.5)
+      ADD. install.sh update
+      ADD. configure check for libidn, idna.h, stringprep.h
+      ADD. configure check for nl_item
+      ADD. configure check for libicuuc, unicode/unorm.h, unicode/ustring.h
+      ADD. minimalistic IDNA decoding support
+      FIX. config.guess, config.sub, install.sh, configure[.in]
+           autoconf.h[in], proto.h, tin.h, debug.c, init.c, misc.c
+           nntplib.c, page.c, search.c
+
+-- 1.7.2 release 20031104 "Eriskay" --
+
+U010) Dirk Nimmich <nimmich@muenster.de>
+      ADD. Fcc feature for mail
+      FIX. tin.5, proto.h, tin.h, attrib.c, inews.c, post.c
+
+U009) Lech Szychowski <lech7@pse.pl>
+      BUG. used which_response() instead of which_thread() to get the
+           current threadnumber
+      FIX. page.c
+
+ 018) Urs Janssen <urs@tin.org>
+      BUG. changes to word_highlight weren't propagated back at runtime
+      BUG. didn't catch KEY_RESIZE in USE_CURSES mode thus a
+           windows-resize was taken a keypress
+      FIX. config.c, tcurses.c
+
+ 017) Toomas Soome <Toomas.Soome@microlink.ee>
+      ADD. updated estonian translation
+      FIX. et.po
+
+ 016) Matt Anton <tin@syrius.org>
+      ADD. added a few missing french translations
+      FIX. fr.po
+
+U008) Michael Bienia <michael@vorlon.ping.de>
+      REM. hungarian notation
+      BUG. strunc() in !MULTIBYTE-ABLE-case did always add "..."
+      ADD. tinrc.date_format
+      ADD. rewrite draw_page_header()
+      FIX. tin.1, tin.5, extern.h, proto.h, tcurses.h, tin.h, tinrc.h
+           config.c, group.c, init.c, lang.c, misc.c, page.c, post.c, signal.c
+           string.c, tcurses.c, thread.c, xref.c, tincfg.tbl
+
+ 015) Michael Bienia <michael@vorlon.ping.de>
+      BUG. memory leak in ulBuildArgv()
+      BUG. wrong logic to avoid negative arguments to which_thread()
+      BUG. used quick-kill logic for kill-entries done via the menu
+      FIX. config.c, filter.c, group.c
+
+ 014) Dirk Nimmich <nimmich@muenster.de>
+      BUG. unterminated buffer in put_rest()
+      FIX. cook.c
+
+U007) Jason Faultless <jason@altarstone.com>
+      ADD. cleanup of group indexing code
+      REM. open.c, code integrated elsewhere
+      FIX. Makefile[.in], extern.h, proto.h, active.c, art.c, filter.c, mail.c
+           misc.c, newsrc.c, nntplib.c, open.c, rfc2046.c, xref.c
+
+U006) Urs Janssen <urs@tin.org>
+      REM. amiga support
+      REM. NO_LOCALE on MAC_OS_X
+      ADD. replaced some sprintf() by snprintf() calls
+      ADD. a few missing german translations
+      ADD. config.guess, config.sub update
+      BUG. fixed a small memleak when using Fcc:
+      BUG. fixed possible use of uninitialized attributes data
+      FIX. Makefile, bugrep.h, extern.h, nntplib.h, proto.h, tin.h, tnntp.h
+           version.h, active.c, config.c, curses.c, hashstr.c, header.c, init.c
+           joinpath.c, lang.c, mail.c, main.c, memory.c, misc.c, newsrc.c
+           nntplib.c, open.c, post.c, read.c, sigfile.c, signal.c, string.c
+           xref.c, de.po, config.guess, config.sub
+
+-- 1.7.1 release 20030918 "Berneray" --
+
+U005) Michael Bienia <michael@vorlon.ping.de>
+      REM. DEBUG_NEWSRC_FIXME
+      ADD. cleanup newsrc_test_harness()
+      ADD. trunc(), wtrunc() and my_wcsdup()
+      FIX. configure[.in], autoconf.h[in], extern.h, proto.h, tin.h, main.c
+           newsrc.c, page.c, prompt.c, screen.c, string.c
 
  013) Joshua Crawford <mortarn@softhome.net>
       BUG. thinko in read_server_config()
@@ -11,6 +507,9 @@
       BUG. allowed spaces in username/password portion of URLs
       FIX. tin.h art.c, init.c, lang.c, rfc2046.c
 
+U004) Dirk Nimmich <nimmich@muenster.de>
+      BUG. art.c didn't compile with DEBUG on
+
  011) Dirk Nimmich <nimmich@muenster.de>
       BUG. 'V' didn't work with one multimedia part only
       BUG. possible buffer overrun in escape_shell_meta()
@@ -28,10 +527,33 @@
       BUG. source and destination overlap in strncpy
       FIX. config.c
 
+U003) Urs Janssen <urs@tin.org>
+      ADD. don't rely on the output of LIST EXTENSIONS
+      ADD. replaced some sprintf() by snprintf() calls
+      ADD. config.guess, config.sub update
+      ADD. pcre update (4.3 -> 4.4)
+      FIX. active.c, art.c, config.c, header.c, open.c, page.c, post.c
+           version.c, config.guess, config.sub, pcre/*
+
  009) Dirk Nimmich <nimmich@muenster.de>
       BUG. doesn't try to reconnect after a 205 response
       FIX. open.c
 
+U002) Jason Faultless <jason@altarstone.com>
+      ADD. LIST EXTENSIONS
+      ADD. rewrite overview-parser
+      FIX. extern.h, nntplib.h, proto.h, tin.h, art.c, open.c, string.c
+           xref.c
+
+U001) Dirk Nimmich <nimmich@muenster.de>
+      BUG. don't feed headers to interactive mailreader and using -M/-N
+      ADD. allow interactive mailer to get headers
+      ADD. tinrc variable to control URL highlighting
+      FIX. extern.h, tin.h, tinrc.h, config.c, feed.c, init.c, lang.c, misc.c
+           page.c, post.c, save.c, tincfg.tbl, tin.1, tin.5
+
+-- 1.7.0 release 20030810 "Sandray" --
+
  008) Darrell Tangman <dgtangman@acm.org>
       BUG. refine txt_help_thread_mark_article_read
       FIX. lang.c
@@ -48,7 +570,7 @@
            tincfg.tbl, tin.1, tin.5
 
  005) Dirk Nimmich <nimmich@muenster.de>
-      BUG. make install_sysdefs didn't honor $DESTDIR
+      BUG. make install_sysdefs didn't honour $DESTDIR
       BUG. filter on References didn't work on deep threads
       BUG. upgrading from use_metamail=ON could lead to
            metamail_prog=--internal
@@ -66,8 +588,8 @@
            save.c, tin.1, tin.spec, Makefile, src/Makefile.in, umlaut[es].txt
 
  004) Michael Velten <tin@michnet.de>
-      BUG. some info messages about (un)tagging wern't displayed
-      BUG. strip_blanks wasn't always honored
+      BUG. some info messages about (un)tagging weren't displayed
+      BUG. strip_blanks wasn't always honoured
       BUG. in some cases body-search couldn't be aborted
       ADD. avoid some useless screen redraws
       FIX. extern.h, cook.c, feed.c, group.c, lang.c, page.c, tags.c, thread.c
diff -Nurp tin-1.6.2/doc/CREDITS tin-1.8.0/doc/CREDITS
--- tin-1.6.2/doc/CREDITS	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/doc/CREDITS	2005-08-19 21:35:35.000000000 +0200
@@ -0,0 +1,67 @@
+I wish to thank the following people for supplying patches:
+
+David Abbott, Earle Ake, Deniz Akkus, Russ Allbery, Matt Anton, Orbby S.
+Arka, Joachim Astel, Anton Aylward, Mark Ayzenshteyn, Jens Chr. Bachem,
+George Baltz, Dieter Baron, Volker Barthelmann, Kirk Bauer, Paul Bauwens,
+Dieter Becker, Wolfgang Behrens, Fabrice Bellet, Greg Berigan, Enrik
+Berkhan, Juergen Bernau, Dan Berry, Michael Bienia, David Binderman, Thomas
+Bliem, Andrey Blochintsev, Chris Blum, Fokke de Boer, Andreas Borchert,
+Sebastian Bork, Mark Boucher, Robert Brady, Jessica Brennan, Bill Brolik,
+Travis Brown, Herman ten Brugge, Martin Buck, Matthias Buelow, Jeremy
+Buhler, Leila Burrell-Davis, Sean Casey, Peter Castro, Troy Cauble, Andrey
+A. Chernov, Albert Chin-A-Young, Park Chong-Dae, Tan Kwee Chuan, Boleslaw
+Ciesielski, Robert Claeson, Steven Cogswell, Don Costello, Joshua Crawford,
+Bryan Curnutt, Ned Danieley, Lars Dannenberg, Chris Davies, John Davis,
+Borislav Deianov, Thomas E. Dickey, Martin Dickopp, Olaf Dietrich, Herbert
+Martin Dietze, Theo Van Dinter, Ralf Doeblitz, Bryan Dongray, Michael
+Douglass, Nickolay Dudorov, Craig Durland, Bernd Eckenfels, Phil Edge, Kirk
+Edson, Nick Efthymiou, Stefan Elf, Nigel Ellis, Andrei Emeltchenko, L. Scott
+Emmons, Rob Engle, Olle Eriksson, Brent Ermlick, Bernd Ernesti, Ragnar
+Hojland Espinosa, Jason Faultless, Michael Faurot, Werner Fleck, John M.
+Flinchbaugh, Andy Gabor, Christian Garbs, Torsten Gesang, Ruediger Geys,
+Callum Gibson, Mike Glendinning, Igor Goryachev, Philippe Goujard, Dan
+Greenspan, Dennis Grevenstein, Karlo Gross, Carl Hage, Piers Haken, Paul
+Halsema, Ed Hanway, Scott Hauck, Christian Haul, James Hawtin, Per Headland,
+Arnold Hendriks, Daniel Hermans, Jose Herrero, Dave Hill, Tom Hite, Torsten
+Homeyer, Ulli Horlacher, Keith Howell, Tommy Hsieh, Shih-Kun Huang, Steve
+Hunt, Jeff Hurwitt, Jeon Hyoung-Jo, Ali Ibraimi, Pieter Immelman, Jarkko
+Isokungas, Patrick St. Jean, Hal Jespersen, Park Sang Jin, Robbin Johnson,
+Jarkko Jormanainen, Yury July, Nelson Kading, Geoffrey Keating, Karsten
+Keil, Charles S. Kerr, Fritz Kleeman, Andreas Kies, Janne Kiviluoto, Tomasz
+Kloczko, Dwarven Knight, Thomas Koenig, Karl-Koenig Koenigsson, Sebnem
+Korkmaz, Martin Kraemer, Gerald Krause, Thomas Kroener, Piotr Kucharski,
+Florian Kuehnert, Bernd Kuemmerlen, Kris Kugel, Stephan Kulow, Manoj Kumar,
+Dawid Kuroczko, Yuri Kuzmenko, Olivier Lacroix, Geoff Lane, Alex Lange,
+Alain Lasserre, Stanislav Latishko, Hannu Laurila, Yen-Ming Lee, Vincent
+Lefevre, Alexander Lehmann, Marty Leisner, Thomas Leitner, Hakan Lennestal,
+Kevin Lentin, Chua Choon Leong, Chris Lewis, Andreas Ley, David-Michael
+Lincke, Otto Lind, Richard Lloyd, Florian Lohoff, Reinhard Luebke, Clifford
+Luke, Michael Lupp, David MacKenzie, Hugh Mahon, Giuseppe De Marco, Scott
+Marovich, Dmitri A. Martynoff, Kazushi Marukawa, Timur Maryin, William
+McBrine, Geoff McCaughan, Owen Medd, Philipp Mergenthaler, Andreas Metzler,
+Arkadiusz Miskiewicz, Soren Moller, Bruce Momjian, Sergio Morales, Michael
+Morrell, Klaus Mueller, Mike Muise, Udo Munk, Steven Michael Murphy, John R.
+Myers, Daniel Naber, Torsten Neumann, Dirk Nimmich, James Nugen, David E.
+O'Brien, Michael O'Reilly, Oleg Ohotnikov, Ronald Orr, Julien Oster, Guido
+Ostkamp, Philip Paeps, Jeb Palmer, Neil Parker, Joseph Parmelee, Tom Parry,
+Jim Patterson, Sven Paulus, Walter Pelissero, Cameron Perkins, Colin
+Perkins, Eric Peterson, Tim Pierce, Bill Poitras, Scott W. Powers, Wolfgang
+Prediger, Marc Prud'hommeaux, GianPiero Puccioni, Thomas Quinot, Stefan
+Rapp, Martin Reising, Kyle Rhorer, Ted Richards, Steve Robbins, Ollivier
+Robert, Branden Robinson, Jim Robinson, Thomas Roessler, Erik van Roode,
+Meelis Roos, Stephen Roseman, Roland Rosenfeld, Peter Van Rossem, Clifton
+Royston, Juergen Salk, Rich Salz, Gary Sanders, Nickolay Saukh, John Sauter,
+Christopher Sawtell, Holger Schif, Volker Schmidt, John Schmitz, Torsten
+Schneider, Stefan Scholl, Rainer Scholz, Juergen Schroeder, Larry Schwimmer,
+Randy Scott, Bart Sears, Karl-Olav Serrander, Ozge Sevinc, Doug Sewell,
+Philip Shearer, Jungshik Shin, Sergey Shkonda, Andreas Siegert, Mark Smith,
+Toomas Soome, Steve Spearman, Helmut Springer, Cliff Stanford, Steve Starck,
+Jason Steiner, Ralf Stephan, Michael Stenns, Helmrich Streitmatter, Hans
+Werner Strube, Dieter Stueken, Ed Sznyter, Lech Szychowski, Dean Takemori,
+Darrell Tangman, Derek Terveer, Carsten Theis, Julian Thompson, David
+Tiller, Andry Timonin, Elmar W. Tischhauser, Mark Tomlin, Mark Tomlinson,
+Michael Traub, Martin Treusch von Buttlar, Mark Trumbull, Alex Vasylenko,
+Michael Velten, Adri Verhoef, Paul Vickers, Corinna Vinschen, Oliver B.
+Warzecha, Jason Wessel, Cary Whitney, Henrik Wist, Greg Woods, Andreas
+Wrede, Lloyd Wright, Jens Wuepper, Herbert Xu, Billy Y., Hideaki Yoshfuji,
+Nickolai Zeldovich, Zbigniew Zych
diff -Nurp tin-1.6.2/doc/INSTALL tin-1.8.0/doc/INSTALL
--- tin-1.6.2/doc/INSTALL	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/doc/INSTALL	2005-09-22 15:45:49.013965186 +0200
@@ -15,12 +15,13 @@ Note: The section 'News machine names' i
 
 The following configure options and defines are documented in detail:
 ---------------------------------------------------------------------
-  --disable-fcntl                         --program-suffix
-  --disable-included-msgs                 --program-transform-name
-  --enable-8bit-keys                      --with-coffee
-  --enable-append-pid                     --with-curses-dir
-  --enable-break-long-lines               --with-dbmalloc
-  --enable-broken-listgroup-fix           --with-defaults-dir
+  --disable-fcntl                         --program-prefix
+  --disable-included-msgs                 --program-suffix
+  --enable-8bit-keys                      --program-transform-name
+  --enable-append-pid                     --with-coffee
+  --enable-break-long-lines               --with-curses-dir
+  --enable-broken-listgroup-fix           --with-dbmalloc
+  --enable-broken-system-fix              --with-defaults-dir
   --enable-color                          --with-dmalloc
   --enable-curses                         --with-domain-name
   --enable-debug                          --with-editor
@@ -47,15 +48,15 @@ The following configure options and defi
   --exec-prefix                           --with-shell
   --mandir                                --with-spooldir
   --prefix                                --with-trace
-  --program-prefix
 
-  ENFORCE_RFC1034                         NNTP_INEWS
-  EVIL_INSIDE                             NNTP_SERVER_FILE
-  FOLLOW_USEFOR_DRAFT                     PROFILE
-  FORGERY                                 REQUIRE_BRACKETS_IN_DOMAIN_LITERAL
-  HAVE_LIBUU                              SMALL_MEMORY_MACHINE
-  HAVE_UUDEVIEW_H                         USE_CANLOCK
-  XFACE_ABLE
+
+  ENFORCE_RFC1034                         HAVE_UUDEVIEW_H
+  EVIL_INSIDE                             NNTP_INEWS
+  FOLLOW_USEFOR_DRAFT                     NNTP_SERVER_FILE
+  FORGERY                                 PROFILE
+  REQUIRE_BRACKETS_IN_DOMAIN_LITERAL      SMALL_MEMORY_MACHINE
+  HAVE_LIBUU                              XFACE_ABLE
+  USE_CANLOCK                             HAVE_BROKEN_SSCANF
 
 
 Not yet documented configure options and defines:
@@ -66,9 +67,9 @@ TIN related:
 
   DEBUG                                   MATCH_TAR_PATTERN
   DEBUG_NEWSRC                            NEW_HASH_METHOD
-  DEBUG_NEWSRC_FIXME                      OPTIMIZE_JUST_STAR
-  DEBUG_REFS (see doc/DEBUG_REFS)         REREAD_ACTIVE_FILE_SECS
-  JUST_TESTING
+  DEBUG_REFS (see doc/DEBUG_REFS)         OPTIMIZE_JUST_STAR
+  JUST_TESTING                            REREAD_ACTIVE_FILE_SECS
+  USE_UTF8_HORIZONTAL_ELLIPSIS
 
 System related:
   --datadir                               --localstatedir
@@ -79,6 +80,10 @@ System related:
   --libexecdir                            --sysconfdir
   --with-x                                --with-Xaw3d
   --with-neXtaw                           --with-XawPlus
+  --with-build-cc                         --with-build-cflags
+  --with-build-cppflags                   --with-build-ldflags
+  --with-build-libs                       --build
+  --host                                  --target
 
 News machine names
 ------------------
@@ -98,9 +103,8 @@ work properly, configure using --with-do
 
 General Notes on Building Tin
 -----------------------------
-Tin has been compiled on a wide range of Un*x machines with cc and gcc. It
-has even been ported to other systems like the AmigaOS. A list of these
-machines can be found at the end of this file.
+Tin has been compiled on a wide range of Un*x machines with cc and gcc.
+A list of these machines can be found at the end of this file.
 
 This file is long (so was the yellow brick road) but please read it all
 as it could save you problems later and we don't want an unhappy ending
@@ -194,7 +198,7 @@ Enable if you want to see full display c
 Enable if you want configure to check for various fallback prototype
 declarations.
 
-SMALL_MEMORY_MACHINE (default: not set, except on Amiga)
+SMALL_MEMORY_MACHINE (default: not set)
 Define if you are running a machine with little memory (<4MB). Tin will
 run slightly slower but be more efficient in how memory is allocated and
 reclaimed.
@@ -275,7 +279,7 @@ being configured into the executable.
         --enable-flock          enable flock() locking
 
 NNTP_INEWS (default: set if using VMS, --enable-nntp, or enable-nntp-only;
-                     unset if building an INDEX_DAEMON or not using NNTP)
+                     unset if not using NNTP)
 Define if you want to use the built-in NNTP POST routine so that you no
 longer have to rely on the mini-inews from NNTP to be installed on each
 client machine. Also check that --with-domain-name is correctly set to
@@ -284,7 +288,7 @@ produce a correct From: headers for your
 The tinrc file is created automatically for each user the first
 time they use tin.
 
-NNTP_SERVER_FILE (default: /etc/nntpserver, on Amiga: uulib:nntpserver)
+NNTP_SERVER_FILE (default: /etc/nntpserver)
 Only define if your NNTP-server file is other than /etc/nntpserver.
 
 
@@ -384,7 +388,8 @@ you may select are: curses, ncurses, ncu
 Define this if you want to link with ncurses instead of termcap. Note: This
 is required on some Linux distributions (i.e., SuSE) where there is either a
 curses or termcap library which is not ncurses. If ncurses is installed as
-the curses library, this option is usually not needed.
+the curses library, this option is usually not needed. This option is
+depriciated, use --with-screen=ncurses (see above) instead.
 
 --enable-curses (default: off)
 Enable this if you wish to use the curses screen optimizing rather than
@@ -392,8 +397,8 @@ termcap. This has been tested well start
 (except for mouse support and screen resizing) with SVr4 curses (Solaris 2.5
 is known to have a bug in libc which prevents use of curses, ncurses works
 well on that platform). To build with ncurses screen optimizing, you must
-give both the --with-ncurses and --enable-curses options or give the
---with-screen=ncurses option.
+give both the --with-ncurses and --enable-curses options. This option is
+depriciated, use --with-screen=ncurses (see above) instead.
 
 --enable-inverse-video (default: on)
 Disable if you want inverse video and highlighted bar disabled by default.
@@ -500,7 +505,7 @@ within tin). See doc/reading-mail.txt fo
 
 --enable-nls (default: on)
 The --enable-nls option enables Native Language Support (NLS), which allows
-tin to run in languages other than American English.  Native Language
+tin to run in languages other than American English. Native Language
 Support is enabled by default, the --disable-nls option disables NLS.
 
 --with-included-gettext  (default:off)
@@ -564,6 +569,11 @@ folding right seems to be a major proble
 headers in postings; e-mail headers are always folded if they have MIME
 encoded words and are longer than 76 characters.
 
+--enable-broken-system-fix (default: off)
+Ignore system()s return value. This is only needed on some very old OSs,
+e.g. NEXTSTEP3, SEIUX, DG/UX where the WIFEXITED()/WEXITSTATUS() macros do
+not work.
+
 --prefix=dirname
 Specify the toplevel installation directory. This is the recommended way to
 install tin into a directory other than the default. The toplevel
@@ -621,8 +631,8 @@ let tin generate Message-IDs
 
 USE_CANLOCK
 turn on cancel-locks, you need to compile libcanlock first by running
-./Build in the libcanlock dir and uncomment the CANLOCK/CANLIB lines in
-src/Makefile
+./Build in the libcanlock dir or by using "make canlock" from the src
+dir. You also have to uncomment the CANLOCK/CANLIB lines in src/Makefile.
 
 FOLLOW_USEFOR_DRAFT
 issue a warning instead of an error-message if Newsgroups: or
@@ -634,6 +644,7 @@ Define if you have slrnface installed an
 Compiled & installed
 --------------------
 Tin was successfully built and installed on a variety of platforms including
-Linux, FreeBSD, OpenBSD, NetBSD, Darwin, Solaris, IRIX, HP-UX, Ultrix,
-Tru64, AIX, SINIX, UXP/V, QNX, GNU Hurd, DG/UX, SEIUX and Cygwin.
+Linux, FreeBSD, OpenBSD, NetBSD, BSDi, Darwin, Solaris, IRIX, HP-UX, Ultrix,
+Tru64, AIX, SINIX, UXP/V, SUPER-UX, Unicos, QNX, GNU Hurd, DG/UX, SEIUX,
+Openstep, MiNT and Cygwin.
 For a detailed list see <http://www.tin.org/builds.html>
diff -Nurp tin-1.6.2/doc/TODO tin-1.8.0/doc/TODO
--- tin-1.6.2/doc/TODO	2003-08-26 15:09:58.000000000 +0200
+++ tin-1.8.0/doc/TODO	2005-12-24 13:06:58.392361899 +0100
@@ -4,12 +4,43 @@ not read only ,-).
 
 Bugs
 ----
+o  when entering an article from the group level via GroupNextUnreadArtOrGrp
+   ('TAB'), PageListThd ('l') points to a 'random' article in the thread
+   [20051224 Urs Janssen <urs@tin.org>]
+
+o  a wrong usename in ~/.newsauth can't be corrected in the first
+   pass
+   [20050816 Urs Janssen <urs@tin.org>]
+
+o  can 'V'iew mime-parts with (illegal) encoded filename, e.g:
+   | Content-Type: image/jpeg;
+   |  name="=?iso-8859-1?Q?internationales_Zeichen_f=FCr_Ehe.jpg?="
+   | Content-Disposition: attachment;
+   |  filename="=?iso-8859-1?Q?internationales_Zeichen_f=FCr_Ehe.jpg?="
+   as tin treats the leading '=' as mailbox indicator and complains
+   | Save filename for image/jpeg is a mailbox. Attachment not saved
+   [20050203 Urs Janssen <urs@tin.org>]
+
+o  unexpected multiline responses confuse tin, e.g.:
+   | 240 Article posted =?ISO-8859-1?Q?=3C=3D=3Fiso=2D8859=2D1=3Fq=3F=3F=3D87r7k8na?=
+   |   =?ISO-8859-1?Q?vt=2Efsf=40urs=2Did=2Etest=2Eka=2Enu=3E?=
+   (the servers response should be a single line (INN 2.2))
+   [20050207 Urs Janssen <urs@tin.org>]
+
+o  fast/endless reconecction loop after a "200\n\r400\n\r" greeting,
+   see
+   <nntp://news.tin.org/Pine.LNX.4.61.0411190338000.24950@avenger.apcoh.org>
+
+o  rot13-toggle '%' doesn't work in raw '^H' mode (but isn't disabled, so
+   the info message in the last line is wrong).
+   [20041125 Urs Janssen <urs@tin.org>]
+
 o  AFAICS change_config_file() currently has a static return value,
    but some callers do check the return value and in case we did
    change something we should update (global) attributes accordingly.
    [20030511 Urs Janssen <urs@tin.org>]
 
-o  Changes to int/bool tinrc variables in the Option Menu don't propogate
+o  Changes to int/bool tinrc variables in the Option Menu don't propagate
    back to the attributes, not even groups with global attributes.
    This is because the Option-Menu in {group,page}.c doesn't reread the
    attributes, whereas select.c does. Fix the problem properly in config.c by
@@ -19,9 +50,6 @@ o  Changes to int/bool tinrc variables i
 o  'C'atchup in pager is still not correct (we don't ever enter the next group)
    [20030515 Urs Janssen <urs@tin.org>]
 
-o  'article loss' reported in
-   <nntp://news.tin.org/20020915165856.GA1541@martinkl.dialup.fu-berlin.de>
-
 o  piping/printing articles grabbles screen
    [20030501 Urs Janssen <urs@tin.org>]
 
@@ -31,19 +59,15 @@ o  better integrate saving of MIME/non-M
    [mostly done]
    [Jason Faultless <jason@altarstone.com>]
 
-o  reusing p'o'stponed articles in mailing_list groups doesn't work
-   (possible fix: store Newsgroups (and other infos) via msg_add_header()
-    (to overwrite any old values) in X-Tin-Postponed:-header and remove it
-    before posting.)
-   [20010623 Urs Janssen <urs@tin.org>]
-
 o  batch mode has several bugs
    - -Z and giving a cmd-line group ends up in a loop
-     (filters each group several times, ~25 slower as without a cmd-line
-      group) and the cmd-line group is not displayed in the statistics
-      nor taken inot account for the 'any unread news' status.
-   - -cZ does not perform catchup, feature or bug?
-   - shall we allow stand alone -c?
+     (filters each group several times, ~25 times slower as without a
+      cmd-line group) and the cmd-line group is not displayed in the
+      statistics nor taken into account for the 'any unread news' status.
+   - -vc could be more verbose (like -vcZ is)
+   - -cZ has an unclear return value (shall we return 0 or 2 if there
+      was unread news before -c marked it as read?)
+   - -o currently is not a 'batch_mode' option
    [Urs Janssen <urs@tin.org>]
 
 o  '-s' cmd-line switch implicitly changes 'savedir' in tinrc
@@ -52,8 +76,8 @@ o  '-s' cmd-line switch implicitly chang
    Might get away with simply setting glob_attributes->savedir
    [Jason Faultless <jason@altarstone.com>]
 
-o  add version number to other config-files (e.g. tin.defaults,
-   keymap) and do the same checks as for TINRC_VERSION/tinrc. for the
+o  add version number to other config-files (e.g. tin.defaults)
+   and do the same checks as for TINRC_VERSION/tinrc. for the
    filter (and attributes) file also store the editor offset (different
    languages do use different headers) and the filter method used
    (wildmat or regexp) and the charset the file is written in (e.g.
@@ -71,14 +95,14 @@ o  rewrite code to use INEWS_PATH instea
    [20021007 Urs Janssen <urs@tin.org>
 
 o  remove built in path of external commands (metamail, ispell, ...)
-   [for ispell $ISPELL could be used to override systempath and progname]
+   [for ispell $ISPELL can be used to override systempath and progname]
 
 o  overview file cacheing code is over-complex
    - cache the original overview info instead of rebuilding it from
      the processed (decoded etc.) data, no matter if it's broken (e.g.
      contains raw 8 bit data) as we have to deal with that anyway. if there
      are no original overviews, cache the original data from the postings
-     headers.
+     headers (after unfolding and tab removal).
    - Add docs to explain how to create system-wide overviews
 
 o  tin uses the first sig-isolator as recent one, USEFOR says it should
@@ -90,8 +114,6 @@ o  iso2asc conversion is missing for 'in
 
 Pager Problems
 --------------
-o  raw mode loses (illegal) chars in multibyte based groups
-   [20021006 Michael Bienia <michael@vorlon.ping.de>]
 
 Posting Problems
 ----------------
@@ -112,6 +134,21 @@ o  mailers other than sendmail (f.e. elm
 
 New features
 ------------
+o  allow remapping of the 'z' abort-key (lynx style) in wait_for_input().
+
+o  add user defined screen layout at different levels
+   [20041025 Urs Janssen <urs@tin.org>]
+
+o  add TLS, NNTPS support
+   (see draft-ietf-nntpext-tls-nntp-09.txt;
+    <http://www.gnu.org/software/gnutls/>, <http://www.openssl.org/>
+    might be useful;
+    "stunnel -c -d 1119 -r news.example.org:563; tin -g localhost -p 1119"
+    can be used for NNTPS)
+   [20031210 Urs Janssen <urs@tin.org>]
+
+o  make 'GNKSA'-parser RFC2822/USEFOR compliant
+
 o  add In-Reply-To threading for mailgroups
    [20030518 Urs Janssen <urs@tin.org>]
 
@@ -134,35 +171,37 @@ o  add bold-italic, bold-underline, ital
    [20020721 Urs Janssen <urs@tin.org>]
 
 o  allow bold, underline, italic, ... as colour substitution for
-   monochrom terminals (map green=underline, italic=yellow)
-   (see also <20020416202232.A4575@bloatware.reston01.va.comcast.net>)
+   monochrome terminals (map green=underline, italic=yellow)
+   (see also
+   <nntp://news.tin.org/20020416202232.A4575@bloatware.reston01.va.comcast.net>)
    [20030218 Serge Matveev <sm@cl.spb.ru>]
 
-o  add switch to disable URL-highlighting without disabling inverse-video
-   [20030805 Urs Janssen <urs@tin.org>]
-
-o  hierarchical 'M'enu, e.g. hide all color_* options as long as
-   use_color is turned off, put all art_marked_*into a 'submenu', ...
-   (currently the menu is statically build on compile time)
+o  hierarchical 'M'enu, e.g. put all art_marked_*into a 'submenu', ...
    [20020322 Urs Janssen <urs@tin.org>]
 
-o  add a postponed 'browser' (store postponed arts in
-   MH or maildir format to make things easier?)
+o  add a postponed 'browser' (store postponed arts in MH or maildir
+   format to make things easier?)
    [20020305 Dirk Nimmich <nimmich@muenster.de>]
 
-o  add postpone option for mail-actions
-   [20020404 Urs Janssen <urs@tin.org>]
+o  add postpone option for mail-actions;
+   reusing p'o'stponed articles in mailing_list groups doesn't work
+   (possible fix: store Newsgroups (and other infos) via msg_add_header()
+    (to overwrite any old values) in X-Tin-Postponed:-header and remove it
+    before posting.)
+   [20010623 Urs Janssen <urs@tin.org>]
 
 o  should the postponed 'file' (and posted messages 'file') be in
    mailbox_format (even if that's a one file/message format, thus
    the 'file' actually needs to be a directory?).
 
-o  add maildir support (besides MBOX{O,RD} and MMDF},
+o  add maildir/maildir++ support (besides MBOX{O,RD} and MMDF},
    MH (not only reading but also writing), mailstore, BABYL, Kendra (MMDF
-   like with 20*CTRL-A as sep.) and add man-pages for the varius formats.
+   like with 20*CTRL-A as sep.), MBX (indexed MBOX from UW-IMAP) and add
+   man-pages for the various formats.
    (see <http://www.ifi.uio.no/~larsi/notes/BABYL> for BABYL,
     <http://www.qmail.org/man/man5/maildir.html> for maildir,
-    <http://www.qmail.org/man/man5/mbox.html> for MBOXCL and MBOXCL2)
+    <http://www.qmail.org/man/man5/mbox.html> for MBOXCL and MBOXCL2,
+    <http://www.washington.edu/imap/listarch/2000/msg00363.html> for MBX)
    [20020215 Urs Janssen <urs@tin.org>]
 
 o  add $LOCKEXT support
@@ -176,6 +215,9 @@ o  add xxencode (<http://www.ctan.org/te
    replace yenc etc.pp. some day.
    [20020216 Urs Janssen <urs@tin.org>]
 
+o  add "Face:" (incompatible "X-Face:"-replacement) support?
+   [20040107 Urs Janssen <urs@tin.org>]
+
 o  turn CA_ERROR_SPACE_IN_NEWSGROUPS, CA_ERROR_NEWLINE_IN_NEWSGROUPS,
    CA_ERROR_SPACE_IN_FOLLOWUP_TO, CA_ERROR_NEWLINE_IN_FOLLOWUP_TO into
    CA_WARNING_s (see draft-ietf-usefor-article-06.txt 5.5) and mark them
@@ -203,21 +245,7 @@ o  add counter to post-processing comman
 o  add key to toggle article and thread sorting preferences on the fly
    (like 'u' for threading)
 
-o  default_mailer_format should be extended to be able to
-   give the interactive mailer the full article including all
-   headers (useful for mutt -H). we could differ between
-   %f (just body, headers must be given with %S, %T, ...)
-   and %F (headers included in the body, useful for sendmail -t <
-   "%F" etc.pp.)
-
-o  rewrite keymap stuff:
-   Define what key should trigger what action and use function names instead
-   of the old key defines. This allows to add more functionality more easily
-   since you just have to add the new function in the code and to define a
-   key in the keymap file that is bound to this function.
-   [20020305 Dirk Nimmich <nimmich@muenster.de>]
-
-o  check if servers high mark is lower as the one in users newsrc, if so
+o  check if servers high mark is lower than the one in users newsrc, if so
    issue a warning and allow the luser to reset the highmark in the newsrc
    to the servers 'l'ow or the servers 'h'igh mark or 'i'gnore it.
 
@@ -230,15 +258,11 @@ o  check if the articles Subject/From in
    if they are higher than the server's high-mark don't trust them (and
    discard the locally cached data).
 
-o  check if server supports HEADERS, if so use
-   "HEADERS - Subject From Date Message-ID References Lines Newsgroups Xref"
-   instead of OVER or XOVER
-
 o  attributes (still) needs some work, some entrys aren't really useful
    on a per group basis but others would (e.g. Reply-To)
    once we have a 'attributes-menu' we could remove most of the
    global 'attributes' set in tinrc and move them to a scope=*
-   in attibutes (e.g. From)
+   in attributes (e.g. From)
    [Urs Janssen <urs@tin.org>]
 
 o  add post_8bit_header, mail_8bit_header, post_mime_encoding,
@@ -259,30 +283,24 @@ o  add IPv6 support
    newsserver it always uses DNS (gethostbyname()/gethostbyaddr() checked
    /etc/hosts first) and getaddrinfo() seems to have a (huge) delay in some
    cases. use getipnodebyname()/getipnodebyaddr() (if available) instead.
+   check for gethostbyaddr_r()/gethostbyname_r() and use them instead
+   of gethostbyaddr()/gethostbyname() if available.
 
 o  add cmd-line/tinrc-switch to fetch only headers of unread articles;
    in that case, make 'r' reading the rest of the articles
    [-G is a start]
    allow setting a per group limit via attributes
 
-o  Add a trunc() function or something similar for shortening long strings
-   like a group name to a fixed length ending in ... (like center_line does)
-   for embedding into status messages.
-   Maybe somehow merge with sized_message(), then you can use
-   message(txt, trunc(group, 20)) etc.
-   we now could use s{w,n}printf() to do that.
-
-o  check if server supports 'LIST MOTD' (e.g. INN >= 2.0) and display
-   it on startup. check if server supports 'LIST MODERATORS' and/or
-   'LIST DISTRIB.PATS' and if it does parse the output so it can be shown
-   to the user. (i.e. when he is posting to a moderated group, show the
-   moderators mail-address, but still leave the mailing to the server; if
-   the group has limitied distribution inform the user, ...)
+o  check if server supports 'LIST MODERATORS' and/or 'LIST DISTRIB.PATS' and
+   if it does parse the output so it can be shown to the user. (e.g. when
+   posting to a moderated group, show the moderators mail-address, but still
+   leave the mailing to the server; if the group has limited distribution
+   inform the user, ...)
 
 o  if using "-n" commandline switch you can't subscribe to newsgroups not
    present in your newsrc - a simple check against the server
    (e.g. GROUP $newsgroup or if !NNTP try to stat the dir) would help.
-   ig we are running in NNTP mode and if the server understands
+   if we are running in NNTP mode and if the server understands
    LIST NEWSGROUPS pattern (don't use XGTITLE, it will become obsolete) we
    could also fetch the description without loosing "-n" speed improvements;
    if the server understands LIST ACTIVE pattern we could also get the group
@@ -291,15 +309,10 @@ o  if using "-n" commandline switch you 
 o  item_by_item_etiquette_warnings [compile-time?]
    (e.g. enable x-posts without f'up warning, disable long-sig warning)
 
-o  Rather than Cc/Bcc, I'd like to see tin simply append the
-   message to a mail folder, whose name is given by a setting
-   in the (M)enu command, possibly overridden by the current
-   setting of "record" environment variable. The folder would
-   have to be locked using a convention that will hold off
-   the various Unix mailer programs (see mbox(5), mmdf(5)).
-   [append_mail() should do the trick]
+o  unify Fcc and posted_articles_file
+   [20031012 Dirk Nimmich <nimmich@muenster.de>]
 
-o  MIME-pgp support according to RFC2015, RFC3156 - (should be easy now)
+o  MIME-pgp support according to RFC 2015, RFC 3156 - (should be easy now)
    and/or in the format that used by signcontrol/pgpverify (see also
    tinews.pl)
 
@@ -309,23 +322,28 @@ o  add feature Cc:
 
 o  add feature show_new_newsgroups_since
 
+o  add new key which taggs articles based on a prompted regex, could be used
+   for GROUP_MARK_THREAD_READ,PAGE_MARK_THREAD_READ,THREAD_MARK_ARTICLE_READ
+   and/or something like GROUP_SELECT_THREAD/THREAD_SELECT_ARTICLE which
+   works on tagged arts (the later might be usefull in conjnction with
+   GROUP_MARK_UNSELECTED_ARTICLES_READ)
+   [20051110 Urs Janssen <urs@tin.org>]
+
 o  Additions to the thread menu:
      'D'  (cancel article)
-     ']'  quick kill
-     '['  quick auto-select
-     '^A' auto-select via menu
-     '^K' kill via menu
-     'E'  (edit filter)
+     ']'  (GLOBAL_QUICK_FILTER_KILL)
+     '['  (GLOBAL_QUICK_FILTER_SELECT)
      'r'  (reply to) /* not 'R' cause it conflicts with mail_bugreport */
      ''   r should be toggle show all/show only unread
      'f'  (post a followup) (maybe also 'F', '^W', ...)
+     'N'  (next unread article)
+     'P'  (previous unread article)
      'X'  (mark all unread articles that have not been selected as read)
      ';'  (mark unread arts as hot if >= 1 art in thread is hot)
      '+'  (mark thread as hot)
      '='  (mark pattern as hot)
      'Y'  (check for new articles in thread)
      '%'  (toggle rot13 encoding of screen content)
-     'o'  (print)
      'x'  (repost)
      keys to go to previous/next thread
 
@@ -337,13 +355,15 @@ o  Additions to the select menu:
      '%'  (toggle rot13 encoding of screen content)
 
 o  Add to the 'M'enu:
-     'h'  (help screen)
-     DEFAULT_MAILER
+     'h'  (GLOBAL_HELP)
+     'R'  (GLOBAL_BUGREPORT)
+     '!'  (GLOBAL_SHELL_ESCAPE)
+     and maybe a way to changed built in path like DEFAULT_MAILER, PATH_PGP, ...
 
 o  Add to the POST_INFO-level:
-     '?','/' search (partly done, currently only the displayed page is
-                     searched which is not that useful)
-     'h' help-screen
+     '?','/','\' search (partly done, currently only the displayed page is
+                         searched which is not that useful)
+     'h'  (GLOBAL_HELP)
 
 o  Add a commandline switch (-V) that prints out all values of cpp-symbols
    etc. [partly done, but should be cleaned up]
@@ -356,7 +376,7 @@ o  A system-wide tinrc configuration fil
    Maybe a second file which could be used to force settings (eg
    inews & mailer) (tin.defaults [--with-defaults-dir] is a start)
 
-o  (g)oto group is case sensitive (nate that MH mailgroups might
+o  (g)oto group is case sensitive (note that MH mailgroups might
    contain uppercase chars)
    also newsgroup names in the command-line are case sensitive
    better would be: check if they exist and if not ask if you would
@@ -378,7 +398,7 @@ o  when From: only contains "First-name 
 
 o  Bounce duplicate Message-ID's when the headers are read. This will
    make the threading code happier too.
-   Make read_nov_file() more forgiving of errors. If the article # is okay,
+   Make read_overview() more forgiving of errors. If the article # is okay,
    then there is no reason to completely hide the article
    [Jason Faultless <jason@altarstone.com>]
 
@@ -386,18 +406,21 @@ o  Merge the selection code with the ran
    of picking articles with similar goals is wasteful.
    [Jason Faultless <jason@altarstone.com>]
 
-o  add check for libbzip2/zlib (>=1.1.4)
-   (<http://sources.redhat.com/bzip2/>, <http://www.gzip.org/zlib/>) and
-   option to write/read {g,b}zipped local overviews
-   zlib, libbzip2 might also be used for post-processing.
+o  add check for libbzip2/zlib (>=1.1.4)/[mini]lzo
+   (<http://sources.redhat.com/bzip2/>, <http://www.gzip.org/zlib/>,
+    <http://www.oberhumer.com/opensource/lzo/>) and add an
+   option to write/read {g,b,l}zipped local overviews.
+   zlib, libbzip2 and lzo might also be used for post-processing.
 
 o  add check for GPGME (<http://www.gnupg.org/gpgme.html>) and if found
    use it for pgp actions.
 
-o  rewrite/cleanup all the debugging code
+o  rewrite/cleanup all the debugging code; clearly seperate the debugging
+   levels, e.g.: NNTP=0x01, FILTER=0x02, NEWSRC=0x04, MEMORY=0x08,
+   ALL=0x0f
 
 Posting enhancements
-----------------------
+--------------------
 o  sort Followup-To:/Newsgroups: after stripping doubled newsgroups and
    before checking if they are identical, if so, strip Followup-To: and
    use unsorted but stripped Newsgroups:-line only
@@ -446,11 +469,13 @@ o  add config option for (external) view
 
 Filtering enhancements
 ----------------------
-o  add used filter-type to filter-file or filter-rule or use different
+o  add spamassassin interface when ever adding body filters
+
+o  add used filter-type to filter file or filter rule or use different
    filter files for wildmat/regexp
 
-o  add command: mark all articles older/newer than <date> as read
-   (useful when subscribing to a new group with high-traffic...)
+o  add command: mark all articles older/newer than <date> (or <days>) as
+   read (useful when subscribing to a new group with high-traffic...)
 
 o  fix kill/hot mechanism so that it is possible to match articles on
    arbitrary headers
@@ -462,7 +487,7 @@ o  allow any given amount of days in def
 
 o  allow expiring filter entrys n-days after the last time they matched
 
-o  add command to generate filter rules for all curently tagged articles
+o  add command to generate filter rules for all currently tagged articles
 
 Pager enhancements
 ------------------
@@ -479,43 +504,66 @@ o  suppress hide_uue=2 checking unless f
 
 Internal Changes
 ----------------
+o  move serveral (server related) files into the per-server dir
+   e.g.:
+      ${TIN_INDEX_NEWSDIR-"${TIN_HOMEDIR-"$HOME"}/.tin"}/.news${NNTPSERVER+"-$NNTPSERVER"}/
+   should be
+      ${TIN_INDEX_NEWSDIR-"${TIN_HOMEDIR-"$HOME"}/.tin"}${NNTPSERVER+"/$NNTPSERVER"}/.news/
+   [20050807 Urs Janssen <urs@tin.org>]
+
+o  make article numbers uint_least64_t (on OSs where possible), provide
+   usefull fallbacks if system doesn't have <inttypes.h>/<stdint.h>
+   [20050728 Urs Janssen <urs@tin.org>]
+
+o  upgrade configure-script to autoconf-2.59
+   [20050728 Urs Janssen <urs@tin.org>]
+
+o  remove untranslateable constructs like txt_prefix_*
+   [20050413 Urs Janssen <urs@tin.org>]
+
+o  merge tinrc.space_goto_next_unread, tinrc.tab_goto_next_unread and
+   tinrc.pgdn_goto_next into a single option list
+   tinrc.goto_next_unread = {SPACE, TAB, PGDN,
+                             SPACE | TAB, SPACE | PGDN,
+                             TAB | PGDN, SPACE | TAB | PGDN}
+   to shorten 'M'enu and tinrc.
+   [20050709 Urs Janssen <urs@tin.org>]
+
+o  keys which could be renamed/merged:
+   - 'm' GroupMail, PageMail, PostMail, ThreadMail
+   - 'N' GroupNextUnreadArt, PageNextUnreadArt, (SelectNextUnreadGrp)
+   - 'S' GroupAutoSave, PageAutoSave, ThreadAutoSave
+   - 'P' GroupPrevUnreadArt, PagePrevUnreadArt
+   - '@' GroupReverseSel, ThreadReverseSel
+   - '~' GroupUndoSel, ThreadUndoSel
+   [20050408 Urs Janssen <urs@tin.org>]
+
+o  read_overview() calls eat_re() which strips the "Re: " out of the
+   subject. the modified subject ist used for batch_mode opperatios (-N/-M)
+   which might not be what ppl. expect and eat_re() is the only function
+   which needs the 'regex' overhead in batch_mode... (see also the note
+   about "Re: "strpping at "Filtering enhancements").
+   [20050225 Urs Janssen <urs@tin.org>]
+
+o  use new_nntp_command() instead of nntp_command() in the rest of the
+   code (where usefull; if we do a global change, rename it to
+   nntp_command()). see check_extensions() for a sample usage.
+   [20050211 Urs Janssen <urs@tin.org>]
+
+o  replace various occurrence of "US-ASCII" by DEFAULT(_MIME)_CHARSET
+   and define that to "US-ASCII" (to make 'updates' easier).
+   [20040929 Urs Janssen <urs@tin.org>]
+
 o  add configure option for slrnface
-   [20030506 Urs Janssen <urs@akk.org>]
+   [20030506 Urs Janssen <urs@tin.org>]
 
 o  get rid of CURR_GROUP, use t_group instead
    create a global t_group *CURR_GROUP instead of the current macro
    reduce dependencies on my_group[] & selmenu outside of select.c
-   [20030501 Urs Janssen <urs@akk.org>]
+   [20030501 Urs Janssen <urs@tin.org>]
 
 o  clean up $AUTOSUBSCRIBE code (the NNTP code path is a mess)
-   [20030412 Urs Janssen <urs@akk.org>]
-
-o  the varius filter keys are named a bit inconsistent, currently we have
-   iKeyGroupQuickAutoSel, iKeyGroupQuickKill, iKeyPageQuickAutoSel,
-   iKeyPageQuickKill and iKeyGroupKill, iKeyGroupAutoSel, iKeyPageAutoKill,
-   iKeyPageAutoSel. in actual fact iKeyPageAutoKill is a misnomer and
-   should be iKeyPageKill, but the whole naming looks a bit odd.
-   the *Quick* keys do add a filter/scoring entry and the others do call
-   the filter/scoring menu. It would be nice if the name would express
-   that. e.g. rename them to something like *QuickFilter{Kill,Select}
-   and *MenuFilter{Kill,Select}. and as the default values for those
-   keys arn't used anywhere else we could drop theier scope prefix which
-   would lead us to something like iKeyQuickFilter{Kill,Select} and
-   iKeyMenuFilter{Kill,Select}
-   [20030303 Urs Janssen <urs@akk.org>]
-
-o  reduce the number of dublicated strings in lang.c
-   txt_help_select_goto_group, txt_help_group_goto_group;
-   txt_help_group_toggle_subj_display, txt_help_thread_toggle_subj_display;
-   txt_help_article_prev_unread, txt_help_group_prev_unread_art;
-   txt_help_article_repost, txt_help_group_repost;
-   txt_help_article_next_unread, txt_help_article_read_next_unread,
-   txt_help_group_next_unread_art, txt_help_group_next_unread_article
-
-o  in page level Up2 ('k') does the same as PageNextUnreadArt ('N'), but
-   Up ('^P') behaves different. shouldn't 'k' be named PageNextUnreadArt2
-   here?
-   [Urs Janssen <urs@tin.org>]
+   [20030412 Urs Janssen <urs@tin.org>]
 
 o  try to get rid of the magic numbers like NUM_MIME_CHARSETS and use
    a sentinel in the arrays instead (match_list is a showstopper here).
@@ -557,8 +605,12 @@ o  close potential security holes:
                                unlink()/chdir()/fopen()/fstat()/open()/
                                opendir()/t_open()/tmpfile()
    - check getenv() results before using it
-   [Urs Janssen <urs@tin.org> - its4 <http://www.rstcorp.com/its4>
-    and rats <http://www.securesw.com/rats/> can locate potential security
+   - check where my_strncpy() or STRCPY() should be used
+     or include OpenBSDs strlcpy(3) (and strlcat(3)) and use it.
+   (<ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/>)
+   [Urs Janssen <urs@tin.org> - its4 <http://www.rstcorp.com/its4>, rats
+    <http://www.securesw.com/rats/> and flawfinder
+    <http://www.dwheeler.com/flawfinder/> can locate potential security
     holes]
 
 o  add a _-_ to the local part of the MSGID on a subject-change
@@ -569,7 +621,7 @@ o  add to autoconf:
 o  clean up architecture independent files, rename several defines,
    remove useless doubled defines
 
-o  split tin.h/proto.h for better dependencies in make
+o  split tin.h/proto.h for better dependencies in Makefile
 
 o  check where int/long/... should be replaced by size_t, uid_t, mode_t,
    off_t, ...
@@ -581,10 +633,6 @@ o  add check for sizeof char, short, int
 
 o  cleanup post.c
 
-o  check where my_strncpy() or STRCPY() should be used
-   or include OpenBSDs strlcpy(3) (and strlcat(3)) and use it.
-   (<ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/>)
-
 o  check code with Splint (LCLint) <http://www.splint.org/>,
    ccmalloc (<http://www.inf.ethz.ch/personal/biere/projects/ccmalloc/>),
    MSS (<http://hem1.passagen.se/blizzar/mss/>) and
@@ -633,20 +681,72 @@ o  make mm_network_charset an "option_li
     check wether KOI8-RU is still used/valid)
    [done except configure check 20010907 urs@tin.org]
 
+o  make mm_network_charset an user configurable item list
+   ("US-ASCII:ISO-8859-1:ISO-8859-9:ISO-8859-15:UTF-8",
+    "US-ASCII:ISO 8859-5:KOI8-R:UTF-8",
+    "EUC-CN:ISO-2022-CN:ISO-2022-CN-EXT:Big5:UTF-8", whatever)
+   and try all given charsets in order till the one is found which matches
+   best (i.e. can display most (all) of the chars in the article).
+   [20050805 <urs@tin.org>]
+
+o  add IDNA support (RFC 3490ff.)
+   (<http://www.gnu.org/software/libidn/> might be usefull)
+   (added minimalistic IDNA decoding support if a recent libidn is found, urs)
+   [20030917 Urs Janssen <urs@tin.org>]
+
+o  add normalization
+   (via <http://oss.software.ibm.com/icu/> or
+   <http://www.gnu.org/software/libidn/>)
+   (done for search strings)
+   [20031209 Michael Bienia <michael@vorlon.ping.de>]
+
 Docs/online help
 ----------------
+o  review the turkish, russian and kinyarwanda translations
+   (tr.po, ru.po, rw.po)
+
 o  add installation guide (in html)
 
+o  add cross-compilation hints
+   	CC="crosscc" LD="crossld" AR="crossar" RANLIB=":" MAKE="crossmake" \
+   	./configure --with-build-cc=gcc --with-build-cpp=cpp \
+   	--target=cross-traget-tripple --without-x # usual configure flags
+
 o  better document keymap feature
 
 o  man page always needs work and proof reading
    e.g. 'U', 'V' in pager need better documentation, random organization
-   feature isn't documented at all
+   feature isn't documented at all.
 
 o  tin.defaults could use more documentation in manpage (tin.5)
 
+o  replace "\\" by "\e" in manpages (portable?)
+
 Not yet classified
 ------------------
+o  in several places only the latest keybinding is shown in prompts
+    (e.g. "q=quit, e=edit, i=ispell, g=pgp, M=menu, w=post, o=postpone: w"
+     with "PostPost	p	y	w" in keymaps)
+   should we try to show them all?
+   [20050718 Urs Janssen <urs@tin.org>]
+
+o  add PGP_INCLUDE_KEY to pgp_mail_keys?
+   [20050426 Urs Janssen <urs@tin.org>]
+
+o  there is no command to undo a range ('#') selection
+
+o  'article loss' reported in
+   <nntp://news.tin.org/20020915165856.GA1541@martinkl.dialup.fu-berlin.de>
+
+o  should 'tin -z foo.bar' only start up if there is any unread news in
+   foo.bar?
+   [20040325 Urs Janssen <urs@tin.org>]
+
+o  trn and perls Net::NNTP::Auth use ~/.nntpauth (format is
+   "^server\s+user\s+password"), shall we also try ~/.nntpauth if we can't
+   find a matching entry in ~/.newsauth?
+   [20040128 Urs Janssen <urs@tin.org>]
+
 o  what todo if in a CTE: x-uue the CD: filename differs from the one given
    in the begin line? IMHO we should use the one from the begin line for
    saving and in the overview in the pager.
@@ -662,13 +762,10 @@ o  move tinrc.defaults for certain coman
    (if so, also move i_key_search_last there)
    [Jason Faultless]
 
-o  what about -a cmd-line flag? is this really neaded? IMHO this can be
+o  what about -a cmd-line flag? is this really needed? IMHO this can be
    dropped, '&' can be used for runtime color toggling.
    [20021106 Urs Janssen <urs@tin.org>]
 
-o  why are -A and -g disabled on M_AMIGA?
-   [20020928 Urs Janssen <urs@tin.org>]
-
 o  -G doesn't "work" in the !NNTP case, shall we disallow it in that case
    or shall we try to implement it?
    [20030421 Urs Janssen <urs@tin.org>]
@@ -680,7 +777,7 @@ o  commas in real-name might cause probl
    [20021007 Urs Janssen <urs@tin.org>]
 
 o  what is with FOPEN_OPTS (VMS)? is it missing from ~50% of all
-   fopen()-calls or can it be droped entirely?
+   fopen()-calls or can it be dropped entirely?
    [20020821 Urs Janssen <urs@tin.org>]
 
 o  setting TIN_HOMEDIR to a non-existent dir gives a "Filesystem full"
@@ -693,7 +790,10 @@ o  check_article_to_be_posted() still ne
     overhead)
    [20010629 Urs Janssen <urs@tin.org>]
 
-o  update gettext stuff to > gettext-0.11.5
+o  update gettext stuff to > gettext-0.12.1
+
+o  clean up included pcre stuff (pcre/Makefile.in)
+   [20050608 Urs Janssen <urs@tin.org>]
 
 o  tin in batchmode dumps core if getting a SIGINT, useful?
 
@@ -701,8 +801,6 @@ o  what is with conflicting tinrc settin
    it to the user to realise that e.g. strip_blanks=ON && inverse_okay=ON
    looks ugly?
 
-o  what is with DEBUG_NEWSRC_FIXME (not DEBUG_NEWSRC) in newsrc.c?
-
 o  shows up cross-postings multiple times even if read once before getting
    a resync/reread active/newsrc-file
 
@@ -714,11 +812,14 @@ o  remove tinrc.strip_blanks? IMHO it's 
    [20020305 Urs Janssen <urs@tin.org>]
 
 o  doesn't handle symlinks for .oldnewsrc
-   (see <20021003021508.GA28021@akk10.akk.uni-karlsruhe.de> for details, urs)
+   (see <20021003021508.GA28021@akk10.akk.uni-karlsruhe.de> for details, urs.
+    if we're going to 'fix' this we must be careful to avoid symlink
+    attacks (<http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-1999-1091>)
    [20020627 Jeff Sheinberg <jeffsh@erols.com>]
 
 o  cleanup main.c/init_selfinfo()
-   ('strace -e trace=file tin' and you know what I mean)
+   ('strace -e trace=file tin' and/or 'ltrace -e getenv tin' and you know
+    what I mean)
    [fixed some of the double/tripple reads, urs]
 
 o  either use libinn(3) where ever it's possible inside the code (if
diff -Nurp tin-1.6.2/doc/WHATSNEW tin-1.8.0/doc/WHATSNEW
--- tin-1.6.2/doc/WHATSNEW	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/doc/WHATSNEW	2005-12-02 12:02:53.024078078 +0100
@@ -1,104 +1,37 @@
-New features and changes in tin-1.6
-
-New Features
-------------
-
-. Rebindable keys
-
-. New pager
-     Parses and displays MIME articles
-     Single line scrolling with Up/Down
-     URL's are highlighted
-     URL's can be launched with 'U'
-     Binary attachments can be viewed and saved with 'V'
-     UUEncoded sections can optionally be displayed as attachments
-        See hide_uue on the manpage/tinrc file
-     ^H now switches to view of original 'raw' article
-
-. Searched for strings are highlighted
-     'B'ody search goes direct to match in article
-
-. GPG support
-     PGP/GPG support honours 'from' attribute
-
-. NLS support
-
-. Charset conversion using iconv(3) for sending and displaying articles in
-  a different charset than the terminal tin runs on. The charsets are
-  customizable with tinrc-option and group-attribute mm_network_charset
-  (outgoing) and group-attribute undeclared_charset.
-  --disable-mime-strict-charset is a noop with working charset conversion.
-  The charset of the terminal is detected automatically if possible (using
-  nl_langinfo(3)).
-
-. Human readable time-stamp (as a comment) in filter file
-
-. Indicator for articles newer than n-days
-  See manpage for new tinrc variables: recent_time and art_marked_recent
-
-. art_mark_read, art_mark_killed, art_mark_selected are now configurable
-  in the usual ways. See the manpage for details.
-
-. Piping '|' now works on the thread menu
-
-. batch_save (tinrc and attribute) can now be used to control which groups
-  are affected by tin -S, -N, -M. See the manpage.
-
-. configurable scrolling via scroll_lines
-
-. configurable URL handler via url_handler
-
-. '.' sorts the newsgroup list
-
-- tin(5) manpage which describes the format of the various (config) files
-  used
+New features and changes since tin-1.6.0
 
 Changes
 -------
+. interactive mailer can now be fed with headers. The old use_mailreader_i
+  config variable is obsolete and superseded by the new interactive_mailer
+  variable that can have three values:
+  0  no interactive mailreader (old use_mailreader_i=OFF)
+  1  interactive mailreader with headers
+  2  interactive mailreader without headers (old use_mailreader_i=ON)
 
-. 'K' on the thread menu will now skip threads
-  similar to 'K' on the group menu
-
-. tin will no longer re-connect to the news server in order to just disconnect
-
-. Lots of bug fixes
-
-. xref filter rules are now matched against a the reformatted xref line
-  (same format as Newsgroups:, everything except the newsgoup names is
-  stripped, the remaining groups are comma seperated) instead of matching
-  against each group except listed (except the current one) iduvidually
-
-Retired Features
-----------------
-
-. INDEX_DAEMON is no longer supported
+New features
+------------
+. You can now specify a mailbox folder to save your sent mails (fcc=) so
+  you possibly don't need auto_cc or auto_bcc anymore. See tin(5).
 
-. -U indexing is no longer supported
+. x_headers can take a command which generates the header(s). See tin(5).
 
-. ~/.tin/headers file is no longer directly supported. Use:
-  	scope=*
-  	x_headers=~/.tin/headers
-  or an equivalent instead
+. mime_forward (message/rfc822) attributes option
 
-. ~/.tin/bug_address is no longer supported. Set a site-wide address either
-  at compile time or set in the tin.defaults file.
+. single line scrolling in all levels
 
-. 'k' no longer works in the pager. Use 'N' instead
+. minimalistic BiDi support (render_bidi)
 
-. display_mime_header_asis, display_mime_allheader_asis
-  By default the pager decodes headers. Use ^H to toggle to undecoded view
+. minimalistic IDNA decoding support
 
-. full_page_scroll and show_last_line_prev_page have been superceded by
-  scroll_lines
+. display non-printable characters as octals in raw-mode
 
-. word_h_display_marks=3 as there is no word highligthing in signatures
-  anymore
+. user defined date_format
 
-. tab_after_X_selection as it was broken for several years and nobody
-  complained about it
+. support non-ascii key-bindings
 
-. --with-local-charset as the ports (NeXT, MSDOS) where it was needed
-  weren't maintained for several years now.
+. 'percentage match' threading
 
-. filter rules xref_num and xref_score have been removed, the new format
-  of the xref rule should give you nearly the same functionailty
+Retired Features
+----------------
+. AmigaOS support
diff -Nurp tin-1.6.2/doc/art_handling.txt tin-1.8.0/doc/art_handling.txt
--- tin-1.6.2/doc/art_handling.txt	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/doc/art_handling.txt	2005-06-28 10:31:19.000000000 +0200
@@ -7,7 +7,7 @@ art_close() is not implied anywhere - yo
 t_openartinfo
 -------------
 This is basically an 'open article context'. You can pass these around or do
-anything with them independantly of the rest of the program.
+anything with them independently of the rest of the program.
 
 This structure contains open file pointers, one to the raw article,
 the other to the cooked article. There is no file related to these streams.
@@ -48,7 +48,7 @@ Content-* headers if present will then s
 The other fields are:
 params		A linked list of parameters associated with the Content-Type and
 			Content-Disposition headers
-offset		The byte offset of this attachent. The offset of header->ext is
+offset		The byte offset of this attachment. The offset of header->ext is
 			the offset of the 822 body
 lines		The number of lines of raw text in this attachment. The number of
 			lines in header->ext is the total number of lines in the article
diff -Nurp tin-1.6.2/doc/article.txt tin-1.8.0/doc/article.txt
--- tin-1.6.2/doc/article.txt	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/doc/article.txt	2005-06-28 10:31:19.000000000 +0200
@@ -0,0 +1,41 @@
+This attempts to document the article lifecycle.
+
+arts[] is trashed and rebuilt everytime a group is entered.
+This is handled entirely by index_group()
+
+setup_hard_base() creates an array of 'valid' article numbers in base[]
+
+read_overview() populates arts[] from overview data (cached or XOVER)
+Articles are initialised with set_article()
+Key initial default values are:
+	art->thread = ART_EXPIRED
+	art->status = ART_UNREAD
+
+read_art_headers() then plugs in any gaps due to new articles not yet in the
+overview (or reads all the headers if there are no overviews).
+All articles that are verified as already present (ie loaded by read_overview())
+or are newly added will have art->thread set to ART_UNTHREADED
+valid_artnum() is used to check if base[n] maps to any known arts[].artnum
+[ After this base[] is reused as the thread base pointer array, which involves
+  a change of type from long to int. This is why the code is full of ugly
+  (int) base[] casts ]
+
+parse_unread_arts() uses the newsrc bitmask to explicitly set
+art->status to either ART_UNREAD or ART_READ
+Therefore anything not in the bitmap will default to ART_UNREAD
+
+Any articles that still have art->thread set to ART_EXPIRED will
+have art->status set to ART_READ
+
+write_overview() rewrites the cached overview data for any
+articles above the group low watermark where arts->thread != ART_EXPIRED
+
+build_references() doesn't affect any of this
+
+make_threads() in essence does:
+	if (arts[i].thread >= 0)
+		arts[i].thread = ART_UNTHREADED;
+to 'unthread' all the currently threaded & valid arts and calls find_base()
+
+find_base() will not thread articles with ->thread == ART_EXPIRED
+It makes no actual changes to ->status or ->thread
diff -Nurp tin-1.6.2/doc/config-anomalies tin-1.8.0/doc/config-anomalies
--- tin-1.6.2/doc/config-anomalies	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/doc/config-anomalies	2005-06-28 10:31:19.000000000 +0200
@@ -67,6 +67,7 @@ show_last_line_prev_page     *
 group_catchup_on_exit        *
 thread_catchup_on_exit       *
 thread_articles                thread_arts in attributes
+thread_perc                  *
 show_author
 news_headers_to_display      *
 news_headers_to_not_display  *
diff -Nurp tin-1.6.2/doc/filtering tin-1.8.0/doc/filtering
--- tin-1.6.2/doc/filtering	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/doc/filtering	2005-06-28 10:31:19.000000000 +0200
@@ -300,7 +300,7 @@ msgid_only=doeblitz\.ts\.rz\.tu-bs\.de
 
 
 comment= kill all articles which do not have your message-id
-comment= as last refenrece _if_ article has any references
+comment= as last reference _if_ article has any references
 group=de.newusers.questions
 case=1
 score=-100
diff -Nurp tin-1.6.2/doc/good-netkeeping-seal tin-1.8.0/doc/good-netkeeping-seal
--- tin-1.6.2/doc/good-netkeeping-seal	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/doc/good-netkeeping-seal	2005-06-28 10:31:19.000000000 +0200
@@ -1,6 +1,7 @@
 From: Jeroen Scheerder <js@phil.uu.nl>
 Newsgroups: news.software.readers,comp.os.msdos.mail-news,comp.os.os2.mail-news,comp.sys.mac.comm,comp.os.ms-windows.apps.comm,comp.os.ms-windows.apps.winsock.news,alt.usenet.offline-reader,alt.answers,comp.answers,news.answers
 Subject: Good Net-Keeping Seal of Approval 2.0 (GNKSA 2.0) for Usenet Software
+Approved: news-answers-request@MIT.EDU
 Followup-To: news.software.readers
 Summary: Guidelines for writers of Usenet reading and posting programs.
   If you follow these guidelines,  you'll  make your users and the rest
@@ -9,11 +10,12 @@ X-Note: This is an updated and revised d
 
 Archive-name: usenet/software/good-netkeeping-seal
 Posting-Frequency: monthly (first Sunday)
-Last-modified: Apr 23 2001
-X-Version: 2.08 ($Id: gnksa.hdr,v 1.5 2001/04/23 09:36:42 js Exp $)
-URL: <http://www.xs4all.nl/%7Ejs/gnksa/>
-Maintainer: Jeroen Scheerder <js@phil.uu.nl>
+Last-modified: Oct 29 2003
+X-Version: 2.09 ($Id: gnksa.hdr,v 1.8 2003/10/29 07:31:42 js Exp $)
+URL: <http://www.gnksa.org/>
+Maintainer: Jeroen Scheerder <js@gnksa.org>
 
+-----BEGIN PGP SIGNED MESSAGE-----
 
             GNKSA * The Good Net-Keeping Seal of Approval
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -35,10 +37,9 @@ Online or Delphi.
 I believe most of this anger is misdirected.  The new users aren't
 really that different from the old-timers.  What _is_ different is that
 many of the old-timers are using relatively well-behaved software,
-typically `rn' or one of its offspring, while many of the newbies are
-using `tin', `uqwk', `AOL', or various PC newsreaders.  Unfortunately,
-these programs frequently violate assumptions that come naturally to
-people used to well-behaved readers:
+while many of the newbies are using various PC newsreaders that frequently
+violate assumptions that come naturally to people used to well-behaved
+readers:
 
   - The user can see the essential header fields, including "Newsgroups"
     and "Followup-To".
@@ -222,9 +223,9 @@ as an editable field in a form will meet
 Rationale: Topics drift as a discussion progresses, and users need the
 ability to change the Subject header to reflect the drift. Similarly, a
 user may determine that the discussion no longer belongs in some of the
-places that it started, or that its continuation needs to go elsewhere.
+places that it started, or that its continuation needs to go elsewhere. 
 The software must not impede the user's ability to make these
-judgments, possibly during the composition of her followup article.
+judgments, possibly during the composition of her followup article.  
 It's not acceptable to have users who respond to "Please direct
 followups appropriately" with "I can't; the software won't let me."
 
@@ -253,7 +254,7 @@ software by replacing non-standard prefi
 prefix "Re: ".
 
 Rationale: These things should be obvious, but many authors of news
-software don't seem to understand the relevant sections of RFC 1036.
+software don't seem to understand the relevant sections of RFC 1036. 
 Truncated "Subject: " headers, especially when gratuitous non-ASCII
 characters are also thrown in, are a major annoyance for users and can
 make threading difficult or impossible.
@@ -470,7 +471,7 @@ such as "delete".  Similarly, in English
 supersede command SHOULD include the word "supersede".
 
 Rationale: People make mistakes and need the ability to revoke or
-correct them; both `cancel' and `supersede' exist for good reasons.
+correct them; both `cancel' and `supersede' exist for good reasons. 
 However, software should not encourage users to abuse the net, either
 intentionally or accidentally, by sending unauthorized (`rogue') cancels
 or supersedes.  The supersede option is essential: due (a.o.) to
@@ -753,3 +754,13 @@ reading programs.
 
 The kind folks of news.software.readers (you know who you are) that
 have helped discussing the issues that pertain to the GNSKA cause.
+
+-----BEGIN PGP SIGNATURE-----
+Version: PGP 6.5.8
+
+iQCVAwUBP59sFihIY6bIQPMpAQGv2QQAhD1M2vo6ASncrrVitDfVuyLY4WuFc607
+24G73/uxY41/6PdzLkTe3+9Lb8RUjHhgNZvMJDc42H3veV177jHkOMOnkAHL3Nvl
+936CzXPxAsnn3YSmrCFT+cRrepvdYVoxPKu3wbhpJNTDcoyI5OcUFyOYhwKRpg31
+sVBe/csBC9g=
+=Typt
+-----END PGP SIGNATURE-----
diff -Nurp tin-1.6.2/doc/internals.txt tin-1.8.0/doc/internals.txt
--- tin-1.6.2/doc/internals.txt	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/doc/internals.txt	2005-06-28 10:31:19.000000000 +0200
@@ -90,20 +90,17 @@ The functions that manipulate the above 
 active.c:
 	read_news_active_file() populates active[] using group_add()
 
-
 art.c:
 	Many of the overview headers are stored with hash_str()
-    base[] is populated by find_base()
+	base[] is populated by find_base()
 
 hashstr.c:
 	hash_str() Hashes text strings
-
 	In the article header, the following text is hashed:
 		From: (including full name if supplied)
 		Archive-name:
 		Subject:
 
-
 list.c:
 	init_group_hash() clears group_hash[]
 	find_group_index() returns index of group in active[]
@@ -118,20 +115,17 @@ list.c:
 main.c:
 	Just the initializers for hashing
 
-
 memory.c:
 	Dynamic array management.
 	hash_reclaim() - free up table[] which holds the
 	text cache
 
-
 refs.c:
 	Handling for msgids[]
 	When threading, each msgid in the hash has a pointer back to
 	its article header in arts[] or ART_UNAVAILABLE if the article is not
 	available
 
-
 select.c:
 	my_group_add() adds a group to my_group[]
 	my_group_find() returns the index of a group in my_group[]
diff -Nurp tin-1.6.2/doc/keymap.sample tin-1.8.0/doc/keymap.sample
--- tin-1.6.2/doc/keymap.sample	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/doc/keymap.sample	2005-06-28 10:31:20.000000000 +0200
@@ -1,8 +1,8 @@
-# Sample keymap file
+# Keymap file V1.0.6 for the TIN newsreader
 #
+# Sample keymap file
 # This file contains the default key mappings
 #
-#
 # Global keys
 
 PageDown3			SPACE
@@ -11,46 +11,51 @@ SetRange			#
 LastPage			$
 ToggleColor			&
 LastViewed			-
+SearchRepeat			\
 SearchSubjF			/
 SearchSubjB			?
 SearchAuthB			A
 SearchBody			B
-SearchRepeat			\
+CatchupNextUnread		C
+EditFilter			E
 ToggleHelpDisplay		H
 ToggleInverseVideo		I
 LookupMessage			L
 OptionMenu			M
-Postponed2			O
+Postponed			O	^O
 QuitTin				Q
+BugReport                  	R
 DisplayPostHist			W
+MarkThreadUnread		Z
 FirstPage			^
 SearchAuthF			a
-PageUp3				b
+Catchup				c
 Help				h
 ToggleInfoLastLine		i
-Down2				j
-Up2				k
+Down				j	^N
+Up				k	^P
 Print				o
 Quit				q
 Version				v
 Post				w
+MarkArticleUnread		z
 Pipe				|
-PageUp				^B
-PageDown			^D
-PageDown2			^F
+QuickFilterSelect		[
+QuickFilterKill			]
+ScrollUp			<
+ScrollDown			>
+PageUp				b	^B	^U
+PageDown			^D	^F
 RedrawScr			^L
-Down				^N
-Postponed			^O
-Up				^P
-PageUp2				^U
+MenuFilterSelect		^A
+MenuFilterKill			^K
 
 #####
 
-ConfigSelect			^J
-ConfigSelect2			^M
-ConfigLastPage2			G
+ConfigSelect			^J	^M
+ConfigLastPage			G
 ConfigNoSave			Q
-ConfigFirstPage2		g
+ConfigFirstPage			g
 
 #####
 
@@ -69,32 +74,22 @@ FilterSave			s
 
 #####
 
-GroupAutoSel			^A
 GroupNextUnreadArtOrGrp		TAB
-GroupReadBasenote		^J
-GroupKill			^K
-GroupReadBasenote2		^M
+GroupReadBasenote		^J	^M
 GroupSelThd			*
 GroupDoAutoSel			+
 GroupToggleThdSel		.
 GroupSelThdIfUnreadSelected	;
 GroupSelPattern			=
 GroupReverseSel			@
-GroupCatchupNextUnread		C
-GroupEditFilter			E
 GroupToggleGetartLimit		G
 GroupMarkThdRead		K
 GroupNextUnreadArt		N
 GroupPrevUnreadArt		P
-GroupBugReport			R
-GroupAutoSave		S
+GroupAutoSave			S
 GroupTagParts			T
 GroupUntag			U
 GroupMarkUnselArtRead		X
-GroupMarkThdUnread		Z
-GroupQuickAutoSel		[
-GroupQuickKill			]
-GroupCatchup			c
 GroupToggleSubjDisplay		d
 GroupGoto			g
 GroupListThd			l
@@ -106,31 +101,20 @@ GroupSave			s
 GroupTag			t
 GroupToggleThreading		u
 GroupRepost			x
-GroupMarkArtUnread		z
 GroupUndoSel			~
 
 #####
 
-HelpLastPage2			G
-HelpFirstPage2			g
-
-#####
-
-NrctblCreate			c
-NrctblDefault			d
-NrctblAlternative		a
-NrctblQuit			q
+HelpLastPage			G
+HelpFirstPage			g
 
 #####
 
-PageAutoSel			^A
 PageReplyQuoteHeaders		^E
 PagePGPCheckArticle		^G
 PageToggleHeaders		^H
 PageNextUnread			TAB
-PageNextThd			^J
-PageAutoKill			^K
-PageNextThd2			^M
+PageNextThd			^J	^M
 PageToggleTabs			^T
 PageFollowupQuoteHeaders	^W
 PageToggleTex2iso		"
@@ -140,24 +124,18 @@ PageReveal			)
 PageSkipIncludedText		:
 PageTopThd			<
 PageBotThd			>
-PageCatchupNextUnread		C
 PageCancel			D
-PageEditFilter			E
 PageFollowup			F
 PageLastPage			G
 PageKillThd			K
 PageNextUnreadArt		N
 PagePrevUnreadArt		P
 PageReply			R
-PageAutoSave		S
+PageAutoSave			S
 PageGroupSel			T
 PageViewUrl			U
 PageViewAttach			V
-PageMarkThdUnread		Z
-PageQuickAutoSel		[
-PageQuickKill			]
 PageToggleHighlight		_
-PageCatchup			c
 PageEditArticle			e
 PageFollowupQuote		f
 PageFirstPage			g
@@ -170,7 +148,6 @@ PageSave			s
 PageTag				t
 PageGotoParent			u
 PageRepost			x
-PageMarkArtUnread		z
 
 #####
 
@@ -189,10 +166,8 @@ PostContinue			c
 PostAbort			a
 PostIgnore			i
 PostMail			m
-PostPost2			y
-PostPost3			p
-PostSend			s
-PostSend2			y
+PostPost			p	y
+PostSend			s	y
 PostSupersede			s
 PostPostpone			o
 
@@ -203,8 +178,8 @@ PostponeAll			A
 
 #####
 
-PromptYes			y
-PromptNo			n
+PromptYes			y	Y
+PromptNo			n	N
 
 #####
 
@@ -213,53 +188,42 @@ SaveOverwriteFile		o
 
 #####
 
+PProcNo				n
 PProcShar			s
-PProcUUDecode			u
-PProcNone			n
+PProcYes			y
 
 #####
 
-SelectEnterNextUnreadGrp	TAB
-SelectReadGrp			^J
-SelectReadGrp2			^M
+SelectEnterNextUnreadGrp	TAB	n
+SelectReadGrp			^J	^M
 SelectResetNewsrc		^R
-SelectCatchupNextUnread		C
+SelectSortActive		.
 SelectNextUnreadGrp		N
-SelectBugReport			R
 SelectSubscribePat		S
 SelectUnsubscribePat		U
 SelectQuitNoWrite		X
 SelectSyncWithActive		Y
-SelectMarkGrpUnread2		Z
-SelectCatchup			c
 SelectToggleDescriptions	d
 SelectGoto			g
 SelectMoveGrp			m
-SelectEnterNextUnreadGrp2	n
 SelectToggleReadDisplay		r
 SelectSubscribe			s
 SelectUnsubscribe		u
 SelectYankActive		y
-SelectMarkGrpUnread		z
+SelectMarkGrpUnread		z	Z
 
 #####
 
 ThreadReadNextArtOrThread	TAB
-ThreadReadArt			^J
-ThreadReadArt2			^M
+ThreadReadArt			^J	^M
 ThreadSelArt			*
 ThreadToggleArtSel		.
 ThreadReverseSel		@
-ThreadCatchupNextUnread		C
 ThreadMarkArtRead		K
-ThreadBugReport			R
-ThreadAutoSave		S
+ThreadAutoSave			S
 ThreadUntag			U
-ThreadMarkThdUnread		Z
-ThreadCatchup			c
 ThreadToggleSubjDisplay		d
 ThreadMail			m
 ThreadSave			s
 ThreadTag			t
-ThreadMarkArtUnread		z
 ThreadUndoSel			~
diff -Nurp tin-1.6.2/doc/rcvars.txt tin-1.8.0/doc/rcvars.txt
--- tin-1.6.2/doc/rcvars.txt	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/doc/rcvars.txt	2005-06-28 10:31:20.000000000 +0200
@@ -9,7 +9,7 @@ Adding new tinrc variables:
 . Add NAME with the correct type to the master declaration in tinrc.h
 . Add an initial value for NAME in the correct position in t_config tinrc={};
   in init.c
-. In config.c, add the following:
+. In config.c/options_menu.c, add the following:
 
 	In read_config_file(), a match_*() function to read NAME into the
 	internal tinrc table, which may not necessarily be the same type.
diff -Nurp tin-1.6.2/doc/tin.1 tin-1.8.0/doc/tin.1
--- tin-1.6.2/doc/tin.1	2003-09-01 00:42:09.000000000 +0200
+++ tin-1.8.0/doc/tin.1	2005-12-02 11:58:19.628341867 +0100
@@ -3,13 +3,23 @@
 .\" Module    : tin.1
 .\" Author    : I. Lea, U. Janssen
 .\" Created   : 1991-08-23
-.\" Updated   : 2003-09-01
-.\" Notes     : use american english; still needs some work, i.e.:
+.\" Updated   : 2005-09-14
+.\" Notes     : use american english; still needs some work, e.g.:
 .\"             - document authorization (.newsauth)
 .\"             - document random organization feature
 .\"
+.\" Macros
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
 .\"
-.TH tin 1 "September 1st, 2003" "1.6.2" "A Usenet newsreader"
+.TH tin 1 "December 2nd, 2005" "1.8.0" "A Usenet newsreader"
 .\"
 .\"
 .SH NAME
@@ -20,13 +30,13 @@ tin, rtin \- A Usenet newsreader
 .B tin
 .RB [\|[\| \-h \||\| \-H \||\| \-V \|]\ \||
 .RB [\|[\|[\| \-a \|]
-.RB [\| \-dlnq \||\| -Q \|]
+.RB [\| \-dlnq \||\| \-Q \|]
 .RB [\| \-ArzxX \|]\|]
-.RB [\|[\| \-R \||\| -S \|]
+.RB [\|[\| \-R \||\| \-S \|]
 .RB \|\| \-s
 .IR News-dir \|]
 .RB [\| \-cuvZ \|]
-.RB [\| \-N \||\| -M
+.RB [\| \-N \||\| \-M
 .IR address \|]
 .RB [\| \-o \||\| \-w \|]\|]
 .RB [\| \-D
@@ -48,7 +58,7 @@ tin, rtin \- A Usenet newsreader
 .SH DESCRIPTION
 .B tin
 is a full-screen easy to use Usenet newsreader. It can read news locally
-(i.e., \fI/var/spool/news\fR) or remotely (\fBrtin\fP or \fBtin -r\fP
+(e.g., \fI/var/spool/news\fR) or remotely (\fBrtin\fP or \fBtin \-r\fP
 option) via a NNTP (Network News Transport Protocol) server. It will
 automatically utilize NOV
 .BR newsoverview (5)
@@ -62,11 +72,11 @@ command to view a list of the commands a
 level.
 .PP
 On startup \fBtin\fP will show a list of the newsgroups found in
-\fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR. An arrow '->' or highlighted
+\fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR. An arrow '\->' or highlighted
 bar will point to the first newsgroup. Move to a group by using the
-terminal arrow keys (terminal dependent) or \fBDown2\fP ('\fBj\fP')
-and \fBUp2\fP ('\fBk\fP'). Use PgUp/PgDn (terminal dependent) or
-\fBPageUp2\fP ('\fB^U\fP') (CTRL-U) and \fBPageDown\fP ('\fB^D\fP')
+terminal arrow keys (terminal dependent) or \fBDown\fP ('\fBj\fP')
+and \fBUp\fP ('\fBk\fP'). Use PgUp/PgDn (terminal dependent) or
+\fBPageUp\fP ('\fB^U\fP') (CTRL-U) and \fBPageDown\fP ('\fB^D\fP')
 (CTRL-D) to page up/down. Enter a newsgroup by pressing '\fB<CR>\fP'.
 .PP
 The \fBGroupNextUnreadArtOrGrp\fP ('\fB<TAB>\fP') key enters the next
@@ -84,7 +94,7 @@ Successful program execution.
 Usage, syntax, configuration file or network error.
 .RE
 .PP
-Batch mode (''\fB-Z\fP''):
+Batch mode (''\fB\-Z\fP''):
 .RS +.5i
 .TP
 .B 0
@@ -100,145 +110,145 @@ Unread news
 .\"
 .SH OPTIONS
 .TP 12
-.B -a
+.B \-a
 Toggle ANSI color (default is off).
 .TP
-.B -A
+.B \-A
 Force authentication on initial connect.
 .TP
-.B -c
+.B \-c
 Create/update index files for every group in
-\fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR or file specified by the ''\fB-f\fP''
+\fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR or file specified by the ''\fB\-f\fP''
 option and mark all articles as read.
 .TP
-.B -d
+.B \-d
 Don't load newsgroup descriptions (interactive mode).
 .TP
-.BI -D " debug-level"
+.BI \-D " debug-level"
 Enter debug-level (1 = NNTP, 2 = all, 3 = newsrc, 4 = memory allocation).
 .TP
-.BI -f " file"
+.BI \-f " file"
 Use the specified file of subscribed to newsgroups in place of
-\fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR.
+\fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR.
 .TP
-.BI -g " server"
+.BI \-g " server"
 Use the server and newsrc specified in
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/newsrctable\fR.
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/newsrctable\fR.
 .TP
-.BI -G " article-limit"
+.BI \-G " article-limit"
 Limit the number of articles/group to retrieve from the server.
 .TP
-.B -h
+.B \-h
 Help listing all command-line options.
 .TP
-.B -H
+.B \-H
 Brief introduction to \fBtin\fP that is also shown the first time it is
 started.
 .TP
-.BI -I " dir"
+.BI \-I " dir"
 Directory in which to store newsgroup index files. Default is
-\fI${TIN_INDEX_NEWSDIR-"${TIN_HOMEDIR-"$HOME"}/.tin"}/.news\fR.
+\fI${TIN_INDEX_NEWSDIR\-"${TIN_HOMEDIR\-"$HOME"}/.tin"}/.news\fR.
 This option has no effect if \fBtin\fP retrieves its index files via
 NNTP and \fBcache_overview_files\fP is turned off.
 .TP
-.BI -l
+.BI \-l
 Get number of articles per group from the
-\fI${TIN_LIBDIR-NEWSLIBDIR}"/"${TIN_ACTIVEFILE-active}\fR file. If
+\fI${TIN_LIBDIR\-NEWSLIBDIR}"/"${TIN_ACTIVEFILE\-active}\fR file. If
 reading via NNTP this is done with the LIST command (\fBRFC977\fP). This
 might result in incorrect article counts but is usually faster than the
 default which is to read the
-\fI${TIN_LIBDIR-NEWSLIBDIR}"/"${TIN_ACTIVEFILE-active}\fR file
+\fI${TIN_LIBDIR\-NEWSLIBDIR}"/"${TIN_ACTIVEFILE\-active}\fR file
 (either directly or via LIST) and then check the article count via
-NNTP GROUP command (\fBRFC977\fP) ''\fB-ln\fP''.
+NNTP GROUP command (\fBRFC977\fP) ''\fB\-ln\fP''.
 .TP
-.BI -m " dir"
-Mailbox directory to use. Default is \fI${TIN_HOMEDIR-"$HOME"}/Mail\fR.
+.BI \-m " dir"
+Mailbox directory to use. Default is \fI${TIN_HOMEDIR\-"$HOME"}/Mail\fR.
 .TP
-.BI -M " user"
+.BI \-M " user"
 Mail unread articles to specified user for later reading. For more
 information read section "AUTOMATIC MAILING AND SAVING NEW NEWS".
 .TP
-.B -n
+.B \-n
 Only load groups from the
-\fI${TIN_LIBDIR-NEWSLIBDIR}"/"${TIN_ACTIVEFILE-active}\fR file that are
-subscribed to in the user's \fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR. This
+\fI${TIN_LIBDIR\-NEWSLIBDIR}"/"${TIN_ACTIVEFILE\-active}\fR file that are
+subscribed to in the user's \fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR. This
 allows a noticeable speedup when connecting via a slow line, but \fBtin\fP
-can not tell which groups are moderated. See also ''\fB-l\fP''.
+can not tell which groups are moderated. See also ''\fB\-l\fP''.
 .TP
-.B -N
+.B \-N
 Mail unread articles to yourself for later reading. For more information
 read section "AUTOMATIC MAILING AND SAVING NEW NEWS".
 .TP
-.B -o
+.B \-o
 Quick post all postponed articles and exit. In order for this to be really
-quick, it should be used with ''\fB-n\fP'' if possible.
+quick, it should be used with ''\fB\-n\fP'' if possible.
 .TP
-.BI -p " port"
+.BI \-p " port"
 Port to use if reading via NNTP (default is 119). This also overrides
 the environment variable $\fBNNTPPORT\fP if set.
 .TP
-.B -q
+.B \-q
 Don't check for new newsgroups.
 .TP
-.B -Q
+.B \-Q
 Quick start. Start \fBtin\fP as quickly as possible. Currently this is
-equivalent to ''\fB-nqd\fP''.
+equivalent to ''\fB\-nqd\fP''.
 .TP
-.B -r
+.B \-r
 Read news remotely from the default NNTP server specified in the environment
 variable $\fBNNTPSERVER\fP or contained in the file
 \fI/etc/nntpserver\fR.
 .TP
-.B -R
-Read news saved by the ''\fB-S\fP'' option.
+.B \-R
+Read news saved by the ''\fB\-S\fP'' option.
 .TP
-.BI -s " dir"
+.BI \-s " dir"
 Save/read articles to/in directory. Default is
-\fI${TIN_HOMEDIR-"$HOME"}/News\fR.
+\fI${TIN_HOMEDIR\-"$HOME"}/News\fR.
 .TP
-.B -S
-Save unread articles for later reading by the ''\fB-R\fP'' option. For more
+.B \-S
+Save unread articles for later reading by the ''\fB\-R\fP'' option. For more
 information read section "AUTOMATIC MAILING AND SAVING NEW NEWS".
 .TP
-.B -u
+.B \-u
 Create/update index files for every group in
-\fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR or file specified by the ''\fB-f\fP''
+\fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR or file specified by the ''\fB\-f\fP''
 option. This option is disabled if \fBtin\fP retrieves its index files via a
 NNTP server and \fBcache_overview_files\fP is turned off.
 .TP
-.B -v
-Verbose mode for ''\fB-c\fP'', ''\fB-M\fP'', ''\fB-N\fP'', ''\fB-S\fP'',
-\&''\fB-u\fP'' and ''\fB-Z\fP'' options.
+.B \-v
+Verbose mode for ''\fB\-c\fP'', ''\fB\-M\fP'', ''\fB\-N\fP'', ''\fB\-S\fP'',
+\&''\fB\-u\fP'' and ''\fB\-Z\fP'' options.
 .TP
-.B -V
+.B \-V
 Print version and date information.
 .TP
-.B -w
+.B \-w
 Quick mode to post an article and then exit. In order for this to be really
-quick, it should be used with ''\fB-n\fP'' if possible.
+quick, it should be used with ''\fB\-n\fP'' if possible.
 .TP
-.B -x
+.B \-x
 No posting mode. You cannot post articles if you use this option.
 .TP
-.B -X
-No overwrite mode. \fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR and files in
-\fI${TIN_HOMEDIR-"$HOME"}/.tin\fR
+.B \-X
+No overwrite mode. \fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR and files in
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin\fR
 will not be overwritten but may be created if they don't exist.
 .TP
-.B -z
+.B \-z
 Only start \fBtin\fP if there is any new/unread news. If there is news
 \fBtin\fP will position cursor at first group with unread news. Useful for
 putting in login file.
 .TP
-.B -Z
+.B \-Z
 Check if there is any new/unread news and exit with appropriate status. If
-\&''\fB-v\fP'' option is specified the number of unread articles in each
+\&''\fB\-v\fP'' option is specified the number of unread articles in each
 group is printed. An exit code 0 indicates no news, 1 that an error occurred
 and 2 that new/unread news exists. Useful for writing scripts.
 .PP
 \fBtin\fP can also dynamically change its options by the \fBOptionMenu\fP
 ('\fBM\fP') command. Any changes are written to
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/tinrc\fR. For more information see section
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/tinrc\fR. For more information see section
 "GLOBAL OPTIONS MENU AND TINRC CONFIGURABLE VARIABLES" and
 .BR tin (5).
 .PP
@@ -256,13 +266,13 @@ Once you use \fBSelectYankActive\fP ('\f
 or \fBSelectToggleReadDisplay\fP ('\fBr\fP') to toggle the read/unread
 status, then the command-line groups will be gone. You can use
 \fBSelectSyncWithActive\fP ('\fBY\fP') to reread the
-\fI${TIN_LIBDIR-NEWSLIBDIR}"/"${TIN_ACTIVEFILE-active}\fR file and get
+\fI${TIN_LIBDIR\-NEWSLIBDIR}"/"${TIN_ACTIVEFILE\-active}\fR file and get
 them back.
 .PP
-NB: With the ''\fB-n\fP'' flag, only unsubscribed groups in the
-\fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR file (or the newsrc-file given by the
-\&''\fB-f\fP'' command-line switch or via
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/newsrctable\fR) can be matched.
+NB: With the ''\fB\-n\fP'' flag, only unsubscribed groups in the
+\fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR file (or the newsrc-file given by the
+\&''\fB\-f\fP'' command-line switch or via
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/newsrctable\fR) can be matched.
 .\"
 .\"
 .SH USAGE
@@ -276,7 +286,7 @@ news system and news users.
 A user starting \fBtin\fP for the first time can be automatically subscribed
 to a list of newsgroups that are deemed appropriate by the news
 administrator. The subscriptions file should be created in your news lib
-directory (i.e., \fI${TIN_LIBDIR-NEWSLIBDIR}/subscriptions\fR) and should
+directory (i.e., \fI${TIN_LIBDIR\-NEWSLIBDIR}/subscriptions\fR) and should
 have file permissions set to 0644. If you read news via NNTP, then your news
 server must support the LIST SUBSCRIPTIONS command. It is part of the Common
 NNTP Extensions (\fBRFC2980\fP) and all modern servers should understand it.
@@ -293,7 +303,7 @@ unread articles displayed on the same li
 .PP
 .\" FIXME - make this autoscale
 .nf
-->M    1     2  comp.security.announce  Announcements from the CERT abou
+\->M    1     2  comp.security.announce  Announcements from the CERT abou
   M    2     1  news.admin.announce     Announcements for news adminstra
        3    22  news.software.misc      News-related software other than
        4  1475  news.software.nntp      The Network News Transfer Protoc
@@ -348,7 +358,7 @@ recent articles and the number of killed
 The characters after the numbers are depending to the configuration and if
 your are in \fBshow_only_unread_arts\fP mode or not. Some numbers could be
 missing if the specific option is not enabled. It might also contain an 'M',
-\&'X' or '=' (see above; doesn't work with the ''\fB-n\fP'' command-line
+\&'X' or '=' (see above; doesn't work with the ''\fB\-n\fP'' command-line
 switch!) if the group is moderated, set to no posting or postings to it get
 redirected.
 .PP
@@ -367,7 +377,7 @@ might also be shown right before the sub
 .nf
                 de.admin.net-abuse.announce (11B 13+ 1* 1o 0K) M
 
-->   1   +   3  108 bincancels in de.talk.sex        Christopher Lueg <l
+\->   1   +   3  108 bincancels in de.talk.sex        Christopher Lueg <l
      2   +       69 EMP/ECP gecancelt. xynx. BI= 10  Henning Weede <hwee
      3   o       93 EMP gecancelt. SouthBeach/Palms  Henning Weede <hwee
      4   *      368 <1997-11-12> Fremdcancel-FAQ     Thomas Roessler <ro
@@ -379,10 +389,10 @@ used) looks like this:
 .PP
 .\" FIXME - make this autoscale
 .nf
-->   1      [   7]  What is this funny tree in the thr  Robert F. Simmig
-     2      [  12]  +->                                 Sephan Wagner <s
-     3      [ 230]  | `->Tin thread-level (was: What is Bob Johnson <bob
-     4      [  22]  `->tin threading menu               Brian Richardson
+\->   1      [   7]  What is this funny tree in the thr  Robert F. Simmig
+     2      [  12]  +\->                                 Sephan Wagner <s
+     3      [ 230]  | `\->Tin thread-level (was: What is Bob Johnson <bob
+     4      [  22]  `\->tin threading menu               Brian Richardson
 
 .fi
 .PP
@@ -408,12 +418,11 @@ within \fBtin\fP.
 	ANSI/vt100	Other Terminals
 Beg. of list/article	\fBHome\fP	\fBFirstPage\fP (\fB^\fP)
 End of list/article	\fBEnd\fP	\fBLastPage\fP (\fB$\fP)
-Page Up	\fBPgUp\fP	\fBPageUp2\fP (\fB^U\fP), \fBPageUp\fP (\fB^B\fP)
-		or \fBPageUp3\fP (\fBb\fP)
-Page Down	\fBPgDn\fP	\fBPageDown\fP (\fB^D\fP), \fBPageDown2\fP (\fB^F\fP)
+Page Up	\fBPgUp\fP	\fBPageUp\fP (\fBu\fP, \fB^U\fP or \fB^B\fP)
+Page Down	\fBPgDn\fP	\fBPageDown\fP (\fB^D\fP or \fB^F\fP)
 		or \fBPageDown3\fP (\fB<SPACE>\fP)
-Line Up	\fBUp arrow\fP	\fBUp2\fP (\fBk\fP) or \fBUp\fP (\fB^P\fP)
-Line Down	\fBDown arrow\fP	\fBDown2\fP (\fBj\fP) or \fBDown\fP (\fB^N\fP)
+Line Up	\fBUp arrow\fP	\fBUp\fP (\fBk\fP or \fB^P\fP)
+Line Down	\fBDown arrow\fP	\fBDown\fP (\fBj\fP or \fB^N\fP)
 .fi
 .RE
 .\"
@@ -471,7 +480,13 @@ Toggle use of ANSI color.
 .B RedrawScr '^L'
 Redraw the current screen.
 .TP
-.B Postponed '^O'
+.B ScrollUp '<'
+Scroll screen up by one line.
+.TP
+.B ScrollDown '>'
+Scroll screen down by one line.
+.TP
+.B Postponed 'O' '^O'
 Reload postponed article. If your system blocks the \fBPostponed\fP key you
 must quote it by pressing '\fB^V\fP' (CTRL-V) first. The postpone-menu
 offers the following actions: \fBPromptYes\fP ('\fBy\fP') = reload and spawn
@@ -482,7 +497,7 @@ editor); \fBPostponeAll\fP ('\fBA\fP') =
 way to delete a postponed article from the postponed-file, you have to use
 the following command sequence instead: reload it with \fBPostponed\fP,
 enter editor with \fBPromptYes\fP, quit editor, discard posting with
-\fBQuit\fP ('\fB^O\fP''\fBy\fP''\fBq\fP'). See also ''\fB-o\fP''
+\fBQuit\fP ('\fB^O\fP''\fBy\fP''\fBq\fP'). See also ''\fB\-o\fP''
 command-line switch.
 .TP
 .B Help 'h'
@@ -494,9 +509,6 @@ Help screen of commands available on the
 .B ToggleHelpDisplay 'H'
 Toggle the display of help mini menu at the bottom of the screen.
 .TP
-.B Postponed2 'O'
-Reload postponed article. See also ''\fB-o\fP'' command-line switch.
-.TP
 .B DisplayPostHist 'W'
 List articles posted by user. The date posted, the newsgroup and the
 subject are listed. You can use \fBSearchSubjF\fP ('\fB/\fP'),
@@ -513,7 +525,7 @@ Print \fBtin\fP version information.
 Select group 4.
 .TP
 .B SelectResetNewsrc '^R'
-Reset \fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR file. This will destroy all
+Reset \fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR file. This will destroy all
 records of which articles have been read, so use this carefully.
 .TP
 .B SetRange '#'
@@ -532,18 +544,18 @@ Search for a group by name and descripti
 .B SearchSubjB '?'
 Backward search through the group names and descriptions.
 .TP
-.B SelectReadGrp '^J', SelectReadGrp2 '<CR>'
+.B SelectReadGrp '^J' '<CR>'
 Read current group.
 .TP
-.B SelectEnterNextUnreadGrp '<TAB>', SelectEnterNextUnreadGrp2 'n'
+.B SelectEnterNextUnreadGrp '<TAB>' 'n'
 Enter next group with unread news. Will wrap around to the beginning of the
 group selection list looking for unread groups.
 .TP
-.B SelectCatchup 'c'
+.B Catchup 'c'
 Make current group as all read [after confirmation] and move to the next
 group in the group selection list.
 .TP
-.B SelectCatchupNextUnread 'C'
+.B CatchupNextUnread 'C'
 Mark current group as all read [after confirmation] and enter the next
 unread group in the group selection list.
 .TP
@@ -551,6 +563,9 @@ unread group in the group selection list
 Toggle display to show just the group name or the group name and the group
 descriptions.
 .TP
+.B EditFilter 'E'
+Edit the filter file and reload it afterwards.
+.TP
 .B SelectGoto 'g'
 Choose a new group by name. This command can be used to access any group,
 even those not currently yanked in.
@@ -558,7 +573,7 @@ even those not currently yanked in.
 .B ToggleInfoLastLine 'i'
 Toggle the display of the description of the current newsgroup in the last
 line. This will not be available if \fBtin\fP was started with the
-\&''\fB-d\fP'' option.
+\&''\fB\-d\fP'' option.
 .TP
 .B ToggleInverseVideo 'I'
 Toggle inverse video.
@@ -588,8 +603,8 @@ Toggle display of all subscribed to grou
 unread articles. Command has no effect if groups were specified on the
 command-line when \fBtin\fP was started.
 .TP
-.B SelectBugReport 'R'
-Mail a bug report or comment to <tin-bugs@tin.org>. This is the best way of
+.B BugReport 'R'
+Mail a bug report or comment to <tin\-bugs@tin.org>. This is the best way of
 getting bugs fixed and features added/changed.
 .TP
 .B SelectSubscribe 's'
@@ -613,7 +628,7 @@ Unsubscribe to groups matching user spec
 .B Post 'w'
 Post an article to current group. If posting fails for some reason, you'll
 get the chance to \fBPostEdit\fP ('\fBe\fP') the article again,
-\fBPostPostpone\fP ('\fBo\fP') it for later processing (see also ''\fB-o\fP''
+\fBPostPostpone\fP ('\fBo\fP') it for later processing (see also ''\fB\-o\fP''
 command-line switch) or discard it via \fBQuit\fP ('\fBq\fP').
 .TP
 .B SelectQuitNoWrite 'X'
@@ -621,14 +636,14 @@ Quit \fBtin\fP without saving any change
 .TP
 .B SelectYankActive 'y'
 Yanks in all groups. Toggles the displayed groups between all the groups in
-the \fI${TIN_LIBDIR-NEWSLIBDIR}"/"${TIN_ACTIVEFILE-active}\fR file and just
-those that are subscribed to in \fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR.
+the \fI${TIN_LIBDIR\-NEWSLIBDIR}"/"${TIN_ACTIVEFILE\-active}\fR file and just
+those that are subscribed to in \fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR.
 .TP
 .B SelectSyncWithActive 'Y'
-Reread the \fI${TIN_LIBDIR-NEWSLIBDIR}"/"${TIN_ACTIVEFILE-active}\fR file
+Reread the \fI${TIN_LIBDIR\-NEWSLIBDIR}"/"${TIN_ACTIVEFILE\-active}\fR file
 to see if any new news has arrived since starting \fBtin\fP.
 .TP
-.B SelectMarkGrpUnread 'z', SelectMarkGrpUnread2 'Z'
+.B SelectMarkGrpUnread 'z' 'Z'
 Mark all articles in the current group as unread.
 .\"--------------------------------------------------------------------
 .\"
@@ -637,11 +652,11 @@ Mark all articles in the current group a
 .B 4
 Select article 4.
 .TP
-.B GroupAutoSel '^A'
+.B MenuFilterSelect '^A'
 Auto select article(s) using a menu. Read the section "FILTERING ARTICLES"
 for more information.
 .TP
-.B GroupKill '^K'
+.B MenuFilterKill '^K'
 Kill article(s) using a menu. Read the section "FILTERING ARTICLES" for
 more information.
 .TP
@@ -649,7 +664,7 @@ more information.
 Choose a range of articles to be affected by the next command. See the
 section "RANGES" for more information.
 .TP
-.B LastViewed '-'
+.B LastViewed '\-'
 Re-enter the last message that was viewed.
 .TP
 .B SearchRepeat '\\\\'
@@ -698,7 +713,7 @@ Pipe current article / thread / auto-sel
 matching pattern / tagged articles into command. See the section "MAILING
 PIPING PRINTING REPOSTING AND SAVING ARTICLES" for more information.
 .TP
-.B GroupQuickAutoSel '['
+.B QuickFilterSelect '['
 Auto select article(s) with a single key [after confirmation]. The defaults
 used for selection are based upon the following four tinrc config variables:
 \fBdefault_filter_select_case\fP, \fBdefault_filter_select_expire\fP,
@@ -707,7 +722,7 @@ Read the section "GLOBAL OPTIONS MENU AN
 a full explanation of these variables and "FILTERING ARTICLES" for more
 information on filtering.
 .TP
-.B GroupQuickKill ']'
+.B QuickFilterKill ']'
 Kill article(s) with a single key [after confirmation]. The defaults used
 for killing are based upon the following four tinrc config variables:
 \fBdefault_filter_kill_case\fP, \fBdefault_filter_kill_expire\fP,
@@ -716,7 +731,7 @@ Read the section "GLOBAL OPTIONS MENU AN
 a full explanation of these variables and "FILTERING ARTICLES" for more
 information on filtering.
 .TP
-.B GroupReadBasenote '^J', GroupReadBasenote2 '<CR>'
+.B GroupReadBasenote '^J' '<CR>'
 Read current article.
 .TP
 .B GroupNextUnreadArtOrGrp '<TAB>'
@@ -733,11 +748,11 @@ Author backward search. Otherwise, see \
 Search the body of all articles in group (can be slow). You can abort the
 search using \fBQuit\fP ('\fBq\fP').
 .TP
-.B GroupCatchup 'c'
+.B Catchup 'c'
 Mark all articles as read [after confirmation] then return to the group
 selection list. Move cursor to next group.
 .TP
-.B GroupCatchupNextUnread 'C'
+.B CatchupNextUnread 'C'
 Mark all articles as read [after confirmation] and enter the next group
 with unread news.
 .TP
@@ -745,7 +760,7 @@ with unread news.
 Cycle the display of the author through all the possible options
 for the tinrc variable \fBshow_author\fP.
 .TP
-.B GroupEditFilter 'E'
+.B EditFilter 'E'
 Edit the filter file and reload it afterwards.
 .TP
 .B GroupGoto 'g'
@@ -769,7 +784,7 @@ Mark article/thread as read and move ont
 Open the thread under the current cursor position.
 .TP
 .B LookupMessage 'L'
-Look up article by ''Message-ID:''.
+Look up article by ''Message\-ID:''.
 .TP
 .B GroupMail 'm'
 Mail current article / thread / auto-selected (hot) articles / articles
@@ -806,8 +821,8 @@ Quit \fBtin\fP - don't ask the user to c
 .B GroupToggleReadUnread 'r'
 Toggle the display between all articles and unread articles.
 .TP
-.B GroupBugReport 'R'
-Mail a bug report or comment to <tin-bugs@tin.org>. This is the best way of
+.B BugReport 'R'
+Mail a bug report or comment to <tin\-bugs@tin.org>. This is the best way of
 getting bugs fixed and features added/changed.
 .TP
 .B GroupSave 's'
@@ -838,7 +853,7 @@ Untag all articles that were tagged.
 Post an article to current group. If posting fails for some reason, you'll
 get the chance to edit the article again via \fBPostEdit\fP ('\fBe\fP'),
 postpone it via \fBPostPostpone\fP ('\fBo\fP') for later processing (see
-also ''\fB-o\fP'' command-line switch) or discard it via \fBQuit\fP ('\fBq\fP').
+also ''\fB\-o\fP'' command-line switch) or discard it via \fBQuit\fP ('\fBq\fP').
 .TP
 .B GroupRepost 'x'
 Repost an already posted article / thread / auto-selected (hot) articles /
@@ -854,10 +869,10 @@ the way it was before. See \fBGroupUndoS
 clearing the toggle effect, leaving the group will also clear the toggle
 effect and make the changes permanent.
 .TP
-.B GroupMarkArtUnread 'z'
+.B MarkArtUnread 'z'
 Mark current article as unread.
 .TP
-.B GroupMarkThdUnread 'Z'
+.B MarkThdUnread 'Z'
 Mark current thread as unread.
 .\"--------------------------------------------------------------------
 .\"
@@ -867,11 +882,19 @@ Mark current thread as unread.
 .B 4
 Select article 4 within thread.
 .TP
+.B MenuFilterSelect '^A'
+Auto select article(s) using a menu. Read the section "FILTERING
+ARTICLES" for more information.
+.TP
+.B MenuFilterKill '^K'
+Kill article(s) using a menu. Read the section "FILTERING ARTICLES"
+for more information.
+.TP
 .B SetRange '#'
 Choose a range of articles to be affected by the next command. See the
 section "RANGES" for more information.
 .TP
-.B LastViewed '-'
+.B LastViewed '\-'
 Re-enter the last message that was viewed.
 .TP
 .B SearchRepeat '\\\\'
@@ -900,7 +923,7 @@ Pipe current article / thread / auto-sel
 matching pattern / tagged articles into command. See the section "MAILING
 PIPING PRINTING REPOSTING AND SAVING ARTICLES" for more information.
 .TP
-.B ThreadReadArt '^J', ThreadReadArt2 '<CR>'
+.B ThreadReadArt '^J' '<CR>'
 Read current article within thread.
 .TP
 .B ThreadReadNextArtOrThread '<TAB>'
@@ -918,11 +941,11 @@ Author backward search. Otherwise, see \
 Search the body of all articles in group (can be slow). You can abort the
 search using \fBQuit\fP ('\fBq\fP').
 .TP
-.B ThreadCatchup 'c'
+.B Catchup 'c'
 Mark thread as read [after confirmation] and return to the group index page.
 Move cursor to next thread.
 .TP
-.B ThreadCatchupNextUnread 'C'
+.B CatchupNextUnread 'C'
 Mark thread as read [after confirmation] and enter the next thread
 containing unread news.
 .TP
@@ -930,6 +953,9 @@ containing unread news.
 Cycle the display of the author through all the possible options for the
 tinrc variable \fBshow_author\fP.
 .TP
+.B EditFilter 'E'
+Edit the filter file and reload it afterwards.
+.TP
 .B ToggleInfoLastLine 'i'
 Display the subject of the current article in the last line.
 .TP
@@ -940,21 +966,26 @@ Toggle inverse video.
 Mark article as read and move onto the next unread article.
 .TP
 .B LookupMessage 'L'
-Look up article by ''Message-ID:''.
+Look up article by ''Message\-ID:''.
 .TP
 .B ThreadMail 'm'
 Mail current article / thread / auto-selected (hot) articles / articles
 matching pattern / tagged articles to someone. See the section "MAILING
 PIPING PRINTING REPOSTING AND SAVING ARTICLES" for more information.
 .TP
+.B Print 'o'
+Send current article / thread / auto-selected (hot) articles / articles
+matching pattern / tagged articles to printer. See the section "MAILING
+PIPING PRINTING REPOSTING AND SAVING ARTICLES" for more information.
+.TP
 .B Quit 'q'
 Return to previous level.
 .TP
 .B QuitTin 'Q'
 Quit \fBtin\fP - don't ask the user to confirm.
 .TP
-.B ThreadBugReport 'R'
-Mail a bug report or comment to <tin-bugs@tin.org>. This is the best way
+.B BugReport 'R'
+Mail a bug report or comment to <tin\-bugs@tin.org>. This is the best way
 of getting bugs fixed and features added/changed.
 .TP
 .B ThreadSave 's'
@@ -976,13 +1007,13 @@ Untag all tagged threads.
 Post an article to current group. If posting fails for some reason, you'll
 get the chance to edit the article again via \fBPostEdit\fP
 ('\fBe\fP'), postpone it for later processing via \fBPostPostpone\fP
-('\fBo\fP') (see also ''\fB-o\fP'' command-line switch) or discard it via
+('\fBo\fP') (see also ''\fB\-o\fP'' command-line switch) or discard it via
 \fBQuit\fP ('\fBq\fP').
 .TP
-.B ThreadMarkArtUnread 'z'
+.B MarkArtUnread 'z'
 Mark current article in thread as unread.
 .TP
-.B ThreadMarkThdUnread 'Z'
+.B MarkThdUnread 'Z'
 Mark all articles in thread as unread.
 .\"--------------------------------------------------------------------
 .\"
@@ -995,7 +1026,7 @@ Read the first (base) article in this th
 .B 4
 Read response 4 in this thread.
 .TP
-.B PageAutoSel '^A'
+.B MenuFilterSelect '^A'
 Auto select article(s) using a menu. Read the section "FILTERING ARTICLES"
 for more information.
 .TP
@@ -1011,7 +1042,7 @@ operations on article.
 .B PageToggleHeaders '^H'
 Toggles the display mode (raw including all headers vs. cooked)
 .TP
-.B PageAutoKill '^K'
+.B MenuFilterKill '^K'
 Kill article(s) using a menu. Read the section "FILTERING ARTICLES" for more
 information.
 .TP
@@ -1040,7 +1071,7 @@ after a formfeed is not displayed. This 
 and turns the hidden text back on. Scrolling down will also reveal the text,
 scrolling up will hide it again.
 .TP
-.B LastViewed '-'
+.B LastViewed '\-'
 Re-enter the last message that was viewed.
 .TP
 .B SearchRepeat '\\\\'
@@ -1053,7 +1084,9 @@ Forward search the text of this article.
 Backward search the text of this article.
 .TP
 .B PageSkipIncludedText ':'
-Skip to the end of the quoted text in this article.
+Skip to the end of the quoted text-block in this article. Quoted text
+is everything which matches \fBquote_regex\fP, \fBquote_regex2\fP or
+\fBquote_regex3\fP.
 .TP
 .B PageTopThd '<'
 Goto the first article in the current thread.
@@ -1069,7 +1102,7 @@ Pipe current article / thread / auto-sel
 matching pattern / tagged articles into command. See the section "MAILING
 PIPING PRINTING REPOSTING AND SAVING ARTICLES" for more information.
 .TP
-.B PageQuickAutoSel '['
+.B QuickFilterSelect '['
 Auto select article(s) with a single key. The defaults used for selection
 are set based upon the following four tinrc config variables:
 \fBdefault_filter_select_case\fP, \fBdefault_filter_select_expire\fP,
@@ -1078,7 +1111,7 @@ Read the section "GLOBAL OPTIONS MENU AN
 a full explanation of these variables and "FILTERING ARTICLES" for more
 information on filtering.
 .TP
-.B PageQuickKill ']'
+.B QuickFilterKill ']'
 Kill article(s) with a single key. The defaults used for killing are based
 upon the following four tinrc config variables:
 \fBdefault_filter_kill_case\fP, \fBdefault_filter_kill_expire\fP,
@@ -1087,7 +1120,7 @@ Read the section "GLOBAL OPTIONS MENU AN
 a full explanation of these variables and "FILTERING ARTICLES" for more
 information on filtering.
 .TP
-.B PageNextThd '^J', PageNextThd2 '<CR>'
+.B PageNextThd '^J' '<CR>'
 Goto next base article.
 .TP
 .B PageNextUnread '<TAB>'
@@ -1104,22 +1137,23 @@ Author backward search.
 Search the body of all articles in group (can be slow). You can abort the
 search using \fBQuit\fP ('\fBq\fP').
 .TP
-.B PageCatchup 'c'
+.B Catchup 'c'
 Mark the current thread as read [after confirmation] and return to the
 previous menu. Move cursor to next item.
 .TP
-.B PageCatchupNextUnread 'C'
+.B CatchupNextUnread 'C'
 Mark the rest of the current thread as read [after confirmation] and enter
 the next thread with unread articles.
 .TP
 .B PageCancel 'D'
-Cancel the current article. It must have been posted by the same user. The
-cancel message can be seen in the newsgroup 'control' or 'control.cancel'.
+Cancel (delete) or supersede (overwrite) the current article. It must
+have been posted by the same user. The cancel message can be seen in
+the newsgroup 'control' or 'control.cancel'.
 .TP
 .B PageEditArticle 'e'
 Edit the current article. This is restricted to mailgroups and saved news.
 .TP
-.B PageEditFilter 'E'
+.B EditFilter 'E'
 Edit the filter file and reload it afterwards.
 .TP
 .B PageFollowupQuote 'f'
@@ -1141,10 +1175,6 @@ Display the subject of the current artic
 .B ToggleInverseVideo 'I'
 Toggle inverse video.
 .TP
-.B Up2 'k'
-Mark article as read and move on to next unread article. Behaves identically
-to \fBPageNextUnreadArt\fP ('\fBN\fP').
-.TP
 .B PageKillThd 'K'
 Mark rest of thread as read and move onto the next unread thread.
 .TP
@@ -1152,7 +1182,7 @@ Mark rest of thread as read and move ont
 Show the thread menu that the current article is a part of.
 .TP
 .B LookupMessage 'L'
-Look up article by ''Message-ID:''.
+Look up article by ''Message\-ID:''.
 .TP
 .B PageMail 'm'
 Mail current article / thread / auto-selected (hot) articles / articles
@@ -1224,7 +1254,7 @@ View or save multimedia attachments.
 Post an article to the current group. If posting fails for some reason,
 you'll get the chance to edit the article again via \fBPostEdit\fP
 ('\fBe\fP'), postpone it for later processing via \fBPostPostpone\fP
-('\fBo\fP') (see also ''\fB-o\fP'' command-line switch) or discard it
+('\fBo\fP') (see also ''\fB\-o\fP'' command-line switch) or discard it
 via \fBQuit\fP ('\fBq\fP').
 .TP
 .B PageRepost 'x'
@@ -1233,10 +1263,10 @@ articles matching pattern / tagged artic
 for reposting from global to local newsgroups. Do not use this to crosspost
 your own articles.
 .TP
-.B PageMarkArtUnread 'z'
+.B MarkArtUnread 'z'
 Mark article as unread.
 .TP
-.B PageMarkThdUnread 'Z'
+.B MarkThdUnread 'Z'
 Mark the current thread as unread.
 .\"--------------------------------------------------------------------
 .\"
@@ -1246,25 +1276,24 @@ At startup, \fBtin\fP reads in the confi
 .BR tin (5)).
 They contain a list of variables that can be used to configure the way
 \fBtin\fP works. If it exists, the global configuration file,
-\fI${TIN_LIBDIR-NEWSLIBDIR}/tinrc\fR is read. After that, the user's own
-configuration file is read from \fI${TIN_HOMEDIR-"$HOME"}/.tin/tinrc\fR. The
+\fI${TIN_LIBDIR\-NEWSLIBDIR}/tinrc\fR is read. After that, the user's own
+configuration file is read from \fI${TIN_HOMEDIR\-"$HOME"}/.tin/tinrc\fR. The
 global file is useful for distributing system-wide defaults to new users who
 have no private tinrc yet.
 .PP
 The variables are user configurable by editing
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/tinrc\fR directly. Most of them can also be
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/tinrc\fR directly. Most of them can also be
 set in the GLOBAL OPTIONS MENU which is accessed by pressing
 \fBOptionMenu\fP ('\fBM\fP') at all levels. It allows the user to customize
 the behavior of \fBtin\fP. The options are saved to the file
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/tinrc\fR when you exit \fBtin\fP so don't
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/tinrc\fR when you exit \fBtin\fP so don't
 edit the file directly whilst \fBtin\fP is running.
 .PP
-In the options menu use the cursor keys in the usual way to move
-around. Use \fBConfigSelect\fP ('\fB^J\fP') or \fBConfigSelect2\fP
-('\fB<CR>\fP') to 'open' the option you wish to change. You will need to
-enter a new value or use '\fB<SPACE>\fP' to toggle the available
-options. \fBConfigSelect\fP will save the new value, '\fB<ESC>\fP' will
-abort without saving changes.
+In the options menu use the cursor keys in the usual way to move around. Use
+\fBConfigSelect\fP ('\fB^J\fP' or '\fB<CR>\fP') to 'open' the option you
+wish to change. You will need to enter a new value or use '\fB<SPACE>\fP' to
+toggle the available options. \fBConfigSelect\fP will save the new value,
+\&'\fB<ESC>\fP' will abort without saving changes.
 .PP
 As with the other menus, \fBRedrawScr\fP ('\fB^L\fP') will redraw the
 screen. You can use \fBSearchSubjF\fP ('\fB/\fP'), \fBSearchSubjB\fP
@@ -1275,14 +1304,14 @@ your changes.
 .PP
 Here is a full list of all the available variables. The name in braces is
 the name of the corresponding setting in
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/tinrc\fR.
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/tinrc\fR.
 .TP 4
 .B Add posted articles to filter (add_posted_to_filter)
 If ON add posted articles which start a new thread to filter for
 highlighting follow-ups. Default is ON.
 .TP
-.B Insert 'User-Agent:'-header (advertising)
-Turn ON advertising in header (''User-Agent:''). Default is ON.
+.B Insert 'User\-Agent:'-header (advertising)
+Turn ON advertising in header (''User\-Agent:''). Default is ON.
 .TP
 .B Skip multipart/alternative parts (alternative_handling)
 If ON strip multipart/alternative messages automatically. Default is ON.
@@ -1295,7 +1324,7 @@ The character used to show that an artic
 .TP
 .B Character to show returning arts (art_marked_return)
 The character used to show that an article will return as an unread article
-when the group is next entered. Default is '-'.
+when the group is next entered. Default is '\-'.
 .TP
 .B Character to show selected articles (art_marked_selected)
 The character used to show that an article/thread is auto-selected (hot).
@@ -1320,10 +1349,10 @@ The character used to show that an artic
 The character used to show that an article was hot before it was read.
 Default is ':'. \fBkill_level\fP must be set accordingly.
 .TP
-.B Ask before using \fBmetamail_prog\fP (ask_for_metamail)
-If ON \fBtin\fP will ask before using \fBmetamail_prog\fP
-to display MIME messages. This only occurs if \fBmetamail_prog\fP is set.
-Default is OFF.
+.B Ask before using MIME viewer (ask_for_metamail)
+If ON \fBtin\fP will ask before using a MIME viewer
+(\fBmetamail_prog\fP) to display MIME messages. This only occurs if a
+MIME viewer is set. Default is OFF.
 .TP
 .B Send you a blind cc automatically (auto_bcc)
 If ON automatically put your name in the ''Bcc:'' field when mailing an
@@ -1340,15 +1369,15 @@ Default is ON.
 .B Reconnect to server automatically (auto_reconnect)
 Default is OFF.
 .TP
-.B Use Archive-name: header for save (auto_save)
-If ON articles/threads with ''Archive-name:'' in header will be
-automatically saved with the Archive-name & part/patch no and post
+.B Use Archive\-name: header for save (auto_save)
+If ON articles/threads with ''Archive\-name:'' in header will be
+automatically saved with the Archive\-name & part/patch no and post
 processed if \fBpost_process_type\fP is set to something other than 'No'.
 Default is OFF.
 .TP
 .B Save articles in batch mode (batch_save)
 If set ON articles/threads will be saved in batch mode when save
-\&''\fB-S\fP'' or mail ''\fB-M\fP, \fB-N\fP'' is specified on the command
+\&''\fB\-S\fP'' or mail ''\fB\-M\fP, \fB\-N\fP'' is specified on the command
 line. Default is ON.
 .TP
 .B Show mini menu & posting etiquette (beginner_level)
@@ -1397,8 +1426,8 @@ and \fBword_highlight\fP.
 Color of words emphasized like *this*. See also \fBword_h_display_marks\fP
 and \fBword_highlight\fP.
 .TP
-.B Color of highlighting with -stroke- (col_markstroke)
-Color of words emphasized like -this-. See also \fBword_h_display_marks\fP
+.B Color of highlighting with \-stroke\- (col_markstroke)
+Color of words emphasized like \-this\-. See also \fBword_h_display_marks\fP
 and \fBword_highlight\fP.
 .TP
 .B Color of mini help menu (col_minihelp)
@@ -1426,6 +1455,9 @@ in the article viewer.
 .B Color of signatures (col_signature)
 Color of signatures
 .TP
+.B Color of urls highlight (col_urls)
+Color of urls highlight
+.TP
 .B Color of article subject lines (col_subject)
 Color of article subject
 .TP
@@ -1441,7 +1473,7 @@ Ask for manual confirmation to protect t
 .IP \(bu 3
 .B commands
 Ask for confirmation before executing certain dangerous commands (e.g.,
-\fBGroupCatchup\fP ('\fBc\fP')). Commands that this affects are marked in
+\fBCatchup\fP ('\fBc\fP')). Commands that this affects are marked in
 this manual with '[after confirmation]'. Default is commands & quit.
 .\" TODO: check if all affected commands are marked [after confirmation]
 .IP \(bu
@@ -1454,12 +1486,14 @@ Ask for confirmation before marking all 
 \fBGroupMarkUnselArtRead\fP ('\fBX\fP') command) articles as read.
 .RE
 .TP
-.B 'Mark article read' ignores tags (mark_ignore_tags)
-When this is ON, the \fBiKeyGroupMarkThdRead\fP,
-\fBiKeyThreadMarkArtRead\fB functions ('\fBK\fP') mark just the
-current article or thread, ignoring other tagged, unread articles.
-When OFF, the same function presents a menu with choices of the
-current thread or article, all tagged, unread articles, or nothing.
+.B Format string for display of dates (date_format)
+Format string \fBtin\fP uses for date representation. A description of the
+different format options can be found at
+.BR strftime (3).
+\fBtin\fP uses
+.BR strftime (3)
+when available and supports most format options in his fallback code.
+Default is "%a, %d %b %Y %H:%M:%S".
 .\"
 .\" most of these default_* settings are not available from the menu
 .\" as they are intended for internal use only.
@@ -1499,11 +1533,11 @@ Default for quick (1 key) kill filter he
 .IP 2,3
  ''From:''
 .IP 4
- ''Message-ID:'' & full ''References:'' line
+ ''Message\-ID:'' & full ''References:'' line
 .IP 5
- ''Message-ID:'' & last ''References:'' entry only
+ ''Message\-ID:'' & last ''References:'' entry only
 .IP 6
- ''Message-ID:'' entry only
+ ''Message\-ID:'' entry only
 .IP 7
  ''Lines:''
 .RE
@@ -1529,11 +1563,11 @@ Default for quick (1 key) auto-selection
 .IP 2,3
  ''From:''
 .IP 4
- ''Message-ID:'' & full ''References:'' line
+ ''Message\-ID:'' & full ''References:'' line
 .IP 5
- ''Message-ID:'' & last ''References:'' entry only
+ ''Message\-ID:'' & last ''References:'' entry only
 .IP 6
- ''Message-ID:'' entry only
+ ''Message\-ID:'' entry only
 .IP 7
  ''Lines:''
 .RE
@@ -1551,15 +1585,15 @@ format. This feature is mainly for use w
 .BR elm (1)
 mail program. It allows the user to save articles/threads/groups simply by
 giving '=' as the filename to save to.
-Default is \fI${TIN_HOMEDIR-"$HOME"}/Mail\fR.
+Default is \fI${TIN_HOMEDIR\-"$HOME"}/Mail\fR.
 .TP
 .B Invocation of your mail command (default_mailer_format)
 The format string used to create the mailer command with parameters that is
-used for mailing articles to other people. Default is '%M "%T" < %F' (i.e.,
+used for mailing articles to other people. Default is '%M "%T" < %F' (e.g.,
 /bin/mail "iain" < .article). The flexible format allows other mailers with
-different command-line parameters to be used such as 'elm -s "%S" "%T" <
-"%F"' (i.e., elm -s "subject" "iain" < .article) or 'sendmail -oi -oem -t <
-%F' (i.e. sendmail -oi -oem -t < .article).
+different command-line parameters to be used such as 'elm \-s "%S" "%T" <
+"%F"' (e.g., elm \-s "subject" "iain" < .article) or 'sendmail \-oi \-oem \-t <
+%F' (e.g. sendmail \-oi \-oem \-t < .article).
 .TP
 .B (default_move_group)
 .TP
@@ -1594,7 +1628,7 @@ System Administrator.
 .TP
 .B Directory to save arts/threads in (default_savedir)
 Directory where articles/threads are saved. Default is
-\fI${TIN_HOMEDIR-"$HOME"}/News\fR.
+\fI${TIN_HOMEDIR\-"$HOME"}/News\fR.
 .TP
 .B (default_select_pattern)
 .TP
@@ -1606,14 +1640,14 @@ up to or replying to an article. If the 
 signature will be randomly generated from files that are in the specified
 directory. If the path starts with a ! the program the path points to will
 be executed to generate a signature. \fBtin\fP will pass the name of the
-current newsgroup as argument to the program. --none will suppress any
+current newsgroup as argument to the program. \-\-none will suppress any
 signature.
-Default is \fI${TIN_HOMEDIR-"$HOME"}/.Sig\fR.
+Default is \fI${TIN_HOMEDIR\-"$HOME"}/.Sig\fR.
 .TP
 .B (default_subject_search)
 .TP
-.B Draw -> instead of highlighted bar (draw_arrow)
-Allows groups/articles to be selected by an arrow '->' if set ON or
+.B Draw \-> instead of highlighted bar (draw_arrow)
+Allows groups/articles to be selected by an arrow '\->' if set ON or
 by an highlighted bar if set OFF. Default is OFF.
 .TP
 .B Force redraw after certain commands (force_screen_redraw)
@@ -1626,10 +1660,6 @@ are fetched from the server. If \fBgetar
 fetching articles from your first unread minus absolute value of
 \fBgetart_limit\fP. Default is 0, which means no limit.
 .TP
-.B Article recentness time limit (recent_time)
-If set to 0, this feature is deactivated, otherwise it means the number of
-days. Default is 2.
-.TP
 .B Catchup group using left key (group_catchup_on_exit)
 If ON catchup group when leaving with the left arrow key. Default is ON.
 .TP
@@ -1649,8 +1679,8 @@ article viewer. Default is 'No'.
 .B External inews (inews_prog)
 Path, name and options of external
 .BR inews (1).
-If you are reading via NNTP the default value is --internal (use built-in
-NNTP inews), else it is "inews -h". The article is passed to
+If you are reading via NNTP the default value is \-\-internal (use built-in
+NNTP inews), else it is "inews \-h". The article is passed to
 \fBinews_prog\fP on STDIN via '< article'.
 .TP
 .B (info_in_last_line)
@@ -1660,6 +1690,13 @@ If ON, show current group description or
 toggles setting. This facility is useful as the full width of the screen is
 available to display long subjects. Default is OFF.
 .TP
+.B Use interactive mail reader (interactive_mailer)
+Interactive mailreader: if greater than 0 your mailreader will be invoked
+earlier for reply so you can use more of its features (e.g. MIME,
+pgp, ...). 1 means include headers, 2 means don't include headers
+(old use_mailreader_i=ON option). 0 turns off usage. This option has to
+suit \fBdefault_mailer_format\fP. Default is 0.
+.TP
 .\" TODO: fix menu description
 .\"       mono_mark* currently do allow "Reverse video" even if
 .\"       inverse_okay=FALSE
@@ -1668,9 +1705,9 @@ If ON use inverse video for page headers
 Default is ON.
 .TP
 .B Keep failed arts in ~/dead.articles (keep_dead_articles)
-If ON keep all failed postings in \fI${TIN_HOMEDIR-"$HOME"}/dead.articles\fR
+If ON keep all failed postings in \fI${TIN_HOMEDIR\-"$HOME"}/dead.articles\fR
 besides keeping the last failed posting in
-\fI${TIN_HOMEDIR-"$HOME"}/dead.article\fR. Default is ON.
+\fI${TIN_HOMEDIR\-"$HOME"}/dead.article\fR. Default is ON.
 .TP
 .B Filter which articles (kill_level)
 This option controls the processing and display of articles that are killed.
@@ -1678,7 +1715,7 @@ There are 3 options:
 .RS +.5i
 .IP 0 3
 \fBKill only unread arts\fP is the 'traditional' behavior of \fBtin\fP. Only
-unread articles are killed once only by marking them read.  As filtering
+unread articles are killed once only by marking them read. As filtering
 only happens on unread articles with \fBkill_level\fP set to 0,
 \fBart_marked_killed\fP and \fBart_marked_read_selected\fP are only shown
 once. When you reenter the group the mark will be gone.
@@ -1713,7 +1750,7 @@ conversion) is performed (i.e., local ch
 .TP
 .B Quote line when mailing (mail_quote_format)
 Format of quote line when replying (via mail) to an article (%A=Address,
-%D=Date, %F=Fullname+Address, %G=Groupname, %M=Message-ID, %N=Fullname,
+%D=Date, %F=Fullname+Address, %G=Groupname, %M=Message\-ID, %N=Fullname,
 %C=Firstname, %I=Initials). Default is "In article %M you wrote:"
 .TP
 .B Format of the mailbox (mailbox_format)
@@ -1724,6 +1761,13 @@ for more details on MBOXO and MBOXRD and
 .BR mmdf (5)
 for more details about MMDF.
 .TP
+.B 'Mark article read' ignores tags (mark_ignore_tags)
+When this is ON, the \fBGroupMarkThdRead\fP, \fBThreadMarkArtRead\fP
+functions ('\fBK\fP') mark just the current article or thread, ignoring
+other tagged, unread articles. When OFF, the same function presents a menu
+with choices of the current thread or article, all tagged, unread articles,
+or nothing.
+.TP
 .B Mark saved articles/threads as read (mark_saved_read)
 If ON mark articles that are saved as read. Default is ON.
 .TP
@@ -1731,7 +1775,7 @@ If ON mark articles that are saved as re
 Path, name and options of external
 .BR metamail (1)
 program used to view non-textual parts of articles.
-To use the built-in viewer, set to --internal. This is the default
+To use the built-in viewer, set to \-\-internal. This is the default
 value when
 .BR metamail (1)
 is not installed. Leave it blank if you don't want any
@@ -1787,8 +1831,8 @@ Character attribute of words emphasized 
 terminal which attributes are usable. See also \fBword_h_display_marks\fP
 and \fBword_highlight\fP.
 .TP
-.B Attribute of highlighting with -stroke- (mono_markstroke)
-Character attribute of words emphasized like -this-. It depends on your
+.B Attribute of highlighting with \-stroke\- (mono_markstroke)
+Character attribute of words emphasized like \-this\-. It depends on your
 terminal which attributes are usable. See also \fBword_h_display_marks\fP
 and \fBword_highlight\fP.
 .TP
@@ -1799,24 +1843,42 @@ Do not change them unless you understand
 .B Display these header fields (or *) (news_headers_to_display)
 Which news headers you wish to see. If you want to see _all_ the headers,
 place an '*' as this value. This is the only way a wildcard can be used.
-If you enter 'X-' as the value, you will see all headers beginning
-with 'X-' (like X-Alan or X-Pape). You can list more than one by delimiting
+If you enter 'X\-' as the value, you will see all headers beginning
+with 'X\-' (like X\-Alan or X\-Pape). You can list more than one by delimiting
 with spaces. Not defining anything turns off this option.
 .TP
 .B Do not display these header fields (news_headers_to_not_display)
 Same as \fBnews_headers_to_display\fP except it denotes the opposite. An
-example of using both options might be if you thought X- headers were A Good
+example of using both options might be if you thought X\- headers were A Good
 Thing(tm), but thought Alan and Pape were miscreants... well then you would
 do something like this:
-\fInews_headers_to_display=X-\fR
-\fInews_headers_to_not_display=X-Alan X-Pape\fR.
+\fInews_headers_to_display=X\-\fR
+\fInews_headers_to_not_display=X\-Alan X\-Pape\fR.
 Not defining anything turns off this option.
 .TP
 .B Quote line when following up (news_quote_format)
 Format of quote line when posting/following up an article (%A=Address,
-%D=Date, %F=Fullname+Address, %G=Groupname, %M=Message-ID, %N=Fullname,
+%D=Date, %F=Fullname+Address, %G=Groupname, %M=Message\-ID, %N=Fullname,
 %C=Firstname, %I=Initials). Default is "%F wrote:".
 .TP
+.B Unicode normalization form (normalization_form)
+The normalization form \fBtin\fP should use to normalize unicode input.
+The possible values are:
+.RS +.5i
+.IP 0 3
+\fBNone\fP: no normalization
+.IP 1
+\fBNFKC\fP: Compatibility Decomposition, followed by Canonical Composition
+.IP 2
+\fBNFKD\fP: Compatibility Decomposition
+.IP 3
+\fBNFC\fP: Canonical Decomposition, followed by Canonical Composition
+.IP 4
+\fBNFD\fP: Canonical Decomposition
+.RE
+Some normalization modes are only available if they are supported by the
+library \fBtin\fP uses to do the normalization. Default is NFKC.
+.TP
 .B PgDn goes to next unread article (pgdn_goto_next)
 If ON the Page Down keys will go to the next unread article when pressed
 at the end of a message. Default is ON.
@@ -1826,13 +1888,15 @@ If ON put cursor at first unread article
 article. Default is ON.
 .TP
 .B Use 8bit characters in news headers (post_8bit_header)
-Allows 8bit characters unencoded in the header of a news article.
-Default is OFF. Only enacted if \fBpost_mime_encoding\fP is also set
-to 8bit. In a number of local hierarchies where 8bit characters are
-used, using unencoded (raw) 8bit characters in header is acceptable
-and sometimes even recommended so that you need to check the
-convention adopted in the local hierarchy of your interest to
-determine what to do with this and \fBpost_mime_encoding\fP.
+Allows 8bit characters unencoded in the header of a news article, if
+set this also disables the generation of MIME-headers when they are
+usualy required. Default is OFF. Only enacted if
+\fBpost_mime_encoding\fP is also set to 8bit. In a number of local
+hierarchies where 8bit characters are used, using unencoded (raw)
+8bit characters in header is acceptable and sometimes even
+recommended so that you need to check the convention adopted in the
+local hierarchy of your interest to determine what to do with this
+and \fBpost_mime_encoding\fP.
 .TP
 .B MIME encoding in news messages (post_mime_encoding)
 MIME encoding of the body in news message, if necessary. (8bit,
@@ -1860,7 +1924,7 @@ files only.
 .TP
 .B Filename to be used for storing posted articles (posted_articles_file)
 Keep posted articles in
-\fI${TIN_HOMEDIR-"$HOME"}/Mail/\fBposted_articles_file\fP\fR.
+\fI${TIN_HOMEDIR\-"$HOME"}/Mail/\fBposted_articles_file\fP\fR.
 If no filename is set then postings will not be saved.
 Default is 'posted'.
 .TP
@@ -1872,8 +1936,8 @@ the ''Subject:'' and ''From:'' fields ar
 If ON only save/print/pipe/mail unread articles (tagged articles excepted).
 Default is OFF.
 .TP
-.B Show empty Followup-To in editor (prompt_followupto)
-If ON show empty ''Followup-To:'' header when editing an article. Default is OFF.
+.B Show empty Followup\-To in editor (prompt_followupto)
+If ON show empty ''Followup\-To:'' header when editing an article. Default is OFF.
 .TP
 .B Characters used as quote-marks (quote_chars)
 The character used in quoting included text to article followups and mail
@@ -1905,8 +1969,16 @@ A regular expression that will be applie
 matching lines are shown in \fBcol_quote3\fP. If \fBquote_regex3\fP is
 blank, then \fBtin\fP uses a built-in default.
 .TP
+.B Article recentness time limit (recent_time)
+If set to 0, this feature is deactivated, otherwise it means the number of
+days. Default is 2.
+.TP
+.B Render BiDi (render_bidi)
+If ON \fBtin\fP does the rendering of bi-directional text. If OFF \fBtin\fP
+leaves the rendering of bi-directional text to the terminal. Default is OFF.
+.TP
 .B Interval in seconds to reread active (reread_active_file_secs)
-The news \fI${TIN_LIBDIR-NEWSLIBDIR}"/"${TIN_ACTIVEFILE-active}\fR file is
+The news \fI${TIN_LIBDIR\-NEWSLIBDIR}"/"${TIN_ACTIVEFILE\-active}\fR file is
 reread at regular intervals to show if any new news has arrived. Default is
 1200. Setting this to 0 will disable this feature.
 .TP
@@ -1953,12 +2025,12 @@ displayed.
 .TP
 .B Show description of each newsgroup (show_description)
 If ON show a short group description text after newsgroup name at the group
-selection level. The ''\fB-d\fP'' command-line flag will override the
+selection level. The ''\fB\-d\fP'' command-line flag will override the
 setting and turn descriptions off. The text used is taken from the
-\fI${TIN_LIBDIR-NEWSLIBDIR}/newsgroups\fR file and if supported (requires
+\fI${TIN_LIBDIR\-NEWSLIBDIR}/newsgroups\fR file and if supported (requires
 .B tin
 to be build with mh-mail-handling support) from
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/mailgroups\fR for mailgroups. Default is ON.
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/mailgroups\fR for mailgroups. Default is ON.
 .TP
 .B Show lines/score in listings (show_info)
 Which information about the thread or article should be shown. Default is 1,
@@ -1990,7 +2062,7 @@ is OFF.
 If OFF don't show signatures when displaying articles.
 Default is ON.
 .TP
-.B Prepend signature with '\en-- \en' (sigdashes)
+.B Prepend signature with '\en\-\- \en' (sigdashes)
 If ON prepend the signature with sigdashes. Default is ON.
 .TP
 .B Add signature when reposting (signature_repost)
@@ -2075,7 +2147,7 @@ display when reading on a slow terminal 
 .TP
 .B Remove bogus groups from newsrc (strip_bogus)
 Bogus groups are groups that are present in your
-\fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR file that no longer exist on the news
+\fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR file that no longer exist on the news
 server. There are 3 options. 0 means do nothing & always keep bogus groups.
 1 means bogus groups will be permanently removed. 2 means that bogus groups
 will appear on the Group Selection Menu, prefixed with a 'D'. This allows
@@ -2084,9 +2156,9 @@ Keep).
 .TP
 .B No unsubscribed groups in newsrc (strip_newsrc)
 If ON, then unsubscribed groups will be permanently removed from your
-\fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR file. Default is OFF.
+\fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR file. Default is OFF.
 .TP
-.B Regex used to highlight -strokes- (strokes_regex)
+.B Regex used to highlight \-strokes\- (strokes_regex)
 A regular expression that will be applied when reading articles. All
 matching words are shown in \fBcol_markstroke\fP or \fBmono_markstroke\fP.
 If \fBstrokes_regex\fP is blank, then \fBtin\fP uses a built-in default.
@@ -2109,7 +2181,7 @@ toggled in the article viewer via \fBPag
 Defines which threading method to use. It's possible to set the threading
 type on a per group basis by setting the group attribute variable
 \fBthread_arts\fP to 0 - 4 in the file
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/attributes\fR. (See also "GROUP ATTRIBUTES".)
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/attributes\fR. (See also "GROUP ATTRIBUTES".)
 The default is Both Subject and References.
 The choices are:
 .RS +.5i
@@ -2124,12 +2196,19 @@ The choices are:
 \&''Subject:'' (default).
 .IP 4
 \fBMultipart Subject\fP, thread multipart articles on ''Subject:''.
+.IP 5
+\fBPercentage Match\fP, thread base upon a partial character match on
+\&''Subject:''.
 .RE
 .TP
 .B Catchup thread by using left key (thread_catchup_on_exit)
 If ON catchup group/thread when leaving with the left arrow key. Default is
 ON.
 .TP
+.B Matchingness of a thread (thread_perc)
+How closely the subjects must match for two threads to be considered
+part of the same thread. This is a percentage and the default if 75%.
+.TP
 .B Score of a thread (thread_score)
 How the total score of a thread is computed. Default is 0, the maximum
 score in this thread.
@@ -2163,27 +2242,25 @@ The program that will be run when launch
 using \fBPageViewUrl\fP ('\fBU\fP'). The actual URL will be appended to this.
 Default is \fBurl_handler.sh %s\fP.
 .TP
+.B URL highlighting in message body (url_highlight)
+Enable highlighting URLs in message body. Default is ON.
+.TP
 .B Use ANSI color (use_color)
 If enabled \fBtin\fP uses ANSI-colors. Default is OFF.
 .TP
 .B Use scroll keys on keypad (use_keypad)
 Default is OFF.
 .TP
-.B Use interactive mail reader (use_mailreader_i)
-Interactive mailreader: if ON mailreader will be invoked earlier for reply
-so you can use more of its features (e.g. MIME, pgp, ...) this option has to
-suit \fBdefault_mailer_format\fP. Default is OFF.
-.TP
 .B Use mouse in xterm (use_mouse)
 Allows the mouse key support in a
 .BR xterm (1x)
 to be enabled/disabled.
 Default is OFF.
 .TP
-.B Use slrnface to show ''X-Face:''s (use_slrnface)
+.B Use slrnface to show ''X\-Face:''s (use_slrnface)
 If enabled \fBtin\fP uses
 .BR slrnface (1)
-to interpret the ''X-Face:'' header. For this option to have any effect,
+to interpret the ''X\-Face:'' header. For this option to have any effect,
 \fBtin\fP must be running in an
 .BR xterm (1x)
 and
@@ -2237,15 +2314,15 @@ width.
 .TP
 .B Quote line when cross-posting (xpost_quote_format)
 Format is the same as for \fBnews_quote_format\fP, this is used when
-answering to a crossposting to several groups with no ''Followup-To:''
+answering to a crossposting to several groups with no ''Followup\-To:''
 set.
 .\"
 .\"
 .SS "GROUP ATTRIBUTES"
 \fBtin\fP allows certain attributes to be set on a per group basis. If it
 exists, the global attributes file,
-\fI${TIN_LIBDIR-NEWSLIBDIR}/attributes\fR is read. After that, the user's
-own attributes file \fI${TIN_HOMEDIR-"$HOME"}/.tin/attributes\fR is read.
+\fI${TIN_LIBDIR\-NEWSLIBDIR}/attributes\fR is read. After that, the user's
+own attributes file \fI${TIN_HOMEDIR\-"$HOME"}/.tin/attributes\fR is read.
 The global attributes file is useful for distributing system-wide defaults
 to new users who have no private attributes file yet. A later version will
 provide a menu interface to set all the attributes. At present you will have
@@ -2269,7 +2346,7 @@ you specify. This can be anything from t
 of lines in an article.
 .PP
 When \fBtin\fP starts up the user's kill-file
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/filter\fR (see also
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/filter\fR (see also
 .BR tin (5))
 is read. Each time a newsgroup is entered the rules are applied and articles
 killed or selected when they meet certain criteria.
@@ -2280,7 +2357,7 @@ setting. By default killed articles will
 auto-selection rule are marked with a ''*''.
 .PP
 Filtering rules can be manually entered into
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/filter\fR (but don't do this whilst running
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/filter\fR (but don't do this whilst running
 \fBtin\fP else you will lose your changes) or by using an on-screen menu
 within \fBtin\fP.
 .PP
@@ -2345,8 +2422,8 @@ again via \fBPostEdit\fP ('\fBe\fP') or 
 .SS "CUSTOMIZING THE ARTICLE QUOTE STRING"
 When posting a followup to an article or replying direct to the author of an
 article via email the text of the article can be quoted. The beginning of
-the quoted text can contain information about the quoted article (i.e., Name
-and the Message-ID of the article). To allow for different situations
+the quoted text can contain information about the quoted article (e.g., Name
+and the Message\-ID of the article). To allow for different situations
 certain information from the article can be used in the quoted string. The
 following variables are expanded if found in the tinrc variables
 \fBmail_quote_format\fP, \fBnews_quote_format\fP or \fBxpost_quote_format\fP:
@@ -2357,29 +2434,25 @@ following variables are expanded if foun
 \fB%D\fP	Date
 \fB%F\fP	Full address (%N <%A>)
 \fB%G\fP	Groupname
-\fB%M\fP	Message-ID
+\fB%M\fP	Message\-ID
 \fB%N\fP	Fullname of author
 \fB%C\fP	Firstname of author
 \fB%I\fP	Initials of author
 .fi
 .RE
-i.e.,
+e.g.,
 .RS
-.nf
-.ft CW
+.Vb
 mail_quote_format=On %D in %G you wrote:
 news_quote_format=In %M, %F wrote:
-.ft R
-.fi
+.Ve
 .RE
 would expand to:
 .RS
-.nf
-.ft CW
-On 21 Jul 1992 09:45:51 -0400 in alt.sources you wrote:
-In <abcINN123@ecrc.de>, Iain Lea <iain@ecrc.de> wrote:
-.ft R
-.fi
+.Vb
+On 21 Sep 1993 09:45:51 -0400 in alt.sources you wrote:
+In <abcINN123@example.org>, Joe Bar <joe@example.org> wrote:
+.Ve
 .RE
 The quoted text section of an article is marked by a preceding quote string
 at the beginning of each quoted line. The default quote string is set to
@@ -2426,7 +2499,7 @@ mailbox with the name of the current new
 See \fBdefault_maildir\fP.
 .PP
 To save in savedir/<news.group.name>/<filename> format enter '+<filename>'.
-Environment variables are allowed within a filename (i.e.,
+Environment variables are allowed within a filename (e.g.,
 \fI$SOURCES/dir/filename\fR). See \fBdefault_savedir\fP.
 .PP
 When saving articles you can specify whether the saved files should be
@@ -2435,15 +2508,15 @@ via \fBpost_process_type\fP.
 .\"
 .\"
 .SS "AUTOMATIC MAILING AND SAVING NEW NEWS"
-\fBtin\fP allows new/unread news articles to be mailed (''\fB-M\fP'' and
-\&''\fB-N\fP'' option) or saved (''\fB-S\fP'' option) in batch mode for later
+\fBtin\fP allows new/unread news articles to be mailed (''\fB\-M\fP'' and
+\&''\fB\-N\fP'' option) or saved (''\fB\-S\fP'' option) in batch mode for later
 reading. Useful when going on holiday and you don't want to return and find
 that expire has removed a whole load of unread articles. Best to run via
 .BR cron (1)
 everyday while away, after which you will be mailed a report of which
 articles were mailed/saved from which newsgroups and the total number of
 articles mailed/saved. Articles are saved in a private news structure under
-your <savedir> directory (default is \fI${TIN_HOMEDIR-"$HOME"}/News\fR). Be
+your <savedir> directory (default is \fI${TIN_HOMEDIR\-"$HOME"}/News\fR). Be
 careful of using this option if you read a lot of groups because you could
 overflow your file system.
 .PP
@@ -2455,18 +2528,18 @@ then set \fBbatch_save\fP to ON in tinrc
 you don't want using attributes.
 .PP
 .TP 2i
-.B tin -M iain -c -f newsrc.mail
+.B tin \-M iain \-c \-f newsrc.mail
 (mail any unread articles in newsgroups specified in file newsrc.mail to the
 local user iain and mark them as read)
 .PP
 .TP 2i
-.B tin -S -c -f newsrc.save
+.B tin \-S \-c \-f newsrc.save
 (save any unread articles in newsgroups specified in file newsrc.save and
 mark them as read)
 .PP
 .TP 2i
-.B tin -R
-(read any articles saved by \fBtin -S\fP)
+.B tin \-R
+(read any articles saved by \fBtin \-S\fP)
 .\"
 .\"
 .SS RANGES
@@ -2478,8 +2551,8 @@ expression of the form <min>-<max>, e.g.
 positions, '.' can be used in place of the current cursor position
 and '$' can be used to mean the highest number available. Currently
 the only commands that understand ranges are \fBGroupMarkThdRead\fP
-('\fBK\fP'), \fBGroupMarkArtUnread\fP ('\fBz\fP') and
-\fBGroupMarkThdUnread\fP ('\fBZ\fP').
+('\fBK\fP'), \fBMarkArtUnread\fP ('\fBz\fP') and
+\fBMarkThdUnread\fP ('\fBZ\fP').
 .PP
 .SS "NEWSGROUP LISTS & WILDCARDS"
 Several places in \fBtin\fP allow you to specify a list of
@@ -2503,25 +2576,23 @@ examples.
 .\"
 .SS SIGNATURES
 \fBtin\fP will recognize a signature in either
-\fI${TIN_HOMEDIR-"$HOME"}/.signature\fR or \fI${TIN_HOMEDIR-"$HOME"}/.Sig\fR.
-If \fI${TIN_HOMEDIR-"$HOME"}/.signature\fR exists, then the signature
+\fI${TIN_HOMEDIR\-"$HOME"}/.signature\fR or \fI${TIN_HOMEDIR\-"$HOME"}/.Sig\fR.
+If \fI${TIN_HOMEDIR\-"$HOME"}/.signature\fR exists, then the signature
 will be pulled into the editor for mail commands only. A signature in
-\fI${TIN_HOMEDIR-"$HOME"}/.signature\fR will not be pulled into the
+\fI${TIN_HOMEDIR\-"$HOME"}/.signature\fR will not be pulled into the
 editor for posting commands since
 .BR inews (1)
 will append the signature itself.
 .PP
-A signature in \fI${TIN_HOMEDIR-"$HOME"}/.Sig\fR will be pulled into the
+A signature in \fI${TIN_HOMEDIR\-"$HOME"}/.Sig\fR will be pulled into the
 editor for both posting and mailing commands.
 .PP
 The following is an example of a \fI.Sig\fR file:
 .RS
-.nf
-.ft CW
-NAMES  Iain Lea    iain@ecrc.de
-SNAIL  Bruecken Str 12, 90419 Nuernberg 90, Germany
-.ft P
-.fi
+.Vb
+NAMES  Joe Bar <joe@example.org>
+SNAIL  Musterweg 12, 99999 Notreal, Germany
+.Ve
 .RE
 .PP
 \fBtin\fP also has the capability to generate random signatures on a per
@@ -2561,7 +2632,7 @@ the
 is resized.
 .PP
 \fBtin\fP will reread the
-\fI${TIN_LIBDIR-NEWSLIBDIR}"/"${TIN_ACTIVEFILE-active}\fR file at set
+\fI${TIN_LIBDIR\-NEWSLIBDIR}"/"${TIN_ACTIVEFILE\-active}\fR file at set
 intervals (\fBreread_active_file_secs\fP) to show any newly arrived news.
 .PP
 If you find large number of new newsgroups cluttering up your screen,
@@ -2591,7 +2662,7 @@ clicked outside the list of articles.
 In the group selection menu, if the mouse is pointing at a group then:
 .TP 10
 left button
-moves to and selects the group pointed at, just like \fBSelectReadGrp2\fP
+moves to and selects the group pointed at, just like \fBSelectReadGrp\fP
 ('\fB<CR>\fP').
 .TP
 center button
@@ -2603,7 +2674,7 @@ moves to the group pointed at.
 In the article menu, if the mouse is pointing at an article (or thread) then:
 .TP 10
 left button
-reads the article pointed at, just like \fBGroupReadBasenote2\fP
+reads the article pointed at, just like \fBGroupReadBasenote\fP
 ('\fB<CR>\fP'), or the thread, just like \fBGroupListThd\fP ('\fBl\fP').
 .TP
 center button
@@ -2617,7 +2688,7 @@ moves to the article (or thread) pointed
 In the thread menu, if the mouse is pointing at an article then:
 .TP 10
 left button
-reads article pointed at, just like \fBThreadReadArt2\fP ('\fB<CR>\fP').
+reads article pointed at, just like \fBThreadReadArt\fP ('\fB<CR>\fP').
 .TP
 center button
 exits the menu, catching up on the thread if you have
@@ -2646,7 +2717,7 @@ Note that this cache can use up large am
 read a lot of groups and/or high traffic groups.
 .PP
 Each user creates/updates his/her own index files that are stored in
-\fI${TIN_INDEX_NEWSDIR-"${TIN_HOMEDIR-"$HOME"}/.tin"}/.news/\fR. If
+\fI${TIN_INDEX_NEWSDIR\-"${TIN_HOMEDIR\-"$HOME"}/.tin"}/.news/\fR. If
 you are reading via NNTP then the news server name will be appended
 to keep the indexes for different servers separate. If you are
 reading off the local spool and local overview files already exist
@@ -2657,21 +2728,19 @@ turning on caching will have little or n
 Entering a group the first time tends to be slow because the index
 file must be built from scratch. To alleviate the slowness start
 \fBtin\fP to create all index files for the groups you subscribe to
-with \fBtin -u -v\fP and go for a coffee. Subsequent readings of a
+with \fBtin \-u \-v\fP and go for a coffee. Subsequent readings of a
 group will only need to do incremental updating of the index file and
 will be much faster as only new articles will need to be cached.
 .PP
 As indexing might take some time you may want to run \fBtin\fP form
 the system batcher
 .BR cron (1)
-with the ''\fB-u\fP'' option:
+with the ''\fB\-u\fP'' option:
 .PP
 .RS
-.nf
-.ft CW
-30 6 * * * /usr/local/bin/tin -u
-.ft P
-.fi
+.Vb
+30 6 * * * /usr/local/bin/tin \-u
+.Ve
 .RE
 .PP
 If you are low on local disk space you should consider using
@@ -2680,12 +2749,10 @@ manually purge cached data for groups yo
 with something like:
 .PP
 .RS
-.nf
-.ft CW
-find ${TIN_INDEX_NEWSDIR-"${TIN_HOMEDIR-"$HOME"}/.tin"}/.news* \\
--type f -name "[0-9]*.[0-9]" -atime +28 | xargs rm -f
-.ft P
-.fi
+.Vb
+find ${TIN_INDEX_NEWSDIR\-"${TIN_HOMEDIR\-"$HOME"}/.tin"}/.news* \\
+\-type f \-name "[0\-9]*.[0\-9]" \-atime +28 | xargs rm \-f
+.Ve
 .RE
 .\"
 .\"
@@ -2697,7 +2764,7 @@ For a detailed description see
 .PP
 .IR $MAILCAPS
 .br
-.IR ${TIN_HOMEDIR-"$HOME"}/.mailcap
+.IR ${TIN_HOMEDIR\-"$HOME"}/.mailcap
 .br
 .IR /etc/mailcap
 .br
@@ -2711,87 +2778,90 @@ For a detailed description see
 .IR /etc/nntpserver
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.cancelsecret
+.IR ${TIN_HOMEDIR\-"$HOME"}/.cancelsecret
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.mime.types
+.IR ${TIN_HOMEDIR\-"$HOME"}/.mime.types
 .br
 .IR /etc/mime.types
 .br
 .IR /etc/tin/mime.types
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.newsauth
+.IR ${TIN_HOMEDIR\-"$HOME"}/.newsauth
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.newsrc
+.IR ${TIN_HOMEDIR\-"$HOME"}/.newsrc
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/$NNTPSERVER${NNTPPORT+":$NNTPPORT"}/.oldnewsrc
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/$NNTPSERVER${NNTPPORT+":$NNTPPORT"}/.oldnewsrc
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.signature
+.IR ${TIN_HOMEDIR\-"$HOME"}/.signature
 .br
-.IR ${TIN_HOMEDIR-"$HOME"}/.Sig
+.IR ${TIN_HOMEDIR\-"$HOME"}/.Sig
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.sigfixed
+.IR ${TIN_HOMEDIR\-"$HOME"}/.sigfixed
 .PP
 
 .IR ${TIN_HOMEDIR-"$HOME"}/.tin/.inputhistory
 .PP
 
-.IR ${TIN_INDEX_MAILDIR-"${TIN_HOMEDIR-"$HOME"}/.tin"}/.mail/
+.IR ${TIN_INDEX_MAILDIR\-"${TIN_HOMEDIR\-"$HOME"}/.tin"}/.mail/
 .PP
 
-.IR ${TIN_INDEX_NEWSDIR-"${TIN_HOMEDIR-"$HOME"}/.tin"}/.news/
+.IR ${TIN_INDEX_NEWSDIR\-"${TIN_HOMEDIR\-"$HOME"}/.tin"}/.news${NNTPSERVER+"\-$NNTPSERVER"}/
 .PP
 
-.IR ${TIN_INDEX_SAVEDIR-"${TIN_HOMEDIR-"$HOME"}/.tin"}/.save/
+.IR ${TIN_INDEX_SAVEDIR\-"${TIN_HOMEDIR\-"$HOME"}/.tin"}/.save/
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/active.mail
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/active.mail
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/active.save
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/active.save
 .PP
 
-.\" .IR ${TIN_LIBDIR-NEWSLIBDIR}/attributes
+.\" .IR ${TIN_LIBDIR\-NEWSLIBDIR}/attributes
 .IR /etc/tin/attributes
 .br
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/attributes
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/attributes
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/filter
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/filter
 .PP
 
-.IR /etc/tin/keymap${${LC_ALL-"${LC_CTYPE-"${LC_MESSAGES-"$LANG"}"}"}:+".${LC_ALL-"${LC_CTYPE-"${LC_MESSAGES-"$LANG"}"}"}"}
+.IR /etc/tin/keymap${${LC_ALL\-"${LC_CTYPE\-"${LC_MESSAGES\-"$LANG"}"}"}:+".${LC_ALL\-"${LC_CTYPE\-"${LC_MESSAGES\-"$LANG"}"}"}"}
 .br
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/keymap${${LC_ALL-"${LC_CTYPE-"${LC_MESSAGES-"$LANG"}"}"}:+".${LC_ALL-"${LC_CTYPE-"${LC_MESSAGES-"$LANG"}"}"}"}
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/keymap${${LC_ALL\-"${LC_CTYPE\-"${LC_MESSAGES\-"$LANG"}"}"}:+".${LC_ALL\-"${LC_CTYPE\-"${LC_MESSAGES\-"$LANG"}"}"}"}
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/mailgroups
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/mailgroups
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/newsrctable
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/newsrctable
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/posted
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/posted
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/Mail/posted
+.IR ${TIN_HOMEDIR\-"$HOME"}/Mail/posted
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/postponed.articles
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/postponed.articles
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/$NNTPSERVER:${NNTPPORT+":$NNTPPORT"}/serverrc
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/$NNTPSERVER:${NNTPPORT+":$NNTPPORT"}/newsgroups
 .PP
 
-.\" .IR ${TIN_LIBDIR-NEWSLIBDIR}/tinrc
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/$NNTPSERVER:${NNTPPORT+":$NNTPPORT"}/serverrc
+.PP
+
+.\" .IR ${TIN_LIBDIR\-NEWSLIBDIR}/tinrc
 .IR /etc/tin/tinrc
 .br
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/tinrc
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/tinrc
 .PP
 
 .IR /etc/tin/tin.defaults
@@ -2800,22 +2870,22 @@ For a detailed description see
 .IR /usr/local/share/locale/${LC_MESSAGES}/LC_MESSAGES/tin.mo
 .PP
 
-.IR ${TIN_LIBDIR-NEWSLIBDIR}"/"${TIN_ACTIVEFILE-active}
+.IR ${TIN_LIBDIR\-NEWSLIBDIR}"/"${TIN_ACTIVEFILE\-active}
 .PP
 
-.IR ${TIN_LIBDIR-NEWSLIBDIR}/active.times
+.IR ${TIN_LIBDIR\-NEWSLIBDIR}/active.times
 .PP
 
-.IR ${TIN_LIBDIR-NEWSLIBDIR}/newsgroups
+.IR ${TIN_LIBDIR\-NEWSLIBDIR}/newsgroups
 .PP
 
-.IR ${TIN_LIBDIR-NEWSLIBDIR}/organization
+.IR ${TIN_LIBDIR\-NEWSLIBDIR}/organization
 .PP
 
-.IR ${TIN_LIBDIR-NEWSLIBDIR}/overview.fmt
+.IR ${TIN_LIBDIR\-NEWSLIBDIR}/overview.fmt
 .PP
 
-.IR ${TIN_LIBDIR-NEWSLIBDIR}/subscriptions
+.IR ${TIN_LIBDIR\-NEWSLIBDIR}/subscriptions
 .PP
 .\"
 .\"
@@ -2823,24 +2893,14 @@ For a detailed description see
 .\" TODO: sort in a useful order, add undocumented env-vars like:
 .\"
 .\" .TP
-.\" .B TIN_POST (VMS, AmigaOS)
-.\"
-.\" .TP
-.\" .B USERNAME (AmigaOS)
-.\" The name of the logged-in user.
-.\"
-.\" .TP
-.\" .B NODENAME (AmigaOS, obsolete?)
-.\"
-.\" .TP
-.\" .B TIN_GROUPS (AmigaOS actived, obsolete)
+.\" .B TIN_POST (VMS)
 .\"
 .\" .TP
 .\" .B TIN_RNG_MIN, TIN_RNG_MAX, TIN_MIN, TIN_MAX, TIN_COUNT, TIN_SEQ
 .\" (all used in vNewsrcTestHarness() (-DDEBUG_NEWSRC))
 .\"
 .\" .TP
-.\" .B SHELL (Unix, AmigaOS)
+.\" .B SHELL (Unix)
 .\"
 .TP
 .B TINRC
@@ -2858,19 +2918,19 @@ Define this variable if you do not want 
 .TP
 .B TIN_INDEX_NEWSDIR
 Define this variable if you do not want the \fI.news\fR directory in
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/\fR. E.g., if you want all \fBtin\fP's
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/\fR. E.g., if you want all \fBtin\fP's
 news index files in \fI/tmp/.news\fR you would set $\fBTIN_INDEX_NEWSDIR\fP
 to \fI/tmp\fR.
 .TP
 .B TIN_INDEX_MAILDIR
 Define this variable if you do not want the \fI.mail\fR directory in
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/\fR. E.g., if you want all \fBtin\fP's
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/\fR. E.g., if you want all \fBtin\fP's
 mail index files in \fI/tmp/.mail\fR you would set $\fBTIN_INDEX_MAILDIR\fP
 to \fI/tmp\fR.
 .TP
 .B TIN_INDEX_SAVEDIR
 Define this variable if you do not want the \fI.save\fR directory in
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/\fR. E.g., if you want all \fBtin\fP's
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/\fR. E.g., if you want all \fBtin\fP's
 save index files in \fI/tmp/.save\fR you would set $\fBTIN_INDEX_SAVEDIR\fP
 to \fI/tmp\fR.
 .TP
@@ -2898,14 +2958,14 @@ is prepended to $\fBTIN_ACTIVEFILE\fP.
 .TP
 .B NNTPSERVER
 The default NNTP server to remotely read news from. This variable only
-needs to be set if the ''\fB-r\fP'' command-line option is specified and
-the file \fI/etc/nntpserver\fR does not exist. The ''\fB-g\fP'' command
+needs to be set if the ''\fB\-r\fP'' command-line option is specified and
+the file \fI/etc/nntpserver\fR does not exist. The ''\fB\-g\fP'' command
 line option overrides $\fBNNTPSERVER\fP.
 .TP
 .B NNTPPORT
 The NNTP TCP-port to read news from. This variable only
 needs to be set if the TCP-port is not 119 (the default).
-The ''\fB-p\fP'' command-line option overrides $\fBNNTPPORT\fP.
+The ''\fB\-p\fP'' command-line option overrides $\fBNNTPPORT\fP.
 .TP
 .B DISTRIBUTION
 Set the article header field ''Distribution:'' to the contents of the
@@ -2925,7 +2985,7 @@ instead of $\fBORGANIZATION\fP.
 DomainOS specific, same as $\fBORGANIZATION\fP on other OSs (see above).
 .TP
 .B REPLYTO
-Set the article header field ''Reply-To:'' to the return address specified
+Set the article header field ''Reply\-To:'' to the return address specified
 by the variable. This is useful if you wish to receive replies at a
 different address.
 .TP
@@ -2943,15 +3003,12 @@ for more infos.
 .TP
 .B MAILER
 This variable has precedence over the default mailer that is used in all
-mailing operations within \fBtin\fP. If reading news on AmigaOS use
-$\fBTIN_MAIL\fP, if reading news on VMS use $\fBTIN_MAILER\fP instead.
+mailing operations within \fBtin\fP. If reading news on VMS use
+$\fBTIN_MAILER\fP instead.
 .TP
 .B TIN_MAILER (VMS)
 VMS specific, same as $\fBMAILER\fP on other OSs (see above).
 .TP
-.B TIN_MAIL (AmigaOS)
-AmigaOS specific, same as $\fBMAILER\fP on other OSs (see above).
-.TP
 .B MAIL
 Full path to the users mailbox.
 .TP
@@ -2960,7 +3017,7 @@ This variable has precedence over the de
 .BR vi (1))
 that is used in all editing operations within \fBtin\fP (e.g., posting,
 replying, follow-ups, ...). Evaluation order is
-\fI${VISUAL-"${EDITOR-vi}"}\fR. See
+\fI${VISUAL\-"${EDITOR\-vi}"}\fR. See
 .BR environ (5)
 for more infos.
 .TP
@@ -2984,7 +3041,7 @@ syntax. For example, setting
 will automatically subscribe the user to all new groups in the comp.os.unix
 hierarchy, and all talk groups other than talk.politics groups (which will
 be queried for as usual). Of course this does not work if \fBtin\fP
-is started with the ''\fB-X\fP'' command-line switch.
+is started with the ''\fB\-X\fP'' command-line switch.
 .TP
 .B AUTOUNSUBSCRIBE
 Is handled like the $\fBAUTOSUBSCRIBE\fP variable, but groups matching the
@@ -3057,6 +3114,14 @@ and
 .BR environ (5)
 for more information.
 .TP
+.B LC_TIME
+Date and time formats. It's value should be of the form
+\fIlanguage\fR[\fI_territory\fR][\fI.codeset\fR][\fI@modifier\fR]. See
+.BR locale (5)
+and
+.BR environ (5)
+for more information.
+.TP
 .B LC_ALL
 This variable overrides the value of the \fB$LANG\fP variable and any
 other \fB$LC_\fP variable. It's value should be of the form
@@ -3115,7 +3180,7 @@ for more information.
 .B tin
 does conform to the Base Definitions volume of IEEE Std 1003.1-2001, Section
 12, Utility Conventions (Utility Argument Syntax, Utility Syntax Guidelines).
-.\" - RFC977, RFC1036, RFC2045, RFC2047, RFC2980, RFC2822
+.\" - RFC1036, RFC2045, RFC2047, RFC2822, RFC2980, RFC3977
 .\"   or whatever
 .\"
 .\"
@@ -3129,12 +3194,21 @@ ftp://ftp.csx.cam.ac.uk/pub/software/pro
 .\"
 .\"
 .SH BUGS
-\fBCNews\fP NNTPd and
+\fBCNews\fP NNTPd,
 .BR noffle (1)
-(<= V1.0-pre5) can't handle simultaneous GROUP commands. If you run into
+(<= V1.0-pre5) and
+.BR NewsCache
+(<= V1.1.91) can't handle simultaneous GROUP commands. If you run into
 trouble with any of the mentioned servers define
 NUM_SIMULTANEOUS_GROUP_COMMAND to 1 in active.c and recompile. See also
 the TODO-file which comes with the source.
+.br
+Before mailing a bug-report to <tin\-bugs@tin.org> please check if you
+are using the latest (stable) release, and if not, please upgrade
+first! Have a look a the doc/TODO file for known bugs. If you still
+think you've found a bug, please use the \fBBugReport\fP ('\fBR\fP')
+function and write in English. Please do NOT enclose a core-file in
+your bugreport until we request it.
 .\"
 .\"
 .SH HISTORY
@@ -3187,81 +3261,8 @@ for
 and
 .BR vsnprintf (3)
 fallbacks.
-.IP "Mark Tomlinson"
-for originally porting \fBtin\fP to the AmigaOS operating system.
 .IP "Andrew Greer"
 for originally porting \fBtin\fP to the VAX/VMS operating system.
-.PP
-I wish to thank the following people for supplying patches:
-.PP
-David Abbott, Earle Ake, Russ Allbery, Matt Anton, Orbby S. Arka,
-Joachim Astel, Anton Aylward, Mark Ayzenshteyn, Jens Chr. Bachem,
-George Baltz, Dieter Baron, Volker Barthelmann, Kirk Bauer, Paul
-Bauwens, Dieter Becker, Wolfgang Behrens, Fabrice Bellet, Greg
-Berigan, Enrik Berkhan, Juergen Bernau, Dan Berry, Michael Bienia,
-David Binderman, Andrey Blochintsev, Chris Blum, Fokke de Boer,
-Andreas Borchert, Sebastian Bork, Mark Boucher, Robert Brady, Bill
-Brolik, Herman ten Brugge, Martin Buck, Jeremy Buhler, Leila
-Burrell-Davis, Sean Casey, Peter Castro, Troy Cauble, Andrey A.
-Chernov, Albert Chin-A-Young, Park Chong-Dae, Tan Kwee Chuan,
-Boleslaw Ciesielski, Robert Claeson, Steven Cogswell, Don Costello,
-Joshua Crawford, Bryan Curnutt, Ned Danieley, Lars Dannenberg, Chris
-Davies, John Davis, Borislav Deianov, Thomas E. Dickey, Martin
-Dickopp, Olaf Dietrich, Herbert Martin Dietze, Theo Van Dinter, Ralf
-Doeblitz, Bryan Dongray, Michael Douglass, Nickolay Dudorov, Craig
-Durland, Bernd Eckenfels, Phil Edge, Kirk Edson, Nick Efthymiou,
-Stefan Elf, Nigel Ellis, L. Scott Emmons, Rob Engle, Olle Eriksson,
-Brent Ermlick, Bernd Ernesti, Ragnar Hojland Espinosa, Jason
-Faultless, Michael Faurot, Werner Fleck, John M. Flinchbaugh, Andy
-Gabor, Christian Garbs, Torsten Gesang, Ruediger Geys, Callum Gibson,
-Mike Glendinning, Igor Goryachev, Philippe Goujard, Dan Greenspan,
-Karlo Gross, Carl Hage, Piers Haken, Paul Halsema, Ed Hanway, Scott
-Hauck, Christian Haul, James Hawtin, Per Headland, Arnold Hendriks,
-Daniel Hermans, Jose Herrero, Dave Hill, Tom Hite, Torsten Homeyer,
-Ulli Horlacher, Keith Howell, Tommy Hsieh, Shih-Kun Huang, Steve
-Hunt, Jeff Hurwitt, Jeon Hyoung-Jo, Pieter Immelman, Jarkko
-Isokungas, Patrick St. Jean, Hal Jespersen, Park Sang Jin, Robbin
-Johnson, Jarkko Jormanainen, Yury July, Nelson Kading, Geoffrey
-Keating, Karsten Keil, Charles S. Kerr, Fritz Kleeman, Andreas Kies,
-Janne Kiviluoto, Tomasz Kloczko, Dwarven Knight, Thomas Koenig,
-Karl-Koenig Koenigsson, Martin Kraemer, Gerald Krause, Thomas
-Kroener, Florian Kuehnert, Bernd Kuemmerlen, Kris Kugel, Stephan
-Kulow, Manoj Kumar, Dawid Kuroczko, Yuri Kuzmenko, Olivier Lacroix,
-Geoff Lane, Alex Lange, Alain Lasserre, Stanislav Latishko, Hannu
-Laurila, Yen-Ming Lee, Vincent Lefevre, Alexander Lehmann, Marty
-Leisner, Thomas Leitner, Hakan Lennestal, Kevin Lentin, Chua Choon
-Leong, Chris Lewis, Andreas Ley, David-Michael Lincke, Otto Lind,
-Richard Lloyd, Florian Lohoff, Reinhard Luebke, Clifford Luke,
-Michael Lupp, David MacKenzie, Hugh Mahon, Giuseppe De Marco, Scott
-Marovich, Dmitri A. Martynoff, Kazushi Marukawa, Timur Maryin,
-William McBrine, Owen Medd, Philipp Mergenthaler, Andreas Metzler,
-Arkadiusz Miskiewicz, Soren Moller, Bruce Momjian, Sergio Morales,
-Michael Morrell, Klaus Mueller, Mike Muise, Udo Munk, John R. Myers,
-Daniel Naber, Torsten Neumann, Dirk Nimmich, James Nugen, David E.
-O'Brien, Michael O'Reilly, Oleg Ohotnikov, Ronald Orr, Julien Oster,
-Guido Ostkamp, Philip Paeps, Jeb Palmer, Neil Parker, Joseph
-Parmelee, Tom Parry, Jim Patterson, Sven Paulus, Walter Pelissero,
-Cameron Perkins, Colin Perkins, Eric Peterson, Tim Pierce, Bill
-Poitras, Scott W. Powers, Wolfgang Prediger, Marc Prud'hommeaux,
-GianPiero Puccioni, Thomas Quinot, Stefan Rapp, Martin Reising, Kyle
-Rhorer, Ted Richards, Steve Robbins, Ollivier Robert, Branden
-Robinson, Jim Robinson, Thomas Roessler, Erik van Roode, Meelis Roos,
-Stephen Roseman, Roland Rosenfeld, Peter Van Rossem, Clifton Royston,
-Juergen Salk, Rich Salz, Gary Sanders, Nickolay Saukh, John Sauter,
-Christopher Sawtell, Holger Schif, Volker Schmidt, John Schmitz,
-Torsten Schneider, Stefan Scholl, Rainer Scholz, Juergen Schroeder,
-Larry Schwimmer, Randy Scott, Bart Sears, Karl-Olav Serrander, Doug
-Sewell, Philip Shearer, Jungshik Shin, Sergey Shkonda, Andreas
-Siegert, Mark Smith, Toomas Soome, Steve Spearman, Helmut Springer,
-Cliff Stanford, Steve Starck, Jason Steiner, Ralf Stephan, Michael
-Stenns, Helmrich Streitmatter, Hans Werner Strube, Dieter Stueken, Ed
-Sznyter, Lech Szychowski, Dean Takemori, Darrell Tangman, Derek
-Terveer, Carsten Theis, Julian Thompson, David Tiller, Andry Timonin,
-Mark Tomlin, Michael Traub, Mark Trumbull, Alex Vasylenko, Michael
-Velten, Adri Verhoef, Paul Vickers, Corinna Vinschen, Oliver B.
-Warzecha, Jason Wessel, Cary Whitney, Henrik Wist, Greg Woods,
-Andreas Wrede, Lloyd Wright, Jens Wuepper, Billy Y., Hideaki
-Yoshfuji, Nickolai Zeldovich, Zbigniew Zych
 .\"
 .\"
 .SH AUTHOR
@@ -3303,6 +3304,7 @@ Urs Janssen <urs@tin.org>
 .BR pcre (3),
 .BR pcrepattern (3),
 .BR snprintf (3),
+.BR strftime (3),
 .BR vsnprintf (3),
 .BR wildmat (3),
 .BR environ (5),
@@ -3320,3 +3322,4 @@ Urs Janssen <urs@tin.org>
 .BR RFC2048 ,
 .BR RFC2822 ,
 .BR RFC2980
+.\" .BR RFC3977
diff -Nurp tin-1.6.2/doc/tin.5 tin-1.8.0/doc/tin.5
--- tin-1.6.2/doc/tin.5	2003-08-15 21:21:20.000000000 +0200
+++ tin-1.8.0/doc/tin.5	2005-12-02 11:58:44.314622162 +0100
@@ -2,10 +2,21 @@
 .\" Module    : tin.5
 .\" Author    : U. Janssen
 .\" Created   : 2000-07-10
-.\" Updated   : 2003-08-10
+.\" Updated   : 2005-09-14
 .\" Notes     : needs a some work
 .\"
-.TH tin 5 "August 10th, 2003" "1.6.2" "A Usenet newsreader"
+.\" Macros
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\"
+.TH tin 5 "December 2nd, 2005" "1.8.0" "A Usenet newsreader"
 
 .SH NAME
 tin, rtin \- related files
@@ -18,15 +29,15 @@ newsreader.
 
 .SH FILES
 .\" TODO: mention
-.\" ${TIN_HOMEDIR-"$HOME"}/dead.article
-.\" ${TIN_HOMEDIR-"$HOME"}/dead.articles
-.\" ${TIN_HOMEDIR-"$HOME"}/.article[.$$]
-.\" ${TIN_HOMEDIR-"$HOME"}/.cancel[.$$]
-.\" ${TIN_HOMEDIR-"$HOME"}/.letter[.$$]
+.\" ${TIN_HOMEDIR\-"$HOME"}/dead.article
+.\" ${TIN_HOMEDIR\-"$HOME"}/dead.articles
+.\" ${TIN_HOMEDIR\-"$HOME"}/.article[.$$]
+.\" ${TIN_HOMEDIR\-"$HOME"}/.cancel[.$$]
+.\" ${TIN_HOMEDIR\-"$HOME"}/.letter[.$$]
 .PP
 .IR $MAILCAPS
 .br
-.IR ${TIN_HOMEDIR-"$HOME"}/.mailcap
+.IR ${TIN_HOMEDIR\-"$HOME"}/.mailcap
 .br
 .IR /etc/mailcap
 .br
@@ -49,7 +60,7 @@ Each individual mailcap entry consists o
 command to execute, and (possibly) a set of optional "flag" values.
 .sp
 The "type" field is simply any legal content type name. It is the string
-that will be matched against the "Content-Type" header to decide if this is
+that will be matched against the "Content\-Type" header to decide if this is
 the mailcap entry that matches the current message. Additionally, the type
 field may specify a subtype or a wildcard to match all subtypes.
 .sp
@@ -66,7 +77,7 @@ message. If it contains "%t", those two 
 content-type field, including the subtype, if any. If it contains "%{"
 followed by a parameter name and a closing "}", then all those characters
 will be replaced by the value of the named parameter, if any, from the
-Content-Type header. Finally, if the field contains "\\%", those two
+Content\-Type header. Finally, if the field contains "\\%", those two
 characters will be replaced by a single "%" character.
 .\"
 .\" Two special codes can appear in the viewing command for objects of type
@@ -85,16 +96,16 @@ support mail composing agents that suppo
 of mail using external composing agents. As with the view-command, the
 semantics of program execution are operating system dependent. The result of
 the composing program may be data that is not yet suitable for mail
-transport - that is, a Content-Transfer-Encoding may need to be applied to
+transport - that is, a Content\-Transfer\-Encoding may need to be applied to
 the data.
 .TP
 .B composetyped
 The "composetyped" field is similar to the "compose" field, but is to be
-used when the composing program needs to specify the Content-Type header
+used when the composing program needs to specify the Content\-Type header
 field to be applied to the composed data. The "compose" field is simpler,
 and is preferred for use with existing (non-mail-oriented) programs for
 composing data in a given format. The "composetyped" field is necessary when
-the Content-Type information must include auxiliary parameters, and the
+the Content\-Type information must include auxiliary parameters, and the
 composition program must then know enough about mail formats to produce
 output that includes the mail type information.
 .TP
@@ -120,7 +131,7 @@ since a test can call a program, it can 
 .TP
 .B needsterminal
 The "needsterminal" field indicates that the view-command must be run on an
-interactive terminal. This is needed to inform window- oriented user agents
+interactive terminal. This is needed to inform window-oriented user agents
 that an interactive terminal is needed. (The decision is not left
 exclusively to the view-command because in some circumstances it may not be
 possible for such programs to tell whether or not they are on interactive
@@ -150,8 +161,8 @@ will be in that form after decoding. In 
 if there is line-oriented data of some type other than text/* or non-line-
 oriented data that is a subtype of text.
 .TP
-.B x11-bitmap
-The "x11-bitmap" field names a file, in X11 bitmap (xbm) format, which
+.B x11\-bitmap
+The "x11\-bitmap" field names a file, in X11 bitmap (xbm) format, which
 points to an appropriate icon to be used to visually denote the presence of
 this kind of data.
 .TP
@@ -176,9 +187,9 @@ Example:
 image/*;\\
 .br
 .in +.3i
-xv -8 -geometry +0 '%s';\\
+xv \-8 \-geometry +0 '%s';\\
 .br
-description=%{name} %t-Image;\\
+description=%{name} %t\-Image;\\
 .br
 test=test "$DISPLAY" \\
 .br
@@ -188,15 +199,15 @@ nametemplate=%s.IMAGE
 message/rfc822;\\
 .br
 .in +.3i
-if test -x /usr/bin/less \\;\\
+if test \-x /usr/bin/less \\;\\
 .in +.3i
 then less '%s' \\;\\
 else more '%s' \\; fi;\\
 .in -.3i
 .br
-edit=${EDITOR-vi} '%s';\\
+edit=${EDITOR\-vi} '%s';\\
 .br
-compose=${EDITOR-vi} '%s';\\
+compose=${EDITOR\-vi} '%s';\\
 .br
 print=a2ps %s;\\
 .br
@@ -211,20 +222,20 @@ needsterminal
 .sp
 .RS
 default NNTP-server to read news from if not reading from the local spool.
-\&'\fB-g\fP \fIserver\fR', $\fBNNTPSERVER\fP and a given default at compile
-time have higher priority (in that order) and override any server
-specified \fI/etc/nntpserver\fR.
+\&'\fB\-g\fP \fIserver\fR', $\fBNNTPSERVER\fP have higher priority (in
+that order), the default server given at compile time has lower
+priority.
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.cancelsecret
+.IR ${TIN_HOMEDIR\-"$HOME"}/.cancelsecret
 .sp
 .RS
 secret to be used for canlocks
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.mime.types
+.IR ${TIN_HOMEDIR\-"$HOME"}/.mime.types
 .br
 .IR /etc/mime.types
 .br
@@ -235,7 +246,7 @@ mime type / filename extension pairs
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.newsauth
+.IR ${TIN_HOMEDIR\-"$HOME"}/.newsauth
 .sp
 .RS
 "\fInntpserver\fR \fIpassword\fR [\fIuser\fR]" pairs for NNTP servers
@@ -264,10 +275,10 @@ news.example.net  news      guest
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.newsrc
+.IR ${TIN_HOMEDIR\-"$HOME"}/.newsrc
 .sp
 .RS
-"\fInewsgroup\fR\fIflag\fR [\fIarticle\fR[,\fIarticle\fR | -\fIarticle\fR]...]" lines.
+"\fInewsgroup\fR\fIflag\fR [\fIarticle\fR[,\fIarticle\fR | \-\fIarticle\fR]...]" lines.
 .TP
 .B newsgroup
 the name of the newsgroup.
@@ -283,67 +294,67 @@ Example:
 .RS
 # sample .newsrc file
 .br
-news.software.b! 1-666,669
+news.software.b! 1\-666,669
 .br
-news.software.nntp: 1-13245,13247,13249
+news.software.nntp: 1\-13245,13247,13249
 .br
-news.software.readers: 1-19567,19571-19597
+news.software.readers: 1\-19567,19571\-19597
 .RE
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/$NNTPSERVER${NNTPPORT+":$NNTPPORT"}/.oldnewsrc
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/$NNTPSERVER${NNTPPORT+":$NNTPPORT"}/.oldnewsrc
 .sp
 .RS
-backup of \fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR
+backup of \fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.signature
+.IR ${TIN_HOMEDIR\-"$HOME"}/.signature
 .br
-.IR ${TIN_HOMEDIR-"$HOME"}/.Sig
+.IR ${TIN_HOMEDIR\-"$HOME"}/.Sig
 .sp
 .RS
 signature
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.sigfixed
+.IR ${TIN_HOMEDIR\-"$HOME"}/.sigfixed
 .sp
 .RS
 fixed part of a randomly generated signature
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/.inputhistory
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/.inputhistory
 .sp
 .RS
 history of last used strings
 .RE
 .PP
 
-.IR ${TIN_INDEX_MAILDIR-"${TIN_HOMEDIR-"$HOME"}/.tin"}/.mail/
+.IR ${TIN_INDEX_MAILDIR\-"${TIN_HOMEDIR\-"$HOME"}/.tin"}/.mail/
 .sp
 .RS
 mailgroups index files
 .RE
 .PP
 
-.IR ${TIN_INDEX_NEWSDIR-"${TIN_HOMEDIR-"$HOME"}/.tin"}/.news/
+.IR ${TIN_INDEX_NEWSDIR\-"${TIN_HOMEDIR\-"$HOME"}/.tin"}/.news${NNTPSERVER+"\-$NNTPSERVER"}/
 .sp
 .RS
 newsgroups index files
 .RE
 .PP
 
-.IR ${TIN_INDEX_SAVEDIR-"${TIN_HOMEDIR-"$HOME"}/.tin"}/.save/
+.IR ${TIN_INDEX_SAVEDIR\-"${TIN_HOMEDIR\-"$HOME"}/.tin"}/.save/
 .sp
 .RS
 saved newsgroups index files
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/active.mail
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/active.mail
 .sp
 .RS
 active file ("\fImail_group_name\fR \fImaxnum\fR \fIminnum\fR
@@ -377,24 +388,24 @@ They are accessed via /home/foo/Mail/inb
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/active.save
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/active.save
 .sp
 .RS
-active file of user's saved newsgroups, used by \fBtin -R\fP.
+active file of user's saved newsgroups, used by \fBtin \-R\fP.
 .RE
 .PP
 
 .\" tin uses inns old (pre 2.x) Path convention.
 .\" as with inn >= 2.2.x getting more and more popular
 .\" we should think about checking for the new Paths (/news/etc/)
-.\" ${TIN_LIBDIR-/news/etc"}/attributes
+.\" ${TIN_LIBDIR\-/news/etc"}/attributes
 .IR /etc/tin/attributes
 .br
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/attributes
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/attributes
 .sp
 .RS
 The group attributes files may be used to override some global settings from
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/tinrc\fR on a per group basis. Order is
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/tinrc\fR on a per group basis. Order is
 important as last match counts; this allows to refine attributes for
 narrowed scopes. Note that the \fIscope=<grouplist>\fR line has to be
 specified before the attributes are specified for that list. All attributes
@@ -429,8 +440,12 @@ be asked whether to delete the post-proc
 processing of marked articles using \fBGroupAutoSave\fP
 ('\fBS\fP') will suppress prompting.
 .TP
+.B fcc
+Mailbox to save sent mails. The format of the mailbox is controlled
+via the tinrc \fBmailbox_format\fP variable.
+.TP
 .B followup_to
-Set ''Followup-To:''-header to the specified group(s).
+Set ''Followup\-To:''-header to the specified group(s).
 .TP
 .B from
 Identical to the tinrc variable \fBmail_address\fP
@@ -442,6 +457,21 @@ Identical to the tinrc variable \fBdefau
 Used when a group is a mailing list. All responses to the group will be
 directed to this email address instead
 .TP
+.B mime_forward
+Determines whether usenet articles are forwarded as attachment or
+inline. When set to OFF, the forwarded article will be included in
+the body of the mail, while setting this variable to ON will cause
+the article to be attached as a separate MIME part. Enabling
+\fBmime_forward\fP is particularly useful for articles consisting of
+multiple MIME parts such as PGP/MIME signed messages or being encoded
+in a different character set than your local one. It is also useful
+if the receiver should be able to operate on the entire forwarded
+article (i.e., view or save it without your comments). On the other
+hand, if you want to forward only some parts of the article or to
+insert 'inline' annotations, you might want to disable this option.
+Please note that for this option to have effect, the tinrc variable
+\fBinteractive_mailer\fP has to be set to 0 (which is the default).
+.TP
 .B mime_types_to_save
 A comma separated list of MIME major/minor Content-Types that will be
 saved when using the view/save and save/autosave features.
@@ -474,6 +504,9 @@ Identical to the tinrc variable \fBdefau
 .B show_author
 Identical to the tinrc variable of the same name
 .TP
+.B show_info
+Identical to the tinrc variable of the same name
+.TP
 .B show_only_unread
 Identical to the tinrc variable of the same name
 .TP
@@ -492,23 +525,28 @@ Identical to the tinrc variable of the s
 .B thread_arts
 Identical to the tinrc variable \fBthread_articles\fP
 .TP
+.B thread_perc
+Identical to the tinrc variable \fBthread_perc\fP
+.TP
 .B x_body
 A piece of text that will be added at the start of a message body. If this
 string starts with a / or ~ then it is assumed to be the name of a file
 containing the text to insert.
 .TP
 .B x_comment_to
-Insert ''X-Comment-To:''-header, this is only useful in FIDO groups.
+Insert ''X\-Comment\-To:''-header, this is only useful in FIDO groups.
 .TP
 .B x_headers
 A string including header-name and the contents of the header that will
 be automatically added when posting. If the string starts with a / or ~
-then it is assumed to be the name of a file containing the header and it's
-content to be inserted.
+then it is assumed to be the name of a file containing the header and its
+content to be inserted. If the string starts with a ! then what follows
+is assumed to be the path to a program to be executed to generate the
+header and its content.
 .TP
 .B quick_kill_scope
 A comma-separated list of newsgroup patterns (wildmat-style) to which
-groups the filter rule added by \fBGroupQuickKill\fP will be applied.
+groups the filter rule added by \fBQuickFilterKill\fP will be applied.
 If unset the default from the tinrc variable
 \fBdefault_filter_kill_global\fP will be used.
 .TP
@@ -523,7 +561,7 @@ Identical to the tinrc variable \fBdefau
 .TP
 .B quick_select_scope
 A comma-separated list of newsgroup patterns (wildmat-style) to which
-groups the filter rule added by \fBGroupQuickAutoSel\fP will be
+groups the filter rule added by \fBQuickFilterSelect\fP will be
 applied. If unset the default from the tinrc variable
 \fBdefault_filter_select_global\fP will be used.
 .TP
@@ -539,7 +577,7 @@ Identical to the tinrc variable \fBdefau
 .B ispell
 Path and options for
 .BR ispell (1)-like
-spell-checker, e.g. "aspell --mode=email --dont-backup check"
+spell-checker, e.g. "aspell \-\-mode=email \-\-dont\-backup check"
 .TP
 .B mm_network_charset
 Identical to the tinrc variable of the same name
@@ -551,31 +589,31 @@ with working
 .BR iconv (3),
 others might have to compile
 .BR tin (1)
-with --disable-mime-strict-charset.
+with \-\-disable\-mime\-strict\-charset.
 .PP
 .TP
 Example:
 .RS
 .nf
 # include extra headers
-# assume ISO-8859-1 as charset if no charset is declared
+# assume ISO\-8859\-1 as charset if no charset is declared
 scope=*
 x_headers=~/.tin/headers
-undeclared_charset=ISO-8859-1
+undeclared_charset=ISO\-8859\-1
 
 # in *sources* set post process type to shar only
 scope=*sources*
 post_proc_type=1
 
 # in *binaries* turn on full post processing,
-# remove tmp files and set Followup-To: poster
+# remove tmp files and set Followup\-To: poster
 scope=*binaries*
 post_proc_type=2
 delete_tmp_files=ON
 followup_to=poster
 
 # in fido.* newsgroups change quote_chars
-# and add X-Comment-To: line
+# and add X\-Comment\-To: line
 scope=fido.*
 quote_chars=%s>_
 x_comment_to=ON
@@ -583,19 +621,19 @@ x_comment_to=ON
 # in *.test newsgroups, don't append signature
 # and preset Subject
 scope=*.test
-sigfile=--none
-x_headers=Subject: test - ignore - no reply
+sigfile=\-\-none
+x_headers=Subject: test \- ignore \- no reply
 
-# assume ISO-2022-JP-2 as charset
+# assume ISO\-2022\-JP\-2 as charset
 scope=fj.*,japan.*
-undeclared_charset=ISO-2022-JP-2
+undeclared_charset=ISO\-2022\-JP\-2
 .fi
 .RE
 .RE
 .PP
 
 .\" TODO: add missing descriptions and explain things in detail.
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/filter
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/filter
 .sp
 .RS
 The filter file is used to assign scores to certain articles. Based on the
@@ -628,18 +666,18 @@ Match against ''Subject:''
 Match against ''From:''.
 .BR tin (1)
 converts the contents of the ''From:''-header to an old style e-mail address,
-i.e. ''some@body.example (John Doe)'' instead
+e.g. ''some@body.example (John Doe)'' instead
 of ''John Doe <some@body.example>'', before trying to match the patterns in
 the filter rule.
 .TP
 .B msgid
-Match against ''Message-ID:'' and full ''References:''
+Match against ''Message\-ID:'' and full ''References:''
 .TP
 .B msgid_last
-Match against ''Message-ID:'' and last ''References:'' entry only
+Match against ''Message\-ID:'' and last ''References:'' entry only
 .TP
 .B msgid_only
-Match against ''Message-ID:''
+Match against ''Message\-ID:''
 .TP
 .B refs_only
 Match against ''References:''
@@ -654,7 +692,7 @@ Match against ''From:''-address parser r
 .B xref
 Match against ''Xref:''-line. Before any matching is done the line is
 turned into the same format ''Newsgroups:'' has that is it is turned
-into a comma separated newsgoup list with all other informations (i.e
+into a comma separated newsgoup list with all other informations (i.e.
 the article counter) removed.
 .TP
 .B time
@@ -670,67 +708,76 @@ group=*
 type=1
 case=1
 score=hot
-subj=\\b(cd|[rk]?)?tin(d|pre)?[-.0-9]*\\b
+subj=\\b(cd|[rk]?)?tin(d|pre)?[\-.0\-9]*\\b
 .fi
 .RE
 .RE
 .PP
 
-.IR /etc/tin/keymap${${LC_ALL-"${LC_CTYPE-"${LC_MESSAGES-"$LANG"}"}"}:+".${LC_ALL-"${LC_CTYPE-"${LC_MESSAGES-"$LANG"}"}"}"}
+.\"
+.\" TODO: mention THREAD_EDIT_FILTER and SELECT_EDIT_FILTER
+.IR /etc/tin/keymap${${LC_ALL\-"${LC_CTYPE\-"${LC_MESSAGES\-"$LANG"}"}"}:+".${LC_ALL\-"${LC_CTYPE\-"${LC_MESSAGES\-"$LANG"}"}"}"}
 .br
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/keymap${${LC_ALL-"${LC_CTYPE-"${LC_MESSAGES-"$LANG"}"}"}:+".${LC_ALL-"${LC_CTYPE-"${LC_MESSAGES-"$LANG"}"}"}"}
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/keymap${${LC_ALL\-"${LC_CTYPE\-"${LC_MESSAGES\-"$LANG"}"}"}:+".${LC_ALL\-"${LC_CTYPE\-"${LC_MESSAGES\-"$LANG"}"}"}"}
 .\" sorry that one got a bit complex ,-)
 .sp
 .RS
-Keymap-file, containing "\fIkeyname\fR \fIvalue\fR" pairs.
-Below is a list of all keynames and their default bindings.
+Keymap-file, containing "\fIkeyname\fR \fIvalue\fR \fI[value]\fR" pairs
+seperated by spaces or tabs.  Below is a list of all rebindable keynames and
+their defaults. If a keynames is bound to NULL it is unassigned.
 .sp
 .nf
-.ta \w'GroupSelThdIfUnreadSelected    'u +\w'SPACE'u
+.ta \w'GroupSelThdIfUnreadSelected    'u +\w'SPACE'u +\w'SPACE'u
 \fBPageDown3\fP	SPACE
 \fBShellEscape\fP	!
 \fBSetRange\fP	#
 \fBLastPage\fP	$
 \fBToggleColor\fP	&
-\fBLastViewed\fP	-
+\fBLastViewed\fP	\-
+\fBSearchRepeat\fP	\\
 \fBSearchSubjF\fP	/
 \fBSearchSubjB\fP	?
 \fBSearchAuthB\fP	A
 \fBSearchBody\fP	B
-\fBSearchRepeat\fP	\\
+\fBCatchupNextUnread\fP	C
+\fBEditFilter\fP   E
 \fBToggleHelpDisplay\fP	H
 \fBToggleInverseVideo\fP	I
 \fBLookupMessage\fP	L
 \fBOptionMenu\fP	M
-\fBPostponed2\fP	O
+\fBPostponed\fP	O	^O
 \fBQuitTin\fP	Q
+\fBBugReport\fP   R
 \fBDisplayPostHist\fP	W
+\fBMarkThrUnread\fP   Z
 \fBFirstPage\fP	^
 \fBSearchAuthF\fP	a
-\fBPageUp3\fP	b
+\fBCatchup\fP	c
 \fBHelp\fP	h
 \fBToggleInfoLastLine\fP	i
-\fBDown2\fP	j
-\fBUp2\fP	k
+\fBDown\fP	j	^N
+\fBUp\fP	k	^P
 \fBPrint\fP	o
 \fBQuit\fP	q
 \fBVersion\fP	v
 \fBPost\fP	w
+\fBMarkArtUnread\fP      z
+\fBQuickFilterSelect\fP	[
+\fBQuickFilterKill\fP	]
 \fBPipe\fP	|
-\fBPageUp\fP	^B
-\fBPageDown\fP	^D
-\fBPageDown2\fP	^F
+\fBScrollUp\fP	<
+\fBScrollDown\fP	>
+\fBPageUp\fP	b	^B	^U
+\fBPageDown\fP	^D	^F
 \fBRedrawScr\fP	^L
-\fBDown\fP	^N
 \fBPostponed\fP	^O
-\fBUp\fP	^P
-\fBPageUp2\fP	^U
+\fBMenuFilterSelect\fP	^A
+\fBMenuFilterKill\fP	^K
 .sp
-\fBConfigSelect\fP	^J
-\fBConfigSelect2\fP	^M
-\fBConfigLastPage2\fP	G
+\fBConfigSelect\fP	^J	^M
+\fBConfigLastPage\fP	G
 \fBConfigNoSave\fP	Q
-\fBConfigFirstPage2\fP	g
+\fBConfigFirstPage\fP	g
 .sp
 \fBFeedTag\fP	T
 \fBFeedArt\fP	a
@@ -743,32 +790,22 @@ Below is a list of all keynames and thei
 \fBFilterEdit\fP	e
 \fBFilterSave\fP	s
 .sp
-\fBGroupAutoSel\fP	^A
 \fBGroupNextUnreadArtOrGrp\fP	TAB
-\fBGroupReadBasenote\fP	^J
-\fBGroupKill\fP	^K
-\fBGroupReadBasenote2\fP	^M
+\fBGroupReadBasenote\fP	^J	^M
 \fBGroupSelThd\fP	*
 \fBGroupDoAutoSel\fP	+
 \fBGroupToggleThdSel\fP	.
 \fBGroupSelThdIfUnreadSelected\fP	;
 \fBGroupSelPattern\fP	=
 \fBGroupReverseSel\fP	@
-\fBGroupCatchupNextUnread\fP	C
-\fBGroupEditFilter\fP	E
 \fBGroupToggleGetartLimit\fP	G
 \fBGroupMarkThdRead\fP	K
 \fBGroupNextUnreadArt\fP	N
 \fBGroupPrevUnreadArt\fP	P
-\fBGroupBugReport\fP	R
 \fBGroupAutoSave\fP	S
 \fBGroupTagParts\fP	T
 \fBGroupUntag\fP	U
 \fBGroupMarkUnselArtRead\fP	X
-\fBGroupMarkThdUnread\fP	Z
-\fBGroupQuickAutoSel\fP	[
-\fBGroupQuickKill\fP	]
-\fBGroupCatchup\fP	c
 \fBGroupToggleSubjDisplay\fP	d
 \fBGroupGoto\fP	g
 \fBGroupListThd\fP	l
@@ -780,25 +817,16 @@ Below is a list of all keynames and thei
 \fBGroupTag\fP	t
 \fBGroupToggleThreading\fP	u
 \fBGroupRepost\fP	x
-\fBGroupMarkArtUnread\fP	z
 \fBGroupUndoSel\fP	~
 .sp
-\fBHelpLastPage2\fP	G
-\fBHelpFirstPage2\fP	g
+\fBHelpLastPage\fP	G
+\fBHelpFirstPage\fP	g
 .sp
-\fBNrctblCreate\fP	c
-\fBNrctblDefault\fP	d
-\fBNrctblAlternative\fP	a
-\fBNrctblQuit\fP	q
-.sp
-\fBPageAutoSel\fP	^A
 \fBPageReplyQuoteHeaders\fP	^E
 \fBPagePGPCheckArticle\fP	^G
 \fBPageToggleHeaders\fP	^H
 \fBPageNextUnread\fP	TAB
-\fBPageNextThd\fP	^J
-\fBPageAutoKill\fP	^K
-\fBPageNextThd2\fP	^M
+\fBPageNextThd\fP	^J	^M
 \fBPageToggleTabs\fP	^T
 \fBPageFollowupQuoteHeaders\fP	^W
 \fBPageToggleTex2iso\fP	"
@@ -808,9 +836,7 @@ Below is a list of all keynames and thei
 \fBPageSkipIncludedText\fP	:
 \fBPageTopThd\fP	<
 \fBPageBotThd\fP	>
-\fBPageCatchupNextUnread\fP	C
 \fBPageCancel\fP	D
-\fBPageEditFilter\fP	E
 \fBPageFollowup\fP	F
 \fBPageLastPage\fP	G
 \fBPageKillThd\fP	K
@@ -821,11 +847,7 @@ Below is a list of all keynames and thei
 \fBPageGroupSel\fP	T
 \fBPageViewUrl\fP	U
 \fBPageViewAttach\fP	V
-\fBPageMarkThdUnread\fP	Z
-\fBPageQuickAutoSel\fP	[
-\fBPageQuickKill\fP	]
 \fBPageToggleHighlight\fP	_
-\fBPageCatchup\fP	c
 \fBPageEditArticle\fP	e
 \fBPageFollowupQuote\fP	f
 \fBPageFirstPage\fP	g
@@ -838,7 +860,6 @@ Below is a list of all keynames and thei
 \fBPageTag\fP	t
 \fBPageGotoParent\fP	u
 \fBPageRepost\fP	x
-\fBPageMarkArtUnread\fP	z
 .sp
 \fBPgpEncSign\fP	b
 \fBPgpEncrypt\fP	e
@@ -854,77 +875,59 @@ Below is a list of all keynames and thei
 \fBPostIgnore\fP	i
 \fBPostMail\fP	m
 \fBPostPostpone\fP	o
-\fBPostPost3\fP	p
+\fBPostPost\fP	p	y
 \fBPostSupersede\fP	s
-\fBPostSend\fP	s
-\fBPostSend2\fP	y
-\fBPostPost2\fP	y
+\fBPostSend\fP	s	y
 .sp
 \fBPostponeOverride\fP	Y
 \fBPostponeAll\fP	A
 .sp
-\fBPromptYes\fP	y
-\fBPromptNo\fP	n
+\fBPromptYes\fP	y	Y
+\fBPromptNo\fP	n	N
 .sp
 \fBSaveAppendFile\fP	a
 \fBSaveOverwriteFile\fP	o
 .sp
-\fBPProcExtractZip\fP	E
-\fBPProcListZip\fP	L
-\fBPProcExtractZoo\fP	e
-\fBPProcListZoo\fP	l
-\fBPProcShar\fP	s
-\fBPProcUUDecode\fP	u
 \fBPProcNone\fP	n
+\fBPProcShar\fP	s
+\fBPProcYes\fP	y
 .sp
-\fBSelectEnterNextUnreadGrp\fP	TAB
-\fBSelectReadGrp\fP	^J
-\fBSelectReadGrp2\fP	^M
+\fBSelectEnterNextUnreadGrp\fP	TAB	n
+\fBSelectReadGrp\fP	^J	^M
 \fBSelectResetNewsrc\fP	^R
 \fBSelectSortActive\fP	.
-\fBSelectCatchupNextUnread\fP	C
 \fBSelectNextUnreadGrp\fP	N
-\fBSelectBugReport\fP	R
 \fBSelectSubscribePat\fP	S
 \fBSelectUnsubscribePat\fP	U
 \fBSelectQuitNoWrite\fP	X
 \fBSelectSyncWithActive\fP	Y
-\fBSelectMarkGrpUnread2\fP	Z
-\fBSelectCatchup\fP	c
 \fBSelectToggleDescriptions\fP	d
 \fBSelectGoto\fP	g
 \fBSelectMoveGrp\fP	m
-\fBSelectEnterNextUnreadGrp2\fP	n
 \fBSelectToggleReadDisplay\fP	r
 \fBSelectSubscribe\fP	s
 \fBSelectUnsubscribe\fP	u
 \fBSelectYankActive\fP	y
-\fBSelectMarkGrpUnread\fP	z
+\fBSelectMarkGrpUnread\fP	z	Z
 .sp
 \fBThreadReadNextArtOrThread\fP	TAB
-\fBThreadReadArt\fP	^J
-\fBThreadReadArt2\fP	^M
+\fBThreadReadArt\fP	^J	^M
 \fBThreadSelArt\fP	*
 \fBThreadToggleArtSel\fP	.
 \fBThreadReverseSel\fP	@
-\fBThreadCatchupNextUnread\fP	C
 \fBThreadMarkArtRead\fP	K
-\fBThreadBugReport\fP	R
 \fBThreadAutoSave\fP	S
 \fBThreadUntag\fP	U
-\fBThreadMarkThdUnread\fP	Z
-\fBThreadCatchup\fP	c
 \fBThreadToggleSubjDisplay\fP	d
 \fBThreadMail\fP	m
 \fBThreadSave\fP	s
 \fBThreadTag\fP	t
-\fBThreadMarkArtUnread\fP	z
 \fBThreadUndoSel\fP	~
 .fi
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/mailgroups
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/mailgroups
 .sp
 .RS
 This file provides short descriptions of each mailgroup. (requires
@@ -940,11 +943,11 @@ is a short single-line description of th
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/newsrctable
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/newsrctable
 .sp
 .RS
 "\fInntpserver\fR \fInewsrc\fR [\fIshortname\fR [\fI...\fR]]"
-pairs to use with the ''\fB-g\fP'' command-line switch.
+pairs to use with the ''\fB\-g\fP'' command-line switch.
 .TP
 .B nntpserver
 full qualified domain name of the newsserver.
@@ -959,21 +962,21 @@ Example:
 .RS
 # sample newsrctable file
 .br
-news.tin.org .newsrc-tin.org tinorg
+news.tin.org .newsrc\-tin.org tinorg
 .br
-news.ka.nu /tmp/nrc-nu kanu nu
+news.ka.nu /tmp/nrc\-nu kanu nu
 .RE
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/posted
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/posted
 .sp
 .RS
 posting history
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/Mail/posted
+.IR ${TIN_HOMEDIR\-"$HOME"}/Mail/posted
 .sp
 .RS
 Copy of all posted articles in
@@ -983,7 +986,7 @@ format. The filename can be changed by s
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/postponed.articles
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/postponed.articles
 .sp
 .RS
 Pool of postponed articles. This file is in
@@ -992,7 +995,25 @@ format.
 .RE
 .PP
 
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/$NNTPSERVER${NNTPPORT+":$NNTPPORT"}/serverrc
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/$NNTPSERVER${NNTPPORT+":$NNTPPORT"}/newsgroups
+.sp
+.RS
+This file a copy of the servers newsgroups file which provides short
+descriptions of each newsgroup. It is automatically updated on startup
+except when using the ''\fB\-X\fP''or ''\fB\-q\fP'' command-line option and
+an old copy exists. Each line consist of two tab-separated fields
+"\fIgroup.name\fR	\fIone-line description\fR".
+.TP
+.B group.name
+is the name of the newsgroup
+.TP
+.B one-line description
+is a short single-line description of the group
+.RE
+.PP
+
+
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/$NNTPSERVER${NNTPPORT+":$NNTPPORT"}/serverrc
 .sp
 .RS
 File to store $\fBNNTPSERVER\fP and $\fBNNTPPORT\fP related
@@ -1013,10 +1034,10 @@ to keep track of new newsgroups on the s
 .\" tin uses inns old (pre 2.x) Path convention.
 .\" as with inn >= 2.2.x getting more and more popular
 .\" we should think about checking for the new Paths (/news/etc/)
-.\" .IR ${TIN_LIBDIR-"/news/etc"}/tinrc
+.\" .IR ${TIN_LIBDIR\-"/news/etc"}/tinrc
 .IR /etc/tin/tinrc
 .br
-.IR ${TIN_HOMEDIR-"$HOME"}/.tin/tinrc
+.IR ${TIN_HOMEDIR\-"$HOME"}/.tin/tinrc
 .sp
 .RS
 At startup,
@@ -1025,8 +1046,8 @@ reads in the configuration file. This co
 "\fIvariable\fR=\fIvalue\fR" pairs that can be used to configure the way
 .BR tin (1)
 works. If it exists, the global configuration file,
-\fI${TIN_LIBDIR}-NEWSLIBDIR}/tinrc\fR is read first. After that, the
-users own configuration file \fI${TIN_HOMEDIR-"$HOME"}/.tin/tinrc\fR is read.
+\fI${TIN_LIBDIR}\-NEWSLIBDIR}/tinrc\fR is read first. After that, the
+users own configuration file \fI${TIN_HOMEDIR\-"$HOME"}/.tin/tinrc\fR is read.
 The global file is useful for distributing system-wide defaults to new
 users who have no private tinrc yet (see also \fB/etc/tin/tin.defaults\fP).
 .TP
@@ -1035,7 +1056,7 @@ If ON add posted articles which start a 
 highlighting follow-ups. Default is ON.
 .TP
 .B advertising
-Turn ON advertising in header (''User-Agent:''). Default is ON.
+Turn ON advertising in header (''User\-Agent:''). Default is ON.
 .TP
 .B alternative_handling
 If ON strip multipart/alternative messages automatically. Default is ON.
@@ -1048,7 +1069,7 @@ The character used to show that an artic
 .TP
 .B art_marked_return
 The character used to show that an article will return as an unread article
-when the group is next entered. Default is '-'.
+when the group is next entered. Default is '\-'.
 .TP
 .B art_marked_selected
 The character used to show that an article/thread is auto-selected (hot).
@@ -1073,12 +1094,12 @@ The character used to show that an artic
 The character used to show that an article was hot before it was read.
 Default is ':'. \fBkill_level\fP must be set accordingly.
 .TP
-.B Ask before using \fBmetamail_prog\fP (ask_for_metamail)
+.B Ask before using MIME viewer (ask_for_metamail)
 If ON
 .BR tin (1)
-will ask before using \fBmetamail_prog\fP
-to display MIME messages. This only occurs if \fBmetamail_prog\fP is set.
-Default is OFF.
+will ask before using a MIME viewer (\fBmetamail_prog\fP) to display
+MIME messages. This only occurs if a MIME viewer is set.  Default is
+OFF.
 .TP
 .B auto_bcc
 If ON automatically put your name in the ''Bcc:'' field when mailing an
@@ -1096,14 +1117,14 @@ Default is ON.
 Reconnect to server automatically. Default is OFF.
 .TP
 .B auto_save
-If ON articles/threads with ''Archive-name:'' in header will be
-automatically saved with the Archive-name & part/patch no and post
+If ON articles/threads with ''Archive\-name:'' in header will be
+automatically saved with the Archive\-name & part/patch no and post
 processed if \fBpost_process_type\fP is set to something other than 'No'.
 Default is OFF.
 .TP
 .B batch_save
 If set ON articles/threads will be saved in batch mode when save
-\&''\fB-S\fP'' or mail ''\fB-M\fP, \fB-N\fP'' is specified on the command
+\&''\fB\-S\fP'' or mail ''\fB\-M\fP, \fB\-N\fP'' is specified on the command
 line. Default is ON.
 .TP
 .B beginner_level
@@ -1151,7 +1172,7 @@ Color of words emphasized like *this*. S
 and \fBword_highlight\fP.
 .TP
 .B col_markstroke
-Color of words emphasized like -this-. See also \fBword_h_display_marks\fP
+Color of words emphasized like \-this\-. See also \fBword_h_display_marks\fP
 and \fBword_highlight\fP.
 .TP
 .B col_minihelp
@@ -1179,6 +1200,9 @@ the article viewer.
 .B col_signature
 Color of signatures
 .TP
+.B col_urls
+Color of urls highlight
+.TP
 .B col_subject
 Color of article subject
 .TP
@@ -1194,7 +1218,7 @@ can ask for manual confirmation to prote
 .in +.5i
 .B commands:
 Ask for confirmation before executing certain dangerous commands (e.g.,
-\fBSelectCatchup\fP ('\fBc\fP')). Commands that this affects are marked in
+\fBCatchup\fP ('\fBc\fP')). Commands that this affects are marked in
 this manual with '[after confirmation]'.
 .\" TODO: check if all affected commands are marked [after confirmation]
 .sp
@@ -1209,12 +1233,16 @@ Ask for confirmation before marking all 
 .in -.5i
 Default is commands & quit.
 .TP
-.B mark_ignore_tags
-When this is ON, the \fBiKeyGroupMarkThdRead\fP,
-\fBiKeyThreadMarkArtRead\fB functions ('\fBK\fP') mark just the
-current article or thread, ignoring other tagged, unread articles.
-When OFF, the same function presents a menu with choices of the
-current thread or article, all tagged, unread articles, or nothing.
+.B date_format
+Format string
+used for date representation. A description of the different format options
+can be found at
+.BR strftime (3).
+.BR tin (1).
+uses
+.BR strftime (3)
+when available and supports most format options in his fallback code.
+Default is "%a, %d %b %Y %H:%M:%S".
 .TP
 .B default_art_search
 .TP
@@ -1251,11 +1279,11 @@ Default for quick (1 key) kill filter he
 .IP 2,3
  ''From:''
 .IP 4
- ''Message-ID:'' & full ''References:'' line
+ ''Message\-ID:'' & full ''References:'' line
 .IP 5
- ''Message-ID:'' & last ''References:'' entry only
+ ''Message\-ID:'' & last ''References:'' entry only
 .IP 6
- ''Message-ID:'' entry only
+ ''Message\-ID:'' entry only
 .IP 7
  ''Lines:''
 .RE
@@ -1280,11 +1308,11 @@ Default for quick (1 key) auto-selection
 .IP 2,3
  ''From:''
 .IP 4
- ''Message-ID:'' & full ''References:'' line
+ ''Message\-ID:'' & full ''References:'' line
 .IP 5
- ''Message-ID:'' & last ''References:'' entry only
+ ''Message\-ID:'' & last ''References:'' entry only
 .IP 6
- ''Message-ID:'' entry only
+ ''Message\-ID:'' entry only
 .IP 7
  ''Lines:''
 .RE
@@ -1302,16 +1330,16 @@ format. This feature is mainly for use w
 .BR elm (1)
 mail program. It allows the user to save articles/threads/groups simply
 by giving '=' as the filename to save to. Default is
-\fI${TIN_HOMEDIR-"$HOME"}/Mail\fR.
+\fI${TIN_HOMEDIR\-"$HOME"}/Mail\fR.
 .TP
 .B default_mailer_format
 The format string used to create the mailer command with parameters that is
-used for mailing articles to other people. Default is '%M "%T" < %F' (i.e.,
+used for mailing articles to other people. Default is '%M "%T" < %F' (e.g.,
 /bin/mail "iain" < .article). The flexible format allows other mailers with
-different command line parameters to be used such as 'elm -s "%S" "%T" <
-"%F"' (i.e., elm -s "subject" "iain" < .article) or 'sendmail -oem -t < %F'
-(i.e. sendmail -oem -t < .article).
-.\" TODO: document %S, %T, %M, %F...
+different command line parameters to be used such as 'elm \-s "%S" "%T" <
+"%F"' (e.g., elm \-s "subject" "iain" < .article) or 'sendmail \-oem \-t < %F'
+(e.g. sendmail \-oem \-t < .article).
+.\" TODO: document %S, %T, %M, %F, %U ...
 .TP
 .B default_move_group
 .TP
@@ -1347,7 +1375,7 @@ may have been disabled by the System Adm
 .TP
 .B default_savedir
 Directory where articles/threads are saved. Default is
-\fI${TIN_HOMEDIR-"$HOME"}/News\fR.
+\fI${TIN_HOMEDIR\-"$HOME"}/News\fR.
 .TP
 .B default_select_pattern
 .TP
@@ -1361,13 +1389,13 @@ directory. If the path starts with a ! t
 be executed to generate a signature.
 .BR tin (1)
 will pass the name of the current newsgroup as argument to the
-program. --none will suppress any signature.
-Default is \fI${TIN_HOMEDIR-"$HOME"}/.Sig\fR.
+program. \-\-none will suppress any signature.
+Default is \fI${TIN_HOMEDIR\-"$HOME"}/.Sig\fR.
 .TP
 .B default_subject_search
 .TP
 .B draw_arrow
-Allows groups/articles to be selected by an arrow '->' if set ON or by an
+Allows groups/articles to be selected by an arrow '\->' if set ON or by an
 highlighted bar if set OFF.
 .TP
 .B force_screen_redraw
@@ -1401,8 +1429,8 @@ Default is 'No'.
 .B inews_prog
 Path, name and options of external
 .BR inews (1).
-If you are reading via NNTP the default value is "--internal" (use built-in
-NNTP inews), else it is "inews -h". The article is passed to
+If you are reading via NNTP the default value is "\-\-internal" (use built-in
+NNTP inews), else it is "inews \-h". The article is passed to
 \fBinews_prog\fP on STDIN via '< article'.
 .TP
 .B info_in_last_line
@@ -1411,14 +1439,20 @@ If ON, show current group description or
 toggles setting). This facility is useful as the full width of the screen is
 available to display long subjects. Default is OFF.
 .TP
+.B interactive_mailer
+If greater than 0 your mailreader will be invoked earlier for reply so you can
+use more of its features (e.g. MIME, pgp, ...). 1 means include headers, 2
+means don't include headers (old use_mailreader_i=ON option). 0 turns off
+usage. This option has to suit \fBdefault_mailer_format\fP. Default is 0.
+.TP
 .B inverse_okay
 If ON use inverse video for page headers and URL highlighting.
 Default is ON.
 .TP
 .B keep_dead_articles
-If ON keep all failed postings in \fI${TIN_HOMEDIR-"$HOME"}/dead.articles\fR
+If ON keep all failed postings in \fI${TIN_HOMEDIR\-"$HOME"}/dead.articles\fR
 besides keeping the last failed posting in
-\fI${TIN_HOMEDIR-"$HOME"}/dead.article\fR. Default is ON.
+\fI${TIN_HOMEDIR\-"$HOME"}/dead.article\fR. Default is ON.
 .TP
 .B kill_level
 This option controls the processing and display of articles that are
@@ -1462,10 +1496,10 @@ conversion) is performed (i.e., local ch
 .TP
 .B mail_quote_format
 Format of quote line when replying (via mail) to an article (%A=Address,
-%D=Date, %F=Fullname+Address, %G=Groupname, %M=Message-ID, %N=Fullname,
+%D=Date, %F=Fullname+Address, %G=Groupname, %M=Message\-ID, %N=Fullname,
 %C=Firstname, %I=Initials). Default is "In article %M you wrote:"
 .TP
-.B Format of the mailbox (mailbox_format)
+.B mailbox_format
 Select one of the following mailbox-formats: MBOXO (default, except on SCO),
 MBOXRD or MMDF (default on SCO). See
 .BR mbox (5)
@@ -1476,11 +1510,18 @@ for more details about MMDF.
 .B mark_saved_read
 If ON mark articles that are saved as read. Default is ON.
 .TP
-.B Viewer program for MIME articles (metamail_prog)
+.B mark_ignore_tags
+When this is ON, the \fBGroupMarkThdRead\fP, \fBThreadMarkArtRead\fP
+functions ('\fBK\fP') mark just the current article or thread, ignoring
+other tagged, unread articles.  When OFF, the same function presents a menu
+with choices of the current thread or article, all tagged, unread articles,
+or nothing.
+.TP
+.B metamail_prog
 Path, name and options of external
 .BR metamail (1)
 program used to view non-textual parts of articles.
-To use the built-in viewer, set to --internal. This is the default
+To use the built-in viewer, set to \-\-internal. This is the default
 value when
 .BR metamail (1)
 is not installed. Leave it blank if you don't want any automatic
@@ -1537,7 +1578,7 @@ terminal which attributes are usable. Se
 and \fBword_highlight\fP.
 .TP
 .B mono_markstroke
-Character attribute of words emphasized like -this-. It is depending on your
+Character attribute of words emphasized like \-this\-. It is depending on your
 terminal which attributes are usable. See also \fBword_h_display_marks\fP
 and \fBword_highlight\fP.
 .TP
@@ -1550,40 +1591,62 @@ what they are for.
 .B news_headers_to_display
 Which news headers you wish to see. If you want to see _all_ the headers,
 place an '*' as this value. This is the only way a wildcard can be used.
-If you enter 'X-' as the value, you will see all headers beginning
-with 'X-' (like X-Alan or X-Pape). You can list more than one by delimiting
+If you enter 'X\-' as the value, you will see all headers beginning
+with 'X\-' (like X\-Alan or X\-Pape). You can list more than one by delimiting
 with spaces. Not defining anything turns off this option.
 .TP
 .B news_headers_to_not_display
 Same as \fBnews_headers_to_display\fP except it denotes the opposite. An
-example of using both options might be if you thought X- headers were A Good
+example of using both options might be if you thought X\- headers were A Good
 Thing(tm), but thought Alan and Pape were miscreants... well then you would
 do something like this:
-\fBnews_headers_to_display=X-\fP
-\fBnews_headers_to_not_display=X-Alan X-Pape\fP
+\fBnews_headers_to_display=X\-\fP
+\fBnews_headers_to_not_display=X\-Alan X\-Pape\fP
 Not defining anything turns off this option.
 .TP
 .B news_quote_format
 Format of quote line when posting/following up an article (%A=Address,
-%D=Date, %F=Fullname+Address, %G=Groupname, %M=Message-ID, %N=Fullname,
+%D=Date, %F=Fullname+Address, %G=Groupname, %M=Message\-ID, %N=Fullname,
 %C=Firstname, %I=Initials). Default is "%F wrote:".
 .TP
+.B normalization_form
+The normalization form which should be used to normalize unicode input.
+The possible values are:
+.RS +.5i
+.IP 0 3
+\fBNone\fP: no normalization
+.IP 1
+\fBNFKC\fP: Compatibility Decomposition, followed by Canonical Composition
+.IP 2
+\fBNFKD\fP: Compatibility Decomposition
+.IP 3
+\fBNFC\fP: Canonical Decomposition, followed by Canonical Composition
+.IP 4
+\fBNFD\fP: Canonical Decomposition
+.RE
+Some normalization modes are only available if they are supported by the
+library
+.BR tin (1)
+uses to do the normalization. Default is NFKC.
+.TP
 .B pgdn_goto_next
-If ON the Page Down keys will go to the next unread article when pressed at
-the end of a message. Default is ON.
+If ON the \fBPageDown\fP keys will go to the next unread article when
+pressed at the end of a message. Default is ON.
 .TP
 .B pos_first_unread
 If ON put cursor at first unread article in group otherwise at last article.
 Default is ON.
 .TP
 .B post_8bit_header
-Allows 8bit characters unencoded in the header of a news article. Default is
-OFF. Only enacted if \fBpost_mime_encoding\fP is also set to 8bit. In a
-number of local hierarchies where 8bit characters are used, using unencoded
-(raw) 8bit characters in header is acceptable and sometimes even recommended
-so that you need to check the convention adopted in the local hierarchy of
-your interest to determine what to do with this and
-\fBpost_mime_encoding\fP.
+Allows 8bit characters unencoded in the header of a news article, if
+set this also disables the generation of MIME-headers when they are
+usualy required. Default is OFF. Only enacted if
+\fBpost_mime_encoding\fP is also set to 8bit. In a number of local
+hierarchies where 8bit characters are used, using unencoded (raw)
+8bit characters in header is acceptable and sometimes even
+recommended so that you need to check the convention adopted in the
+local hierarchy of your interest to determine what to do with this
+and \fBpost_mime_encoding\fP.
 .TP
 .B post_mime_encoding
 MIME encoding of the body in news message, if necessary. (8bit, base64,
@@ -1616,7 +1679,7 @@ not want to be executed, be careful with
 .TP
 .B posted_articles_file
 Keep posted articles in
-\fI${TIN_HOMEDIR-"$HOME"}/Mail/\fBposted_articles_file\fP\fR.
+\fI${TIN_HOMEDIR\-"$HOME"}/Mail/\fBposted_articles_file\fP\fR.
 If no filename is set then postings will not be saved.
 Default is 'posted'.
 .TP
@@ -1629,7 +1692,7 @@ If ON only save/print/pipe/mail unread a
 Default is OFF.
 .TP
 .B prompt_followupto
-If ON show empty ''Followup-To:'' header when editing an article.
+If ON show empty ''Followup\-To:'' header when editing an article.
 Default is OFF.
 .TP
 .B quote_chars
@@ -1682,8 +1745,12 @@ uses a built-in default.
 If set to 0, this feature is deactivated, otherwise it means the number of
 days. Default is 2.
 .TP
+.B render_bidi
+If ON \fBtin\fP does the rendering of bi-directional text. If OFF \fBtin\fP
+leaves the rendering of bi-directional text to the terminal. Default is OFF.
+.TP
 .B reread_active_file_secs
-The news \fI${TIN_LIBDIR-NEWSLIBDIR}"/"${TIN_ACTIVEFILE-active}\fR file
+The news \fI${TIN_LIBDIR\-NEWSLIBDIR}"/"${TIN_ACTIVEFILE\-active}\fR file
 is reread at regular intervals to show if any new news has arrived. Default
 is 1200. Setting this to 0 will disable this feature.
 .TP
@@ -1730,12 +1797,12 @@ displayed.
 .TP
 .B show_description
 If ON show a short group description text after newsgroup name at the group
-selection level. The ''\fB-d\fP'' command-line flag will override the setting
+selection level. The ''\fB\-d\fP'' command-line flag will override the setting
 and turn descriptions off. The text used is taken from the
-\fI${TIN_LIBDIR-NEWSLIBDIR}/newsgroups\fR file and if supported (requires
+\fI${TIN_LIBDIR\-NEWSLIBDIR}/newsgroups\fR file and if supported (requires
 .BR tin (1)
 to be build with mh-mail-handling support) from
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/mailgroups\fR for mailgroups. Default is ON.
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/mailgroups\fR for mailgroups. Default is ON.
 .TP
 .B show_info
 Which information about the thread or article should be shown. Default is 1,
@@ -1822,10 +1889,10 @@ the default. The following sort types ar
 .RE
 .TP
 .B space_goto_next_unread
-SPACE normally acts as a Page Down key and has no effect at the end of an
-article. If this option is turned ON the SPACE command will go to the next
-unread article when the end of the article is reached (\fBrn\fP (1)-style
-pager).
+SPACE normally acts as a \fBPageDown\fP key and has no effect at the end of
+an article. If this option is turned ON the SPACE command will go to the
+next unread article when the end of the article is reached (\fBrn\fP
+(1)-style pager).
 .TP
 .B spamtrap_warning_addresses
 Set this option to a list of comma-separated strings to be warned if you are
@@ -1850,7 +1917,7 @@ display when reading on a slow terminal 
 .TP
 .B strip_bogus
 Bogus groups are groups that are present in your
-\fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR file that no longer exist on the news
+\fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR file that no longer exist on the news
 server. There are 3 options. 0 means do nothing & always keep bogus groups.
 1 means bogus groups will be permanently removed. 2 means that bogus groups
 will appear on the Group Selection Menu, prefixed with a 'D'. This allows
@@ -1858,7 +1925,7 @@ you to unsubscribe from them as and when
 .TP
 .B strip_newsrc
 If ON, then unsubscribed groups will be permanently removed from
-your \fI${TIN_HOMEDIR-"$HOME"}/.newsrc\fR file. Default is OFF.
+your \fI${TIN_HOMEDIR\-"$HOME"}/.newsrc\fR file. Default is OFF.
 .TP
 .B strokes_regex
 A regular expression that will be applied when reading articles. All
@@ -1882,9 +1949,15 @@ Defines which threading method to use. T
 0) Don't thread, 1) Thread on Subject only 2) Thread on References only,
 3) Thread on References then Subject (default)
 4) Thread multipart articles on Subject.
+5) Thread on Percentage Match of the Subjects
 It's also possible to set the threading type on a per group basis by setting
-the group attribute variable \fBthread_arts\fP to 0 - 4 in the file
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/attributes\fR.
+the group attribute variable \fBthread_arts\fP to 0 - 5 in the file
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/attributes\fR.
+.TP
+.B thread_perc
+Defines how close the subjects must match while threading by Percentage
+Match for threads to be considered part of a single thread. This value
+is in the range 0 to 100. The default is 75.
 .TP
 .B thread_catchup_on_exit
 If ON catchup group/thread when leaving with the left arrow key. Default is
@@ -1918,7 +1991,7 @@ matching words are shown in \fBcol_markd
 uses a built-in default.
 .TP
 .B unlink_article
-If ON remove \fI${TIN_HOMEDIR-"$HOME"}/.article\fR after posting. Default is
+If ON remove \fI${TIN_HOMEDIR\-"$HOME"}/.article\fR after posting. Default is
 ON.
 .TP
 .B url_handler
@@ -1926,6 +1999,9 @@ The program that will be run when launch
 using \fBPageViewUrl\fP ('\fBU\fP'). The actual URL will be appended to
 this. Default is \fBurl_handler.sh %s\fP.
 .TP
+.B url_highlight
+Enable highlighting URLs in message body. Default is ON.
+.TP
 .B use_color
 If enabled
 .BR tin (1)
@@ -1934,11 +2010,6 @@ uses ANSI-colors. Default is OFF.
 .B use_keypad
 Use scroll keys on keypad. Default is OFF.
 .TP
-.B use_mailreader_i
-Interactive mailreader: if ON mailreader will be invoked earlier for reply
-so you can use more of its features (e.g. MIME, pgp, ...) this option has to
-suit \fBdefault_mailer_format\fP.
-.TP
 .B use_mouse
 Allows the mouse key support in a
 .BR xterm (1x)
@@ -1948,7 +2019,7 @@ Default is OFF.
 .B use_slrnface
 If enabled
 .BR slrnface (1)
-will be used to interpret the ''X-Face:'' header. For this option to have any
+will be used to interpret the ''X\-Face:'' header. For this option to have any
 effect,
 .BR tin (1)
 must be running in an
@@ -2007,7 +2078,7 @@ stops at the end of the thread list. Def
 .TP
 .B xpost_quote_format
 Format is the same as for \fBnews_quote_format\fP, this is used when
-answering to a crossposting to several groups with no ''Followup-To:''
+answering to a crossposting to several groups with no ''Followup\-To:''
 set.
 .RE
 .PP
@@ -2017,8 +2088,8 @@ set.
 .RS
 Yet another global configuration file with "\fIvariable\fR=\fIvalue\fR"
 pairs. This one is for the more general options which usually can't be
-controlled via \fI${TIN_LIBDIR-NEWSLIBDIR}/tinrc\fR and/or
-\fI${TIN_HOMEDIR-"$HOME"}/.tin/tinrc\fR like resetting (to override the
+controlled via \fI${TIN_LIBDIR\-NEWSLIBDIR}/tinrc\fR and/or
+\fI${TIN_HOMEDIR\-"$HOME"}/.tin/tinrc\fR like resetting (to override the
 built-in default) the \fInewslibdir\fR.
 .TP
 .B domainname
@@ -2060,7 +2131,7 @@ Allow unregistered top level domains
 .TP
 .B disable_sender
 Don't generate a ''Sender:''-header. This has no effect if
-\fBinews_prog\fP is not set to --internal.
+\fBinews_prog\fP is not set to \-\-internal.
 .TP
 .B spooldir
 Base of your newsspool (Bnews, Cnews and INN traditional spool style), common
@@ -2114,7 +2185,7 @@ $\fBLANG\fP
 .\" as with inn >= 2.2.x getting more and more popular
 .\" we should think about checking for the new Paths
 .\" (described shown below).
-.IR ${TIN_LIBDIR-NEWSLIBDIR}"/"${TIN_ACTIVEFILE-active}
+.IR ${TIN_LIBDIR\-NEWSLIBDIR}"/"${TIN_ACTIVEFILE\-active}
 .sp
 .RS
 This file lists the newsgroups that the local site receives. Each newsgroup
@@ -2174,11 +2245,11 @@ uses the LIST (\fBRFC977\fP) command ins
 .RE
 .PP
 
-.IR ${TIN_LIBDIR-NEWSLIBDIR}/active.times
+.IR ${TIN_LIBDIR\-NEWSLIBDIR}/active.times
 .sp
 .RS
 This file provides a chronological record of when newsgroups are created. It
-is normally updated by the local newsserver (i.e
+is normally updated by the local newsserver (e.g.
 .BR innd (8))
 whenever a new group is created. Each line consist of three space-separated
 fields "\fIname\fR \fItime\fR \fIcreator\fR".
@@ -2201,11 +2272,11 @@ uses the NEWGROUPS (\fBRFC977\fP) comman
 .RE
 .PP
 
-.IR ${TIN_LIBDIR-NEWSLIBDIR}/newsgroups
+.IR ${TIN_LIBDIR\-NEWSLIBDIR}/newsgroups
 .sp
 .RS
 This file provides short descriptions of each newsgroup. It is normally
-updated by the local newsserver (i.e
+updated by the local newsserver (e.g.
 .BR innd (8))
 whenever a new group is created. Each line consist of two tab-separated
 fields "\fIgroup.name\fR	\fIone-line description\fR".
@@ -2224,7 +2295,7 @@ uses the LIST NEWSGROUPS (\fBRFC2980\fP)
 .RE
 .PP
 
-.IR ${TIN_LIBDIR-NEWSLIBDIR}/organization
+.IR ${TIN_LIBDIR\-NEWSLIBDIR}/organization
 .sp
 .RS
 This file specifies might hold a default organization to be used
@@ -2233,7 +2304,7 @@ if set.
 .RE
 .PP
 
-.IR ${TIN_LIBDIR-NEWSLIBDIR}/overview.fmt
+.IR ${TIN_LIBDIR\-NEWSLIBDIR}/overview.fmt
 .\" is the Path correct? or is it /news/etc/overview.fmt
 .sp
 .RS
@@ -2253,12 +2324,12 @@ uses the LIST OVERVIEW.FMT (\fBRFC2980\f
 .RE
 .PP
 
-.IR ${TIN_LIBDIR-NEWSLIBDIR}/subscriptions
+.IR ${TIN_LIBDIR\-NEWSLIBDIR}/subscriptions
 .\" is the Path correct? or is it /news/etc/subscriptions
 .sp
 .RS
 This file contains a list of newsgroups - one per line - which the client
-should subscribe to when the user has no ${TIN_HOMEDIR-"$HOME"}/.newsrc for
+should subscribe to when the user has no ${TIN_HOMEDIR\-"$HOME"}/.newsrc for
 the newsserver.
 .BR tin (1)
 only tries to read the file if you read directly from the local spool,
@@ -2286,6 +2357,7 @@ uses the LIST SUBSCRIPTIONS (\fBRFC2980\
 .BR iconv_open (3),
 .BR nl_langinfo (3),
 .BR pcre (3),
+.BR strftime (3),
 .BR system (3),
 .BR mailcap (4),
 .BR active (5),
diff -Nurp tin-1.6.2/doc/tinews.1 tin-1.8.0/doc/tinews.1
--- tin-1.6.2/doc/tinews.1	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/doc/tinews.1	2005-06-28 10:31:20.000000000 +0200
@@ -1,9 +1,8 @@
-.rn '' }`
-''' $RCSfile$$Revision$$Date$
-'''
-''' $Log$
-'''
-.de Sh
+.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.13
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sh \" Subsection heading
 .br
 .if t .Sp
 .ne 5
@@ -11,150 +10,98 @@
 \fB\\$1\fR
 .PP
 ..
-.de Sp
+.de Sp \" Vertical space (when we can't use .PP)
 .if t .sp .5v
 .if n .sp
 ..
-.de Ip
-.br
-.ie \\n(.$>=3 .ne \\$3
-.el .ne 3
-.IP "\\$1" \\$2
-..
-.de Vb
+.de Vb \" Begin verbatim text
 .ft CW
 .nf
 .ne \\$1
 ..
-.de Ve
+.de Ve \" End verbatim text
 .ft R
-
 .fi
 ..
-'''
-'''
-'''     Set up \*(-- to give an unbreakable dash;
-'''     string Tr holds user defined translation string.
-'''     Bell System Logo is used as a dummy character.
-'''
+.\" Set up some character translations and predefined strings.  \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote.  | will give a
+.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
+.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
+.\" expand to `' in nroff, nothing in troff, for use with C<>.
 .tr \(*W-|\(bv\*(Tr
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
 .ie n \{\
-.ds -- \(*W-
-.ds PI pi
-.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-.ds L" ""
-.ds R" ""
-'''   \*(M", \*(S", \*(N" and \*(T" are the equivalent of
-'''   \*(L" and \*(R", except that they are used on ".xx" lines,
-'''   such as .IP and .SH, which do another additional levels of
-'''   double-quote interpretation
-.ds M" """
-.ds S" """
-.ds N" """""
-.ds T" """""
-.ds L' '
-.ds R' '
-.ds M' '
-.ds S' '
-.ds N' '
-.ds T' '
+.    ds -- \(*W-
+.    ds PI pi
+.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
+.    ds L" ""
+.    ds R" ""
+.    ds C` ""
+.    ds C' ""
 'br\}
 .el\{\
-.ds -- \(em\|
-.tr \*(Tr
-.ds L" ``
-.ds R" ''
-.ds M" ``
-.ds S" ''
-.ds N" ``
-.ds T" ''
-.ds L' `
-.ds R' '
-.ds M' `
-.ds S' '
-.ds N' `
-.ds T' '
-.ds PI \(*p
+.    ds -- \|\(em\|
+.    ds PI \(*p
+.    ds L" ``
+.    ds R" ''
 'br\}
-.\"	If the F register is turned on, we'll generate
-.\"	index entries out stderr for the following things:
-.\"		TH	Title 
-.\"		SH	Header
-.\"		Sh	Subsection 
-.\"		Ip	Item
-.\"		X<>	Xref  (embedded
-.\"	Of course, you have to process the output yourself
-.\"	in some meaninful fashion.
-.if \nF \{
-.de IX
-.tm Index:\\$1\t\\n%\t"\\$2"
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
+.\" entries marked with X<> in POD.  Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.if \nF \{\
+.    de IX
+.    tm Index:\\$1\t\\n%\t"\\$2"
 ..
-.nr % 0
-.rr F
+.    nr % 0
+.    rr F
 .\}
-.TH TINEWS 1 "1.1.0" "June 26th, 2003" "Post and sign an article via NNTP"
-.UC
-.if n .hy 0
+.\"
+.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.hy 0
 .if n .na
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.de CQ          \" put $1 in typewriter font
-.ft CW
-'if n "\c
-'if t \\&\\$1\c
-'if n \\&\\$1\c
-'if n \&"
-\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7
-'.ft R
-..
-.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2
-.	\" AM - accent mark definitions
-.bd B 3
-.	\" fudge factors for nroff and troff
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
+.    \" fudge factors for nroff and troff
 .if n \{\
-.	ds #H 0
-.	ds #V .8m
-.	ds #F .3m
-.	ds #[ \f1
-.	ds #] \fP
+.    ds #H 0
+.    ds #V .8m
+.    ds #F .3m
+.    ds #[ \f1
+.    ds #] \fP
 .\}
 .if t \{\
-.	ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.	ds #V .6m
-.	ds #F 0
-.	ds #[ \&
-.	ds #] \&
+.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+.    ds #V .6m
+.    ds #F 0
+.    ds #[ \&
+.    ds #] \&
 .\}
-.	\" simple accents for nroff and troff
+.    \" simple accents for nroff and troff
 .if n \{\
-.	ds ' \&
-.	ds ` \&
-.	ds ^ \&
-.	ds , \&
-.	ds ~ ~
-.	ds ? ?
-.	ds ! !
-.	ds /
-.	ds q
+.    ds ' \&
+.    ds ` \&
+.    ds ^ \&
+.    ds , \&
+.    ds ~ ~
+.    ds /
 .\}
 .if t \{\
-.	ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.	ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.	ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.	ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.	ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.	ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10'
-.	ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m'
-.	ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.	ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10'
+.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
 .\}
-.	\" troff and (daisy-wheel) nroff accents
+.    \" troff and (daisy-wheel) nroff accents
 .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
 .ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#]
-.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u'
-.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u'
-.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#]
 .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
 .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
 .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
@@ -162,141 +109,200 @@
 .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
 .ds ae a\h'-(\w'a'u*4/10)'e
 .ds Ae A\h'-(\w'A'u*4/10)'E
-.ds oe o\h'-(\w'o'u*4/10)'e
-.ds Oe O\h'-(\w'O'u*4/10)'E
-.	\" corrections for vroff
+.    \" corrections for vroff
 .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
 .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.	\" for low resolution devices (crt and lpr)
+.    \" for low resolution devices (crt and lpr)
 .if \n(.H>23 .if \n(.V>19 \
 \{\
-.	ds : e
-.	ds 8 ss
-.	ds v \h'-1'\o'\(aa\(ga'
-.	ds _ \h'-1'^
-.	ds . \h'-1'.
-.	ds 3 3
-.	ds o a
-.	ds d- d\h'-1'\(ga
-.	ds D- D\h'-1'\(hy
-.	ds th \o'bp'
-.	ds Th \o'LP'
-.	ds ae ae
-.	ds Ae AE
-.	ds oe oe
-.	ds Oe OE
+.    ds : e
+.    ds 8 ss
+.    ds o a
+.    ds d- d\h'-1'\(ga
+.    ds D- D\h'-1'\(hy
+.    ds th \o'bp'
+.    ds Th \o'LP'
+.    ds ae ae
+.    ds Ae AE
 .\}
 .rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "TINEWS 1"
+.TH TINEWS 1 "January 30th, 2004" "1.1.6" "Post and sign an article via NNTP"
 .SH "NAME"
 tinews.pl \- Post and sign an article via NNTP
 .SH "SYNOPSIS"
-\fBtinews.pl\fR < \fIinput\fR
+.IX Header "SYNOPSIS"
+\&\fBtinews.pl\fR [\fB\s-1OPTIONS\s0\fR] < \fIinput\fR
 .SH "DESCRIPTION"
-\fBtinews.pl\fR reads an article on STDIN, signs it via \fBpgp\fR(1) or
-\fBgpg\fR(1) and posts it to a newsserver.
+.IX Header "DESCRIPTION"
+\&\fBtinews.pl\fR reads an article on \s-1STDIN\s0, signs it via \fBpgp\fR(1) or
+\&\fBgpg\fR(1) and posts it to a newsserver.
 .PP
 If the article contains To:, Cc: or Bcc: headers and mail-actions are
-configured it will automatically add a \*(L"Posted-And-Mailed: yes\*(R" header
-to the article and send out the mail-copies.
+configured it will automatically add a \*(L"Posted\-And\-Mailed: yes\*(R" header
+to the article and send out the mail\-copies.
 .SH "OPTIONS"
-None.
+.IX Header "OPTIONS"
+.ie n .IP "\-\fBa\fR ""Approved""\fR | \-\-\fBapproved\fR \f(CW""Approved""" 4
+.el .IP "\-\fBa\fR \f(CWApproved\fR | \-\-\fBapproved\fR \f(CWApproved\fR" 4
+.IX Item "-a Approved | --approved Approved"
+Set the article header field Approved: to the given value.
+.ie n .IP "\-\fBc\fR ""Control""\fR | \-\-\fBcontrol\fR \f(CW""Control""" 4
+.el .IP "\-\fBc\fR \f(CWControl\fR | \-\-\fBcontrol\fR \f(CWControl\fR" 4
+.IX Item "-c Control | --control Control"
+Set the article header field Control: to the given value.
+.ie n .IP "\-\fBd\fR ""Distribution""\fR | \-\-\fBdistribution\fR \f(CW""Distribution""" 4
+.el .IP "\-\fBd\fR \f(CWDistribution\fR | \-\-\fBdistribution\fR \f(CWDistribution\fR" 4
+.IX Item "-d Distribution | --distribution Distribution"
+Set the article header field Distribution: to the given value.
+.ie n .IP "\-\fBe\fR ""Expires""\fR | \-\-\fBexpires\fR \f(CW""Expires""" 4
+.el .IP "\-\fBe\fR \f(CWExpires\fR | \-\-\fBexpires\fR \f(CWExpires\fR" 4
+.IX Item "-e Expires | --expires Expires"
+Set the article header field Expires: to the given value.
+.ie n .IP "\-\fBf\fR ""From""\fR | \-\-\fBfrom\fR \f(CW""From""" 4
+.el .IP "\-\fBf\fR \f(CWFrom\fR | \-\-\fBfrom\fR \f(CWFrom\fR" 4
+.IX Item "-f From | --from From"
+Set the article header field From: to the given value.
+.ie n .IP "\-\fBn\fR ""Newsgroups""\fR | \-\-\fBnewsgroups\fR \f(CW""Newsgroups""" 4
+.el .IP "\-\fBn\fR \f(CWNewsgroups\fR | \-\-\fBnewsgroups\fR \f(CWNewsgroups\fR" 4
+.IX Item "-n Newsgroups | --newsgroups Newsgroups"
+Set the article header field Newsgroups: to the given value.
+.ie n .IP "\-\fBo\fR ""Organization""\fR | \-\-\fBorganization\fR \f(CW""Organization""" 4
+.el .IP "\-\fBo\fR \f(CWOrganization\fR | \-\-\fBorganization\fR \f(CWOrganization\fR" 4
+.IX Item "-o Organization | --organization Organization"
+Set the article header field Organization: to the given value.
+.ie n .IP "\-\fBp\fR ""port""\fR | \-\-\fBport\fR \f(CW""port""" 4
+.el .IP "\-\fBp\fR \f(CWport\fR | \-\-\fBport\fR \f(CWport\fR" 4
+.IX Item "-p port | --port port"
+use \f(CW\*(C`port\*(C'\fR as NNTP-port
+.ie n .IP "\-\fBr\fR ""Reply\-To""\fR | \-\-\fBreplyto\fR \f(CW""Reply\-To""" 4
+.el .IP "\-\fBr\fR \f(CWReply\-To\fR | \-\-\fBreplyto\fR \f(CWReply\-To\fR" 4
+.IX Item "-r Reply-To | --replyto Reply-To"
+Set the article header field Reply\-To: to the given value.
+.ie n .IP "\-\fBt\fR ""Subject""\fR | \-\-\fBsubject\fR \f(CW""Subject""" 4
+.el .IP "\-\fBt\fR \f(CWSubject\fR | \-\-\fBsubject\fR \f(CWSubject\fR" 4
+.IX Item "-t Subject | --subject Subject"
+Set the article header field Subject: to the given value.
+.ie n .IP "\-\fBw\fR ""Followup\-To""\fR | \-\-\fBfollowupto\fR \f(CW""Followup\-To""" 4
+.el .IP "\-\fBw\fR \f(CWFollowup\-To\fR | \-\-\fBfollowupto\fR \f(CWFollowup\-To\fR" 4
+.IX Item "-w Followup-To | --followupto Followup-To"
+Set the article header field Followup\-To: to the given value.
+.ie n .IP "\-\fBx\fR ""Path""\fR | \-\-\fBpath\fR \f(CW""Path""" 4
+.el .IP "\-\fBx\fR \f(CWPath\fR | \-\-\fBpath\fR \f(CWPath\fR" 4
+.IX Item "-x Path | --path Path"
+Set the article header field Path: to the given value.
+.IP "\-\fBH\fR | \-\-\fBhelp\fR" 4
+.IX Item "-H | --help"
+Show help\-page.
+.IP "\-\fBR\fR | \-\-\fBno-control\fR" 4
+.IX Item "-R | --no-control"
+Restricted mode, disallow control\-messages.
+.IP "\-\fBS\fR | \-\-\fBno-signature\fR" 4
+.IX Item "-S | --no-signature"
+Do not append \fI$HOME/.signature\fR
+.IP "\-\fBX\fR | \-\-\fBno-sign\fR" 4
+.IX Item "-X | --no-sign"
+Do not sign the article.
+.IP "\-\fBA\fR \-\fBV\fR \-\fBW\fR" 4
+.IX Item "-A -V -W"
+These options are accepted for compatibility reasons but ignored.
+.IP "\-\fBh\fR | \-\-\fBheaders\fR" 4
+.IX Item "-h | --headers"
+These options are accepted for compatibility reasons but ignored.
+.IP "\-\fBO\fR | \-\-\fBno-organization\fR" 4
+.IX Item "-O | --no-organization"
+These options are accepted for compatibility reasons but ignored.
+.IP "\-\fBD\fR | \-\fBN\fR | \-\-\fBdebug\fR" 4
+.IX Item "-D | -N | --debug"
+These options are accepted but do not have any functionality yet.
 .SH "EXIT STATUS"
+.IX Header "EXIT STATUS"
 The following exit values are returned:
-.Ip "\ 0 " 4
+.RS 4
+.IP "\ 0" 4
+.IX Item "0"
 Successful completion.
-.Ip "!=0" 4
+.IP "!=0" 4
+.IX Item "!=0"
 An error occurred.
+.RE
+.RS 4
 .SH "ENVIRONMENT"
-.Ip "\fB$\s-1NNTPSERVER\s0\fR" 4
+.IX Header "ENVIRONMENT"
+.IP "\fB$NNTPSERVER\fR" 4
+.IX Item "$NNTPSERVER"
 Set to override the \s-1NNTP\s0 server configured in the source.
-.Ip "\fB$\s-1PGPPASS\s0\fR" 4
+.IP "\fB$NNTPPORT\fR" 4
+.IX Item "$NNTPPORT"
+The \s-1NNTP\s0 TCP-port to post news to. This variable only needs to be set if the
+TCP-port is not 119 (the default). The '\-\fBp\fR' command-line option overrides
+\&\fB$NNTPPORT\fR.
+.IP "\fB$PGPPASS\fR" 4
+.IX Item "$PGPPASS"
 Set to override the passphrase configured in the source (used for
-\fBpgp\fR(1)\-2.6.3).
-.Ip "\fB$\s-1PGPPASSFILE\s0\fR" 4
+\&\fBpgp\fR(1)\-2.6.3).
+.IP "\fB$PGPPASSFILE\fR" 4
+.IX Item "$PGPPASSFILE"
 Passphrase file used for \fBpgp\fR(1) or \fBgpg\fR(1).
-.Ip "\fB$\s-1SIGNER\s0\fR" 4
+.IP "\fB$SIGNER\fR" 4
+.IX Item "$SIGNER"
 Set to override the user-id for signing configured in the source. If you
-neither set \fB$\s-1SIGNER\s0\fR nor configure it in the source the contents of the
+neither set \fB$SIGNER\fR nor configure it in the source the contents of the
 From:\-field will be used.
-.Ip "\fB$\s-1REPLYTO\s0\fR" 4
-Set the article header field Reply-To: to the return address specified by
-the variable if there isn't already a Reply-To: header in the article.
-.Ip "\fB$\s-1ORGANIZATION\s0\fR" 4
+.IP "\fB$REPLYTO\fR" 4
+.IX Item "$REPLYTO"
+Set the article header field Reply\-To: to the return address specified by
+the variable if there isn't already a Reply\-To: header in the article.
+The '\-\fBr\fR' command-line option overrides \fB$REPLYTO\fR.
+.IP "\fB$ORGANIZATION\fR" 4
+.IX Item "$ORGANIZATION"
 Set the article header field Organization: to the contents of the variable
-if there isn't already a Organization: header in the article.
+if there isn't already a Organization: header in the article. The '\-\fBo\fR'
+command-line option overrides \fB$ORGANIZATION\fR.
+.IP "\fB$DISTRIBUTION\fR" 4
+.IX Item "$DISTRIBUTION"
+Set the article header field Distribution: to the contents of the variable
+if there isn't already a Distribution: header in the article. The '\-\fBd\fR'
+command-line option overrides \fB$DISTRIBUTION\fR.
+.RE
+.RS 4
 .SH "FILES"
-.Ip "\fIpgptmp.txt\fR" 4
-Temporary file used to store the reformated article
-.Ip "\fIpgptmp.txt.asc\fR" 4
-Temporary file used to store the reformated and signed article
-.Ip "\fI$\s-1PGPPASSFILE\s0\fR" 4
+.IX Header "FILES"
+.IP "\fIpgptmp.txt\fR" 4
+.IX Item "pgptmp.txt"
+Temporary file used to store the reformatted article
+.IP "\fIpgptmp.txt.asc\fR" 4
+.IX Item "pgptmp.txt.asc"
+Temporary file used to store the reformatted and signed article
+.IP "\fI$PGPPASSFILE\fR" 4
+.IX Item "$PGPPASSFILE"
 The passphrase file to be used for \fBpgp\fR(1) or \fBgpg\fR(1).
+.IP "\fI$HOME/.signature\fR" 4
+.IX Item "$HOME/.signature"
+Signature-file which will be automatically included.
+.RE
+.RS 4
 .SH "SECURITY"
-If interactive usage is configured and \fBtinews.pl\fR prompts for the
-NNTP\-password the input is echoed to the terminal.
-.PP
+.IX Header "SECURITY"
 If you've configured or entered a password, even if the variable that
 contained that password has been erased, it may be possible for someone to
 find that password, in plaintext, in a core dump. In short, if serious
 security is an issue, don't use this script.
 .SH "NOTES"
-\fBtinews.pl\fR is designed to be used with \fBpgp\fR(1)\-2.6.3,
-\fBpgp\fR(1)\-5 and \fBgpg\fR(1).
-.PP
-\fBtinews.pl\fR requires the following standard modules to be installed:
-\fBNet::NNTP\fR(3pm), \fBTime::Local\fR(3pm) and \fBTerm::Readline\fR(3pm).
+.IX Header "NOTES"
+\&\fBtinews.pl\fR is designed to be used with \fBpgp\fR(1)\-2.6.3,
+\&\fBpgp\fR(1)\-5 and \fBgpg\fR(1).
+.Sp
+\&\fBtinews.pl\fR requires the following standard modules to be installed:
+\&\fBGetopt::Long\fR(3pm), \fBNet::NNTP\fR(3pm), \fBTime::Local\fR(3pm) and
+\&\fBTerm::Readline\fR(3pm).
 .SH "AUTHOR"
+.IX Header "AUTHOR"
 Urs Janssen <urs@tin.org>,
 Marc Brockschmidt <marc@marcbrockschmidt.de>
 .SH "SEE ALSO"
-\fBpgp\fR(1), \fBgpg\fR(1), \fBpgps\fR(1), \fBNet::NNTP\fR(3pm), \fBTime::Local\fR(3pm),
-\fBTerm::Readline\fR(3pm)
-
-.rn }` ''
-.IX Title "TINEWS 1"
-.IX Name "tinews.pl - Post and sign an article via NNTP"
-
-.IX Header "NAME"
-
-.IX Header "SYNOPSIS"
-
-.IX Header "DESCRIPTION"
-
-.IX Header "OPTIONS"
-
-.IX Header "EXIT STATUS"
-
-.IX Item "\ 0 "
-
-.IX Item "!=0"
-
-.IX Header "ENVIRONMENT"
-
-.IX Item "\fB$\s-1NNTPSERVER\s0\fR"
-
-.IX Item "\fB$\s-1PGPPASS\s0\fR"
-
-.IX Item "\fB$\s-1PGPPASSFILE\s0\fR"
-
-.IX Item "\fB$\s-1SIGNER\s0\fR"
-
-.IX Item "\fB$\s-1REPLYTO\s0\fR"
-
-.IX Item "\fB$\s-1ORGANIZATION\s0\fR"
-
-.IX Header "FILES"
-
-.IX Item "\fIpgptmp.txt\fR"
-
-.IX Item "\fIpgptmp.txt.asc\fR"
-
-.IX Item "\fI$\s-1PGPPASSFILE\s0\fR"
-
-.IX Header "SECURITY"
-
-.IX Header "NOTES"
-
-.IX Header "AUTHOR"
-
 .IX Header "SEE ALSO"
-
+\&\fBpgp\fR(1), \fBgpg\fR(1), \fBpgps\fR(1), \fBGetopt::Long\fR(3pm), \fBNet::NNTP\fR(3pm),
+\&\fBTime::Local\fR(3pm), \fBTerm::Readline\fR(3pm)
diff -Nurp tin-1.6.2/doc/tools.txt tin-1.8.0/doc/tools.txt
--- tin-1.6.2/doc/tools.txt	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/doc/tools.txt	2005-06-28 10:31:20.000000000 +0200
@@ -1,5 +1,12 @@
 short descriptions of files in the tools-directory
 
+tinews.pl
+        a perl script that can be used as a inews replacement if posting via
+        NNTP. the main purpose of this script is to automatically sign
+        posted/mailed articles via pgp or gpg. besides the autosigning
+        feature it takes care about Cc: and Bcc: lines in news-postings
+        and adds a Posted-And-Mailed: header if necessary.
+
 w2r.pl
 	is a small perl script that turns a wildmat filter file
 	into a regexp filter file (don't forget to set wildmat= in tinrc
@@ -25,16 +32,17 @@ tinlock
 	tinlock [tin-cmdline-args]
 
 metamutt
-	is a small shell script to replace metamail, set METAMAIL=metamutt
-	before starting tin and till will pass multipart MIME-articles to
-	metamutt instead of metamail. metamutt will pass the article to mutt
-	(a mail client with an excellent MIME-parser). this might become
-	obsolete as tin now has a small (and unfinished) built in
-	MIME-parser, set METAMAIL=(internal) to use the built in version.
+	is a small shell script to replace metamail, set
+	metamail_prog=metamutt in tin and till will pass multipart
+	MIME-articles to metamutt instead of metamail. metamutt will pass
+	the article to mutt (a mail client with an excellent MIME-parser).
+	this might become obsolete as tin now has a small (and unfinished)
+	built in MIME-parser, set metamail_prog=--internal to use the built
+	in version.
 
 url_handler.sh
 	is a shell script (need to be placed in /usr/local/bin/) which
-	passes the URL selected by the 'U' command into a related
+	passes the URL selected by the 'U' command to a related
 	viewer/application. this one is very basic.
 
 expand_aliases.tgz
@@ -45,5 +53,5 @@ expand_aliases.tgz
 expiretover
 	is a small shell script to expire old tin overview files. if you use
 	cache_overview_files=ON in your tinrc you might want to run this
-	script reguarly (i.e. once a day from cron) to purge old overview
+	script regularly (e.g. once a day from cron) to purge old overview
 	files.
diff -Nurp tin-1.6.2/doc/umlauts.txt tin-1.8.0/doc/umlauts.txt
--- tin-1.6.2/doc/umlauts.txt	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/doc/umlauts.txt	2005-06-28 10:31:20.000000000 +0200
@@ -5,7 +5,7 @@ Umlauts when reading
 --------------------
 
 After reading a posting from the newsserver tin checks if a charset has been
-declared in the header. If not, tin assumes the appropiate entry of a
+declared in the header. If not, tin assumes the appropriate entry of a
 corresponding undeclared_charset variable in the attributes file. If there
 still is no match, tin assumes US-ASCII as the charset for this posting.
 
@@ -63,7 +63,7 @@ scope=*
 undeclared_charset=Windows-1252
 
 This tells tin to assume the Windows-1252 charset. Since most people use
-Windows nowadays and this charset is default for North Amerika and Western
+Windows nowadays and this charset is default for North America and Western
 Europe, and this charset is mostly compatible with the widespread ISO 8859-1
 charset, this should cover many postings. For special newsgroups this
 configuration should be improved by setting up another charset in a
diff -Nurp tin-1.6.2/include/autoconf.hin tin-1.8.0/include/autoconf.hin
--- tin-1.6.2/include/autoconf.hin	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/autoconf.hin	2005-12-02 12:08:13.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : autoconf.hin
  *  Author    : Thomas Dickey
  *  Created   : 1995-08-24
- *  Updated   : 2003-06-18
+ *  Updated   : 2005-07-16
  *  Notes     : #include files, #defines & struct's
  *
- * Copyright (c) 1995-2003 Thomas Dickey <dickey@invisible-island.net>
+ * Copyright (c) 1995-2006 Thomas Dickey <dickey@invisible-island.net>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -138,6 +138,7 @@
  * Data types
  */
 #	undef gid_t
+#	undef in_addr_t
 #	undef mode_t
 #	undef off_t
 #	undef pid_t
@@ -148,6 +149,7 @@
 #	undef uid_t
 #	undef RETSIGTYPE
 #	undef HAVE_LONG_LONG
+#	undef HAVE_NL_ITEM
 
 /*
  * The following xxx_H definitions are set by the 'configure' script to
@@ -168,6 +170,7 @@
 #	undef HAVE_LOCALE_H
 #	undef HAVE_MALLOC_H
 #	undef HAVE_NCURSESW_NCURSES_H
+#	undef HAVE_NCURSESW_TERM_H
 #	undef HAVE_NCURSES_H		/* obsolete versions of ncurses */
 #	undef HAVE_NCURSES_NCURSES_H
 #	undef HAVE_NCURSES_TERM_H
@@ -236,6 +239,7 @@
 #	undef HAVE_FLOCK
 #	undef HAVE_FORK
 #	undef HAVE_FTIME
+#	undef HAVE_FTRUNCATE
 #	undef HAVE_GAI_STRERROR
 #	undef HAVE_GETADDRINFO
 #	undef HAVE_GETCWD
@@ -281,20 +285,20 @@
 #	undef HAVE_STRNCASECMP
 #	undef HAVE_STRPBRK
 #	undef HAVE_STRRSTR
+#	undef HAVE_STRSEP
 #	undef HAVE_STRSTR
 #	undef HAVE_STRTOL
 #	undef HAVE_TCGETATTR
 #	undef HAVE_TCSETATTR
-#	undef HAVE_TEMPNAM
 #	undef HAVE_TIGETINT
 #	undef HAVE_TIGETNUM
 #	undef HAVE_TMPFILE
-#	undef HAVE_TMPNAM
 #	undef HAVE_TZSET
 #	undef HAVE_UNAME
 #	undef HAVE_UNLINK
 #	undef HAVE_USE_DEFAULT_COLORS
 #	undef HAVE_USLEEP
+#	undef HAVE_VASPRINTF
 #	undef HAVE_VSNPRINTF
 #	undef HAVE_WAITPID
 #	undef HAVE__TRACEF
@@ -312,6 +316,7 @@
 #	undef DECL_GETSERVBYNAME
 #	undef DECL_POPEN
 #	undef DECL_STRCASESTR
+#	undef DECL_STRSEP
 #	undef DECL_SYS_ERRLIST
 #	undef DECL_TGETSTR
 #	undef DECL_TGOTO
@@ -327,6 +332,7 @@
 #	undef DECL_BZERO
 #	undef DECL_CALLOC
 #	undef DECL_CONNECT
+#	undef DECL_FCHMOD
 #	undef DECL_FCLOSE
 #	undef DECL_FDOPEN
 #	undef DECL_FFLUSH
@@ -373,7 +379,6 @@
 #	undef DECL_STRNCASECMP
 #	undef DECL_STRTOL
 #	undef DECL_SYSTEM
-#	undef DECL_TEMPNAM
 #	undef DECL_TGETENT
 #	undef DECL_TGETFLAG
 #	undef DECL_TGETNUM
@@ -585,12 +590,23 @@
 #	undef CLOSEDIR_VOID
 
 /*
+ * define if gettimeofday() takes the timezone as 2nd argument
+ */
+#	undef	GETTIMEOFDAY_2ARGS
+
+/*
  * define if your NNTP server needs an extra GROUP command before
  * accepting a LISTGROUP command.
  * (old versions of leafnode and NNTPcache need this)
  */
 #	undef BROKEN_LISTGROUP
 
+/*
+ * on some old systems the WIFEXITED()/WEXITSTATUS() macros do not work,
+ * e.g. SEIUX3.2, DG/UX5.4R3, NEXTSTEP3
+ */
+#	undef IGNORE_SYSTEM_STATUS
+
 #	undef HAVE_COFFEE
 
 /*
@@ -600,6 +616,25 @@
 #	undef HAVE_LIBUU
 
 /*
+ * libidn - used for unicode normalization and
+ *          Internationalized Domain Names
+ */
+#	undef HAVE_IDNA_H
+#	undef HAVE_STRINGPREP_H
+#	undef HAVE_IDNA_TO_UNICODE_LZLZ
+#	undef HAVE_IDNA_USE_STD3_ASCII_RULES
+#	undef HAVE_LIBIDN
+
+/*
+ * ICU - International Components for Unicode
+ *       used for unicode normalization
+ */
+#	undef HAVE_UNICODE_UNORM_H
+#	undef HAVE_UNICODE_USTRING_H
+#	undef HAVE_UNICODE_UBIDI_H
+#	undef HAVE_LIBICUUC
+
+/*
  * Define as const if the declaration of iconv() needs const.
  */
 #	undef ICONV_CONST
@@ -620,6 +655,7 @@
  */
 #	if defined(MULTIBYTE_ABLE) || defined(HAVE_LIBUTF8_H)
 #		define SUPPORT_UTF8 1
+#		define SUPPORT_UCP 1
 #	endif /* MULTIBYTE_ABLE || HAVE_LIBUTF8_H */
 
 /*
diff -Nurp tin-1.6.2/include/bool.h tin-1.8.0/include/bool.h
--- tin-1.6.2/include/bool.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/bool.h	2005-12-02 12:08:13.000000000 +0100
@@ -6,7 +6,7 @@
  *  Updated   : 2003-05-16
  *  Notes     :
  *
- * Copyright (c) 1997-2003 Urs Janssen <urs@tin.org>
+ * Copyright (c) 1997-2006 Urs Janssen <urs@tin.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,7 +38,11 @@
 #ifndef BOOL_H
 #	define BOOL_H 1
 
-#	if 0 /* TODO: test me */
+#	if 0
+/*
+ * This is the correct way, but causes problems on some systems
+ * e.g. SuSE-7.3 (IA-32)
+ */
 #		ifndef __cplusplus
 #			ifdef HAVE_STDBOOL_H
 #				include <stdbool.h>
diff -Nurp tin-1.6.2/include/bugrep.h tin-1.8.0/include/bugrep.h
--- tin-1.6.2/include/bugrep.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/bugrep.h	2005-12-02 12:08:13.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : bugrep.h
  *  Author    : Urs Janssen <urs@tin.org>
  *  Created   : 1997-07-30
- *  Updated   : 1998-02-01
+ *  Updated   : 2003-09-19
  *  Notes     :
  *
- * Copyright (c) 1997-2003 Urs Janssen <urs@tin.org>
+ * Copyright (c) 1997-2006 Urs Janssen <urs@tin.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,10 +42,6 @@
 #		define BUG_REPORT_ADDRESS	"tin-bugs@tin.org"
 #	endif /* M_UNIX */
 
-#	ifdef M_AMIGA
-#		define BUG_REPORT_ADDRESS	"obw@amarok.ping.de"
-#	endif /* M_AMIGA */
-
 #	ifdef VMS
 #		define BUG_REPORT_ADDRESS	"stenns@vw.tci.uni-hannover.de"
 #	endif /* VMS */
diff -Nurp tin-1.6.2/include/extern.h tin-1.8.0/include/extern.h
--- tin-1.6.2/include/extern.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/extern.h	2005-12-02 12:08:13.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : extern.h
  *  Author    : I. Lea
  *  Created   : 1991-04-01
- *  Updated   : 2003-08-10
+ *  Updated   : 2005-10-19
  *  Notes     :
  *
- * Copyright (c) 1997-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1997-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -45,6 +45,9 @@
 #ifndef RFC2046_H
 #	include <rfc2046.h>
 #endif /* !RFC2046_H */
+#ifndef KEYMAP_H
+#	include "keymap.h"
+#endif /* !KEYMAP_H */
 
 /*
  * The prototypes bracketed by DECL_xxxx ifdef's are used to get moderately
@@ -75,6 +78,9 @@
 #ifdef DECL_CALLOC
 	extern void *calloc(size_t, size_t);
 #endif /* DECL_CALLOC */
+#ifdef DECL_FCHMOD
+	extern int fchmod(int, mode_t);
+#endif /* DECL_FCHMOD */
 #ifdef DECL_FCLOSE
 	extern int fclose(FILE *);
 #endif /* DECL_FCLOSE */
@@ -235,9 +241,6 @@
 #ifdef DECL_SYSTEM
 	extern int system(const char *);
 #endif /* DECL_SYSTEM */
-#ifdef DECL_TEMPNAM
-	extern char *tempnam(const char *, const char *);
-#endif /* DECL_TEMPNAM */
 #ifdef DECL_TGETENT
 	extern int tgetent(char *, char *);
 #endif /* DECL_TGETENT */
@@ -328,10 +331,9 @@ extern char **news_headers_to_display_ar
 extern char **news_headers_to_not_display_array;
 extern char *OPT_CHAR_list[];
 extern char *OPT_STRING_list[];
-extern char *ch_post_process;
 extern char *nntp_server;
-extern char *xover_cmd;
 extern char active_times_file[PATH_LEN];
+extern char article_name[PATH_LEN];
 extern char bug_addr[LEN];
 extern char bug_nntpserver1[PATH_LEN];
 extern char bug_nntpserver2[PATH_LEN];
@@ -348,7 +350,6 @@ extern char index_maildir[PATH_LEN];
 extern char index_newsdir[PATH_LEN];
 extern char index_savedir[PATH_LEN];
 extern char inewsdir[PATH_LEN];
-extern char last_put[];
 extern char libdir[PATH_LEN];
 extern char local_attributes_file[PATH_LEN];
 extern char local_config_file[PATH_LEN];
@@ -357,14 +358,13 @@ extern char local_input_history_file[PAT
 extern char local_newsgroups_file[PATH_LEN];
 extern char local_newsrctable_file[PATH_LEN];
 extern char lock_file[PATH_LEN];
-extern char mail_active_file[PATH_LEN];
 extern char mail_news_user[LEN];
 extern char mailbox[PATH_LEN];
 extern char mailer[PATH_LEN];
 #ifdef HAVE_MH_MAIL_HANDLING
+	extern char mail_active_file[PATH_LEN];
 	extern char mailgroups_file[PATH_LEN];
 #endif /* HAVE_MH_MAIL_HANDLING */
-extern char mesg[LEN];
 extern char newnewsrc[PATH_LEN];
 extern char news_active_file[PATH_LEN];
 extern char newsgroups_file[PATH_LEN];
@@ -385,16 +385,18 @@ extern char txt_help_bug_report[LEN];
 extern char userid[PATH_LEN];
 
 extern char domain_name[];
-extern char host_name[];
 
 extern const char base64_alphabet[64];
 
 extern constext *content_encodings[];
 extern constext *content_types[];
 extern constext *txt_attrs[];
-extern constext *txt_colors[];
+#ifdef HAVE_COLOR
+	extern constext *txt_colors[];
+#endif /* HAVE_COLOR */
 extern constext *txt_confirm_choices[];
 extern constext *txt_hide_uue_type[];
+extern constext *txt_interactive_mailers[];
 extern constext *txt_kill_level_type[];
 #ifdef CHARSET_CONVERSION
 	extern constext *txt_mime_charsets[];	/* supported charsets */
@@ -403,6 +405,9 @@ extern constext *txt_mime_7bit_charsets[
 extern constext *txt_mailbox_formats[];
 extern constext *txt_marks[];
 extern constext *txt_mime_encodings[];
+#ifdef HAVE_UNICODE_NORMALIZATION
+	extern constext *txt_normalization_forms[];
+#endif /* HAVE_UNICODE_NORMALIZATION */
 extern constext *txt_onoff[];
 extern constext *txt_post_process_type[];
 extern constext *txt_quote_style_type[];
@@ -476,9 +481,9 @@ extern constext txt_cannot_create[];
 extern constext txt_cannot_create_uniq_name[];
 extern constext txt_cannot_find_base_art[];
 extern constext txt_cannot_get_nntp_server_name[];
-#if defined(M_UNIX) && !defined(USE_TERMINFO)
+#if !defined(USE_CURSES) && defined(M_UNIX) && !defined(USE_TERMINFO)
 	extern constext txt_cannot_get_term_entry[];
-#endif /* M_UNIX && !USE_TERMINFO */
+#endif /* !USE_CURSES && M_UNIX && !USE_TERMINFO */
 extern constext txt_cannot_open[];
 extern constext txt_cannot_open_for_saving[];
 extern constext txt_cannot_post[];
@@ -494,12 +499,14 @@ extern constext txt_caughtup[];
 extern constext txt_check_article[];
 extern constext txt_checking_for_news[];
 extern constext txt_checking_new_groups[];
-#ifndef HAVE_LIBUU
+#if !defined(HAVE_LIBUU) && defined(M_UNIX) && defined(HAVE_SUM) && !defined(DONT_HAVE_PIPING)
 	extern constext txt_checksum_of_file[];
-#endif /* !HAVE_LIBUU */
+#endif /* !HAVE_LIBUU && M_UNIX && HAVE SUM && !DONT_HAVE_PIPING */
 extern constext txt_choose_post_process_type[];
-extern constext txt_color_off[];
-extern constext txt_color_on[];
+#ifdef HAVE_COLOR
+	extern constext txt_color_off[];
+	extern constext txt_color_on[];
+#endif /* HAVE_COLOR */
 extern constext txt_command_failed[];
 extern constext txt_confirm_select_on_exit[];
 #ifdef NNTP_ABLE
@@ -625,6 +632,8 @@ extern constext txt_filter_score_help[];
 extern constext txt_filter_text_type[];
 extern constext txt_followup_newsgroups[];
 extern constext txt_followup_poster[];
+extern constext txt_forwarded[];
+extern constext txt_forwarded_end[];
 extern constext txt_from_line_only[];
 extern constext txt_from_line_only_case[];
 extern constext txt_full[];
@@ -635,8 +644,10 @@ extern constext txt_gethostbyname[];
 extern constext txt_global[];
 extern constext txt_group[];
 extern constext txt_group_aliased[];
+extern constext txt_group_bogus[];
 extern constext txt_group_is_moderated[];
 extern constext txt_group_plural[];
+extern constext txt_group_rereading[];
 extern constext txt_group_select_com[];
 extern constext txt_group_selection[];
 extern constext txt_group_singular[];
@@ -666,7 +677,6 @@ extern constext txt_help_article_prev_un
 extern constext txt_help_article_quick_kill[];
 extern constext txt_help_article_quick_select[];
 extern constext txt_help_article_quit_to_select_level[];
-extern constext txt_help_article_read_next_unread[];
 extern constext txt_help_article_reply[];
 extern constext txt_help_article_reply_no_quote[];
 extern constext txt_help_article_reply_with_header[];
@@ -692,6 +702,7 @@ extern constext txt_help_filter_text[];
 extern constext txt_help_filter_text_type[];
 extern constext txt_help_filter_time[];
 extern constext txt_help_global_article_range[];
+extern constext txt_help_global_edit_filter[];
 extern constext txt_help_global_esc[];
 extern constext txt_help_global_help[];
 extern constext txt_help_global_last_art[];
@@ -716,6 +727,8 @@ extern constext txt_help_global_quit_tin
 extern constext txt_help_global_redraw_screen[];
 extern constext txt_help_global_save[];
 extern constext txt_help_global_auto_save[];
+extern constext txt_help_global_scroll_down[];
+extern constext txt_help_global_scroll_up[];
 extern constext txt_help_global_search_auth_backwards[];
 extern constext txt_help_global_search_auth_forwards[];
 extern constext txt_help_global_search_body[];
@@ -733,11 +746,11 @@ extern constext txt_help_global_tag[];
 extern constext txt_help_global_toggle_info_line[];
 extern constext txt_help_global_toggle_inverse_video[];
 extern constext txt_help_global_toggle_mini_help[];
+extern constext txt_help_global_toggle_subj_display[];
 extern constext txt_help_global_version[];
 extern constext txt_help_group_catchup[];
 extern constext txt_help_group_catchup_next[];
 extern constext txt_help_group_first_thread[];
-extern constext txt_help_group_goto_group[];
 extern constext txt_help_group_last_thread[];
 extern constext txt_help_group_list_thread[];
 extern constext txt_help_group_mark_article_unread[];
@@ -745,12 +758,7 @@ extern constext txt_help_group_mark_thre
 extern constext txt_help_group_mark_thread_unread[];
 extern constext txt_help_group_mark_unsel_art_read[];
 extern constext txt_help_group_next[];
-extern constext txt_help_group_next_unread_art[];
-extern constext txt_help_group_next_unread_article[];
 extern constext txt_help_group_prev[];
-extern constext txt_help_group_prev_unread_art[];
-extern constext txt_help_group_read_article[];
-extern constext txt_help_group_repost[];
 extern constext txt_help_group_reverse_thread_selection[];
 extern constext txt_help_group_select_all[];
 extern constext txt_help_group_select_thread[];
@@ -760,7 +768,6 @@ extern constext txt_help_group_tag_parts
 extern constext txt_help_group_thread_by_num[];
 extern constext txt_help_group_toggle_getart_limit[];
 extern constext txt_help_group_toggle_read_articles[];
-extern constext txt_help_group_toggle_subj_display[];
 extern constext txt_help_group_toggle_thread_selection[];
 extern constext txt_help_group_toggle_threading[];
 extern constext txt_help_group_undo_thread_selection[];
@@ -800,7 +807,6 @@ extern constext txt_help_thread_first_ar
 extern constext txt_help_thread_last_article[];
 extern constext txt_help_thread_mark_article_read[];
 extern constext txt_help_thread_read_article[];
-extern constext txt_help_thread_toggle_subj_display[];
 extern constext txt_help_title_disp[];
 extern constext txt_help_title_misc[];
 extern constext txt_help_title_navi[];
@@ -822,6 +828,9 @@ extern constext txt_info_postponed[];
 extern constext txt_info_x_conversion_note[];
 extern constext txt_invalid_from[];
 extern constext txt_invalid_sender[];
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	extern constext txt_invalid_multibyte_sequence[];
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 extern constext txt_inverse_off[];
 extern constext txt_inverse_on[];
 extern constext txt_is_mailbox[];
@@ -829,10 +838,7 @@ extern constext txt_is_tex_encoded[];
 extern constext txt_keymap_missing_key[];
 extern constext txt_keymap_invalid_key[];
 extern constext txt_keymap_invalid_name[];
-#ifdef DEBUG
-	extern constext txt_keymap_redef[];
-#endif /* DEBUG */
-extern constext txt_keymap_conflict[];
+extern constext txt_keymap_upgraded[];
 extern constext txt_kill_from[];
 extern constext txt_kill_lines[];
 extern constext txt_kill_menu[];
@@ -904,16 +910,17 @@ extern constext txt_no_newsgroups[];
 extern constext txt_no_next_unread_art[];
 extern constext txt_no_prev_group[];
 extern constext txt_no_prev_unread_art[];
-extern constext txt_no_resp[];
 extern constext txt_no_responses[];
 extern constext txt_no_resps_in_thread[];
 extern constext txt_no_search_string[];
 extern constext txt_no_subject[];
-extern constext txt_no_term_clear_eol[];
-extern constext txt_no_term_clear_eos[];
-extern constext txt_no_term_clearscreen[];
-extern constext txt_no_term_cursor_motion[];
-extern constext txt_no_term_set[];
+#ifndef USE_CURSES
+	extern constext txt_no_term_clear_eol[];
+	extern constext txt_no_term_clear_eos[];
+	extern constext txt_no_term_clearscreen[];
+	extern constext txt_no_term_cursor_motion[];
+	extern constext txt_no_term_set[];
+#endif /* !USE_CURSES */
 extern constext txt_no_viewer_found[];
 extern constext txt_no_xover_support[];
 extern constext txt_not_exist[];
@@ -980,6 +987,9 @@ extern constext txt_reading_newsrc[];
 #ifdef NNTP_ABLE
 	extern constext txt_reconnect_to_news_server[];
 #endif /* NNTP_ABLE */
+#ifdef HAVE_GETTIMEOFDAY
+	extern constext txt_remaining[];
+#endif /* HAVE_GETTIMEOFDAY */
 extern constext txt_remove_bogus[];
 extern constext txt_rename_error[];
 extern constext txt_reply_to_author[];
@@ -1004,7 +1014,9 @@ extern constext txt_saved_to[];
 extern constext txt_saved_to_range[];
 extern constext txt_saving[];
 extern constext txt_screen_init_failed[];
-extern constext txt_screen_too_small[];
+#ifndef USE_CURSES
+	extern constext txt_screen_too_small[];
+#endif /* !USE_CURSES */
 extern constext txt_screen_too_small_exiting[];
 extern constext txt_search_backwards[];
 extern constext txt_search_body[];
@@ -1046,12 +1058,15 @@ extern constext txt_supersede_group[];
 extern constext txt_superseding_art[];
 extern constext txt_suspended_message[];
 extern constext txt_tab[];
+extern constext txt_tex[];
 extern constext txt_there_is_no_news[];
 extern constext txt_thread_upper[];
 extern constext txt_thread_com[];
 extern constext txt_thread_marked_as_deselected[];
 extern constext txt_thread_marked_as_selected[];
-extern constext txt_thread_plural[];
+#if 0 /* unused */
+	extern constext txt_thread_plural[];
+#endif /* 0 */
 extern constext txt_thread_range[];
 extern constext txt_thread_singular[];
 extern constext txt_thread_x_of_n[];
@@ -1198,16 +1213,13 @@ extern constext txt_uu_success[];
 #endif /* !NO_SHELL_ESCAPE */
 
 extern int *my_group;
-extern int MORE_POS;
 extern int NOTESLINES;
-extern int RIGHT_POS;
 extern int _hp_glitch;
 extern int cCOLS;
 extern int cLINES;
 extern int curr_line;
 extern int debug;
-extern int groupname_len;
-extern int i_key_search_last;
+extern int input_context;
 extern int iso2asc_supported;
 extern int last_resp;
 extern int max_active;
@@ -1233,11 +1245,9 @@ extern int xmouse;
 extern int xrow;
 
 extern long *base;
-extern long head_next;
 
 extern signed long int read_newsrc_lines;
 
-extern mode_t real_umask;
 extern pid_t process_id;
 
 extern struct regex_cache strip_re_regex;
@@ -1267,7 +1277,9 @@ extern struct t_group *curr_group;
 extern struct t_newnews *newnews;
 extern struct t_option option_table[];
 extern struct t_save *save;
+extern struct t_capabilities nntp_caps;
 
+extern t_bool *OPT_ON_OFF_list[];
 extern t_bool can_post;
 extern t_bool check_for_new_newsgroups;
 extern t_bool cmd_line;
@@ -1285,7 +1297,6 @@ extern t_bool newsrc_active;
 extern t_bool no_write;
 extern t_bool post_article_and_exit;
 extern t_bool post_postponed_and_exit;
-extern t_bool quitting;
 extern t_bool read_local_newsgroups_file;
 extern t_bool read_news_via_nntp;
 extern t_bool read_saved_news;
@@ -1297,6 +1308,8 @@ extern t_bool batch_mode;
 extern t_bool verbose;
 extern t_bool xref_supported;
 
+extern t_function last_search;
+
 extern t_menu selmenu;
 extern t_menu grpmenu;
 extern t_menu *currmenu;
@@ -1431,12 +1444,6 @@ extern constext txt_processing_saved_art
 	extern constext txt_reading_mailgroups_file[];
 #endif /* HAVE_MH_MAIL_HANDLING */
 
-#ifdef M_AMIGA
-	extern constext txt_env_var_not_found[];
-	extern constext txt_usage_bbs_mode[];
-	extern t_bool tin_bbs_mode;
-#endif /* M_AMIGA */
-
 #ifndef NO_ETIQUETTE
 	extern constext txt_warn_posting_etiquette[];
 #endif /* NO_ETIQUETTE */
@@ -1473,8 +1480,11 @@ extern struct opttxt txt_batch_save;
 extern struct opttxt txt_beginner_level;
 extern struct opttxt txt_cache_overview_files;
 extern struct opttxt txt_catchup_read_groups;
-extern struct opttxt txt_color_options;
+#ifdef HAVE_COLOR
+	extern struct opttxt txt_color_options;
+#endif /* HAVE_COLOR */
 extern struct opttxt txt_confirm_choice;
+extern struct opttxt txt_date_format;
 extern struct opttxt txt_display_options;
 extern struct opttxt txt_draw_arrow;
 extern struct opttxt txt_editor_format;
@@ -1488,6 +1498,7 @@ extern struct opttxt txt_group_catchup_o
 extern struct opttxt txt_groupname_max_length;
 extern struct opttxt txt_hide_uue;
 extern struct opttxt txt_inews_prog;
+extern struct opttxt txt_interactive_mailer;
 extern struct opttxt txt_inverse_okay;
 extern struct opttxt txt_keep_dead_articles;
 extern struct opttxt txt_kill_level;
@@ -1504,7 +1515,9 @@ extern struct opttxt txt_mono_markstar;
 extern struct opttxt txt_mono_markdash;
 extern struct opttxt txt_mono_markslash;
 extern struct opttxt txt_mono_markstroke;
-extern struct opttxt txt_mm_charset;
+#ifndef CHARSET_CONVERSION
+	extern struct opttxt txt_mm_charset;
+#endif /* CHARSET_CONVERSION */
 extern struct opttxt txt_metamail_prog;
 extern struct opttxt txt_news_headers_to_display;
 extern struct opttxt txt_news_headers_to_not_display;
@@ -1517,8 +1530,10 @@ extern struct opttxt txt_post_process;
 extern struct opttxt txt_post_process_view;
 extern struct opttxt txt_posted_articles_file;
 extern struct opttxt txt_posting_options;
-extern struct opttxt txt_print_header;
-extern struct opttxt txt_printer;
+#ifndef DISABLE_PRINTING
+	extern struct opttxt txt_print_header;
+	extern struct opttxt txt_printer;
+#endif /* !DISABLE_PRINTING */
 extern struct opttxt txt_process_only_unread;
 extern struct opttxt txt_prompt_followupto;
 extern struct opttxt txt_quote_chars;
@@ -1557,12 +1572,13 @@ extern struct opttxt txt_strokes_regex;
 extern struct opttxt txt_tab_goto_next_unread;
 extern struct opttxt txt_tex2iso_conv;
 extern struct opttxt txt_thread_articles;
+extern struct opttxt txt_thread_perc;
 extern struct opttxt txt_thread_catchup_on_exit;
 extern struct opttxt txt_thread_score;
 extern struct opttxt txt_underscores_regex;
 extern struct opttxt txt_unlink_article;
 extern struct opttxt txt_url_handler;
-extern struct opttxt txt_use_mailreader_i;
+extern struct opttxt txt_url_highlight;
 extern struct opttxt txt_use_mouse;
 extern struct opttxt txt_wildcard;
 extern struct opttxt txt_word_highlight;
@@ -1596,6 +1612,7 @@ extern struct opttxt txt_xpost_quote_for
 	extern struct opttxt txt_col_from;
 	extern struct opttxt txt_col_title;
 	extern struct opttxt txt_col_signature;
+	extern struct opttxt txt_col_urls;
 	extern struct opttxt txt_col_markstar;
 	extern struct opttxt txt_col_markdash;
 	extern struct opttxt txt_col_markslash;
@@ -1610,4 +1627,10 @@ extern struct opttxt txt_xpost_quote_for
 #ifdef XFACE_ABLE
 	extern struct opttxt txt_use_slrnface;
 #endif /* XFACE_ABLE */
+#ifdef HAVE_UNICODE_NORMALIZATION
+	extern struct opttxt txt_normalization_form;
+#endif /* HAVE_UNICODE_NORMALIZATION */
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && defined(HAVE_UNICODE_UBIDI_H) && !defined(NO_LOCALE)
+	extern struct opttxt txt_render_bidi;
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && HAVE_UNICODE_UBIDI_H && !NO_LOCALE */
 #endif /* !EXTERN_H */
diff -Nurp tin-1.6.2/include/keymap.h tin-1.8.0/include/keymap.h
--- tin-1.6.2/include/keymap.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/keymap.h	2005-12-02 12:08:13.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : keymap.h
  *  Author    : J. Faultless, D. Nimmich
  *  Created   : 1999
- *  Updated   : 2003-05-14
+ *  Updated   : 2005-10-19
  *  Notes     :
  *
- * Copyright (c) 1999-2003 Jason Faultless <jason@altarstone.com>
+ * Copyright (c) 1999-2006 Jason Faultless <jason@altarstone.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,361 +38,378 @@
 #ifndef KEYMAP_H
 #	define KEYMAP_H 1
 
-#	ifndef MENUKEYS_H
-#		include "menukeys.h"
-#	endif /* !MENUKEYS_H */
+/* Revised 9 October 1996 by Branden Robinson in ASCII order
+ *
+ *        Oct   Dec   Hex   Char           Oct   Dec   Hex   Char
+ *        ------------------------------------------------------------
+ *        000   0     00    NUL '\0'       100   64    40    @
+ *        001   1     01    SOH      ^A    101   65    41    A
+ *        002   2     02    STX      ^B    102   66    42    B
+ *        003   3     03    ETX      ^C    103   67    43    C
+ *        004   4     04    EOT      ^D    104   68    44    D
+ *        005   5     05    ENQ      ^E    105   69    45    E
+ *        006   6     06    ACK      ^F    106   70    46    F
+ *        007   7     07    BEL '\a' ^G    107   71    47    G
+ *        010   8     08    BS  '\b' ^H    110   72    48    H
+ *        011   9     09    HT  '\t' ^I    111   73    49    I
+ *        012   10    0A    LF  '\n' ^J    112   74    4A    J
+ *        013   11    0B    VT  '\v' ^K    113   75    4B    K
+ *        014   12    0C    FF  '\f' ^L    114   76    4C    L
+ *        015   13    0D    CR  '\r' ^M    115   77    4D    M
+ *        016   14    0E    SO       ^N    116   78    4E    N
+ *        017   15    0F    SI       ^O    117   79    4F    O
+ *        020   16    10    DLE      ^P    120   80    50    P
+ *        021   17    11    DC1      ^Q    121   81    51    Q
+ *        022   18    12    DC2      ^R    122   82    52    R
+ *        023   19    13    DC3      ^S    123   83    53    S
+ *        024   20    14    DC4      ^T    124   84    54    T
+ *        025   21    15    NAK      ^U    125   85    55    U
+ *        026   22    16    SYN      ^V    126   86    56    V
+ *        027   23    17    ETB      ^W    127   87    57    W
+ *        030   24    18    CAN      ^X    130   88    58    X
+ *        031   25    19    EM       ^Y    131   89    59    Y
+ *        032   26    1A    SUB      ^Z    132   90    5A    Z
+ *        033   27    1B    ESC            133   91    5B    [
+ *        034   28    1C    FS             134   92    5C    \   '\\'
+ *        035   29    1D    GS             135   93    5D    ]
+ *        036   30    1E    RS             136   94    5E    ^
+ *        037   31    1F    US             137   95    5F    _
+ *        040   32    20    SPACE          140   96    60    `
+ *        041   33    21    !              141   97    61    a
+ *        042   34    22    "              142   98    62    b
+ *        043   35    23    #              143   99    63    c
+ *        044   36    24    $              144   100   64    d
+ *        045   37    25    %              145   101   65    e
+ *        046   38    26    &              146   102   66    f
+ *        047   39    27    '              147   103   67    g
+ *        050   40    28    (              150   104   68    h
+ *        051   41    29    )              151   105   69    i
+ *        052   42    2A    *              152   106   6A    j
+ *        053   43    2B    +              153   107   6B    k
+ *        054   44    2C    ,              154   108   6C    l
+ *        055   45    2D    -              155   109   6D    m
+ *        056   46    2E    .              156   110   6E    n
+ *        057   47    2F    /              157   111   6F    o
+ *        060   48    30    0              160   112   70    p
+ *        061   49    31    1              161   113   71    q
+ *        062   50    32    2              162   114   72    r
+ *        063   51    33    3              163   115   73    s
+ *        064   52    34    4              164   116   74    t
+ *        065   53    35    5              165   117   75    u
+ *        066   54    36    6              166   118   76    v
+ *        067   55    37    7              167   119   77    w
+ *        070   56    38    8              170   120   78    x
+ *        071   57    39    9              171   121   79    y
+ *        072   58    3A    :              172   122   7A    z
+ *        073   59    3B    ;              173   123   7B    {
+ *        074   60    3C    <              174   124   7C    |
+ *        075   61    3D    =              175   125   7D    }
+ *        076   62    3E    >              176   126   7E    ~
+ *        077   63    3F    ?              177   127   7F    DEL
+ *
+ * Above chart reprinted from Linux manual page.
+ *
+ * When adding key functionality, be aware of key functions in the "big five"
+ * levels of tin operation: top (group selection), group, thread, article
+ * (pager), and help.  If possible, when adding a key to any of these levels,
+ * check the others to make sure that the key doesn't do something
+ * non-analogous elsewhere.  For instance, having "^R" map to "redraw screen"
+ * at article level and "reset .newsrc" (a drastic and unreversible action)
+ * at top level is a bad idea.
+ *
+ * [make emacs happy: "]
+ */
+
+/*
+ * Maximum chars (including null byte) needed to print a key name
+ * A multibyte character can use up to MB_CUR_MAX chars. But as MB_CUR_MAX
+ * can't be used here, use MB_LEN_MAX instead.
+ * Some values for MB_LEN_MAX:
+ * - glibc 2.3.5: 16
+ * - gcc 4.0: 1
+ * - icc 8.0/9.0: 8
+ * Use the largest + 1 to be on the safe side.
+ */
+#define MAXKEYLEN 17
 
 /* TODO: permanently move here from tin.h */
 #define ctrl(c)	((c) & 0x1F)
 #define ESC		27
 
-/*
- * Global keys
- */
-struct k_global {
-	t_keynode tag;							/* Stores name of this keygroup */
-	t_keynode PageUp;						/* ctrl('B') */
-	t_keynode PageDown;					/* ctrl('D') */
-	t_keynode PageDown2;					/* ctrl('F') */
-	t_keynode RedrawScr;					/* ctrl('L') */
-	t_keynode Down;						/* ctrl('N') */
-	t_keynode Postponed;					/* ctrl('O') */
-	t_keynode Up;							/* ctrl('P') */
-	t_keynode PageUp2;					/* ctrl('U') */
-	t_keynode Abort;						/* ESCAPE */
-	t_keynode PageDown3;					/* ' ' */
+/* TODO: get rid of these remaining #define */
+#define iKeyAbort ESC
+#define iKeyQuitTin 'Q'
+#define iKeyQuit 'q'
+
+/* complete list of functions which can be associated with keys */
+enum defined_functions {
+	NOT_ASSIGNED = 0,
+	DIGIT_0,
+	DIGIT_1,
+	DIGIT_2,
+	DIGIT_3,
+	DIGIT_4,
+	DIGIT_5,
+	DIGIT_6,
+	DIGIT_7,
+	DIGIT_8,
+	DIGIT_9,
+	SPECIAL_CATCHUP_LEFT,
+	SPECIAL_MOUSE_TOGGLE,
+	CATCHUP,
+	CATCHUP_NEXT_UNREAD,
+	CONFIG_SELECT,
+	CONFIG_NO_SAVE,
+	FEED_ARTICLE,
+	FEED_THREAD,
+	FEED_HOT,
+	FEED_PATTERN,
+	FEED_TAGGED,
+	FEED_KEY_REPOST,
+	FEED_SUPERSEDE,
+	FILTER_EDIT,
+	FILTER_SAVE,
+	GLOBAL_ABORT,
+	GLOBAL_BUGREPORT,
+	GLOBAL_DISPLAY_POST_HISTORY,
+	GLOBAL_EDIT_FILTER,
+	GLOBAL_FIRST_PAGE,
+	GLOBAL_HELP,
+	GLOBAL_LAST_PAGE,
+	GLOBAL_LAST_VIEWED,
+	GLOBAL_LINE_DOWN,
+	GLOBAL_LINE_UP,
+	GLOBAL_LOOKUP_MESSAGEID,
+	GLOBAL_MENU_FILTER_KILL,
+	GLOBAL_MENU_FILTER_SELECT,
+	GLOBAL_OPTION_MENU,
+	GLOBAL_PAGE_DOWN,
+	GLOBAL_PAGE_UP,
+	GLOBAL_PIPE,
+	GLOBAL_POST,
+	GLOBAL_POSTPONED,
+#ifndef DISABLE_PRINTING
+	GLOBAL_PRINT,
+#endif /* !DISABLE_PRINTING */
+	GLOBAL_QUICK_FILTER_KILL,
+	GLOBAL_QUICK_FILTER_SELECT,
+	GLOBAL_QUIT,
+	GLOBAL_QUIT_TIN,
+	GLOBAL_REDRAW_SCREEN,
+	GLOBAL_SCROLL_DOWN,
+	GLOBAL_SCROLL_UP,
+	GLOBAL_SEARCH_BODY,
+	GLOBAL_SEARCH_REPEAT,
+	GLOBAL_SEARCH_AUTHOR_BACKWARD,
+	GLOBAL_SEARCH_AUTHOR_FORWARD,
+	GLOBAL_SEARCH_SUBJECT_BACKWARD,
+	GLOBAL_SEARCH_SUBJECT_FORWARD,
+	GLOBAL_SET_RANGE,
 #ifndef NO_SHELL_ESCAPE
-	t_keynode ShellEscape;				/* '!' */
-#endif /* !NO_SHELL_ESCAPE */
-	t_keynode SetRange;					/* '#' */
-	t_keynode LastPage;					/* '$' */
+	GLOBAL_SHELL_ESCAPE,
+#endif /* NO_SHELL_ESCAPE */
 #ifdef HAVE_COLOR
-	t_keynode ToggleColor;				/* '&' */
+	GLOBAL_TOGGLE_COLOR,
 #endif /* HAVE_COLOR */
-	t_keynode LastViewed;				/* '-' */
-	t_keynode SearchSubjF;				/* '/' */
-	t_keynode Zero;
-	t_keynode One;
-	t_keynode Two;
-	t_keynode Three;
-	t_keynode Four;
-	t_keynode Five;
-	t_keynode Six;
-	t_keynode Seven;
-	t_keynode Eight;
-	t_keynode Nine;
-	t_keynode SearchSubjB;				/* '?' */
-	t_keynode SearchRepeat;				/* '\\' */
-	t_keynode SearchAuthB;				/* 'A' */
-	t_keynode SearchBody;				/* 'B' */
-	t_keynode ToggleHelpDisplay;		/* 'H' */
-	t_keynode ToggleInverseVideo;		/* 'I' */
-	t_keynode LookupMessage;			/* 'L' */
-	t_keynode OptionMenu;				/* 'M' */
-	t_keynode Postponed2;				/* 'O' */
-	t_keynode QuitTin;					/* 'Q' */
-	t_keynode DisplayPostHist;			/* 'W' */
-	t_keynode FirstPage;					/* '^' */
-	t_keynode SearchAuthF;				/* 'a' */
-	t_keynode PageUp3;					/* 'b' */
-	t_keynode Help;						/* 'h' */
-	t_keynode ToggleInfoLastLine;		/* 'i' */
-	t_keynode Down2;						/* 'j' */
-	t_keynode Up2;							/* 'k' */
-#ifndef DISABLE_PRINTING
-	t_keynode Print;						/* 'o' */
-#endif /* !DISABLE_PRINTING */
-	t_keynode Quit;						/* 'q' */
-	t_keynode Version;					/* 'v' */
-	t_keynode Post;						/* 'w' */
-	t_keynode Pipe;						/* '|' */
-	t_keynode CatchupLeft;				/* special, for internal use only */
-	t_keynode MouseToggle;				/* special, for internal use only */
-	t_keynode null;						/* End of group */
-};
-
-struct k_config {
-	t_keynode tag;							/* Stores name of this keygroup */
-	t_keynode FirstPage2;
-	t_keynode LastPage2;
-	t_keynode NoSave;
-	t_keynode Select;
-	t_keynode Select2;
-	t_keynode null;
-};
-
-struct k_feed {
-	t_keynode tag;							/* Stores name of this keygroup */
-	t_keynode Art;
-	t_keynode Hot;
-	t_keynode Pat;
-	t_keynode Repost;
-	t_keynode Supersede;
-	t_keynode Tag;
-	t_keynode Thd;
-	t_keynode null;
-};
-
-struct k_filter {
-	t_keynode tag;							/* Stores name of this keygroup */
-	t_keynode Edit;
-	t_keynode Save;
-	t_keynode null;
-};
-
-struct k_group {
-	t_keynode tag;							/* Stores name of this keygroup */
-	t_keynode AutoSel;					/* ctrl('A') */
-	t_keynode NextUnreadArtOrGrp;		/* '\t' */
-	t_keynode ReadBasenote;				/* '\n' */
-	t_keynode Kill;						/* ctrl('K') */
-	t_keynode ReadBasenote2;			/* '\r' */
-	t_keynode SelThd;						/* '*' */
-	t_keynode DoAutoSel;					/* '+' */
-	t_keynode ToggleThdSel;				/* '.' */
-	t_keynode SelThdIfUnreadSelected;	/* ';' */
-	t_keynode SelPattern;				/* '=' */
-	t_keynode ReverseSel;				/* '@' */
-	t_keynode CatchupNextUnread;		/* 'C' */
-	t_keynode EditFilter;				/* 'E' */
-	t_keynode ToggleGetartLimit;		/* 'G' */
-	t_keynode MarkThdRead;				/* 'K' */
-	t_keynode NextUnreadArt;			/* 'N' */
-	t_keynode PrevUnreadArt;			/* 'P' */
-	t_keynode BugReport;					/* 'R' */
-	t_keynode AutoSave;			/* 'S' */
-	t_keynode TagParts;					/* 'T' */
-	t_keynode Untag;						/* 'U' */
-	t_keynode MarkUnselArtRead;		/* 'X' */
-	t_keynode MarkThdUnread;			/* 'Z' */
-	t_keynode QuickAutoSel;				/* '[' */
-	t_keynode QuickKill;					/* ']' */
-	t_keynode Catchup;					/* 'c' */
-	t_keynode ToggleSubjDisplay;		/* 'd' */
-	t_keynode Goto;						/* 'g' */
-	t_keynode ListThd;					/* 'l' */
-	t_keynode Mail;						/* 'm' */
-	t_keynode NextGroup;					/* 'n' */
-	t_keynode PrevGroup;					/* 'p' */
-	t_keynode ToggleReadUnread;		/* 'r' */
-	t_keynode Save;						/* 's' */
-	t_keynode Tag;							/* 't' */
-	t_keynode ToggleThreading;			/* 'u' */
-	t_keynode Repost;						/* 'x' */
-	t_keynode MarkArtUnread;			/* 'z' */
-	t_keynode UndoSel;					/* '~' */
-	t_keynode null;						/* End of group */
-};
-
-struct k_help {
-	t_keynode tag;
-	t_keynode FirstPage2;
-	t_keynode LastPage2;
-	t_keynode null;
-};
-
-struct k_markread {
-	t_keynode tag;
-	t_keynode Tag;
-	t_keynode Cur;
-	t_keynode null;
-};
-
-struct k_nrctbl {
-	t_keynode tag;
-	t_keynode Alternative;
-	t_keynode Create;
-	t_keynode Default;
-	t_keynode Quit;
-	t_keynode null;
-};
-
-struct k_page {
-	t_keynode tag;							/* Stores name of this keygroup */
-	t_keynode AutoSel;					/* ctrl('A') */
-	t_keynode ReplyQuoteHeaders;		/* ctrl('E') */
-#ifdef HAVE_PGP_GPG
-	t_keynode PGPCheckArticle;			/* ctrl('G') */
-#endif /* HAVE_PGP_GPG */
-	t_keynode ToggleHeaders;			/* ctrl('H') */
-	t_keynode NextUnread;				/* '\t' */
-	t_keynode NextThd;					/* '\n' */
-	t_keynode AutoKill;					/* ctrl('K') */
-	t_keynode NextThd2;					/* '\r' */
-	t_keynode ToggleTabs;				/* ctrl('T') */
-	t_keynode FollowupQuoteHeaders;	/* ctrl('W') */
-	t_keynode ToggleTex2iso;			/* '\"' */
-	t_keynode ToggleRot;					/* '%' */
-	t_keynode ToggleUue;					/* '(' */
-	t_keynode Reveal;						/* ')' */
-	t_keynode SkipIncludedText;		/* ':' */
-	t_keynode TopThd;						/* '<' */
-	t_keynode BotThd;						/* '>' */
-	t_keynode CatchupNextUnread;		/* 'C' */
-	t_keynode Cancel;						/* 'D' */
-	t_keynode EditFilter;				/* 'E' */
-	t_keynode Followup;					/* 'F' */
-	t_keynode LastPage2;					/* 'G' */
-	t_keynode KillThd;					/* 'K' */
-	t_keynode NextUnreadArt;			/* 'N' */
-	t_keynode PrevUnreadArt;			/* 'P' */
-	t_keynode Reply;						/* 'R' */
-	t_keynode AutoSave;			/* 'S' */
-	t_keynode GroupSel;					/* 'T' */
-	t_keynode ViewUrl;					/* 'U' */
-	t_keynode ViewAttach;				/* 'V' */
-	t_keynode MarkThdUnread;			/* 'Z' */
-	t_keynode QuickAutoSel;				/* '[' */
-	t_keynode QuickKill;					/* ']' */
-	t_keynode ToggleHighlight;			/* '_' */
-	t_keynode Catchup;					/* 'c' */
-	t_keynode EditArticle;				/* 'e' */
-	t_keynode FollowupQuote;			/* 'f' */
-	t_keynode FirstPage2;				/* 'g' */
-	t_keynode ListThd;					/* 'l' */
-	t_keynode Mail;						/* 'm' */
-	t_keynode NextArt;					/* 'n' */
-	t_keynode PrevArt;					/* 'p' */
-	t_keynode ReplyQuote;				/* 'r' */
-	t_keynode Save;						/* 's' */
-	t_keynode Tag;							/* 't' */
-	t_keynode GotoParent;				/* 'u' */
-	t_keynode Repost;						/* 'x' */
-	t_keynode MarkArtUnread;			/* 'z' */
-	t_keynode null;						/* End of group */
-};
-
-struct k_pgp {
-	t_keynode tag;
-	t_keynode EncSign;
-	t_keynode Encrypt;
-	t_keynode Includekey;
-	t_keynode Sign;
-	t_keynode null;
-};
-
-struct k_post {
-	t_keynode tag;
-	t_keynode Cancel;
-	t_keynode Edit;
+	GLOBAL_TOGGLE_HELP_DISPLAY,
+	GLOBAL_TOGGLE_INFO_LAST_LINE,
+	GLOBAL_TOGGLE_INVERSE_VIDEO,
+	GLOBAL_VERSION,
+	GROUP_AUTOSAVE,
+	GROUP_DO_AUTOSELECT,
+	GROUP_GOTO,
+	GROUP_LIST_THREAD,
+	GROUP_MAIL,
+	GROUP_MARK_THREAD_READ,
+	GROUP_MARK_UNSELECTED_ARTICLES_READ,
+	GROUP_NEXT_GROUP,
+	GROUP_NEXT_UNREAD_ARTICLE,
+	GROUP_NEXT_UNREAD_ARTICLE_OR_GROUP,
+	GROUP_PREVIOUS_GROUP,
+	GROUP_PREVIOUS_UNREAD_ARTICLE,
+	GROUP_READ_BASENOTE,
+	GROUP_REPOST,
+	GROUP_REVERSE_SELECTIONS,
+	GROUP_SAVE,
+	GROUP_SELECT_PATTERN,
+	GROUP_SELECT_THREAD,
+	GROUP_SELECT_THREAD_IF_UNREAD_SELECTED,
+	GROUP_TAG,
+	GROUP_TAG_PARTS,
+	GROUP_TOGGLE_GET_ARTICLES_LIMIT,
+	GROUP_TOGGLE_READ_UNREAD,
+	GROUP_TOGGLE_SUBJECT_DISPLAY,
+	GROUP_TOGGLE_SELECT_THREAD,
+	GROUP_TOGGLE_THREADING,
+	GROUP_UNDO_SELECTIONS,
+	GROUP_UNTAG,
+	MARK_ARTICLE_UNREAD,
+	MARK_READ_CURRENT,
+	MARK_READ_TAGGED,
+	MARK_THREAD_UNREAD,
+	PAGE_AUTOSAVE,
+	PAGE_BOTTOM_THREAD,
+	PAGE_CANCEL,
+	PAGE_EDIT_ARTICLE,
+	PAGE_FOLLOWUP,
+	PAGE_FOLLOWUP_QUOTE,
+	PAGE_FOLLOWUP_QUOTE_HEADERS,
+	PAGE_GOTO_PARENT,
+	PAGE_GROUP_SELECT,
+	PAGE_LIST_THREAD,
+	PAGE_MAIL,
+	PAGE_MARK_THREAD_READ,
+	PAGE_NEXT_ARTICLE,
+	PAGE_NEXT_THREAD,
+	PAGE_NEXT_UNREAD,
+	PAGE_NEXT_UNREAD_ARTICLE,
+	PAGE_PAGE_DOWN3,	/* special handling at page.c */
 #ifdef HAVE_PGP_GPG
-	t_keynode PGP;
+	PAGE_PGP_CHECK_ARTICLE,
 #endif /* HAVE_PGP_GPG */
+	PAGE_PREVIOUS_ARTICLE,
+	PAGE_PREVIOUS_UNREAD_ARTICLE,
+	PAGE_REVEAL,
+	PAGE_REPLY,
+	PAGE_REPLY_QUOTE,
+	PAGE_REPLY_QUOTE_HEADERS,
+	PAGE_REPOST,
+	PAGE_SAVE,
+	PAGE_SKIP_INCLUDED_TEXT,
+	PAGE_TAG,
+	PAGE_TOGGLE_HEADERS,
+	PAGE_TOGGLE_HIGHLIGHTING,
+	PAGE_TOGGLE_ROT13,
+	PAGE_TOGGLE_TABS,
+	PAGE_TOGGLE_TEX2ISO,
+	PAGE_TOGGLE_UUE,
+	PAGE_TOP_THREAD,
+	PAGE_VIEW_ATTACHMENTS,
+	PAGE_VIEW_URL,
+	PGP_KEY_ENCRYPT,
+	PGP_KEY_ENCRYPT_SIGN,
+	PGP_INCLUDE_KEY,
+	PGP_KEY_SIGN,
+	POST_ABORT,
+	POST_CANCEL,
+	POST_CONTINUE,
+	POST_EDIT,
+	POST_IGNORE_FUPTO,
 #ifdef HAVE_ISPELL
-	t_keynode Ispell;
+	POST_ISPELL,
 #endif /* HAVE_ISPELL */
-	t_keynode Abort;
-	t_keynode Continue;
-	t_keynode Ignore;
-	t_keynode Mail;
-	t_keynode Post2;
-	t_keynode Post3;
-	t_keynode Postpone;
-	t_keynode Send;
-	t_keynode Send2;
-	t_keynode Supersede;
-	t_keynode null;
-};
-
-struct k_postpone {
-	t_keynode tag;
-	t_keynode All;
-	t_keynode Override;
-	t_keynode null;
-};
-
-struct k_pproc {
-	t_keynode tag;
-	t_keynode No;
-	t_keynode Shar;
-	t_keynode Yes;
-	t_keynode null;
-};
-
-struct k_prompt {
-	t_keynode tag;
-	t_keynode No;
-	t_keynode Yes;
-	t_keynode null;
-};
-
-struct k_save {
-	t_keynode tag;
-	t_keynode AppendFile;
-	t_keynode OverwriteFile;
-	t_keynode null;
-};
-
-struct k_select {
-	t_keynode tag;							/* Stores name of this keygroup */
-	t_keynode EnterNextUnreadGrp;		/* '\t' */
-	t_keynode ReadGrp;					/* '\n' */
-	t_keynode ReadGrp2;					/* '\r' */
-	t_keynode ResetNewsrc;				/* ctrl('R') */
-	t_keynode SortActive;				/* '.' */
-	t_keynode CatchupNextUnread;		/* 'C' */
-	t_keynode NextUnreadGrp;			/* 'N' */
-	t_keynode BugReport;					/* 'R' */
-	t_keynode SubscribePat;				/* 'S' */
-	t_keynode UnsubscribePat;			/* 'U' */
-	t_keynode QuitNoWrite;				/* 'X' */
-	t_keynode SyncWithActive;			/* 'Y' */
-	t_keynode MarkGrpUnread2;			/* 'Z' */
-	t_keynode Catchup;					/* 'c' */
-	t_keynode ToggleDescriptions;		/* 'd' */
-	t_keynode Goto;						/* 'g' */
-	t_keynode MoveGrp;					/* 'm' */
-	t_keynode EnterNextUnreadGrp2;	/* 'n' */
-	t_keynode ToggleReadDisplay;		/* 'r' */
-	t_keynode Subscribe;					/* 's' */
-	t_keynode Unsubscribe;				/* 'u' */
-	t_keynode YankActive;				/* 'y' */
-	t_keynode MarkGrpUnread;			/* 'z' */
-	t_keynode null;						/* End of group */
-};
-
-struct k_thread {
-	t_keynode tag;							/* Stores name of this keygroup */
-	t_keynode ReadNextArtOrThread;	/* '\t' */
-	t_keynode ReadArt;					/* '\n' */
-	t_keynode ReadArt2;					/* '\r' */
-	t_keynode SelArt;						/* '*' */
-	t_keynode ToggleArtSel;				/* '.' */
-	t_keynode ReverseSel;				/* '@' */
-	t_keynode CatchupNextUnread;		/* 'C' */
-	t_keynode MarkArtRead;				/* 'K' */
-	t_keynode BugReport;					/* 'R' */
-	t_keynode AutoSave;			/* 'S' */
-	t_keynode Untag;						/* 'U' */
-	t_keynode MarkThdUnread;			/* 'Z' */
-	t_keynode Catchup;					/* 'c' */
-	t_keynode ToggleSubjDisplay;		/* 'd' */
-	t_keynode Mail;						/* 'm' */
-	t_keynode Save;						/* 's' */
-	t_keynode Tag;							/* 't' */
-	t_keynode MarkArtUnread;			/* 'z' */
-	t_keynode UndoSel;					/* '~' */
-	t_keynode null;						/* End of group */
-};
-
-struct keymap {
-	struct k_global Global;
-	struct k_config Config;
-	struct k_feed Feed;
-	struct k_filter Filter;
-	struct k_group Group;
-	struct k_help Help;
-	struct k_markread MarkRead;
-	struct k_nrctbl Nrctbl;
-	struct k_page Page;
-	struct k_pgp Pgp;
-	struct k_post Post;
-	struct k_postpone Postpone;
-	struct k_pproc PProc;
-	struct k_prompt Prompt;
-	struct k_save Save;
-	struct k_select Select;
-	struct k_thread Thread;
-};
-
+	POST_MAIL,
+#ifdef HAVE_PGP_GPG
+	POST_PGP,
+#endif /* HAVE_PGP_GPG */
+	POST_POSTPONE,
+	POST_SEND,
+	POST_SUPERSEDE,
+	POSTPONE_ALL,
+	POSTPONE_OVERRIDE,
+	POSTPROCESS_NO,
+	POSTPROCESS_SHAR,
+	POSTPROCESS_YES,
+	PROMPT_NO,
+	PROMPT_YES,
+	SAVE_APPEND_FILE,
+	SAVE_OVERWRITE_FILE,
+	SELECT_ENTER_GROUP,
+	SELECT_ENTER_NEXT_UNREAD_GROUP,
+	SELECT_GOTO,
+	SELECT_MARK_GROUP_UNREAD,
+	SELECT_MOVE_GROUP,
+	SELECT_NEXT_UNREAD_GROUP,
+	SELECT_RESET_NEWSRC,
+	SELECT_SORT_ACTIVE,
+	SELECT_SUBSCRIBE,
+	SELECT_SUBSCRIBE_PATTERN,
+	SELECT_SYNC_WITH_ACTIVE,
+	SELECT_TOGGLE_DESCRIPTIONS,
+	SELECT_TOGGLE_READ_DISPLAY,
+	SELECT_UNSUBSCRIBE,
+	SELECT_UNSUBSCRIBE_PATTERN,
+	SELECT_QUIT_NO_WRITE,
+	SELECT_YANK_ACTIVE,
+	THREAD_AUTOSAVE,
+	THREAD_MAIL,
+	THREAD_MARK_ARTICLE_READ,
+	THREAD_READ_NEXT_ARTICLE_OR_THREAD,
+	THREAD_READ_ARTICLE,
+	THREAD_REVERSE_SELECTIONS,
+	THREAD_SAVE,
+	THREAD_SELECT_ARTICLE,
+	THREAD_TAG,
+	THREAD_TOGGLE_ARTICLE_SELECTION,
+	THREAD_TOGGLE_SUBJECT_DISPLAY,
+	THREAD_UNDO_SELECTIONS,
+	THREAD_UNTAG
+};
+typedef enum defined_functions t_function;
+
+
+struct keynode {
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wchar_t key;
+#else
+	char key;
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	t_function function;
+};
+
+
+struct keylist {
+	struct keynode *list;
+	size_t used;
+	size_t max;
+};
+
+
+extern struct keylist feed_post_process_keys;
+extern struct keylist feed_supersede_article_keys;
+extern struct keylist feed_type_keys;
+extern struct keylist filter_keys;
+extern struct keylist group_keys;
+extern struct keylist info_keys;
+extern struct keylist mark_read_keys;
+extern struct keylist option_menu_keys;
+extern struct keylist page_keys;
+#ifdef HAVE_PGP_GPG
+	extern struct keylist pgp_mail_keys;
+	extern struct keylist pgp_news_keys;
+#endif /* HAVE_PGP_GPG */
+extern struct keylist post_cancel_keys;
+extern struct keylist post_continue_keys;
+extern struct keylist post_delete_keys;
+extern struct keylist post_edit_keys;
+extern struct keylist post_edit_ext_keys;
+extern struct keylist post_ignore_fupto_keys;
+extern struct keylist post_mail_fup_keys;
+extern struct keylist post_post_keys;
+extern struct keylist post_postpone_keys;
+extern struct keylist post_send_keys;
+extern struct keylist prompt_keys;
+extern struct keylist save_append_overwrite_keys;
+extern struct keylist select_keys;
+extern struct keylist thread_keys;
+
+
+extern t_function global_mouse_action(t_function (*left_action) (void), t_function (*right_action) (void));
+extern t_function handle_keypad(
+	t_function (*left_action) (void),
+	t_function (*right_action) (void),
+	t_function (*mouse_action) (
+		t_function (*left_action) (void),
+		t_function (*right_action) (void)),
+	const struct keylist keys);
+extern t_function prompt_slk_response(t_function default_func, const struct keylist keys, const char *fmt, ...);
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	extern char *printascii(char *buf, wint_t ch);
+	extern wchar_t func_to_key(t_function func, const struct keylist keys);
+	extern t_function key_to_func(const wchar_t key, const struct keylist keys);
+#else
+	extern char *printascii(char *buf, int ch);
+	extern char func_to_key (t_function func, const struct keylist keys);
+	extern t_function key_to_func (const char key, const struct keylist keys);
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 #endif /* !KEYMAP_H */
diff -Nurp tin-1.6.2/include/menukeys.h tin-1.8.0/include/menukeys.h
--- tin-1.6.2/include/menukeys.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/menukeys.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,461 +0,0 @@
-/*
- *  Project   : tin - a Usenet reader
- *  Module    : menukeys.h
- *  Author    : S.Robbins
- *  Created   : 1994-08-15
- *  Updated   : 2003-05-14
- *  Notes     :
- *
- * Copyright (c) 1994-2003 Steve Robbins <stever@cs.mcgill.ca>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote
- *    products derived from this software without specific prior written
- *    permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#ifndef MENUKEYS_H
-#	define MENUKEYS_H 1
-
-/* Revised 9 October 1996 by Branden Robinson in ASCII order
- *
- *        Oct   Dec   Hex   Char           Oct   Dec   Hex   Char
- *        ------------------------------------------------------------
- *        000   0     00    NUL '\0'       100   64    40    @
- *        001   1     01    SOH      ^A    101   65    41    A
- *        002   2     02    STX      ^B    102   66    42    B
- *        003   3     03    ETX      ^C    103   67    43    C
- *        004   4     04    EOT      ^D    104   68    44    D
- *        005   5     05    ENQ      ^E    105   69    45    E
- *        006   6     06    ACK      ^F    106   70    46    F
- *        007   7     07    BEL '\a' ^G    107   71    47    G
- *        010   8     08    BS  '\b' ^H    110   72    48    H
- *        011   9     09    HT  '\t' ^I    111   73    49    I
- *        012   10    0A    LF  '\n' ^J    112   74    4A    J
- *        013   11    0B    VT  '\v' ^K    113   75    4B    K
- *        014   12    0C    FF  '\f' ^L    114   76    4C    L
- *        015   13    0D    CR  '\r' ^M    115   77    4D    M
- *        016   14    0E    SO       ^N    116   78    4E    N
- *        017   15    0F    SI       ^O    117   79    4F    O
- *        020   16    10    DLE      ^P    120   80    50    P
- *        021   17    11    DC1      ^Q    121   81    51    Q
- *        022   18    12    DC2      ^R    122   82    52    R
- *        023   19    13    DC3      ^S    123   83    53    S
- *        024   20    14    DC4      ^T    124   84    54    T
- *        025   21    15    NAK      ^U    125   85    55    U
- *        026   22    16    SYN      ^V    126   86    56    V
- *        027   23    17    ETB      ^W    127   87    57    W
- *        030   24    18    CAN      ^X    130   88    58    X
- *        031   25    19    EM       ^Y    131   89    59    Y
- *        032   26    1A    SUB      ^Z    132   90    5A    Z
- *        033   27    1B    ESC            133   91    5B    [
- *        034   28    1C    FS             134   92    5C    \   '\\'
- *        035   29    1D    GS             135   93    5D    ]
- *        036   30    1E    RS             136   94    5E    ^
- *        037   31    1F    US             137   95    5F    _
- *        040   32    20    SPACE          140   96    60    `
- *        041   33    21    !              141   97    61    a
- *        042   34    22    "              142   98    62    b
- *        043   35    23    #              143   99    63    c
- *        044   36    24    $              144   100   64    d
- *        045   37    25    %              145   101   65    e
- *        046   38    26    &              146   102   66    f
- *        047   39    27    '              147   103   67    g
- *        050   40    28    (              150   104   68    h
- *        051   41    29    )              151   105   69    i
- *        052   42    2A    *              152   106   6A    j
- *        053   43    2B    +              153   107   6B    k
- *        054   44    2C    ,              154   108   6C    l
- *        055   45    2D    -              155   109   6D    m
- *        056   46    2E    .              156   110   6E    n
- *        057   47    2F    /              157   111   6F    o
- *        060   48    30    0              160   112   70    p
- *        061   49    31    1              161   113   71    q
- *        062   50    32    2              162   114   72    r
- *        063   51    33    3              163   115   73    s
- *        064   52    34    4              164   116   74    t
- *        065   53    35    5              165   117   75    u
- *        066   54    36    6              166   118   76    v
- *        067   55    37    7              167   119   77    w
- *        070   56    38    8              170   120   78    x
- *        071   57    39    9              171   121   79    y
- *        072   58    3A    :              172   122   7A    z
- *        073   59    3B    ;              173   123   7B    {
- *        074   60    3C    <              174   124   7C    |
- *        075   61    3D    =              175   125   7D    }
- *        076   62    3E    >              176   126   7E    ~
- *        077   63    3F    ?              177   127   7F    DEL
- *
- * Above chart reprinted from Linux manual page.
- *
- * When adding key functionality, be aware of key functions in the "big five"
- * levels of tin operation: top (group selection), group, thread, article
- * (pager), and help.  If possible, when adding a key to any of these levels,
- * check the others to make sure that the key doesn't do something
- * non-analogous elsewhere.  For instance, having "^R" map to "redraw screen"
- * at article level and "reset .newsrc" (a drastic and unreversible action)
- * at top level is a bad idea.
- *
- * [make emacs happy: "]
- */
-
-/*
- * Maximum chars (including null byte) needed to print a key name
- * the longest name will probably something like SPACE
- */
-#define MAXKEYLEN 10
-
-/*
- * Global keys
- */
-
-/* Internal use only - Need only be an invalid untypable key value */
-#define iKeyCatchupLeft 0x80	/* These two must be in mutually exclusive menus */
-#define iKeyMouseToggle	0x80
-
-#define iKeyAbort ESC
-#define iKeyPageDown3 ' '
-#ifndef NO_SHELL_ESCAPE
-#	define iKeyShellEscape '!'
-#endif /* !NO_SHELL_ESCAPE */
-#define iKeySetRange '#'
-#define iKeyLastPage '$'
-#define iKeyToggleColor '&'
-#define iKeyLastViewed '-'
-#define iKeySearchRepeat '\\'
-#define iKeySearchSubjF '/'
-#define iKeySearchSubjB '?'
-#define iKeySearchAuthB 'A'
-#define iKeySearchBody 'B'
-#define iKeyToggleHelpDisplay 'H'
-#define iKeyToggleInverseVideo 'I'
-#define iKeyLookupMessage 'L'
-#define iKeyOptionMenu 'M'
-#define iKeyPostponed2 'O'
-#define iKeyQuitTin 'Q'
-#define iKeyDisplayPostHist 'W'
-#define iKeyFirstPage '^'
-#define iKeySearchAuthF 'a'
-#define iKeyPageUp3 'b'
-#define iKeyHelp 'h'
-#define iKeyToggleInfoLastLine 'i'
-#define iKeyDown2 'j'
-#define iKeyUp2 'k'
-#define iKeyPrint 'o'
-#define iKeyQuit 'q'
-#define iKeyVersion 'v'
-#define iKeyPost 'w'
-#define iKeyPipe '|'
-#define iKeyPageUp ctrl('B')
-#define iKeyPageDown ctrl('D')
-#define iKeyPageDown2 ctrl('F')
-#define iKeyRedrawScr ctrl('L')
-#define iKeyDown ctrl('N')
-#define iKeyPostponed ctrl('O')
-#define iKeyUp ctrl('P')
-#define iKeyPageUp2 ctrl('U')
-
-/* config.c */
-
-#define iKeyConfigSelect '\n'
-#define iKeyConfigSelect2 '\r'
-#define iKeyConfigLastPage2 'G'
-#define iKeyConfigNoSave 'Q'
-#define iKeyConfigFirstPage2 'g'
-
-/* feed.c */
-
-#define iKeyFeedTag 'T'
-#define iKeyFeedArt 'a'
-#define iKeyFeedHot 'h'
-#define iKeyFeedPat 'p'
-#define iKeyFeedRepost 'r'
-#define iKeyFeedSupersede 's'
-#define iKeyFeedThd 't'
-
-/* filter.c */
-
-#define iKeyFilterEdit 'e'
-#define iKeyFilterSave 's'
-
-/* group.c */
-
-#define iKeyGroupAutoSel ctrl('A')
-#define iKeyGroupNextUnreadArtOrGrp '\t'
-#define iKeyGroupReadBasenote '\n'
-#define iKeyGroupKill ctrl('K')
-#define iKeyGroupReadBasenote2 '\r'
-#define iKeyGroupSelThd '*'
-#define iKeyGroupDoAutoSel '+'
-#define iKeyGroupToggleThdSel '.'
-/* digits 0-9 in use */
-#define iKeyGroupSelThdIfUnreadSelected ';'
-#define iKeyGroupSelPattern '='
-#define iKeyGroupReverseSel '@'
-#define iKeyGroupCatchupNextUnread 'C'
-#define iKeyGroupEditFilter 'E'
-#define iKeyGroupToggleGetartLimit 'G'
-#define iKeyGroupMarkThdRead 'K'
-#define iKeyGroupNextUnreadArt 'N'
-#define iKeyGroupPrevUnreadArt 'P'
-#define iKeyGroupBugReport 'R'
-#define iKeyGroupAutoSave 'S'
-#define iKeyGroupTagParts 'T'
-#define iKeyGroupUntag 'U'
-#define iKeyGroupMarkUnselArtRead 'X'
-#define iKeyGroupMarkThdUnread 'Z'
-#define iKeyGroupQuickAutoSel '['
-#define iKeyGroupQuickKill ']'
-#define iKeyGroupCatchup 'c'
-#define iKeyGroupToggleSubjDisplay 'd'
-#define iKeyGroupGoto 'g'
-#define iKeyGroupListThd 'l'
-#define iKeyGroupMail 'm'
-#define iKeyGroupNextGroup 'n'
-#ifndef DISABLE_PRINTING
-#	define iKeyPrint 'o'
-#endif /* !DISABLE_PRINTING */
-#define iKeyGroupPrevGroup 'p'
-#define iKeyGroupToggleReadUnread 'r'
-#define iKeyGroupSave 's'
-#define iKeyGroupTag 't'
-#define iKeyGroupToggleThreading 'u'
-#define iKeyGroupRepost 'x'
-#define iKeyGroupMarkArtUnread 'z'
-#define iKeyGroupUndoSel '~'
-
-/* help.c */
-
-#define iKeyHelpLastPage2 'G'
-#define iKeyHelpFirstPage2 'g'
-/* all other keys exit help */
-
-/* nrctbl.c */
-
-#define iKeyNrctblCreate 'c'
-#define iKeyNrctblDefault 'd'
-#define iKeyNrctblAlternative 'a'
-#define iKeyNrctblQuit 'q'
-
-/* page.c */
-
-#define iKeyPageAutoSel ctrl('A')
-#define iKeyPageReplyQuoteHeaders ctrl('E')
-#ifdef HAVE_PGP_GPG
-#	define iKeyPagePGPCheckArticle ctrl('G')
-#endif /* HAVE_PGP_GPG */
-#define iKeyPageToggleHeaders ctrl('H')
-#define iKeyPageNextUnread '\t'
-#define iKeyPageNextThd '\n'
-#define iKeyPageAutoKill ctrl('K')
-#define iKeyPageNextThd2 '\r'
-#define iKeyPageToggleTabs ctrl('T')
-#define iKeyPageFollowupQuoteHeaders ctrl('W')
-#define iKeyPageToggleTex2iso '\"'
-#define iKeyPageToggleRot '%'
-#define iKeyPageToggleUue '('
-#define iKeyPageReveal ')'
-/* digits 0-9 in use */
-#define iKeyPageSkipIncludedText ':'
-#define iKeyPageTopThd '<'
-#define iKeyPageBotThd '>'
-#define iKeyPageCatchupNextUnread 'C'
-#define iKeyPageCancel 'D'
-#define iKeyPageEditFilter 'E'
-#define iKeyPageFollowup 'F'
-#define iKeyPageLastPage 'G'
-#define iKeyPageKillThd 'K'
-#define iKeyPageNextUnreadArt 'N'
-#define iKeyPagePrevUnreadArt 'P'
-#define iKeyPageReply 'R'
-#define iKeyPageAutoSave 'S'
-#define iKeyPageGroupSel 'T'
-#define iKeyPageViewUrl 'U'
-#define iKeyPageViewAttach 'V'
-#define iKeyPageMarkThdUnread 'Z'
-#define iKeyPageQuickAutoSel '['		/* Merge with same keys in Group ? */
-#define iKeyPageQuickKill ']'
-#define iKeyPageToggleHighlight '_'
-#define iKeyPageCatchup 'c'
-#define iKeyPageEditArticle 'e'
-#define iKeyPageFollowupQuote 'f'
-#define iKeyPageFirstPage 'g'
-#define iKeyPageListThd 'l'
-#define iKeyPageMail 'm'
-#define iKeyPageNextArt 'n'
-#define iKeyPagePrevArt 'p'
-#define iKeyPageReplyQuote 'r'
-#define iKeyPageSave 's'
-#define iKeyPageTag 't'
-#define iKeyPageGotoParent 'u'
-#define iKeyPageRepost 'x'
-#define iKeyPageMarkArtUnread 'z'
-
-/* pgp.c */
-
-#define iKeyPgpEncSign 'b'
-#define iKeyPgpEncrypt 'e'
-#define iKeyPgpIncludekey 'i'
-#define iKeyPgpSign 's'
-
-/* post.c */
-
-#define iKeyPostCancel 'd'
-#define iKeyPostEdit 'e'
-#ifdef HAVE_PGP_GPG
-#	define iKeyPostPGP 'g'
-#endif /* HAVE_PGP_GPG */
-#ifdef HAVE_ISPELL
-#	define iKeyPostIspell 'i'
-#endif /* HAVE_ISPELL */
-#define iKeyPostContinue 'c'
-#define iKeyPostAbort 'a'
-#define iKeyPostIgnore 'i'
-#define iKeyPostMail 'm'
-#define iKeyPostPost2 'y'
-#define iKeyPostPost3 'p'
-#define iKeyPostSend 's'
-#define iKeyPostSend2 'y'
-#define iKeyPostSupersede 's'
-#define iKeyPostPostpone 'o'
-#define iKeyPostponeOverride 'Y'
-#define iKeyPostponeAll 'A'
-
-/* prompt.c */
-
-#define iKeyPromptYes 'y'
-#define iKeyPromptNo 'n'
-
-/* save.c */
-
-#define iKeySaveAppendFile 'a'
-#define iKeySaveOverwriteFile 'o'
-#define iKeyPProcNo 'n'
-#define iKeyPProcShar 's'
-#define iKeyPProcYes 'y'
-
-/* select.c */
-
-#define iKeySelectEnterNextUnreadGrp '\t'
-#define iKeySelectReadGrp '\n'
-#define iKeySelectReadGrp2 '\r'
-#define iKeySelectResetNewsrc ctrl('R')
-#define iKeySelectSortActive '.'
-#define iKeySelectCatchupNextUnread 'C'
-#define iKeySelectNextUnreadGrp 'N'
-#define iKeySelectBugReport 'R'
-#define iKeySelectSubscribePat 'S'
-#define iKeySelectUnsubscribePat 'U'
-#define iKeySelectQuitNoWrite 'X'
-#define iKeySelectSyncWithActive 'Y'
-#define iKeySelectMarkGrpUnread2 'Z'
-#define iKeySelectCatchup 'c'
-#define iKeySelectToggleDescriptions 'd'
-#define iKeySelectGoto 'g'
-#define iKeySelectMoveGrp 'm'
-#define iKeySelectEnterNextUnreadGrp2 'n'
-#define iKeySelectToggleReadDisplay 'r'
-#define iKeySelectSubscribe 's'
-#define iKeySelectUnsubscribe 'u'
-#define iKeySelectYankActive 'y'
-#define iKeySelectMarkGrpUnread 'z'
-
-/* thread.c */
-
-#define iKeyThreadReadNextArtOrThread '\t'
-#define iKeyThreadReadArt '\n'
-#define iKeyThreadReadArt2 '\r'
-#define iKeyThreadSelArt '*'
-#define iKeyThreadToggleArtSel '.'
-/* digits 0-9 in use */
-#define iKeyThreadReverseSel '@'
-#define iKeyThreadCatchupNextUnread 'C'
-#define iKeyThreadMarkArtRead 'K'
-#define iKeyThreadBugReport 'R'
-#define iKeyThreadAutoSave 'S'
-#define iKeyThreadUntag 'U'
-#define iKeyThreadMarkThdUnread 'Z'
-#define iKeyThreadCatchup 'c'
-#define iKeyThreadToggleSubjDisplay 'd'
-#define iKeyThreadMail 'm'
-#define iKeyThreadSave 's'
-#define iKeyThreadTag 't'
-#define iKeyThreadMarkArtUnread 'z'
-#define iKeyThreadUndoSel '~'
-
-#define iKeyMarkReadTag 't'
-#define iKeyMarkReadCur 'c'
-
-typedef struct kn {
-	const unsigned char defaultkey;	/* The default key definition */
-	unsigned char localkey;				/* The actual key definition */
-	const char *t;						/* Qualifier string in mapping file */
-} t_keynode;
-
-typedef struct mk {
-	t_keynode **keys;			/* valid keys in this menu */
-	char *defaultkeys;		/* all valid default keys in an array of char */
-	char *localkeys;			/* local keys in the same order as defaultkeys */
-} t_menukeys;
-
-typedef struct mkm {
-	/*
-	 * NOTE: If you prepend an entry, make sure you change the reference to
-	 * the first entry in keymap.c:build_keymaps() (menuptr), too.
-	 */
-	t_menukeys config_change;
-	t_menukeys feed_art_thread_regex_tag;
-	t_menukeys feed_post_process_type;
-	t_menukeys feed_supersede_article;
-	t_menukeys filter_quit_edit_save;
-	t_menukeys group_nav;
-	t_menukeys info_nav;
-	t_menukeys mark_read_tagged_current;
-	t_menukeys nrctbl_create;
-	t_menukeys page_nav;
-	t_menukeys pgp_mail;
-	t_menukeys pgp_news;
-	t_menukeys post_cancel;
-	t_menukeys post_cont;
-	t_menukeys post_delete;
-	t_menukeys post_edit;
-	t_menukeys post_edit_ext;
-	t_menukeys post_ignore_fupto;
-	t_menukeys post_mail_fup;
-	t_menukeys post_post;
-	t_menukeys post_postpone;
-	t_menukeys post_send;
-	t_menukeys prompt_yn;
-	t_menukeys save_append_overwrite_quit;
-	t_menukeys select_nav;
-	t_menukeys thread_nav;
-} t_menukeymap;
-
-extern int handle_keypad(int (*left_action) (void), int (*right_action) (void), const t_menukeys *menukeys);
-extern int prompt_slk_response(int ch_default, const t_menukeys *responses, const char *fmt, ...);
-extern int map_to_local(const char key, const t_menukeys *menukeys);
-extern int map_to_default(const char key, const t_menukeys *menukeys);
-extern t_menukeymap menukeymap;
-
-#endif /* !MENUKEYS_H */
diff -Nurp tin-1.6.2/include/newsrc.h tin-1.8.0/include/newsrc.h
--- tin-1.6.2/include/newsrc.h	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/include/newsrc.h	2005-12-02 12:08:13.000000000 +0100
@@ -0,0 +1,140 @@
+/*
+ *  Project   : tin - a Usenet reader
+ *  Module    : newsrc.h
+ *  Author    : I. Lea & R. Skrenta
+ *  Created   : 1991-04-01
+ *  Updated   : 2003-11-18
+ *  Notes     : newsrc bit handling
+ *
+ * Copyright (c) 1997-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior written
+ *    permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef NEWSRC_H
+#define NEWSRC_H 1
+
+/*
+ * The following macros are used to simplify and speed up the
+ * manipulation of the bitmaps in memory which record which articles
+ * are read or unread in each news group.
+ *
+ * Data representation:
+ *
+ * Each bitmap is handled as an array of bytes; the least-significant
+ * bit of the 0th byte is the 0th bit; the most significant bit of
+ * the 0th byte is the 7th bit. Thus, the most-significant bit of the
+ * 128th byte is the 1023rd bit, and in general the mth bit of the nth
+ * byte is considered to be bit (n*8)+m of the map as a whole.	Conversely,
+ * the position of bit q in the map is the bit (q & 7) of byte (q >> 3).
+ * A bitmap of b bits will be allocated as ((b+7) >> 3) bytes.
+ *
+ * The routines could be changed to operate on a word-oriented bitmap by
+ * changing the constants used from 8 to 16, 3 to 4, 7 to 15, etc. and
+ * changing the allocate/deallocate routines.
+ *
+ * In the newsrc context, a 0 bit represents an article which is read
+ * or expired; a 1 represents an unread article. The 0th bit corresponds
+ * to the minimum article number for this group, and (max-min+7)/8 bytes
+ * are allocated to the bitmap.
+ *
+ * Constants:
+ *
+ * NBITS   = total number of bits per byte;
+ * NMAXBIT = number of bits per byte or word;
+ * NBITPOS = number of bit in NMAXBIT;
+ * NBITSON = byte/word used to set all bits in byte/word to 1;
+ * NBITNEG1 = binary negation of 1, used in constructing masks.
+ *
+ * Macro naming and use:
+ *
+ * The NOFFSET and NBITIDX macro construct the byte and bit indexes in
+ * the map, given a bit number.
+ *
+ * The NSET0 macro sets a bit to binary 0
+ * The NSET1 macro sets a bit to binary 1
+ * The NSETBLK0 macro sets the same bit or bits to binary 0
+ * The NSETBLK1 macro sets the same bit or bits to binary 1
+ * The NTEST macro tests a single bit.
+ * These are used frequently to access the group bitmap.
+ *
+ * NSETBLK0 and NSETBLK1 operate on whole numbers of bytes, and are
+ * mainly useful for initializing complete bitmaps to one state or
+ * another. Both use the memset function, which is assumed to be
+ * optimized for the target architecture. NSETBLK is currently used to
+ * initialize the group bitmap to 1s (unread).
+ *
+ * NSETRNG0 and NSETRNG1 operate on ranges of bits, from a low bit number
+ * to a high bit number (inclusive), and are especially useful for
+ * efficiently setting a contiguous range of bits to one state or another.
+ * NSETRNG0 is currently used on the group bitmap to mark the ranges the
+ * newsrc file says are read or expired.
+ *
+ * The algorithm is this. If the high number is less than the low, then
+ * do nothing (error); if both fall within the same byte, construct a
+ * single mask expressing the range and AND or OR it into the byte; else:
+ * construct a mask for the byte containing the low bit, AND or OR it in;
+ * use memset to fill in the intervening bytes efficiently; then construct
+ * a mask for the byte containing the high bit, and AND or OR this mask
+ * in. Masks are constructed by left-shift of 0xff (to set high-order bits
+ * to 1), negating a left-shift of 0xfe (to set low-order bits to 1), and
+ * the various negations and combinations of the same. This procedure is
+ * complex, but 1 to 2 orders of magnitude faster than a shift inside a
+ * loop for each bit inside a loop for each individual byte.
+ *
+ */
+#define NBITS		8
+#define NMAXBIT		7
+#define NBITPOS		3
+#define NBITSON		0xff
+#define NBITNEG1	0xfe
+#define NOFFSET(b)	((b) >> NBITPOS)
+#define NBITIDX(b)	((b) & NMAXBIT)
+
+#define NBITMASK(beg,end)	(unsigned char) ~(((1 << (((NMAXBIT - beg) - (NMAXBIT - end)) + 1)) - 1) << (NMAXBIT - end))
+
+#define NTEST(n,b)	(n[NOFFSET(b)] &   (1 << NBITIDX(b)))
+
+#define NSETBLK1(n,i)	(memset (n, NBITSON, (size_t) NOFFSET(i)+1))
+#define NSETBLK0(n,i)	(memset (n, 0, (size_t) NOFFSET(i)+1))
+
+/* dbmalloc checks memset() parameters, so we'll use it to check the assignments */
+#ifdef USE_DBMALLOC
+#	define NSET1(n,b) memset(n + NOFFSET(b), n[NOFFSET(b)] | NTEST(n,b), 1)
+#	define NSET0(n,b) memset(n + NOFFSET(b), n[NOFFSET(b)] & ~NTEST(n,b), 1)
+#	define BIT_OR(n, b, mask)   memset(n + NOFFSET(b), n[NOFFSET(b)] | (mask), 1)
+#	define BIT_AND(n, b, mask)  memset(n + NOFFSET(b), n[NOFFSET(b)] & (mask), 1)
+#	include <dbmalloc.h> /* dbmalloc 1.4 */
+#else
+#	define NSET1(n,b)	(n[NOFFSET(b)] |=  (1 << NBITIDX(b)))
+#	define NSET0(n,b)	(n[NOFFSET(b)] &= ~(1 << NBITIDX(b)))
+#	define BIT_OR(n, b, mask)   n[NOFFSET(b)] |= mask
+#	define BIT_AND(n, b, mask)  n[NOFFSET(b)] &= mask
+#endif /* USE_DBMALLOC */
+
+#define BITS_TO_BYTES(n)	((size_t) ((n + NBITS - 1) / NBITS))
+
+#endif /* !NEWSRC_H */
diff -Nurp tin-1.6.2/include/nntplib.h tin-1.8.0/include/nntplib.h
--- tin-1.6.2/include/nntplib.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/nntplib.h	2005-12-02 12:08:13.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : nntplib.h
  *  Author    : I.Lea
  *  Created   : 1991-04-01
- *  Updated   : 2003-02-21
+ *  Updated   : 2005-07-21
  *  Notes     : nntp.h 1.5.11/1.6 with extensions for tin
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -39,11 +39,7 @@
 #define NNTPLIB_H 1
 
 #ifndef NNTP_SERVER_FILE
-#	ifdef M_AMIGA
-#		define NNTP_SERVER_FILE	"uulib:nntpserver"
-#	else
-#		define NNTP_SERVER_FILE	"/etc/nntpserver"
-#	endif /* M_AMIGA */
+#	define NNTP_SERVER_FILE	"/etc/nntpserver"
 #endif /* !NNTP_SERVER_FILE */
 
 #define NNTP_TCP_NAME	"nntp"
@@ -92,11 +88,13 @@
 #endif /* 0 */
 
 #define	INF_HELP		100	/* Help text on way */
+#define	INF_CAPABILITIES	101	/* Capability list follows */
 #define	INF_AUTH		180	/* Authorization capabilities */
 #define	INF_DEBUG		199	/* Debug output */
 
 #define	OK_CANPOST		200	/* Hello; you can post */
 #define	OK_NOPOST		201	/* Hello; you can't post */
+#define	OK_EXTENSIONS	202	/* extensions supported follow */
 #define	OK_NOIHAVE		202	/* Hello; you can't IHAVE; discussed on the IETF-mailinglist */
 #define	OK_SLAVE		202	/* Slave status noted */
 #define	OK_NOPOSTIHAVE	203	/* Hello; you can't POST or IHAVE; iscussed on the IETF-mailinglist */
@@ -168,4 +166,45 @@
  */
 #define NNTP_STRLEN		512
 
+/*
+ * CAPABILITIES
+ */
+struct t_capabilities {
+	unsigned int type:3;			/* none, LIST EXTENSIONS, CAPABILITIES */
+	unsigned int version;			/* CAPABILITIES version */
+	t_bool mode_reader:1;			/* MODE-READER: "MODE READER" */
+	t_bool reader:1;				/* READER: "ARTCILE", "BODY", "LISTGROUP" */
+	t_bool post:1;					/* POST */
+	t_bool list_active:1;			/* LIST ACTIVE */
+	t_bool list_active_times:1;		/* LIST ACTIVE.TIMES, optional */
+	t_bool list_distrib_pats:1;		/* LIST DISTRIB.PATS, optional */
+	t_bool list_headers:1;			/* LIST HEADERS */
+	t_bool list_newsgroups:1;		/* LIST NEWSGROUPS */
+	t_bool list_overview_fmt:1;		/* LIST OVERVIEW.FMT */
+	t_bool list_motd:1;				/* LIST MOTD, "private" extension */
+	t_bool list_subscriptions:1;	/* LIST SUBSCRIPTIONS, "private" extension, RFC 2980 */
+	t_bool list_distributions:1;	/* LIST DISTRIBUTIONS, "private" extension, RFC 2980 */
+	t_bool list_moderators:1;		/* LIST MODERATORS, "private" extension */
+	t_bool xpat:1;					/* XPAT, "private" extension, RFC 2980 */
+	t_bool hdr:1;					/* HDR: "HDR", "LIST HEADERS" */
+	const char *hdr_cmd;			/* [X]HDR */
+	t_bool over:1;					/* OVER: "OVER", "LIST OVERVIEW.FMT" */
+	t_bool over_msgid:1;			/* OVER: "OVER mid" */
+	const char *over_cmd;			/* [X]OVER */
+	t_bool newnews:1;				/* NEWNEWS */
+	char *implementation;			/* IMPLEMENTATION */
+	t_bool starttls:1;				/* STARTTLS */
+	t_bool authinfo_user:1;			/* AUTHINFO USER/PASS */
+	t_bool authinfo_sasl:1;			/* AUTHINFO SASL */
+#if 0
+	t_bool sasl_cram_md5:1;			/* SASL CRAM-MD5 */
+	t_bool sasl_digest_md5:1;		/* SASL DIGEST-MD5 */
+	t_bool sasl_plain:1;			/* SASL PLAIN */
+	t_bool sasl_gssapi:1;			/* SASL GSSAPI */
+	t_bool sasl_external:1;			/* SASL EXTERNAL */
+	t_bool streaming:1;				/* STREAMING: "MODE STREAM", "CHECK", "TAKETHIS" */
+	t_bool ihave:1;					/* IHAVE: "IHAVE" */
+#endif /* 0 */
+};
+
 #endif /* !NNTPLIB_H */
diff -Nurp tin-1.6.2/include/oldconfig.h tin-1.8.0/include/oldconfig.h
--- tin-1.6.2/include/oldconfig.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/oldconfig.h	2005-12-02 12:08:13.000000000 +0100
@@ -6,7 +6,7 @@
  *  Updated   : 2001-07-22
  *  Notes     : #defines to determine different OS capabilites
  *
- * Copyright (c) 1995-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1995-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff -Nurp tin-1.6.2/include/policy.h tin-1.8.0/include/policy.h
--- tin-1.6.2/include/policy.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/policy.h	2005-12-02 12:08:13.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : policy.h
  *  Author    : Ralf Doeblitz <doeblitz@gmx.de>
  *  Created   : 1999-01-12
- *  Updated   : 2003-03-11
+ *  Updated   : 2005-11-17
  *  Notes     : #defines and static data for policy configuration
  *
- * Copyright (c) 1999-2003 Ralf Doeblitz <doeblitz@gmx.de>
+ * Copyright (c) 1999-2006 Ralf Doeblitz <doeblitz@gmx.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -61,9 +61,8 @@
  * .bj  Benin                          .bm  Bermuda
  * .bn  Brunei Darussalam              .bo  Bolivia
  * .br  Brazil                         .bs  Bahamas
- * .bt  Bhutan                         .bv  Bouvet Island
- * .bw  Botswana                       .by  Belarus
- * .bz  Belize
+ * .bt  Bhutan                         .bw  Botswana
+ * .by  Belarus                        .bz  Belize
  *
  * .ca  Canada                         .cc  Cocos (Keeling) Islands
  * .cd  Congo, Democratic People's Republic
@@ -81,9 +80,9 @@
  * .do  Dominican Republic             .dz  Algeria
  *
  * .ec  Ecuador                        .ee  Estonia
- * .eg  Egypt                          .eh  Western Sahara
- * .er  Eritrea                        .es  Spain
- * .et  Ethiopia
+ * .eg  Egypt                          .er  Eritrea
+ * .es  Spain                          .et  Ethiopia
+ * .eu  European Union
  *
  * .fi  Finland                        .fj  Fiji
  * .fk  Falkland Islands (Malvina)     .fm  Micronesia, Federal State of
@@ -116,7 +115,6 @@
  * .ke  Kenya                          .kg  Kyrgystan
  * .kh  Cambodia                       .ki  Kiribati
  * .km  Comoros                        .kn  Saint Kitts and Nevis
- * .kp  Korea, Democratic People's Republic
  * .kr  Korea, Republic of             .kw  Kuwait
  * .ky  Cayman Islands                 .kz  Kazakhstan
  *
@@ -165,21 +163,22 @@
  * .sc  Seychelles                     .sd  Sudan
  * .se  Sweden                         .sg  Singapore
  * .sh  St. Helena                     .si  Slovenia
- * .sj  Svalbard and Jan Mayen Islands .sk  Slovakia
- * .sl  Sierra Leone                   .sm  San Marino
- * .sn  Senegal                        .so  Somalia
- * .sr  Surinam                        .st  Sao Tome and Principe
- * .su  Soviet Union (former)          .sv  El Salvador
- * .sy  Syrian Arab Republic           .sz  Swaziland
+ * .sk  Slovakia                       .sl  Sierra Leone
+ * .sm  San Marino                     .sn  Senegal
+ * .so  Somalia                        .sr  Surinam
+ * .st  Sao Tome and Principe          .su  Soviet Union (former)
+ * .sv  El Salvador                    .sy  Syrian Arab Republic
+ * .sz  Swaziland
  *
  * .tc  The Turks & Caicos Islands     .td  Chad
  * .tf  French Southern Territories    .tg  Togo
  * .th  Thailand                       .tj  Tajikistan
- * .tk  Tokelau                        .tm  Turkmenistan
- * .tn  Tunisia                        .to  Tonga
- * .tp  East Timor                     .tr  Turkey
- * .tt  Trinidad and Tobago            .tv  Tuvalu
- * .tw  Taiwan                         .tz  Tanzania
+ * .tk  Tokelau                        .tl  Timor-Leste
+ * .tm  Turkmenistan                   .tn  Tunisia
+ * .to  Tonga                          .tp  East Timor
+ * .tr  Turkey                         .tt  Trinidad and Tobago
+ * .tv  Tuvalu                         .tw  Taiwan
+ * .tz  Tanzania
  *
  * .ua  Ukraine                        .ug  Uganda
  * .uk  United Kingdom
@@ -201,35 +200,50 @@
  * .zw  Zimbabwe
  *
  *
- * invalid TLDs:
- * .cs  former Czechoslovakia, now: .cz and .sk
- * .zr  former Zaire, now: .cd
+ * invalid/obsolete TLDs:
+ * .bu  Burma, now .mm
+ * .cs  former Czechoslovakia, now .cz and .sk
+ * .dd  former German Democratic Republic, now .de
  * .fx  France, Metropolitan
+ * .yd  Democratic Yemen, now .ye
+ * .wg  West Bank and Gaza, now .ps
+ * .zr  former Zaire, now .cd
+ *
+ * user-assigned code elements:
+ * .aa, .qm, .qz, .xa, .xz, .zz
  *
  * unused TLDs:
+ * .bv  Bouvet Island
+ * .eh  Western Sahara
+ * .kp  Korea, Democratic People's Republic
  * .nt  Neutral Zone
+ * .sj  Svalbard and Jan Mayen Islands
  *
  * requested new TLDs:
- * .eu  European Union
+ * .ax  Aaland-Islands (Finnish; planned for 2006)
+ * .cs  Serbia and Montenegro
  *
- * 'expireing' TLDs:
- *(.hk  Hong Kong, now: .cn)
- * .su  former USSR, now: .ru
+ * xccTLDs:
+ * .gb  United Kingdom, use .uk
+ * .hk  Hong Kong, now .cn
+ * .su  former USSR, now .ru
+ * .tp  former East Timor, now .tl
+ * .yu  former Yugoslavia
  */
 
 static char gnksa_country_codes[26*26] = {
 /*      A B C D E  F G H I J  K L M N O  P Q R S T  U V W X Y Z */
 /* A */ 0,0,1,1,1, 1,1,0,1,0, 0,1,1,1,1, 0,1,1,1,1, 1,0,1,0,0,1,
-/* B */ 1,1,0,1,1, 1,1,1,1,1, 0,0,1,1,1, 0,0,1,1,1, 0,1,1,0,1,1,
+/* B */ 1,1,0,1,1, 1,1,1,1,1, 0,0,1,1,1, 0,0,1,1,1, 0,0,1,0,1,1,
 /* C */ 1,0,1,1,0, 1,1,1,1,0, 1,1,1,1,1, 0,0,1,0,0, 1,1,0,1,1,1,
 /* D */ 0,0,0,0,1, 0,0,0,0,1, 1,0,1,0,1, 0,0,0,0,0, 0,0,0,0,0,1,
-/* E */ 0,0,1,0,1, 0,1,1,0,0, 0,0,0,0,0, 0,0,1,1,1, 0,0,0,0,0,0,
+/* E */ 0,0,1,0,1, 0,1,0,0,0, 0,0,0,0,0, 0,0,1,1,1, 1,0,0,0,0,0,
 /* F */ 0,0,0,0,0, 0,0,0,1,1, 1,0,1,0,1, 0,0,1,0,0, 0,0,0,0,0,0,
 /* G */ 1,1,0,1,1, 1,1,1,1,0, 0,1,1,1,0, 1,1,1,1,1, 1,0,1,0,1,0,
 /* H */ 0,0,0,0,0, 0,0,0,0,0, 1,0,1,1,0, 0,0,1,0,1, 1,0,0,0,0,0,
 /* I */ 0,0,0,1,1, 0,0,0,0,0, 0,1,1,1,1, 0,1,1,1,1, 0,0,0,0,0,0,
 /* J */ 0,0,0,0,1, 0,0,0,0,0, 0,0,1,0,1, 1,0,0,0,0, 0,0,0,0,0,0,
-/* K */ 0,0,0,0,1, 0,1,1,1,0, 0,0,1,1,0, 1,0,1,0,0, 0,0,1,0,1,1,
+/* K */ 0,0,0,0,1, 0,1,1,1,0, 0,0,1,1,0, 0,0,1,0,0, 0,0,1,0,1,1,
 /* L */ 1,1,1,0,0, 0,0,0,1,0, 1,0,0,0,0, 0,0,1,1,1, 1,1,0,0,1,0,
 /* M */ 1,0,1,1,0, 0,1,1,0,0, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1,1,
 /* N */ 1,0,1,0,1, 1,1,0,1,0, 0,1,0,0,1, 1,0,1,0,0, 1,0,0,0,0,1,
@@ -237,8 +251,8 @@ static char gnksa_country_codes[26*26] =
 /* P */ 1,0,0,0,1, 1,1,1,0,0, 1,1,1,1,0, 0,0,1,1,1, 0,0,1,0,1,0,
 /* Q */ 1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0,
 /* R */ 0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0, 1,0,1,0,0,0,
-/* S */ 1,1,1,1,1, 0,1,1,1,1, 1,1,1,1,1, 0,0,1,0,1, 1,1,0,0,1,1,
-/* T */ 0,0,1,1,0, 1,1,1,0,1, 1,0,1,1,1, 1,0,1,0,1, 0,1,1,0,0,1,
+/* S */ 1,1,1,1,1, 0,1,1,1,0, 1,1,1,1,1, 0,0,1,0,1, 1,1,0,0,1,1,
+/* T */ 0,0,1,1,0, 1,1,1,0,1, 1,1,1,1,1, 1,0,1,0,1, 0,1,1,0,0,1,
 /* U */ 1,0,0,0,0, 0,1,0,0,0, 1,0,1,0,0, 0,0,0,1,0, 0,0,0,0,1,1,
 /* V */ 1,0,1,0,1, 0,1,0,1,0, 0,0,0,1,0, 0,0,0,0,0, 1,0,0,0,0,0,
 /* W */ 0,0,0,0,0, 1,0,0,0,0, 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0,0,0,
@@ -268,8 +282,13 @@ static const char *gnksa_domain_list[] =
 	"info",	/* Unrestricted use */
 	"name",	/* For registration by individuals */
 	"museum",	/* Museums */
-	/* 3 more gTLDs to come in 2003 (.travel is likely to be one of them) */
+	/*
+	 * more gTLDs to come >=2005, proposed are:
+	 *  .asia   .cat    .jobs   .mail   .mobi
+	 *  .post   .tel    .travel .xxx	.kids
+	 */
 #	if 0		/* $DEAD */
+	"nato",
 	"uucp",
 	"bitnet",
 #	endif /* 0 */
diff -Nurp tin-1.6.2/include/proto.h tin-1.8.0/include/proto.h
--- tin-1.6.2/include/proto.h	2003-08-26 15:10:18.000000000 +0200
+++ tin-1.8.0/include/proto.h	2005-12-02 12:08:13.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : proto.h
  *  Author    : Urs Janssen <urs@tin.org>
  *  Created   :
- *  Updated   : 2003-08-26
+ *  Updated   : 2005-10-19
  *  Notes     :
  *
- * Copyright (c) 1997-2003 Urs Janssen <urs@tin.org>
+ * Copyright (c) 1997-2006 Urs Janssen <urs@tin.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,6 +38,13 @@
 #ifndef PROTO_H
 #	define PROTO_H 1
 
+#ifndef KEYMAP_H
+#	include "keymap.h"
+#endif /* !KEYMAP_H */
+#ifndef OPTIONS_MENU_H
+#	include "options_menu.h"
+#endif /* !OPTIONS_MENU_H */
+
 /* This fixes ambiguities on platforms that don't distinguish extern case */
 #ifdef CASE_PROBLEM
 #	define Raw tin_raw
@@ -47,7 +54,6 @@
 /* active.c */
 extern char group_flag(char ch);
 extern int find_newnews_index(const char *cur_newnews_host);
-extern int get_active_num(void);
 extern t_bool match_group_list(const char *group, const char *group_list);
 extern t_bool parse_active_line(char *line, long *max, long *min, char *moderated);
 extern t_bool process_bogus(char *name);
@@ -66,7 +72,7 @@ extern void make_threads(struct t_group 
 extern void set_article(struct t_article *art);
 extern void show_art_msg(const char *group);
 extern void sort_arts(unsigned /* int */ sort_art_type);
-extern void write_nov_file(struct t_group *group);
+extern void write_overview(struct t_group *group);
 
 /* attrib.c */
 extern void read_attributes_files(void);
@@ -79,8 +85,8 @@ extern void write_attributes_file(const 
 
 /* charset.c */
 extern char *convert_to_printable(char *buf);
+extern char *convert_body2printable(char* buf);
 extern t_bool is_art_tex_encoded(FILE *fp);
-extern void convert_body2printable(char* buf);
 extern void convert_iso2asc(char *iso, char **asc_buffer, int *max_line_len, int t);
 extern void convert_tex2iso(char *from, char *to);
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
@@ -88,19 +94,16 @@ extern void convert_tex2iso(char *from, 
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 /* color.c */
+extern void draw_pager_line(const char *str, int flags, t_bool raw_data);
 #ifdef HAVE_COLOR
 	extern void bcol(int color);
 	extern void fcol(int color);
 #endif /* HAVE_COLOR */
-extern void draw_pager_line(const char *str, int flags);
 
 /* config.c */
 extern char **ulBuildArgv(char *cmd, int *new_argc);
-extern char *fmt_option_prompt(char *dst, int len, t_bool editing, int option);
 extern char *quote_space_to_dash(char *str);
 extern const char *print_boolean(t_bool value);
-extern int change_config_file(struct t_group *group);
-extern int option_row(int option);
 extern t_bool match_boolean(char *line, const char *pat, t_bool *dst);
 extern t_bool match_integer(char *line, const char *pat, int *dst, int maxval);
 extern t_bool match_list(char *line, constext *pat, constext *const *table, size_t tablelen, int *dst);
@@ -109,8 +112,6 @@ extern t_bool match_string(char *line, c
 extern t_bool read_config_file(char *file, t_bool global_file);
 extern void quote_dash_to_space(char *str);
 extern void read_server_config(void);
-extern void refresh_config_page(int act_option);
-extern void show_menu_help(const char *help_message);
 extern void write_config_file(char *file);
 
 /* cook.c */
@@ -123,22 +124,11 @@ extern OUTC_RETTYPE outchar(OUTC_ARGS);
 extern int InitScreen(void);
 extern int RawState(void);
 extern int ReadCh(void);
-#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE) && !defined(USE_CURSES)
-	extern wint_t ReadWch(void);
-#endif /* MULTIBYTE_ABLE && !NO_LOCALE && !USE_CURSES */
 extern int get_arrow_key(int prech);
 extern int get_termcaps(void);
-extern void ClearScreen(void);
-extern void CleartoEOLN(void);
-extern void CleartoEOS(void);
-extern void ScrollScreen(int lines_to_scroll);
-extern void SetScrollRegion(int topline, int bottomline);
 extern void EndInverse(void);
 extern void EndWin(void);
 extern void InitWin(void);
-#ifndef USE_CURSES
-	extern void MoveCursor(int row, int col);
-#endif /* USE_CURSES */
 extern void Raw(int state);
 extern void StartInverse(void);
 extern void cursoroff(void);
@@ -150,6 +140,17 @@ extern void set_xclick_off(void);
 extern void set_xclick_on(void);
 extern void setup_screen(void);
 extern void word_highlight_string(int row, int col, int size, int color);
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE) && !defined(USE_CURSES)
+	extern wint_t ReadWch(void);
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE && !USE_CURSES */
+#ifndef USE_CURSES
+	extern void ClearScreen(void);
+	extern void CleartoEOLN(void);
+	extern void CleartoEOS(void);
+	extern void MoveCursor(int row, int col);
+	extern void ScrollScreen(int lines_to_scroll);
+	extern void SetScrollRegion(int topline, int bottomline);
+#endif /* USE_CURSES */
 #if 0
 	extern void ToggleInverse(void);
 #endif /* 0 */
@@ -157,12 +158,15 @@ extern void word_highlight_string(int ro
 /* debug.c */
 #ifdef DEBUG
 	extern void debug_delete_files(void);
-	extern void debug_nntp(const char *func, const char *line);
+	extern void debug_nntp(const char *func, const char *fmt, ...);
 	extern void debug_print_active(void);
 	extern void debug_print_arts(void);
 	extern void debug_print_filters(void);
 	extern void debug_print_header(struct t_article *s);
-	extern void vDbgPrintMalloc(int iIsMalloc, const char *pcFile, int iLine, size_t iSize);
+	extern void debug_print_malloc(int is_malloc, const char *xfile, int line, size_t size);
+#	ifdef NNTP_ABLE
+		extern void debug_print_nntp_extensions(void);
+#	endif /* NNTP_ABLE */
 #endif /* DEBUG */
 #ifdef DEBUG_NEWSRC
 	extern void debug_print_newsrc(struct t_newsrc *NewSrc, FILE *fp);
@@ -180,8 +184,8 @@ extern void feed_articles(int function, 
 
 /* filter.c */
 extern t_bool filter_articles(struct t_group *group);
-extern t_bool filter_menu(int type, struct t_group *group, struct t_article *art);
-extern t_bool quick_filter(int type, struct t_group *group, struct t_article *art);
+extern t_bool filter_menu(t_function type, struct t_group *group, struct t_article *art);
+extern t_bool quick_filter(t_function type, struct t_group *group, struct t_article *art);
 extern t_bool quick_filter_select_posted_art(struct t_group *group, const char *subj, const char *a_message_id);
 extern t_bool read_filter_file(const char *file);
 extern void free_filter_array(struct t_filters *ptr);
@@ -191,6 +195,7 @@ extern void write_filter_file(const char
 
 /* getline.c */
 extern char *tin_getline(const char *prompt, int number_only, const char *str, int max_chars, t_bool passwd, int which_hist);
+extern void gl_redraw(void);
 
 /* global.c */
 extern void bug_report(void);
@@ -202,17 +207,17 @@ extern void top_of_list(void);
 extern void end_of_list(void);
 extern void move_to_item(int n);
 extern void prompt_item_num(int ch, const char *prompt);
+extern void scroll_down(void);
+extern void scroll_up(void);
 extern void set_first_screen_item(void);
 
 /* group.c */
 extern int find_new_pos(int old_top, long old_artnum, int cur_pos);
 extern int group_page(struct t_group *group);
 extern void clear_note_area(void);
-extern void mark_screen(int level, int screen_row, int screen_col, const char *value);
+extern void mark_screen(int screen_row, int screen_col, const char *value);
 extern void pos_first_unread_thread(void);
-extern void set_subj_from_size(int num_cols);
 extern void show_group_page(void);
-extern void toggle_subject_from(void);
 
 /* hashstr.c */
 extern char *hash_str(const char *s);
@@ -238,7 +243,6 @@ extern void get_from_name(char *from_nam
 extern void get_user_info(char *user_name, char *full_name);
 
 /* init.c */
-extern t_bool(*wildcard_func)(const char *str, char *patt, t_bool icase);		/* Wildcard matching function */
 extern void init_selfinfo(void);
 extern void postinit_regexp(void);
 #ifdef HAVE_COLOR
@@ -249,13 +253,14 @@ extern void postinit_regexp(void);
 extern void joinpath(char *result, const char *dir, const char *file);
 
 /* keymap.c */
-extern char *printascii(char *buf, int ch);
 extern t_bool read_keymap_file(void);
-extern void build_keymaps(void);
 extern void free_keymaps(void);
+extern void setup_default_keys(void);
 
 /* langinfo.c */
-extern char *tin_nl_langinfo(nl_item item);
+#ifndef NO_LOCALE
+	extern const char *tin_nl_langinfo(nl_item item);
+#endif /* !NO_LOCALE */
 
 /* list.c */
 extern char *random_organization(char *in_org);
@@ -288,10 +293,6 @@ extern void grp_del_mail_art(struct t_ar
 	extern void write_mail_active_file(void);
 #endif /* HAVE_MH_MAIL_HANDLING */
 
-/* mimetypes.c */
-extern void lookup_mimetype(const char *ext, t_part *part);
-extern t_bool lookup_extension(char *extension, size_t ext_len, const char *major, const char *minor);
-
 /* main.c */
 extern int main(int argc, char *argv[]);
 extern int read_cmd_line_groups(void);
@@ -315,13 +316,19 @@ extern void *my_realloc1(const char *fil
 	extern void init_screen_array(t_bool allocate);
 #endif /* !USE_CURSES */
 
+/* mimetypes.c */
+extern void lookup_mimetype(const char *ext, t_part *part);
+extern t_bool lookup_extension(char *extension, size_t ext_len, const char *major, const char *minor);
+
 /* misc.c */
-extern const char *eat_re(char *s, t_bool eat_was);
+extern char *buffer_to_ascii(char *c);
 extern char *escape_shell_meta(const char *source, int quote_area);
 extern char *get_tmpfilename(const char *filename);
+extern char *idna_decode(char *in);
 extern char *quote_wild(char *str);
 extern char *quote_wild_whitespace(char *str);
 extern char *strip_line(char *line);
+extern const char *eat_re(char *s, t_bool eat_was);
 extern const char *get_val(const char *env, const char *def);
 extern const char *gnksa_strerror(int errcode);
 extern int gnksa_check_from(char *from);
@@ -335,6 +342,7 @@ extern int parse_from(const char *from, 
 extern int strfmailer(const char *mail_prog, char *subject, char *to, const char *filename, char *dest, size_t maxsize, const char *format);
 extern int strfpath(const char *format, char *str, size_t maxsize, struct t_group *group);
 extern int strfquote(const char *group, int respnum, char *s, size_t maxsize, char *format);
+extern int tin_version_info(FILE *fp);
 extern long file_mtime(const char *file);
 extern long file_size(const char *file);
 extern t_bool backup_file(const char *filename, const char *backupname);
@@ -349,6 +357,7 @@ extern void cleanup_tmp_files(void);
 extern void copy_body(FILE *fp_ip, FILE *fp_op, char *prefix, char *initl, t_bool raw_data);
 extern void create_index_lock_file(char *the_lock_file);
 extern void dir_name(const char *fullpath, char *dir);
+extern void draw_mark_selected(int i);
 extern void draw_percent_mark(long cur_num, long max_num);
 extern void get_author(t_bool thread, struct t_article *art, char *str, size_t len);
 extern void get_cwd(char *buf);
@@ -361,6 +370,9 @@ extern void show_inverse_video_status(vo
 extern void strip_name(const char *from, char *address);
 extern void tin_done(int ret);
 extern void toggle_inverse_video(void);
+#if defined(CHARSET_CONVERSION) || (defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE))
+	extern char *utf8_valid(char *line);
+#endif /* CHARSET_CONVERSION || (MULTIBYTE_ABLE && !NO_LOCALE) */
 #ifdef CHARSET_CONVERSION
 	extern t_bool buffer_to_network(char *line, int mmnwcharset);
 #endif /* CHARSET_CONVERSION */
@@ -380,6 +392,7 @@ extern void toggle_inverse_video(void);
 #endif /* !NO_SHELL_ESCAPE */
 
 /* newsrc.c */
+extern int group_get_art_info(char *tin_spooldir, char *groupname, int grouptype, long *art_count, long *art_max, long *art_min);
 extern signed long int read_newsrc(char *newsrc_file, t_bool allgroups);
 extern signed long int write_newsrc(void);
 extern t_bool pos_group_in_newsrc(struct t_group *group, int pos);
@@ -396,10 +409,10 @@ extern void subscribe(struct t_group *gr
 extern void thd_mark_read(struct t_group *group, long thread);
 extern void thd_mark_unread(struct t_group *group, long thread);
 extern void set_default_bitmap(struct t_group *group);
-extern void art_mark_deleted(struct t_article *art);
-extern void art_mark_undeleted(struct t_article *art);
 #ifdef DEBUG_NEWSRC
-	extern void vNewsrcTestHarness(void);
+#	if 0
+	extern void newsrc_test_harness(void);
+#	endif /* 0 */
 #endif /* DEBUG_NEWSRC */
 
 /* nntplib.c */
@@ -407,41 +420,29 @@ extern FILE *get_nntp_fp(FILE *fp);
 extern FILE *get_nntp_wr_fp(FILE *fp);
 extern char *getserverbyfile(const char *file);
 extern char *get_server(char *string, int size);
-extern int server_init(char *machine, const char *service, int port, char *text, size_t mlen);
-extern void close_server(void);
-extern void put_server(const char *string);
-extern void u_put_server(const char *string);
-#ifdef DEBUG
-	extern const char *nntp_respcode(int respcode);
-#endif /* DEBUG */
-
-/* nrctbl.c */
-extern int get_newsrcname(char *newsrc_name, const char *nntpserver_name);
-extern void get_nntpserver(char *nntpserver_name, char *nick_name);
-
-/* open.c */
-extern FILE *open_art_fp(struct t_group *group, long art);
-extern FILE *open_newgroups_fp(int the_index);
-extern FILE *open_news_active_fp(void);
-extern FILE *open_newsgroups_fp(void);
-extern FILE *open_overview_fmt_fp(void);
-extern FILE *open_subscription_fp(void);
-extern FILE *open_art_header(long art);
 extern int get_respcode(char *, size_t);
 extern int get_only_respcode(char *, size_t);
 extern int nntp_open(void);
-extern int group_get_art_info(char *tin_spooldir, char *groupname, int grouptype, long *art_count, long *art_max, long *art_min);
-extern long setup_hard_base(struct t_group *group);
 extern void nntp_close(void);
-extern void vGet1GrpArtInfo(struct t_group *grp);
-#ifdef HAVE_MH_MAIL_HANDLING
-	extern FILE *open_mail_active_fp(const char *mode);
-	extern FILE *open_mailgroups_fp(void);
-#endif /* HAVE_MH_MAIL_HANDLING */
+extern void put_server(const char *string);
+extern void u_put_server(const char *string);
 #ifdef NNTP_ABLE
 	extern FILE *nntp_command(const char *, int, char *, size_t);
 #endif /* NNTP_ABLE */
 
+/* nrctbl.c */
+extern int get_newsrcname(char *newsrc_name, const char *nntpserver_name);
+extern void get_nntpserver(char *nntpserver_name, char *nick_name);
+
+/* options_menu.c */
+extern char *fmt_option_prompt(char *dst, size_t len, t_bool editing, enum option_enum option);
+extern int change_config_file(struct t_group *group);
+extern int option_row(enum option_enum option);
+extern t_bool option_is_visible(enum option_enum option);
+extern void check_score_defaults(void);
+extern void refresh_config_page(enum option_enum act_option);
+extern void show_menu_help(const char *help_message);
+
 /* page.c */
 extern int show_page(struct t_group *group, int respnum, int *threadnum);
 extern void display_info_page(int part);
@@ -470,41 +471,41 @@ extern time_t parsedate(char *p, TIMEINF
 #endif /* !HAVE_VSNPRINTF */
 
 /* post.c */
+extern char *checknadd_headers(const char *infile);
 extern int count_postponed_articles(void);
 extern int mail_to_author(const char *group, int respnum, t_bool copy_text, t_bool with_headers, t_bool raw_data);
 extern int mail_to_someone(const char *address, t_bool confirm_to_mail, t_openartinfo *artinfo, const struct t_group *group);
-extern int post_response(const char *group, int respnum, t_bool copy_text, t_bool with_headers, t_bool raw_data);
-extern int repost_article(const char *group, int respnum, t_bool supersede, t_openartinfo *artinfo);
+extern int post_response(const char *groupname, int respnum, t_bool copy_text, t_bool with_headers, t_bool raw_data);
+extern int repost_article(const char *groupname, int respnum, t_bool supersede, t_openartinfo *artinfo);
 extern t_bool cancel_article(struct t_group *group, struct t_article *art, int respnum);
 extern t_bool mail_bug_report(void);
 extern t_bool pickup_postponed_articles(t_bool ask, t_bool all);
-extern t_bool post_article(const char *group);
+extern t_bool post_article(const char *groupname);
 extern t_bool reread_active_after_posting(void);
 extern t_bool user_posted_messages(void);
-extern void checknadd_headers(const char *infile);
 extern void init_postinfo(void);
 extern void quick_post_article(t_bool postponed_only);
 #ifdef USE_CANLOCK
-	extern const char *build_cankey(const char *messageid, const char *secret);
 	extern const char *build_canlock(const char *messageid, const char *secret);
 	extern char *get_secret(void);
 #endif /* USE_CANLOCK */
 
 /* prompt.c */
 extern char *prompt_string_default(const char *prompt, char *def, const char *failtext, int history);
-extern char *sized_message(const char *format, const char *subject);
-extern int prompt_list(int row, int col, int var, constext *help_text, constext *prompt_text, constext *list[], int size);
+extern char *sized_message(char **result, const char *format, const char *subject);
 extern int prompt_num(int ch, const char *prompt);
-extern int prompt_yn(int line, const char *prompt, t_bool default_answer);
+extern int prompt_yn(const char *prompt, t_bool default_answer);
 extern int prompt_msgid(void);
 extern t_bool prompt_default_string(const char *prompt, char *buf, int buf_len, char *default_prompt, int which_hist);
 extern t_bool prompt_menu_string(int line, const char *prompt, char *var);
-extern t_bool prompt_option_char(int option);
-extern t_bool prompt_option_num(int option);
-extern t_bool prompt_option_string(int option);
+extern t_bool prompt_option_char(enum option_enum option);
+extern t_bool prompt_option_list(enum option_enum option);
+extern t_bool prompt_option_num(enum option_enum option);
+extern t_bool prompt_option_on_off(enum option_enum option);
+extern t_bool prompt_option_string(enum option_enum option);
 extern t_bool prompt_string(const char *prompt, char *buf, int which_hist);
 extern void prompt_continue(void);
-extern void prompt_on_off(int row, int col, t_bool *var, constext *help_text, constext *prompt_text);
+extern void prompt_slk_redraw(void);
 
 /* read.c */
 extern char *tin_fgets(FILE *fp, t_bool header);
@@ -523,7 +524,7 @@ extern void thread_by_reference(void);
 
 /* regex.c */
 extern t_bool compile_regex(const char *regex, struct regex_cache *cache, int options);
-extern t_bool match_regex(const char *string, char *pattern, t_bool icase);
+extern t_bool match_regex(const char *string, char *pattern, struct regex_cache *cache, t_bool icase);
 extern void highlight_regexes(int row, struct regex_cache *regex, int color);
 
 /* rfc1524.c */
@@ -531,12 +532,15 @@ extern t_mailcap *get_mailcap_entry(t_pa
 extern void free_mailcap(t_mailcap *tmailcap);
 
 /* rfc2045.c */
+extern int read_decoded_base64_line(FILE *file, char **line, int *max_line_len, const int max_lines_to_read, char **rest);
+extern int read_decoded_qp_line(FILE *file, char **line, int *max_line_len, const int max_lines_to_read);
 extern void rfc1521_encode(char *line, FILE *f, int e);
 
 /* rfc2046.c */
+extern FILE *open_art_fp(struct t_group *group, long art);
 extern const char *get_param(t_param *list, const char *name);
 extern char *parse_header(char *buf, const char *pat, t_bool decode, t_bool structured);
-extern int art_open(t_bool wrap_lines, struct t_article *art, struct t_group *group, t_openartinfo *artinfo, t_bool show_progress_meter);
+extern int art_open(t_bool wrap_lines, struct t_article *art, struct t_group *group, t_openartinfo *artinfo, t_bool show_progress_meter, char *pmesg);
 extern int content_type(char *type);
 extern int parse_rfc822_headers(struct t_header *hdr, FILE *from, FILE *to);
 extern t_part *new_part(t_part *part);
@@ -551,17 +555,20 @@ extern char *rfc1522_decode(const char *
 extern char *rfc1522_encode(char *s, const char *charset, t_bool ismail);
 extern int mmdecode(const char *what, int encoding, int delimiter, char *where);
 extern void rfc15211522_encode(const char *filename, constext *mime_encoding, struct t_group *group, t_bool allow_8bit_header, t_bool ismail);
+extern void compose_mail_mime_forwarded(const char *filename, FILE *articlefp, t_bool include_text, struct t_group *group);
+extern void compose_mail_text_plain(const char *filename, struct t_group *group);
 
 /* save.c */
 extern int check_start_save_any_news(int function, t_bool catchup);
 extern t_bool create_path(const char *path);
 extern t_bool expand_save_filename(char *outpath, const char *path);
-extern t_bool post_process_files(int proc_type_ch, t_bool auto_delete);
+extern t_bool post_process_files(t_function proc_type_type, t_bool auto_delete);
 extern t_bool save_and_process_art(t_openartinfo *artinfo, struct t_article *artptr, t_bool is_mailbox, const char *inpath, int max, t_bool post_process);
 extern void decode_save_mime(t_openartinfo *art, t_bool postproc);
 extern void print_art_seperator_line(FILE *fp, t_bool is_mailbox);
 
 /* screen.c */
+extern char *fmt_message(const char *fmt, va_list ap);
 extern void center_line(int line, t_bool inverse, const char *str);
 extern void clear_message(void);
 extern void draw_arrow_mark(int line);
@@ -577,20 +584,19 @@ extern void stow_cursor(void);
 extern void wait_message(unsigned int sdelay, const char *fmt, ...);
 
 /* search.c */
+extern enum option_enum search_config(t_bool forward, t_bool repeat, enum option_enum current, enum option_enum last);
 extern int get_search_vectors(int *start, int *end);
-extern int search(int key, int current_art, t_bool forward, t_bool repeat);
+extern int search(t_function func, int current_art, t_bool repeat);
 extern int search_active(t_bool forward, t_bool repeat);
 extern int search_article(t_bool forward, t_bool repeat, int start_line, int lines, t_lineinfo *line, int reveal_ctrl_l_lines, FILE *fp);
-extern int search_config(t_bool forward, t_bool repeat, int current, int last);
 extern int search_body(struct t_group *group, int current_art, t_bool repeat);
+extern void reset_srch_offsets(void);
 
 /* select.c */
 extern int add_my_group(const char *group, t_bool add);
 extern int choose_new_group(void);
 extern int skip_newgroups(void);
-extern void draw_group_arrow(void);
 extern void selection_page(int start_groupnum, int num_cmd_line_groups);
-extern void set_groupname_len(t_bool all_groups);
 extern void show_selection_page(void);
 extern void toggle_my_groups(const char *group);
 
@@ -598,7 +604,7 @@ extern void toggle_my_groups(const char 
 extern void msg_write_signature(FILE *fp, t_bool flag, struct t_group *thisgroup);
 
 /* signal.c */
-extern RETSIGTYPE(*sigdisp (int sig, RETSIGTYPE (*func)(SIG_ARGS))) (SIG_ARGS);
+extern RETSIGTYPE(*sigdisp (int signum, RETSIGTYPE (*func)(SIG_ARGS))) (SIG_ARGS);
 extern t_bool set_win_size(int *num_lines, int *num_cols);
 extern void allow_resize(t_bool allow);
 extern void handle_resize(t_bool repaint);
@@ -611,16 +617,22 @@ extern size_t my_strftime(char *s, size_
 
 /* string.c */
 extern char *eat_tab(char *s);
+extern char *fmt_string(const char *fmt, ...);
 extern char *my_strdup(const char *str);
 extern char *str_trim(char *string);
+extern char *strunc(const char *message, int len);
 extern char *tin_ltoa(long value, int digits);
-#if !defined(HAVE_STRCASESTR) || defined(DECL_STRCASESTR)
-	extern const char *strcasestr(const char *haystack, const char *needle);
-#endif /* !HAVE_STRCASESTR || DECL_STRCASESTR */
+extern char *tin_strtok(char *str, const char *delim);
 extern int sh_format(char *dst, size_t len, const char *fmt, ...);
 extern size_t mystrcat(char **t, const char *s);
 extern void my_strncpy(char *p, const char *q, size_t n);
 extern void str_lwr(char *str);
+#if !defined(HAVE_STRCASESTR) || defined(DECL_STRCASESTR)
+	extern const char *strcasestr(const char *haystack, const char *needle);
+#endif /* !HAVE_STRCASESTR || DECL_STRCASESTR */
+#if !defined(HAVE_STRSEP) || defined(DECL_SEP)
+	extern char *strsep(char **stringp, const char *delim);
+#endif /* !HAVE_STRSEP || DECL_STRSEP */
 #ifndef HAVE_STRPBRK
 	extern char *strpbrk(char *str1, char *str2);
 #endif /* !HAVE_STRPBRK */
@@ -651,8 +663,18 @@ extern void str_lwr(char *str);
 #	define strrstr(s,p)	my_strrstr(s,p)
 #endif /* !HAVE_STRRSTR */
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	extern void wcspart(wchar_t *to, const wchar_t *from, int columns, int size_to, t_bool pad);
+	extern char *wchar_t2char(const wchar_t *wstr);
+	extern wchar_t *char2wchar_t(const char *str);
+	extern wchar_t *wcspart(const wchar_t *wstr, int columns, t_bool pad);
+	extern wchar_t *wstrunc(const wchar_t *wmessage, int len);
+	extern wchar_t *my_wcsdup(const wchar_t *wstr);
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && defined(HAVE_UNICODE_UBIDI_H) && !defined(NO_LOCALE)
+	extern char *render_bidi(const char *str, t_bool *is_rtl);
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && HAVE_UNICODE_UBIDI_H && !NO_LOCALE */
+#ifdef HAVE_UNICODE_NORMALIZATION
+	extern char *normalize(const char *str);
+#endif /* HAVE_UNICODE_NORMALIZATION */
 
 /* tags.c */
 extern int line_is_tagged(int n);
@@ -690,7 +712,6 @@ extern int stat_thread(int n, struct t_a
 extern int which_response(int n);
 extern int which_thread(int n);
 extern int thread_page(struct t_group *group, int respnum, int thread_depth, t_pagerinfo *page);
-extern void draw_line(int i, int magic);
 extern void fixup_thread(int respnum, t_bool redraw);
 
 /* version.c */
diff -Nurp tin-1.6.2/include/rfc2046.h tin-1.8.0/include/rfc2046.h
--- tin-1.6.2/include/rfc2046.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/rfc2046.h	2005-12-02 12:08:13.000000000 +0100
@@ -6,7 +6,7 @@
  *  Updated   : 2003-05-06
  *  Notes     : rfc2046 MIME article definitions
  *
- * Copyright (c) 2000-2003 Jason Faultless <jason@altarstone.com>
+ * Copyright (c) 2000-2006 Jason Faultless <jason@altarstone.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff -Nurp tin-1.6.2/include/stpwatch.h tin-1.8.0/include/stpwatch.h
--- tin-1.6.2/include/stpwatch.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/stpwatch.h	2005-12-02 12:08:13.000000000 +0100
@@ -7,7 +7,7 @@
  *  Notes     : Simple stopwatch routines for timing code using timeb
  *	             or gettimeofday structs
  *
- * Copyright (c) 1993-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1993-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff -Nurp tin-1.6.2/include/tcurses.h tin-1.8.0/include/tcurses.h
--- tin-1.6.2/include/tcurses.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/tcurses.h	2005-12-02 12:08:13.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : tcurses.h
  *  Author    : Thomas Dickey
  *  Created   : 1997-03-02
- *  Updated   : 2003-06-27
+ *  Updated   : 2004-07-19
  *  Notes     : curses #include files, #defines & struct's
  *
- * Copyright (c) 1997-2003 Thomas Dickey <dickey@invisible-island.net>
+ * Copyright (c) 1997-2006 Thomas Dickey <dickey@invisible-island.net>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -103,6 +103,7 @@ extern void my_fputc(int ch, FILE *strea
 extern void my_fputs(const char *str, FILE *stream);
 #		if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 	extern void my_fputwc(wint_t wc, FILE *fp);
+	extern void my_fputws(const wchar_t *wstr, FILE *fp);
 	extern wint_t cmdReadWch(void);
 	extern wint_t ReadWch(void);
 #		endif /* MULTIBYTE_ABLE && !NO_LOCALE */
@@ -124,11 +125,15 @@ extern void write_line(int row, char *bu
 
 #		ifdef NEED_TERM_H
 #			include <curses.h>
-#			ifdef HAVE_NCURSES_TERM_H
-#				include <ncurses/term.h>
+#			ifdef HAVE_NCURSESW_TERM_H
+#				include <ncursesw/term.h>
 #			else
-#				include <term.h>
-#			endif /* HAVE_NCURSES_TERM_H */
+#				ifdef HAVE_NCURSES_TERM_H
+#					include <ncurses/term.h>
+#				else
+#					include <term.h>
+#				endif /* HAVE_NCURSES_TERM_H */
+#			endif /* HAVE_NCURSESW_TERM_H */
 #		else
 #			ifdef HAVE_TERMCAP_H
 #				include <termcap.h>
@@ -146,6 +151,12 @@ extern void write_line(int row, char *bu
 				else \
 					fputwc(wc, stream); \
 			}
+#			define my_fputws(wstr, stream)	{ \
+				if (fwide(stream, 0) <= 0) \
+					fprintf(stream, "%ls", wstr); \
+				else \
+					fputws(wstr, stream); \
+			}
 #		endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 #		define my_printf			printf
@@ -153,7 +164,7 @@ extern void write_line(int row, char *bu
 #		define my_flush()			fflush(stdout)
 #		define my_fflush(stream)		fflush(stream)
 #		define my_retouch()			ClearScreen()
-#		define WriteLine(row,buffer)		/*nothing*/
+#		define WriteLine(row,buffer)		MoveCursor(row, 0); my_fputs(buffer, stdout);
 
 #		define HpGlitch(func)			if (_hp_glitch) func
 
diff -Nurp tin-1.6.2/include/tin.h tin-1.8.0/include/tin.h
--- tin-1.6.2/include/tin.h	2003-09-05 17:55:45.000000000 +0200
+++ tin-1.8.0/include/tin.h	2005-12-02 12:08:13.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : tin.h
  *  Author    : I. Lea & R. Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 2003-09-05
+ *  Updated   : 2005-06-30
  *  Notes     : #include files, #defines & struct's
  *
- * Copyright (c) 1997-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1997-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -63,12 +63,6 @@
 #	define INET6
 #endif /* HAVE_GETADDRINFO && HAVE_GAI_STRERROR && ENABLE_IPV6 */
 
-/* Locale support in Mac OS X doesn't work yet, so turn it off */
-#ifdef MAC_OS_X
-#	ifndef NO_LOCALE
-#		define NO_LOCALE 1
-#	endif /* !NO_LOCALE */
-#endif /* MAC_OS_X */
 
 /*
  * Native Language Support.
@@ -84,7 +78,7 @@
 
 #define N_(Str) Str
 
-#ifdef ENABLE_NLS
+#if defined(ENABLE_NLS) && !defined(__BUILD__)
 #	include <libintl.h>
 #	define _(Text)	gettext(Text)
 #else
@@ -93,29 +87,20 @@
 #	undef textdomain
 #	define textdomain(Domain) /* empty */
 #	define _(Text) Text
-#endif /* ENABLE_NLS */
+#endif /* ENABLE_NLS && !__BUILD__ */
 
 #ifndef LOCALEDIR
 #	define LOCALEDIR "/usr/share/locale"
 #endif /* !LOCALEDIR */
 
-/*
- * Non-autoconf'able definitions for Amiga Developer Environment (gcc 2.7.2,
- * etc).
- */
 #if defined(__amiga__) || defined(__amiga)
 #	define SMALL_MEMORY_MACHINE
-#	if !defined(__GNUC__)
-#		undef M_UNIX
-#		define M_AMIGA
-#		define SIG_ARGS /* nothing, since compiler doesn't handle it */
-#		undef DECL_SIG_CONST
-#	endif /* !__GNUC__ */
 #endif /* __amiga__ || __amiga */
 
 #include	<signal.h>
 
 enum context { cMain, cArt, cConfig, cFilter, cGroup, cHelp, cInfopager, cPage, cSelect, cThread };
+enum icontext { cNone, cGetline, cPromptSLK };
 enum resizer { cNo, cYes, cRedraw };
 enum rc_state { RC_IGNORE, RC_CHECK, RC_UPGRADE, RC_DOWNGRADE, RC_ERROR };
 
@@ -200,13 +185,9 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 #	include <sys/types.h>
 #endif /* HAVE_SYS_TYPES_H */
 
-#ifdef M_AMIGA
-#	include "include:stat.h"	/* FIXME: Problem with AmiTCP-includes, AmiTCP's fstat() needs */
-#else									/* a running TCP-Stack. OTOH fstat() ist used with local spool */
-#	ifdef HAVE_SYS_STAT_H
-#		include <sys/stat.h>
-#	endif /* HAVE_SYS_STAT_H */
-#endif /* M_AMIGA */
+#ifdef HAVE_SYS_STAT_H
+#	include <sys/stat.h>
+#endif /* HAVE_SYS_STAT_H */
 
 #ifdef TIME_WITH_SYS_TIME
 #	include <sys/time.h>
@@ -379,10 +360,6 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 #		define DIR_BUF	struct direct
 #	endif /* HAVE_DIRENT_H */
 #else
-#	ifdef M_AMIGA
-#		include "amiga.h"
-#		define DIR_BUF	struct dirent
-#	endif /* M_AMIGA */
 #	ifdef M_XENIX
 #		include <sys/ndir.h>
 #		define DIR_BUF	struct direct
@@ -494,11 +471,7 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 #			ifdef VMS
 #				define NEWSLIBDIR	"NEWSLIB:[000000]"
 #			else
-#				ifdef M_AMIGA
-#					define NEWSLIBDIR	"uulib:news"
-#				else
-#					define NEWSLIBDIR	"/usr/lib/news"
-#				endif /* M_AMIGA */
+#				define NEWSLIBDIR	"/usr/lib/news"
 #			endif /* VMS */
 #		endif /* !NEWSLIBDIR */
 #		ifndef NOVROOTDIR
@@ -517,7 +490,7 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 /*
  * Determine machine configuration for external programs & directories
  */
-#if defined(BSD) && !defined(M_AMIGA)
+#if defined(BSD)
 /*
  * To catch 4.3 Net2 code base or newer
  * (e.g. FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD, BSD/386 1.1 and below).
@@ -561,18 +534,6 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 #	ifdef linux
 #		define DEFAULT_PRINTER	"/usr/bin/lpr"
 #	endif /* linux */
-#	ifdef M_AMIGA
-#		ifndef DEFAULT_EDITOR
-#			define DEFAULT_EDITOR	"c:ed"
-#		endif /* !DEFAULT_EDITOR */
-#		define DEFAULT_MAILBOX	"uumail:"
-#		define DEFAULT_MAILER	"uucp:c/sendmail"
-#		define DEFAULT_POSTER	"uucp:c/postnews %s"
-#		define DEFAULT_PRINTER	"copy to PRT:"
-#		define DEFAULT_BBS_PRINTER	"copy to NIL:"
-#		define DEFAULT_SHELL	"newshell"	/* Not Yet Implemented */
-#		define DEFAULT_UNSHAR	"unshar %s"
-#	endif /* M_AMIGA */
 #	ifdef VMS
 #		define DEFAULT_EDITOR	"EDIT/TPU"
 #		define DEFAULT_MAILBOX	"SYS$LOGIN:"
@@ -631,7 +592,7 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 #	define PATH_ISPELL	"ispell"
 #endif /* !PATH_ISPELL */
 
-#ifndef PATH_METAMAIL	/* unly unset if !HAVE_METAMAIL */
+#ifndef PATH_METAMAIL	/* only unset if !HAVE_METAMAIL */
 #	define PATH_METAMAIL	"metamail"
 #endif /* !PATH_METAMAIL */
 #define METAMAIL_CMD		PATH_METAMAIL" -e -p -m \"tin\""
@@ -741,6 +702,7 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 #define DEFAULT_STRIP_RE_REGEX	"(?:R[eE](?:\\^\\d+|\\[\\d\\])?|A[wW]|Odp|Sv):\\s"
 /* case sensitive */
 #define DEFAULT_STRIP_WAS_REGEX	".\\((?:[Ww]a[rs]|[Bb]y[l³]o):.*\\)\\s*$"
+#define DEFAULT_U8_STRIP_WAS_REGEX	".\\((?:[Ww]a[rs]|[Bb]y[l\\x{0142}]o):.*\\)\\s*$"
 /*
  * overkill regexp for balanced '()':
  * #define DEFAULT_STRIP_WAS_REGEX	".\\((?:[Ww]a[rs]|[Bb]y[l³]o):(?:(?:[^)(])*(?:\\([^)(]*\\))*)+\\)\\s*$"
@@ -757,20 +719,27 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 
 /*
  * URL related regexs:
- * add TELNET & WAIS (RFC 1738), IMAP (RFC 2192), NFS (RFC 2224)
+ * add TELNET (RFC 4248), WAIS (RFC 4156), IMAP (RFC 2192), NFS (RFC 2224)
  *     LDAP (RFC 2255), POP (RFC 2384)
  * add IPv6 (RFC 2732, RFC 2373) support
  */
 /*
  * case insensitive
- * split out ftp (only ftp allows username:passwd@, RFC 1738)?
- *
- * NOTE: the "-(?!-)" assertion must be removed when IDN is introduced
+ * TODO: - split out ftp (only ftp allows username:passwd@, RFC 1738)?
+ *       - test IDNA (RFC 3490) case
  */
-#if 0 /* this one is ok for IPv4 */
-#	define URL_REGEX	"\\b(?:https?|ftp|gopher)://(?:[^:@/\\s]*(?::[^:@/\\s]*)?@)?(?:(?:[^\\W_](?:(?:-(?!-)|[^\\W_]){0,61}[^\\W_])?\\.)+[a-z]{2,6}\\.?|localhost|(?:(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?))(?::\\d+)?(?:/[^)\\>\"\\s]*|$|(?=[)\\>\"\\s]))"
-#else	/* this one should be IPv6 safe - test me! */
-#	define URL_REGEX	"\\b(?:https?|ftp|gopher)://(?:[^:@/\\s]*(?::[^:@/\\s]*)?@)?(?:(?:[^\\W_](?:(?:-(?!-)|[^\\W_]){0,61}[^\\W_])?\\.)+[a-z]{2,6}\\.?|localhost|(?:(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)|\\[(?:(?:[0-9A-F]{0,4}:){1,7}[0-9A-F]{1,4}|(?:[0-9A-F]{0,4}:){1,3}(?:(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?))\\])(?::\\d+)?(?:/[^)\\>\"\\s]*|$|(?=[)\\>\"\\s]))"
+#if 0
+#	if 0 /* this one is ok for IPv4 */
+#		define URL_REGEX	"\\b(?:https?|ftp|gopher)://(?:[^:@/\\s]*(?::[^:@/\\s]*)?@)?(?:(?:[^\\W_](?:(?:-(?!-)|[^\\W_]){0,61}[^\\W_])?\\.)+[a-z]{2,6}\\.?|localhost|(?:(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?))(?::\\d+)?(?:/[^)\\]\\>\"\\s]*|$|(?=[)\\]\\>\"\\s]))"
+#	else	/* this one should be IPv6 safe - test me! */
+#		define URL_REGEX	"\\b(?:https?|ftp|gopher)://(?:[^:@/\\s]*(?::[^:@/\\s]*)?@)?(?:(?:[^\\W_](?:(?:-(?!-)|[^\\W_]){0,61}[^\\W_])?\\.)+[a-z]{2,6}\\.?|localhost|(?:(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)|\\[(?:(?:[0-9A-F]{0,4}:){1,7}[0-9A-F]{1,4}|(?:[0-9A-F]{0,4}:){1,3}(?:(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?))\\])(?::\\d+)?(?:/[^)\\]\\>\"\\s]*|$|(?=[)\\]\\>\"\\s]))"
+#	endif /* 0 */
+#else /* the following should be IDN safe */
+#	if 0 /* this one is ok for IPv4 */
+#		define URL_REGEX	"\\b(?:https?|ftp|gopher)://(?:[^:@/\\s]*(?::[^:@/\\s]*)?@)?(?:(?:(?:[^\\W_](?:(?:-(?!-)|[^\\W_]){0,61}[^\\W_])?|xn--[^\\W_](?:-(?!-)|[^\\W_]){1,57}[^\\W_])\\.)+[a-z]{2,6}\\.?|localhost|(?:(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?))(?::\\d+)?(?:/[^)\\]\\>\"\\s]*|$|(?=[)\\]\\>\"\\s]))"
+#	else	/* this one should be IPv6 safe - test me! */
+#		define URL_REGEX	"\\b(?:https?|ftp|gopher)://(?:[^:@/\\s]*(?::[^:@/\\s]*)?@)?(?:(?:(?:[^\\W_](?:(?:-(?!-)|[^\\W_]){0,61}[^\\W_])?|xn--[^\\W_](?:-(?!-)|[^\\W_]){1,57}[^\\W_])\\.)+[a-z]{2,6}\\.?|localhost|(?:(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)|\\[(?:(?:[0-9A-F]{0,4}:){1,7}[0-9A-F]{1,4}|(?:[0-9A-F]{0,4}:){1,3}(?:(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?))\\])(?::\\d+)?(?:/[^)\\]\\>\"\\s]*|$|(?=[)\\]\\>\"\\s]))"
+#	endif /* 0 */
 #endif /* 0 */
 /*
  * case insensitive
@@ -781,7 +750,15 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 /*
  * case insensitive
  */
-#define NEWS_REGEX	"\\b(?:s?news|nntp):[^\\s@]+[@.][^\\s@]+(?:$|(?=[\\s.><,\"/():]))\\b"
+#if 1 /* complex */
+#	define NEWS_REGEX "\\b(?:s?news|nntp):(?:(?:(?://(?:(?:[^\\W_](?:(?:-(?!-)|[^\\W_]){0,61}[^\\W_])?|xn--[^\\W_](?:-(?!-)|[^\\W_]){1,57}[^\\W_])\\.)+[a-z]{2,6}\\.?|localhost|(?:(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(?:2[0-4]\\d|25[0-5]|[01]?\\d\\d?))(?::\\d+)?(?(?=[/])[^()\\^\\[\\]{}\\|\\x00-\\x1f\\x7f\\s\"<>'\\\\:,;]+|$))|[^\\^\\[\\]{}\\|\\x00-\\x1f\\x7f\\s<>\"():,;\\\\'/]+)\\b"
+#else
+#	if 1 /* less complex */
+#		define NEWS_REGEX	"\\b(?:s?news|nntp):[^\\s\\*@>]+(?(?=[@])[^\\s\\*@<>()\",/]+|[^\\s\\*<>()\":,/]+)\\b"
+#	else
+#		define NEWS_REGEX	"\\b(?:s?news|nntp):[^\\s@]+[@.][^\\s@]+(?:$|(?=[\\s.><,\"/():]))\\b"
+#	endif /* 1 */
+#endif /* 1 */
 #if 0 /* not implemented */
 /*
  * case insensitive
@@ -810,6 +787,7 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 #define POSTPONED_FILE	"postponed.articles"
 #define SUBSCRIPTIONS_FILE	"subscriptions"
 #define NEWSGROUPS_FILE	"newsgroups"
+#define KEYMAP_FILE	"keymap"
 
 
 #ifdef USE_INN_NNTPLIB
@@ -840,10 +818,11 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 #else
 #	ifdef HAVE_NL_TYPES_H
 #		include <nl_types.h>
-#	else
-		typedef int nl_item;
 #	endif /* HAVE_NL_TYPES_H */
 #endif /* HAVE_LANGINFO_H */
+#ifndef HAVE_NL_ITEM
+	typedef int nl_item;
+#endif /* HAVE_NL_ITEM */
 #ifndef CODESET
 #	define CODESET ((nl_item) 1)
 #endif /* CODESET */
@@ -896,11 +875,11 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
  * HEADER_LEN  = max. size of a news/mail header-line
  * NEWSRC_LINE =
  */
-#if defined(VMS) || defined(M_AMIGA)
+#if defined(VMS)
 #	define PATH_LEN	256
 #	define NAME_LEN	14
 #	define LEN	512
-#endif /* VMS || M_AMIGA */
+#endif /* VMS */
 
 #ifdef M_UNIX
 #	ifdef PATH_MAX
@@ -1004,14 +983,15 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 #define TINRC_CONFIRM_SELECT	(tinrc.confirm_choice == 2 || tinrc.confirm_choice == 5 || tinrc.confirm_choice == 6 || tinrc.confirm_choice == 7)
 
 /*
- * Number of MIME Encodings
+ * MIME Encodings
  */
-#define NUM_MIME_ENCODINGS	4
-
-#define MIME_ENCODING_8BIT	0
-#define MIME_ENCODING_BASE64	1
-#define MIME_ENCODING_QP	2
-#define MIME_ENCODING_7BIT	3
+enum {
+	MIME_ENCODING_8BIT = 0,
+	MIME_ENCODING_BASE64,
+	MIME_ENCODING_QP,
+	MIME_ENCODING_7BIT,
+	NUM_MIME_ENCODINGS
+};
 
 #ifdef CHARSET_CONVERSION			/* can/should do charset conversion via iconv() */
 #	define NUM_MIME_CHARSETS 27	/* # known 'outgoing' charsets */
@@ -1044,15 +1024,18 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 /* Line number (starting at 0) of 1st non-header data on the screen */
 /* ie, size of header */
 #define INDEX_TOP	2
+#define INDEX2LNUM(i)	(INDEX_TOP + (i) - currmenu->first)
+#ifndef USE_CURSES
+#	define INDEX2SNUM(i)	((i) - currmenu->first)
+#endif /* !USE_CURSES */
 
 #define GROUP_MATCH(s1, pat, case)		(wildmat(s1, pat, case))
 
-#define REGEX_MATCH(s1, pat, case)	(wildcard_func(s1, pat, case))
 #define REGEX_FMT (tinrc.wildcard ? "%s" : "*%s*")
 
 #define IGNORE_ART(i)	((tinrc.kill_level != KILL_THREAD && arts[i].killed) || (arts[i].thread == ART_EXPIRED))
 /* only used for threading */
-#define IGNORE_ART_THREAD(i)	(arts[i].thread != ART_NORMAL || (tinrc.kill_level == KILL_NOTHREAD && arts[i].killed))
+#define IGNORE_ART_THREAD(i)	(arts[i].thread != ART_UNTHREADED || (tinrc.kill_level == KILL_NOTHREAD && arts[i].killed))
 
 /*
  * Is this part text/plain ?
@@ -1061,7 +1044,7 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 			(x->type == TYPE_TEXT && strcasecmp("plain", x->subtype) == 0)
 
 /* TRUE if basenote has responses */
-#define HAS_FOLLOWUPS(i)	(arts[base[i]].thread != -1)
+#define HAS_FOLLOWUPS(i)	(arts[base[i]].thread >= 0)
 
 /*
  * Only close off our stream when reading on local spool
@@ -1123,7 +1106,6 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 /*
  * used by feed_articles() & show_mini_help() & quick_filter & add_filter_rule
  */
-#define INTERNAL_LEVEL  0	/* do we need this? see comments in filter.c */
 #define SELECT_LEVEL	1
 #define GROUP_LEVEL	2
 #define THREAD_LEVEL	3
@@ -1154,8 +1136,11 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 #define THREAD_REFS		2
 #define THREAD_BOTH		3
 #define THREAD_MULTI		4
+#define THREAD_PERC		5
+
+#define THREAD_MAX		THREAD_PERC
 
-#define THREAD_MAX		THREAD_MULTI
+#define THREAD_PERC_DEFAULT	75
 
 /*
  * Values for show_author
@@ -1181,6 +1166,16 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 #define THREAD_SCORE_WEIGHT	2
 
 /*
+ * Values for interactive_mailer
+ */
+enum {
+	INTERACTIVE_NONE = 0,
+	INTERACTIVE_WITH_HEADERS,
+	INTERACTIVE_WITHOUT_HEADERS,
+	NUM_INTERACTIVE_MAILERS
+};
+
+/*
  * used in feed.c & save.c
  */
 #define POST_PROC_NO		0
@@ -1212,12 +1207,6 @@ enum rc_state { RC_IGNORE, RC_CHECK, RC_
 #define SORT_THREADS_BY_SCORE_ASCEND	2
 
 /*
- * Search keys
- */
-#define SEARCH_SUBJ		1
-#define SEARCH_AUTH		2
-
-/*
  * Different values of strip_bogus - the ways to handle bogus groups
  */
 #define BOGUS_KEEP		0	/* not used */
@@ -1307,7 +1296,9 @@ enum {
 /*
  * Assertion verifier
  */
-#undef assert
+#ifdef assert
+#	undef assert
+#endif /* assert */
 #ifdef CPP_DOES_EXPAND
 #	define assert(p)	if(! (p)) asfail(__FILE__, __LINE__, #p); else (void)0;
 #else
@@ -1326,12 +1317,17 @@ enum {
 
 
 /*
- * art.thread (Can't ART_NORMAL be better named ?)
+ * art.thread
  */
-#define ART_NORMAL		-1
+#define ART_UNTHREADED	-1
 #define ART_EXPIRED		-2
 
 /*
+ * Where does this belong ?? It is overloaded
+ */
+#define ART_NORMAL		-1
+
+/*
  * art.status
  */
 #define ART_READ		0
@@ -1365,9 +1361,6 @@ enum {
 /*
  * filter_type used in struct t_filter
  */
-#define FILTER_KILL		0
-#define FILTER_SELECT		1
-
 #define SCORE_MAX		10000
 
 #define FILTER_SUBJ_CASE_SENSITIVE		0
@@ -1386,97 +1379,48 @@ enum {
 #define FILTER_LINES_GT		3
 
 /*
- * used in checking article header before posting
+ * default date format for display in the page header
  */
-#define NGLIMIT		20	/* Max. num. of crossposted groups before warning */
-#define MAX_COL		78	/* Max. line length before issuing a warning */
-#define MAX_SIG_LINES	4	/* Max. num. of signature lines before warning */
+#define DEFAULT_DATE_FORMAT	"%a, %d %b %Y %H:%M:%S"
 
 /*
- * The following macros are used to simplify and speed up the
- * manipulation of the bitmaps in memory which record which articles
- * are read or unread in each news group.
- *
- * Data representation:
- *
- * Each bitmap is handled as an array of bytes; the least-significant
- * bit of the 0th byte is the 0th bit; the most significant bit of
- * the 0th byte is the 7th bit. Thus, the most-significant bit of the
- * 128th byte is the 1023rd bit, and in general the mth bit of the nth
- * byte is considered to be bit (n*8)+m of the map as a whole.	Conversely,
- * the position of bit q in the map is the bit (q & 7) of byte (q >> 3).
- * A bitmap of b bits will be allocated as ((b+7) >> 3) bytes.
- *
- * The routines could be changed to operate on a word-oriented bitmap by
- * changing the constants used from 8 to 16, 3 to 4, 7 to 15, etc. and
- * changing the allocate/deallocate routines.
- *
- * In the newsrc context, a 0 bit represents an article which is read
- * or expired; a 1 represents an unread article. The 0th bit corresponds
- * to the minimum article number for this group, and (max-min+7)/8 bytes
- * are allocated to the bitmap.
- *
- * Constants:
- *
- * NBITS   = total number of bits per byte;
- * NMAXBIT = number of bits per byte or word;
- * NBITPOS = number of bit in NMAXBIT;
- * NBITSON = byte/word used to set all bits in byte/word to 1;
- * NBITNEG1 = binary negation of 1, used in constructing masks.
- *
- * Macro naming and use:
- *
- * The NOFFSET and NBITIDX macro construct the byte and bit indexes in
- * the map, given a bit number.
- *
- * The NSET0 macro sets a bit to binary 0
- * The NSET1 macro sets a bit to binary 1
- * The NSETBLK0 macro sets the same bit or bits to binary 0
- * The NSETBLK1 macro sets the same bit or bits to binary 1
- * The NTEST macro tests a single bit.
- * These are used frequently to access the group bitmap.
- *
- * NSETBLK0 and NSETBLK1 operate on whole numbers of bytes, and are
- * mainly useful for initializing complete bitmaps to one state or
- * another. Both use the memset function, which is assumed to be
- * optimized for the target architecture. NSETBLK is currently used to
- * initialize the group bitmap to 1s (unread).
- *
- * NSETRNG0 and NSETRNG1 operate on ranges of bits, from a low bit number
- * to a high bit number (inclusive), and are especially useful for
- * efficiently setting a contiguous range of bits to one state or another.
- * NSETRNG0 is currently used on the group bitmap to mark the ranges the
- * newsrc file says are read or expired.
- *
- * The algorithm is this. If the high number is less than the low, then
- * do nothing (error); if both fall within the same byte, construct a
- * single mask expressing the range and AND or OR it into the byte; else:
- * construct a mask for the byte containing the low bit, AND or OR it in;
- * use memset to fill in the intervening bytes efficiently; then construct
- * a mask for the byte containing the high bit, and AND or OR this mask
- * in. Masks are constructed by left-shift of 0xff (to set high-order bits
- * to 1), negating a left-shift of 0xfe (to set low-order bits to 1), and
- * the various negations and combinations of the same. This procedure is
- * complex, but 1 to 2 orders of magnitude faster than a shift inside a
- * loop for each bit inside a loop for each individual byte.
- *
+ * unicode normalization
  */
-#define NBITS		8
-#define NMAXBIT	7
-#define NBITPOS	3
-#define NBITSON	0xff
-#define NBITNEG1	0xfe
-#define NOFFSET(b)	((b) >> NBITPOS)
-#define NBITIDX(b)	((b) & NMAXBIT)
-
-#define NBITMASK(beg,end)	(unsigned char) ~(((1 << (((NMAXBIT - beg) - (NMAXBIT - end)) + 1)) - 1) << (NMAXBIT - end))
-
-#define NSET1(n,b)	(n[NOFFSET(b)] |=  (1 << NBITIDX(b)))
-#define NSET0(n,b)	(n[NOFFSET(b)] &= ~(1 << NBITIDX(b)))
-#define NTEST(n,b)	(n[NOFFSET(b)] &   (1 << NBITIDX(b)))
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+#	ifdef HAVE_LIBICUUC
+#		define HAVE_UNICODE_NORMALIZATION 1
+#	else
+#		if defined(HAVE_LIBIDN) && defined(HAVE_STRINGPREP_H)
+#			define HAVE_UNICODE_NORMALIZATION 2
+#		endif /* HAVE_LIBIDN */
+#	endif /* HAVE_LIBICUUC */
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
-#define NSETBLK1(n,i)	(memset (n, NBITSON, (size_t) NOFFSET(i)+1))
-#define NSETBLK0(n,i)	(memset (n, 0, (size_t) NOFFSET(i)+1))
+/*
+ * normalization forms
+ */
+#ifdef HAVE_UNICODE_NORMALIZATION
+enum {
+	NORMALIZE_NONE = 0,
+#	ifdef HAVE_LIBICUUC
+	NORMALIZE_NFKC = 1,
+	NORMALIZE_NFKD = 2,
+	NORMALIZE_NFC = 3,
+	NORMALIZE_NFD = 4
+#	else
+#		ifdef HAVE_LIBIDN
+	NORMALIZE_NFKC = 1
+#		endif /* HAVE_LIBIDN */
+#	endif /* HAVE_LIBICUUC */
+};
+#endif /* HAVE_UNICODE_NORMALIZATION */
+
+/*
+ * used in checking article header before posting
+ */
+#define NGLIMIT		20	/* Max. num. of crossposted groups before warning */
+#define MAX_COL		78	/* Max. line length before issuing a warning */
+#define MAX_SIG_LINES	4	/* Max. num. of signature lines before warning */
 
 typedef unsigned char	t_bitmap;
 
@@ -1516,14 +1460,15 @@ struct t_msgid {
  * struct t_article - article header
  *
  * article.thread:
- *	-1 (ART_NORMAL)  initial default
- *	-2 (ART_EXPIRED) article has expired (wasn't found in search of spool
- *	   directory for the group)
+ * the next article in thread
+ *	-1  (ART_UNTHREADED) article exists but is not (yet) threaded
+ *	-2  (ART_EXPIRED) article has expired (wasn't found in search of spool
+ *	    directory for the group)
  *	>=0 points to another arts[] (struct t_article)
  *
  * article.prev:
  *	the previous article in thread
- *	-1 (ART_NORMAL) initial default, no previous article
+ *	-1  (ART_NORMAL) initial default, first (no previous) article in thread
  *	>=0 points to the previous arts[] (struct t_article)
  */
 struct t_article {
@@ -1587,8 +1532,10 @@ struct t_attribute {
 	unsigned batch_save:1;			/* 0=none, 1=save -S/mail -M */
 	unsigned delete_tmp_files:1;		/* 0=leave, 1=delete */
 	unsigned show_only_unread:1;		/* 0=all, 1=only unread */
-	unsigned thread_arts:3;			/* 0=unthread, 1=subject, 2=refs, 3=both, 4=multipart*/
-	unsigned show_author:4;			/* 0=none, 1=name, 2=addr, 3=both */
+	unsigned thread_arts:3;			/* 0=unthread, 1=subject, 2=refs, 3=both, 4=multipart, 5=percentage */
+	unsigned thread_perc:7;			/* percentage thrreading threshold */
+	unsigned show_author:2;			/* 0=none, 1=name, 2=addr, 3=both */
+	unsigned show_info:2;			/* 0=none, 1=lines, 2=score, 3=both */
 	unsigned sort_art_type:4;		/* 0=none, 1=subj descend, 2=subj ascend,
 						   3=from descend, 4=from ascend,
 						   5=date descend, 6=date ascend,
@@ -1597,6 +1544,8 @@ struct t_attribute {
 	unsigned int post_proc_type:2;		/* 0=none, 1=shar, 2=uudecode */
 	unsigned int x_comment_to:1;		/* insert X-Comment-To: in Followup */
 	unsigned int tex2iso_conv:1;		/* Convert TeX2ISO */
+	unsigned int mime_forward:1;		/* forward articles as attachment or inline */
+	char *fcc;							/* Fcc folder for mail */
 #ifdef CHARSET_CONVERSION
 	int mm_network_charset;				/* network charset */
 	char *undeclared_charset;			/* charset of articles without MIME charset declaration */
@@ -1697,10 +1646,10 @@ struct t_filter {
 	char *from;			/* From: line */
 	char *msgid;			/* Message-ID: line */
 	char lines_cmp;			/* Lines compare <> */
-	int  lines_num;			/* Lines: line */
+	int lines_num;			/* Lines: line */
 	char gnksa_cmp;			/* GNKSA compare <> */
-	int  gnksa_num;			/* GNKSA code */
-	int  score;			/* score to give if rule matches */
+	int gnksa_num;			/* GNKSA code */
+	int score;			/* score to give if rule matches */
 	char *xref;			/* groups in xref line */
 	time_t time;			/* expire time in seconds */
 	struct t_filter *next;		/* next rule valid in group */
@@ -1785,11 +1734,7 @@ struct t_newnews {
 	time_t time;
 };
 
-#ifdef M_AMIGA
-	typedef const char /*__far*/ constext;
-#else
-	typedef const char constext;
-#endif /* M_AMIGA */
+typedef const char constext;
 
 /*
  * Defines text strings used by a tinrc variable
@@ -1831,9 +1776,9 @@ typedef struct {
 	int curr;					/* Current cursor pos (cur_groupnum, index_point, thread_index_point) */
 	int max;					/* Max # on current menu (group_top, top_base, top_thread) */
 	int first;					/* First # on current menu */
-	int last;					/* Last # on current menu (first,last_*_on_screen) */
 	void (*redraw) (void);		/* Redraw function */
 	void (*draw_arrow) (void);	/* Arrow draw */
+	void (*draw_item) (int item);	/* draw the specified item */
 } t_menu;
 
 
@@ -1921,19 +1866,6 @@ typedef int (*t_compfunc)(t_comptype, t_
 
 #define TIN_EDITOR_FMT_OFF		"%E %F"
 
-#ifdef M_AMIGA
-#	define REDIRECT_OUTPUT	"> NIL:"
-#	define REDIRECT_PGP_OUTPUT	"> NIL:"
-#	define ENV_VAR_GROUPS		"TIN_GROUPS"
-#	define ENV_VAR_MAILER		"TIN_MAIL"
-#	define ENV_VAR_POSTER		"TIN_POST"
-#	define ENV_VAR_SHELL		"SHELL"
-#	define TIN_EDITOR_FMT_ON	"%E %F"
-#	define MAILER_FORMAT		"%M <%F -f %U"
-#	define TMPDIR			"T:"
-#	define KEY_PREFIX		0x9b
-#endif /* M_AMIGA */
-
 #ifdef VMS
 #	define REDIRECT_OUTPUT	""
 #	define REDIRECT_PGP_OUTPUT	""
@@ -1986,9 +1918,9 @@ extern void joindir (char *result, const
 #endif /* !TMPDIR */
 
 #if !defined(S_ISDIR)
-#	if defined(M_UNIX) || defined(VMS) || defined(M_AMIGA)
+#	if defined(M_UNIX) || defined(VMS)
 #		define S_ISDIR(m)	(((m) & S_IFMT) == S_IFDIR)
-#	endif /* M_UNIX || VMS || M_AMIGA */
+#	endif /* M_UNIX || VMS */
 #endif /* !S_ISDIR */
 
 #if !defined(S_ISREG)
@@ -2027,6 +1959,10 @@ extern void joindir (char *result, const
 #	define S_IXUGO	(S_IXUSR|S_IXGRP|S_IXOTH)	/* execute permission (all) */
 #endif /* !S_IRWXUGO */
 
+#ifndef S_ISVTX
+#	define S_ISVTX 0
+#endif /* !S_ISVTX */
+
 #ifdef DONT_HAVE_PIPING
 #	ifdef VMS
 #		define TIN_PRINTFILE "Sys$Scratch:TIN_PRINT%d.TMP"
@@ -2124,13 +2060,7 @@ extern void joindir (char *result, const
 #endif /* __STDC__ || __cplusplus */
 
 typedef OUTC_RETTYPE (*OutcPtr) (OUTC_ARGS);
-
-#ifdef M_AMIGA
-	typedef struct __tcpbuf	TCP;
-#	include "amigatcp.h"
-#else
-	typedef FILE TCP;
-#endif /* M_AMIGA */
+typedef FILE TCP;
 
 #ifndef EXTERN_H
 #	include	"extern.h"
@@ -2156,10 +2086,6 @@ typedef void (*BodyPtr) (char *, FILE *,
 #ifdef USE_DBMALLOC
 #	undef strchr
 #	undef strrchr
-#	undef NSET1
-#	undef NSET0
-#	define NSET1(n,b) memset(n + NOFFSET(b), n[NOFFSET(b)] | NTEST(n,b), 1)
-#	define NSET0(n,b) memset(n + NOFFSET(b), n[NOFFSET(b)] & ~NTEST(n,b), 1)
 #	include <dbmalloc.h> /* dbmalloc 1.4 */
 #endif /* USE_DBMALLOC */
 
@@ -2195,14 +2121,6 @@ typedef void (*BodyPtr) (char *, FILE *,
 #	endif /* !ferror */
 #endif /* __DECC */
 
-#ifdef HAVE_TEMPNAM
-#	define my_tempnam(a,b)	tempnam(a,b)
-#else
-#	ifdef HAVE_TMPNAM
-#		define my_tempnam(a,b)	tmpnam((char *)0)
-#	endif /* HAVE_TMPNAM */
-#endif /* HAVE_TEMPNAM */
-
 #ifndef my_tmpfile_only
 /*
  * shortcut if we arn't interrested in the tmpfiles filename/location
@@ -2214,16 +2132,7 @@ typedef void (*BodyPtr) (char *, FILE *,
 
 
 /* define some standard places to look for a tin.defaults file */
-/*
- * on Amiga only those two locations make sense and maybe PROGDIR:tin.defaults,
- * also possible are AmiTCP:db/tin.defaults or UULIB:tin.defaults, but these are
- * no system assigns.
- */
-#ifdef M_AMIGA
-#	define TIN_DEFAULTS_BUILTIN "S:tin.defaults","ENV:tin.defaults",NULL
-#else
-#	define TIN_DEFAULTS_BUILTIN "/etc/opt/tin","/etc/tin","/etc","/usr/local/lib/tin","/usr/local/lib","/usr/local/etc/tin","/usr/local/etc","/usr/lib/tin","/usr/lib",NULL
-#endif /* M_AMIGA */
+#define TIN_DEFAULTS_BUILTIN "/etc/opt/tin","/etc/tin","/etc","/usr/local/lib/tin","/usr/local/lib","/usr/local/etc/tin","/usr/local/etc","/usr/lib/tin","/usr/lib",NULL
 #ifdef TIN_DEFAULTS_DIR
 #	define TIN_DEFAULTS TIN_DEFAULTS_DIR,TIN_DEFAULTS_BUILTIN
 #else
@@ -2260,6 +2169,12 @@ extern struct tm *localtime(time_t *);
 #	define CLOSEDIR(DIR)	if (closedir(DIR)) error_message("closedir() failed: %s %s", __FILE__, __LINE__)
 #endif /* CLOSEDIR_VOID */
 
+#ifdef HAVE_GETTIMEOFDAY
+#	ifndef GETTIMEOFDAY_2ARGS
+#		define gettimeofday(a,b) gettimeofday(a)
+#	endif /* GETTIMEOFDAY_2ARGS */
+#endif /* HAVE_GETTIMEOFDAY */
+
 /* libmss */
 #ifdef MSS
 #	ifdef strdup
@@ -2279,13 +2194,6 @@ extern struct tm *localtime(time_t *);
 #	include "../libcanlock/canlock.h"
 #endif /* USE_CANLOCK */
 
-/* FXIME: use autoconf here to detect if stat(2)-structure has st_mtime */
-#ifndef M_AMIGA
-#	define FILE_CHANGED(file)	file_mtime(file)
-#else
-#	define FILE_CHANGED(file)	file_size(file)
-#endif /* M_AMIGA */
-
 /* snprintf(), vsnprintf() */
 #ifndef HAVE_SNPRINTF
 #	define snprintf	plp_snprintf
@@ -2299,11 +2207,11 @@ extern struct tm *localtime(time_t *);
  *       __GNUC__ __GNUC_MINOR__
  */
 /* gcc-specific attributes */
-#if defined(__GNUC__) && !defined(__cplusplus) && !defined(__APPLE_CC__)
+#if defined(__GNUC__) && !defined(__cplusplus) && !defined(__APPLE_CC__) && !defined(__NeXT__)
 #	define UNUSED(x) x __attribute__((unused))
 #else
 #	define UNUSED(x) x
-#endif /* __GNUC__ && !__cplusplus && !__APPLE_CC__ */
+#endif /* __GNUC__ && !__cplusplus && !__APPLE_CC__ && !__NeXT__ */
 
 /* init_selfinfo() needs MM_CHARSET */
 #ifndef MM_CHARSET
diff -Nurp tin-1.6.2/include/tinrc.h tin-1.8.0/include/tinrc.h
--- tin-1.6.2/include/tinrc.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/tinrc.h	2005-12-02 12:08:13.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : tinrc.h
  *  Author    : Jason Faultless <jason@altarstone.com>
  *  Created   : 1999-04-13
- *  Updated   : 2003-08-10
+ *  Updated   : 2004-06-20
  *  Notes     :
  *
- * Copyright (c) 1999-2003 Jason Faultless <jason@altarstone.com>
+ * Copyright (c) 1999-2006 Jason Faultless <jason@altarstone.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -141,6 +141,7 @@ struct t_config {
 	int sort_threads_type;				/* method used to sort base[] */
 	int strip_bogus;
 	int thread_articles;				/* threading system for viewing articles */
+	int thread_perc;				/* how close the match needs to be for THREAD_PERC to recognize two articles as the same thread */
 	int thread_score;				/* how the score for threads is computed*/
 	int wildcard;						/* 0=wildmat, 1=regex */
 	int score_limit_kill;					/* score limit to kill articles */
@@ -167,6 +168,7 @@ struct t_config {
 		int col_quote3;						/* color of >=3 times quoted lines */
 		int col_response;					/* color of respone counter */
 		int col_signature;					/* color of signature */
+		int col_urls;						/* color of urls highlight */
 		int col_subject;					/* color of article subject */
 		int col_text;						/* color of textlines*/
 		int col_title;						/* color of Help/Mail-Sign */
@@ -177,6 +179,7 @@ struct t_config {
 	int mono_markslash;				/* attribute for text highlighting with /slashes/ */
 	int mono_markstroke;				/* attribute for text highlighting with -strokes- */
 	t_bool word_highlight;				/* like word_highlight but stored in tinrc */
+	t_bool url_highlight;				/* highlight urls in text bodies */
 	int wrap_column;				/* screen column to wrap of text messages */
 #	ifdef HAVE_COLOR
 		t_bool use_color;					/* like use_color but stored in tinrc */
@@ -202,7 +205,7 @@ struct t_config {
 	t_bool keep_dead_articles;			/* keep all dead articles in dead.articles */
 	char posted_articles_file[LEN];		/* if set, file in which to keep posted articles */
 	t_bool mail_8bit_header;			/* allow 8bit chars. in header of mail message */
-	t_bool mark_ignore_tags;			/* Ignore tags for iKeyGroupMarkThdRead/iKeyThreadMarkArtRead */
+	t_bool mark_ignore_tags;			/* Ignore tags for GROUP_MARK_THREAD_READ/THREAD_MARK_ARTICLE_READ */
 	t_bool mark_saved_read;				/* mark saved article/thread as read */
 	t_bool pgdn_goto_next;
 	t_bool pos_first_unread;			/* position cursor at first/last unread article */
@@ -230,7 +233,7 @@ struct t_config {
 	t_bool thread_catchup_on_exit;		/* catchup thread with left arrow key or not */
 	t_bool unlink_article;
 	char inews_prog[PATH_LEN];
-	t_bool use_mailreader_i;			/* invoke user's mailreader earlier to use more of its features (i = interactive) */
+	int interactive_mailer;			/* invoke user's mailreader */
 	t_bool use_mouse;					/* enables/disables mouse support under xterm */
 #	ifdef HAVE_KEYPAD
 		t_bool use_keypad;
@@ -246,6 +249,13 @@ struct t_config {
 		t_bool use_slrnface;			/* Use the slrnface programme to display 'X-Face:'s */
 #	endif /* XFACE_ABLE */
 	t_bool default_filter_select_global;
+	char date_format[LEN];			/* format string for the date display in the page header */
+#	ifdef HAVE_UNICODE_NORMALIZATION
+	int normalization_form;
+#	endif /* HAVE_UNICODE_NORMALIZATION */
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && defined(HAVE_UNICODE_UBIDI_H) && !defined(NO_LOCALE)
+	t_bool render_bidi;
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && HAVE_UNICODE_UBIDI_H && !NO_LOCALE */
 };
 
 #endif /* !TINRC_H */
diff -Nurp tin-1.6.2/include/tnntp.h tin-1.8.0/include/tnntp.h
--- tin-1.6.2/include/tnntp.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/tnntp.h	2005-12-02 12:08:13.000000000 +0100
@@ -1,12 +1,12 @@
 /*
  *  Project   : tin - a Usenet reader
  *  Module    : tnntp.h
- *  Author    : Thomas Dickey <dickey@herndon4.his.com>
+ *  Author    : Thomas Dickey <dickey@invisible-island.net>
  *  Created   : 1997-03-05
- *  Updated   : 2003-03-14
+ *  Updated   : 2003-09-19
  *  Notes     : #include files, #defines & struct's
  *
- * Copyright (c) 1997-2003 Thomas Dickey <dickey@herndon4.his.com>
+ * Copyright (c) 1997-2006 Thomas Dickey <dickey@invisible-island.net>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -57,15 +57,12 @@
 #	define s_init()	(1)
 #	define s_end()
 #else
-#	ifdef M_AMIGA
-#		include "amigatcp.h"
-#	else
-#		define s_printf	fprintf
-#		define s_fdopen	fdopen
-#		define s_flush	fflush
-#		define s_fclose	fclose
-#		define s_gets	fgets
-#if 0 /* __BEOS__ port in progress */
+#	define s_printf	fprintf
+#	define s_fdopen	fdopen
+#	define s_flush	fflush
+#	define s_fclose	fclose
+#	define s_gets	fgets
+#	if 0 /* __BEOS__ port in progress */
 #		ifdef HAVE_CLOSESOCKET
 #			define s_close closesocket
 #		else
@@ -76,14 +73,13 @@
 #		else
 #			define s_puts(s,fd)	fputs(s,fd)
 #		endif /* __BEOS__ */
-#else
+#	else
 #		define s_close close
 #		define s_puts	fputs
-#endif /* 0 */
-#		define s_dup		dup
-#		define s_init()	(1)
-#		define s_end()
-#	endif /* M_AMIGA */
+#	endif /* 0 */
+#	define s_dup		dup
+#	define s_init()	(1)
+#	define s_end()
 #endif /* VMS && SOCKETSHR_TCP */
 
 #if defined(NNTP_ABLE) || defined(HAVE_GETHOSTBYNAME)
diff -Nurp tin-1.6.2/include/trace.h tin-1.8.0/include/trace.h
--- tin-1.6.2/include/trace.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/include/trace.h	2005-12-02 12:08:13.000000000 +0100
@@ -1,12 +1,12 @@
 /*
  *  Project   : tin - a Usenet reader
  *  Module    : trace.h
- *  Author    : Thomas Dickey <dickey@herndon4.his.com>
+ *  Author    : Thomas Dickey <dickey@invisible-island.net>
  *  Created   : 1997-03-22
  *  Updated   : 2002-11-10
  *  Notes     : Interface of trace.c
  *
- * Copyright (c) 1997-2003 Thomas Dickey <dickey@herndon4.his.com>
+ * Copyright (c) 1997-2006 Thomas Dickey <dickey@invisible-island.net>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff -Nurp tin-1.6.2/include/version.h tin-1.8.0/include/version.h
--- tin-1.6.2/include/version.h	2003-09-10 17:10:24.000000000 +0200
+++ tin-1.8.0/include/version.h	2005-12-24 19:11:08.684041837 +0100
@@ -3,10 +3,10 @@
  *  Module    : version.h
  *  Author    : I. Lea
  *  Created   : 1991-04-01
- *  Updated   : 2003-06-29
+ *  Updated   : 2004-10-19
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,29 +40,22 @@
 
 #	define PRODUCT		"tin"
 #	ifndef TIN_AUTOCONF_H
-#		define VERSION		"1.6.2"
+#		define VERSION		"1.8.0"
 #	endif /* !TIN_AUTOCONF_H */
-#	define RELEASEDATE	"20030910"
-#	define RELEASENAME	"Pabbay"
+#	define RELEASEDATE	"20051224"
+#	define RELEASENAME	"Ronay"
 /* config-file versions - must by dotted triples */
-#	define TINRC_VERSION	"1.3.6"
-#	define ATTRIBUTES_VERSION	"1.0.0"
+#	define TINRC_VERSION	"1.3.7"
+#	define ATTRIBUTES_VERSION	"1.0.4"
 #	define FILTER_VERSION	"1.0.0"
+#	define KEYMAP_VERSION	"1.0.6"
 #	define SERVERCONFIG_VERSION	"1.0.0"
 
-#	ifdef M_AMIGA
-#		define OSNAME	"AMIGA"
-#		define AMIVER	VERSION
-#	endif /* M_AMIGA */
-
 #	ifdef VMS
 #		define OSNAME	"VMS"
 #	endif /* VMS */
 
 #	ifdef M_UNIX
-#		ifdef __amiga
-#			define OSNAME	"AMIGA"
-#		endif /* !__amiga */
 #		ifdef __BEOS__
 #			define OSNAME	"BeOS"
 #		endif /* __BEOS__ */
diff -Nurp tin-1.6.2/install.sh tin-1.8.0/install.sh
--- tin-1.6.2/install.sh	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/install.sh	2005-06-28 10:31:19.000000000 +0200
@@ -1,19 +1,37 @@
 #! /bin/sh
 #
 # install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
 #
-# Copyright 1991 by the Massachusetts Institute of Technology
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
 #
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission.  M.I.T. makes no representations about the
-# suitability of this software for any purpose.  It is provided "as is"
-# without express or implied warranty.
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
 #
 # Calling this script install-sh is preferred over install.sh, to prevent
 # `make' implicit rules from creating a file called install from it
@@ -56,7 +74,7 @@ dir_arg=""
 
 while [ x"$1" != x ]; do
     case $1 in
-	-c) instcmd="$cpprog"
+	-c) instcmd=$cpprog
 	    shift
 	    continue;;
 
@@ -79,7 +97,7 @@ while [ x"$1" != x ]; do
 	    shift
 	    continue;;
 
-	-s) stripcmd="$stripprog"
+	-s) stripcmd=$stripprog
 	    shift
 	    continue;;
 
@@ -106,7 +124,7 @@ done
 
 if [ x"$src" = x ]
 then
-	echo "install:	no input file specified"
+	echo "$0: no input file specified" >&2
 	exit 1
 else
 	:
@@ -116,7 +134,7 @@ if [ x"$dir_arg" != x ]; then
 	dst=$src
 	src=""
 
-	if [ -d $dst ]; then
+	if [ -d "$dst" ]; then
 		instcmd=:
 		chmodcmd=""
 	else
@@ -128,17 +146,17 @@ else
 # might cause directories to be created, which would be especially bad
 # if $src (and thus $dsttmp) contains '*'.
 
-	if [ -f $src -o -d $src ]
+	if [ -f "$src" ] || [ -d "$src" ]
 	then
 		:
 	else
-		echo "install:  $src does not exist"
+		echo "$0: $src does not exist" >&2
 		exit 1
 	fi
 
 	if [ x"$dst" = x ]
 	then
-		echo "install:	no destination specified"
+		echo "$0: no destination specified" >&2
 		exit 1
 	else
 		:
@@ -147,16 +165,16 @@ else
 # If destination is a directory, append the input filename; if your system
 # does not like double slashes in filenames, you may need to add some logic
 
-	if [ -d $dst ]
+	if [ -d "$dst" ]
 	then
-		dst="$dst"/`basename $src`
+		dst=$dst/`basename "$src"`
 	else
 		:
 	fi
 fi
 
 ## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
 
 # Make sure that the destination directory exists.
 #  this part is taken from Noah Friedman's mkinstalldirs script
@@ -165,48 +183,48 @@ dstdir=`echo $dst | sed -e 's,[^/]*$,,;s
 if [ ! -d "$dstdir" ]; then
 defaultIFS='
 	'
-IFS="${IFS-${defaultIFS}}"
+IFS="${IFS-$defaultIFS}"
 
-oIFS="${IFS}"
+oIFS=$IFS
 # Some sh's can't handle IFS=/ for some reason.
 IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
+set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS=$oIFS
 
 pathcomp=''
 
 while [ $# -ne 0 ] ; do
-	pathcomp="${pathcomp}${1}"
+	pathcomp=$pathcomp$1
 	shift
 
-	if [ ! -d "${pathcomp}" ] ;
+	if [ ! -d "$pathcomp" ] ;
         then
-		$mkdirprog "${pathcomp}"
+		$mkdirprog "$pathcomp"
 	else
 		:
 	fi
 
-	pathcomp="${pathcomp}/"
+	pathcomp=$pathcomp/
 done
 fi
 
 if [ x"$dir_arg" != x ]
 then
-	$doit $instcmd $dst &&
+	$doit $instcmd "$dst" &&
 
-	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi &&
-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi &&
-	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi &&
-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
 else
 
 # If we're going to rename the final executable, determine the name now.
 
 	if [ x"$transformarg" = x ]
 	then
-		dstfile=`basename $dst`
+		dstfile=`basename "$dst"`
 	else
-		dstfile=`basename $dst $transformbasename |
+		dstfile=`basename "$dst" $transformbasename |
 			sed $transformarg`$transformbasename
 	fi
 
@@ -214,20 +232,24 @@ else
 
 	if [ x"$dstfile" = x ]
 	then
-		dstfile=`basename $dst`
+		dstfile=`basename "$dst"`
 	else
 		:
 	fi
 
-# Make a temp file name in the proper directory.
+# Make a couple of temp file names in the proper directory.
 
 	dsttmp=$dstdir/#inst.$$#
+	rmtmp=$dstdir/#rm.$$#
 
-# Move or copy the file name to the temp name
+# Trap to clean up temp files at exit.
 
-	$doit $instcmd $src $dsttmp &&
+	trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
+	trap '(exit $?); exit' 1 2 13 15
 
-	trap "rm -f ${dsttmp}" 0 &&
+# Move or copy the file name to the temp name
+
+	$doit $instcmd "$src" "$dsttmp" &&
 
 # and set any options; do chmod last to preserve setuid bits
 
@@ -235,17 +257,38 @@ else
 # ignore errors from any of these, just make sure not to ignore
 # errors from the above "$doit $instcmd $src $dsttmp" command.
 
-	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi &&
-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi &&
-	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi &&
-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi &&
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
+
+# Now remove or move aside any old file at destination location.  We try this
+# two ways since rm can't unlink itself on some systems and the destination
+# file might be busy for other reasons.  In this case, the final cleanup
+# might fail but the new file should still install successfully.
+
+{
+	if [ -f "$dstdir/$dstfile" ]
+	then
+		$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
+		$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
+		{
+		  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+		  (exit 1); exit
+		}
+	else
+		:
+	fi
+} &&
 
 # Now rename the file to the real destination.
 
-	$doit $rmcmd -f $dstdir/$dstfile &&
-	$doit $mvcmd $dsttmp $dstdir/$dstfile
+	$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
 
 fi &&
 
+# The final little trick to "correctly" pass the exit status to the exit trap.
 
-exit 0
+{
+	(exit 0); exit
+}
diff -Nurp tin-1.6.2/intl/Makefile.in tin-1.8.0/intl/Makefile.in
--- tin-1.6.2/intl/Makefile.in	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/intl/Makefile.in	2005-06-28 10:31:28.000000000 +0200
@@ -44,13 +44,16 @@ mkinstalldirs = $(SHELL) `case "$(MKINST
 
 l = @INTL_LIBTOOL_SUFFIX_PREFIX@
 
-AR = ar
+ARCHIVE = @AR@ @AR_OPTS@
 CC = @CC@
 LIBTOOL = @LIBTOOL@
 RANLIB = @RANLIB@
 YACC = @INTLBISON@ -y -d
 YFLAGS = --name-prefix=__gettext
 
+x = @EXEEXT@
+o = .@OBJEXT@
+
 DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \
 -DLIBDIR=\"$(libdir)\" @DEFS@
 CPPFLAGS = @CPPFLAGS@
@@ -88,8 +91,8 @@ LTV_REVISION=1
 LTV_AGE=0
 
 .SUFFIXES:
-.SUFFIXES: .c .y .o .lo .sin .sed
-.c.o:
+.SUFFIXES: .c .y $o .lo .sin .sed
+.c$o:
 	$(COMPILE) $<
 .c.lo:
 	$(LIBTOOL) --mode=compile $(COMPILE) $<
@@ -112,7 +115,7 @@ all-no-no:
 
 libintl.a libgnuintl.a: $(OBJECTS)
 	rm -f $@
-	$(AR) cru $@ $(OBJECTS)
+	$(ARCHIVE) $@ $(OBJECTS)
 	$(RANLIB) $@
 
 libintl.la libgnuintl.la: $(OBJECTS)
@@ -269,7 +272,7 @@ ID: $(HEADERS) $(SOURCES)
 
 
 mostlyclean:
-	rm -f *.a *.la *.o *.lo core core.*
+	rm -f *.a *.la *$o *.lo core core.*
 	rm -f libintl.h charset.alias ref-add.sed ref-del.sed
 	rm -f -r .libs _libs
 
diff -Nurp tin-1.6.2/intl/dcigettext.c tin-1.8.0/intl/dcigettext.c
--- tin-1.6.2/intl/dcigettext.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/intl/dcigettext.c	2005-06-28 10:31:28.000000000 +0200
@@ -27,25 +27,30 @@
 # include <autoconf.h>
 #endif
 
-#include <sys/types.h>
-
+/* see AC_FUNC_ALLOCA macro */
 #ifdef __GNUC__
 # define alloca __builtin_alloca
-# define HAVE_ALLOCA 1
 #else
-# if defined HAVE_ALLOCA_H || defined _LIBC
-#  include <alloca.h>
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
 # else
-#  ifdef _AIX
- #pragma alloca
+#  if HAVE_ALLOCA_H
+#   include <alloca.h>
 #  else
-#   ifndef alloca
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca /* predefined by HP cc +Olibcalls */
 char *alloca ();
+#    endif
 #   endif
 #  endif
 # endif
 #endif
 
+#include <sys/types.h>
+
 #include <errno.h>
 #ifndef errno
 extern int errno;
@@ -766,7 +771,7 @@ _nl_find_msg (domain_file, domainbinding
 	    + W (domain->must_swap, domain->trans_tab[act].offset));
   resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1;
 
-#if defined _LIBC || HAVE_ICONV
+#if defined _LIBC || defined HAVE_ICONV
   if (domain->codeset_cntr
       != (domainbinding != NULL ? domainbinding->codeset_cntr : 0))
     {
@@ -781,7 +786,7 @@ _nl_find_msg (domain_file, domainbinding
 # ifdef _LIBC
       domain->conv != (__gconv_t) -1
 # else
-#  if HAVE_ICONV
+#  ifdef HAVE_ICONV
       domain->conv != (iconv_t) -1
 #  endif
 # endif
@@ -859,7 +864,7 @@ _nl_find_msg (domain_file, domainbinding
 
 	      inbuf = result;
 # else
-#  if HAVE_ICONV
+#  ifdef HAVE_ICONV
 	      const char *inptr = (const char *) inbuf;
 	      size_t inleft = resultlen;
 	      char *outptr = (char *) outbuf;
diff -Nurp tin-1.6.2/intl/gettextP.h tin-1.8.0/intl/gettextP.h
--- tin-1.6.2/intl/gettextP.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/intl/gettextP.h	2005-06-28 10:31:28.000000000 +0200
@@ -25,7 +25,7 @@
 #ifdef _LIBC
 # include "../iconv/gconv_int.h"
 #else
-# if HAVE_ICONV
+# ifdef HAVE_ICONV
 #  include <iconv.h>
 # endif
 #endif
@@ -132,7 +132,7 @@ struct loaded_domain
 #ifdef _LIBC
   __gconv_t conv;
 #else
-# if HAVE_ICONV
+# ifdef HAVE_ICONV
   iconv_t conv;
 # endif
 #endif
@@ -237,11 +237,11 @@ extern char *bind_textdomain_codeset__ P
 #endif
 
 #ifdef _LIBC
-extern void __gettext_free_exp PARAMS ((struct expression *exp))
+extern void __gettext_free_exp PARAMS ((struct expression *_exp))
      internal_function;
 extern int __gettextparse PARAMS ((void *arg));
 #else
-extern void gettext_free_exp__ PARAMS ((struct expression *exp))
+extern void gettext_free_exp__ PARAMS ((struct expression *_exp))
      internal_function;
 extern int gettextparse__ PARAMS ((void *arg));
 #endif
diff -Nurp tin-1.6.2/intl/loadmsgcat.c tin-1.8.0/intl/loadmsgcat.c
--- tin-1.6.2/intl/loadmsgcat.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/intl/loadmsgcat.c	2005-06-28 10:31:28.000000000 +0200
@@ -27,29 +27,42 @@
 # include <autoconf.h>
 #endif
 
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+#undef freea
 
+/* see AC_FUNC_ALLOCA macro */
 #ifdef __GNUC__
 # define alloca __builtin_alloca
-# define HAVE_ALLOCA 1
 #else
-# if defined HAVE_ALLOCA_H || defined _LIBC
-#  include <alloca.h>
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
 # else
-#  ifdef _AIX
- #pragma alloca
+#  if HAVE_ALLOCA_H
+#   include <alloca.h>
 #  else
-#   ifndef alloca
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca /* predefined by HP cc +Olibcalls */
 char *alloca ();
+#    else
+#     define freea(n) free(n)
+#    endif
 #   endif
 #  endif
 # endif
 #endif
 
+#ifndef freea
+#define freea(n) /* nothing */
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
 #include <stdlib.h>
 #include <string.h>
 
@@ -101,15 +114,6 @@ char *alloca ();
 # define PLURAL_PARSE gettextparse__
 #endif
 
-/* For those losing systems which don't have `alloca' we have to add
-   some additional code emulating it.  */
-#ifdef HAVE_ALLOCA
-# define freea(p) /* nothing */
-#else
-# define alloca(n) malloc (n)
-# define freea(p) free (p)
-#endif
-
 /* For systems that distinguish between text and binary I/O.
    O_BINARY is usually declared in <fcntl.h>. */
 #if !defined O_BINARY && defined _O_BINARY
@@ -223,7 +227,7 @@ _nl_init_domain_conv (domain_file, domai
 #ifdef _LIBC
   domain->conv = (__gconv_t) -1;
 #else
-# if HAVE_ICONV
+# ifdef HAVE_ICONV
   domain->conv = (iconv_t) -1;
 # endif
 #endif
@@ -234,7 +238,7 @@ _nl_init_domain_conv (domain_file, domai
 
   if (nullentry != NULL)
     {
-#if defined _LIBC || HAVE_ICONV
+#if defined _LIBC || defined HAVE_ICONV
       const char *charsetstr;
 
       charsetstr = strstr (nullentry, "charset=");
@@ -326,7 +330,7 @@ _nl_free_domain_conv (domain)
   if (domain->conv != (__gconv_t) -1)
     __gconv_close (domain->conv);
 #else
-# if HAVE_ICONV
+# ifdef HAVE_ICONV
   if (domain->conv != (iconv_t) -1)
     iconv_close (domain->conv);
 # endif
@@ -379,7 +383,7 @@ _nl_load_domain (domain_file, domainbind
 #else
       __builtin_expect (fstat (fd, &st) != 0, 0)
 #endif
-      || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0)
+      || __builtin_expect ((size = (size_t) st.st_size) != (size_t) st.st_size, 0)
       || __builtin_expect (size < sizeof (struct mo_file_header), 0))
     {
       /* Something went wrong.  */
diff -Nurp tin-1.6.2/intl/localealias.c tin-1.8.0/intl/localealias.c
--- tin-1.6.2/intl/localealias.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/intl/localealias.c	2005-06-28 10:31:28.000000000 +0200
@@ -27,27 +27,40 @@
 # include <autoconf.h>
 #endif
 
-#include <ctype.h>
-#include <stdio.h>
-#include <sys/types.h>
+#undef freea
 
+/* see AC_FUNC_ALLOCA macro */
 #ifdef __GNUC__
 # define alloca __builtin_alloca
-# define HAVE_ALLOCA 1
 #else
-# if defined HAVE_ALLOCA_H || defined _LIBC
-#  include <alloca.h>
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
 # else
-#  ifdef _AIX
- #pragma alloca
+#  if HAVE_ALLOCA_H
+#   include <alloca.h>
 #  else
-#   ifndef alloca
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca /* predefined by HP cc +Olibcalls */
 char *alloca ();
+#    else
+#     define freea(n) free(n)
+#    endif
 #   endif
 #  endif
 # endif
 #endif
 
+#ifndef freea
+#define freea(n) /* nothing */
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <sys/types.h>
+
 #include <stdlib.h>
 
 #include <string.h>
@@ -82,15 +95,6 @@ __libc_lock_define_initialized (static, 
 # define internal_function
 #endif
 
-/* For those losing systems which don't have `alloca' we have to add
-   some additional code emulating it.  */
-#ifdef HAVE_ALLOCA
-# define freea(p) /* nothing */
-#else
-# define alloca(n) malloc (n)
-# define freea(p) free (p)
-#endif
-
 #if defined _LIBC_REENTRANT || defined HAVE_FGETS_UNLOCKED
 # undef fgets
 # define fgets(buf, len, s) fgets_unlocked (buf, len, s)
diff -Nurp tin-1.6.2/libcanlock/Build tin-1.8.0/libcanlock/Build
--- tin-1.6.2/libcanlock/Build	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/libcanlock/Build	2005-06-28 10:31:28.000000000 +0200
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 if [ me$1ow = mecleanow ] ; then
-	rm *.o *.a endian endian.h canlocktest hmactest *~ core
+	rm *.o *.a endian endian.h canlocktest hmactest
 else
 #	CC="cc"
 	CC="${CC-cc}"
diff -Nurp tin-1.6.2/mkdirs.sh tin-1.8.0/mkdirs.sh
--- tin-1.6.2/mkdirs.sh	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/mkdirs.sh	2005-06-28 10:31:30.000000000 +0200
@@ -23,7 +23,8 @@ for file in ${1+"$@"} ; do
      if test ! -d "$pathcomp"; then
         echo "mkdir $pathcomp" 1>&2
         case "$pathcomp" in
-          [a-zA-Z]: )  ;;               # DOSISH systems
+          [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]: )
+                ;;               # DOSISH systems
           * )          mkdir "$pathcomp" || errstatus=$? ;;
         esac
      fi
diff -Nurp tin-1.6.2/pcre/AUTHORS tin-1.8.0/pcre/AUTHORS
--- tin-1.6.2/pcre/AUTHORS	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/AUTHORS	2005-06-28 10:31:25.000000000 +0200
@@ -1,6 +1,23 @@
-Written by: Philip Hazel <ph10@cam.ac.uk>
+THE MAIN PCRE LIBRARY
+---------------------
+
+Written by:       Philip Hazel
+Email local part: ph10
+Email domain:     cam.ac.uk
 
 University of Cambridge Computing Service,
 Cambridge, England. Phone: +44 1223 334714.
 
-Copyright (c) 1997-2001 University of Cambridge
+Copyright (c) 1997-2005 University of Cambridge
+All rights reserved
+
+
+THE C++ WRAPPER LIBRARY
+-----------------------
+
+Written by:       Google Inc.
+
+Copyright (c) 2005 Google Inc
+All rights reserved
+
+####
diff -Nurp tin-1.6.2/pcre/COPYING tin-1.8.0/pcre/COPYING
--- tin-1.6.2/pcre/COPYING	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/COPYING	2005-06-28 10:31:25.000000000 +0200
@@ -4,51 +4,65 @@ PCRE LICENCE
 PCRE is a library of functions to support regular expressions whose syntax
 and semantics are as close as possible to those of the Perl 5 language.
 
-Written by: Philip Hazel <ph10@cam.ac.uk>
+Release 6 of PCRE is distributed under the terms of the "BSD" licence, as
+specified below. The documentation for PCRE, supplied in the "doc"
+directory, is distributed under the same terms as the software itself.
+
+The basic library functions are written in C and are freestanding. Also
+included in the distribution is a set of C++ wrapper functions.
+
+
+THE BASIC LIBRARY FUNCTIONS
+---------------------------
+
+Written by:       Philip Hazel
+Email local part: ph10
+Email domain:     cam.ac.uk
 
 University of Cambridge Computing Service,
 Cambridge, England. Phone: +44 1223 334714.
 
-Copyright (c) 1997-2001 University of Cambridge
+Copyright (c) 1997-2005 University of Cambridge
+All rights reserved.
+
+
+THE C++ WRAPPER FUNCTIONS
+-------------------------
+
+Contributed by:   Google Inc.
+
+Copyright (c) 2005, Google Inc.
+All rights reserved.
+
+
+THE "BSD" LICENCE
+-----------------
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
 
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission. In practice, this means that if you use
-   PCRE in software that you distribute to others, commercially or
-   otherwise, you must put a sentence like this
-
-     Regular expression support is provided by the PCRE library package,
-     which is open source software, written by Philip Hazel, and copyright
-     by the University of Cambridge, England.
-
-   somewhere reasonably visible in your documentation and in any relevant
-   files or online help data or similar. A reference to the ftp site for
-   the source, that is, to
-
-     ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
-
-   should also be given in the documentation. However, this condition is not
-   intended to apply to whole chains of software. If package A includes PCRE,
-   it must acknowledge it, but if package B is software that includes package
-   A, the condition is not imposed on package B (unless it uses PCRE
-   independently).
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), or Lesser General Purpose Licence (LGPL),
-   then the terms of that licence shall supersede any condition above with
-   which it is incompatible.
+    * Neither the name of the University of Cambridge nor the name of Google
+      Inc. nor the names of their contributors may be used to endorse or
+      promote products derived from this software without specific prior
+      written permission.
 
-The documentation for PCRE, supplied in the "doc" directory, is distributed
-under the same terms as the software itself.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
 
 End
diff -Nurp tin-1.6.2/pcre/ChangeLog tin-1.8.0/pcre/ChangeLog
--- tin-1.6.2/pcre/ChangeLog	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/ChangeLog	2005-09-12 16:31:22.000000000 +0200
@@ -1,6 +1,567 @@
 ChangeLog for PCRE
 ------------------
 
+Version 6.4 05-Sep-05
+---------------------
+
+ 1. Change 6.0/10/(l) to pcregrep introduced a bug that caused separator lines
+    "--" to be printed when multiple files were scanned, even when none of the
+    -A, -B, or -C options were used. This is not compatible with Gnu grep, so I
+    consider it to be a bug, and have restored the previous behaviour.
+
+ 2. A couple of code tidies to get rid of compiler warnings.
+
+ 3. The pcretest program used to cheat by referring to symbols in the library
+    whose names begin with _pcre_. These are internal symbols that are not
+    really supposed to be visible externally, and in some environments it is
+    possible to suppress them. The cheating is now confined to including
+    certain files from the library's source, which is a bit cleaner.
+
+ 4. Renamed pcre.in as pcre.h.in to go with pcrecpp.h.in; it also makes the
+    file's purpose clearer.
+
+ 5. Reorganized pcre_ucp_findchar().
+
+
+Version 6.3 15-Aug-05
+---------------------
+
+ 1. The file libpcre.pc.in did not have general read permission in the tarball.
+
+ 2. There were some problems when building without C++ support:
+
+    (a) If C++ support was not built, "make install" and "make test" still
+        tried to test it.
+
+    (b) There were problems when the value of CXX was explicitly set. Some
+        changes have been made to try to fix these, and ...
+
+    (c) --disable-cpp can now be used to explicitly disable C++ support.
+
+    (d) The use of @CPP_OBJ@ directly caused a blank line preceded by a
+        backslash in a target when C++ was disabled. This confuses some
+        versions of "make", apparently. Using an intermediate variable solves
+        this. (Same for CPP_LOBJ.)
+
+ 3. $(LINK_FOR_BUILD) now includes $(CFLAGS_FOR_BUILD) and $(LINK)
+    (non-Windows) now includes $(CFLAGS) because these flags are sometimes
+    necessary on certain architectures.
+
+ 4. Added a setting of -export-symbols-regex to the link command to remove
+    those symbols that are exported in the C sense, but actually are local
+    within the library, and not documented. Their names all begin with
+    "_pcre_". This is not a perfect job, because (a) we have to except some
+    symbols that pcretest ("illegally") uses, and (b) the facility isn't always
+    available (and never for static libraries). I have made a note to try to
+    find a way round (a) in the future.
+
+
+Version 6.2 01-Aug-05
+---------------------
+
+ 1. There was no test for integer overflow of quantifier values. A construction
+    such as {1111111111111111} would give undefined results. What is worse, if
+    a minimum quantifier for a parenthesized subpattern overflowed and became
+    negative, the calculation of the memory size went wrong. This could have
+    led to memory overwriting.
+
+ 2. Building PCRE using VPATH was broken. Hopefully it is now fixed.
+
+ 3. Added "b" to the 2nd argument of fopen() in dftables.c, for non-Unix-like
+    operating environments where this matters.
+
+ 4. Applied Giuseppe Maxia's patch to add additional features for controlling
+    PCRE options from within the C++ wrapper.
+
+ 5. Named capturing subpatterns were not being correctly counted when a pattern
+    was compiled. This caused two problems: (a) If there were more than 100
+    such subpatterns, the calculation of the memory needed for the whole
+    compiled pattern went wrong, leading to an overflow error. (b) Numerical
+    back references of the form \12, where the number was greater than 9, were
+    not recognized as back references, even though there were sufficient
+    previous subpatterns.
+
+ 6. Two minor patches to pcrecpp.cc in order to allow it to compile on older
+    versions of gcc, e.g. 2.95.4.
+
+
+Version 6.1 21-Jun-05
+---------------------
+
+ 1. There was one reference to the variable "posix" in pcretest.c that was not
+    surrounded by "#if !defined NOPOSIX".
+
+ 2. Make it possible to compile pcretest without DFA support, UTF8 support, or
+    the cross-check on the old pcre_info() function, for the benefit of the
+    cut-down version of PCRE that is currently imported into Exim.
+
+ 3. A (silly) pattern starting with (?i)(?-i) caused an internal space
+    allocation error. I've done the easy fix, which wastes 2 bytes for sensible
+    patterns that start (?i) but I don't think that matters. The use of (?i) is
+    just an example; this all applies to the other options as well.
+
+ 4. Since libtool seems to echo the compile commands it is issuing, the output
+    from "make" can be reduced a bit by putting "@" in front of each libtool
+    compile command.
+
+ 5. Patch from the folks at Google for configure.in to be a bit more thorough
+    in checking for a suitable C++ installation before trying to compile the
+    C++ stuff. This should fix a reported problem when a compiler was present,
+    but no suitable headers.
+
+ 6. The man pages all had just "PCRE" as their title. I have changed them to
+    be the relevant file name. I have also arranged that these names are
+    retained in the file doc/pcre.txt, which is a concatenation in text format
+    of all the man pages except the little individual ones for each function.
+
+ 7. The NON-UNIX-USE file had not been updated for the different set of source
+    files that come with release 6. I also added a few comments about the C++
+    wrapper.
+
+
+Version 6.0 07-Jun-05
+---------------------
+
+ 1. Some minor internal re-organization to help with my DFA experiments.
+
+ 2. Some missing #ifdef SUPPORT_UCP conditionals in pcretest and printint that
+    didn't matter for the library itself when fully configured, but did matter
+    when compiling without UCP support, or within Exim, where the ucp files are
+    not imported.
+
+ 3. Refactoring of the library code to split up the various functions into
+    different source modules. The addition of the new DFA matching code (see
+    below) to a single monolithic source would have made it really too
+    unwieldy, quite apart from causing all the code to be include in a
+    statically linked application, when only some functions are used. This is
+    relevant even without the DFA addition now that patterns can be compiled in
+    one application and matched in another.
+
+    The downside of splitting up is that there have to be some external
+    functions and data tables that are used internally in different modules of
+    the library but which are not part of the API. These have all had their
+    names changed to start with "_pcre_" so that they are unlikely to clash
+    with other external names.
+
+ 4. Added an alternate matching function, pcre_dfa_exec(), which matches using
+    a different (DFA) algorithm. Although it is slower than the original
+    function, it does have some advantages for certain types of matching
+    problem.
+
+ 5. Upgrades to pcretest in order to test the features of pcre_dfa_exec(),
+    including restarting after a partial match.
+
+ 6. A patch for pcregrep that defines INVALID_FILE_ATTRIBUTES if it is not
+    defined when compiling for Windows was sent to me. I have put it into the
+    code, though I have no means of testing or verifying it.
+
+ 7. Added the pcre_refcount() auxiliary function.
+
+ 8. Added the PCRE_FIRSTLINE option. This constrains an unanchored pattern to
+    match before or at the first newline in the subject string. In pcretest,
+    the /f option on a pattern can be used to set this.
+
+ 9. A repeated \w when used in UTF-8 mode with characters greater than 256
+    would behave wrongly. This has been present in PCRE since release 4.0.
+
+10. A number of changes to the pcregrep command:
+
+    (a) Refactored how -x works; insert ^(...)$ instead of setting
+        PCRE_ANCHORED and checking the length, in preparation for adding
+        something similar for -w.
+
+    (b) Added the -w (match as a word) option.
+
+    (c) Refactored the way lines are read and buffered so as to have more
+        than one at a time available.
+
+    (d) Implemented a pcregrep test script.
+
+    (e) Added the -M (multiline match) option. This allows patterns to match
+        over several lines of the subject. The buffering ensures that at least
+        8K, or the rest of the document (whichever is the shorter) is available
+        for matching (and similarly the previous 8K for lookbehind assertions).
+
+    (f) Changed the --help output so that it now says
+
+          -w, --word-regex(p)
+
+        instead of two lines, one with "regex" and the other with "regexp"
+        because that confused at least one person since the short forms are the
+        same. (This required a bit of code, as the output is generated
+        automatically from a table. It wasn't just a text change.)
+
+    (g) -- can be used to terminate pcregrep options if the next thing isn't an
+        option but starts with a hyphen. Could be a pattern or a path name
+        starting with a hyphen, for instance.
+
+    (h) "-" can be given as a file name to represent stdin.
+
+    (i) When file names are being printed, "(standard input)" is used for
+        the standard input, for compatibility with GNU grep. Previously
+        "<stdin>" was used.
+
+    (j) The option --label=xxx can be used to supply a name to be used for
+        stdin when file names are being printed. There is no short form.
+
+    (k) Re-factored the options decoding logic because we are going to add
+        two more options that take data. Such options can now be given in four
+        different ways, e.g. "-fname", "-f name", "--file=name", "--file name".
+
+    (l) Added the -A, -B, and -C options for requesting that lines of context
+        around matches be printed.
+
+    (m) Added the -L option to print the names of files that do not contain
+        any matching lines, that is, the complement of -l.
+
+    (n) The return code is 2 if any file cannot be opened, but pcregrep does
+        continue to scan other files.
+
+    (o) The -s option was incorrectly implemented. For compatibility with other
+        greps, it now suppresses the error message for a non-existent or non-
+        accessible file (but not the return code). There is a new option called
+        -q that suppresses the output of matching lines, which was what -s was
+        previously doing.
+
+    (p) Added --include and --exclude options to specify files for inclusion
+        and exclusion when recursing.
+
+11. The Makefile was not using the Autoconf-supported LDFLAGS macro properly.
+    Hopefully, it now does.
+
+12. Missing cast in pcre_study().
+
+13. Added an "uninstall" target to the makefile.
+
+14. Replaced "extern" in the function prototypes in Makefile.in with
+    "PCRE_DATA_SCOPE", which defaults to 'extern' or 'extern "C"' in the Unix
+    world, but is set differently for Windows.
+
+15. Added a second compiling function called pcre_compile2(). The only
+    difference is that it has an extra argument, which is a pointer to an
+    integer error code. When there is a compile-time failure, this is set
+    non-zero, in addition to the error test pointer being set to point to an
+    error message. The new argument may be NULL if no error number is required
+    (but then you may as well call pcre_compile(), which is now just a
+    wrapper). This facility is provided because some applications need a
+    numeric error indication, but it has also enabled me to tidy up the way
+    compile-time errors are handled in the POSIX wrapper.
+
+16. Added VPATH=.libs to the makefile; this should help when building with one
+    prefix path and installing with another. (Or so I'm told by someone who
+    knows more about this stuff than I do.)
+
+17. Added a new option, REG_DOTALL, to the POSIX function regcomp(). This
+    passes PCRE_DOTALL to the pcre_compile() function, making the "." character
+    match everything, including newlines. This is not POSIX-compatible, but
+    somebody wanted the feature. From pcretest it can be activated by using
+    both the P and the s flags.
+
+18. AC_PROG_LIBTOOL appeared twice in Makefile.in. Removed one.
+
+19. libpcre.pc was being incorrectly installed as executable.
+
+20. A couple of places in pcretest check for end-of-line by looking for '\n';
+    it now also looks for '\r' so that it will work unmodified on Windows.
+
+21. Added Google's contributed C++ wrapper to the distribution.
+
+22. Added some untidy missing memory free() calls in pcretest, to keep
+    Electric Fence happy when testing.
+
+
+
+Version 5.0 13-Sep-04
+---------------------
+
+ 1. Internal change: literal characters are no longer packed up into items
+    containing multiple characters in a single byte-string. Each character
+    is now matched using a separate opcode. However, there may be more than one
+    byte in the character in UTF-8 mode.
+
+ 2. The pcre_callout_block structure has two new fields: pattern_position and
+    next_item_length. These contain the offset in the pattern to the next match
+    item, and its length, respectively.
+
+ 3. The PCRE_AUTO_CALLOUT option for pcre_compile() requests the automatic
+    insertion of callouts before each pattern item. Added the /C option to
+    pcretest to make use of this.
+
+ 4. On the advice of a Windows user, the lines
+
+      #if defined(_WIN32) || defined(WIN32)
+      _setmode( _fileno( stdout ), 0x8000 );
+      #endif  /* defined(_WIN32) || defined(WIN32) */
+
+    have been added to the source of pcretest. This apparently does useful
+    magic in relation to line terminators.
+
+ 5. Changed "r" and "w" in the calls to fopen() in pcretest to "rb" and "wb"
+    for the benefit of those environments where the "b" makes a difference.
+
+ 6. The icc compiler has the same options as gcc, but "configure" doesn't seem
+    to know about it. I have put a hack into configure.in that adds in code
+    to set GCC=yes if CC=icc. This seems to end up at a point in the
+    generated configure script that is early enough to affect the setting of
+    compiler options, which is what is needed, but I have no means of testing
+    whether it really works. (The user who reported this had patched the
+    generated configure script, which of course I cannot do.)
+
+    LATER: After change 22 below (new libtool files), the configure script
+    seems to know about icc (and also ecc). Therefore, I have commented out
+    this hack in configure.in.
+
+ 7. Added support for pkg-config (2 patches were sent in).
+
+ 8. Negated POSIX character classes that used a combination of internal tables
+    were completely broken. These were [[:^alpha:]], [[:^alnum:]], and
+    [[:^ascii]]. Typically, they would match almost any characters. The other
+    POSIX classes were not broken in this way.
+
+ 9. Matching the pattern "\b.*?" against "ab cd", starting at offset 1, failed
+    to find the match, as PCRE was deluded into thinking that the match had to
+    start at the start point or following a newline. The same bug applied to
+    patterns with negative forward assertions or any backward assertions
+    preceding ".*" at the start, unless the pattern required a fixed first
+    character. This was a failing pattern: "(?!.bcd).*". The bug is now fixed.
+
+10. In UTF-8 mode, when moving forwards in the subject after a failed match
+    starting at the last subject character, bytes beyond the end of the subject
+    string were read.
+
+11. Renamed the variable "class" as "classbits" to make life easier for C++
+    users. (Previously there was a macro definition, but it apparently wasn't
+    enough.)
+
+12. Added the new field "tables" to the extra data so that tables can be passed
+    in at exec time, or the internal tables can be re-selected. This allows
+    a compiled regex to be saved and re-used at a later time by a different
+    program that might have everything at different addresses.
+
+13. Modified the pcre-config script so that, when run on Solaris, it shows a
+    -R library as well as a -L library.
+
+14. The debugging options of pcretest (-d on the command line or D on a
+    pattern) showed incorrect output for anything following an extended class
+    that contained multibyte characters and which was followed by a quantifier.
+
+15. Added optional support for general category Unicode character properties
+    via the \p, \P, and \X escapes. Unicode property support implies UTF-8
+    support. It adds about 90K to the size of the library. The meanings of the
+    inbuilt class escapes such as \d and \s have NOT been changed.
+
+16. Updated pcredemo.c to include calls to free() to release the memory for the
+    compiled pattern.
+
+17. The generated file chartables.c was being created in the source directory
+    instead of in the building directory. This caused the build to fail if the
+    source directory was different from the building directory, and was
+    read-only.
+
+18. Added some sample Win commands from Mark Tetrode into the NON-UNIX-USE
+    file. No doubt somebody will tell me if they don't make sense... Also added
+    Dan Mooney's comments about building on OpenVMS.
+
+19. Added support for partial matching via the PCRE_PARTIAL option for
+    pcre_exec() and the \P data escape in pcretest.
+
+20. Extended pcretest with 3 new pattern features:
+
+    (i)   A pattern option of the form ">rest-of-line" causes pcretest to
+          write the compiled pattern to the file whose name is "rest-of-line".
+          This is a straight binary dump of the data, with the saved pointer to
+          the character tables forced to be NULL. The study data, if any, is
+          written too. After writing, pcretest reads a new pattern.
+
+    (ii)  If, instead of a pattern, "<rest-of-line" is given, pcretest reads a
+          compiled pattern from the given file. There must not be any
+          occurrences of "<" in the file name (pretty unlikely); if there are,
+          pcretest will instead treat the initial "<" as a pattern delimiter.
+          After reading in the pattern, pcretest goes on to read data lines as
+          usual.
+
+    (iii) The F pattern option causes pcretest to flip the bytes in the 32-bit
+          and 16-bit fields in a compiled pattern, to simulate a pattern that
+          was compiled on a host of opposite endianness.
+
+21. The pcre-exec() function can now cope with patterns that were compiled on
+    hosts of opposite endianness, with this restriction:
+
+      As for any compiled expression that is saved and used later, the tables
+      pointer field cannot be preserved; the extra_data field in the arguments
+      to pcre_exec() should be used to pass in a tables address if a value
+      other than the default internal tables were used at compile time.
+
+22. Calling pcre_exec() with a negative value of the "ovecsize" parameter is
+    now diagnosed as an error. Previously, most of the time, a negative number
+    would have been treated as zero, but if in addition "ovector" was passed as
+    NULL, a crash could occur.
+
+23. Updated the files ltmain.sh, config.sub, config.guess, and aclocal.m4 with
+    new versions from the libtool 1.5 distribution (the last one is a copy of
+    a file called libtool.m4). This seems to have fixed the need to patch
+    "configure" to support Darwin 1.3 (which I used to do). However, I still
+    had to patch ltmain.sh to ensure that ${SED} is set (it isn't on my
+    workstation).
+
+24. Changed the PCRE licence to be the more standard "BSD" licence.
+
+
+Version 4.5 01-Dec-03
+---------------------
+
+ 1. There has been some re-arrangement of the code for the match() function so
+    that it can be compiled in a version that does not call itself recursively.
+    Instead, it keeps those local variables that need separate instances for
+    each "recursion" in a frame on the heap, and gets/frees frames whenever it
+    needs to "recurse". Keeping track of where control must go is done by means
+    of setjmp/longjmp. The whole thing is implemented by a set of macros that
+    hide most of the details from the main code, and operates only if
+    NO_RECURSE is defined while compiling pcre.c. If PCRE is built using the
+    "configure" mechanism, "--disable-stack-for-recursion" turns on this way of
+    operating.
+
+    To make it easier for callers to provide specially tailored get/free
+    functions for this usage, two new functions, pcre_stack_malloc, and
+    pcre_stack_free, are used. They are always called in strict stacking order,
+    and the size of block requested is always the same.
+
+    The PCRE_CONFIG_STACKRECURSE info parameter can be used to find out whether
+    PCRE has been compiled to use the stack or the heap for recursion. The
+    -C option of pcretest uses this to show which version is compiled.
+
+    A new data escape \S, is added to pcretest; it causes the amounts of store
+    obtained and freed by both kinds of malloc/free at match time to be added
+    to the output.
+
+ 2. Changed the locale test to use "fr_FR" instead of "fr" because that's
+    what's available on my current Linux desktop machine.
+
+ 3. When matching a UTF-8 string, the test for a valid string at the start has
+    been extended. If start_offset is not zero, PCRE now checks that it points
+    to a byte that is the start of a UTF-8 character. If not, it returns
+    PCRE_ERROR_BADUTF8_OFFSET (-11). Note: the whole string is still checked;
+    this is necessary because there may be backward assertions in the pattern.
+    When matching the same subject several times, it may save resources to use
+    PCRE_NO_UTF8_CHECK on all but the first call if the string is long.
+
+ 4. The code for checking the validity of UTF-8 strings has been tightened so
+    that it rejects (a) strings containing 0xfe or 0xff bytes and (b) strings
+    containing "overlong sequences".
+
+ 5. Fixed a bug (appearing twice) that I could not find any way of exploiting!
+    I had written "if ((digitab[*p++] && chtab_digit) == 0)" where the "&&"
+    should have been "&", but it just so happened that all the cases this let
+    through by mistake were picked up later in the function.
+
+ 6. I had used a variable called "isblank" - this is a C99 function, causing
+    some compilers to warn. To avoid this, I renamed it (as "blankclass").
+
+ 7. Cosmetic: (a) only output another newline at the end of pcretest if it is
+    prompting; (b) run "./pcretest /dev/null" at the start of the test script
+    so the version is shown; (c) stop "make test" echoing "./RunTest".
+
+ 8. Added patches from David Burgess to enable PCRE to run on EBCDIC systems.
+
+ 9. The prototype for memmove() for systems that don't have it was using
+    size_t, but the inclusion of the header that defines size_t was later. I've
+    moved the #includes for the C headers earlier to avoid this.
+
+10. Added some adjustments to the code to make it easier to compiler on certain
+    special systems:
+
+      (a) Some "const" qualifiers were missing.
+      (b) Added the macro EXPORT before all exported functions; by default this
+          is defined to be empty.
+      (c) Changed the dftables auxiliary program (that builds chartables.c) so
+          that it reads its output file name as an argument instead of writing
+          to the standard output and assuming this can be redirected.
+
+11. In UTF-8 mode, if a recursive reference (e.g. (?1)) followed a character
+    class containing characters with values greater than 255, PCRE compilation
+    went into a loop.
+
+12. A recursive reference to a subpattern that was within another subpattern
+    that had a minimum quantifier of zero caused PCRE to crash. For example,
+    (x(y(?2))z)? provoked this bug with a subject that got as far as the
+    recursion. If the recursively-called subpattern itself had a zero repeat,
+    that was OK.
+
+13. In pcretest, the buffer for reading a data line was set at 30K, but the
+    buffer into which it was copied (for escape processing) was still set at
+    1024, so long lines caused crashes.
+
+14. A pattern such as /[ab]{1,3}+/ failed to compile, giving the error
+    "internal error: code overflow...". This applied to any character class
+    that was followed by a possessive quantifier.
+
+15. Modified the Makefile to add libpcre.la as a prerequisite for
+    libpcreposix.la because I was told this is needed for a parallel build to
+    work.
+
+16. If a pattern that contained .* following optional items at the start was
+    studied, the wrong optimizing data was generated, leading to matching
+    errors. For example, studying /[ab]*.*c/ concluded, erroneously, that any
+    matching string must start with a or b or c. The correct conclusion for
+    this pattern is that a match can start with any character.
+
+
+Version 4.4 13-Aug-03
+---------------------
+
+ 1. In UTF-8 mode, a character class containing characters with values between
+    127 and 255 was not handled correctly if the compiled pattern was studied.
+    In fixing this, I have also improved the studying algorithm for such
+    classes (slightly).
+
+ 2. Three internal functions had redundant arguments passed to them. Removal
+    might give a very teeny performance improvement.
+
+ 3. Documentation bug: the value of the capture_top field in a callout is *one
+    more than* the number of the hightest numbered captured substring.
+
+ 4. The Makefile linked pcretest and pcregrep with -lpcre, which could result
+    in incorrectly linking with a previously installed version. They now link
+    explicitly with libpcre.la.
+
+ 5. configure.in no longer needs to recognize Cygwin specially.
+
+ 6. A problem in pcre.in for Windows platforms is fixed.
+
+ 7. If a pattern was successfully studied, and the -d (or /D) flag was given to
+    pcretest, it used to include the size of the study block as part of its
+    output. Unfortunately, the structure contains a field that has a different
+    size on different hardware architectures. This meant that the tests that
+    showed this size failed. As the block is currently always of a fixed size,
+    this information isn't actually particularly useful in pcretest output, so
+    I have just removed it.
+
+ 8. Three pre-processor statements accidentally did not start in column 1.
+    Sadly, there are *still* compilers around that complain, even though
+    standard C has not required this for well over a decade. Sigh.
+
+ 9. In pcretest, the code for checking callouts passed small integers in the
+    callout_data field, which is a void * field. However, some picky compilers
+    complained about the casts involved for this on 64-bit systems. Now
+    pcretest passes the address of the small integer instead, which should get
+    rid of the warnings.
+
+10. By default, when in UTF-8 mode, PCRE now checks for valid UTF-8 strings at
+    both compile and run time, and gives an error if an invalid UTF-8 sequence
+    is found. There is a option for disabling this check in cases where the
+    string is known to be correct and/or the maximum performance is wanted.
+
+11. In response to a bug report, I changed one line in Makefile.in from
+
+        -Wl,--out-implib,.libs/lib@WIN_PREFIX@pcreposix.dll.a \
+    to
+        -Wl,--out-implib,.libs/@WIN_PREFIX@libpcreposix.dll.a \
+
+    to look similar to other lines, but I have no way of telling whether this
+    is the right thing to do, as I do not use Windows. No doubt I'll get told
+    if it's wrong...
+
+
 Version 4.3 21-May-03
 ---------------------
 
diff -Nurp tin-1.6.2/pcre/LICENCE tin-1.8.0/pcre/LICENCE
--- tin-1.6.2/pcre/LICENCE	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/LICENCE	2005-06-28 10:31:25.000000000 +0200
@@ -4,51 +4,65 @@ PCRE LICENCE
 PCRE is a library of functions to support regular expressions whose syntax
 and semantics are as close as possible to those of the Perl 5 language.
 
-Written by: Philip Hazel <ph10@cam.ac.uk>
+Release 6 of PCRE is distributed under the terms of the "BSD" licence, as
+specified below. The documentation for PCRE, supplied in the "doc"
+directory, is distributed under the same terms as the software itself.
+
+The basic library functions are written in C and are freestanding. Also
+included in the distribution is a set of C++ wrapper functions.
+
+
+THE BASIC LIBRARY FUNCTIONS
+---------------------------
+
+Written by:       Philip Hazel
+Email local part: ph10
+Email domain:     cam.ac.uk
 
 University of Cambridge Computing Service,
 Cambridge, England. Phone: +44 1223 334714.
 
-Copyright (c) 1997-2001 University of Cambridge
+Copyright (c) 1997-2005 University of Cambridge
+All rights reserved.
+
+
+THE C++ WRAPPER FUNCTIONS
+-------------------------
+
+Contributed by:   Google Inc.
+
+Copyright (c) 2005, Google Inc.
+All rights reserved.
+
+
+THE "BSD" LICENCE
+-----------------
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
 
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission. In practice, this means that if you use
-   PCRE in software that you distribute to others, commercially or
-   otherwise, you must put a sentence like this
-
-     Regular expression support is provided by the PCRE library package,
-     which is open source software, written by Philip Hazel, and copyright
-     by the University of Cambridge, England.
-
-   somewhere reasonably visible in your documentation and in any relevant
-   files or online help data or similar. A reference to the ftp site for
-   the source, that is, to
-
-     ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
-
-   should also be given in the documentation. However, this condition is not
-   intended to apply to whole chains of software. If package A includes PCRE,
-   it must acknowledge it, but if package B is software that includes package
-   A, the condition is not imposed on package B (unless it uses PCRE
-   independently).
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), or Lesser General Purpose Licence (LGPL),
-   then the terms of that licence shall supersede any condition above with
-   which it is incompatible.
+    * Neither the name of the University of Cambridge nor the name of Google
+      Inc. nor the names of their contributors may be used to endorse or
+      promote products derived from this software without specific prior
+      written permission.
 
-The documentation for PCRE, supplied in the "doc" directory, is distributed
-under the same terms as the software itself.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
 
 End
diff -Nurp tin-1.6.2/pcre/Makefile.in tin-1.8.0/pcre/Makefile.in
--- tin-1.6.2/pcre/Makefile.in	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/Makefile.in	2005-09-12 16:51:05.000000000 +0200
@@ -11,8 +11,18 @@ srcdir		= @srcdir@
 VPATH		= $(srcdir)
 @SET_MAKE@
 
-CC	= @CC@
-CFLAGS	= @CFLAGS@ @PCRE_DEFINES@
+CC		= @CC@
+CFLAGS		= @CFLAGS@ @PCRE_DEFINES@
+
+x		= @EXEEXT@
+o		= .@OBJEXT@
+
+BUILD_CC	= @BUILD_CC@
+BUILD_CFLAGS	= @BUILD_CFLAGS@
+BUILD_CPPFLAGS	= @BUILD_CPPFLAGS@
+BUILD_LDFLAGS	= @BUILD_LDFLAGS@
+BUILD_LIBS	= @BUILD_LIBS@
+X		= $(BUILD_EXEEXT)
 
 # The -D options correspond to pcre 4.1's default values.
 CPPOPTS = \
@@ -20,88 +30,99 @@ CPPOPTS = \
 	-DMATCH_LIMIT=10000000 \
 	-DNEWLINE=10 \
 	-DPOSIX_MALLOC_THRESHOLD=10 \
-	@DEFS@ -I. -I. -I../include
+	@DEFS@ -I. -I../include
 
 RANLIB	= @RANLIB@
 RM	= rm
-x	= @PROG_EXT@
+
 PRELIB	= @LIB_PREFIX@
-AR	= ar cq
+ARCHIVE	= @AR@ @AR_OPTS@
 
 ##########################################################################
 
-OBJ	= \
-	maketables.o \
-	get.o \
-	study.o \
-	pcre.o
+OBJ = \
+	pcre_chartables$o \
+	pcre_compile$o \
+	pcre_config$o \
+	pcre_dfa_exec$o \
+	pcre_exec$o \
+	pcre_fullinfo$o \
+	pcre_get$o \
+	pcre_globals$o \
+	pcre_info$o \
+	pcre_maketables$o \
+	pcre_ord2utf8$o \
+	pcre_refcount$o \
+	pcre_study$o \
+	pcre_tables$o \
+	pcre_try_flipped$o \
+	pcre_ucp_findchar$o \
+	pcre_valid_utf8$o \
+	pcre_version$o \
+	pcre_xclass$o
 
 PCR_DEP	= \
-	internal.h \
+	pcre_internal.h \
 	pcre.h
 
-all:	$(PRELIB)pcre.a $(PRELIB)pcreposix.a pcretest$x pgrep$x
+all :	$(PRELIB)pcre.a $(PRELIB)pcreposix.a pcretest$x pcregrep$x
 
-.SUFFIXES: .i
+.SUFFIXES : .i
 
-.c.o:
+.c$o :
 @SHOW_CC@
 	@ECHO_CC@$(CC) $(CPPOPTS) $(CFLAGS) -c $(srcdir)/$*.c
 
-.c.i:
+.c.i :
 @SHOW_CC@
 	@ECHO_CC@$(CPP) -C $(CPPOPTS) $*.c >$@
 
-pgrep$x:	$(PRELIB)pcre.a pcregrep.o
-		$(CC) $(CFLAGS) -o $@ pcregrep.o $(PRELIB)pcre.a
+pcregrep$x :	$(PRELIB)pcre.a pcregrep$o
+		$(CC) $(CFLAGS) -o $@ pcregrep$o $(PRELIB)pcre.a
 
-pcretest$x:	$(PRELIB)pcre.a $(PRELIB)pcreposix.a pcretest.o
-		$(CC) $(CFLAGS) -o $@ pcretest.o $(PRELIB)pcre.a $(PRELIB)pcreposix.a
+pcretest$x :	$(PRELIB)pcre.a $(PRELIB)pcreposix.a pcretest$o
+		$(CC) $(CFLAGS) -o $@ pcretest$o $(PRELIB)pcre.a $(PRELIB)pcreposix.a
 
-$(PRELIB)pcre.a: $(OBJ)
+$(PRELIB)pcre.a : $(OBJ)
 		$(RM) -f $(PRELIB)pcre.a
-		$(AR) $(PRELIB)pcre.a $(OBJ)
+		$(ARCHIVE) $(PRELIB)pcre.a $(OBJ)
 		$(RANLIB) $(PRELIB)pcre.a
 
-$(PRELIB)pcreposix.a: pcreposix.o
+$(PRELIB)pcreposix.a : pcreposix$o
 		$(RM) -f $(PRELIB)pcreposix.a
-		$(AR) $(PRELIB)pcreposix.a pcreposix.o
+		$(ARCHIVE) $(PRELIB)pcreposix.a pcreposix$o
 		$(RANLIB) $(PRELIB)pcreposix.a
 
-pcre.o:		chartables.c pcre.c $(PCR_DEP)
+pcre$o :	chartables.c pcre.c $(PCR_DEP)
 
-pcreposix.o:	pcreposix.c pcreposix.h $(PCR_DEP)
+pcreposix$o :	pcreposix.c pcreposix.h $(PCR_DEP)
 
-maketables.o:	maketables.c $(PCR_DEP)
+maketables$o :	pcre_maketables.c $(PCR_DEP)
 @SHOW_CC@
-	@ECHO_CC@$(CC) $(CPPOPTS) $(CFLAGS) -c $(srcdir)/maketables.c
-
-get.o:		get.c $(PCR_DEP)
-
-study.o:	study.c $(PCR_DEP)
+	@ECHO_CC@$(CC) $(CPPOPTS) $(CFLAGS) -c $(srcdir)/pcre_maketables.c
 
-pcretest.o:	pcretest.c pcre.h
+pcretest$o :	pcretest.c pcre.h
 
-pcregrep.o:	pcregrep.c pcre.h
+pcregrep$o :	pcregrep.c pcre.h
 
 # An auxiliary program makes the default character table source
 
-chartables.c:	dftables$x
-		./dftables$x >$@
+pcre_chartables.c :	dftables$X
+		./dftables$X $@
 
-dftables$x:	dftables.c maketables.c $(PCR_DEP)
+dftables$X :	dftables.c pcre_maketables.c $(PCR_DEP)
 @SHOW_CC@
-		@ECHO_CC@$(CC) -o $@ $(CFLAGS) $(CPPOPTS) $(srcdir)/dftables.c
+		@ECHO_CC@$(BUILD_CC) -o $@ $(BUILD_CFLAGS) $(CPPOPTS) $(srcdir)/dftables.c
 
 # We deliberately omit dftables and chartables.c from 'make clean'; once made
 # chartables.c shouldn't change, and if people have edited the tables by hand,
 # you don't want to throw them away.
 
-clean:;		$(RM) -f *.o *.a pcretest$x pgrep$x
+clean :;		$(RM) -f *$o *.a pcretest$x pcregrep$x
 
-distclean:	clean ; $(RM) -f pcre.h dftables$x chartables.c RunTest
+distclean :	clean ; $(RM) -f pcre.h dftables$X pcre_chartables.c RunTest
 
-runtest:	all
+runtest :	all
 		./RunTest
 
 # End
diff -Nurp tin-1.6.2/pcre/Makefile.in-old tin-1.8.0/pcre/Makefile.in-old
--- tin-1.6.2/pcre/Makefile.in-old	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/Makefile.in-old	2005-09-12 16:32:19.000000000 +0200
@@ -1,21 +1,14 @@
 
 # Makefile.in for PCRE (Perl-Compatible Regular Expression) library.
 
-#---------------------------------------------------------------------------#
-# MinGW DLLs are built automatically with this configure.in and Makefile.in #
-# as long you are using autoconf 2.50 or higher. The Win32 static libraries #
-# have not been tested, but appear to be generated. This functionality is   #
-# by courtesy of Fred Cox. I (Philip Hazel) don't know anything about it,   #
-# as I live entirely in a non-Windows world.                                #
-#---------------------------------------------------------------------------#
-
 
 #############################################################################
 
 # PCRE is developed on a Unix system. I do not use Windows or Macs, and know
 # nothing about building software on them. Although the code of PCRE should
 # be very portable, the building system in this Makefile is designed for Unix
-# systems, with the exception of the mingw32 stuff just mentioned.
+# systems. However, there are features that have been supplied to me by various
+# people that should make it work on MinGW and Cygwin systems.
 
 # This setting enables Unix-style directory scanning in pcregrep, triggered
 # by the -f option. Maybe one day someone will add code for other systems.
@@ -25,6 +18,13 @@ PCREGREP_OSTYPE=-DIS_UNIX
 #############################################################################
 
 
+# Libtool places .o files in the .libs directory; this can mean that "make"
+# thinks is it not up-to-date when in fact it is. This setting helps when
+# GNU "make" is being used. It presumably does no harm in other cases.
+
+VPATH=.libs
+
+
 #---------------------------------------------------------------------------#
 # The following lines are modified by "configure" to insert data that it is #
 # given in its arguments, or which it finds out for itself.                 #
@@ -65,19 +65,34 @@ OBJEXT = @OBJEXT@
 BUILD_EXEEXT = @BUILD_EXEEXT@
 BUILD_OBJEXT = @BUILD_OBJEXT@
 
+# POSIX_OBJ and POSIX_LOBJ are either set empty, or to the names of the
+# POSIX object files.
+
+POSIX_OBJ = @POSIX_OBJ@
+POSIX_LOBJ = @POSIX_LOBJ@
+
 # The compiler, C flags, preprocessor flags, etc
 
 CC = @CC@
+CXX = @CXX@
 CFLAGS = @CFLAGS@
-CPPFLAGS = @CPPFLAGS@
+CXXFLAGS = @CXXFLAGS@
+LDFLAGS = @LDFLAGS@
+
 CC_FOR_BUILD = @CC_FOR_BUILD@
 CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
-CPPFLAGS_FOR_BUILD = @CPPFLAGS_FOR_BUILD@
+CXX_FOR_BUILD = @CXX_FOR_BUILD@
+CXXFLAGS_FOR_BUILD = @CXXFLAGS_FOR_BUILD@
+LDFLAGS_FOR_BUILD = $(LDFLAGS)
+
+UCP = @UCP@
 UTF8 = @UTF8@
 NEWLINE = @NEWLINE@
 POSIX_MALLOC_THRESHOLD = @POSIX_MALLOC_THRESHOLD@
 LINK_SIZE = @LINK_SIZE@
-MATCH_LIMIT= @MATCH_LIMIT@
+MATCH_LIMIT = @MATCH_LIMIT@
+NO_RECURSE = @NO_RECURSE@
+EBCDIC = @EBCDIC@
 
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
@@ -86,74 +101,255 @@ INSTALL_DATA = @INSTALL_DATA@
 # to do one or the other or both by ./configure.
 
 LIBTOOL = @LIBTOOL@
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) -c $(CFLAGS) -I. -I$(top_srcdir) $(NEWLINE) $(LINK_SIZE) $(MATCH_LIMIT)
-@ON_WINDOWS@LINK = $(CC) $(CFLAGS) -I. -I$(top_srcdir) -L.libs
-@NOT_ON_WINDOWS@LINK = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -I. -I$(top_srcdir)
-LINKLIB = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -I. -I$(top_srcdir)
-LINK_FOR_BUILD = $(LIBTOOL) --mode=link $(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) -I. -I$(top_srcdir)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) -c $(CFLAGS) -I. -I$(top_srcdir) $(NEWLINE) $(LINK_SIZE) $(MATCH_LIMIT) $(NO_RECURSE) $(EBCDIC)
+LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) -c $(CXXFLAGS) -I. -I$(top_srcdir) $(NEWLINE) $(LINK_SIZE) $(MATCH_LIMIT) $(NO_RECURSE) $(EBCDIC)
+@ON_WINDOWS@LINK = $(CC) $(LDFLAGS) -I. -I$(top_srcdir) -L.libs
+@NOT_ON_WINDOWS@LINK = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(LDFLAGS) -I. -I$(top_srcdir)
+LINKLIB = $(LIBTOOL) --mode=link $(CC) -export-symbols-regex '^[^_]' $(LDFLAGS) -I. -I$(top_srcdir)
+LINK_FOR_BUILD = $(LIBTOOL) --mode=link $(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) $(LDFLAGS_FOR_BUILD) -I. -I$(top_srcdir)
+@ON_WINDOWS@CXXLINK = $(CXX) $(LDFLAGS) -I. -I$(top_srcdir) -L.libs
+@NOT_ON_WINDOWS@CXXLINK = $(LIBTOOL) --mode=link $(CXX) $(LDFLAGS) -I. -I$(top_srcdir)
+CXXLINKLIB = $(LIBTOOL) --mode=link $(CXX) $(LDFLAGS) -I. -I$(top_srcdir)
 
 # These are the version numbers for the shared libraries
 
 PCRELIBVERSION = @PCRE_LIB_VERSION@
 PCREPOSIXLIBVERSION = @PCRE_POSIXLIB_VERSION@
+PCRECPPLIBVERSION = @PCRE_CPPLIB_VERSION@
 
 ##############################################################################
 
 
-OBJ = maketables.@OBJEXT@ get.@OBJEXT@ study.@OBJEXT@ pcre.@OBJEXT@ @POSIX_OBJ@
-LOBJ = maketables.lo get.lo study.lo pcre.lo @POSIX_LOBJ@
+OBJ = pcre_chartables.@OBJEXT@ \
+  pcre_compile.@OBJEXT@ \
+  pcre_config.@OBJEXT@ \
+  pcre_dfa_exec.@OBJEXT@ \
+  pcre_exec.@OBJEXT@ \
+  pcre_fullinfo.@OBJEXT@ \
+  pcre_get.@OBJEXT@ \
+  pcre_globals.@OBJEXT@ \
+  pcre_info.@OBJEXT@ \
+  pcre_maketables.@OBJEXT@ \
+  pcre_ord2utf8.@OBJEXT@ \
+  pcre_refcount.@OBJEXT@ \
+  pcre_study.@OBJEXT@ \
+  pcre_tables.@OBJEXT@ \
+  pcre_try_flipped.@OBJEXT@ \
+  pcre_ucp_findchar.@OBJEXT@ \
+  pcre_valid_utf8.@OBJEXT@ \
+  pcre_version.@OBJEXT@ \
+  pcre_xclass.@OBJEXT@ \
+  $(POSIX_OBJ)
+
+LOBJ = pcre_chartables.lo \
+  pcre_compile.lo \
+  pcre_config.lo \
+  pcre_dfa_exec.lo \
+  pcre_exec.lo \
+  pcre_fullinfo.lo \
+  pcre_get.lo \
+  pcre_globals.lo \
+  pcre_info.lo \
+  pcre_maketables.lo \
+  pcre_ord2utf8.lo \
+  pcre_refcount.lo \
+  pcre_study.lo \
+  pcre_tables.lo \
+  pcre_try_flipped.lo \
+  pcre_ucp_findchar.lo \
+  pcre_valid_utf8.lo \
+  pcre_version.lo \
+  pcre_xclass.lo \
+  $(POSIX_LOBJ)
+
+CPPOBJ = pcrecpp.@OBJEXT@ \
+  pcre_scanner.@OBJEXT@ \
+  pcre_stringpiece.@OBJEXT@
+
+CPPLOBJ = pcrecpp.lo \
+  pcre_scanner.lo \
+  pcre_stringpiece.lo
+
+CPP_TARGETS = libpcrecpp.la \
+  pcrecpp_unittest@EXEEXT@ \
+  pcre_scanner_unittest@EXEEXT@ \
+  pcre_stringpiece_unittest@EXEEXT@
 
-all:            libpcre.la @POSIX_LIB@ pcretest@EXEEXT@ pcregrep@EXEEXT@ @ON_WINDOWS@ winshared
+all:            libpcre.la @POSIX_LIB@ pcretest@EXEEXT@ pcregrep@EXEEXT@ @MAYBE_CPP_TARGETS@ @ON_WINDOWS@ winshared
 
 pcregrep@EXEEXT@: libpcre.la pcregrep.@OBJEXT@ @ON_WINDOWS@ winshared
-		$(LINK) -o pcregrep@EXEEXT@ pcregrep.@OBJEXT@ -lpcre
+		$(LINK) -o pcregrep@EXEEXT@ pcregrep.@OBJEXT@ libpcre.la
 
 pcretest@EXEEXT@: libpcre.la @POSIX_LIB@ pcretest.@OBJEXT@ @ON_WINDOWS@ winshared
 		$(LINK) $(PURIFY) $(EFENCE) -o pcretest@EXEEXT@  pcretest.@OBJEXT@ \
-		-lpcre @POSIX_LIB@
+		libpcre.la @POSIX_LIB@
+
+pcrecpp_unittest@EXEEXT@: libpcrecpp.la pcrecpp_unittest.@OBJEXT@ @ON_WINDOWS@ winshared
+		$(CXXLINK) $(PURIFY) $(EFENCE) -o pcrecpp_unittest@EXEEXT@  pcrecpp_unittest.@OBJEXT@ \
+		libpcrecpp.la @POSIX_LIB@
+
+pcre_scanner_unittest@EXEEXT@: libpcrecpp.la pcre_scanner_unittest.@OBJEXT@ @ON_WINDOWS@ winshared
+		$(CXXLINK) $(PURIFY) $(EFENCE) -o pcre_scanner_unittest@EXEEXT@  pcre_scanner_unittest.@OBJEXT@ \
+		libpcrecpp.la @POSIX_LIB@
+
+pcre_stringpiece_unittest@EXEEXT@: libpcrecpp.la pcre_stringpiece_unittest.@OBJEXT@ @ON_WINDOWS@ winshared
+		$(CXXLINK) $(PURIFY) $(EFENCE) -o pcre_stringpiece_unittest@EXEEXT@	pcre_stringpiece_unittest.@OBJEXT@ \
+		libpcrecpp.la @POSIX_LIB@
 
 libpcre.la:     $(OBJ)
 		-rm -f libpcre.la
 		$(LINKLIB) -rpath $(LIBDIR) -version-info \
 		'$(PCRELIBVERSION)' -o libpcre.la $(LOBJ)
 
-libpcreposix.la: pcreposix.@OBJEXT@
+libpcreposix.la: libpcre.la pcreposix.@OBJEXT@
 		-rm -f libpcreposix.la
-		$(LINKLIB) -rpath $(LIBDIR) -L. -lpcre -version-info \
+		$(LINKLIB) -rpath $(LIBDIR) libpcre.la -version-info \
 		'$(PCREPOSIXLIBVERSION)' -o libpcreposix.la pcreposix.lo
 
-pcre.@OBJEXT@:  $(top_srcdir)/chartables.c $(top_srcdir)/pcre.c \
-		$(top_srcdir)/internal.h $(top_srcdir)/printint.c \
-		pcre.h config.h Makefile
-		$(LTCOMPILE) $(UTF8) $(POSIX_MALLOC_THRESHOLD) $(top_srcdir)/pcre.c
-
-pcreposix.@OBJEXT@: $(top_srcdir)/pcreposix.c $(top_srcdir)/pcreposix.h \
-		$(top_srcdir)/internal.h pcre.h config.h Makefile
-		$(LTCOMPILE) $(POSIX_MALLOC_THRESHOLD) $(top_srcdir)/pcreposix.c
+libpcrecpp.la: libpcre.la $(CPPOBJ)
+		-rm -f libpcrecpp.la
+		$(CXXLINKLIB) -rpath $(LIBDIR) libpcre.la -version-info \
+		'$(PCRECPPLIBVERSION)' -o libpcrecpp.la $(CPPLOBJ)
+
+# Note that files generated by ./configure and by dftables are in the current
+# directory, not the source directory.
+
+pcre_chartables.@OBJEXT@: pcre_chartables.c
+		@$(LTCOMPILE) pcre_chartables.c
+
+pcre_compile.@OBJEXT@: Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_compile.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_compile.c
+
+pcre_config.@OBJEXT@:  Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_config.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_config.c
+
+pcre_dfa_exec.@OBJEXT@: Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_dfa_exec.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_dfa_exec.c
+
+pcre_exec.@OBJEXT@:    Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_exec.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_exec.c
+
+pcre_fullinfo.@OBJEXT@: Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_fullinfo.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_fullinfo.c
+
+pcre_get.@OBJEXT@:     Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_get.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_get.c
+
+pcre_globals.@OBJEXT@: Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_globals.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_globals.c
+
+pcre_info.@OBJEXT@:    Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_info.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_info.c
+
+pcre_maketables.@OBJEXT@: Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_maketables.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_maketables.c
+
+pcre_ord2utf8.@OBJEXT@: Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_ord2utf8.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_ord2utf8.c
+
+pcre_refcount.@OBJEXT@:   Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_refcount.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_refcount.c
+
+pcre_study.@OBJEXT@:   Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_study.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_study.c
+
+pcre_tables.@OBJEXT@:  Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_tables.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_tables.c
+
+pcre_try_flipped.@OBJEXT@: Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_try_flipped.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_try_flipped.c
+
+pcre_ucp_findchar.@OBJEXT@: Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_ucp_findchar.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_ucp_findchar.c
+
+pcre_valid_utf8.@OBJEXT@: Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_valid_utf8.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_valid_utf8.c
+
+pcre_version.@OBJEXT@: Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_version.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_version.c
+
+pcre_xclass.@OBJEXT@:  Makefile config.h pcre.h \
+		$(top_srcdir)/pcre_internal.h $(top_srcdir)/pcre_xclass.c
+		@$(LTCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_xclass.c
+
+pcreposix.@OBJEXT@:    $(top_srcdir)/pcreposix.c $(top_srcdir)/pcreposix.h \
+		  $(top_srcdir)/pcre_internal.h pcre.h config.h Makefile
+		@$(LTCOMPILE) $(POSIX_MALLOC_THRESHOLD) $(top_srcdir)/pcreposix.c
+
+pcrecpp.@OBJEXT@:      $(top_srcdir)/pcrecpp.cc pcrecpp.h \
+		pcre_stringpiece.h pcre.h config.h Makefile
+		@$(LTCXXCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcrecpp.cc
+
+pcre_scanner.@OBJEXT@: $(top_srcdir)/pcre_scanner.cc $(top_srcdir)/pcre_scanner.h \
+		pcrecpp.h pcre_stringpiece.h pcre.h config.h Makefile
+		@$(LTCXXCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_scanner.cc
+
+pcre_stringpiece.@OBJEXT@:  $(top_srcdir)/pcre_stringpiece.cc pcre_stringpiece.h \
+		config.h Makefile
+		@$(LTCXXCOMPILE) $(UTF8) $(UCP) $(POSIX_MALLOC_THRESHOLD) \
+		$(top_srcdir)/pcre_stringpiece.cc
 
-maketables.@OBJEXT@:   $(top_srcdir)/maketables.c $(top_srcdir)/internal.h \
+pcretest.@OBJEXT@:     $(top_srcdir)/pcretest.c $(top_srcdir)/pcre_internal.h \
 		pcre.h config.h Makefile
-		$(LTCOMPILE) $(top_srcdir)/maketables.c
+		$(CC) -c $(CFLAGS) -I. -I$(top_srcdir) $(UTF8) $(UCP) $(LINK_SIZE) $(top_srcdir)/pcretest.c
 
-get.@OBJEXT@:          $(top_srcdir)/get.c $(top_srcdir)/internal.h \
-		pcre.h config.h Makefile
-		$(LTCOMPILE) $(top_srcdir)/get.c
-
-study.@OBJEXT@:        $(top_srcdir)/study.c $(top_srcdir)/internal.h \
-		pcre.h config.h Makefile
-		$(LTCOMPILE) $(UTF8) $(top_srcdir)/study.c
+pcrecpp_unittest.@OBJEXT@:  $(top_srcdir)/pcrecpp_unittest.cc pcrecpp.h \
+		pcre_stringpiece.h pcre.h config.h Makefile
+		$(CXX) -c $(CXXFLAGS) -I. -I$(top_srcdir) $(UTF8) $(UCP) $(LINK_SIZE) $(top_srcdir)/pcrecpp_unittest.cc
+
+pcre_stringpiece_unittest.@OBJEXT@:  $(top_srcdir)/pcre_stringpiece_unittest.cc \
+		pcre_stringpiece.h config.h Makefile
+		$(CXX) -c $(CXXFLAGS) -I. -I$(top_srcdir) $(UTF8) $(UCP) $(LINK_SIZE) $(top_srcdir)/pcre_stringpiece_unittest.cc
 
-pcretest.@OBJEXT@:     $(top_srcdir)/pcretest.c $(top_srcdir)/internal.h \
-		$(top_srcdir)/printint.c \
+pcre_scanner_unittest.@OBJEXT@:  $(top_srcdir)/pcre_scanner_unittest.cc \
+		$(top_srcdir)/pcre_scanner.h pcrecpp.h pcre_stringpiece.h \
 		pcre.h config.h Makefile
-		$(CC) -c $(CFLAGS) -I. $(UTF8) $(LINK_SIZE) $(top_srcdir)/pcretest.c
+		$(CXX) -c $(CXXFLAGS) -I. -I$(top_srcdir) $(UTF8) $(UCP) $(LINK_SIZE) $(top_srcdir)/pcre_scanner_unittest.cc
 
 pcregrep.@OBJEXT@:     $(top_srcdir)/pcregrep.c pcre.h Makefile config.h
-		$(CC) -c $(CFLAGS) -I. $(UTF8) $(PCREGREP_OSTYPE) $(top_srcdir)/pcregrep.c
+		$(CC) -c $(CFLAGS) -I. -I$(top_srcdir) $(UTF8) $(UCP) $(PCREGREP_OSTYPE) $(top_srcdir)/pcregrep.c
 
-# Some Windows-specific targets, for Cygwin and MinGW
+# Some Windows-specific targets for MinGW. Do not use for Cygwin.
 
-winshared : .libs/@WIN_PREFIX@pcre.dll .libs/@WIN_PREFIX@pcreposix.dll
+winshared : .libs/@WIN_PREFIX@pcre.dll .libs/@WIN_PREFIX@pcreposix.dll \
+		.libs/@WIN_PREFIX@pcrecpp.dll
 
 .libs/@WIN_PREFIX@pcre.dll : libpcre.la
 	$(CC) $(CFLAGS) -shared -o $@ \
@@ -165,28 +361,44 @@ winshared : .libs/@WIN_PREFIX@pcre.dll .
 	sed -e "s#dlname=''#dlname='../bin/@WIN_PREFIX@pcre.dll'#" \
 	-e "s#library_names=''#library_names='libpcre.dll.a'#" \
 	< .libs/libpcre.lai > .libs/libpcre.lai.tmp && \
-	mv .libs/libpcre.lai.tmp .libs/libpcre.lai
+	mv -f .libs/libpcre.lai.tmp .libs/libpcre.lai
 	sed -e "s#dlname=''#dlname='../bin/@WIN_PREFIX@pcre.dll'#" \
 	-e "s#library_names=''#library_names='libpcre.dll.a'#" \
 	< libpcre.la > libpcre.la.tmp && \
-	mv libpcre.la.tmp libpcre.la
+	mv -f libpcre.la.tmp libpcre.la
 
 
 .libs/@WIN_PREFIX@pcreposix.dll: libpcreposix.la libpcre.la
 	$(CC) $(CFLAGS) -shared -o $@ \
 	-Wl,--whole-archive .libs/libpcreposix.a \
-	-Wl,--out-implib,.libs/lib@WIN_PREFIX@pcreposix.dll.a \
-	-Wl,--output-def,.libs/@WIN_PREFIX@pcreposix.dll-def \
+	-Wl,--out-implib,.libs/@WIN_PREFIX@pcreposix.dll.a \
+	-Wl,--output-def,.libs/@WIN_PREFIX@libpcreposix.dll-def \
 	-Wl,--export-all-symbols \
 	-Wl,--no-whole-archive .libs/libpcre.a
 	sed -e "s#dlname=''#dlname='../bin/@WIN_PREFIX@pcreposix.dll'#" \
 	-e "s#library_names=''#library_names='libpcreposix.dll.a'#"\
 	< .libs/libpcreposix.lai > .libs/libpcreposix.lai.tmp && \
-	mv .libs/libpcreposix.lai.tmp .libs/libpcreposix.lai
+	mv -f .libs/libpcreposix.lai.tmp .libs/libpcreposix.lai
 	sed -e "s#dlname=''#dlname='../bin/@WIN_PREFIX@pcreposix.dll'#" \
 	-e "s#library_names=''#library_names='libpcreposix.dll.a'#"\
 	< libpcreposix.la > libpcreposix.la.tmp && \
-	mv libpcreposix.la.tmp libpcreposix.la
+	mv -f libpcreposix.la.tmp libpcreposix.la
+
+.libs/@WIN_PREFIX@pcrecpp.dll: libpcrecpp.la libpcre.la
+	$(CXX) $(CXXFLAGS) -shared -o $@ \
+	-Wl,--whole-archive .libs/libpcrecpp.a \
+	-Wl,--out-implib,.libs/@WIN_PREFIX@pcrecpp.dll.a \
+	-Wl,--output-def,.libs/@WIN_PREFIX@libpcrecpp.dll-def \
+	-Wl,--export-all-symbols \
+	-Wl,--no-whole-archive .libs/libpcre.a
+	sed -e "s#dlname=''#dlname='../bin/@WIN_PREFIX@pcrecpp.dll'#" \
+	-e "s#library_names=''#library_names='libpcrecpp.dll.a'#"\
+	< .libs/libpcrecpp.lai > .libs/libpcrecpp.lai.tmp && \
+	mv -f .libs/libpcrecpp.lai.tmp .libs/libpcrecpp.lai
+	sed -e "s#dlname=''#dlname='../bin/@WIN_PREFIX@pcrecpp.dll'#" \
+	-e "s#library_names=''#library_names='libpcrecpp.dll.a'#"\
+	< libpcrecpp.la > libpcrecpp.la.tmp && \
+	mv -f libpcrecpp.la.tmp libpcrecpp.la
 
 
 wininstall : winshared
@@ -196,22 +408,27 @@ wininstall : winshared
 	$(INSTALL) .libs/@WIN_PREFIX@pcreposix.dll $(DESTDIR)$(BINDIR)/@WIN_PREFIX@pcreposix.dll
 	$(INSTALL) .libs/@WIN_PREFIX@libpcreposix.dll.a $(DESTDIR)$(LIBDIR)/@WIN_PREFIX@libpcreposix.dll.a
 	$(INSTALL) .libs/@WIN_PREFIX@libpcre.dll.a $(DESTDIR)$(LIBDIR)/@WIN_PREFIX@libpcre.dll.a
+@HAVE_CPP@	 $(INSTALL) .libs/@WIN_PREFIX@pcrecpp.dll $(DESTDIR)$(BINDIR)/@WIN_PREFIX@pcrecpp.dll
+@HAVE_CPP@	 $(INSTALL) .libs/@WIN_PREFIX@libpcrecpp.dll.a $(DESTDIR)$(LIBDIR)/@WIN_PREFIX@libpcrecpp.dll.a
 	-strip -g $(DESTDIR)$(BINDIR)/@WIN_PREFIX@pcre.dll
 	-strip -g $(DESTDIR)$(BINDIR)/@WIN_PREFIX@pcreposix.dll
+@HAVE_CPP@	 -strip -g $(DESTDIR)$(BINDIR)/@WIN_PREFIX@pcrecpp.dll
 	-strip $(DESTDIR)$(BINDIR)/pcregrep@EXEEXT@
 	-strip $(DESTDIR)$(BINDIR)/pcretest@EXEEXT@
 
-# An auxiliary program makes the default character table source
+# An auxiliary program makes the default character table source. This is put
+# in the current directory, NOT the $top_srcdir directory.
 
-$(top_srcdir)/chartables.c:   dftables
-		./dftables >$(top_srcdir)/chartables.c
+pcre_chartables.c:   dftables@BUILD_EXEEXT@
+		./dftables@BUILD_EXEEXT@ pcre_chartables.c
 
-dftables.@BUILD_OBJEXT@:     $(top_srcdir)/dftables.c $(top_srcdir)/maketables.c \
-		$(top_srcdir)/internal.h pcre.h config.h Makefile
+dftables.@BUILD_OBJEXT@:     $(top_srcdir)/dftables.c \
+		$(top_srcdir)/pcre_maketables.c $(top_srcdir)/pcre_internal.h \
+		pcre.h config.h Makefile
 		$(CC_FOR_BUILD) -c $(CFLAGS_FOR_BUILD) -I. $(top_srcdir)/dftables.c
 
-dftables:       dftables.@BUILD_OBJEXT@
-		$(LINK_FOR_BUILD) -o dftables dftables.@OBJEXT@
+dftables@BUILD_EXEEXT@:      dftables.@BUILD_OBJEXT@
+		$(LINK_FOR_BUILD) -o dftables@BUILD_EXEEXT@ dftables.@OBJEXT@
 
 install:        all @ON_WINDOWS@ wininstall
 @NOT_ON_WINDOWS@	       $(mkinstalldirs) $(DESTDIR)$(LIBDIR)
@@ -219,16 +436,23 @@ install:        all @ON_WINDOWS@ wininst
 @NOT_ON_WINDOWS@	       $(LIBTOOL) --mode=install $(INSTALL) libpcre.la $(DESTDIR)$(LIBDIR)/libpcre.la
 @NOT_ON_WINDOWS@	       echo "$(LIBTOOL) --mode=install $(INSTALL) libpcreposix.la $(DESTDIR)$(LIBDIR)/libpcreposix.la"
 @NOT_ON_WINDOWS@	       $(LIBTOOL) --mode=install $(INSTALL) libpcreposix.la $(DESTDIR)$(LIBDIR)/libpcreposix.la
+@NOT_ON_WINDOWS@@HAVE_CPP@		echo "$(LIBTOOL) --mode=install $(INSTALL) libpcrecpp.la $(DESTDIR)$(LIBDIR)/libpcrecpp.la"
+@NOT_ON_WINDOWS@@HAVE_CPP@		$(LIBTOOL) --mode=install $(INSTALL) libpcrecpp.la $(DESTDIR)$(LIBDIR)/libpcrecpp.la
 @NOT_ON_WINDOWS@	       $(LIBTOOL) --finish $(DESTDIR)$(LIBDIR)
 		$(mkinstalldirs) $(DESTDIR)$(INCDIR)
 		$(INSTALL_DATA) pcre.h $(DESTDIR)$(INCDIR)/pcre.h
 		$(INSTALL_DATA) $(top_srcdir)/pcreposix.h $(DESTDIR)$(INCDIR)/pcreposix.h
+@HAVE_CPP@		 $(INSTALL_DATA) pcrecpp.h $(DESTDIR)$(INCDIR)/pcrecpp.h
+@HAVE_CPP@		 $(INSTALL_DATA) pcre_stringpiece.h $(DESTDIR)$(INCDIR)/pcre_stringpiece.h
+@HAVE_CPP@		 $(INSTALL_DATA) $(top_srcdir)/pcre_scanner.h $(DESTDIR)$(INCDIR)/pcre_scanner.h
 		$(mkinstalldirs) $(DESTDIR)$(MANDIR)/man3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcre.3 $(DESTDIR)$(MANDIR)/man3/pcre.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcreapi.3 $(DESTDIR)$(MANDIR)/man3/pcreapi.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcrebuild.3 $(DESTDIR)$(MANDIR)/man3/pcrebuild.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcrecallout.3 $(DESTDIR)$(MANDIR)/man3/pcrecallout.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcrecompat.3 $(DESTDIR)$(MANDIR)/man3/pcrecompat.3
+@HAVE_CPP@		 $(INSTALL_DATA) $(top_srcdir)/doc/pcrecpp.3 $(DESTDIR)$(MANDIR)/man3/pcrecpp.3
+		$(INSTALL_DATA) $(top_srcdir)/doc/pcrematching.3 $(DESTDIR)$(MANDIR)/man3/pcrematching.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcrepattern.3 $(DESTDIR)$(MANDIR)/man3/pcrepattern.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcreperform.3 $(DESTDIR)$(MANDIR)/man3/pcreperform.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcreposix.3 $(DESTDIR)$(MANDIR)/man3/pcreposix.3
@@ -237,6 +461,7 @@ install:        all @ON_WINDOWS@ wininst
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_config.3 $(DESTDIR)$(MANDIR)/man3/pcre_config.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_copy_named_substring.3 $(DESTDIR)$(MANDIR)/man3/pcre_copy_named_substring.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_copy_substring.3 $(DESTDIR)$(MANDIR)/man3/pcre_copy_substring.3
+		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_dfa_exec.3 $(DESTDIR)$(MANDIR)/man3/pcre_dfa_exec.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_exec.3 $(DESTDIR)$(MANDIR)/man3/pcre_exec.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_free_substring.3 $(DESTDIR)$(MANDIR)/man3/pcre_free_substring.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_free_substring_list.3 $(DESTDIR)$(MANDIR)/man3/pcre_free_substring_list.3
@@ -247,6 +472,7 @@ install:        all @ON_WINDOWS@ wininst
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_get_substring_list.3 $(DESTDIR)$(MANDIR)/man3/pcre_get_substring_list.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_info.3 $(DESTDIR)$(MANDIR)/man3/pcre_info.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_maketables.3 $(DESTDIR)$(MANDIR)/man3/pcre_maketables.3
+		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_refcount.3 $(DESTDIR)$(MANDIR)/man3/pcre_refcount.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_study.3 $(DESTDIR)$(MANDIR)/man3/pcre_study.3
 		$(INSTALL_DATA) $(top_srcdir)/doc/pcre_version.3 $(DESTDIR)$(MANDIR)/man3/pcre_version.3
 		$(mkinstalldirs) $(DESTDIR)$(MANDIR)/man1
@@ -256,17 +482,68 @@ install:        all @ON_WINDOWS@ wininst
 		$(LIBTOOL) --mode=install $(INSTALL) pcregrep@EXEEXT@ $(DESTDIR)$(BINDIR)/pcregrep@EXEEXT@
 		$(LIBTOOL) --mode=install $(INSTALL) pcretest@EXEEXT@ $(DESTDIR)$(BINDIR)/pcretest@EXEEXT@
 		$(INSTALL) pcre-config $(DESTDIR)$(BINDIR)/pcre-config
+		$(mkinstalldirs) $(DESTDIR)$(LIBDIR)/pkgconfig
+		$(INSTALL_DATA) libpcre.pc $(DESTDIR)$(LIBDIR)/pkgconfig/libpcre.pc
+
+# The uninstall target removes all the files that were installed.
 
-# We deliberately omit dftables and chartables.c from 'make clean'; once made
-# chartables.c shouldn't change, and if people have edited the tables by hand,
-# you don't want to throw them away.
+uninstall:;     -rm -rf \
+		$(DESTDIR)$(LIBDIR)/libpcre.* \
+		$(DESTDIR)$(LIBDIR)/libpcreposix.* \
+		$(DESTDIR)$(LIBDIR)/libpcrecpp.* \
+		$(DESTDIR)$(INCDIR)/pcre.h \
+		$(DESTDIR)$(INCDIR)/pcreposix.h \
+		$(DESTDIR)$(INCDIR)/pcrecpp.h \
+		$(DESTDIR)$(INCDIR)/pcre_scanner.h \
+		$(DESTDIR)$(INCDIR)/pcre_stringpiece.h \
+		$(DESTDIR)$(MANDIR)/man3/pcre.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcreapi.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcrebuild.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcrecallout.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcrecompat.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcrecpp.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcrematching.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcrepattern.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcreperform.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcreposix.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcresample.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_compile.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_config.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_copy_named_substring.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_copy_substring.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_dfa_exec.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_exec.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_free_substring.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_free_substring_list.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_fullinfo.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_get_named_substring.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_get_stringnumber.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_get_substring.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_get_substring_list.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_info.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_maketables.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_refcount.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_study.3 \
+		$(DESTDIR)$(MANDIR)/man3/pcre_version.3 \
+		$(DESTDIR)$(MANDIR)/man1/pcregrep.1 \
+		$(DESTDIR)$(MANDIR)/man1/pcretest.1 \
+		$(DESTDIR)$(BINDIR)/pcregrep@EXEEXT@ \
+		$(DESTDIR)$(BINDIR)/pcretest@EXEEXT@ \
+		$(DESTDIR)$(BINDIR)/pcre-config \
+		$(DESTDIR)$(LIBDIR)/pkgconfig/libpcre.pc
+
+# We deliberately omit dftables and pcre_chartables.c from 'make clean'; once
+# made pcre_chartables.c shouldn't change, and if people have edited the tables
+# by hand, you don't want to throw them away.
 
-clean:;         -rm -rf *.@OBJEXT@ *.lo *.a *.la .libs pcretest@EXEEXT@ pcregrep@EXEEXT@ testtry
+clean:;         -rm -rf *.@OBJEXT@ *.lo *.a *.la .libs pcretest@EXEEXT@ pcre_stringpiece_unittest@EXEEXT@ pcrecpp_unittest@EXEEXT@ pcre_scanner_unittest@EXEEXT@ pcregrep@EXEEXT@ testtry
 
 # But "make distclean" should get back to a virgin distribution
 
 distclean:      clean
-		-rm -f chartables.c libtool pcre-config pcre.h \
+		-rm -f pcre_chartables.c libtool pcre-config libpcre.pc \
+		pcre.h pcre_stringpiece.h pcrecpp.h \
+		dftables@EXEEXT@ RunGrepTest RunTest \
 		Makefile config.h config.status config.log config.cache
 
 check:          runtest
@@ -277,6 +554,15 @@ check:          runtest
 test:           runtest
 
 runtest:        all @ON_WINDOWS@ @WIN_PREFIX@pcre.dll
-		./RunTest
+		@./RunTest
+		@./RunGrepTest
+@HAVE_CPP@		 @echo ""
+@HAVE_CPP@		 @echo "Testing C++ wrapper"
+@HAVE_CPP@		 @echo ""; echo "Test 1++: stringpiece"
+@HAVE_CPP@		 @./pcre_stringpiece_unittest@EXEEXT@
+@HAVE_CPP@		 @echo ""; echo "Test 2++: RE class"
+@HAVE_CPP@		 @./pcrecpp_unittest@EXEEXT@
+@HAVE_CPP@		 @echo ""; echo "Test 3++: Scanner class"
+@HAVE_CPP@		 @./pcre_scanner_unittest@EXEEXT@
 
 # End
diff -Nurp tin-1.6.2/pcre/NEWS tin-1.8.0/pcre/NEWS
--- tin-1.6.2/pcre/NEWS	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/NEWS	2005-06-28 10:31:25.000000000 +0200
@@ -1,6 +1,116 @@
 News about PCRE releases
 ------------------------
 
+Release 6.0 07-Jun-05
+---------------------
+
+The release number has been increased to 6.0 because of the addition of several
+major new pieces of functionality.
+
+A new function, pcre_dfa_exec(), which implements pattern matching using a DFA
+algorithm, has been added. This has a number of advantages for certain cases,
+though it does run more slowly, and lacks the ability to capture substrings. On
+the other hand, it does find all matches, not just the first, and it works
+better for partial matching. The pcrematching man page discusses the
+differences.
+
+The pcretest program has been enhanced so that it can make use of the new
+pcre_dfa_exec() matching function and the extra features it provides.
+
+The distribution now includes a C++ wrapper library. This is built
+automatically if a C++ compiler is found. The pcrecpp man page discusses this
+interface.
+
+The code itself has been re-organized into many more files, one for each
+function, so it no longer requires everything to be linked in when static
+linkage is used. As a consequence, some internal functions have had to have
+their names exposed. These functions all have names starting with _pcre_. They
+are undocumented, and are not intended for use by outside callers.
+
+The pcregrep program has been enhanced with new functionality such as
+multiline-matching and options for output more matching context. See the
+ChangeLog for a complete list of changes to the library and the utility
+programs.
+
+
+Release 5.0 13-Sep-04
+---------------------
+
+The licence under which PCRE is released has been changed to the more
+conventional "BSD" licence.
+
+In the code, some bugs have been fixed, and there are also some major changes
+in this release (which is why I've increased the number to 5.0). Some changes
+are internal rearrangements, and some provide a number of new facilities. The
+new features are:
+
+1. There's an "automatic callout" feature that inserts callouts before every
+   item in the regex, and there's a new callout field that gives the position
+   in the pattern - useful for debugging and tracing.
+
+2. The extra_data structure can now be used to pass in a set of character
+   tables at exec time. This is useful if compiled regex are saved and re-used
+   at a later time when the tables may not be at the same address. If the
+   default internal tables are used, the pointer saved with the compiled
+   pattern is now set to NULL, which means that you don't need to do anything
+   special unless you are using custom tables.
+
+3. It is possible, with some restrictions on the content of the regex, to
+   request "partial" matching. A special return code is given if all of the
+   subject string matched part of the regex. This could be useful for testing
+   an input field as it is being typed.
+
+4. There is now some optional support for Unicode character properties, which
+   means that the patterns items such as \p{Lu} and \X can now be used. Only
+   the general category properties are supported. If PCRE is compiled with this
+   support, an additional 90K data structure is include, which increases the
+   size of the library dramatically.
+
+5. There is support for saving compiled patterns and re-using them later.
+
+6. There is support for running regular expressions that were compiled on a
+   different host with the opposite endianness.
+
+7. The pcretest program has been extended to accommodate the new features.
+
+The main internal rearrangement is that sequences of literal characters are no
+longer handled as strings. Instead, each character is handled on its own. This
+makes some UTF-8 handling easier, and makes the support of partial matching
+possible. Compiled patterns containing long literal strings will be larger as a
+result of this change; I hope that performance will not be much affected.
+
+
+Release 4.5 01-Dec-03
+---------------------
+
+Again mainly a bug-fix and tidying release, with only a couple of new features:
+
+1. It's possible now to compile PCRE so that it does not use recursive
+function calls when matching. Instead it gets memory from the heap. This slows
+things down, but may be necessary on systems with limited stacks.
+
+2. UTF-8 string checking has been tightened to reject overlong sequences and to
+check that a starting offset points to the start of a character. Failure of the
+latter returns a new error code: PCRE_ERROR_BADUTF8_OFFSET.
+
+3. PCRE can now be compiled for systems that use EBCDIC code.
+
+
+Release 4.4 21-Aug-03
+---------------------
+
+This is mainly a bug-fix and tidying release. The only new feature is that PCRE
+checks UTF-8 strings for validity by default. There is an option to suppress
+this, just in case anybody wants that teeny extra bit of performance.
+
+
+Releases 4.1 - 4.3
+------------------
+
+Sorry, I forgot about updating the NEWS file for these releases. Please take a
+look at ChangeLog.
+
+
 Release 4.0 17-Feb-03
 ---------------------
 
diff -Nurp tin-1.6.2/pcre/NON-UNIX-USE tin-1.8.0/pcre/NON-UNIX-USE
--- tin-1.6.2/pcre/NON-UNIX-USE	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/NON-UNIX-USE	2005-09-12 16:32:30.000000000 +0200
@@ -1,12 +1,25 @@
 Compiling PCRE on non-Unix systems
 ----------------------------------
 
-See below for comments on Cygwin or MinGW usage.
+See below for comments on Cygwin or MinGW and OpenVMS usage. I (Philip Hazel)
+have no knowledge of Windows or VMS sytems and how their libraries work. The
+items in the PCRE Makefile that relate to anything other than Unix-like systems
+have been contributed by PCRE users. There are some other comments and files in
+the Contrib directory on the ftp site that you may find useful. See
 
-If you want to compile PCRE for a non-Unix system, note that it consists
-entirely of code written in Standard C, and so should compile successfully
-on any machine with a Standard C compiler and library, using normal compiling
-commands to do the following:
+  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib
+
+If you want to compile PCRE for a non-Unix system (or perhaps, more strictly,
+for a system that does not support "configure" and "make" files), note that
+PCRE consists entirely of code written in Standard C, and so should compile
+successfully on any system that has a Standard C compiler and library.
+
+
+GENERIC INSTRUCTIONS FOR THE C LIBRARY
+
+The following are generic comments about building PCRE. The interspersed
+indented commands are suggestions from Mark Tetrode as to which commands you
+might use on a Windows system to build a static library.
 
 (1) Copy or rename the file config.in as config.h, and change the macros that
 define HAVE_STRERROR and HAVE_MEMMOVE to define them as 1 rather than 0.
@@ -16,30 +29,116 @@ particular, if you want to force a speci
 the NEWLINE macro. The default is to use '\n', thereby using whatever value
 your compiler gives to '\n'.
 
+  rem Mark Tetrode's commands
+  copy config.in config.h
+  rem Use write, because notepad cannot handle UNIX files. Change values.
+  write config.h
+
 (2) Copy or rename the file pcre.in as pcre.h, and change the macro definitions
 for PCRE_MAJOR, PCRE_MINOR, and PCRE_DATE near its start to the values set in
 configure.in.
 
-(3) Compile dftables.c as a stand-alone program, and then run it with
-the standard output sent to chartables.c. This generates a set of standard
-character tables.
+  rem Mark Tetrode's commands
+  copy pcre.in pcre.h
+  rem Read values from configure.in
+  write configure.in
+  rem Change values
+  write pcre.h
 
-(4) Compile maketables.c, get.c, study.c and pcre.c and link them all
-together into an object library in whichever form your system keeps such
-libraries. This is the pcre library (chartables.c is included by means of an
-#include directive).
+(3) Compile dftables.c as a stand-alone program, and then run it with
+the single argument "pcre_chartables.c". This generates a set of standard
+character tables and writes them to that file.
 
-(5) Similarly, compile pcreposix.c and link it as the pcreposix library.
+  rem Mark Tetrode's commands
+  rem Compile & run
+  cl -DSUPPORT_UTF8 -DSUPPORT_UCP dftables.c
+  dftables.exe chartables.c
+
+(4) Compile the following source files:
+
+  pcre_chartables.c
+  pcre_compile.c
+  pcre_config.c
+  pcre_dfa_exec.c
+  pcre_exec.c
+  pcre_fullinfo.c
+  pcre_get.c
+  pcre_globals.c
+  pcre_info.c
+  pcre_maketables.c
+  pcre_ord2utf8.c
+  pcre_printint.c
+  pcre_refcount.c
+  pcre_study.c
+  pcre_tables.c
+  pcre_try_flipped.c
+  pcre_ucp_findchar.c
+  pcre_valid_utf8.c
+  pcre_version.c
+  pcre_xclass.c
+
+and link them all together into an object library in whichever form your system
+keeps such libraries. This is the pcre C library. If your system has static and
+shared libraries, you may have to do this once for each type.
+
+  rem These comments are out-of-date, referring to a previous release which
+  rem had fewer source files. Replace with the file names from above.
+  rem Mark Tetrode's commands, for a static library
+  rem Compile & lib
+  cl -DSUPPORT_UTF8 -DSUPPORT_UCP -DPOSIX_MALLOC_THRESHOLD=10 /c maketables.c get.c study.c pcre.c
+  lib /OUT:pcre.lib maketables.obj get.obj study.obj pcre.obj
+
+(5) Similarly, compile pcreposix.c and link it (on its own) as the pcreposix
+library.
+
+  rem Mark Tetrode's commands, for a static library
+  rem Compile & lib
+  cl -DSUPPORT_UTF8 -DSUPPORT_UCP -DPOSIX_MALLOC_THRESHOLD=10 /c pcreposix.c
+  lib /OUT:pcreposix.lib pcreposix.obj
 
 (6) Compile the test program pcretest.c. This needs the functions in the
 pcre and pcreposix libraries when linking.
 
+  rem Mark Tetrode's commands
+  rem compile & link
+  cl /F0x400000 pcretest.c pcre.lib pcreposix.lib
+
 (7) Run pcretest on the testinput files in the testdata directory, and check
 that the output matches the corresponding testoutput files. You must use the
 -i option when checking testinput2. Note that the supplied files are in Unix
 format, with just LF characters as line terminators. You may need to edit them
 to change this if your system uses a different convention.
 
+  rem Mark Tetrode's commands
+  pcretest testdata\testinput1 testdata\myoutput1
+  windiff testdata\testoutput1 testdata\myoutput1
+  pcretest -i testdata\testinput2 testdata\myoutput2
+  windiff testdata\testoutput2 testdata\myoutput2
+  pcretest testdata\testinput3 testdata\myoutput3
+  windiff testdata\testoutput3 testdata\myoutput3
+  pcretest testdata\testinput4 testdata\myoutput4
+  windiff testdata\testoutput4 testdata\myoutput4
+  pcretest testdata\testinput5 testdata\myoutput5
+  windiff testdata\testoutput5 testdata\myoutput5
+  pcretest testdata\testinput6 testdata\myoutput6
+  windiff testdata\testoutput6 testdata\myoutput6
+
+Note that there are now three more tests (7, 8, 9) that did not exist when Mark
+wrote those comments. The test the new pcre_dfa_exec() function.
+
+
+THE C++ WRAPPER FUNCTIONS
+
+The PCRE distribution now contains some C++ wrapper functions and tests,
+contributed by Google Inc. On a system that can use "configure" and "make",
+the functions are automatically built into a library called pcrecpp. It should
+be straightforward to compile the .cc files manually on other systems. The
+files called xxx_unittest.cc are test programs for each of the corresponding
+xxx.cc files.
+
+
+FURTHER REMARKS
+
 If you have a system without "configure" but where you can use a Makefile, edit
 Makefile.in to create Makefile, substituting suitable values for the variables
 at the head of the file.
@@ -79,7 +178,7 @@ These are some further comments about Wi
 were contributed before Fred Cox's changes were made, so it is possible that
 they may no longer be relevant.
 
-The documentation for Win32 builds is a bit shy.  Under MSVC6 I
+"The documentation for Win32 builds is a bit shy.  Under MSVC6 I
 followed their instructions to the letter, but there were still
 some things missing.
 
@@ -89,7 +188,7 @@ some things missing.
 
 (2) Missing some #ifdefs relating to the function pointers
     pcre_malloc and pcre_free.  See my solution below.  (The stubs
-    may not be mandatory but they made me feel better.)
+    may not be mandatory but they made me feel better.)"
 
 =========================
 #ifdef _WIN32
@@ -110,4 +209,69 @@ void  (*pcre_free)(void *) = free;
 #endif
 =========================
 
+
+BUILDING PCRE ON OPENVMS
+
+Dan Mooney sent the following comments about building PCRE on OpenVMS. They
+relate to an older version of PCRE that used fewer source files, so the exact
+commands will need changing. See the current list of source files above.
+
+"It was quite easy to compile and link the library. I don't have a formal
+make file but the attached file [reproduced below] contains the OpenVMS DCL
+commands I used to build the library. I had to add #define
+POSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere.
+
+The library was built on:
+O/S: HP OpenVMS v7.3-1
+Compiler: Compaq C v6.5-001-48BCD
+Linker: vA13-01
+
+The test results did not match 100% due to the issues you mention in your
+documentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I
+modified some of the character tables temporarily and was able to get the
+results to match. Tests using the fr locale did not match since I don't have
+that locale loaded. The study size was always reported to be 3 less than the
+value in the standard test output files."
+
+=========================
+$! This DCL procedure builds PCRE on OpenVMS
+$!
+$! I followed the instructions in the non-unix-use file in the distribution.
+$!
+$ COMPILE == "CC/LIST/NOMEMBER_ALIGNMENT/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES
+$ COMPILE DFTABLES.C
+$ LINK/EXE=DFTABLES.EXE DFTABLES.OBJ
+$ RUN DFTABLES.EXE/OUTPUT=CHARTABLES.C
+$ COMPILE MAKETABLES.C
+$ COMPILE GET.C
+$ COMPILE STUDY.C
+$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol
+$! did not seem to be defined anywhere.
+$! I edited pcre.h and added #DEFINE SUPPORT_UTF8 to enable UTF8 support.
+$ COMPILE PCRE.C
+$ LIB/CREATE PCRE MAKETABLES.OBJ, GET.OBJ, STUDY.OBJ, PCRE.OBJ
+$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol
+$! did not seem to be defined anywhere.
+$ COMPILE PCREPOSIX.C
+$ LIB/CREATE PCREPOSIX PCREPOSIX.OBJ
+$ COMPILE PCRETEST.C
+$ LINK/EXE=PCRETEST.EXE PCRETEST.OBJ, PCRE/LIB, PCREPOSIX/LIB
+$! C programs that want access to command line arguments must be
+$! defined as a symbol
+$ PCRETEST :== "$ SYS$ROADSUSERS:[DMOONEY.REGEXP]PCRETEST.EXE"
+$! Arguments must be enclosed in quotes.
+$ PCRETEST "-C"
+$! Test results:
+$!
+$!   The test results did not match 100%. The functions isprint(), iscntrl(),
+$!   isgraph() and ispunct() on OpenVMS must not produce the same results
+$!   as the system that built the test output files provided with the
+$!   distribution.
+$!
+$!   The study size did not match and was always 3 less on OpenVMS.
+$!
+$!   Locale could not be set to fr
+$!
+=========================
+
 ****
diff -Nurp tin-1.6.2/pcre/README tin-1.8.0/pcre/README
--- tin-1.6.2/pcre/README	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/README	2005-08-19 11:34:07.000000000 +0200
@@ -7,14 +7,49 @@ The latest release of PCRE is always ava
 
 Please read the NEWS file if you are upgrading from a previous release.
 
-PCRE has its own native API, but a set of "wrapper" functions that are based on
-the POSIX API are also supplied in the library libpcreposix. Note that this
-just provides a POSIX calling interface to PCRE: the regular expressions
-themselves still follow Perl syntax and semantics. The header file
-for the POSIX-style functions is called pcreposix.h. The official POSIX name is
-regex.h, but I didn't want to risk possible problems with existing files of
-that name by distributing it that way. To use it with an existing program that
-uses the POSIX API, it will have to be renamed or pointed at by a link.
+
+The PCRE APIs
+-------------
+
+PCRE is written in C, and it has its own API. The distribution now includes a
+set of C++ wrapper functions, courtesy of Google Inc. (see the pcrecpp man page
+for details).
+
+Also included are a set of C wrapper functions that are based on the POSIX
+API. These end up in the library called libpcreposix. Note that this just
+provides a POSIX calling interface to PCRE: the regular expressions themselves
+still follow Perl syntax and semantics. The header file for the POSIX-style
+functions is called pcreposix.h. The official POSIX name is regex.h, but I
+didn't want to risk possible problems with existing files of that name by
+distributing it that way. To use it with an existing program that uses the
+POSIX API, it will have to be renamed or pointed at by a link.
+
+If you are using the POSIX interface to PCRE and there is already a POSIX regex
+library installed on your system, you must take care when linking programs to
+ensure that they link with PCRE's libpcreposix library. Otherwise they may pick
+up the "real" POSIX functions of the same name.
+
+
+Documentation for PCRE
+----------------------
+
+If you install PCRE in the normal way, you will end up with an installed set of
+man pages whose names all start with "pcre". The one that is called "pcre"
+lists all the others. In addition to these man pages, the PCRE documentation is
+supplied in two other forms; however, as there is no standard place to install
+them, they are left in the doc directory of the unpacked source distribution.
+These forms are:
+
+  1. Files called doc/pcre.txt, doc/pcregrep.txt, and doc/pcretest.txt. The
+     first of these is a concatenation of the text forms of all the section 3
+     man pages except those that summarize individual functions. The other two
+     are the text forms of the section 1 man pages for the pcregrep and
+     pcretest commands. Text forms are provided for ease of scanning with text
+     editors or similar tools.
+
+  2. A subdirectory called doc/html contains all the documentation in HTML
+     form, hyperlinked in various ways, and rooted in a file called
+     doc/index.html.
 
 
 Contributions by users of PCRE
@@ -41,7 +76,7 @@ INSTALL.
 
 Most commonly, people build PCRE within its own distribution directory, and in
 this case, on many systems, just running "./configure" is sufficient, but the
-usual methods of changing standard defaults are available. For example,
+usual methods of changing standard defaults are available. For example:
 
 CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local
 
@@ -59,11 +94,23 @@ cd /build/pcre/pcre-xxx
 There are some optional features that can be included or omitted from the PCRE
 library. You can read more about them in the pcrebuild man page.
 
+. If you want to suppress the building of the C++ wrapper library, you can add
+  --disable-cpp to the "configure" command. Otherwise, when "configure" is run,
+  will try to find a C++ compiler and C++ header files, and if it succeeds, it
+  will try to build the C++ wrapper.
+
 . If you want to make use of the support for UTF-8 character strings in PCRE,
   you must add --enable-utf8 to the "configure" command. Without it, the code
   for handling UTF-8 is not included in the library. (Even when included, it
   still has to be enabled by an option at run time.)
 
+. If, in addition to support for UTF-8 character strings, you want to include
+  support for the \P, \p, and \X sequences that recognize Unicode character
+  properties, you must add --enable-unicode-properties to the "configure"
+  command. This adds about 90K to the size of the library (in the form of a
+  property table); only the basic two-letter properties such as Lu are
+  supported.
+
 . You can build PCRE to recognized CR or NL as the newline character, instead
   of whatever your compiler uses for "\n", by adding --newline-is-cr or
   --newline-is-nl to the "configure" command, respectively. Only do this if you
@@ -78,7 +125,7 @@ library. You can read more about them in
 
   on the "configure" command.
 
-. PCRE has a counter which can be set to limit the amount of resources it uses.
+. PCRE has a counter that can be set to limit the amount of resources it uses.
   If the limit is exceeded during a match, the match fails. The default is ten
   million. You can change the default by setting, for example,
 
@@ -96,51 +143,91 @@ library. You can read more about them in
   is a representation of the compiled pattern, and this changes with the link
   size.
 
-The "configure" script builds five files:
-
+. You can build PCRE so that its internal match() function that is called from
+  pcre_exec() does not call itself recursively. Instead, it uses blocks of data
+  from the heap via special functions pcre_stack_malloc() and pcre_stack_free()
+  to save data that would otherwise be saved on the stack. To build PCRE like
+  this, use
+
+  --disable-stack-for-recursion
+
+  on the "configure" command. PCRE runs more slowly in this mode, but it may be
+  necessary in environments with limited stack sizes. This applies only to the
+  pcre_exec() function; it does not apply to pcre_dfa_exec(), which does not
+  use deeply nested recursion.
+
+The "configure" script builds eight files for the basic C library:
+
+. pcre.h is the header file for C programs that call PCRE
+. Makefile is the makefile that builds the library
+. config.h contains build-time configuration options for the library
+. pcre-config is a script that shows the settings of "configure" options
+. libpcre.pc is data for the pkg-config command
 . libtool is a script that builds shared and/or static libraries
-. Makefile is built by copying Makefile.in and making substitutions.
-. config.h is built by copying config.in and making substitutions.
-. pcre-config is built by copying pcre-config.in and making substitutions.
-. RunTest is a script for running tests
+. RunTest is a script for running tests on the library
+. RunGrepTest is a script for running tests on the pcregrep command
+
+In addition, if a C++ compiler is found, the following are also built:
 
-Once "configure" has run, you can run "make". It builds two libraries called
+. pcrecpp.h is the header file for programs that call PCRE via the C++ wrapper
+. pcre_stringpiece.h is the header for the C++ "stringpiece" functions
+
+The "configure" script also creates config.status, which is an executable
+script that can be run to recreate the configuration, and config.log, which
+contains compiler output from tests that "configure" runs.
+
+Once "configure" has run, you can run "make". It builds two libraries, called
 libpcre and libpcreposix, a test program called pcretest, and the pcregrep
-command. You can use "make install" to copy these, the public header files
-pcre.h and pcreposix.h, and the man pages to appropriate live directories on
-your system, in the normal way.
+command. If a C++ compiler was found on your system, it also builds the C++
+wrapper library, which is called libpcrecpp, and some test programs called
+pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest.
+
+The command "make test" runs all the appropriate tests. Details of the PCRE
+tests are given in a separate section of this document, below.
+
+You can use "make install" to copy the libraries, the public header files
+pcre.h, pcreposix.h, pcrecpp.h, and pcre_stringpiece.h (the last two only if
+the C++ wrapper was built), and the man pages to appropriate live directories
+on your system, in the normal way.
+
+If you want to remove PCRE from your system, you can run "make uninstall".
+This removes all the files that "make install" installed. However, it does not
+remove any directories, because these are often shared with other programs.
+
+
+Retrieving configuration information on Unix-like systems
+---------------------------------------------------------
 
 Running "make install" also installs the command pcre-config, which can be used
 to recall information about the PCRE configuration and installation. For
-example,
+example:
 
   pcre-config --version
 
 prints the version number, and
 
- pcre-config --libs
+  pcre-config --libs
 
 outputs information about where the library is installed. This command can be
 included in makefiles for programs that use PCRE, saving the programmer from
 having to remember too many details.
 
+The pkg-config command is another system for saving and retrieving information
+about installed libraries. Instead of separate commands for each library, a
+single command is used. For example:
 
-Cross-compiling PCRE on a Unix-like system
-------------------------------------------
+  pkg-config --cflags pcre
 
-PCRE needs to compile and run an auxiliary program as part of the building
-process. Obviously, if the real compilation is for some other system, it can't
-use the same CC and CFLAGS values when it is doing this. For cross compilation,
-therefore, you must set CC_FOR_BUILD to the local host's compiler, and you can
-set flags in CFLAGS_FOR_BUILD if you need to.
+The data is held in *.pc files that are installed in a directory called
+pkgconfig.
 
 
 Shared libraries on Unix-like systems
 -------------------------------------
 
-The default distribution builds PCRE as two shared libraries and two static
-libraries, as long as the operating system supports shared libraries. Shared
-library support relies on the "libtool" script which is built as part of the
+The default distribution builds PCRE as shared libraries and static libraries,
+as long as the operating system supports shared libraries. Shared library
+support relies on the "libtool" script which is built as part of the
 "configure" process.
 
 The libtool script is used to compile and link both shared and static
@@ -153,7 +240,7 @@ installed themselves. However, the versi
 use the uninstalled libraries.
 
 To build PCRE using static libraries only you must use --disable-shared when
-configuring it. For example
+configuring it. For example:
 
 ./configure --prefix=/usr/gnu --disable-shared
 
@@ -169,17 +256,21 @@ order to cross-compile PCRE for some oth
 process, the dftables.c source file is compiled *and run* on the local host, in
 order to generate the default character tables (the chartables.c file). It
 therefore needs to be compiled with the local compiler, not the cross compiler.
-You can do this by specifying HOST_CC (and if necessary HOST_CFLAGS) when
-calling the "configure" command. If they are not specified, they default to the
-values of CC and CFLAGS.
+You can do this by specifying CC_FOR_BUILD (and if necessary CFLAGS_FOR_BUILD;
+there are also CXX_FOR_BUILD and CXXFLAGS_FOR_BUILD for the C++ wrapper)
+when calling the "configure" command. If they are not specified, they default
+to the values of CC and CFLAGS.
 
 
 Building on non-Unix systems
 ----------------------------
 
-For a non-Unix system, read the comments in the file NON-UNIX-USE. PCRE has
-been compiled on Windows systems and on Macintoshes, but I don't know the
-details because I don't use those systems. It should be straightforward to
+For a non-Unix system, read the comments in the file NON-UNIX-USE, though if
+the system supports the use of "configure" and "make" you may be able to build
+PCRE in the same way as for Unix systems.
+
+PCRE has been compiled on Windows systems and on Macintoshes, but I don't know
+the details because I don't use those systems. It should be straightforward to
 build PCRE on any system that has a Standard C compiler, because it uses only
 Standard C functions.
 
@@ -188,15 +279,21 @@ Testing PCRE
 ------------
 
 To test PCRE on a Unix system, run the RunTest script that is created by the
-configuring process. (This can also be run by "make runtest", "make check", or
-"make test".) For other systems, see the instruction in NON-UNIX-USE.
-
-The script runs the pcretest test program (which is documented in its own man
-page) on each of the testinput files (in the testdata directory) in turn,
-and compares the output with the contents of the corresponding testoutput file.
-A file called testtry is used to hold the output from pcretest. To run pcretest
-on just one of the test files, give its number as an argument to RunTest, for
-example:
+configuring process. There is also a script called RunGrepTest that tests the
+options of the pcregrep command. If the C++ wrapper library is build, three
+test programs called pcrecpp_unittest, pcre_scanner_unittest, and
+pcre_stringpiece_unittest are provided.
+
+Both the scripts and all the program tests are run if you obey "make runtest",
+"make check", or "make test". For other systems, see the instructions in
+NON-UNIX-USE.
+
+The RunTest script runs the pcretest test program (which is documented in its
+own man page) on each of the testinput files (in the testdata directory) in
+turn, and compares the output with the contents of the corresponding testoutput
+file. A file called testtry is used to hold the main output from pcretest
+(testsavedregex is also used as a working file). To run pcretest on just one of
+the test files, give its number as an argument to RunTest, for example:
 
   RunTest 2
 
@@ -222,13 +319,13 @@ bug in PCRE.
 
 The third set of tests checks pcre_maketables(), the facility for building a
 set of character tables for a specific locale and using them instead of the
-default tables. The tests make use of the "fr" (French) locale. Before running
-the test, the script checks for the presence of this locale by running the
-"locale" command. If that command fails, or if it doesn't include "fr" in the
-list of available locales, the third test cannot be run, and a comment is
-output to say why. If running this test produces instances of the error
+default tables. The tests make use of the "fr_FR" (French) locale. Before
+running the test, the script checks for the presence of this locale by running
+the "locale" command. If that command fails, or if it doesn't include "fr_FR"
+in the list of available locales, the third test cannot be run, and a comment
+is output to say why. If running this test produces instances of the error
 
-  ** Failed to set locale "fr"
+  ** Failed to set locale "fr_FR"
 
 in the comparison output, it means that locale is not available on your system,
 despite being listed by "locale". This does not mean that PCRE is broken.
@@ -239,19 +336,28 @@ running "configure". This file can be al
 provided you are running Perl 5.8 or higher. (For Perl 5.6, a small patch,
 commented in the script, can be be used.)
 
-The fifth and final file tests error handling with UTF-8 encoding, and internal
-UTF-8 features of PCRE that are not relevant to Perl.
+The fifth test checks error handling with UTF-8 encoding, and internal UTF-8
+features of PCRE that are not relevant to Perl.
+
+The sixth and test checks the support for Unicode character properties. It it
+not run automatically unless PCRE is built with Unicode property support. To to
+this you must set --enable-unicode-properties when running "configure".
+
+The seventh, eighth, and ninth tests check the pcre_dfa_exec() alternative
+matching function, in non-UTF-8 mode, UTF-8 mode, and UTF-8 mode with Unicode
+property support, respectively. The eighth and ninth tests are not run
+automatically unless PCRE is build with the relevant support.
 
 
 Character tables
 ----------------
 
-PCRE uses four tables for manipulating and identifying characters. The final
-argument of the pcre_compile() function is a pointer to a block of memory
-containing the concatenated tables. A call to pcre_maketables() can be used to
-generate a set of tables in the current locale. If the final argument for
-pcre_compile() is passed as NULL, a set of default tables that is built into
-the binary is used.
+PCRE uses four tables for manipulating and identifying characters whose values
+are less than 256. The final argument of the pcre_compile() function is a
+pointer to a block of memory containing the concatenated tables. A call to
+pcre_maketables() can be used to generate a set of tables in the current
+locale. If the final argument for pcre_compile() is passed as NULL, a set of
+default tables that is built into the binary is used.
 
 The source file called chartables.c contains the default set of tables. This is
 not supplied in the distribution, but is built by the program dftables
@@ -291,18 +397,47 @@ The distribution should contain the foll
     headers:
 
   dftables.c            auxiliary program for building chartables.c
-  get.c                 )
-  maketables.c          )
-  study.c               ) source of
-  pcre.c                )   the functions
+
   pcreposix.c           )
-  printint.c            )
+  pcre_compile.c        )
+  pcre_config.c         )
+  pcre_dfa_exec.c       )
+  pcre_exec.c           )
+  pcre_fullinfo.c       )
+  pcre_get.c            ) sources for the functions in the library,
+  pcre_globals.c        )   and some internal functions that they use
+  pcre_info.c           )
+  pcre_maketables.c     )
+  pcre_ord2utf8.c       )
+  pcre_printint.c       )
+  pcre_study.c          )
+  pcre_tables.c         )
+  pcre_try_flipped.c    )
+  pcre_ucp_findchar.c   )
+  pcre_valid_utf8.c     )
+  pcre_version.c        )
+  pcre_xclass.c         )
+
+  ucp_findchar.c        )
+  ucp.h                 ) source for the code that is used for
+  ucpinternal.h         )   Unicode property handling
+  ucptable.c            )
+  ucptypetable.c        )
+
   pcre.in               "source" for the header for the external API; pcre.h
                           is built from this by "configure"
   pcreposix.h           header for the external POSIX wrapper API
-  internal.h            header for internal use
+  pcre_internal.h       header for internal use
   config.in             template for config.h, which is built by configure
 
+  pcrecpp.h.in          "source" for the header file for the C++ wrapper
+  pcrecpp.cc            )
+  pcre_scanner.cc       ) source for the C++ wrapper library
+
+  pcre_stringpiece.h.in "source" for pcre_stringpiece.h, the header for the
+                          C++ stringpiece functions
+  pcre_stringpiece.cc   source for the C++ stringpiece functions
+
 (B) Auxiliary files:
 
   AUTHORS               information about the author of PCRE
@@ -315,6 +450,7 @@ The distribution should contain the foll
   NON-UNIX-USE          notes on building PCRE on non-Unix systems
   README                this file
   RunTest.in            template for a Unix shell script for running tests
+  RunGrepTest.in        template for a Unix shell script for pcregrep tests
   config.guess          ) files used by libtool,
   config.sub            )   used only when building a shared library
   configure             a configuring shell script (built by autoconf)
@@ -327,31 +463,32 @@ The distribution should contain the foll
   doc/pcretest.txt      plain text documentation of test program
   doc/perltest.txt      plain text documentation of Perl test program
   install-sh            a shell script for installing files
+  libpcre.pc.in         "source" for libpcre.pc for pkg-config
   ltmain.sh             file used to build a libtool script
+  mkinstalldirs         script for making install directories
   pcretest.c            comprehensive test program
   pcredemo.c            simple demonstration of coding calls to PCRE
   perltest              Perl test program
   pcregrep.c            source of a grep utility that uses PCRE
   pcre-config.in        source of script which retains PCRE information
-  testdata/testinput1   test data, compatible with Perl
-  testdata/testinput2   test data for error messages and non-Perl things
-  testdata/testinput3   test data for locale-specific tests
-  testdata/testinput4   test data for UTF-8 tests compatible with Perl
-  testdata/testinput5   test data for other UTF-8 tests
-  testdata/testoutput1  test results corresponding to testinput1
-  testdata/testoutput2  test results corresponding to testinput2
-  testdata/testoutput3  test results corresponding to testinput3
-  testdata/testoutput4  test results corresponding to testinput4
-  testdata/testoutput5  test results corresponding to testinput5
+  pcrecpp_unittest.c           )
+  pcre_scanner_unittest.c      ) test programs for the C++ wrapper
+  pcre_stringpiece_unittest.c  )
+  testdata/testinput*   test data for main library tests
+  testdata/testoutput*  expected test results
+  testdata/grep*        input and output for pcregrep tests
 
 (C) Auxiliary files for Win32 DLL
 
-  dll.mk
+  libpcre.def
+  libpcreposix.def
   pcre.def
 
 (D) Auxiliary file for VPASCAL
 
   makevp.bat
 
-Philip Hazel <ph10@cam.ac.uk>
-February 2003
+Philip Hazel
+Email local part: ph10
+Email domain: cam.ac.uk
+August 2005
diff -Nurp tin-1.6.2/pcre/RunTest.in tin-1.8.0/pcre/RunTest.in
--- tin-1.6.2/pcre/RunTest.in	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/RunTest.in	2005-08-01 21:51:35.000000000 +0200
@@ -6,7 +6,10 @@
 # Run PCRE tests
 
 cf=diff
-testdata=@top_srcdir@/testdata
+if [ ! -d testdata ] ; then
+  ln -s @top_srcdir@/testdata testdata
+fi
+testdata=./testdata
 
 # Select which tests to run; if no selection, run all
 
@@ -15,6 +18,10 @@ do2=no
 do3=no
 do4=no
 do5=no
+do6=no
+do7=no
+do8=no
+do9=no
 
 while [ $# -gt 0 ] ; do
   case $1 in
@@ -22,113 +29,226 @@ while [ $# -gt 0 ] ; do
     2) do2=yes;;
     3) do3=yes;;
     4) do4=yes;;
-    5) do5=yes;; 
+    5) do5=yes;;
+    6) do6=yes;;
+    7) do7=yes;;
+    8) do8=yes;;
+    9) do9=yes;;
     *) echo "Unknown test number $1"; exit 1;;
   esac
   shift
 done
 
+if [ "@LINK_SIZE@" != "" -a "@LINK_SIZE@" != "-DLINK_SIZE=2" ] ; then
+  if [ $do2 = yes ] ; then
+    echo "Can't run test 2 with an internal link size other than 2"
+    exit 1
+  fi
+  if [ $do5 = yes ] ; then
+    echo "Can't run test 5 with an internal link size other than 2"
+    exit 1
+  fi
+  if [ $do6 = yes ] ; then
+    echo "Can't run test 6 with an internal link size other than 2"
+    exit 1
+  fi
+fi
+
 if [ "@UTF8@" = "" ] ; then
   if [ $do4 = yes ] ; then
-    echo "Can't run test 4 because UFT8 support is not configured"
+    echo "Can't run test 4 because UTF-8 support is not configured"
     exit 1
-  fi   
+  fi
   if [ $do5 = yes ] ; then
-    echo "Can't run test 5 because UFT8 support is not configured"
+    echo "Can't run test 5 because UTF-8 support is not configured"
+    exit 1
+  fi
+  if [ $do6 = yes ] ; then
+    echo "Can't run test 6 because UTF-8 support is not configured"
+    exit 1
+  fi
+  if [ $do8 = yes ] ; then
+    echo "Can't run test 8 because UTF-8 support is not configured"
+    exit 1
+  fi
+  if [ $do9 = yes ] ; then
+    echo "Can't run test 9 because UTF-8 support is not configured"
+    exit 1
+  fi
+fi
+
+if [ "@UCP@" = "" ] ; then
+  if [ $do6 = yes ] ; then
+    echo "Can't run test 6 because Unicode property support is not configured"
+    exit 1
+  fi
+  if [ $do9 = yes ] ; then
+    echo "Can't run test 9 because Unicode property support is not configured"
     exit 1
-  fi   
-fi    
+  fi
+fi
 
-if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a\
-     $do5 = no ] ; then
+if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a \
+     $do5 = no -a $do6 = no -a $do7 = no -a $do8 = no -a \
+     $do9 = no ] ; then
   do1=yes
   do2=yes
   do3=yes
   if [ "@UTF8@" != "" ] ; then do4=yes; fi
   if [ "@UTF8@" != "" ] ; then do5=yes; fi
+  if [ "@UTF8@" != "" -a "@UCP@" != "" ] ; then do6=yes; fi
+  do7=yes 
+  if [ "@UTF8@" != "" ] ; then do8=yes; fi
+  if [ "@UTF8@" != "" -a "@UCP@" != "" ] ; then do9=yes; fi
 fi
 
+# Show which release
+
+./pcretest /dev/null
+
 # Primary test, Perl-compatible
 
 if [ $do1 = yes ] ; then
-  echo "Testing main functionality (Perl compatible)"
+  echo "Test 1: main functionality (Perl compatible)"
   ./pcretest $testdata/testinput1 testtry
   if [ $? = 0 ] ; then
     $cf testtry $testdata/testoutput1
     if [ $? != 0 ] ; then exit 1; fi
-    echo " " 
   else exit 1
   fi
+  echo "OK"
+  echo " "
 fi
 
 # PCRE tests that are not Perl-compatible - API & error tests, mostly
 
 if [ $do2 = yes ] ; then
-  echo "Testing API and error handling (not Perl compatible)"
-  ./pcretest -i $testdata/testinput2 testtry
-  if [ $? = 0 ] ; then
-    $cf testtry $testdata/testoutput2
-    if [ $? != 0 ] ; then exit 1; fi
-  else exit 1
+  if [ "@LINK_SIZE@" = "" -o "@LINK_SIZE@" = "-DLINK_SIZE=2" ] ; then
+    echo "Test 2: API and error handling (not Perl compatible)"
+    ./pcretest -i $testdata/testinput2 testtry
+    if [ $? = 0 ] ; then
+      $cf testtry $testdata/testoutput2
+      if [ $? != 0 ] ; then exit 1; fi
+    else exit 1
+    fi
+    echo "OK"
+    echo " "
+  else
+    echo Test 2 skipped for link size other than 2 \(@LINK_SIZE@\)
+    echo " " 
   fi
 fi
 
-if [ $do1 = yes -a $do2 = yes ] ; then
-  echo " " 
-  echo "The two main tests ran OK"
-  echo " " 
-fi
-
-# Locale-specific tests, provided the "fr" locale is available
+# Locale-specific tests, provided the "fr_FR" locale is available
 
 if [ $do3 = yes ] ; then
-  locale -a | grep '^fr$' >/dev/null
+  locale -a | grep '^fr_FR$' >/dev/null
   if [ $? -eq 0 ] ; then
-    echo "Testing locale-specific features (using 'fr' locale)"
+    echo "Test 3: locale-specific features (using 'fr_FR' locale)"
     ./pcretest $testdata/testinput3 testtry
     if [ $? = 0 ] ; then
       $cf testtry $testdata/testoutput3
-      if [ $? != 0 ] ; then 
+      if [ $? != 0 ] ; then
         echo " "
         echo "Locale test did not run entirely successfully."
         echo "This usually means that there is a problem with the locale"
-        echo "settings rather than a bug in PCRE."    
+        echo "settings rather than a bug in PCRE."
       else
-      echo "Locale test ran OK" 
-      fi 
-      echo " " 
+      echo "OK"
+      fi
+      echo " "
     else exit 1
     fi
   else
-    echo "Cannot test locale-specific features - 'fr' locale not found,"
+    echo "Cannot test locale-specific features - 'fr_FR' locale not found,"
     echo "or the \"locale\" command is not available to check for it."
-    echo " " 
+    echo " "
   fi
 fi
 
 # Additional tests for UTF8 support
 
 if [ $do4 = yes ] ; then
-  echo "Testing UTF-8 support (Perl compatible)"
-  ./pcretest $testdata/testinput4 testtry 
+  echo "Test 4: UTF-8 support (Perl compatible)"
+  ./pcretest $testdata/testinput4 testtry
   if [ $? = 0 ] ; then
     $cf testtry $testdata/testoutput4
     if [ $? != 0 ] ; then exit 1; fi
   else exit 1
   fi
-  echo "UTF8 test ran OK"
+  echo "OK"
   echo " "
 fi
 
 if [ $do5 = yes ] ; then
-  echo "Testing API and internals for UTF-8 support (not Perl compatible)"
-  ./pcretest $testdata/testinput5 testtry 
+  if [ "@LINK_SIZE@" = "" -o "@LINK_SIZE@" = "-DLINK_SIZE=2" ] ; then
+    echo "Test 5: API and internals for UTF-8 support (not Perl compatible)"
+    ./pcretest $testdata/testinput5 testtry
+    if [ $? = 0 ] ; then
+      $cf testtry $testdata/testoutput5
+      if [ $? != 0 ] ; then exit 1; fi
+    else exit 1
+    fi
+    echo "OK"
+    echo " "
+  else
+    echo Test 5 skipped for link size other than 2 \(@LINK_SIZE@\)
+    echo " " 
+  fi
+fi
+
+if [ $do6 = yes ] ; then
+  if [ "@LINK_SIZE@" = "" -o "@LINK_SIZE@" = "-DLINK_SIZE=2" ] ; then
+    echo "Test 6: Unicode property support"
+    ./pcretest $testdata/testinput6 testtry
+    if [ $? = 0 ] ; then
+      $cf testtry $testdata/testoutput6
+      if [ $? != 0 ] ; then exit 1; fi
+    else exit 1
+    fi
+    echo "OK"
+    echo " "
+  else
+    echo Test 6 skipped for link size other than 2 \(@LINK_SIZE@\)
+    echo " " 
+  fi
+fi
+
+# Tests for DFA matching support
+
+if [ $do7 = yes ] ; then
+  echo "Test 7: DFA matching"
+  ./pcretest -dfa $testdata/testinput7 testtry
+  if [ $? = 0 ] ; then
+    $cf testtry $testdata/testoutput7
+    if [ $? != 0 ] ; then exit 1; fi
+  else exit 1
+  fi
+  echo "OK"
+  echo " "
+fi
+
+if [ $do8 = yes ] ; then
+  echo "Test 8: DFA matching with UTF-8"
+  ./pcretest -dfa $testdata/testinput8 testtry
+  if [ $? = 0 ] ; then
+    $cf testtry $testdata/testoutput8
+    if [ $? != 0 ] ; then exit 1; fi
+  else exit 1
+  fi
+  echo "OK"
+  echo " "
+fi
+
+if [ $do9 = yes ] ; then
+  echo "Test 9: DFA matching with Unicode properties"
+  ./pcretest -dfa $testdata/testinput9 testtry
   if [ $? = 0 ] ; then
-    $cf testtry $testdata/testoutput5
+    $cf testtry $testdata/testoutput9
     if [ $? != 0 ] ; then exit 1; fi
   else exit 1
   fi
-  echo "UTF8 internals test ran OK"
+  echo "OK"
   echo " "
 fi
 
diff -Nurp tin-1.6.2/pcre/config.h tin-1.8.0/pcre/config.h
--- tin-1.6.2/pcre/config.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/config.h	2005-09-12 16:49:42.000000000 +0200
@@ -1,2 +1,5 @@
 /* simply include tin's autoconf'd header file */
 #include "autoconf.h"
+#define EBCDIC 0
+#define POSIX_MALLOC_THRESHOLD 10
+#define PCRE_EXPORT
diff -Nurp tin-1.6.2/pcre/configure.in tin-1.8.0/pcre/configure.in
--- tin-1.6.2/pcre/configure.in	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/configure.in	2005-09-12 16:34:25.000000000 +0200
@@ -1,5 +1,11 @@
 dnl Process this file with autoconf to produce a configure script.
 
+dnl This configure.in file has been hacked around quite a lot as a result of
+dnl patches that various people have sent to me (PH). Sometimes the information
+dnl I get is contradictory. I've tried to put in comments that explain things,
+dnl but in some cases the information is second-hand and I have no way of
+dnl verifying it. I am not an autoconf or libtool expert!
+
 dnl This is required at the start; the name is the name of a file
 dnl it should be seeing, to verify it is in the same directory.
 
@@ -9,10 +15,10 @@ dnl A safety precaution
 
 AC_PREREQ(2.57)
 
-dnl Arrange to build config.h from config.in. Note that pcre.h is
+dnl Arrange to build config.h from config.h.in. Note that pcre.h is
 dnl built differently, as it is just a "substitution" file.
 dnl Manual says this macro should come right after AC_INIT.
-AC_CONFIG_HEADER(config.h:config.in)
+AC_CONFIG_HEADER(config.h)
 
 dnl Provide the current PCRE version information. Do not use numbers
 dnl with leading zeros for the minor version, as they end up in a C
@@ -20,9 +26,9 @@ dnl macro, and may be treated as octal c
 dnl digits for minor numbers less than 10. There are unlikely to be
 dnl that many releases anyway.
 
-PCRE_MAJOR=4
-PCRE_MINOR=2
-PCRE_DATE=14-Apr-2003
+PCRE_MAJOR=6
+PCRE_MINOR=4
+PCRE_DATE=05-Sep-2005
 PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR}
 
 dnl Default values for miscellaneous macros
@@ -34,10 +40,34 @@ dnl are built by default on Unix systems
 
 PCRE_LIB_VERSION=0:1:0
 PCRE_POSIXLIB_VERSION=0:0:0
+PCRE_CPPLIB_VERSION=0:0:0
+
+dnl Handle --disable-cpp
+
+AC_ARG_ENABLE(cpp,
+[  --disable-cpp           disable C++ support],
+want_cpp="$enableval", want_cpp=yes)
 
 dnl Checks for programs.
 
 AC_PROG_CC
+
+dnl Test for C++ for the C++ wrapper libpcrecpp. It seems, however, that
+dnl AC_PROC_CXX will set $CXX to "g++" when no C++ compiler is installed, even
+dnl though that is completely bogus. (This may happen only on certain systems
+dnl with certain versions of autoconf, of course.) An attempt to include this
+dnl test inside a check for want_cpp was criticized by a libtool expert, who
+dnl tells me that it isn't allowed.
+
+AC_PROG_CXX
+
+dnl The icc compiler has the same options as gcc, so let the rest of the
+dnl configure script think it has gcc when setting up dnl options etc.
+dnl This is a nasty hack which no longer seems necessary with the update
+dnl to the latest libtool files, so I have commented it out.
+dnl
+dnl if test "$CC" = "icc" ; then GCC=yes ; fi
+
 AC_PROG_INSTALL
 AC_LIBTOOL_WIN32_DLL
 AC_PROG_LIBTOOL
@@ -47,12 +77,15 @@ dnl while building. It needs to be diffe
 dnl There is a macro called AC_PROG_CC_FOR_BUILD in the GNU archive for
 dnl figuring this out automatically. Unfortunately, it does not work with the
 dnl latest versions of autoconf. So for the moment, we just default to the
-dnl same values as the "main" compiler. People who are corss-compiling will
+dnl same values as the "main" compiler. People who are cross-compiling will
 dnl just have to adjust the Makefile by hand or set these values when they
 dnl run "configure".
 
 CC_FOR_BUILD=${CC_FOR_BUILD:-'$(CC)'}
+CXX_FOR_BUILD=${CXX_FOR_BUILD:-'$(CXX)'}
 CFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD:-'$(CFLAGS)'}
+CPPFLAGS_FOR_BUILD=${CFLAGS_FOR_BUILD:-'$(CPPFLAGS)'}
+CXXFLAGS_FOR_BUILD=${CXXFLAGS_FOR_BUILD:-'$(CXXFLAGS)'}
 BUILD_EXEEXT=${BUILD_EXEEXT:-'$(EXEEXT)'}
 BUILD_OBJEXT=${BUILD_OBJEXT:-'$(OBJEXT)'}
 
@@ -61,14 +94,54 @@ dnl Checks for header files.
 AC_HEADER_STDC
 AC_CHECK_HEADERS(limits.h)
 
+dnl The files below are C++ header files. One person told me (PH) that
+dnl AC_LANG_CPLUSPLUS unsets CXX if it was explicitly set to something which
+dnl doesn't work. However, this doesn't always seem to be the case.
+
+if test "x$want_cpp" = "xyes" -a -n "$CXX"
+then
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+
+dnl We could be more clever here, given we're doing AC_SUBST with this
+dnl (eg set a var to be the name of the include file we want).  But we're not
+dnl so it's easy to change back to 'regular' autoconf vars if we needed to.
+AC_CHECK_HEADERS(string, [pcre_have_cpp_headers="1"],
+                         [pcre_have_cpp_headers="0"])
+AC_CHECK_HEADERS(bits/type_traits.h, [pcre_have_bits_type_traits="1"],
+                                     [pcre_have_bits_type_traits="0"])
+AC_CHECK_HEADERS(type_traits.h, [pcre_have_type_traits="1"],
+                                [pcre_have_type_traits="0"])
+dnl Using AC_SUBST eliminates the need to include config.h in a public .h file
+AC_SUBST(pcre_have_bits_type_traits)
+AC_SUBST(pcre_have_type_traits)
+AC_LANG_RESTORE
+fi
+
+dnl From the above, we now have enough info to know if C++ is fully installed
+if test "x$want_cpp" = "xyes" -a -n "$CXX" -a "$pcre_have_cpp_headers" = 1; then
+  MAYBE_CPP_TARGETS='$(CPP_TARGETS)'
+  HAVE_CPP=
+else
+  MAYBE_CPP_TARGETS=
+  HAVE_CPP="#"
+fi
+AC_SUBST(MAYBE_CPP_TARGETS)
+AC_SUBST(HAVE_CPP)
+
 dnl Checks for typedefs, structures, and compiler characteristics.
 
 AC_C_CONST
 AC_TYPE_SIZE_T
 
+AC_CHECK_TYPES([long long], [pcre_have_long_long="1"], [pcre_have_long_long="0"])
+AC_CHECK_TYPES([unsigned long long], [pcre_have_ulong_long="1"], [pcre_have_ulong_long="0"])
+AC_SUBST(pcre_have_long_long)
+AC_SUBST(pcre_have_ulong_long)
+
 dnl Checks for library functions.
 
-AC_CHECK_FUNCS(bcopy memmove strerror)
+AC_CHECK_FUNCS(bcopy memmove strerror strtoq strtoll)
 
 dnl Handle --enable-utf8
 
@@ -79,6 +152,15 @@ if test "$enableval" = "yes"; then
 fi
 )
 
+dnl Handle --enable-unicode-properties
+
+AC_ARG_ENABLE(unicode-properties,
+[  --enable-unicode-properties  enable Unicode properties support],
+if test "$enableval" = "yes"; then
+  UCP=-DSUPPORT_UCP
+fi
+)
+
 dnl Handle --enable-newline-is-cr
 
 AC_ARG_ENABLE(newline-is-cr,
@@ -97,6 +179,24 @@ if test "$enableval" = "yes"; then
 fi
 )
 
+dnl Handle --enable-ebcdic
+
+AC_ARG_ENABLE(ebcdic,
+[  --enable-ebcdic         assume EBCDIC coding rather than ASCII],
+if test "$enableval" == "yes"; then
+  EBCDIC=-DEBCDIC=1
+fi
+)
+
+dnl Handle --disable-stack-for-recursion
+
+AC_ARG_ENABLE(stack-for-recursion,
+[  --disable-stack-for-recursion  disable use of stack recursion when matching],
+if test "$enableval" = "no"; then
+  NO_RECURSE=-DNO_RECURSE
+fi
+)
+
 dnl There doesn't seem to be a straightforward way of having parameters
 dnl that set values, other than fudging the --with thing. So that's what
 dnl I've done.
@@ -122,31 +222,40 @@ AC_ARG_WITH(match-limit,
   MATCH_LIMIT=-DMATCH_LIMIT=$withval
 )
 
-dnl Now arrange to build libtool
+dnl Unicode character property support implies UTF-8 support
 
-AC_PROG_LIBTOOL
+if test "$UCP" != "" ; then
+  UTF8=-DSUPPORT_UTF8
+fi
 
 dnl "Export" these variables
 
 AC_SUBST(BUILD_EXEEXT)
 AC_SUBST(BUILD_OBJEXT)
 AC_SUBST(CC_FOR_BUILD)
+AC_SUBST(CXX_FOR_BUILD)
 AC_SUBST(CFLAGS_FOR_BUILD)
+AC_SUBST(CXXFLAGS_FOR_BUILD)
+AC_SUBST(EBCDIC)
 AC_SUBST(HAVE_MEMMOVE)
 AC_SUBST(HAVE_STRERROR)
 AC_SUBST(LINK_SIZE)
 AC_SUBST(MATCH_LIMIT)
 AC_SUBST(NEWLINE)
+AC_SUBST(NO_RECURSE)
 AC_SUBST(PCRE_MAJOR)
 AC_SUBST(PCRE_MINOR)
 AC_SUBST(PCRE_DATE)
 AC_SUBST(PCRE_VERSION)
 AC_SUBST(PCRE_LIB_VERSION)
 AC_SUBST(PCRE_POSIXLIB_VERSION)
+AC_SUBST(PCRE_CPPLIB_VERSION)
 AC_SUBST(POSIX_MALLOC_THRESHOLD)
+AC_SUBST(UCP)
 AC_SUBST(UTF8)
 
-dnl Stuff to make Win32 work better
+dnl Stuff to make MinGW work better. Special treatment is no longer
+dnl needed for Cygwin.
 
 case $host_os in
 mingw* )
@@ -157,14 +266,6 @@ mingw* )
     NOT_ON_WINDOWS="#"
     WIN_PREFIX=
     ;;
-cygwin* )
-    ON_WINDOWS=
-    POSIX_OBJ=pcreposix.o
-    POSIX_LOBJ=pcreposix.lo
-    POSIX_LIB=
-    WIN_PREFIX=cyg
-    NOT_ON_WINDOWS="#"
-    ;;
 * )
     ON_WINDOWS="#"
     NOT_ON_WINDOWS=
@@ -182,8 +283,8 @@ AC_SUBST(POSIX_LOBJ)
 AC_SUBST(POSIX_LIB)
 
 if test "x$enable_shared" = "xno" ; then
-    AC_DEFINE(PCRE_STATIC,1)
+    AC_DEFINE([PCRE_STATIC],[1],[to link statically])
 fi
 
 dnl This must be last; it determines what files are written as well as config.h
-AC_OUTPUT(Makefile pcre.h:pcre.in pcre-config:pcre-config.in RunTest:RunTest.in,[chmod a+x RunTest pcre-config])
+AC_OUTPUT(Makefile pcre.h:pcre.h.in pcre-config:pcre-config.in libpcre.pc:libpcre.pc.in pcrecpp.h:pcrecpp.h.in pcre_stringpiece.h:pcre_stringpiece.h.in RunGrepTest:RunGrepTest.in RunTest:RunTest.in,[chmod a+x RunTest RunGrepTest pcre-config])
diff -Nurp tin-1.6.2/pcre/dftables.c tin-1.8.0/pcre/dftables.c
--- tin-1.6.2/pcre/dftables.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/dftables.c	2005-08-01 21:52:36.000000000 +0200
@@ -2,117 +2,135 @@
 *      Perl-Compatible Regular Expressions       *
 *************************************************/
 
-/*
-PCRE is a library of functions to support regular expressions whose syntax
+/* PCRE is a library of functions to support regular expressions whose syntax
 and semantics are as close as possible to those of the Perl 5 language.
 
-Written by: Philip Hazel <ph10@cam.ac.uk>
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
 
-           Copyright (c) 1997-2001 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
 -----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
 
-See the file Tech.Notes for some information on the internals.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
 */
 
 
-/* This is a support program to generate the file chartables.c, containing
-character tables of various kinds. They are built according to the default C
-locale and used as the default tables by PCRE. Now that pcre_maketables is
-a function visible to the outside world, we make use of its code from here in
-order to be consistent. */
+/* This is a freestanding support program to generate a file containing default
+character tables for PCRE. The tables are built according to the default C
+locale. Now that pcre_maketables is a function visible to the outside world, we
+make use of its code from here in order to be consistent. */
 
 #include <ctype.h>
 #include <stdio.h>
 #include <string.h>
 
-#include "internal.h"
+#include "pcre_internal.h"
 
-#define DFTABLES          /* maketables.c notices this */
-#include "maketables.c"
+#define DFTABLES          /* pcre_maketables.c notices this */
+#include "pcre_maketables.c"
 
 
-int main(void)
+int main(int argc, char **argv)
 {
 int i;
+FILE *f;
 const unsigned char *tables = pcre_maketables();
+const unsigned char *base_of_tables = tables;
+
+if (argc != 2)
+  {
+  fprintf(stderr, "dftables: one filename argument is required\n");
+  return 1;
+  }
+
+f = fopen(argv[1], "wb");
+if (f == NULL)
+  {
+  fprintf(stderr, "dftables: failed to open %s for writing\n", argv[1]);
+  return 1;
+  }
 
-/* There are two printf() calls here, because gcc in pedantic mode complains
+/* There are two fprintf() calls here, because gcc in pedantic mode complains
 about the very long string otherwise. */
 
-printf(
+fprintf(f,
   "/*************************************************\n"
   "*      Perl-Compatible Regular Expressions       *\n"
   "*************************************************/\n\n"
   "/* This file is automatically written by the dftables auxiliary \n"
   "program. If you edit it by hand, you might like to edit the Makefile to \n"
   "prevent its ever being regenerated.\n\n");
-printf(
-  "This file is #included in the compilation of pcre.c to build the default\n"
-  "character tables which are used when no tables are passed to the compile\n"
-  "function. */\n\n"
-  "static unsigned char pcre_default_tables[] = {\n\n"
+fprintf(f,
+  "This file contains the default tables for characters with codes less than\n"
+  "128 (ASCII characters). These tables are used when no external tables are\n"
+  "passed to PCRE. */\n\n"
+  "const unsigned char _pcre_default_tables[] = {\n\n"
   "/* This table is a lower casing table. */\n\n");
 
-printf("  ");
+fprintf(f, "  ");
 for (i = 0; i < 256; i++)
   {
-  if ((i & 7) == 0 && i != 0) printf("\n  ");
-  printf("%3d", *tables++);
-  if (i != 255) printf(",");
+  if ((i & 7) == 0 && i != 0) fprintf(f, "\n  ");
+  fprintf(f, "%3d", *tables++);
+  if (i != 255) fprintf(f, ",");
   }
-printf(",\n\n");
+fprintf(f, ",\n\n");
 
-printf("/* This table is a case flipping table. */\n\n");
+fprintf(f, "/* This table is a case flipping table. */\n\n");
 
-printf("  ");
+fprintf(f, "  ");
 for (i = 0; i < 256; i++)
   {
-  if ((i & 7) == 0 && i != 0) printf("\n  ");
-  printf("%3d", *tables++);
-  if (i != 255) printf(",");
+  if ((i & 7) == 0 && i != 0) fprintf(f, "\n  ");
+  fprintf(f, "%3d", *tables++);
+  if (i != 255) fprintf(f, ",");
   }
-printf(",\n\n");
+fprintf(f, ",\n\n");
 
-printf(
+fprintf(f,
   "/* This table contains bit maps for various character classes.\n"
   "Each map is 32 bytes long and the bits run from the least\n"
   "significant end of each byte. The classes that have their own\n"
   "maps are: space, xdigit, digit, upper, lower, word, graph\n"
   "print, punct, and cntrl. Other classes are built from combinations. */\n\n");
 
-printf("  ");
+fprintf(f, "  ");
 for (i = 0; i < cbit_length; i++)
   {
   if ((i & 7) == 0 && i != 0)
     {
-    if ((i & 31) == 0) printf("\n");
-    printf("\n  ");
+    if ((i & 31) == 0) fprintf(f, "\n");
+    fprintf(f, "\n  ");
     }
-  printf("0x%02x", *tables++);
-  if (i != cbit_length - 1) printf(",");
+  fprintf(f, "0x%02x", *tables++);
+  if (i != cbit_length - 1) fprintf(f, ",");
   }
-printf(",\n\n");
+fprintf(f, ",\n\n");
 
-printf(
+fprintf(f,
   "/* This table identifies various classes of character by individual bits:\n"
   "  0x%02x   white space character\n"
   "  0x%02x   letter\n"
@@ -123,29 +141,31 @@ printf(
   ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word,
   ctype_meta);
 
-printf("  ");
+fprintf(f, "  ");
 for (i = 0; i < 256; i++)
   {
   if ((i & 7) == 0 && i != 0)
     {
-    printf(" /* ");
-    if (isprint(i-8)) printf(" %c -", i-8);
-      else printf("%3d-", i-8);
-    if (isprint(i-1)) printf(" %c ", i-1);
-      else printf("%3d", i-1);
-    printf(" */\n  ");
+    fprintf(f, " /* ");
+    if (isprint(i-8)) fprintf(f, " %c -", i-8);
+      else fprintf(f, "%3d-", i-8);
+    if (isprint(i-1)) fprintf(f, " %c ", i-1);
+      else fprintf(f, "%3d", i-1);
+    fprintf(f, " */\n  ");
     }
-  printf("0x%02x", *tables++);
-  if (i != 255) printf(",");
+  fprintf(f, "0x%02x", *tables++);
+  if (i != 255) fprintf(f, ",");
   }
 
-printf("};/* ");
-if (isprint(i-8)) printf(" %c -", i-8);
-  else printf("%3d-", i-8);
-if (isprint(i-1)) printf(" %c ", i-1);
-  else printf("%3d", i-1);
-printf(" */\n\n/* End of chartables.c */\n");
+fprintf(f, "};/* ");
+if (isprint(i-8)) fprintf(f, " %c -", i-8);
+  else fprintf(f, "%3d-", i-8);
+if (isprint(i-1)) fprintf(f, " %c ", i-1);
+  else fprintf(f, "%3d", i-1);
+fprintf(f, " */\n\n/* End of chartables.c */\n");
 
+fclose(f);
+free((void *)base_of_tables);
 return 0;
 }
 
diff -Nurp tin-1.6.2/pcre/doc/pcre.3 tin-1.8.0/pcre/doc/pcre.3
--- tin-1.6.2/pcre/doc/pcre.3	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/doc/pcre.3	2005-08-19 11:35:16.000000000 +0200
@@ -1,24 +1,39 @@
 .TH PCRE 3
 .SH NAME
 PCRE - Perl-compatible regular expressions
-.SH DESCRIPTION
+.SH INTRODUCTION
 .rs
 .sp
 The PCRE library is a set of functions that implement regular expression
 pattern matching using the same syntax and semantics as Perl, with just a few
-differences. The current implementation of PCRE (release 4.x) corresponds
-approximately with Perl 5.8, including support for UTF-8 encoded strings.
-However, this support has to be explicitly enabled; it is not the default.
-
-PCRE is written in C and released as a C library. However, a number of people
-have written wrappers and interfaces of various kinds. A C++ class is included
-in these contributions, which can be found in the \fIContrib\fR directory at
-the primary FTP site, which is:
-
+differences. The current implementation of PCRE (release 6.x) corresponds
+approximately with Perl 5.8, including support for UTF-8 encoded strings and
+Unicode general category properties. However, this support has to be explicitly
+enabled; it is not the default.
+.P
+In addition to the Perl-compatible matching function, PCRE also contains an
+alternative matching function that matches the same compiled patterns in a
+different way. In certain circumstances, the alternative function has some
+advantages. For a discussion of the two matching algorithms, see the
+.\" HREF
+\fBpcrematching\fP
+.\"
+page.
+.P
+PCRE is written in C and released as a C library. A number of people have
+written wrappers and interfaces of various kinds. In particular, Google Inc.
+have provided a comprehensive C++ wrapper. This is now included as part of the
+PCRE distribution. The
+.\" HREF
+\fBpcrecpp\fP
+.\"
+page has details of this interface. Other people's contributions can be found
+in the \fIContrib\fR directory at the primary FTP site, which is:
+.sp
 .\" HTML <a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre">
 .\" </a>
 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre
-
+.P
 Details of exactly which Perl regular expression features are and are not
 supported by PCRE are given in separate documents. See the
 .\" HREF
@@ -29,139 +44,189 @@ and
 \fBpcrecompat\fR
 .\"
 pages.
-
+.P
 Some features of PCRE can be included, excluded, or changed when the library is
 built. The
 .\" HREF
 \fBpcre_config()\fR
 .\"
 function makes it possible for a client to discover which features are
-available. Documentation about building PCRE for various operating systems can
-be found in the \fBREADME\fR file in the source distribution.
-
-.SH USER DOCUMENTATION
+available. The features themselves are described in the
+.\" HREF
+\fBpcrebuild\fP
+.\"
+page. Documentation about building PCRE for various operating systems can be
+found in the \fBREADME\fP file in the source distribution.
+.P
+The library contains a number of undocumented internal functions and data
+tables that are used by more than one of the exported external functions, but
+which are not intended for use by external callers. Their names all begin with
+"_pcre_", which hopefully will not provoke any name clashes. In some
+environments, it is possible to control which external symbols are exported
+when a shared library is built, and in these cases the undocumented symbols are
+not exported.
+.
+.
+.SH "USER DOCUMENTATION"
 .rs
 .sp
-The user documentation for PCRE has been split up into a number of different
-sections. In the "man" format, each of these is a separate "man page". In the
-HTML format, each is a separate page, linked from the index page. In the plain
-text format, all the sections are concatenated, for ease of searching. The
-sections are as follows:
-
+The user documentation for PCRE comprises a number of different sections. In
+the "man" format, each of these is a separate "man page". In the HTML format,
+each is a separate page, linked from the index page. In the plain text format,
+all the sections are concatenated, for ease of searching. The sections are as
+follows:
+.sp
   pcre              this document
-  pcreapi           details of PCRE's native API
+  pcreapi           details of PCRE's native C API
   pcrebuild         options for building PCRE
   pcrecallout       details of the callout feature
   pcrecompat        discussion of Perl compatibility
-  pcregrep          description of the \fBpcregrep\fR command
+  pcrecpp           details of the C++ wrapper
+  pcregrep          description of the \fBpcregrep\fP command
+  pcrematching      discussion of the two matching algorithms
+  pcrepartial       details of the partial matching facility
+.\" JOIN
   pcrepattern       syntax and semantics of supported
                       regular expressions
   pcreperform       discussion of performance issues
-  pcreposix         the POSIX-compatible API
+  pcreposix         the POSIX-compatible C API
+  pcreprecompile    details of saving and re-using precompiled patterns
   pcresample        discussion of the sample program
-  pcretest          the \fBpcretest\fR testing command
-
+  pcretest          description of the \fBpcretest\fP testing command
+.sp
 In addition, in the "man" and HTML formats, there is a short page for each
-library function, listing its arguments and results.
-
+C library function, listing its arguments and results.
+.
+.
 .SH LIMITATIONS
 .rs
 .sp
 There are some size limitations in PCRE but it is hoped that they will never in
 practice be relevant.
-
+.P
 The maximum length of a compiled pattern is 65539 (sic) bytes if PCRE is
 compiled with the default internal linkage size of 2. If you want to process
 regular expressions that are truly enormous, you can compile PCRE with an
-internal linkage size of 3 or 4 (see the \fBREADME\fR file in the source
+internal linkage size of 3 or 4 (see the \fBREADME\fP file in the source
 distribution and the
 .\" HREF
-\fBpcrebuild\fR
+\fBpcrebuild\fP
 .\"
-documentation for details). If these cases the limit is substantially larger.
+documentation for details). In these cases the limit is substantially larger.
 However, the speed of execution will be slower.
-
+.P
 All values in repeating quantifiers must be less than 65536.
 The maximum number of capturing subpatterns is 65535.
-
+.P
 There is no limit to the number of non-capturing subpatterns, but the maximum
 depth of nesting of all kinds of parenthesized subpattern, including capturing
 subpatterns, assertions, and other types of subpattern, is 200.
-
+.P
 The maximum length of a subject string is the largest positive number that an
-integer variable can hold. However, PCRE uses recursion to handle subpatterns
-and indefinite repetition. This means that the available stack space may limit
-the size of a subject string that can be processed by certain patterns.
-
+integer variable can hold. However, when using the traditional matching
+function, PCRE uses recursion to handle subpatterns and indefinite repetition.
+This means that the available stack space may limit the size of a subject
+string that can be processed by certain patterns.
+.sp
 .\" HTML <a name="utf8support"></a>
-.SH UTF-8 SUPPORT
+.
+.
+.SH "UTF-8 AND UNICODE PROPERTY SUPPORT"
 .rs
 .sp
-Starting at release 3.3, PCRE has had some support for character strings
-encoded in the UTF-8 format. For release 4.0 this has been greatly extended to
-cover most common requirements.
-
+From release 3.3, PCRE has had some support for character strings encoded in
+the UTF-8 format. For release 4.0 this was greatly extended to cover most
+common requirements, and in release 5.0 additional support for Unicode general
+category properties was added.
+.P
 In order process UTF-8 strings, you must build PCRE to include UTF-8 support in
 the code, and, in addition, you must call
 .\" HREF
-\fBpcre_compile()\fR
+\fBpcre_compile()\fP
 .\"
 with the PCRE_UTF8 option flag. When you do this, both the pattern and any
 subject strings that are matched against it are treated as UTF-8 strings
 instead of just strings of bytes.
-
+.P
 If you compile PCRE with UTF-8 support, but do not use it at run time, the
 library will be a bit bigger, but the additional run time overhead is limited
 to testing the PCRE_UTF8 flag in several places, so should not be very large.
-
+.P
+If PCRE is built with Unicode character property support (which implies UTF-8
+support), the escape sequences \ep{..}, \eP{..}, and \eX are supported.
+The available properties that can be tested are limited to the general
+category properties such as Lu for an upper case letter or Nd for a decimal
+number. A full list is given in the
+.\" HREF
+\fBpcrepattern\fP
+.\"
+documentation. The PCRE library is increased in size by about 90K when Unicode
+property support is included.
+.P
 The following comments apply when PCRE is running in UTF-8 mode:
-
-1. PCRE assumes that the strings it is given contain valid UTF-8 codes. It does
-not diagnose invalid UTF-8 strings. If you pass invalid UTF-8 strings to PCRE,
-the results are undefined.
-
-2. In a pattern, the escape sequence \\x{...}, where the contents of the braces
+.P
+1. When you set the PCRE_UTF8 flag, the strings passed as patterns and subjects
+are checked for validity on entry to the relevant functions. If an invalid
+UTF-8 string is passed, an error return is given. In some situations, you may
+already know that your strings are valid, and therefore want to skip these
+checks in order to improve performance. If you set the PCRE_NO_UTF8_CHECK flag
+at compile time or at run time, PCRE assumes that the pattern or subject it
+is given (respectively) contains only valid UTF-8 codes. In this case, it does
+not diagnose an invalid UTF-8 string. If you pass an invalid UTF-8 string to
+PCRE when PCRE_NO_UTF8_CHECK is set, the results are undefined. Your program
+may crash.
+.P
+2. In a pattern, the escape sequence \ex{...}, where the contents of the braces
 is a string of hexadecimal digits, is interpreted as a UTF-8 character whose
-code number is the given hexadecimal number, for example: \\x{1234}. If a
+code number is the given hexadecimal number, for example: \ex{1234}. If a
 non-hexadecimal digit appears between the braces, the item is not recognized.
 This escape sequence can be used either as a literal, or within a character
 class.
-
-3. The original hexadecimal escape sequence, \\xhh, matches a two-byte UTF-8
+.P
+3. The original hexadecimal escape sequence, \exhh, matches a two-byte UTF-8
 character if the value is greater than 127.
-
+.P
 4. Repeat quantifiers apply to complete UTF-8 characters, not to individual
-bytes, for example: \\x{100}{3}.
-
+bytes, for example: \ex{100}{3}.
+.P
 5. The dot metacharacter matches one UTF-8 character instead of a single byte.
-
-6. The escape sequence \\C can be used to match a single byte in UTF-8 mode,
-but its use can lead to some strange effects.
-
-7. The character escapes \\b, \\B, \\d, \\D, \\s, \\S, \\w, and \\W correctly
+.P
+6. The escape sequence \eC can be used to match a single byte in UTF-8 mode,
+but its use can lead to some strange effects. This facility is not available in
+the alternative matching function, \fBpcre_dfa_exec()\fP.
+.P
+7. The character escapes \eb, \eB, \ed, \eD, \es, \eS, \ew, and \eW correctly
 test characters of any code value, but the characters that PCRE recognizes as
 digits, spaces, or word characters remain the same set as before, all with
-values less than 256.
-
-8. Case-insensitive matching applies only to characters whose values are less
-than 256. PCRE does not support the notion of "case" for higher-valued
-characters.
-
-9. PCRE does not support the use of Unicode tables and properties or the Perl
-escapes \\p, \\P, and \\X.
-
+values less than 256. This remains true even when PCRE includes Unicode
+property support, because to do otherwise would slow down PCRE in many common
+cases. If you really want to test for a wider sense of, say, "digit", you
+must use Unicode property tests such as \ep{Nd}.
+.P
+8. Similarly, characters that match the POSIX named character classes are all
+low-valued characters.
+.P
+9. Case-insensitive matching applies only to characters whose values are less
+than 128, unless PCRE is built with Unicode property support. Even when Unicode
+property support is available, PCRE still uses its own character tables when
+checking the case of low-valued characters, so as not to degrade performance.
+The Unicode property information is used only for characters with higher
+values.
+.
 .SH AUTHOR
 .rs
 .sp
-Philip Hazel <ph10@cam.ac.uk>
+Philip Hazel
 .br
 University Computing Service,
 .br
 Cambridge CB2 3QG, England.
-.br
-Phone: +44 1223 334714
-
+.P
+Putting an actual email address here seems to have been a spam magnet, so I've
+taken it away. If you want to email me, use my initial and surname, separated
+by a dot, at the domain ucs.cam.ac.uk.
+.sp
 .in 0
-Last updated: 04 February 2003
+Last updated: 07 March 2005
 .br
-Copyright (c) 1997-2003 University of Cambridge.
+Copyright (c) 1997-2005 University of Cambridge.
diff -Nurp tin-1.6.2/pcre/doc/pcrepattern.3 tin-1.8.0/pcre/doc/pcrepattern.3
--- tin-1.6.2/pcre/doc/pcrepattern.3	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/doc/pcrepattern.3	2005-06-28 10:31:26.000000000 +0200
@@ -1,49 +1,69 @@
-.TH PCRE 3
+.TH PCREPATTERN 3
 .SH NAME
 PCRE - Perl-compatible regular expressions
-.SH PCRE REGULAR EXPRESSION DETAILS
+.SH "PCRE REGULAR EXPRESSION DETAILS"
 .rs
 .sp
 The syntax and semantics of the regular expressions supported by PCRE are
 described below. Regular expressions are also described in the Perl
-documentation and in a number of other books, some of which have copious
-examples. Jeffrey Friedl's "Mastering Regular Expressions", published by
-O'Reilly, covers them in great detail. The description here is intended as
-reference documentation.
-
-The basic operation of PCRE is on strings of bytes. However, there is also
-support for UTF-8 character strings. To use this support you must build PCRE to
-include UTF-8 support, and then call \fBpcre_compile()\fR with the PCRE_UTF8
-option. How this affects the pattern matching is mentioned in several places
-below. There is also a summary of UTF-8 features in the
+documentation and in a number of books, some of which have copious examples.
+Jeffrey Friedl's "Mastering Regular Expressions", published by O'Reilly, covers
+regular expressions in great detail. This description of PCRE's regular
+expressions is intended as reference material.
+.P
+The original operation of PCRE was on strings of one-byte characters. However,
+there is now also support for UTF-8 character strings. To use this, you must
+build PCRE to include UTF-8 support, and then call \fBpcre_compile()\fP with
+the PCRE_UTF8 option. How this affects pattern matching is mentioned in several
+places below. There is also a summary of UTF-8 features in the
 .\" HTML <a href="pcre.html#utf8support">
 .\" </a>
 section on UTF-8 support
 .\"
 in the main
 .\" HREF
-\fBpcre\fR
+\fBpcre\fP
 .\"
 page.
-
+.P
+The remainder of this document discusses the patterns that are supported by
+PCRE when its main matching function, \fBpcre_exec()\fP, is used.
+From release 6.0, PCRE offers a second matching function,
+\fBpcre_dfa_exec()\fP, which matches using a different algorithm that is not
+Perl-compatible. The advantages and disadvantages of the alternative function,
+and how it differs from the normal function, are discussed in the
+.\" HREF
+\fBpcrematching\fP
+.\"
+page.
+.P
 A regular expression is a pattern that is matched against a subject string from
 left to right. Most characters stand for themselves in a pattern, and match the
 corresponding characters in the subject. As a trivial example, the pattern
-
+.sp
   The quick brown fox
-
-matches a portion of a subject string that is identical to itself. The power of
-regular expressions comes from the ability to include alternatives and
-repetitions in the pattern. These are encoded in the pattern by the use of
-\fImeta-characters\fR, which do not stand for themselves but instead are
+.sp
+matches a portion of a subject string that is identical to itself. When
+caseless matching is specified (the PCRE_CASELESS option), letters are matched
+independently of case. In UTF-8 mode, PCRE always understands the concept of
+case for characters whose values are less than 128, so caseless matching is
+always possible. For characters with higher values, the concept of case is
+supported if PCRE is compiled with Unicode property support, but not otherwise.
+If you want to use caseless matching for characters 128 and above, you must
+ensure that PCRE is compiled with Unicode property support as well as with
+UTF-8 support.
+.P
+The power of regular expressions comes from the ability to include alternatives
+and repetitions in the pattern. These are encoded in the pattern by the use of
+\fImetacharacters\fP, which do not stand for themselves but instead are
 interpreted in some special way.
-
-There are two different sets of meta-characters: those that are recognized
+.P
+There are two different sets of metacharacters: those that are recognized
 anywhere in the pattern except within square brackets, and those that are
-recognized in square brackets. Outside square brackets, the meta-characters are
+recognized in square brackets. Outside square brackets, the metacharacters are
 as follows:
-
-  \\      general escape character with several uses
+.sp
+  \e      general escape character with several uses
   ^      assert start of string (or line, in multiline mode)
   $      assert end of string (or line, in multiline mode)
   .      match any character except newline (by default)
@@ -58,231 +78,376 @@ as follows:
   +      1 or more quantifier
          also "possessive quantifier"
   {      start min/max quantifier
-
+.sp
 Part of a pattern that is in square brackets is called a "character class". In
-a character class the only meta-characters are:
-
-  \\      general escape character
+a character class the only metacharacters are:
+.sp
+  \e      general escape character
   ^      negate the class, but only if the first character
   -      indicates character range
+.\" JOIN
   [      POSIX character class (only if followed by POSIX
            syntax)
   ]      terminates the character class
-
-The following sections describe the use of each of the meta-characters.
-
+.sp
+The following sections describe the use of each of the metacharacters.
+.
 .SH BACKSLASH
 .rs
 .sp
 The backslash character has several uses. Firstly, if it is followed by a
-non-alphameric character, it takes away any special meaning that character may
+non-alphanumeric character, it takes away any special meaning that character may
 have. This use of backslash as an escape character applies both inside and
 outside character classes.
-
-For example, if you want to match a * character, you write \\* in the pattern.
+.P
+For example, if you want to match a * character, you write \e* in the pattern.
 This escaping action applies whether or not the following character would
-otherwise be interpreted as a meta-character, so it is always safe to precede a
-non-alphameric with backslash to specify that it stands for itself. In
-particular, if you want to match a backslash, you write \\\\.
-
+otherwise be interpreted as a metacharacter, so it is always safe to precede a
+non-alphanumeric with backslash to specify that it stands for itself. In
+particular, if you want to match a backslash, you write \e\e.
+.P
 If a pattern is compiled with the PCRE_EXTENDED option, whitespace in the
 pattern (other than in a character class) and characters between a # outside
 a character class and the next newline character are ignored. An escaping
 backslash can be used to include a whitespace or # character as part of the
 pattern.
-
+.P
 If you want to remove the special meaning from a sequence of characters, you
-can do so by putting them between \\Q and \\E. This is different from Perl in
-that $ and @ are handled as literals in \\Q...\\E sequences in PCRE, whereas in
+can do so by putting them between \eQ and \eE. This is different from Perl in
+that $ and @ are handled as literals in \eQ...\eE sequences in PCRE, whereas in
 Perl, $ and @ cause variable interpolation. Note the following examples:
-
+.sp
   Pattern            PCRE matches   Perl matches
-
-  \\Qabc$xyz\\E        abc$xyz        abc followed by the
+.sp
+.\" JOIN
+  \eQabc$xyz\eE        abc$xyz        abc followed by the
                                       contents of $xyz
-  \\Qabc\\$xyz\\E       abc\\$xyz       abc\\$xyz
-  \\Qabc\\E\\$\\Qxyz\\E   abc$xyz        abc$xyz
-
-The \\Q...\\E sequence is recognized both inside and outside character classes.
-
+  \eQabc\e$xyz\eE       abc\e$xyz       abc\e$xyz
+  \eQabc\eE\e$\eQxyz\eE   abc$xyz        abc$xyz
+.sp
+The \eQ...\eE sequence is recognized both inside and outside character classes.
+.
+.
+.\" HTML <a name="digitsafterbackslash"></a>
+.SS "Non-printing characters"
+.rs
+.sp
 A second use of backslash provides a way of encoding non-printing characters
 in patterns in a visible manner. There is no restriction on the appearance of
 non-printing characters, apart from the binary zero that terminates a pattern,
 but when a pattern is being prepared by text editing, it is usually easier to
 use one of the following escape sequences than the binary character it
 represents:
-
-  \\a        alarm, that is, the BEL character (hex 07)
-  \\cx       "control-x", where x is any character
-  \\e        escape (hex 1B)
-  \\f        formfeed (hex 0C)
-  \\n        newline (hex 0A)
-  \\r        carriage return (hex 0D)
-  \\t        tab (hex 09)
-  \\ddd      character with octal code ddd, or backreference
-  \\xhh      character with hex code hh
-  \\x{hhh..} character with hex code hhh... (UTF-8 mode only)
-
-The precise effect of \\cx is as follows: if x is a lower case letter, it
+.sp
+  \ea        alarm, that is, the BEL character (hex 07)
+  \ecx       "control-x", where x is any character
+  \ee        escape (hex 1B)
+  \ef        formfeed (hex 0C)
+  \en        newline (hex 0A)
+  \er        carriage return (hex 0D)
+  \et        tab (hex 09)
+  \eddd      character with octal code ddd, or backreference
+  \exhh      character with hex code hh
+  \ex{hhh..} character with hex code hhh... (UTF-8 mode only)
+.sp
+The precise effect of \ecx is as follows: if x is a lower case letter, it
 is converted to upper case. Then bit 6 of the character (hex 40) is inverted.
-Thus \\cz becomes hex 1A, but \\c{ becomes hex 3B, while \\c; becomes hex
+Thus \ecz becomes hex 1A, but \ec{ becomes hex 3B, while \ec; becomes hex
 7B.
-
-After \\x, from zero to two hexadecimal digits are read (letters can be in
+.P
+After \ex, from zero to two hexadecimal digits are read (letters can be in
 upper or lower case). In UTF-8 mode, any number of hexadecimal digits may
-appear between \\x{ and }, but the value of the character code must be less
+appear between \ex{ and }, but the value of the character code must be less
 than 2**31 (that is, the maximum hexadecimal value is 7FFFFFFF). If characters
-other than hexadecimal digits appear between \\x{ and }, or if there is no
+other than hexadecimal digits appear between \ex{ and }, or if there is no
 terminating }, this form of escape is not recognized. Instead, the initial
-\\x will be interpreted as a basic hexadecimal escape, with no following
-digits, giving a byte whose value is zero.
-
+\ex will be interpreted as a basic hexadecimal escape, with no following
+digits, giving a character whose value is zero.
+.P
 Characters whose value is less than 256 can be defined by either of the two
-syntaxes for \\x when PCRE is in UTF-8 mode. There is no difference in the
-way they are handled. For example, \\xdc is exactly the same as \\x{dc}.
-
-After \\0 up to two further octal digits are read. In both cases, if there
+syntaxes for \ex when PCRE is in UTF-8 mode. There is no difference in the
+way they are handled. For example, \exdc is exactly the same as \ex{dc}.
+.P
+After \e0 up to two further octal digits are read. In both cases, if there
 are fewer than two digits, just those that are present are used. Thus the
-sequence \\0\\x\\07 specifies two binary zeros followed by a BEL character
+sequence \e0\ex\e07 specifies two binary zeros followed by a BEL character
 (code value 7). Make sure you supply two digits after the initial zero if the
-character that follows is itself an octal digit.
-
+pattern character that follows is itself an octal digit.
+.P
 The handling of a backslash followed by a digit other than 0 is complicated.
 Outside a character class, PCRE reads it and any following digits as a decimal
 number. If the number is less than 10, or if there have been at least that many
 previous capturing left parentheses in the expression, the entire sequence is
-taken as a \fIback reference\fR. A description of how this works is given
-later, following the discussion of parenthesized subpatterns.
-
+taken as a \fIback reference\fP. A description of how this works is given
+.\" HTML <a href="#backreferences">
+.\" </a>
+later,
+.\"
+following the discussion of
+.\" HTML <a href="#subpattern">
+.\" </a>
+parenthesized subpatterns.
+.\"
+.P
 Inside a character class, or if the decimal number is greater than 9 and there
 have not been that many capturing subpatterns, PCRE re-reads up to three octal
 digits following the backslash, and generates a single byte from the least
 significant 8 bits of the value. Any subsequent digits stand for themselves.
 For example:
-
-  \\040   is another way of writing a space
-  \\40    is the same, provided there are fewer than 40
+.sp
+  \e040   is another way of writing a space
+.\" JOIN
+  \e40    is the same, provided there are fewer than 40
             previous capturing subpatterns
-  \\7     is always a back reference
-  \\11    might be a back reference, or another way of
+  \e7     is always a back reference
+.\" JOIN
+  \e11    might be a back reference, or another way of
             writing a tab
-  \\011   is always a tab
-  \\0113  is a tab followed by the character "3"
-  \\113   might be a back reference, otherwise the
+  \e011   is always a tab
+  \e0113  is a tab followed by the character "3"
+.\" JOIN
+  \e113   might be a back reference, otherwise the
             character with octal code 113
-  \\377   might be a back reference, otherwise
+.\" JOIN
+  \e377   might be a back reference, otherwise
             the byte consisting entirely of 1 bits
-  \\81    is either a back reference, or a binary zero
+.\" JOIN
+  \e81    is either a back reference, or a binary zero
             followed by the two characters "8" and "1"
-
+.sp
 Note that octal values of 100 or greater must not be introduced by a leading
 zero, because no more than three octal digits are ever read.
-
+.P
 All the sequences that define a single byte value or a single UTF-8 character
 (in UTF-8 mode) can be used both inside and outside character classes. In
-addition, inside a character class, the sequence \\b is interpreted as the
-backspace character (hex 08). Outside a character class it has a different
-meaning (see below).
-
-The third use of backslash is for specifying generic character types:
-
-  \\d     any decimal digit
-  \\D     any character that is not a decimal digit
-  \\s     any whitespace character
-  \\S     any character that is not a whitespace character
-  \\w     any "word" character
-  \\W     any "non-word" character
-
+addition, inside a character class, the sequence \eb is interpreted as the
+backspace character (hex 08), and the sequence \eX is interpreted as the
+character "X". Outside a character class, these sequences have different
+meanings
+.\" HTML <a href="#uniextseq">
+.\" </a>
+(see below).
+.\"
+.
+.
+.SS "Generic character types"
+.rs
+.sp
+The third use of backslash is for specifying generic character types. The
+following are always recognized:
+.sp
+  \ed     any decimal digit
+  \eD     any character that is not a decimal digit
+  \es     any whitespace character
+  \eS     any character that is not a whitespace character
+  \ew     any "word" character
+  \eW     any "non-word" character
+.sp
 Each pair of escape sequences partitions the complete set of characters into
 two disjoint sets. Any given character matches one, and only one, of each pair.
-
-In UTF-8 mode, characters with values greater than 255 never match \\d, \\s, or
-\\w, and always match \\D, \\S, and \\W.
-
-For compatibility with Perl, \\s does not match the VT character (code 11).
-This makes it different from the the POSIX "space" class. The \\s characters
+.P
+These character type sequences can appear both inside and outside character
+classes. They each match one character of the appropriate type. If the current
+matching point is at the end of the subject string, all of them fail, since
+there is no character to match.
+.P
+For compatibility with Perl, \es does not match the VT character (code 11).
+This makes it different from the the POSIX "space" class. The \es characters
 are HT (9), LF (10), FF (12), CR (13), and space (32).
-
-A "word" character is any letter or digit or the underscore character, that is,
-any character which can be part of a Perl "word". The definition of letters and
-digits is controlled by PCRE's character tables, and may vary if locale-
-specific matching is taking place (see
+.P
+A "word" character is an underscore or any character less than 256 that is a
+letter or digit. The definition of letters and digits is controlled by PCRE's
+low-valued character tables, and may vary if locale-specific matching is taking
+place (see
 .\" HTML <a href="pcreapi.html#localesupport">
 .\" </a>
 "Locale support"
 .\"
 in the
 .\" HREF
-\fBpcreapi\fR
+\fBpcreapi\fP
 .\"
-page). For example, in the "fr" (French) locale, some character codes greater
-than 128 are used for accented letters, and these are matched by \\w.
-
-These character type sequences can appear both inside and outside character
-classes. They each match one character of the appropriate type. If the current
-matching point is at the end of the subject string, all of them fail, since
-there is no character to match.
-
+page). For example, in the "fr_FR" (French) locale, some character codes
+greater than 128 are used for accented letters, and these are matched by \ew.
+.P
+In UTF-8 mode, characters with values greater than 128 never match \ed, \es, or
+\ew, and always match \eD, \eS, and \eW. This is true even when Unicode
+character property support is available.
+.
+.
+.\" HTML <a name="uniextseq"></a>
+.SS Unicode character properties
+.rs
+.sp
+When PCRE is built with Unicode character property support, three additional
+escape sequences to match generic character types are available when UTF-8 mode
+is selected. They are:
+.sp
+ \ep{\fIxx\fP}   a character with the \fIxx\fP property
+ \eP{\fIxx\fP}   a character without the \fIxx\fP property
+ \eX       an extended Unicode sequence
+.sp
+The property names represented by \fIxx\fP above are limited to the
+Unicode general category properties. Each character has exactly one such
+property, specified by a two-letter abbreviation. For compatibility with Perl,
+negation can be specified by including a circumflex between the opening brace
+and the property name. For example, \ep{^Lu} is the same as \eP{Lu}.
+.P
+If only one letter is specified with \ep or \eP, it includes all the properties
+that start with that letter. In this case, in the absence of negation, the
+curly brackets in the escape sequence are optional; these two examples have
+the same effect:
+.sp
+  \ep{L}
+  \epL
+.sp
+The following property codes are supported:
+.sp
+  C     Other
+  Cc    Control
+  Cf    Format
+  Cn    Unassigned
+  Co    Private use
+  Cs    Surrogate
+.sp
+  L     Letter
+  Ll    Lower case letter
+  Lm    Modifier letter
+  Lo    Other letter
+  Lt    Title case letter
+  Lu    Upper case letter
+.sp
+  M     Mark
+  Mc    Spacing mark
+  Me    Enclosing mark
+  Mn    Non-spacing mark
+.sp
+  N     Number
+  Nd    Decimal number
+  Nl    Letter number
+  No    Other number
+.sp
+  P     Punctuation
+  Pc    Connector punctuation
+  Pd    Dash punctuation
+  Pe    Close punctuation
+  Pf    Final punctuation
+  Pi    Initial punctuation
+  Po    Other punctuation
+  Ps    Open punctuation
+.sp
+  S     Symbol
+  Sc    Currency symbol
+  Sk    Modifier symbol
+  Sm    Mathematical symbol
+  So    Other symbol
+.sp
+  Z     Separator
+  Zl    Line separator
+  Zp    Paragraph separator
+  Zs    Space separator
+.sp
+Extended properties such as "Greek" or "InMusicalSymbols" are not supported by
+PCRE.
+.P
+Specifying caseless matching does not affect these escape sequences. For
+example, \ep{Lu} always matches only upper case letters.
+.P
+The \eX escape matches any number of Unicode characters that form an extended
+Unicode sequence. \eX is equivalent to
+.sp
+  (?>\ePM\epM*)
+.sp
+That is, it matches a character without the "mark" property, followed by zero
+or more characters with the "mark" property, and treats the sequence as an
+atomic group
+.\" HTML <a href="#atomicgroup">
+.\" </a>
+(see below).
+.\"
+Characters with the "mark" property are typically accents that affect the
+preceding character.
+.P
+Matching characters by Unicode property is not fast, because PCRE has to search
+a structure that contains data for over fifteen thousand characters. That is
+why the traditional escape sequences such as \ed and \ew do not use Unicode
+properties in PCRE.
+.
+.
+.\" HTML <a name="smallassertions"></a>
+.SS "Simple assertions"
+.rs
+.sp
 The fourth use of backslash is for certain simple assertions. An assertion
 specifies a condition that has to be met at a particular point in a match,
 without consuming any characters from the subject string. The use of
-subpatterns for more complicated assertions is described below. The backslashed
-assertions are
-
-  \\b     matches at a word boundary
-  \\B     matches when not at a word boundary
-  \\A     matches at start of subject
-  \\Z     matches at end of subject or before newline at end
-  \\z     matches at end of subject
-  \\G     matches at first matching position in subject
-
-These assertions may not appear in character classes (but note that \\b has a
+subpatterns for more complicated assertions is described
+.\" HTML <a href="#bigassertions">
+.\" </a>
+below.
+.\"
+The backslashed
+assertions are:
+.sp
+  \eb     matches at a word boundary
+  \eB     matches when not at a word boundary
+  \eA     matches at start of subject
+  \eZ     matches at end of subject or before newline at end
+  \ez     matches at end of subject
+  \eG     matches at first matching position in subject
+.sp
+These assertions may not appear in character classes (but note that \eb has a
 different meaning, namely the backspace character, inside a character class).
-
+.P
 A word boundary is a position in the subject string where the current character
-and the previous character do not both match \\w or \\W (i.e. one matches
-\\w and the other matches \\W), or the start or end of the string if the
-first or last character matches \\w, respectively.
-
-The \\A, \\Z, and \\z assertions differ from the traditional circumflex and
-dollar (described below) in that they only ever match at the very start and end
-of the subject string, whatever options are set. Thus, they are independent of
-multiline mode.
-
-They are not affected by the PCRE_NOTBOL or PCRE_NOTEOL options. If the
-\fIstartoffset\fR argument of \fBpcre_exec()\fR is non-zero, indicating that
-matching is to start at a point other than the beginning of the subject, \\A
-can never match. The difference between \\Z and \\z is that \\Z matches before
-a newline that is the last character of the string as well as at the end of the
-string, whereas \\z matches only at the end.
-
-The \\G assertion is true only when the current matching position is at the
-start point of the match, as specified by the \fIstartoffset\fR argument of
-\fBpcre_exec()\fR. It differs from \\A when the value of \fIstartoffset\fR is
-non-zero. By calling \fBpcre_exec()\fR multiple times with appropriate
+and the previous character do not both match \ew or \eW (i.e. one matches
+\ew and the other matches \eW), or the start or end of the string if the
+first or last character matches \ew, respectively.
+.P
+The \eA, \eZ, and \ez assertions differ from the traditional circumflex and
+dollar (described in the next section) in that they only ever match at the very
+start and end of the subject string, whatever options are set. Thus, they are
+independent of multiline mode. These three assertions are not affected by the
+PCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the
+circumflex and dollar metacharacters. However, if the \fIstartoffset\fP
+argument of \fBpcre_exec()\fP is non-zero, indicating that matching is to start
+at a point other than the beginning of the subject, \eA can never match. The
+difference between \eZ and \ez is that \eZ matches before a newline that is the
+last character of the string as well as at the end of the string, whereas \ez
+matches only at the end.
+.P
+The \eG assertion is true only when the current matching position is at the
+start point of the match, as specified by the \fIstartoffset\fP argument of
+\fBpcre_exec()\fP. It differs from \eA when the value of \fIstartoffset\fP is
+non-zero. By calling \fBpcre_exec()\fP multiple times with appropriate
 arguments, you can mimic Perl's /g option, and it is in this kind of
-implementation where \\G can be useful.
-
-Note, however, that PCRE's interpretation of \\G, as the start of the current
+implementation where \eG can be useful.
+.P
+Note, however, that PCRE's interpretation of \eG, as the start of the current
 match, is subtly different from Perl's, which defines it as the end of the
 previous match. In Perl, these can be different when the previously matched
 string was empty. Because PCRE does just one match at a time, it cannot
 reproduce this behaviour.
-
-If all the alternatives of a pattern begin with \\G, the expression is anchored
+.P
+If all the alternatives of a pattern begin with \eG, the expression is anchored
 to the starting match position, and the "anchored" flag is set in the compiled
 regular expression.
-
-.SH CIRCUMFLEX AND DOLLAR
+.
+.
+.SH "CIRCUMFLEX AND DOLLAR"
 .rs
 .sp
 Outside a character class, in the default matching mode, the circumflex
-character is an assertion which is true only if the current matching point is
-at the start of the subject string. If the \fIstartoffset\fR argument of
-\fBpcre_exec()\fR is non-zero, circumflex can never match if the PCRE_MULTILINE
+character is an assertion that is true only if the current matching point is
+at the start of the subject string. If the \fIstartoffset\fP argument of
+\fBpcre_exec()\fP is non-zero, circumflex can never match if the PCRE_MULTILINE
 option is unset. Inside a character class, circumflex has an entirely different
-meaning (see below).
-
+meaning
+.\" HTML <a href="#characterclass">
+.\" </a>
+(see below).
+.\"
+.P
 Circumflex need not be the first character of the pattern if a number of
 alternatives are involved, but it should be the first thing in each alternative
 in which it appears if the pattern is ever to match that branch. If all
@@ -290,57 +455,68 @@ possible alternatives start with a circu
 constrained to match only at the start of the subject, it is said to be an
 "anchored" pattern. (There are also other constructs that can cause a pattern
 to be anchored.)
-
-A dollar character is an assertion which is true only if the current matching
+.P
+A dollar character is an assertion that is true only if the current matching
 point is at the end of the subject string, or immediately before a newline
 character that is the last character in the string (by default). Dollar need
 not be the last character of the pattern if a number of alternatives are
 involved, but it should be the last item in any branch in which it appears.
 Dollar has no special meaning in a character class.
-
+.P
 The meaning of dollar can be changed so that it matches only at the very end of
 the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This
-does not affect the \\Z assertion.
-
+does not affect the \eZ assertion.
+.P
 The meanings of the circumflex and dollar characters are changed if the
 PCRE_MULTILINE option is set. When this is the case, they match immediately
 after and immediately before an internal newline character, respectively, in
 addition to matching at the start and end of the subject string. For example,
-the pattern /^abc$/ matches the subject string "def\\nabc" in multiline mode,
-but not otherwise. Consequently, patterns that are anchored in single line mode
-because all branches start with ^ are not anchored in multiline mode, and a
-match for circumflex is possible when the \fIstartoffset\fR argument of
-\fBpcre_exec()\fR is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if
-PCRE_MULTILINE is set.
-
-Note that the sequences \\A, \\Z, and \\z can be used to match the start and
+the pattern /^abc$/ matches the subject string "def\enabc" (where \en
+represents a newline character) in multiline mode, but not otherwise.
+Consequently, patterns that are anchored in single line mode because all
+branches start with ^ are not anchored in multiline mode, and a match for
+circumflex is possible when the \fIstartoffset\fP argument of \fBpcre_exec()\fP
+is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is
+set.
+.P
+Note that the sequences \eA, \eZ, and \ez can be used to match the start and
 end of the subject in both modes, and if all branches of a pattern start with
-\\A it is always anchored, whether PCRE_MULTILINE is set or not.
-
-.SH FULL STOP (PERIOD, DOT)
+\eA it is always anchored, whether PCRE_MULTILINE is set or not.
+.
+.
+.SH "FULL STOP (PERIOD, DOT)"
 .rs
 .sp
 Outside a character class, a dot in the pattern matches any one character in
 the subject, including a non-printing character, but not (by default) newline.
 In UTF-8 mode, a dot matches any UTF-8 character, which might be more than one
-byte long, except (by default) for newline. If the PCRE_DOTALL option is set,
+byte long, except (by default) newline. If the PCRE_DOTALL option is set,
 dots match newlines as well. The handling of dot is entirely independent of the
 handling of circumflex and dollar, the only relationship being that they both
 involve newline characters. Dot has no special meaning in a character class.
-
-.SH MATCHING A SINGLE BYTE
+.
+.
+.SH "MATCHING A SINGLE BYTE"
 .rs
 .sp
-Outside a character class, the escape sequence \\C matches any one byte, both
-in and out of UTF-8 mode. Unlike a dot, it always matches a newline. The
-feature is provided in Perl in order to match individual bytes in UTF-8 mode.
-Because it breaks up UTF-8 characters into individual bytes, what remains in
-the string may be a malformed UTF-8 string. For this reason it is best avoided.
-
-PCRE does not allow \\C to appear in lookbehind assertions (see below), because
-in UTF-8 mode it makes it impossible to calculate the length of the lookbehind.
-
-.SH SQUARE BRACKETS
+Outside a character class, the escape sequence \eC matches any one byte, both
+in and out of UTF-8 mode. Unlike a dot, it can match a newline. The feature is
+provided in Perl in order to match individual bytes in UTF-8 mode. Because it
+breaks up UTF-8 characters into individual bytes, what remains in the string
+may be a malformed UTF-8 string. For this reason, the \eC escape sequence is
+best avoided.
+.P
+PCRE does not allow \eC to appear in lookbehind assertions
+.\" HTML <a href="#lookbehind">
+.\" </a>
+(described below),
+.\"
+because in UTF-8 mode this would make it impossible to calculate the length of
+the lookbehind.
+.
+.
+.\" HTML <a name="characterclass"></a>
+.SH "SQUARE BRACKETS AND CHARACTER CLASSES"
 .rs
 .sp
 An opening square bracket introduces a character class, terminated by a closing
@@ -348,7 +524,7 @@ square bracket. A closing square bracket
 closing square bracket is required as a member of the class, it should be the
 first data character in the class (after an initial circumflex, if present) or
 escaped with a backslash.
-
+.P
 A character class matches a single character in the subject. In UTF-8 mode, the
 character may occupy more than one byte. A matched character must be in the set
 of characters defined by the class, unless the first character in the class
@@ -356,377 +532,407 @@ definition is a circumflex, in which cas
 the set defined by the class. If a circumflex is actually required as a member
 of the class, ensure it is not the first character, or escape it with a
 backslash.
-
+.P
 For example, the character class [aeiou] matches any lower case vowel, while
 [^aeiou] matches any character that is not a lower case vowel. Note that a
-circumflex is just a convenient notation for specifying the characters which
-are in the class by enumerating those that are not. It is not an assertion: it
-still consumes a character from the subject string, and fails if the current
-pointer is at the end of the string.
-
+circumflex is just a convenient notation for specifying the characters that
+are in the class by enumerating those that are not. A class that starts with a
+circumflex is not an assertion: it still consumes a character from the subject
+string, and therefore it fails if the current pointer is at the end of the
+string.
+.P
 In UTF-8 mode, characters with values greater than 255 can be included in a
-class as a literal string of bytes, or by using the \\x{ escaping mechanism.
-
+class as a literal string of bytes, or by using the \ex{ escaping mechanism.
+.P
 When caseless matching is set, any letters in a class represent both their
 upper case and lower case versions, so for example, a caseless [aeiou] matches
 "A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a
-caseful version would. PCRE does not support the concept of case for characters
-with values greater than 255.
-
+caseful version would. In UTF-8 mode, PCRE always understands the concept of
+case for characters whose values are less than 128, so caseless matching is
+always possible. For characters with higher values, the concept of case is
+supported if PCRE is compiled with Unicode property support, but not otherwise.
+If you want to use caseless matching for characters 128 and above, you must
+ensure that PCRE is compiled with Unicode property support as well as with
+UTF-8 support.
+.P
 The newline character is never treated in any special way in character classes,
 whatever the setting of the PCRE_DOTALL or PCRE_MULTILINE options is. A class
 such as [^a] will always match a newline.
-
+.P
 The minus (hyphen) character can be used to specify a range of characters in a
 character class. For example, [d-m] matches any letter between d and m,
 inclusive. If a minus character is required in a class, it must be escaped with
 a backslash or appear in a position where it cannot be interpreted as
 indicating a range, typically as the first or last character in the class.
-
+.P
 It is not possible to have the literal character "]" as the end character of a
 range. A pattern such as [W-]46] is interpreted as a class of two characters
 ("W" and "-") followed by a literal string "46]", so it would match "W46]" or
 "-46]". However, if the "]" is escaped with a backslash it is interpreted as
-the end of range, so [W-\\]46] is interpreted as a single class containing a
-range followed by two separate characters. The octal or hexadecimal
-representation of "]" can also be used to end a range.
-
+the end of range, so [W-\e]46] is interpreted as a class containing a range
+followed by two other characters. The octal or hexadecimal representation of
+"]" can also be used to end a range.
+.P
 Ranges operate in the collating sequence of character values. They can also be
-used for characters specified numerically, for example [\\000-\\037]. In UTF-8
+used for characters specified numerically, for example [\e000-\e037]. In UTF-8
 mode, ranges can include characters whose values are greater than 255, for
-example [\\x{100}-\\x{2ff}].
-
+example [\ex{100}-\ex{2ff}].
+.P
 If a range that includes letters is used when caseless matching is set, it
 matches the letters in either case. For example, [W-c] is equivalent to
-[][\\^_`wxyzabc], matched caselessly, and if character tables for the "fr"
-locale are in use, [\\xc8-\\xcb] matches accented E characters in both cases.
-
-The character types \\d, \\D, \\s, \\S, \\w, and \\W may also appear in a
-character class, and add the characters that they match to the class. For
-example, [\\dABCDEF] matches any hexadecimal digit. A circumflex can
+[][\e\e^_`wxyzabc], matched caselessly, and in non-UTF-8 mode, if character
+tables for the "fr_FR" locale are in use, [\exc8-\excb] matches accented E
+characters in both cases. In UTF-8 mode, PCRE supports the concept of case for
+characters with values greater than 128 only when it is compiled with Unicode
+property support.
+.P
+The character types \ed, \eD, \ep, \eP, \es, \eS, \ew, and \eW may also appear
+in a character class, and add the characters that they match to the class. For
+example, [\edABCDEF] matches any hexadecimal digit. A circumflex can
 conveniently be used with the upper case character types to specify a more
 restricted set of characters than the matching lower case type. For example,
-the class [^\\W_] matches any letter or digit, but not underscore.
-
-All non-alphameric characters other than \\, -, ^ (at the start) and the
-terminating ] are non-special in character classes, but it does no harm if they
-are escaped.
-
-.SH POSIX CHARACTER CLASSES
+the class [^\eW_] matches any letter or digit, but not underscore.
+.P
+The only metacharacters that are recognized in character classes are backslash,
+hyphen (only where it can be interpreted as specifying a range), circumflex
+(only at the start), opening square bracket (only when it can be interpreted as
+introducing a POSIX class name - see the next section), and the terminating
+closing square bracket. However, escaping other non-alphanumeric characters
+does no harm.
+.
+.
+.SH "POSIX CHARACTER CLASSES"
 .rs
 .sp
-Perl supports the POSIX notation for character classes, which uses names
+Perl supports the POSIX notation for character classes. This uses names
 enclosed by [: and :] within the enclosing square brackets. PCRE also supports
 this notation. For example,
-
+.sp
   [01[:alpha:]%]
-
+.sp
 matches "0", "1", any alphabetic character, or "%". The supported class names
 are
-
+.sp
   alnum    letters and digits
   alpha    letters
   ascii    character codes 0 - 127
   blank    space or tab only
   cntrl    control characters
-  digit    decimal digits (same as \\d)
+  digit    decimal digits (same as \ed)
   graph    printing characters, excluding space
   lower    lower case letters
   print    printing characters, including space
   punct    printing characters, excluding letters and digits
-  space    white space (not quite the same as \\s)
+  space    white space (not quite the same as \es)
   upper    upper case letters
-  word     "word" characters (same as \\w)
+  word     "word" characters (same as \ew)
   xdigit   hexadecimal digits
-
+.sp
 The "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), and
 space (32). Notice that this list includes the VT character (code 11). This
-makes "space" different to \\s, which does not include VT (for Perl
+makes "space" different to \es, which does not include VT (for Perl
 compatibility).
-
+.P
 The name "word" is a Perl extension, and "blank" is a GNU extension from Perl
 5.8. Another Perl extension is negation, which is indicated by a ^ character
 after the colon. For example,
-
+.sp
   [12[:^digit:]]
-
+.sp
 matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX
 syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not
 supported, and an error is given if they are encountered.
-
-In UTF-8 mode, characters with values greater than 255 do not match any of
+.P
+In UTF-8 mode, characters with values greater than 128 do not match any of
 the POSIX character classes.
-
-.SH VERTICAL BAR
+.
+.
+.SH "VERTICAL BAR"
 .rs
 .sp
 Vertical bar characters are used to separate alternative patterns. For example,
 the pattern
-
+.sp
   gilbert|sullivan
-
+.sp
 matches either "gilbert" or "sullivan". Any number of alternatives may appear,
 and an empty alternative is permitted (matching the empty string).
 The matching process tries each alternative in turn, from left to right,
 and the first one that succeeds is used. If the alternatives are within a
-subpattern (defined below), "succeeds" means matching the rest of the main
-pattern as well as the alternative in the subpattern.
-
-.SH INTERNAL OPTION SETTING
+subpattern
+.\" HTML <a href="#subpattern">
+.\" </a>
+(defined below),
+.\"
+"succeeds" means matching the rest of the main pattern as well as the
+alternative in the subpattern.
+.
+.
+.SH "INTERNAL OPTION SETTING"
 .rs
 .sp
 The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and
 PCRE_EXTENDED options can be changed from within the pattern by a sequence of
 Perl option letters enclosed between "(?" and ")". The option letters are
-
+.sp
   i  for PCRE_CASELESS
   m  for PCRE_MULTILINE
   s  for PCRE_DOTALL
   x  for PCRE_EXTENDED
-
+.sp
 For example, (?im) sets caseless, multiline matching. It is also possible to
 unset these options by preceding the letter with a hyphen, and a combined
 setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and
 PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also
 permitted. If a letter appears both before and after the hyphen, the option is
 unset.
-
+.P
 When an option change occurs at top level (that is, not inside subpattern
 parentheses), the change applies to the remainder of the pattern that follows.
 If the change is placed right at the start of a pattern, PCRE extracts it into
 the global options (and it will therefore show up in data extracted by the
-\fBpcre_fullinfo()\fR function).
-
+\fBpcre_fullinfo()\fP function).
+.P
 An option change within a subpattern affects only that part of the current
 pattern that follows it, so
-
+.sp
   (a(?i)b)c
-
+.sp
 matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used).
 By this means, options can be made to have different settings in different
 parts of the pattern. Any changes made in one alternative do carry on
 into subsequent branches within the same subpattern. For example,
-
+.sp
   (a(?i)b|c)
-
+.sp
 matches "ab", "aB", "c", and "C", even though when matching "C" the first
 branch is abandoned before the option setting. This is because the effects of
 option settings happen at compile time. There would be some very weird
 behaviour otherwise.
-
+.P
 The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can be changed in the
 same way as the Perl-compatible options by using the characters U and X
 respectively. The (?X) flag setting is special in that it must always occur
 earlier in the pattern than any of the additional features it turns on, even
-when it is at top level. It is best put at the start.
-
+when it is at top level. It is best to put it at the start.
+.
+.
+.\" HTML <a name="subpattern"></a>
 .SH SUBPATTERNS
 .rs
 .sp
 Subpatterns are delimited by parentheses (round brackets), which can be nested.
-Marking part of a pattern as a subpattern does two things:
-
+Turning part of a pattern into a subpattern does two things:
+.sp
 1. It localizes a set of alternatives. For example, the pattern
-
+.sp
   cat(aract|erpillar|)
-
+.sp
 matches one of the words "cat", "cataract", or "caterpillar". Without the
 parentheses, it would match "cataract", "erpillar" or the empty string.
-
-2. It sets up the subpattern as a capturing subpattern (as defined above).
-When the whole pattern matches, that portion of the subject string that matched
-the subpattern is passed back to the caller via the \fIovector\fR argument of
-\fBpcre_exec()\fR. Opening parentheses are counted from left to right (starting
-from 1) to obtain the numbers of the capturing subpatterns.
-
+.sp
+2. It sets up the subpattern as a capturing subpattern. This means that, when
+the whole pattern matches, that portion of the subject string that matched the
+subpattern is passed back to the caller via the \fIovector\fP argument of
+\fBpcre_exec()\fP. Opening parentheses are counted from left to right (starting
+from 1) to obtain numbers for the capturing subpatterns.
+.P
 For example, if the string "the red king" is matched against the pattern
-
+.sp
   the ((red|white) (king|queen))
-
+.sp
 the captured substrings are "red king", "red", and "king", and are numbered 1,
 2, and 3, respectively.
-
+.P
 The fact that plain parentheses fulfil two functions is not always helpful.
 There are often times when a grouping subpattern is required without a
 capturing requirement. If an opening parenthesis is followed by a question mark
 and a colon, the subpattern does not do any capturing, and is not counted when
 computing the number of any subsequent capturing subpatterns. For example, if
 the string "the white queen" is matched against the pattern
-
+.sp
   the ((?:red|white) (king|queen))
-
+.sp
 the captured substrings are "white queen" and "queen", and are numbered 1 and
 2. The maximum number of capturing subpatterns is 65535, and the maximum depth
 of nesting of all subpatterns, both capturing and non-capturing, is 200.
-
+.P
 As a convenient shorthand, if any option settings are required at the start of
 a non-capturing subpattern, the option letters may appear between the "?" and
 the ":". Thus the two patterns
-
+.sp
   (?i:saturday|sunday)
   (?:(?i)saturday|sunday)
-
+.sp
 match exactly the same set of strings. Because alternative branches are tried
 from left to right, and options are not reset until the end of the subpattern
 is reached, an option setting in one branch does affect subsequent branches, so
 the above patterns match "SUNDAY" as well as "Saturday".
-
-.SH NAMED SUBPATTERNS
+.
+.
+.SH "NAMED SUBPATTERNS"
 .rs
 .sp
 Identifying capturing parentheses by number is simple, but it can be very hard
 to keep track of the numbers in complicated regular expressions. Furthermore,
-if an expression is modified, the numbers may change. To help with the
+if an expression is modified, the numbers may change. To help with this
 difficulty, PCRE supports the naming of subpatterns, something that Perl does
 not provide. The Python syntax (?P<name>...) is used. Names consist of
 alphanumeric characters and underscores, and must be unique within a pattern.
-
+.P
 Named capturing parentheses are still allocated numbers as well as names. The
 PCRE API provides function calls for extracting the name-to-number translation
-table from a compiled pattern. For further details see the
+table from a compiled pattern. There is also a convenience function for
+extracting a captured substring by name. For further details see the
 .\" HREF
-\fBpcreapi\fR
+\fBpcreapi\fP
 .\"
 documentation.
-
+.
+.
 .SH REPETITION
 .rs
 .sp
 Repetition is specified by quantifiers, which can follow any of the following
 items:
-
+.sp
   a literal data character
   the . metacharacter
-  the \\C escape sequence
-  escapes such as \\d that match single characters
+  the \eC escape sequence
+  the \eX escape sequence (in UTF-8 mode with Unicode properties)
+  an escape such as \ed that matches a single character
   a character class
   a back reference (see next section)
   a parenthesized subpattern (unless it is an assertion)
-
+.sp
 The general repetition quantifier specifies a minimum and maximum number of
 permitted matches, by giving the two numbers in curly brackets (braces),
 separated by a comma. The numbers must be less than 65536, and the first must
 be less than or equal to the second. For example:
-
+.sp
   z{2,4}
-
+.sp
 matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special
 character. If the second number is omitted, but the comma is present, there is
 no upper limit; if the second number and the comma are both omitted, the
 quantifier specifies an exact number of required matches. Thus
-
+.sp
   [aeiou]{3,}
-
+.sp
 matches at least 3 successive vowels, but may match many more, while
-
-  \\d{8}
-
+.sp
+  \ed{8}
+.sp
 matches exactly 8 digits. An opening curly bracket that appears in a position
 where a quantifier is not allowed, or one that does not match the syntax of a
 quantifier, is taken as a literal character. For example, {,6} is not a
 quantifier, but a literal string of four characters.
-
+.P
 In UTF-8 mode, quantifiers apply to UTF-8 characters rather than to individual
-bytes. Thus, for example, \\x{100}{2} matches two UTF-8 characters, each of
-which is represented by a two-byte sequence.
-
+bytes. Thus, for example, \ex{100}{2} matches two UTF-8 characters, each of
+which is represented by a two-byte sequence. Similarly, when Unicode property
+support is available, \eX{3} matches three Unicode extended sequences, each of
+which may be several bytes long (and they may be of different lengths).
+.P
 The quantifier {0} is permitted, causing the expression to behave as if the
 previous item and the quantifier were not present.
-
+.P
 For convenience (and historical compatibility) the three most common
 quantifiers have single-character abbreviations:
-
+.sp
   *    is equivalent to {0,}
   +    is equivalent to {1,}
   ?    is equivalent to {0,1}
-
+.sp
 It is possible to construct infinite loops by following a subpattern that can
 match no characters with a quantifier that has no upper limit, for example:
-
+.sp
   (a?)*
-
+.sp
 Earlier versions of Perl and PCRE used to give an error at compile time for
 such patterns. However, because there are cases where this can be useful, such
 patterns are now accepted, but if any repetition of the subpattern does in fact
 match no characters, the loop is forcibly broken.
-
+.P
 By default, the quantifiers are "greedy", that is, they match as much as
 possible (up to the maximum number of permitted times), without causing the
 rest of the pattern to fail. The classic example of where this gives problems
-is in trying to match comments in C programs. These appear between the
-sequences /* and */ and within the sequence, individual * and / characters may
-appear. An attempt to match C comments by applying the pattern
-
-  /\\*.*\\*/
-
+is in trying to match comments in C programs. These appear between /* and */
+and within the comment, individual * and / characters may appear. An attempt to
+match C comments by applying the pattern
+.sp
+  /\e*.*\e*/
+.sp
 to the string
-
-  /* first command */  not comment  /* second comment */
-
+.sp
+  /* first comment */  not comment  /* second comment */
+.sp
 fails, because it matches the entire string owing to the greediness of the .*
 item.
-
+.P
 However, if a quantifier is followed by a question mark, it ceases to be
 greedy, and instead matches the minimum number of times possible, so the
 pattern
-
-  /\\*.*?\\*/
-
+.sp
+  /\e*.*?\e*/
+.sp
 does the right thing with the C comments. The meaning of the various
 quantifiers is not otherwise changed, just the preferred number of matches.
 Do not confuse this use of question mark with its use as a quantifier in its
 own right. Because it has two uses, it can sometimes appear doubled, as in
-
-  \\d??\\d
-
+.sp
+  \ed??\ed
+.sp
 which matches one digit by preference, but can match two if that is the only
 way the rest of the pattern matches.
-
+.P
 If the PCRE_UNGREEDY option is set (an option which is not available in Perl),
 the quantifiers are not greedy by default, but individual ones can be made
 greedy by following them with a question mark. In other words, it inverts the
 default behaviour.
-
+.P
 When a parenthesized subpattern is quantified with a minimum repeat count that
-is greater than 1 or with a limited maximum, more store is required for the
+is greater than 1 or with a limited maximum, more memory is required for the
 compiled pattern, in proportion to the size of the minimum or maximum.
-
+.P
 If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent
 to Perl's /s) is set, thus allowing the . to match newlines, the pattern is
 implicitly anchored, because whatever follows will be tried against every
 character position in the subject string, so there is no point in retrying the
 overall match at any position after the first. PCRE normally treats such a
-pattern as though it were preceded by \\A.
-
+pattern as though it were preceded by \eA.
+.P
 In cases where it is known that the subject string contains no newlines, it is
 worth setting PCRE_DOTALL in order to obtain this optimization, or
 alternatively using ^ to indicate anchoring explicitly.
-
+.P
 However, there is one situation where the optimization cannot be used. When .*
 is inside capturing parentheses that are the subject of a backreference
 elsewhere in the pattern, a match at the start may fail, and a later one
 succeed. Consider, for example:
-
-  (.*)abc\\1
-
+.sp
+  (.*)abc\e1
+.sp
 If the subject is "xyz123abc123" the match point is the fourth character. For
 this reason, such a pattern is not implicitly anchored.
-
+.P
 When a capturing subpattern is repeated, the value captured is the substring
 that matched the final iteration. For example, after
-
-  (tweedle[dume]{3}\\s*)+
-
+.sp
+  (tweedle[dume]{3}\es*)+
+.sp
 has matched "tweedledum tweedledee" the value of the captured substring is
 "tweedledee". However, if there are nested capturing subpatterns, the
 corresponding captured values may have been set in previous iterations. For
 example, after
-
+.sp
   /(a|(b))+/
-
+.sp
 matches "aba" the value of the second captured substring is "b".
-
-.SH ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS
+.
+.
+.\" HTML <a name="atomicgroup"></a>
+.SH "ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS"
 .rs
 .sp
 With both maximizing and minimizing repetition, failure of what follows
@@ -735,95 +941,102 @@ number of repeats allows the rest of the
 useful to prevent this, either to change the nature of the match, or to cause
 it fail earlier than it otherwise might, when the author of the pattern knows
 there is no point in carrying on.
-
-Consider, for example, the pattern \\d+foo when applied to the subject line
-
+.P
+Consider, for example, the pattern \ed+foo when applied to the subject line
+.sp
   123456bar
-
+.sp
 After matching all 6 digits and then failing to match "foo", the normal
-action of the matcher is to try again with only 5 digits matching the \\d+
+action of the matcher is to try again with only 5 digits matching the \ed+
 item, and then with 4, and so on, before ultimately failing. "Atomic grouping"
 (a term taken from Jeffrey Friedl's book) provides the means for specifying
 that once a subpattern has matched, it is not to be re-evaluated in this way.
-
+.P
 If we use atomic grouping for the previous example, the matcher would give up
 immediately on failing to match "foo" the first time. The notation is a kind of
 special parenthesis, starting with (?> as in this example:
-
-  (?>\\d+)bar
-
+.sp
+  (?>\ed+)foo
+.sp
 This kind of parenthesis "locks up" the  part of the pattern it contains once
 it has matched, and a failure further into the pattern is prevented from
 backtracking into it. Backtracking past it to previous items, however, works as
 normal.
-
+.P
 An alternative description is that a subpattern of this type matches the string
 of characters that an identical standalone pattern would match, if anchored at
 the current point in the subject string.
-
+.P
 Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as
 the above example can be thought of as a maximizing repeat that must swallow
-everything it can. So, while both \\d+ and \\d+? are prepared to adjust the
+everything it can. So, while both \ed+ and \ed+? are prepared to adjust the
 number of digits they match in order to make the rest of the pattern match,
-(?>\\d+) can only match an entire sequence of digits.
-
+(?>\ed+) can only match an entire sequence of digits.
+.P
 Atomic groups in general can of course contain arbitrarily complicated
 subpatterns, and can be nested. However, when the subpattern for an atomic
 group is just a single repeated item, as in the example above, a simpler
 notation, called a "possessive quantifier" can be used. This consists of an
 additional + character following a quantifier. Using this notation, the
 previous example can be rewritten as
-
-  \\d++bar
-
+.sp
+  \ed++foo
+.sp
 Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY
 option is ignored. They are a convenient notation for the simpler forms of
 atomic group. However, there is no difference in the meaning or processing of a
 possessive quantifier and the equivalent atomic group.
-
+.P
 The possessive quantifier syntax is an extension to the Perl syntax. It
 originates in Sun's Java package.
-
+.P
 When a pattern contains an unlimited repeat inside a subpattern that can itself
 be repeated an unlimited number of times, the use of an atomic group is the
 only way to avoid some failing matches taking a very long time indeed. The
 pattern
-
-  (\\D+|<\\d+>)*[!?]
-
+.sp
+  (\eD+|<\ed+>)*[!?]
+.sp
 matches an unlimited number of substrings that either consist of non-digits, or
 digits enclosed in <>, followed by either ! or ?. When it matches, it runs
 quickly. However, if it is applied to
-
+.sp
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-
+.sp
 it takes a long time before reporting failure. This is because the string can
-be divided between the two repeats in a large number of ways, and all have to
-be tried. (The example used [!?] rather than a single character at the end,
-because both PCRE and Perl have an optimization that allows for fast failure
-when a single character is used. They remember the last single character that
-is required for a match, and fail early if it is not present in the string.)
-If the pattern is changed to
-
-  ((?>\\D+)|<\\d+>)*[!?]
-
+be divided between the internal \eD+ repeat and the external * repeat in a
+large number of ways, and all have to be tried. (The example uses [!?] rather
+than a single character at the end, because both PCRE and Perl have an
+optimization that allows for fast failure when a single character is used. They
+remember the last single character that is required for a match, and fail early
+if it is not present in the string.) If the pattern is changed so that it uses
+an atomic group, like this:
+.sp
+  ((?>\eD+)|<\ed+>)*[!?]
+.sp
 sequences of non-digits cannot be broken, and failure happens quickly.
-
-.SH BACK REFERENCES
+.
+.
+.\" HTML <a name="backreferences"></a>
+.SH "BACK REFERENCES"
 .rs
 .sp
 Outside a character class, a backslash followed by a digit greater than 0 (and
 possibly further digits) is a back reference to a capturing subpattern earlier
 (that is, to its left) in the pattern, provided there have been that many
 previous capturing left parentheses.
-
+.P
 However, if the decimal number following the backslash is less than 10, it is
 always taken as a back reference, and causes an error only if there are not
 that many capturing left parentheses in the entire pattern. In other words, the
 parentheses that are referenced need not be to the left of the reference for
-numbers less than 10. See the section entitled "Backslash" above for further
-details of the handling of digits following a backslash.
-
+numbers less than 10. See the subsection entitled "Non-printing characters"
+.\" HTML <a href="#digitsafterbackslash">
+.\" </a>
+above
+.\"
+for further details of the handling of digits following a backslash.
+.P
 A back reference matches whatever actually matched the capturing subpattern in
 the current subject string, rather than anything matching the subpattern
 itself (see
@@ -832,212 +1045,239 @@ itself (see
 "Subpatterns as subroutines"
 .\"
 below for a way of doing that). So the pattern
-
-  (sens|respons)e and \\1ibility
-
+.sp
+  (sens|respons)e and \e1ibility
+.sp
 matches "sense and sensibility" and "response and responsibility", but not
 "sense and responsibility". If caseful matching is in force at the time of the
 back reference, the case of letters is relevant. For example,
-
-  ((?i)rah)\\s+\\1
-
+.sp
+  ((?i)rah)\es+\e1
+.sp
 matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original
 capturing subpattern is matched caselessly.
-
+.P
 Back references to named subpatterns use the Python syntax (?P=name). We could
 rewrite the above example as follows:
-
-  (?<p1>(?i)rah)\\s+(?P=p1)
-
+.sp
+  (?<p1>(?i)rah)\es+(?P=p1)
+.sp
 There may be more than one back reference to the same subpattern. If a
 subpattern has not actually been used in a particular match, any back
 references to it always fail. For example, the pattern
-
-  (a|(bc))\\2
-
+.sp
+  (a|(bc))\e2
+.sp
 always fails if it starts to match "a" rather than "bc". Because there may be
 many capturing parentheses in a pattern, all digits following the backslash are
 taken as part of a potential back reference number. If the pattern continues
 with a digit character, some delimiter must be used to terminate the back
 reference. If the PCRE_EXTENDED option is set, this can be whitespace.
-Otherwise an empty comment can be used.
-
+Otherwise an empty comment (see
+.\" HTML <a href="#comments">
+.\" </a>
+"Comments"
+.\"
+below) can be used.
+.P
 A back reference that occurs inside the parentheses to which it refers fails
-when the subpattern is first used, so, for example, (a\\1) never matches.
+when the subpattern is first used, so, for example, (a\e1) never matches.
 However, such references can be useful inside repeated subpatterns. For
 example, the pattern
-
-  (a|b\\1)+
-
+.sp
+  (a|b\e1)+
+.sp
 matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of
 the subpattern, the back reference matches the character string corresponding
 to the previous iteration. In order for this to work, the pattern must be such
 that the first iteration does not need to match the back reference. This can be
 done using alternation, as in the example above, or by a quantifier with a
 minimum of zero.
-
+.
+.
+.\" HTML <a name="bigassertions"></a>
 .SH ASSERTIONS
 .rs
 .sp
 An assertion is a test on the characters following or preceding the current
 matching point that does not actually consume any characters. The simple
-assertions coded as \\b, \\B, \\A, \\G, \\Z, \\z, ^ and $ are described above.
+assertions coded as \eb, \eB, \eA, \eG, \eZ, \ez, ^ and $ are described
+.\" HTML <a href="#smallassertions">
+.\" </a>
+above.
+.\"
+.P
 More complicated assertions are coded as subpatterns. There are two kinds:
 those that look ahead of the current position in the subject string, and those
-that look behind it.
-
-An assertion subpattern is matched in the normal way, except that it does not
-cause the current matching position to be changed. Lookahead assertions start
+that look behind it. An assertion subpattern is matched in the normal way,
+except that it does not cause the current matching position to be changed.
+.P
+Assertion subpatterns are not capturing subpatterns, and may not be repeated,
+because it makes no sense to assert the same thing several times. If any kind
+of assertion contains capturing subpatterns within it, these are counted for
+the purposes of numbering the capturing subpatterns in the whole pattern.
+However, substring capturing is carried out only for positive assertions,
+because it does not make sense for negative assertions.
+.
+.
+.SS "Lookahead assertions"
+.rs
+.sp
+Lookahead assertions start
 with (?= for positive assertions and (?! for negative assertions. For example,
-
-  \\w+(?=;)
-
+.sp
+  \ew+(?=;)
+.sp
 matches a word followed by a semicolon, but does not include the semicolon in
 the match, and
-
+.sp
   foo(?!bar)
-
+.sp
 matches any occurrence of "foo" that is not followed by "bar". Note that the
 apparently similar pattern
-
+.sp
   (?!foo)bar
-
+.sp
 does not find an occurrence of "bar" that is preceded by something other than
 "foo"; it finds any occurrence of "bar" whatsoever, because the assertion
 (?!foo) is always true when the next three characters are "bar". A
-lookbehind assertion is needed to achieve this effect.
-
+lookbehind assertion is needed to achieve the other effect.
+.P
 If you want to force a matching failure at some point in a pattern, the most
 convenient way to do it is with (?!) because an empty string always matches, so
 an assertion that requires there not to be an empty string must always fail.
-
+.
+.
+.\" HTML <a name="lookbehind"></a>
+.SS "Lookbehind assertions"
+.rs
+.sp
 Lookbehind assertions start with (?<= for positive assertions and (?<! for
 negative assertions. For example,
-
+.sp
   (?<!foo)bar
-
+.sp
 does find an occurrence of "bar" that is not preceded by "foo". The contents of
 a lookbehind assertion are restricted such that all the strings it matches must
 have a fixed length. However, if there are several alternatives, they do not
 all have to have the same fixed length. Thus
-
+.sp
   (?<=bullock|donkey)
-
+.sp
 is permitted, but
-
+.sp
   (?<!dogs?|cats?)
-
+.sp
 causes an error at compile time. Branches that match different length strings
 are permitted only at the top level of a lookbehind assertion. This is an
 extension compared with Perl (at least for 5.8), which requires all branches to
 match the same length of string. An assertion such as
-
+.sp
   (?<=ab(c|de))
-
+.sp
 is not permitted, because its single top-level branch can match two different
 lengths, but it is acceptable if rewritten to use two top-level branches:
-
+.sp
   (?<=abc|abde)
-
+.sp
 The implementation of lookbehind assertions is, for each alternative, to
 temporarily move the current position back by the fixed width and then try to
 match. If there are insufficient characters before the current position, the
 match is deemed to fail.
-
-PCRE does not allow the \\C escape (which matches a single byte in UTF-8 mode)
+.P
+PCRE does not allow the \eC escape (which matches a single byte in UTF-8 mode)
 to appear in lookbehind assertions, because it makes it impossible to calculate
-the length of the lookbehind.
-
+the length of the lookbehind. The \eX escape, which can match different numbers
+of bytes, is also not permitted.
+.P
 Atomic groups can be used in conjunction with lookbehind assertions to specify
 efficient matching at the end of the subject string. Consider a simple pattern
 such as
-
+.sp
   abcd$
-
+.sp
 when applied to a long string that does not match. Because matching proceeds
 from left to right, PCRE will look for each "a" in the subject and then see if
 what follows matches the rest of the pattern. If the pattern is specified as
-
+.sp
   ^.*abcd$
-
+.sp
 the initial .* matches the entire string at first, but when this fails (because
 there is no following "a"), it backtracks to match all but the last character,
 then all but the last two characters, and so on. Once again the search for "a"
 covers the entire string, from right to left, so we are no better off. However,
 if the pattern is written as
-
+.sp
   ^(?>.*)(?<=abcd)
-
-or, equivalently,
-
+.sp
+or, equivalently, using the possessive quantifier syntax,
+.sp
   ^.*+(?<=abcd)
-
+.sp
 there can be no backtracking for the .* item; it can match only the entire
 string. The subsequent lookbehind assertion does a single test on the last four
 characters. If it fails, the match fails immediately. For long strings, this
 approach makes a significant difference to the processing time.
-
+.
+.
+.SS "Using multiple assertions"
+.rs
+.sp
 Several assertions (of any sort) may occur in succession. For example,
-
-  (?<=\\d{3})(?<!999)foo
-
+.sp
+  (?<=\ed{3})(?<!999)foo
+.sp
 matches "foo" preceded by three digits that are not "999". Notice that each of
 the assertions is applied independently at the same point in the subject
 string. First there is a check that the previous three characters are all
 digits, and then there is a check that the same three characters are not "999".
-This pattern does \fInot\fR match "foo" preceded by six characters, the first
+This pattern does \fInot\fP match "foo" preceded by six characters, the first
 of which are digits and the last three of which are not "999". For example, it
 doesn't match "123abcfoo". A pattern to do that is
-
-  (?<=\\d{3}...)(?<!999)foo
-
+.sp
+  (?<=\ed{3}...)(?<!999)foo
+.sp
 This time the first assertion looks at the preceding six characters, checking
 that the first three are digits, and then the second assertion checks that the
 preceding three characters are not "999".
-
+.P
 Assertions can be nested in any combination. For example,
-
+.sp
   (?<=(?<!foo)bar)baz
-
+.sp
 matches an occurrence of "baz" that is preceded by "bar" which in turn is not
 preceded by "foo", while
-
-  (?<=\\d{3}(?!999)...)foo
-
-is another pattern which matches "foo" preceded by three digits and any three
+.sp
+  (?<=\ed{3}(?!999)...)foo
+.sp
+is another pattern that matches "foo" preceded by three digits and any three
 characters that are not "999".
-
-Assertion subpatterns are not capturing subpatterns, and may not be repeated,
-because it makes no sense to assert the same thing several times. If any kind
-of assertion contains capturing subpatterns within it, these are counted for
-the purposes of numbering the capturing subpatterns in the whole pattern.
-However, substring capturing is carried out only for positive assertions,
-because it does not make sense for negative assertions.
-
-.SH CONDITIONAL SUBPATTERNS
+.
+.
+.SH "CONDITIONAL SUBPATTERNS"
 .rs
 .sp
 It is possible to cause the matching process to obey a subpattern
 conditionally or to choose between two alternative subpatterns, depending on
 the result of an assertion, or whether a previous capturing subpattern matched
 or not. The two possible forms of conditional subpattern are
-
+.sp
   (?(condition)yes-pattern)
   (?(condition)yes-pattern|no-pattern)
-
+.sp
 If the condition is satisfied, the yes-pattern is used; otherwise the
 no-pattern (if present) is used. If there are more than two alternatives in the
 subpattern, a compile-time error occurs.
-
+.P
 There are three kinds of condition. If the text between the parentheses
 consists of a sequence of digits, the condition is satisfied if the capturing
 subpattern of that number has previously matched. The number must be greater
 than zero. Consider the following pattern, which contains non-significant white
 space to make it more readable (assume the PCRE_EXTENDED option) and to divide
 it into three parts for ease of discussion:
-
-  ( \\( )?    [^()]+    (?(1) \\) )
-
+.sp
+  ( \e( )?    [^()]+    (?(1) \e) )
+.sp
 The first part matches an optional opening parenthesis, and if that
 character is present, sets it as the first captured substring. The second part
 matches one or more characters that are not parentheses. The third part is a
@@ -1047,153 +1287,158 @@ the condition is true, and so the yes-pa
 parenthesis is required. Otherwise, since no-pattern is not present, the
 subpattern matches nothing. In other words, this pattern matches a sequence of
 non-parentheses, optionally enclosed in parentheses.
-
+.P
 If the condition is the string (R), it is satisfied if a recursive call to the
 pattern or subpattern has been made. At "top level", the condition is false.
 This is a PCRE extension. Recursive patterns are described in the next section.
-
+.P
 If the condition is not a sequence of digits or (R), it must be an assertion.
 This may be a positive or negative lookahead or lookbehind assertion. Consider
 this pattern, again containing non-significant white space, and with the two
 alternatives on the second line:
-
+.sp
   (?(?=[^a-z]*[a-z])
-  \\d{2}-[a-z]{3}-\\d{2}  |  \\d{2}-\\d{2}-\\d{2} )
-
+  \ed{2}-[a-z]{3}-\ed{2}  |  \ed{2}-\ed{2}-\ed{2} )
+.sp
 The condition is a positive lookahead assertion that matches an optional
 sequence of non-letters followed by a letter. In other words, it tests for the
 presence of at least one letter in the subject. If a letter is found, the
 subject is matched against the first alternative; otherwise it is matched
 against the second. This pattern matches strings in one of the two forms
 dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits.
-
+.
+.
+.\" HTML <a name="comments"></a>
 .SH COMMENTS
 .rs
 .sp
-The sequence (?# marks the start of a comment which continues up to the next
+The sequence (?# marks the start of a comment that continues up to the next
 closing parenthesis. Nested parentheses are not permitted. The characters
 that make up a comment play no part in the pattern matching at all.
-
+.P
 If the PCRE_EXTENDED option is set, an unescaped # character outside a
 character class introduces a comment that continues up to the next newline
 character in the pattern.
-
-.SH RECURSIVE PATTERNS
+.
+.
+.SH "RECURSIVE PATTERNS"
 .rs
 .sp
 Consider the problem of matching a string in parentheses, allowing for
 unlimited nested parentheses. Without the use of recursion, the best that can
 be done is to use a pattern that matches up to some fixed depth of nesting. It
-is not possible to handle an arbitrary nesting depth. Perl has provided an
-experimental facility that allows regular expressions to recurse (amongst other
-things). It does this by interpolating Perl code in the expression at run time,
-and the code can refer to the expression itself. A Perl pattern to solve the
-parentheses problem can be created like this:
-
-  $re = qr{\\( (?: (?>[^()]+) | (?p{$re}) )* \\)}x;
-
+is not possible to handle an arbitrary nesting depth. Perl provides a facility
+that allows regular expressions to recurse (amongst other things). It does this
+by interpolating Perl code in the expression at run time, and the code can
+refer to the expression itself. A Perl pattern to solve the parentheses problem
+can be created like this:
+.sp
+  $re = qr{\e( (?: (?>[^()]+) | (?p{$re}) )* \e)}x;
+.sp
 The (?p{...}) item interpolates Perl code at run time, and in this case refers
 recursively to the pattern in which it appears. Obviously, PCRE cannot support
 the interpolation of Perl code. Instead, it supports some special syntax for
 recursion of the entire pattern, and also for individual subpattern recursion.
-
+.P
 The special item that consists of (? followed by a number greater than zero and
 a closing parenthesis is a recursive call of the subpattern of the given
 number, provided that it occurs inside that subpattern. (If not, it is a
 "subroutine" call, which is described in the next section.) The special item
 (?R) is a recursive call of the entire regular expression.
-
+.P
 For example, this PCRE pattern solves the nested parentheses problem (assume
 the PCRE_EXTENDED option is set so that white space is ignored):
-
-  \\( ( (?>[^()]+) | (?R) )* \\)
-
+.sp
+  \e( ( (?>[^()]+) | (?R) )* \e)
+.sp
 First it matches an opening parenthesis. Then it matches any number of
 substrings which can either be a sequence of non-parentheses, or a recursive
 match of the pattern itself (that is a correctly parenthesized substring).
 Finally there is a closing parenthesis.
-
+.P
 If this were part of a larger pattern, you would not want to recurse the entire
 pattern, so instead you could use this:
-
-  ( \\( ( (?>[^()]+) | (?1) )* \\) )
-
+.sp
+  ( \e( ( (?>[^()]+) | (?1) )* \e) )
+.sp
 We have put the pattern into parentheses, and caused the recursion to refer to
 them instead of the whole pattern. In a larger pattern, keeping track of
 parenthesis numbers can be tricky. It may be more convenient to use named
 parentheses instead. For this, PCRE uses (?P>name), which is an extension to
 the Python syntax that PCRE uses for named parentheses (Perl does not provide
 named parentheses). We could rewrite the above example as follows:
-
-  (?<pn> \\( ( (?>[^()]+) | (?P>pn) )* \\) )
-
+.sp
+  (?P<pn> \e( ( (?>[^()]+) | (?P>pn) )* \e) )
+.sp
 This particular example pattern contains nested unlimited repeats, and so the
 use of atomic grouping for matching strings of non-parentheses is important
 when applying the pattern to strings that do not match. For example, when this
 pattern is applied to
-
+.sp
   (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
-
+.sp
 it yields "no match" quickly. However, if atomic grouping is not used,
 the match runs for a very long time indeed because there are so many different
 ways the + and * repeats can carve up the subject, and all have to be tested
 before failure can be reported.
-
+.P
 At the end of a match, the values set for any capturing subpatterns are those
 from the outermost level of the recursion at which the subpattern value is set.
 If you want to obtain intermediate values, a callout function can be used (see
-below and the
+the next section and the
 .\" HREF
-\fBpcrecallout\fR
+\fBpcrecallout\fP
 .\"
 documentation). If the pattern above is matched against
-
+.sp
   (ab(cd)ef)
-
+.sp
 the value for the capturing parentheses is "ef", which is the last value taken
 on at the top level. If additional parentheses are added, giving
-
-  \\( ( ( (?>[^()]+) | (?R) )* ) \\)
+.sp
+  \e( ( ( (?>[^()]+) | (?R) )* ) \e)
      ^                        ^
      ^                        ^
-
+.sp
 the string they capture is "ab(cd)ef", the contents of the top level
 parentheses. If there are more than 15 capturing parentheses in a pattern, PCRE
 has to obtain extra memory to store data during a recursion, which it does by
-using \fBpcre_malloc\fR, freeing it via \fBpcre_free\fR afterwards. If no
+using \fBpcre_malloc\fP, freeing it via \fBpcre_free\fP afterwards. If no
 memory can be obtained, the match fails with the PCRE_ERROR_NOMEMORY error.
-
+.P
 Do not confuse the (?R) item with the condition (R), which tests for recursion.
 Consider this pattern, which matches text in angle brackets, allowing for
 arbitrary nesting. Only digits are allowed in nested brackets (that is, when
 recursing), whereas any characters are permitted at the outer level.
-
-  < (?: (?(R) \\d++  | [^<>]*+) | (?R)) * >
-
+.sp
+  < (?: (?(R) \ed++  | [^<>]*+) | (?R)) * >
+.sp
 In this pattern, (?(R) is the start of a conditional subpattern, with two
 different alternatives for the recursive and non-recursive cases. The (?R) item
 is the actual recursive call.
-
+.
+.
 .\" HTML <a name="subpatternsassubroutines"></a>
-.SH SUBPATTERNS AS SUBROUTINES
+.SH "SUBPATTERNS AS SUBROUTINES"
 .rs
 .sp
 If the syntax for a recursive subpattern reference (either by number or by
 name) is used outside the parentheses to which it refers, it operates like a
 subroutine in a programming language. An earlier example pointed out that the
 pattern
-
-  (sens|respons)e and \\1ibility
-
+.sp
+  (sens|respons)e and \e1ibility
+.sp
 matches "sense and sensibility" and "response and responsibility", but not
 "sense and responsibility". If instead the pattern
-
+.sp
   (sens|respons)e and (?1)ibility
-
+.sp
 is used, it does match "sense and responsibility" as well as the other two
 strings. Such references must, however, follow the subpattern to which they
 refer.
-
+.
+.
 .SH CALLOUTS
 .rs
 .sp
@@ -1201,31 +1446,35 @@ Perl has a feature whereby using the seq
 code to be obeyed in the middle of matching a regular expression. This makes it
 possible, amongst other things, to extract different substrings that match the
 same pair of parentheses when there is a repetition.
-
+.P
 PCRE provides a similar feature, but of course it cannot obey arbitrary Perl
 code. The feature is called "callout". The caller of PCRE provides an external
-function by putting its entry point in the global variable \fIpcre_callout\fR.
+function by putting its entry point in the global variable \fIpcre_callout\fP.
 By default, this variable contains NULL, which disables all calling out.
-
+.P
 Within a regular expression, (?C) indicates the points at which the external
 function is to be called. If you want to identify different callout points, you
 can put a number less than 256 after the letter C. The default value is zero.
 For example, this pattern has two callout points:
-
+.sp
   (?C1)\dabc(?C2)def
-
-During matching, when PCRE reaches a callout point (and \fIpcre_callout\fR is
+.sp
+If the PCRE_AUTO_CALLOUT flag is passed to \fBpcre_compile()\fP, callouts are
+automatically installed before each item in the pattern. They are all numbered
+255.
+.P
+During matching, when PCRE reaches a callout point (and \fIpcre_callout\fP is
 set), the external function is called. It is provided with the number of the
-callout, and, optionally, one item of data originally supplied by the caller of
-\fBpcre_exec()\fR. The callout function may cause matching to backtrack, or to
-fail altogether. A complete description of the interface to the callout
-function is given in the
+callout, the position in the pattern, and, optionally, one item of data
+originally supplied by the caller of \fBpcre_exec()\fP. The callout function
+may cause matching to proceed, to backtrack, or to fail altogether. A complete
+description of the interface to the callout function is given in the
 .\" HREF
-\fBpcrecallout\fR
+\fBpcrecallout\fP
 .\"
 documentation.
-
+.P
 .in 0
-Last updated: 03 February 2003
+Last updated: 28 February 2005
 .br
-Copyright (c) 1997-2003 University of Cambridge.
+Copyright (c) 1997-2005 University of Cambridge.
diff -Nurp tin-1.6.2/pcre/get.c tin-1.8.0/pcre/get.c
--- tin-1.6.2/pcre/get.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/get.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,349 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2003 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-/* This module contains some convenience functions for extracting substrings
-from the subject string after a regex match has succeeded. The original idea
-for these functions came from Scott Wimer <scottw@cgibuilder.com>. */
-
-
-/* Include the internals header, which itself includes Standard C headers plus
-the external pcre header. */
-
-#include "internal.h"
-
-
-/*************************************************
-*           Find number for named string         *
-*************************************************/
-
-/* This function is used by the two extraction functions below, as well
-as being generally available.
-
-Arguments:
-  code        the compiled regex
-  stringname  the name whose number is required
-
-Returns:      the number of the named parentheses, or a negative number
-                (PCRE_ERROR_NOSUBSTRING) if not found
-*/
-
-int
-pcre_get_stringnumber(const pcre *code, const char *stringname)
-{
-int rc;
-int entrysize;
-int top, bot;
-uschar *nametable;
-
-if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
-  return rc;
-if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
-
-if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
-  return rc;
-if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
-  return rc;
-
-bot = 0;
-while (top > bot)
-  {
-  int mid = (top + bot) / 2;
-  uschar *entry = nametable + entrysize*mid;
-  int c = strcmp(stringname, (char *)(entry + 2));
-  if (c == 0) return (entry[0] << 8) + entry[1];
-  if (c > 0) bot = mid + 1; else top = mid;
-  }
-
-return PCRE_ERROR_NOSUBSTRING;
-}
-
-
-
-/*************************************************
-*      Copy captured string to given buffer      *
-*************************************************/
-
-/* This function copies a single captured substring into a given buffer.
-Note that we use memcpy() rather than strncpy() in case there are binary zeros
-in the string.
-
-Arguments:
-  subject        the subject string that was matched
-  ovector        pointer to the offsets table
-  stringcount    the number of substrings that were captured
-                   (i.e. the yield of the pcre_exec call, unless
-                   that was zero, in which case it should be 1/3
-                   of the offset table size)
-  stringnumber   the number of the required substring
-  buffer         where to put the substring
-  size           the size of the buffer
-
-Returns:         if successful:
-                   the length of the copied string, not including the zero
-                   that is put on the end; can be zero
-                 if not successful:
-                   PCRE_ERROR_NOMEMORY (-6) buffer too small
-                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
-*/
-
-int
-pcre_copy_substring(const char *subject, int *ovector, int stringcount,
-  int stringnumber, char *buffer, int size)
-{
-int yield;
-if (stringnumber < 0 || stringnumber >= stringcount)
-  return PCRE_ERROR_NOSUBSTRING;
-stringnumber *= 2;
-yield = ovector[stringnumber+1] - ovector[stringnumber];
-if (size < yield + 1) return PCRE_ERROR_NOMEMORY;
-memcpy(buffer, subject + ovector[stringnumber], yield);
-buffer[yield] = 0;
-return yield;
-}
-
-
-
-/*************************************************
-*   Copy named captured string to given buffer   *
-*************************************************/
-
-/* This function copies a single captured substring into a given buffer,
-identifying it by name.
-
-Arguments:
-  code           the compiled regex
-  subject        the subject string that was matched
-  ovector        pointer to the offsets table
-  stringcount    the number of substrings that were captured
-                   (i.e. the yield of the pcre_exec call, unless
-                   that was zero, in which case it should be 1/3
-                   of the offset table size)
-  stringname     the name of the required substring
-  buffer         where to put the substring
-  size           the size of the buffer
-
-Returns:         if successful:
-                   the length of the copied string, not including the zero
-                   that is put on the end; can be zero
-                 if not successful:
-                   PCRE_ERROR_NOMEMORY (-6) buffer too small
-                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
-*/
-
-int
-pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector,
-  int stringcount, const char *stringname, char *buffer, int size)
-{
-int n = pcre_get_stringnumber(code, stringname);
-if (n <= 0) return n;
-return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);
-}
-
-
-
-/*************************************************
-*      Copy all captured strings to new store    *
-*************************************************/
-
-/* This function gets one chunk of store and builds a list of pointers and all
-of the captured substrings in it. A NULL pointer is put on the end of the list.
-
-Arguments:
-  subject        the subject string that was matched
-  ovector        pointer to the offsets table
-  stringcount    the number of substrings that were captured
-                   (i.e. the yield of the pcre_exec call, unless
-                   that was zero, in which case it should be 1/3
-                   of the offset table size)
-  listptr        set to point to the list of pointers
-
-Returns:         if successful: 0
-                 if not successful:
-                   PCRE_ERROR_NOMEMORY (-6) failed to get store
-*/
-
-int
-pcre_get_substring_list(const char *subject, int *ovector, int stringcount,
-  const char ***listptr)
-{
-int i;
-int size = sizeof(char *);
-int double_count = stringcount * 2;
-char **stringlist;
-char *p;
-
-for (i = 0; i < double_count; i += 2)
-  size += sizeof(char *) + ovector[i+1] - ovector[i] + 1;
-
-stringlist = (char **)(pcre_malloc)(size);
-if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
-
-*listptr = (const char **)stringlist;
-p = (char *)(stringlist + stringcount + 1);
-
-for (i = 0; i < double_count; i += 2)
-  {
-  int len = ovector[i+1] - ovector[i];
-  memcpy(p, subject + ovector[i], len);
-  *stringlist++ = p;
-  p += len;
-  *p++ = 0;
-  }
-
-*stringlist = NULL;
-return 0;
-}
-
-
-
-/*************************************************
-*   Free store obtained by get_substring_list    *
-*************************************************/
-
-/* This function exists for the benefit of people calling PCRE from non-C
-programs that can call its functions, but not free() or (pcre_free)() directly.
-
-Argument:   the result of a previous pcre_get_substring_list()
-Returns:    nothing
-*/
-
-void
-pcre_free_substring_list(const char **pointer)
-{
-(pcre_free)((void *)pointer);
-}
-
-
-
-/*************************************************
-*      Copy captured string to new store         *
-*************************************************/
-
-/* This function copies a single captured substring into a piece of new
-store
-
-Arguments:
-  subject        the subject string that was matched
-  ovector        pointer to the offsets table
-  stringcount    the number of substrings that were captured
-                   (i.e. the yield of the pcre_exec call, unless
-                   that was zero, in which case it should be 1/3
-                   of the offset table size)
-  stringnumber   the number of the required substring
-  stringptr      where to put a pointer to the substring
-
-Returns:         if successful:
-                   the length of the string, not including the zero that
-                   is put on the end; can be zero
-                 if not successful:
-                   PCRE_ERROR_NOMEMORY (-6) failed to get store
-                   PCRE_ERROR_NOSUBSTRING (-7) substring not present
-*/
-
-int
-pcre_get_substring(const char *subject, int *ovector, int stringcount,
-  int stringnumber, const char **stringptr)
-{
-int yield;
-char *substring;
-if (stringnumber < 0 || stringnumber >= stringcount)
-  return PCRE_ERROR_NOSUBSTRING;
-stringnumber *= 2;
-yield = ovector[stringnumber+1] - ovector[stringnumber];
-substring = (char *)(pcre_malloc)(yield + 1);
-if (substring == NULL) return PCRE_ERROR_NOMEMORY;
-memcpy(substring, subject + ovector[stringnumber], yield);
-substring[yield] = 0;
-*stringptr = substring;
-return yield;
-}
-
-
-
-/*************************************************
-*   Copy named captured string to new store      *
-*************************************************/
-
-/* This function copies a single captured substring, identified by name, into
-new store.
-
-Arguments:
-  code           the compiled regex
-  subject        the subject string that was matched
-  ovector        pointer to the offsets table
-  stringcount    the number of substrings that were captured
-                   (i.e. the yield of the pcre_exec call, unless
-                   that was zero, in which case it should be 1/3
-                   of the offset table size)
-  stringname     the name of the required substring
-  stringptr      where to put the pointer
-
-Returns:         if successful:
-                   the length of the copied string, not including the zero
-                   that is put on the end; can be zero
-                 if not successful:
-                   PCRE_ERROR_NOMEMORY (-6) couldn't get memory
-                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
-*/
-
-int
-pcre_get_named_substring(const pcre *code, const char *subject, int *ovector,
-  int stringcount, const char *stringname, const char **stringptr)
-{
-int n = pcre_get_stringnumber(code, stringname);
-if (n <= 0) return n;
-return pcre_get_substring(subject, ovector, stringcount, n, stringptr);
-}
-
-
-
-
-/*************************************************
-*       Free store obtained by get_substring     *
-*************************************************/
-
-/* This function exists for the benefit of people calling PCRE from non-C
-programs that can call its functions, but not free() or (pcre_free)() directly.
-
-Argument:   the result of a previous pcre_get_substring()
-Returns:    nothing
-*/
-
-void
-pcre_free_substring(const char *pointer)
-{
-(pcre_free)((void *)pointer);
-}
-
-/* End of get.c */
diff -Nurp tin-1.6.2/pcre/internal.h tin-1.8.0/pcre/internal.h
--- tin-1.6.2/pcre/internal.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/internal.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,662 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-
-/* This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2003 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-/* This header contains definitions that are shared between the different
-modules, but which are not relevant to the outside. */
-
-/* Get the definitions provided by running "configure" */
-
-#include "config.h"
-
-/* When compiling for use with the Virtual Pascal compiler, these functions
-need to have their names changed. PCRE must be compiled with the -DVPCOMPAT
-option on the command line. */
-
-#ifdef VPCOMPAT
-#define strncmp(s1,s2,m) _strncmp(s1,s2,m)
-#define memcpy(d,s,n)    _memcpy(d,s,n)
-#define memmove(d,s,n)   _memmove(d,s,n)
-#define memset(s,c,n)    _memset(s,c,n)
-#else  /* VPCOMPAT */
-
-/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(),
-define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY
-is set. Otherwise, include an emulating function for those systems that have
-neither (there some non-Unix environments where this is the case). This assumes
-that all calls to memmove are moving strings upwards in store, which is the
-case in PCRE. */
-
-#if ! HAVE_MEMMOVE
-#undef  memmove        /* some systems may have a macro */
-#if HAVE_BCOPY
-#define memmove(a, b, c) bcopy(b, a, c)
-#else  /* HAVE_BCOPY */
-void *
-pcre_memmove(unsigned char *dest, const unsigned char *src, size_t n)
-{
-int i;
-dest += n;
-src += n;
-for (i = 0; i < n; ++i) *(--dest) =  *(--src);
-}
-#define memmove(a, b, c) pcre_memmove(a, b, c)
-#endif   /* not HAVE_BCOPY */
-#endif   /* not HAVE_MEMMOVE */
-#endif   /* not VPCOMPAT */
-
-
-/* PCRE keeps offsets in its compiled code as 2-byte quantities by default.
-These are used, for example, to link from the start of a subpattern to its
-alternatives and its end. The use of 2 bytes per offset limits the size of the
-compiled regex to around 64K, which is big enough for almost everybody.
-However, I received a request for an even bigger limit. For this reason, and
-also to make the code easier to maintain, the storing and loading of offsets
-from the byte string is now handled by the macros that are defined here.
-
-The macros are controlled by the value of LINK_SIZE. This defaults to 2 in
-the config.h file, but can be overridden by using -D on the command line. This
-is automated on Unix systems via the "configure" command. */
-
-#if LINK_SIZE == 2
-
-#define PUT(a,n,d)   \
-  (a[n] = (d) >> 8), \
-  (a[(n)+1] = (d) & 255)
-
-#define GET(a,n) \
-  (((a)[n] << 8) | (a)[(n)+1])
-
-#define MAX_PATTERN_SIZE (1 << 16)
-
-
-#elif LINK_SIZE == 3
-
-#define PUT(a,n,d)       \
-  (a[n] = (d) >> 16),    \
-  (a[(n)+1] = (d) >> 8), \
-  (a[(n)+2] = (d) & 255)
-
-#define GET(a,n) \
-  (((a)[n] << 16) | ((a)[(n)+1] << 8) | (a)[(n)+2])
-
-#define MAX_PATTERN_SIZE (1 << 24)
-
-
-#elif LINK_SIZE == 4
-
-#define PUT(a,n,d)        \
-  (a[n] = (d) >> 24),     \
-  (a[(n)+1] = (d) >> 16), \
-  (a[(n)+2] = (d) >> 8),  \
-  (a[(n)+3] = (d) & 255)
-
-#define GET(a,n) \
-  (((a)[n] << 24) | ((a)[(n)+1] << 16) | ((a)[(n)+2] << 8) | (a)[(n)+3])
-
-#define MAX_PATTERN_SIZE (1 << 30)   /* Keep it positive */
-
-
-#else
-#error LINK_SIZE must be either 2, 3, or 4
-#endif
-
-
-/* Convenience macro defined in terms of the others */
-
-#define PUTINC(a,n,d)   PUT(a,n,d), a += LINK_SIZE
-
-
-/* PCRE uses some other 2-byte quantities that do not change when the size of
-offsets changes. There are used for repeat counts and for other things such as
-capturing parenthesis numbers in back references. */
-
-#define PUT2(a,n,d)   \
-  a[n] = (d) >> 8; \
-  a[(n)+1] = (d) & 255
-
-#define GET2(a,n) \
-  (((a)[n] << 8) | (a)[(n)+1])
-
-#define PUT2INC(a,n,d)  PUT2(a,n,d), a += 2
-
-
-/* Standard C headers plus the external interface definition */
-
-#include <ctype.h>
-#include <limits.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifndef PCRE_SPY
-#define PCRE_DEFINITION       /* Win32 __declspec(export) trigger for .dll */
-#endif
-
-#include "pcre.h"
-
-/* In case there is no definition of offsetof() provided - though any proper
-Standard C system should have one. */
-
-#ifndef offsetof
-#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field))
-#endif
-
-/* These are the public options that can change during matching. */
-
-#define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL)
-
-/* Private options flags start at the most significant end of the four bytes,
-but skip the top bit so we can use ints for convenience without getting tangled
-with negative values. The public options defined in pcre.h start at the least
-significant end. Make sure they don't overlap, though now that we have expanded
-to four bytes there is plenty of space. */
-
-#define PCRE_FIRSTSET      0x40000000  /* first_byte is set */
-#define PCRE_REQCHSET      0x20000000  /* req_byte is set */
-#define PCRE_STARTLINE     0x10000000  /* start after \n for multiline */
-#define PCRE_ICHANGED      0x08000000  /* i option changes within regex */
-
-/* Options for the "extra" block produced by pcre_study(). */
-
-#define PCRE_STUDY_MAPPED   0x01     /* a map of starting chars exists */
-
-/* Masks for identifying the public options which are permitted at compile
-time, run time or study time, respectively. */
-
-#define PUBLIC_OPTIONS \
-  (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \
-   PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \
-   PCRE_NO_AUTO_CAPTURE)
-
-#define PUBLIC_EXEC_OPTIONS \
-  (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY)
-
-#define PUBLIC_STUDY_OPTIONS 0   /* None defined */
-
-/* Magic number to provide a small check against being handed junk. */
-
-#define MAGIC_NUMBER  0x50435245UL   /* 'PCRE' */
-
-/* Negative values for the firstchar and reqchar variables */
-
-#define REQ_UNSET (-2)
-#define REQ_NONE  (-1)
-
-/* Flags added to firstbyte or reqbyte; a "non-literal" item is either a
-variable-length repeat, or a anything other than literal characters. */
-
-#define REQ_CASELESS 0x0100    /* indicates caselessness */
-#define REQ_VARY     0x0200    /* reqbyte followed non-literal item */
-
-/* Miscellaneous definitions */
-
-typedef int BOOL;
-
-#define FALSE   0
-#define TRUE    1
-
-/* Escape items that are just an encoding of a particular data value. Note that
-ESC_n is defined as yet another macro, which is set in config.h to either \n
-(the default) or \r (which some people want). */
-
-#ifndef ESC_e
-#define ESC_e 27
-#endif
-
-#ifndef ESC_f
-#define ESC_f '\f'
-#endif
-
-#ifndef ESC_n
-#define ESC_n NEWLINE
-#endif
-
-#ifndef ESC_r
-#define ESC_r '\r'
-#endif
-
-/* We can't officially use ESC_t because it is a POSIX reserved identifier
-(presumably because of all the others like size_t). */
-
-#ifndef ESC_tee
-#define ESC_tee '\t'
-#endif
-
-/* These are escaped items that aren't just an encoding of a particular data
-value such as \n. They must have non-zero values, as check_escape() returns
-their negation. Also, they must appear in the same order as in the opcode
-definitions below, up to ESC_z. There's a dummy for OP_ANY because it
-corresponds to "." rather than an escape sequence. The final one must be
-ESC_REF as subsequent values are used for \1, \2, \3, etc. There is are two
-tests in the code for an escape greater than ESC_b and less than ESC_Z to
-detect the types that may be repeated. These are the types that consume a
-character. If any new escapes are put in between that don't consume a
-character, that code will have to change. */
-
-enum { ESC_A = 1, ESC_G, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W,
-       ESC_w, ESC_dum1, ESC_C, ESC_Z, ESC_z, ESC_E, ESC_Q, ESC_REF };
-
-/* Flag bits and data types for the extended class (OP_XCLASS) for classes that
-contain UTF-8 characters with values greater than 255. */
-
-#define XCL_NOT    0x01    /* Flag: this is a negative class */
-#define XCL_MAP    0x02    /* Flag: a 32-byte map is present */
-
-#define XCL_END       0    /* Marks end of individual items */
-#define XCL_SINGLE    1    /* Single item (one multibyte char) follows */
-#define XCL_RANGE     2    /* A range (two multibyte chars) follows */
-
-
-/* Opcode table: OP_BRA must be last, as all values >= it are used for brackets
-that extract substrings. Starting from 1 (i.e. after OP_END), the values up to
-OP_EOD must correspond in order to the list of escapes immediately above.
-Note that whenever this list is updated, the two macro definitions that follow
-must also be updated to match. */
-
-enum {
-  OP_END,            /* 0 End of pattern */
-
-  /* Values corresponding to backslashed metacharacters */
-
-  OP_SOD,            /* 1 Start of data: \A */
-  OP_SOM,            /* 2 Start of match (subject + offset): \G */
-  OP_NOT_WORD_BOUNDARY,  /*  3 \B */
-  OP_WORD_BOUNDARY,      /*  4 \b */
-  OP_NOT_DIGIT,          /*  5 \D */
-  OP_DIGIT,              /*  6 \d */
-  OP_NOT_WHITESPACE,     /*  7 \S */
-  OP_WHITESPACE,         /*  8 \s */
-  OP_NOT_WORDCHAR,       /*  9 \W */
-  OP_WORDCHAR,           /* 10 \w */
-  OP_ANY,            /* 11 Match any character */
-  OP_ANYBYTE,        /* 12 Match any byte (\C); different to OP_ANY for UTF-8 */
-  OP_EODN,           /* 13 End of data or \n at end of data: \Z. */
-  OP_EOD,            /* 14 End of data: \z */
-
-  OP_OPT,            /* 15 Set runtime options */
-  OP_CIRC,           /* 16 Start of line - varies with multiline switch */
-  OP_DOLL,           /* 17 End of line - varies with multiline switch */
-  OP_CHARS,          /* 18 Match string of characters */
-  OP_NOT,            /* 19 Match anything but the following char */
-
-  OP_STAR,           /* 20 The maximizing and minimizing versions of */
-  OP_MINSTAR,        /* 21 all these opcodes must come in pairs, with */
-  OP_PLUS,           /* 22 the minimizing one second. */
-  OP_MINPLUS,        /* 23 This first set applies to single characters */
-  OP_QUERY,          /* 24 */
-  OP_MINQUERY,       /* 25 */
-  OP_UPTO,           /* 26 From 0 to n matches */
-  OP_MINUPTO,        /* 27 */
-  OP_EXACT,          /* 28 Exactly n matches */
-
-  OP_NOTSTAR,        /* 29 The maximizing and minimizing versions of */
-  OP_NOTMINSTAR,     /* 30 all these opcodes must come in pairs, with */
-  OP_NOTPLUS,        /* 31 the minimizing one second. */
-  OP_NOTMINPLUS,     /* 32 This set applies to "not" single characters */
-  OP_NOTQUERY,       /* 33 */
-  OP_NOTMINQUERY,    /* 34 */
-  OP_NOTUPTO,        /* 35 From 0 to n matches */
-  OP_NOTMINUPTO,     /* 36 */
-  OP_NOTEXACT,       /* 37 Exactly n matches */
-
-  OP_TYPESTAR,       /* 38 The maximizing and minimizing versions of */
-  OP_TYPEMINSTAR,    /* 39 all these opcodes must come in pairs, with */
-  OP_TYPEPLUS,       /* 40 the minimizing one second. These codes must */
-  OP_TYPEMINPLUS,    /* 41 be in exactly the same order as those above. */
-  OP_TYPEQUERY,      /* 42 This set applies to character types such as \d */
-  OP_TYPEMINQUERY,   /* 43 */
-  OP_TYPEUPTO,       /* 44 From 0 to n matches */
-  OP_TYPEMINUPTO,    /* 45 */
-  OP_TYPEEXACT,      /* 46 Exactly n matches */
-
-  OP_CRSTAR,         /* 47 The maximizing and minimizing versions of */
-  OP_CRMINSTAR,      /* 48 all these opcodes must come in pairs, with */
-  OP_CRPLUS,         /* 49 the minimizing one second. These codes must */
-  OP_CRMINPLUS,      /* 50 be in exactly the same order as those above. */
-  OP_CRQUERY,        /* 51 These are for character classes and back refs */
-  OP_CRMINQUERY,     /* 52 */
-  OP_CRRANGE,        /* 53 These are different to the three seta above. */
-  OP_CRMINRANGE,     /* 54 */
-
-  OP_CLASS,          /* 55 Match a character class, chars < 256 only */
-  OP_NCLASS,         /* 56 Same, but the bitmap was created from a negative
-                           class - the difference is relevant only when a UTF-8
-                           character > 255 is encountered. */
-
-  OP_XCLASS,         /* 56 Extended class for handling UTF-8 chars within the
-                           class. This does both positive and negative. */
-
-  OP_REF,            /* 57 Match a back reference */
-  OP_RECURSE,        /* 58 Match a numbered subpattern (possibly recursive) */
-  OP_CALLOUT,        /* 59 Call out to external function if provided */
-
-  OP_ALT,            /* 60 Start of alternation */
-  OP_KET,            /* 61 End of group that doesn't have an unbounded repeat */
-  OP_KETRMAX,        /* 62 These two must remain together and in this */
-  OP_KETRMIN,        /* 63 order. They are for groups the repeat for ever. */
-
-  /* The assertions must come before ONCE and COND */
-
-  OP_ASSERT,         /* 64 Positive lookahead */
-  OP_ASSERT_NOT,     /* 65 Negative lookahead */
-  OP_ASSERTBACK,     /* 66 Positive lookbehind */
-  OP_ASSERTBACK_NOT, /* 67 Negative lookbehind */
-  OP_REVERSE,        /* 68 Move pointer back - used in lookbehind assertions */
-
-  /* ONCE and COND must come after the assertions, with ONCE first, as there's
-  a test for >= ONCE for a subpattern that isn't an assertion. */
-
-  OP_ONCE,           /* 69 Once matched, don't back up into the subpattern */
-  OP_COND,           /* 70 Conditional group */
-  OP_CREF,           /* 71 Used to hold an extraction string number (cond ref) */
-
-  OP_BRAZERO,        /* 72 These two must remain together and in this */
-  OP_BRAMINZERO,     /* 73 order. */
-
-  OP_BRANUMBER,      /* 74 Used for extracting brackets whose number is greater
-                           than can fit into an opcode. */
-
-  OP_BRA             /* 75 This and greater values are used for brackets that
-                           extract substrings up to a basic limit. After that,
-                           use is made of OP_BRANUMBER. */
-};
-
-/* WARNING: There is an implicit assumption in study.c that all opcodes are
-less than 128 in value. This makes handling UTF-8 character sequences easier.
-*/
-
-
-/* This macro defines textual names for all the opcodes. There are used only
-for debugging, in pcre.c when DEBUG is defined, and also in pcretest.c. The
-macro is referenced only in printint.c. */
-
-#define OP_NAME_LIST \
-  "End", "\\A", "\\G", "\\B", "\\b", "\\D", "\\d",                \
-  "\\S", "\\s", "\\W", "\\w", "Any", "Anybyte", "\\Z", "\\z",     \
-  "Opt", "^", "$", "chars", "not",                                \
-  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",                 \
-  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",                 \
-  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",                 \
-  "*", "*?", "+", "+?", "?", "??", "{", "{",                      \
-  "class", "nclass", "xclass", "Ref", "Recurse", "Callout",       \
-  "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not",     \
-  "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cond ref",\
-  "Brazero", "Braminzero", "Branumber", "Bra"
-
-
-/* This macro defines the length of fixed length operations in the compiled
-regex. The lengths are used when searching for specific things, and also in the
-debugging printing of a compiled regex. We use a macro so that it can be
-incorporated both into pcre.c and pcretest.c without being publicly exposed.
-
-As things have been extended, some of these are no longer fixed lenths, but are
-minima instead. For example, the length of a single-character repeat may vary
-in UTF-8 mode. The code that uses this table must know about such things. */
-
-#define OP_LENGTHS \
-  1,                             /* End                                    */ \
-  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  /* \A, \G, \B, \B, \D, \d, \S, \s, \W, \w */ \
-  1, 1, 1, 1, 2, 1, 1,           /* Any, Anybyte, \Z, \z, Opt, ^, $        */ \
-  2,                             /* Chars - the minimum length             */ \
-  2,                             /* not                                    */ \
-  /* Positive single-char repeats                                          */ \
-  2, 2, 2, 2, 2, 2,              /* *, *?, +, +?, ?, ??      ** These are  */ \
-  4, 4, 4,                       /* upto, minupto, exact     ** minima     */ \
-  /* Negative single-char repeats                                          */ \
-  2, 2, 2, 2, 2, 2,              /* NOT *, *?, +, +?, ?, ??                */ \
-  4, 4, 4,                       /* NOT upto, minupto, exact               */ \
-  /* Positive type repeats                                                 */ \
-  2, 2, 2, 2, 2, 2,              /* Type *, *?, +, +?, ?, ??               */ \
-  4, 4, 4,                       /* Type upto, minupto, exact              */ \
-  /* Character class & ref repeats                                         */ \
-  1, 1, 1, 1, 1, 1,              /* *, *?, +, +?, ?, ??                    */ \
-  5, 5,                          /* CRRANGE, CRMINRANGE                    */ \
- 33,                             /* CLASS                                  */ \
- 33,                             /* NCLASS                                 */ \
-  0,                             /* XCLASS - variable length               */ \
-  3,                             /* REF                                    */ \
-  1+LINK_SIZE,                   /* RECURSE                                */ \
-  2,                             /* CALLOUT                                */ \
-  1+LINK_SIZE,                   /* Alt                                    */ \
-  1+LINK_SIZE,                   /* Ket                                    */ \
-  1+LINK_SIZE,                   /* KetRmax                                */ \
-  1+LINK_SIZE,                   /* KetRmin                                */ \
-  1+LINK_SIZE,                   /* Assert                                 */ \
-  1+LINK_SIZE,                   /* Assert not                             */ \
-  1+LINK_SIZE,                   /* Assert behind                          */ \
-  1+LINK_SIZE,                   /* Assert behind not                      */ \
-  1+LINK_SIZE,                   /* Reverse                                */ \
-  1+LINK_SIZE,                   /* Once                                   */ \
-  1+LINK_SIZE,                   /* COND                                   */ \
-  3,                             /* CREF                                   */ \
-  1, 1,                          /* BRAZERO, BRAMINZERO                    */ \
-  3,                             /* BRANUMBER                              */ \
-  1+LINK_SIZE                    /* BRA                                    */ \
-
-
-/* The highest extraction number before we have to start using additional
-bytes. (Originally PCRE didn't have support for extraction counts highter than
-this number.) The value is limited by the number of opcodes left after OP_BRA,
-i.e. 255 - OP_BRA. We actually set it a bit lower to leave room for additional
-opcodes. */
-
-#define EXTRACT_BASIC_MAX  150
-
-/* A magic value for OP_CREF to indicate the "in recursion" condition. */
-
-#define CREF_RECURSE  0xffff
-
-/* The texts of compile-time error messages are defined as macros here so that
-they can be accessed by the POSIX wrapper and converted into error codes.  Yes,
-I could have used error codes in the first place, but didn't feel like changing
-just to accommodate the POSIX wrapper. */
-
-#define ERR1  "\\ at end of pattern"
-#define ERR2  "\\c at end of pattern"
-#define ERR3  "unrecognized character follows \\"
-#define ERR4  "numbers out of order in {} quantifier"
-#define ERR5  "number too big in {} quantifier"
-#define ERR6  "missing terminating ] for character class"
-#define ERR7  "invalid escape sequence in character class"
-#define ERR8  "range out of order in character class"
-#define ERR9  "nothing to repeat"
-#define ERR10 "operand of unlimited repeat could match the empty string"
-#define ERR11 "internal error: unexpected repeat"
-#define ERR12 "unrecognized character after (?"
-#define ERR13 "POSIX named classes are supported only within a class"
-#define ERR14 "missing )"
-#define ERR15 "reference to non-existent subpattern"
-#define ERR16 "erroffset passed as NULL"
-#define ERR17 "unknown option bit(s) set"
-#define ERR18 "missing ) after comment"
-#define ERR19 "parentheses nested too deeply"
-#define ERR20 "regular expression too large"
-#define ERR21 "failed to get memory"
-#define ERR22 "unmatched parentheses"
-#define ERR23 "internal error: code overflow"
-#define ERR24 "unrecognized character after (?<"
-#define ERR25 "lookbehind assertion is not fixed length"
-#define ERR26 "malformed number after (?("
-#define ERR27 "conditional group contains more than two branches"
-#define ERR28 "assertion expected after (?("
-#define ERR29 "(?R or (?digits must be followed by )"
-#define ERR30 "unknown POSIX class name"
-#define ERR31 "POSIX collating elements are not supported"
-#define ERR32 "this version of PCRE is not compiled with PCRE_UTF8 support"
-#define ERR33 "spare error"
-#define ERR34 "character value in \\x{...} sequence is too large"
-#define ERR35 "invalid condition (?(0)"
-#define ERR36 "\\C not allowed in lookbehind assertion"
-#define ERR37 "PCRE does not support \\L, \\l, \\N, \\P, \\p, \\U, \\u, or \\X"
-#define ERR38 "number after (?C is > 255"
-#define ERR39 "closing ) for (?C expected"
-#define ERR40 "recursive call could loop indefinitely"
-#define ERR41 "unrecognized character after (?P"
-#define ERR42 "syntax error after (?P"
-#define ERR43 "two named groups have the same name"
-
-/* All character handling must be done as unsigned characters. Otherwise there
-are problems with top-bit-set characters and functions such as isspace().
-However, we leave the interface to the outside world as char *, because that
-should make things easier for callers. We define a short type for unsigned char
-to save lots of typing. I tried "uchar", but it causes problems on Digital
-Unix, where it is defined in sys/types, so use "uschar" instead. */
-
-typedef unsigned char uschar;
-
-/* The real format of the start of the pcre block; the index of names and the
-code vector run on as long as necessary after the end. */
-
-typedef struct real_pcre {
-  unsigned long int magic_number;
-  size_t size;                        /* Total that was malloced */
-  const unsigned char *tables;        /* Pointer to tables */
-  unsigned long int options;
-  unsigned short int top_bracket;
-  unsigned short int top_backref;
-  unsigned short int first_byte;
-  unsigned short int req_byte;
-  unsigned short int name_entry_size; /* Size of any name items; 0 => none */
-  unsigned short int name_count;      /* Number of name items */
-} real_pcre;
-
-/* The format of the block used to store data from pcre_study(). */
-
-typedef struct pcre_study_data {
-  size_t size;                        /* Total that was malloced */
-  uschar options;
-  uschar start_bits[32];
-} pcre_study_data;
-
-/* Structure for passing "static" information around between the functions
-doing the compiling, so that they are thread-safe. */
-
-typedef struct compile_data {
-  const uschar *lcc;            /* Points to lower casing table */
-  const uschar *fcc;            /* Points to case-flipping table */
-  const uschar *cbits;          /* Points to character type table */
-  const uschar *ctypes;         /* Points to table of type maps */
-  const uschar *start_code;     /* The start of the compiled code */
-  uschar *name_table;           /* The name/number table */
-  int  names_found;             /* Number of entries so far */
-  int  name_entry_size;         /* Size of each entry */
-  int  top_backref;             /* Maximum back reference */
-  unsigned int backref_map;     /* Bitmap of low back refs */
-  int  req_varyopt;             /* "After variable item" flag for reqbyte */
-} compile_data;
-
-/* Structure for maintaining a chain of pointers to the currently incomplete
-branches, for testing for left recursion. */
-
-typedef struct branch_chain {
-  struct branch_chain *outer;
-  uschar *current;
-} branch_chain;
-
-/* Structure for items in a linked list that represents an explicit recursive
-call within the pattern. */
-
-typedef struct recursion_info {
-  struct recursion_info *prev;  /* Previous recursion record (or NULL) */
-  int group_num;                /* Number of group that was called */
-  const uschar *after_call;     /* "Return value": points after the call in the expr */
-  const uschar *save_start;     /* Old value of md->start_match */
-  int *offset_save;             /* Pointer to start of saved offsets */
-  int saved_max;                /* Number of saved offsets */
-} recursion_info;
-
-/* Structure for passing "static" information around between the functions
-doing the matching, so that they are thread-safe. */
-
-typedef struct match_data {
-  unsigned long int match_call_count; /* As it says */
-  unsigned long int match_limit;/* As it says */
-  int   *offset_vector;         /* Offset vector */
-  int    offset_end;            /* One past the end */
-  int    offset_max;            /* The maximum usable for return data */
-  const uschar *lcc;            /* Points to lower casing table */
-  const uschar *ctypes;         /* Points to table of type maps */
-  BOOL   offset_overflow;       /* Set if too many extractions */
-  BOOL   notbol;                /* NOTBOL flag */
-  BOOL   noteol;                /* NOTEOL flag */
-  BOOL   utf8;                  /* UTF8 flag */
-  BOOL   endonly;               /* Dollar not before final \n */
-  BOOL   notempty;              /* Empty string match not wanted */
-  const uschar *start_code;     /* For use when recursing */
-  const uschar *start_subject;  /* Start of the subject string */
-  const uschar *end_subject;    /* End of the subject string */
-  const uschar *start_match;    /* Start of this match attempt */
-  const uschar *end_match_ptr;  /* Subject position at end match */
-  int    end_offset_top;        /* Highwater mark at end of match */
-  int    capture_last;          /* Most recent capture number */
-  int    start_offset;          /* The start offset value */
-  recursion_info *recursive;    /* Linked list of recursion data */
-  void  *callout_data;          /* To pass back to callouts */
-} match_data;
-
-/* Bit definitions for entries in the pcre_ctypes table. */
-
-#define ctype_space   0x01
-#define ctype_letter  0x02
-#define ctype_digit   0x04
-#define ctype_xdigit  0x08
-#define ctype_word    0x10   /* alphameric or '_' */
-#define ctype_meta    0x80   /* regexp meta char or zero (end pattern) */
-
-/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set
-of bits for a class map. Some classes are built by combining these tables. */
-
-#define cbit_space     0      /* [:space:] or \s */
-#define cbit_xdigit   32      /* [:xdigit:] */
-#define cbit_digit    64      /* [:digit:] or \d */
-#define cbit_upper    96      /* [:upper:] */
-#define cbit_lower   128      /* [:lower:] */
-#define cbit_word    160      /* [:word:] or \w */
-#define cbit_graph   192      /* [:graph:] */
-#define cbit_print   224      /* [:print:] */
-#define cbit_punct   256      /* [:punct:] */
-#define cbit_cntrl   288      /* [:cntrl:] */
-#define cbit_length  320      /* Length of the cbits table */
-
-/* Offsets of the various tables from the base tables pointer, and
-total length. */
-
-#define lcc_offset      0
-#define fcc_offset    256
-#define cbits_offset  512
-#define ctypes_offset (cbits_offset + cbit_length)
-#define tables_length (ctypes_offset + 256)
-
-/* End of internal.h */
diff -Nurp tin-1.6.2/pcre/maketables.c tin-1.8.0/pcre/maketables.c
--- tin-1.6.2/pcre/maketables.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/maketables.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,136 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-/*
-PCRE is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2003 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-
-See the file Tech.Notes for some information on the internals.
-*/
-
-
-/* This file is compiled on its own as part of the PCRE library. However,
-it is also included in the compilation of dftables.c, in which case the macro
-DFTABLES is defined. */
-
-#ifndef DFTABLES
-#include "internal.h"
-#endif
-
-
-
-/*************************************************
-*           Create PCRE character tables         *
-*************************************************/
-
-/* This function builds a set of character tables for use by PCRE and returns
-a pointer to them. They are build using the ctype functions, and consequently
-their contents will depend upon the current locale setting. When compiled as
-part of the library, the store is obtained via pcre_malloc(), but when compiled
-inside dftables, use malloc().
-
-Arguments:   none
-Returns:     pointer to the contiguous block of data
-*/
-
-const unsigned char *
-pcre_maketables(void)
-{
-unsigned char *yield, *p;
-int i;
-
-#ifndef DFTABLES
-yield = (unsigned char*)(pcre_malloc)(tables_length);
-#else
-yield = (unsigned char*)malloc(tables_length);
-#endif
-
-if (yield == NULL) return NULL;
-p = yield;
-
-/* First comes the lower casing table */
-
-for (i = 0; i < 256; i++) *p++ = tolower(i);
-
-/* Next the case-flipping table */
-
-for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i);
-
-/* Then the character class tables. Don't try to be clever and save effort
-on exclusive ones - in some locales things may be different. Note that the
-table for "space" includes everything "isspace" gives, including VT in the
-default locale. This makes it work for the POSIX class [:space:]. */
-
-memset(p, 0, cbit_length);
-for (i = 0; i < 256; i++)
-  {
-  if (isdigit(i))
-    {
-    p[cbit_digit  + i/8] |= 1 << (i&7);
-    p[cbit_word   + i/8] |= 1 << (i&7);
-    }
-  if (isupper(i))
-    {
-    p[cbit_upper  + i/8] |= 1 << (i&7);
-    p[cbit_word   + i/8] |= 1 << (i&7);
-    }
-  if (islower(i))
-    {
-    p[cbit_lower  + i/8] |= 1 << (i&7);
-    p[cbit_word   + i/8] |= 1 << (i&7);
-    }
-  if (i == '_')   p[cbit_word   + i/8] |= 1 << (i&7);
-  if (isspace(i)) p[cbit_space  + i/8] |= 1 << (i&7);
-  if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7);
-  if (isgraph(i)) p[cbit_graph  + i/8] |= 1 << (i&7);
-  if (isprint(i)) p[cbit_print  + i/8] |= 1 << (i&7);
-  if (ispunct(i)) p[cbit_punct  + i/8] |= 1 << (i&7);
-  if (iscntrl(i)) p[cbit_cntrl  + i/8] |= 1 << (i&7);
-  }
-p += cbit_length;
-
-/* Finally, the character type table. In this, we exclude VT from the white
-space chars, because Perl doesn't recognize it as such for \s and for comments
-within regexes. */
-
-for (i = 0; i < 256; i++)
-  {
-  int x = 0;
-  if (i != 0x0b && isspace(i)) x += ctype_space;
-  if (isalpha(i)) x += ctype_letter;
-  if (isdigit(i)) x += ctype_digit;
-  if (isxdigit(i)) x += ctype_xdigit;
-  if (isalnum(i) || i == '_') x += ctype_word;
-  if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta;
-  *p++ = x;
-  }
-
-return yield;
-}
-
-/* End of maketables.c */
diff -Nurp tin-1.6.2/pcre/pcre-config.in tin-1.8.0/pcre/pcre-config.in
--- tin-1.6.2/pcre/pcre-config.in	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/pcre-config.in	2005-06-28 10:31:26.000000000 +0200
@@ -12,6 +12,13 @@ if test $# -eq 0; then
       exit 1
 fi
 
+libR=
+case `uname -s` in
+  *SunOS*)
+  libR=" -R@libdir@"
+  ;;
+esac
+
 while test $# -gt 0; do
   case "$1" in
   -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
@@ -45,10 +52,10 @@ while test $# -gt 0; do
       echo $includes
       ;;
     --libs-posix)
-      echo -L@libdir@ -lpcreposix -lpcre
+      echo -L@libdir@$libR -lpcreposix -lpcre
       ;;
     --libs)
-      echo -L@libdir@ -lpcre
+      echo -L@libdir@$libR -lpcre
       ;;
     *)
       echo "${usage}" 1>&2
diff -Nurp tin-1.6.2/pcre/pcre.c tin-1.8.0/pcre/pcre.c
--- tin-1.6.2/pcre/pcre.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/pcre.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,7596 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2003 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-/* Define DEBUG to get debugging output on stdout. */
-
-/* #define DEBUG */
-
-/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef
-inline, and there are *still* stupid compilers about that don't like indented
-pre-processor statements. I suppose it's only been 10 years... */
-
-#ifdef DEBUG
-#define DPRINTF(p) printf p
-#else
-#define DPRINTF(p) /*nothing*/
-#endif
-
-/* Include the internals header, which itself includes Standard C headers plus
-the external pcre header. */
-
-#include "internal.h"
-
-
-/* Allow compilation as C++ source code, should anybody want to do that. */
-
-#ifdef __cplusplus
-#define class pcre_class
-#endif
-
-
-/* Maximum number of items on the nested bracket stacks at compile time. This
-applies to the nesting of all kinds of parentheses. It does not limit
-un-nested, non-capturing parentheses. This number can be made bigger if
-necessary - it is used to dimension one int and one unsigned char vector at
-compile time. */
-
-#define BRASTACK_SIZE 200
-
-
-/* Maximum number of ints of offset to save on the stack for recursive calls.
-If the offset vector is bigger, malloc is used. This should be a multiple of 3,
-because the offset vector is always a multiple of 3 long. */
-
-#define REC_STACK_SAVE_MAX 30
-
-
-/* The number of bytes in a literal character string above which we can't add
-any more is set at 250 in order to allow for UTF-8 characters. (In theory it
-could be 255 when UTF-8 support is excluded, but that means that some of the
-test output would be different, which just complicates things.) */
-
-#define MAXLIT 250
-
-
-/* The maximum remaining length of subject we are prepared to search for a
-req_byte match. */
-
-#define REQ_BYTE_MAX 1000
-
-
-/* Table of sizes for the fixed-length opcodes. It's defined in a macro so that
-the definition is next to the definition of the opcodes in internal.h. */
-
-static uschar OP_lengths[] = { OP_LENGTHS };
-
-/* Min and max values for the common repeats; for the maxima, 0 => infinity */
-
-static const char rep_min[] = { 0, 0, 1, 1, 0, 0 };
-static const char rep_max[] = { 0, 0, 0, 0, 1, 1 };
-
-/* Table for handling escaped characters in the range '0'-'z'. Positive returns
-are simple data values; negative values are for special things like \d and so
-on. Zero means further processing is needed (for things like \x), or the escape
-is invalid. */
-
-static const short int escapes[] = {
-    0,      0,      0,      0,      0,      0,      0,      0,   /* 0 - 7 */
-    0,      0,    ':',    ';',    '<',    '=',    '>',    '?',   /* 8 - ? */
-  '@', -ESC_A, -ESC_B, -ESC_C, -ESC_D, -ESC_E,      0, -ESC_G,   /* @ - G */
-    0,      0,      0,      0,      0,      0,      0,      0,   /* H - O */
-    0, -ESC_Q,      0, -ESC_S,      0,      0,      0, -ESC_W,   /* P - W */
-    0,      0, -ESC_Z,    '[',   '\\',    ']',    '^',    '_',   /* X - _ */
-  '`',      7, -ESC_b,      0, -ESC_d,  ESC_e,  ESC_f,      0,   /* ` - g */
-    0,      0,      0,      0,      0,      0,  ESC_n,      0,   /* h - o */
-    0,      0,  ESC_r, -ESC_s,  ESC_tee,    0,      0, -ESC_w,   /* p - w */
-    0,      0, -ESC_z                                            /* x - z */
-};
-
-/* Tables of names of POSIX character classes and their lengths. The list is
-terminated by a zero length entry. The first three must be alpha, upper, lower,
-as this is assumed for handling case independence. */
-
-static const char *posix_names[] = {
-  "alpha", "lower", "upper",
-  "alnum", "ascii", "blank", "cntrl", "digit", "graph",
-  "print", "punct", "space", "word",  "xdigit" };
-
-static const uschar posix_name_lengths[] = {
-  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 };
-
-/* Table of class bit maps for each POSIX class; up to three may be combined
-to form the class. The table for [:blank:] is dynamically modified to remove
-the vertical space characters. */
-
-static const int posix_class_maps[] = {
-  cbit_lower, cbit_upper, -1,             /* alpha */
-  cbit_lower, -1,         -1,             /* lower */
-  cbit_upper, -1,         -1,             /* upper */
-  cbit_digit, cbit_lower, cbit_upper,     /* alnum */
-  cbit_print, cbit_cntrl, -1,             /* ascii */
-  cbit_space, -1,         -1,             /* blank - a GNU extension */
-  cbit_cntrl, -1,         -1,             /* cntrl */
-  cbit_digit, -1,         -1,             /* digit */
-  cbit_graph, -1,         -1,             /* graph */
-  cbit_print, -1,         -1,             /* print */
-  cbit_punct, -1,         -1,             /* punct */
-  cbit_space, -1,         -1,             /* space */
-  cbit_word,  -1,         -1,             /* word - a Perl extension */
-  cbit_xdigit,-1,         -1              /* xdigit */
-};
-
-/* Table to identify ASCII digits and hex digits. This is used when compiling
-patterns. Note that the tables in chartables are dependent on the locale, and
-may mark arbitrary characters as digits - but the PCRE compiling code expects
-to handle only 0-9, a-z, and A-Z as digits when compiling. That is why we have
-a private table here. It costs 256 bytes, but it is a lot faster than doing
-character value tests (at least in some simple cases I timed), and in some
-applications one wants PCRE to compile efficiently as well as match
-efficiently.
-
-For convenience, we use the same bit definitions as in chartables:
-
-  0x04   decimal digit
-  0x08   hexadecimal digit
-
-Then we can use ctype_digit and ctype_xdigit in the code. */
-
-static const unsigned char digitab[] =
-  {
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   0-  7 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   8- 15 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  16- 23 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  24- 31 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*    - '  */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  ( - /  */
-  0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /*  0 - 7  */
-  0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, /*  8 - ?  */
-  0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /*  @ - G  */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  H - O  */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  P - W  */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  X - _  */
-  0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /*  ` - g  */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  h - o  */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  p - w  */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  x -127 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */
-  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */
-
-/* Definition to allow mutual recursion */
-
-static BOOL
-  compile_regex(int, int, int *, uschar **, const uschar **, const char **,
-    BOOL, int, int *, int *, branch_chain *, compile_data *);
-
-/* Structure for building a chain of data that actually lives on the
-stack, for holding the values of the subject pointer at the start of each
-subpattern, so as to detect when an empty string has been matched by a
-subpattern - to break infinite loops. */
-
-typedef struct eptrblock {
-  struct eptrblock *prev;
-  const uschar *saved_eptr;
-} eptrblock;
-
-/* Flag bits for the match() function */
-
-#define match_condassert   0x01    /* Called to check a condition assertion */
-#define match_isgroup      0x02    /* Set if start of bracketed group */
-
-/* Non-error returns from the match() function. Error returns are externally
-defined PCRE_ERROR_xxx codes, which are all negative. */
-
-#define MATCH_MATCH        1
-#define MATCH_NOMATCH      0
-
-
-
-/*************************************************
-*               Global variables                 *
-*************************************************/
-
-/* PCRE is thread-clean and doesn't use any global variables in the normal
-sense. However, it calls memory allocation and free functions via the two
-indirections below, and it can optionally do callouts. These values can be
-changed by the caller, but are shared between all threads. However, when
-compiling for Virtual Pascal, things are done differently (see pcre.in). */
-
-#ifndef VPCOMPAT
-void *(*pcre_malloc)(size_t) = malloc;
-void  (*pcre_free)(void *) = free;
-int   (*pcre_callout)(pcre_callout_block *) = NULL;
-#endif
-
-
-/*************************************************
-*    Macros and tables for character handling    *
-*************************************************/
-
-/* When UTF-8 encoding is being used, a character is no longer just a single
-byte. The macros for character handling generate simple sequences when used in
-byte-mode, and more complicated ones for UTF-8 characters. */
-
-#ifndef SUPPORT_UTF8
-#define GETCHAR(c, eptr) c = *eptr;
-#define GETCHARINC(c, eptr) c = *eptr++;
-#define GETCHARINCTEST(c, eptr) c = *eptr++;
-#define GETCHARLEN(c, eptr, len) c = *eptr;
-#define BACKCHAR(eptr)
-
-#else   /* SUPPORT_UTF8 */
-
-/* Get the next UTF-8 character, not advancing the pointer. This is called when
-we know we are in UTF-8 mode. */
-
-#define GETCHAR(c, eptr) \
-  c = *eptr; \
-  if ((c & 0xc0) == 0xc0) \
-    { \
-    int gcii; \
-    int gcaa = utf8_table4[c & 0x3f];  /* Number of additional bytes */ \
-    int gcss = 6*gcaa; \
-    c = (c & utf8_table3[gcaa]) << gcss; \
-    for (gcii = 1; gcii <= gcaa; gcii++) \
-      { \
-      gcss -= 6; \
-      c |= (eptr[gcii] & 0x3f) << gcss; \
-      } \
-    }
-
-/* Get the next UTF-8 character, advancing the pointer. This is called when we
-know we are in UTF-8 mode. */
-
-#define GETCHARINC(c, eptr) \
-  c = *eptr++; \
-  if ((c & 0xc0) == 0xc0) \
-    { \
-    int gcaa = utf8_table4[c & 0x3f];  /* Number of additional bytes */ \
-    int gcss = 6*gcaa; \
-    c = (c & utf8_table3[gcaa]) << gcss; \
-    while (gcaa-- > 0) \
-      { \
-      gcss -= 6; \
-      c |= (*eptr++ & 0x3f) << gcss; \
-      } \
-    }
-
-/* Get the next character, testing for UTF-8 mode, and advancing the pointer */
-
-#define GETCHARINCTEST(c, eptr) \
-  c = *eptr++; \
-  if (md->utf8 && (c & 0xc0) == 0xc0) \
-    { \
-    int gcaa = utf8_table4[c & 0x3f];  /* Number of additional bytes */ \
-    int gcss = 6*gcaa; \
-    c = (c & utf8_table3[gcaa]) << gcss; \
-    while (gcaa-- > 0) \
-      { \
-      gcss -= 6; \
-      c |= (*eptr++ & 0x3f) << gcss; \
-      } \
-    }
-
-/* Get the next UTF-8 character, not advancing the pointer, incrementing length
-if there are extra bytes. This is called when we know we are in UTF-8 mode. */
-
-#define GETCHARLEN(c, eptr, len) \
-  c = *eptr; \
-  if ((c & 0xc0) == 0xc0) \
-    { \
-    int gcii; \
-    int gcaa = utf8_table4[c & 0x3f];  /* Number of additional bytes */ \
-    int gcss = 6*gcaa; \
-    c = (c & utf8_table3[gcaa]) << gcss; \
-    for (gcii = 1; gcii <= gcaa; gcii++) \
-      { \
-      gcss -= 6; \
-      c |= (eptr[gcii] & 0x3f) << gcss; \
-      } \
-    len += gcaa; \
-    }
-
-/* If the pointer is not at the start of a character, move it back until
-it is. Called only in UTF-8 mode. */
-
-#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--;
-
-#endif
-
-
-
-/*************************************************
-*             Default character tables           *
-*************************************************/
-
-/* A default set of character tables is included in the PCRE binary. Its source
-is built by the maketables auxiliary program, which uses the default C ctypes
-functions, and put in the file chartables.c. These tables are used by PCRE
-whenever the caller of pcre_compile() does not provide an alternate set of
-tables. */
-
-#include "chartables.c"
-
-
-
-#ifdef SUPPORT_UTF8
-/*************************************************
-*           Tables for UTF-8 support             *
-*************************************************/
-
-/* These are the breakpoints for different numbers of bytes in a UTF-8
-character. */
-
-static const int utf8_table1[] =
-  { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff};
-
-/* These are the indicator bits and the mask for the data bits to set in the
-first byte of a character, indexed by the number of additional bytes. */
-
-static const int utf8_table2[] = { 0,    0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
-static const int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
-
-/* Table of the number of extra characters, indexed by the first character
-masked with 0x3f. The highest number for a valid UTF-8 character is in fact
-0x3d. */
-
-static const uschar utf8_table4[] = {
-  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-  3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };
-
-
-/*************************************************
-*       Convert character value to UTF-8         *
-*************************************************/
-
-/* This function takes an integer value in the range 0 - 0x7fffffff
-and encodes it as a UTF-8 character in 0 to 6 bytes.
-
-Arguments:
-  cvalue     the character value
-  buffer     pointer to buffer for result - at least 6 bytes long
-
-Returns:     number of characters placed in the buffer
-*/
-
-static int
-ord2utf8(int cvalue, uschar *buffer)
-{
-register int i, j;
-for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
-  if (cvalue <= utf8_table1[i]) break;
-buffer += i;
-for (j = i; j > 0; j--)
- {
- *buffer-- = 0x80 | (cvalue & 0x3f);
- cvalue >>= 6;
- }
-*buffer = utf8_table2[i] | cvalue;
-return i + 1;
-}
-#endif
-
-
-
-/*************************************************
-*         Print compiled regex                   *
-*************************************************/
-
-/* The code for doing this is held in a separate file that is also included in
-pcretest.c. It defines a function called print_internals(). */
-
-#ifdef DEBUG
-#include "printint.c"
-#endif
-
-
-
-/*************************************************
-*          Return version string                 *
-*************************************************/
-
-#define STRING(a)  # a
-#define XSTRING(s) STRING(s)
-
-const char *
-pcre_version(void)
-{
-return XSTRING(PCRE_MAJOR) "." XSTRING(PCRE_MINOR) " " XSTRING(PCRE_DATE);
-}
-
-
-
-
-/*************************************************
-* (Obsolete) Return info about compiled pattern  *
-*************************************************/
-
-/* This is the original "info" function. It picks potentially useful data out
-of the private structure, but its interface was too rigid. It remains for
-backwards compatibility. The public options are passed back in an int - though
-the re->options field has been expanded to a long int, all the public options
-at the low end of it, and so even on 16-bit systems this will still be OK.
-Therefore, I haven't changed the API for pcre_info().
-
-Arguments:
-  external_re   points to compiled code
-  optptr        where to pass back the options
-  first_byte    where to pass back the first character,
-                or -1 if multiline and all branches start ^,
-                or -2 otherwise
-
-Returns:        number of capturing subpatterns
-                or negative values on error
-*/
-
-int
-pcre_info(const pcre *external_re, int *optptr, int *first_byte)
-{
-const real_pcre *re = (const real_pcre *)external_re;
-if (re == NULL) return PCRE_ERROR_NULL;
-if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
-if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS);
-if (first_byte != NULL)
-  *first_byte = ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte :
-     ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
-return re->top_bracket;
-}
-
-
-
-/*************************************************
-*        Return info about compiled pattern      *
-*************************************************/
-
-/* This is a newer "info" function which has an extensible interface so
-that additional items can be added compatibly.
-
-Arguments:
-  external_re      points to compiled code
-  extra_data       points extra data, or NULL
-  what             what information is required
-  where            where to put the information
-
-Returns:           0 if data returned, negative on error
-*/
-
-int
-pcre_fullinfo(const pcre *external_re, const pcre_extra *extra_data, int what,
-  void *where)
-{
-const real_pcre *re = (const real_pcre *)external_re;
-const pcre_study_data *study = NULL;
-
-if (re == NULL || where == NULL) return PCRE_ERROR_NULL;
-if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
-
-if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)
-  study = extra_data->study_data;
-
-switch (what)
-  {
-  case PCRE_INFO_OPTIONS:
-  *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS;
-  break;
-
-  case PCRE_INFO_SIZE:
-  *((size_t *)where) = re->size;
-  break;
-
-  case PCRE_INFO_STUDYSIZE:
-  *((size_t *)where) = (study == NULL)? 0 : study->size;
-  break;
-
-  case PCRE_INFO_CAPTURECOUNT:
-  *((int *)where) = re->top_bracket;
-  break;
-
-  case PCRE_INFO_BACKREFMAX:
-  *((int *)where) = re->top_backref;
-  break;
-
-  case PCRE_INFO_FIRSTBYTE:
-  *((int *)where) =
-    ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte :
-    ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
-  break;
-
-  case PCRE_INFO_FIRSTTABLE:
-  *((const uschar **)where) =
-    (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)?
-      study->start_bits : NULL;
-  break;
-
-  case PCRE_INFO_LASTLITERAL:
-  *((int *)where) =
-    ((re->options & PCRE_REQCHSET) != 0)? re->req_byte : -1;
-  break;
-
-  case PCRE_INFO_NAMEENTRYSIZE:
-  *((int *)where) = re->name_entry_size;
-  break;
-
-  case PCRE_INFO_NAMECOUNT:
-  *((int *)where) = re->name_count;
-  break;
-
-  case PCRE_INFO_NAMETABLE:
-  *((const uschar **)where) = (const uschar *)re + sizeof(real_pcre);
-  break;
-
-  default: return PCRE_ERROR_BADOPTION;
-  }
-
-return 0;
-}
-
-
-
-/*************************************************
-* Return info about what features are configured *
-*************************************************/
-
-/* This is function which has an extensible interface so that additional items
-can be added compatibly.
-
-Arguments:
-  what             what information is required
-  where            where to put the information
-
-Returns:           0 if data returned, negative on error
-*/
-
-int
-pcre_config(int what, void *where)
-{
-switch (what)
-  {
-  case PCRE_CONFIG_UTF8:
-  #ifdef SUPPORT_UTF8
-  *((int *)where) = 1;
-  #else
-  *((int *)where) = 0;
-  #endif
-  break;
-
-  case PCRE_CONFIG_NEWLINE:
-  *((int *)where) = NEWLINE;
-  break;
-
-  case PCRE_CONFIG_LINK_SIZE:
-  *((int *)where) = LINK_SIZE;
-  break;
-
-  case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD:
-  *((int *)where) = POSIX_MALLOC_THRESHOLD;
-  break;
-
-  case PCRE_CONFIG_MATCH_LIMIT:
-  *((unsigned int *)where) = MATCH_LIMIT;
-  break;
-
-  default: return PCRE_ERROR_BADOPTION;
-  }
-
-return 0;
-}
-
-
-
-#ifdef DEBUG
-/*************************************************
-*        Debugging function to print chars       *
-*************************************************/
-
-/* Print a sequence of chars in printable format, stopping at the end of the
-subject if the requested.
-
-Arguments:
-  p           points to characters
-  length      number to print
-  is_subject  TRUE if printing from within md->start_subject
-  md          pointer to matching data block, if is_subject is TRUE
-
-Returns:     nothing
-*/
-
-static void
-pchars(const uschar *p, int length, BOOL is_subject, match_data *md)
-{
-int c;
-if (is_subject && length > md->end_subject - p) length = md->end_subject - p;
-while (length-- > 0)
-  if (isprint(c = *(p++))) printf("%c", c); else printf("\\x%02x", c);
-}
-#endif
-
-
-
-
-/*************************************************
-*            Handle escapes                      *
-*************************************************/
-
-/* This function is called when a \ has been encountered. It either returns a
-positive value for a simple escape such as \n, or a negative value which
-encodes one of the more complicated things such as \d. When UTF-8 is enabled,
-a positive value greater than 255 may be returned. On entry, ptr is pointing at
-the \. On exit, it is on the final character of the escape sequence.
-
-Arguments:
-  ptrptr     points to the pattern position pointer
-  errorptr   points to the pointer to the error message
-  bracount   number of previous extracting brackets
-  options    the options bits
-  isclass    TRUE if inside a character class
-  cd         pointer to char tables block
-
-Returns:     zero or positive => a data character
-             negative => a special escape sequence
-             on error, errorptr is set
-*/
-
-static int
-check_escape(const uschar **ptrptr, const char **errorptr, int bracount,
-  int options, BOOL isclass, compile_data *cd)
-{
-const uschar *ptr = *ptrptr;
-int c, i;
-
-/* If backslash is at the end of the pattern, it's an error. */
-
-c = *(++ptr);
-if (c == 0) *errorptr = ERR1;
-
-/* Digits or letters may have special meaning; all others are literals. */
-
-else if (c < '0' || c > 'z') {}
-
-/* Do an initial lookup in a table. A non-zero result is something that can be
-returned immediately. Otherwise further processing may be required. */
-
-else if ((i = escapes[c - '0']) != 0) c = i;
-
-/* Escapes that need further processing, or are illegal. */
-
-else
-  {
-  const uschar *oldptr;
-  switch (c)
-    {
-    /* A number of Perl escapes are not handled by PCRE. We give an explicit
-    error. */
-
-    case 'l':
-    case 'L':
-    case 'N':
-    case 'p':
-    case 'P':
-    case 'u':
-    case 'U':
-    case 'X':
-    *errorptr = ERR37;
-    break;
-
-    /* The handling of escape sequences consisting of a string of digits
-    starting with one that is not zero is not straightforward. By experiment,
-    the way Perl works seems to be as follows:
-
-    Outside a character class, the digits are read as a decimal number. If the
-    number is less than 10, or if there are that many previous extracting
-    left brackets, then it is a back reference. Otherwise, up to three octal
-    digits are read to form an escaped byte. Thus \123 is likely to be octal
-    123 (cf \0123, which is octal 012 followed by the literal 3). If the octal
-    value is greater than 377, the least significant 8 bits are taken. Inside a
-    character class, \ followed by a digit is always an octal number. */
-
-    case '1': case '2': case '3': case '4': case '5':
-    case '6': case '7': case '8': case '9':
-
-    if (!isclass)
-      {
-      oldptr = ptr;
-      c -= '0';
-      while ((digitab[ptr[1]] & ctype_digit) != 0)
-        c = c * 10 + *(++ptr) - '0';
-      if (c < 10 || c <= bracount)
-        {
-        c = -(ESC_REF + c);
-        break;
-        }
-      ptr = oldptr;      /* Put the pointer back and fall through */
-      }
-
-    /* Handle an octal number following \. If the first digit is 8 or 9, Perl
-    generates a binary zero byte and treats the digit as a following literal.
-    Thus we have to pull back the pointer by one. */
-
-    if ((c = *ptr) >= '8')
-      {
-      ptr--;
-      c = 0;
-      break;
-      }
-
-    /* \0 always starts an octal number, but we may drop through to here with a
-    larger first octal digit. */
-
-    case '0':
-    c -= '0';
-    while(i++ < 2 && ptr[1] >= '0' && ptr[1] <= '7')
-        c = c * 8 + *(++ptr) - '0';
-    c &= 255;     /* Take least significant 8 bits */
-    break;
-
-    /* \x is complicated when UTF-8 is enabled. \x{ddd} is a character number
-    which can be greater than 0xff, but only if the ddd are hex digits. */
-
-    case 'x':
-#ifdef SUPPORT_UTF8
-    if (ptr[1] == '{' && (options & PCRE_UTF8) != 0)
-      {
-      const uschar *pt = ptr + 2;
-      register int count = 0;
-      c = 0;
-      while ((digitab[*pt] & ctype_xdigit) != 0)
-        {
-        int cc = *pt++;
-        if (cc >= 'a') cc -= 32;            /* Convert to upper case */
-        count++;
-        c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10));
-        }
-      if (*pt == '}')
-        {
-        if (c < 0 || count > 8) *errorptr = ERR34;
-        ptr = pt;
-        break;
-        }
-      /* If the sequence of hex digits does not end with '}', then we don't
-      recognize this construct; fall through to the normal \x handling. */
-      }
-#endif
-
-    /* Read just a single hex char */
-
-    c = 0;
-    while (i++ < 2 && (digitab[ptr[1]] & ctype_xdigit) != 0)
-      {
-      int cc = *(++ptr);
-      if (cc >= 'a') cc -= 32;              /* Convert to upper case */
-      c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10));
-      }
-    break;
-
-    /* Other special escapes not starting with a digit are straightforward */
-
-    case 'c':
-    c = *(++ptr);
-    if (c == 0)
-      {
-      *errorptr = ERR2;
-      return 0;
-      }
-
-    /* A letter is upper-cased; then the 0x40 bit is flipped. This coding
-    is ASCII-specific, but then the whole concept of \cx is ASCII-specific. */
-
-    if (c >= 'a' && c <= 'z') c -= 32;
-    c ^= 0x40;
-    break;
-
-    /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any
-    other alphameric following \ is an error if PCRE_EXTRA was set; otherwise,
-    for Perl compatibility, it is a literal. This code looks a bit odd, but
-    there used to be some cases other than the default, and there may be again
-    in future, so I haven't "optimized" it. */
-
-    default:
-    if ((options & PCRE_EXTRA) != 0) switch(c)
-      {
-      default:
-      *errorptr = ERR3;
-      break;
-      }
-    break;
-    }
-  }
-
-*ptrptr = ptr;
-return c;
-}
-
-
-
-/*************************************************
-*            Check for counted repeat            *
-*************************************************/
-
-/* This function is called when a '{' is encountered in a place where it might
-start a quantifier. It looks ahead to see if it really is a quantifier or not.
-It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd}
-where the ddds are digits.
-
-Arguments:
-  p         pointer to the first char after '{'
-  cd        pointer to char tables block
-
-Returns:    TRUE or FALSE
-*/
-
-static BOOL
-is_counted_repeat(const uschar *p, compile_data *cd)
-{
-if ((digitab[*p++] && ctype_digit) == 0) return FALSE;
-while ((digitab[*p] & ctype_digit) != 0) p++;
-if (*p == '}') return TRUE;
-
-if (*p++ != ',') return FALSE;
-if (*p == '}') return TRUE;
-
-if ((digitab[*p++] && ctype_digit) == 0) return FALSE;
-while ((digitab[*p] & ctype_digit) != 0) p++;
-
-return (*p == '}');
-}
-
-
-
-/*************************************************
-*         Read repeat counts                     *
-*************************************************/
-
-/* Read an item of the form {n,m} and return the values. This is called only
-after is_counted_repeat() has confirmed that a repeat-count quantifier exists,
-so the syntax is guaranteed to be correct, but we need to check the values.
-
-Arguments:
-  p          pointer to first char after '{'
-  minp       pointer to int for min
-  maxp       pointer to int for max
-             returned as -1 if no max
-  errorptr   points to pointer to error message
-  cd         pointer to character tables clock
-
-Returns:     pointer to '}' on success;
-             current ptr on error, with errorptr set
-*/
-
-static const uschar *
-read_repeat_counts(const uschar *p, int *minp, int *maxp,
-  const char **errorptr, compile_data *cd)
-{
-int min = 0;
-int max = -1;
-
-while ((digitab[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0';
-
-if (*p == '}') max = min; else
-  {
-  if (*(++p) != '}')
-    {
-    max = 0;
-    while((digitab[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0';
-    if (max < min)
-      {
-      *errorptr = ERR4;
-      return p;
-      }
-    }
-  }
-
-/* Do paranoid checks, then fill in the required variables, and pass back the
-pointer to the terminating '}'. */
-
-if (min > 65535 || max > 65535)
-  *errorptr = ERR5;
-else
-  {
-  *minp = min;
-  *maxp = max;
-  }
-return p;
-}
-
-
-
-/*************************************************
-*      Find first significant op code            *
-*************************************************/
-
-/* This is called by several functions that scan a compiled expression looking
-for a fixed first character, or an anchoring op code etc. It skips over things
-that do not influence this. For some calls, a change of option is important.
-
-Arguments:
-  code       pointer to the start of the group
-  options    pointer to external options
-  optbit     the option bit whose changing is significant, or
-               zero if none are
-
-Returns:     pointer to the first significant opcode
-*/
-
-static const uschar*
-first_significant_code(const uschar *code, int *options, int optbit)
-{
-for (;;)
-  {
-  switch ((int)*code)
-    {
-    case OP_OPT:
-    if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit))
-      *options = (int)code[1];
-    code += 2;
-    break;
-
-    case OP_ASSERT_NOT:
-    case OP_ASSERTBACK:
-    case OP_ASSERTBACK_NOT:
-    do code += GET(code, 1); while (*code == OP_ALT);
-    /* Fall through */
-
-    case OP_CALLOUT:
-    case OP_CREF:
-    case OP_BRANUMBER:
-    case OP_WORD_BOUNDARY:
-    case OP_NOT_WORD_BOUNDARY:
-    code += OP_lengths[*code];
-    break;
-
-    default:
-    return code;
-    }
-  }
-/* Control never reaches here */
-}
-
-
-
-
-/*************************************************
-*        Find the fixed length of a pattern      *
-*************************************************/
-
-/* Scan a pattern and compute the fixed length of subject that will match it,
-if the length is fixed. This is needed for dealing with backward assertions.
-In UTF8 mode, the result is in characters rather than bytes.
-
-Arguments:
-  code     points to the start of the pattern (the bracket)
-  options  the compiling options
-
-Returns:   the fixed length, or -1 if there is no fixed length,
-             or -2 if \C was encountered
-*/
-
-static int
-find_fixedlength(uschar *code, int options)
-{
-int length = -1;
-
-register int branchlength = 0;
-register uschar *cc = code + 1 + LINK_SIZE;
-
-/* Scan along the opcodes for this branch. If we get to the end of the
-branch, check the length against that of the other branches. */
-
-for (;;)
-  {
-  int d;
-  register int op = *cc;
-  if (op >= OP_BRA) op = OP_BRA;
-
-  switch (op)
-    {
-    case OP_BRA:
-    case OP_ONCE:
-    case OP_COND:
-    d = find_fixedlength(cc, options);
-    if (d < 0) return d;
-    branchlength += d;
-    do cc += GET(cc, 1); while (*cc == OP_ALT);
-    cc += 1 + LINK_SIZE;
-    break;
-
-    /* Reached end of a branch; if it's a ket it is the end of a nested
-    call. If it's ALT it is an alternation in a nested call. If it is
-    END it's the end of the outer call. All can be handled by the same code. */
-
-    case OP_ALT:
-    case OP_KET:
-    case OP_KETRMAX:
-    case OP_KETRMIN:
-    case OP_END:
-    if (length < 0) length = branchlength;
-      else if (length != branchlength) return -1;
-    if (*cc != OP_ALT) return length;
-    cc += 1 + LINK_SIZE;
-    branchlength = 0;
-    break;
-
-    /* Skip over assertive subpatterns */
-
-    case OP_ASSERT:
-    case OP_ASSERT_NOT:
-    case OP_ASSERTBACK:
-    case OP_ASSERTBACK_NOT:
-    do cc += GET(cc, 1); while (*cc == OP_ALT);
-    /* Fall through */
-
-    /* Skip over things that don't match chars */
-
-    case OP_REVERSE:
-    case OP_BRANUMBER:
-    case OP_CREF:
-    case OP_OPT:
-    case OP_CALLOUT:
-    case OP_SOD:
-    case OP_SOM:
-    case OP_EOD:
-    case OP_EODN:
-    case OP_CIRC:
-    case OP_DOLL:
-    case OP_NOT_WORD_BOUNDARY:
-    case OP_WORD_BOUNDARY:
-    cc += OP_lengths[*cc];
-    break;
-
-    /* Handle char strings. In UTF-8 mode we must count characters, not bytes.
-    This requires a scan of the string, unfortunately. We assume valid UTF-8
-    strings, so all we do is reduce the length by one for every byte whose bits
-    are 10xxxxxx. */
-
-    case OP_CHARS:
-    branchlength += *(++cc);
-#ifdef SUPPORT_UTF8
-    if ((options & PCRE_UTF8) != 0)
-      for (d = 1; d <= *cc; d++)
-        if ((cc[d] & 0xc0) == 0x80) branchlength--;
-#endif
-    cc += *cc + 1;
-    break;
-
-    /* Handle exact repetitions. The count is already in characters, but we
-    need to skip over a multibyte character in UTF8 mode.  */
-
-    case OP_EXACT:
-    branchlength += GET2(cc,1);
-    cc += 4;
-#ifdef SUPPORT_UTF8
-    if ((options & PCRE_UTF8) != 0)
-      {
-      while((*cc & 0x80) == 0x80) cc++;
-      }
-#endif
-    break;
-
-    case OP_TYPEEXACT:
-    branchlength += GET2(cc,1);
-    cc += 4;
-    break;
-
-    /* Handle single-char matchers */
-
-    case OP_NOT_DIGIT:
-    case OP_DIGIT:
-    case OP_NOT_WHITESPACE:
-    case OP_WHITESPACE:
-    case OP_NOT_WORDCHAR:
-    case OP_WORDCHAR:
-    case OP_ANY:
-    branchlength++;
-    cc++;
-    break;
-
-    /* The single-byte matcher isn't allowed */
-
-    case OP_ANYBYTE:
-    return -2;
-
-    /* Check a class for variable quantification */
-
-#ifdef SUPPORT_UTF8
-    case OP_XCLASS:
-    cc += GET(cc, 1) - 33;
-    /* Fall through */
-#endif
-
-    case OP_CLASS:
-    case OP_NCLASS:
-    cc += 33;
-
-    switch (*cc)
-      {
-      case OP_CRSTAR:
-      case OP_CRMINSTAR:
-      case OP_CRQUERY:
-      case OP_CRMINQUERY:
-      return -1;
-
-      case OP_CRRANGE:
-      case OP_CRMINRANGE:
-      if (GET2(cc,1) != GET2(cc,3)) return -1;
-      branchlength += GET2(cc,1);
-      cc += 5;
-      break;
-
-      default:
-      branchlength++;
-      }
-    break;
-
-    /* Anything else is variable length */
-
-    default:
-    return -1;
-    }
-  }
-/* Control never gets here */
-}
-
-
-
-
-/*************************************************
-*    Scan compiled regex for numbered bracket    *
-*************************************************/
-
-/* This little function scans through a compiled pattern until it finds a
-capturing bracket with the given number.
-
-Arguments:
-  code        points to start of expression
-  utf8        TRUE in UTF-8 mode
-  number      the required bracket number
-
-Returns:      pointer to the opcode for the bracket, or NULL if not found
-*/
-
-static const uschar *
-find_bracket(const uschar *code, BOOL utf8, int number)
-{
-#ifndef SUPPORT_UTF8
-utf8 = utf8;               /* Stop pedantic compilers complaining */
-#endif
-
-for (;;)
-  {
-  register int c = *code;
-  if (c == OP_END) return NULL;
-  else if (c == OP_CHARS) code += code[1] + OP_lengths[c];
-  else if (c > OP_BRA)
-    {
-    int n = c - OP_BRA;
-    if (n > EXTRACT_BASIC_MAX) n = GET2(code, 2+LINK_SIZE);
-    if (n == number) return (uschar *)code;
-    code += OP_lengths[OP_BRA];
-    }
-  else
-    {
-    code += OP_lengths[c];
-
-    /* In UTF-8 mode, opcodes that are followed by a character may be followed
-    by a multi-byte character. The length in the table is a minimum, so we have
-    to scan along to skip the extra characters. All opcodes are less than 128,
-    so we can use relatively efficient code. */
-
-#ifdef SUPPORT_UTF8
-    if (utf8) switch(c)
-      {
-      case OP_EXACT:
-      case OP_UPTO:
-      case OP_MINUPTO:
-      case OP_STAR:
-      case OP_MINSTAR:
-      case OP_PLUS:
-      case OP_MINPLUS:
-      case OP_QUERY:
-      case OP_MINQUERY:
-      while ((*code & 0xc0) == 0x80) code++;
-      break;
-      }
-#endif
-    }
-  }
-}
-
-
-
-/*************************************************
-*    Scan compiled branch for non-emptiness      *
-*************************************************/
-
-/* This function scans through a branch of a compiled pattern to see whether it
-can match the empty string or not. It is called only from could_be_empty()
-below. Note that first_significant_code() skips over assertions. If we hit an
-unclosed bracket, we return "empty" - this means we've struck an inner bracket
-whose current branch will already have been scanned.
-
-Arguments:
-  code        points to start of search
-  endcode     points to where to stop
-  utf8        TRUE if in UTF8 mode
-
-Returns:      TRUE if what is matched could be empty
-*/
-
-static BOOL
-could_be_empty_branch(const uschar *code, const uschar *endcode, BOOL utf8)
-{
-register int c;
-for (code = first_significant_code(code + 1 + LINK_SIZE, NULL, 0);
-     code < endcode;
-     code = first_significant_code(code + OP_lengths[c], NULL, 0))
-  {
-  const uschar *ccode;
-
-  c = *code;
-
-  if (c >= OP_BRA)
-    {
-    BOOL empty_branch;
-    if (GET(code, 1) == 0) return TRUE;    /* Hit unclosed bracket */
-
-    /* Scan a closed bracket */
-
-    empty_branch = FALSE;
-    do
-      {
-      if (!empty_branch && could_be_empty_branch(code, endcode, utf8))
-        empty_branch = TRUE;
-      code += GET(code, 1);
-      }
-    while (*code == OP_ALT);
-    if (!empty_branch) return FALSE;   /* All branches are non-empty */
-    code += 1 + LINK_SIZE;
-    c = *code;
-    }
-
-  else switch (c)
-    {
-    /* Check for quantifiers after a class */
-
-#ifdef SUPPORT_UTF8
-    case OP_XCLASS:
-    ccode = code + GET(code, 1);
-    goto CHECK_CLASS_REPEAT;
-#endif
-
-    case OP_CLASS:
-    case OP_NCLASS:
-    ccode = code + 33;
-
-#ifdef SUPPORT_UTF8
-    CHECK_CLASS_REPEAT:
-#endif
-
-    switch (*ccode)
-      {
-      case OP_CRSTAR:            /* These could be empty; continue */
-      case OP_CRMINSTAR:
-      case OP_CRQUERY:
-      case OP_CRMINQUERY:
-      break;
-
-      default:                   /* Non-repeat => class must match */
-      case OP_CRPLUS:            /* These repeats aren't empty */
-      case OP_CRMINPLUS:
-      return FALSE;
-
-      case OP_CRRANGE:
-      case OP_CRMINRANGE:
-      if (GET2(ccode, 1) > 0) return FALSE;  /* Minimum > 0 */
-      break;
-      }
-    break;
-
-    /* Opcodes that must match a character */
-
-    case OP_NOT_DIGIT:
-    case OP_DIGIT:
-    case OP_NOT_WHITESPACE:
-    case OP_WHITESPACE:
-    case OP_NOT_WORDCHAR:
-    case OP_WORDCHAR:
-    case OP_ANY:
-    case OP_ANYBYTE:
-    case OP_CHARS:
-    case OP_NOT:
-    case OP_PLUS:
-    case OP_MINPLUS:
-    case OP_EXACT:
-    case OP_NOTPLUS:
-    case OP_NOTMINPLUS:
-    case OP_NOTEXACT:
-    case OP_TYPEPLUS:
-    case OP_TYPEMINPLUS:
-    case OP_TYPEEXACT:
-    return FALSE;
-
-    /* End of branch */
-
-    case OP_KET:
-    case OP_KETRMAX:
-    case OP_KETRMIN:
-    case OP_ALT:
-    return TRUE;
-
-    /* In UTF-8 mode, STAR, MINSTAR, QUERY, MINQUERY, UPTO, and MINUPTO  may be
-    followed by a multibyte character */
-
-#ifdef SUPPORT_UTF8
-    case OP_STAR:
-    case OP_MINSTAR:
-    case OP_QUERY:
-    case OP_MINQUERY:
-    case OP_UPTO:
-    case OP_MINUPTO:
-    if (utf8) while ((code[2] & 0xc0) == 0x80) code++;
-    break;
-#endif
-    }
-  }
-
-return TRUE;
-}
-
-
-
-/*************************************************
-*    Scan compiled regex for non-emptiness       *
-*************************************************/
-
-/* This function is called to check for left recursive calls. We want to check
-the current branch of the current pattern to see if it could match the empty
-string. If it could, we must look outwards for branches at other levels,
-stopping when we pass beyond the bracket which is the subject of the recursion.
-
-Arguments:
-  code        points to start of the recursion
-  endcode     points to where to stop (current RECURSE item)
-  bcptr       points to the chain of current (unclosed) branch starts
-  utf8        TRUE if in UTF-8 mode
-
-Returns:      TRUE if what is matched could be empty
-*/
-
-static BOOL
-could_be_empty(const uschar *code, const uschar *endcode, branch_chain *bcptr,
-  BOOL utf8)
-{
-while (bcptr != NULL && bcptr->current >= code)
-  {
-  if (!could_be_empty_branch(bcptr->current, endcode, utf8)) return FALSE;
-  bcptr = bcptr->outer;
-  }
-return TRUE;
-}
-
-
-
-/*************************************************
-*           Check for POSIX class syntax         *
-*************************************************/
-
-/* This function is called when the sequence "[:" or "[." or "[=" is
-encountered in a character class. It checks whether this is followed by an
-optional ^ and then a sequence of letters, terminated by a matching ":]" or
-".]" or "=]".
-
-Argument:
-  ptr      pointer to the initial [
-  endptr   where to return the end pointer
-  cd       pointer to compile data
-
-Returns:   TRUE or FALSE
-*/
-
-static BOOL
-check_posix_syntax(const uschar *ptr, const uschar **endptr, compile_data *cd)
-{
-int terminator;          /* Don't combine these lines; the Solaris cc */
-terminator = *(++ptr);   /* compiler warns about "non-constant" initializer. */
-if (*(++ptr) == '^') ptr++;
-while ((cd->ctypes[*ptr] & ctype_letter) != 0) ptr++;
-if (*ptr == terminator && ptr[1] == ']')
-  {
-  *endptr = ptr;
-  return TRUE;
-  }
-return FALSE;
-}
-
-
-
-
-/*************************************************
-*          Check POSIX class name                *
-*************************************************/
-
-/* This function is called to check the name given in a POSIX-style class entry
-such as [:alnum:].
-
-Arguments:
-  ptr        points to the first letter
-  len        the length of the name
-
-Returns:     a value representing the name, or -1 if unknown
-*/
-
-static int
-check_posix_name(const uschar *ptr, int len)
-{
-register int yield = 0;
-while (posix_name_lengths[yield] != 0)
-  {
-  if (len == posix_name_lengths[yield] &&
-    strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield;
-  yield++;
-  }
-return -1;
-}
-
-
-
-
-/*************************************************
-*           Compile one branch                   *
-*************************************************/
-
-/* Scan the pattern, compiling it into the code vector. If the options are
-changed during the branch, the pointer is used to change the external options
-bits.
-
-Arguments:
-  optionsptr     pointer to the option bits
-  brackets       points to number of extracting brackets used
-  code           points to the pointer to the current code point
-  ptrptr         points to the current pattern pointer
-  errorptr       points to pointer to error message
-  firstbyteptr   set to initial literal character, or < 0 (REQ_UNSET, REQ_NONE)
-  reqbyteptr     set to the last literal character required, else < 0
-  bcptr          points to current branch chain
-  cd             contains pointers to tables etc.
-
-Returns:         TRUE on success
-                 FALSE, with *errorptr set on error
-*/
-
-static BOOL
-compile_branch(int *optionsptr, int *brackets, uschar **codeptr,
-  const uschar **ptrptr, const char **errorptr, int *firstbyteptr,
-  int *reqbyteptr, branch_chain *bcptr, compile_data *cd)
-{
-int repeat_type, op_type;
-int repeat_min = 0, repeat_max = 0;      /* To please picky compilers */
-int bravalue = 0;
-int length;
-int greedy_default, greedy_non_default;
-int firstbyte, reqbyte;
-int zeroreqbyte, zerofirstbyte;
-int req_caseopt, reqvary, tempreqvary;
-int condcount = 0;
-int options = *optionsptr;
-register int c;
-register uschar *code = *codeptr;
-uschar *tempcode;
-BOOL inescq = FALSE;
-BOOL groupsetfirstbyte = FALSE;
-const uschar *ptr = *ptrptr;
-const uschar *tempptr;
-uschar *previous = NULL;
-uschar class[32];
-
-#ifdef SUPPORT_UTF8
-BOOL class_utf8;
-BOOL utf8 = (options & PCRE_UTF8) != 0;
-uschar *class_utf8data;
-uschar utf8_char[6];
-#else
-BOOL utf8 = FALSE;
-#endif
-
-/* Set up the default and non-default settings for greediness */
-
-greedy_default = ((options & PCRE_UNGREEDY) != 0);
-greedy_non_default = greedy_default ^ 1;
-
-/* Initialize no first char, no required char. REQ_UNSET means "no char
-matching encountered yet". It gets changed to REQ_NONE if we hit something that
-matches a non-fixed char first char; reqbyte just remains unset if we never
-find one.
-
-When we hit a repeat whose minimum is zero, we may have to adjust these values
-to take the zero repeat into account. This is implemented by setting them to
-zerofirstbyte and zeroreqbyte when such a repeat is encountered. The individual
-item types that can be repeated set these backoff variables appropriately. */
-
-firstbyte = reqbyte = zerofirstbyte = zeroreqbyte = REQ_UNSET;
-
-/* The variable req_caseopt contains either the REQ_CASELESS value or zero,
-according to the current setting of the caseless flag. REQ_CASELESS is a bit
-value > 255. It is added into the firstbyte or reqbyte variables to record the
-case status of the value. */
-
-req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0;
-
-/* Switch on next character until the end of the branch */
-
-for (;; ptr++)
-  {
-  BOOL negate_class;
-  BOOL possessive_quantifier;
-  int class_charcount;
-  int class_lastchar;
-  int newoptions;
-  int recno;
-  int skipbytes;
-  int subreqbyte;
-  int subfirstbyte;
-
-  c = *ptr;
-  if (inescq && c != 0) goto NORMAL_CHAR;
-
-  if ((options & PCRE_EXTENDED) != 0)
-    {
-    if ((cd->ctypes[c] & ctype_space) != 0) continue;
-    if (c == '#')
-      {
-      /* The space before the ; is to avoid a warning on a silly compiler
-      on the Macintosh. */
-      while ((c = *(++ptr)) != 0 && c != NEWLINE) ;
-      if (c != 0) continue;   /* Else fall through to handle end of string */
-      }
-    }
-
-  switch(c)
-    {
-    /* The branch terminates at end of string, |, or ). */
-
-    case 0:
-    case '|':
-    case ')':
-    *firstbyteptr = firstbyte;
-    *reqbyteptr = reqbyte;
-    *codeptr = code;
-    *ptrptr = ptr;
-    return TRUE;
-
-    /* Handle single-character metacharacters. In multiline mode, ^ disables
-    the setting of any following char as a first character. */
-
-    case '^':
-    if ((options & PCRE_MULTILINE) != 0)
-      {
-      if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
-      }
-    previous = NULL;
-    *code++ = OP_CIRC;
-    break;
-
-    case '$':
-    previous = NULL;
-    *code++ = OP_DOLL;
-    break;
-
-    /* There can never be a first char if '.' is first, whatever happens about
-    repeats. The value of reqbyte doesn't change either. */
-
-    case '.':
-    if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
-    zerofirstbyte = firstbyte;
-    zeroreqbyte = reqbyte;
-    previous = code;
-    *code++ = OP_ANY;
-    break;
-
-    /* Character classes. If the included characters are all < 255 in value, we
-    build a 32-byte bitmap of the permitted characters, except in the special
-    case where there is only one such character. For negated classes, we build
-    the map as usual, then invert it at the end. However, we use a different
-    opcode so that data characters > 255 can be handled correctly.
-
-    If the class contains characters outside the 0-255 range, a different
-    opcode is compiled. It may optionally have a bit map for characters < 256,
-    but those above are are explicitly listed afterwards. A flag byte tells
-    whether the bitmap is present, and whether this is a negated class or not.
-    */
-
-    case '[':
-    previous = code;
-
-    /* PCRE supports POSIX class stuff inside a class. Perl gives an error if
-    they are encountered at the top level, so we'll do that too. */
-
-    if ((ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') &&
-        check_posix_syntax(ptr, &tempptr, cd))
-      {
-      *errorptr = (ptr[1] == ':')? ERR13 : ERR31;
-      goto FAILED;
-      }
-
-    /* If the first character is '^', set the negation flag and skip it. */
-
-    if ((c = *(++ptr)) == '^')
-      {
-      negate_class = TRUE;
-      c = *(++ptr);
-      }
-    else
-      {
-      negate_class = FALSE;
-      }
-
-    /* Keep a count of chars with values < 256 so that we can optimize the case
-    of just a single character (as long as it's < 256). For higher valued UTF-8
-    characters, we don't yet do any optimization. */
-
-    class_charcount = 0;
-    class_lastchar = -1;
-
-#ifdef SUPPORT_UTF8
-    class_utf8 = FALSE;                       /* No chars >= 256 */
-    class_utf8data = code + LINK_SIZE + 34;   /* For UTF-8 items */
-#endif
-
-    /* Initialize the 32-char bit map to all zeros. We have to build the
-    map in a temporary bit of store, in case the class contains only 1
-    character (< 256), because in that case the compiled code doesn't use the
-    bit map. */
-
-    memset(class, 0, 32 * sizeof(uschar));
-
-    /* Process characters until ] is reached. By writing this as a "do" it
-    means that an initial ] is taken as a data character. The first pass
-    through the regex checked the overall syntax, so we don't need to be very
-    strict here. At the start of the loop, c contains the first byte of the
-    character. */
-
-    do
-      {
-#ifdef SUPPORT_UTF8
-      if (utf8 && c > 127)
-        {                           /* Braces are required because the */
-        GETCHARLEN(c, ptr, ptr);    /* macro generates multiple statements */
-        }
-#endif
-
-      /* Inside \Q...\E everything is literal except \E */
-
-      if (inescq)
-        {
-        if (c == '\\' && ptr[1] == 'E')
-          {
-          inescq = FALSE;
-          ptr++;
-          continue;
-          }
-        else goto LONE_SINGLE_CHARACTER;
-        }
-
-      /* Handle POSIX class names. Perl allows a negation extension of the
-      form [:^name:]. A square bracket that doesn't match the syntax is
-      treated as a literal. We also recognize the POSIX constructions
-      [.ch.] and [=ch=] ("collating elements") and fault them, as Perl
-      5.6 and 5.8 do. */
-
-      if (c == '[' &&
-          (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') &&
-          check_posix_syntax(ptr, &tempptr, cd))
-        {
-        BOOL local_negate = FALSE;
-        int posix_class, i;
-        register const uschar *cbits = cd->cbits;
-
-        if (ptr[1] != ':')
-          {
-          *errorptr = ERR31;
-          goto FAILED;
-          }
-
-        ptr += 2;
-        if (*ptr == '^')
-          {
-          local_negate = TRUE;
-          ptr++;
-          }
-
-        posix_class = check_posix_name(ptr, tempptr - ptr);
-        if (posix_class < 0)
-          {
-          *errorptr = ERR30;
-          goto FAILED;
-          }
-
-        /* If matching is caseless, upper and lower are converted to
-        alpha. This relies on the fact that the class table starts with
-        alpha, lower, upper as the first 3 entries. */
-
-        if ((options & PCRE_CASELESS) != 0 && posix_class <= 2)
-          posix_class = 0;
-
-        /* Or into the map we are building up to 3 of the static class
-        tables, or their negations. The [:blank:] class sets up the same
-        chars as the [:space:] class (all white space). We remove the vertical
-        white space chars afterwards. */
-
-        posix_class *= 3;
-        for (i = 0; i < 3; i++)
-          {
-          BOOL isblank = strncmp((char *)ptr, "blank", 5) == 0;
-          int taboffset = posix_class_maps[posix_class + i];
-          if (taboffset < 0) break;
-          if (local_negate)
-            {
-            for (c = 0; c < 32; c++) class[c] |= ~cbits[c+taboffset];
-            if (isblank) class[1] |= 0x3c;
-            }
-          else
-            {
-            for (c = 0; c < 32; c++) class[c] |= cbits[c+taboffset];
-            if (isblank) class[1] &= ~0x3c;
-            }
-          }
-
-        ptr = tempptr + 1;
-        class_charcount = 10;  /* Set > 1; assumes more than 1 per class */
-        continue;    /* End of POSIX syntax handling */
-        }
-
-      /* Backslash may introduce a single character, or it may introduce one
-      of the specials, which just set a flag. Escaped items are checked for
-      validity in the pre-compiling pass. The sequence \b is a special case.
-      Inside a class (and only there) it is treated as backspace. Elsewhere
-      it marks a word boundary. Other escapes have preset maps ready to
-      or into the one we are building. We assume they have more than one
-      character in them, so set class_charcount bigger than one. */
-
-      if (c == '\\')
-        {
-        c = check_escape(&ptr, errorptr, *brackets, options, TRUE, cd);
-        if (-c == ESC_b) c = '\b';  /* \b is backslash in a class */
-
-        if (-c == ESC_Q)            /* Handle start of quoted string */
-          {
-          if (ptr[1] == '\\' && ptr[2] == 'E')
-            {
-            ptr += 2; /* avoid empty string */
-            }
-          else inescq = TRUE;
-          continue;
-          }
-
-        else if (c < 0)
-          {
-          register const uschar *cbits = cd->cbits;
-          class_charcount = 10;     /* Greater than 1 is what matters */
-          switch (-c)
-            {
-            case ESC_d:
-            for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_digit];
-            continue;
-
-            case ESC_D:
-            for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_digit];
-            continue;
-
-            case ESC_w:
-            for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_word];
-            continue;
-
-            case ESC_W:
-            for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_word];
-            continue;
-
-            case ESC_s:
-            for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_space];
-            class[1] &= ~0x08;   /* Perl 5.004 onwards omits VT from \s */
-            continue;
-
-            case ESC_S:
-            for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_space];
-            class[1] |= 0x08;    /* Perl 5.004 onwards omits VT from \s */
-            continue;
-
-            /* Unrecognized escapes are faulted if PCRE is running in its
-            strict mode. By default, for compatibility with Perl, they are
-            treated as literals. */
-
-            default:
-            if ((options & PCRE_EXTRA) != 0)
-              {
-              *errorptr = ERR7;
-              goto FAILED;
-              }
-            c = *ptr;    /* The final character */
-            }
-          }
-
-        /* Fall through if we have a single character (c >= 0). This may be
-        > 256 in UTF-8 mode. */
-
-        }   /* End of backslash handling */
-
-      /* A single character may be followed by '-' to form a range. However,
-      Perl does not permit ']' to be the end of the range. A '-' character
-      here is treated as a literal. */
-
-      if (ptr[1] == '-' && ptr[2] != ']')
-        {
-        int d;
-        ptr += 2;
-
-#ifdef SUPPORT_UTF8
-        if (utf8)
-          {                           /* Braces are required because the */
-          GETCHARLEN(d, ptr, ptr);    /* macro generates multiple statements */
-          }
-        else
-#endif
-        d = *ptr;
-
-        /* The second part of a range can be a single-character escape, but
-        not any of the other escapes. Perl 5.6 treats a hyphen as a literal
-        in such circumstances. */
-
-        if (d == '\\')
-          {
-          const uschar *oldptr = ptr;
-          d = check_escape(&ptr, errorptr, *brackets, options, TRUE, cd);
-
-          /* \b is backslash; any other special means the '-' was literal */
-
-          if (d < 0)
-            {
-            if (d == -ESC_b) d = '\b'; else
-              {
-              ptr = oldptr - 2;
-              goto LONE_SINGLE_CHARACTER;  /* A few lines below */
-              }
-            }
-          }
-
-        /* Check that the two values are in the correct order */
-
-        if (d < c)
-          {
-          *errorptr = ERR8;
-          goto FAILED;
-          }
-
-        /* If d is greater than 255, we can't just use the bit map, so set up
-        for the UTF-8 supporting class type. If we are not caseless, we can
-        just set up a single range. If we are caseless, the characters < 256
-        are handled with a bitmap, in order to get the case-insensitive
-        handling. */
-
-#ifdef SUPPORT_UTF8
-        if (d > 255)
-          {
-          class_utf8 = TRUE;
-          *class_utf8data++ = XCL_RANGE;
-          if ((options & PCRE_CASELESS) == 0)
-            {
-            class_utf8data += ord2utf8(c, class_utf8data);
-            class_utf8data += ord2utf8(d, class_utf8data);
-            continue;  /* Go get the next char in the class */
-            }
-          class_utf8data += ord2utf8(256, class_utf8data);
-          class_utf8data += ord2utf8(d, class_utf8data);
-          d = 255;
-          /* Fall through */
-          }
-#endif
-        /* We use the bit map if the range is entirely < 255, or if part of it
-        is < 255 and matching is caseless. */
-
-        for (; c <= d; c++)
-          {
-          class[c/8] |= (1 << (c&7));
-          if ((options & PCRE_CASELESS) != 0)
-            {
-            int uc = cd->fcc[c];           /* flip case */
-            class[uc/8] |= (1 << (uc&7));
-            }
-          class_charcount++;                /* in case a one-char range */
-          class_lastchar = c;
-          }
-
-        continue;   /* Go get the next char in the class */
-        }
-
-      /* Handle a lone single character - we can get here for a normal
-      non-escape char, or after \ that introduces a single character. */
-
-      LONE_SINGLE_CHARACTER:
-
-      /* Handle a multibyte character */
-
-#ifdef SUPPORT_UTF8
-      if (utf8 && c > 255)
-        {
-        class_utf8 = TRUE;
-        *class_utf8data++ = XCL_SINGLE;
-        class_utf8data += ord2utf8(c, class_utf8data);
-        }
-      else
-#endif
-      /* Handle a single-byte character */
-        {
-        class [c/8] |= (1 << (c&7));
-        if ((options & PCRE_CASELESS) != 0)
-          {
-          c = cd->fcc[c];   /* flip case */
-          class[c/8] |= (1 << (c&7));
-          }
-        class_charcount++;
-        class_lastchar = c;
-        }
-      }
-
-    /* Loop until ']' reached; the check for end of string happens inside the
-    loop. This "while" is the end of the "do" above. */
-
-    while ((c = *(++ptr)) != ']' || inescq);
-
-    /* If class_charcount is 1, we saw precisely one character with a value <
-    256. In UTF-8 mode, we can optimize if there were no characters >= 256 and
-    the one character is < 128. In non-UTF-8 mode we can always optimize.
-
-    The optimization throws away the bit map. We turn the item into a
-    1-character OP_CHARS if it's positive, or OP_NOT if it's negative. Note
-    that OP_NOT does not support multibyte characters. In the positive case, it
-    can cause firstbyte to be set. Otherwise, there can be no first char if
-    this item is first, whatever repeat count may follow. In the case of
-    reqbyte, save the previous value for reinstating. */
-
-#ifdef SUPPORT_UTF8
-    if (class_charcount == 1 &&
-          (!utf8 ||
-          (!class_utf8 && class_lastchar < 128)))
-#else
-    if (class_charcount == 1)
-#endif
-      {
-      zeroreqbyte = reqbyte;
-      if (negate_class)
-        {
-        if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
-        zerofirstbyte = firstbyte;
-        *code++ = OP_NOT;
-        }
-      else
-        {
-        if (firstbyte == REQ_UNSET)
-          {
-          zerofirstbyte = REQ_NONE;
-          firstbyte = class_lastchar | req_caseopt;
-          }
-        else
-          {
-          zerofirstbyte = firstbyte;
-          reqbyte = class_lastchar | req_caseopt | cd->req_varyopt;
-          }
-        *code++ = OP_CHARS;
-        *code++ = 1;
-        }
-      *code++ = class_lastchar;
-      break;  /* End of class handling */
-      }       /* End of 1-byte optimization */
-
-    /* Otherwise, if this is the first thing in the branch, there can be no
-    first char setting, whatever the repeat count. Any reqbyte setting must
-    remain unchanged after any kind of repeat. */
-
-    if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
-    zerofirstbyte = firstbyte;
-    zeroreqbyte = reqbyte;
-
-    /* If there are characters with values > 255, we have to compile an
-    extended class, with its own opcode. If there are no characters < 256,
-    we can omit the bitmap. */
-
-#ifdef SUPPORT_UTF8
-    if (class_utf8)
-      {
-      *class_utf8data++ = XCL_END;    /* Marks the end of extra data */
-      *code++ = OP_XCLASS;
-      code += LINK_SIZE;
-      *code = negate_class? XCL_NOT : 0;
-
-      /* If the map is required, install it, and move on to the end of
-      the extra data */
-
-      if (class_charcount > 0)
-        {
-        *code++ |= XCL_MAP;
-        memcpy(code, class, 32);
-        code = class_utf8data;
-        }
-
-      /* If the map is not required, slide down the extra data. */
-
-      else
-        {
-        int len = class_utf8data - (code + 33);
-        memmove(code + 1, code + 33, len);
-        code += len + 1;
-        }
-
-      /* Now fill in the complete length of the item */
-
-      PUT(previous, 1, code - previous);
-      break;   /* End of class handling */
-      }
-#endif
-
-    /* If there are no characters > 255, negate the 32-byte map if necessary,
-    and copy it into the code vector. If this is the first thing in the branch,
-    there can be no first char setting, whatever the repeat count. Any reqbyte
-    setting must remain unchanged after any kind of repeat. */
-
-    if (negate_class)
-      {
-      *code++ = OP_NCLASS;
-      for (c = 0; c < 32; c++) code[c] = ~class[c];
-      }
-    else
-      {
-      *code++ = OP_CLASS;
-      memcpy(code, class, 32);
-      }
-    code += 32;
-    break;
-
-    /* Various kinds of repeat */
-
-    case '{':
-    if (!is_counted_repeat(ptr+1, cd)) goto NORMAL_CHAR;
-    ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorptr, cd);
-    if (*errorptr != NULL) goto FAILED;
-    goto REPEAT;
-
-    case '*':
-    repeat_min = 0;
-    repeat_max = -1;
-    goto REPEAT;
-
-    case '+':
-    repeat_min = 1;
-    repeat_max = -1;
-    goto REPEAT;
-
-    case '?':
-    repeat_min = 0;
-    repeat_max = 1;
-
-    REPEAT:
-    if (previous == NULL)
-      {
-      *errorptr = ERR9;
-      goto FAILED;
-      }
-
-    if (repeat_min == 0)
-      {
-      firstbyte = zerofirstbyte;    /* Adjust for zero repeat */
-      reqbyte = zeroreqbyte;        /* Ditto */
-      }
-
-    /* Remember whether this is a variable length repeat */
-
-    reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY;
-
-    op_type = 0;                    /* Default single-char op codes */
-    possessive_quantifier = FALSE;  /* Default not possessive quantifier */
-
-    /* Save start of previous item, in case we have to move it up to make space
-    for an inserted OP_ONCE for the additional '+' extension. */
-
-    tempcode = previous;
-
-    /* If the next character is '+', we have a possessive quantifier. This
-    implies greediness, whatever the setting of the PCRE_UNGREEDY option.
-    If the next character is '?' this is a minimizing repeat, by default,
-    but if PCRE_UNGREEDY is set, it works the other way round. We change the
-    repeat type to the non-default. */
-
-    if (ptr[1] == '+')
-      {
-      repeat_type = 0;                  /* Force greedy */
-      possessive_quantifier = TRUE;
-      ptr++;
-      }
-    else if (ptr[1] == '?')
-      {
-      repeat_type = greedy_non_default;
-      ptr++;
-      }
-    else repeat_type = greedy_default;
-
-    /* If previous was a recursion, we need to wrap it inside brackets so that
-    it can be replicated if necessary. */
-
-    if (*previous == OP_RECURSE)
-      {
-      memmove(previous + 1 + LINK_SIZE, previous, 1 + LINK_SIZE);
-      code += 1 + LINK_SIZE;
-      *previous = OP_BRA;
-      PUT(previous, 1, code - previous);
-      *code = OP_KET;
-      PUT(code, 1, code - previous);
-      code += 1 + LINK_SIZE;
-      }
-
-    /* If previous was a string of characters, chop off the last one and use it
-    as the subject of the repeat. If there was only one character, we can
-    abolish the previous item altogether. If a one-char item has a minumum of
-    more than one, ensure that it is set in reqbyte - it might not be if a
-    sequence such as x{3} is the first thing in a branch because the x will
-    have gone into firstbyte instead.  */
-
-    if (*previous == OP_CHARS)
-      {
-      /* Deal with UTF-8 characters that take up more than one byte. It's
-      easier to write this out separately than try to macrify it. Use c to
-      hold the length of the character in bytes, plus 0x80 to flag that it's a
-      length rather than a small character. */
-
-#ifdef SUPPORT_UTF8
-      if (utf8 && (code[-1] & 0x80) != 0)
-        {
-        uschar *lastchar = code - 1;
-        while((*lastchar & 0xc0) == 0x80) lastchar--;
-        c = code - lastchar;            /* Length of UTF-8 character */
-        memcpy(utf8_char, lastchar, c); /* Save the char */
-        if (lastchar == previous + 2)   /* There was only one character */
-          {
-          code = previous;              /* Abolish the previous item */
-          }
-        else
-          {
-          previous[1] -= c;             /* Adjust length of previous */
-          code = lastchar;              /* Lost char off the end */
-          tempcode = code;              /* Adjust position to be moved for '+' */
-          }
-        c |= 0x80;                      /* Flag c as a length */
-        }
-      else
-#endif
-
-      /* Handle the case of a single byte - either with no UTF8 support, or
-      with UTF-8 disabled, or for a UTF-8 character < 128. */
-
-        {
-        c = *(--code);
-        if (code == previous + 2)   /* There was only one character */
-          {
-          code = previous;              /* Abolish the previous item */
-          if (repeat_min > 1) reqbyte = c | req_caseopt | cd->req_varyopt;
-          }
-        else
-          {
-          previous[1]--;             /* adjust length */
-          tempcode = code;           /* Adjust position to be moved for '+' */
-          }
-        }
-
-      goto OUTPUT_SINGLE_REPEAT;   /* Code shared with single character types */
-      }
-
-    /* If previous was a single negated character ([^a] or similar), we use
-    one of the special opcodes, replacing it. The code is shared with single-
-    character repeats by setting opt_type to add a suitable offset into
-    repeat_type. OP_NOT is currently used only for single-byte chars. */
-
-    else if (*previous == OP_NOT)
-      {
-      op_type = OP_NOTSTAR - OP_STAR;  /* Use "not" opcodes */
-      c = previous[1];
-      code = previous;
-      goto OUTPUT_SINGLE_REPEAT;
-      }
-
-    /* If previous was a character type match (\d or similar), abolish it and
-    create a suitable repeat item. The code is shared with single-character
-    repeats by setting op_type to add a suitable offset into repeat_type. */
-
-    else if (*previous < OP_EODN)
-      {
-      op_type = OP_TYPESTAR - OP_STAR;  /* Use type opcodes */
-      c = *previous;
-      code = previous;
-
-      OUTPUT_SINGLE_REPEAT:
-
-      /* If the maximum is zero then the minimum must also be zero; Perl allows
-      this case, so we do too - by simply omitting the item altogether. */
-
-      if (repeat_max == 0) goto END_REPEAT;
-
-      /* Combine the op_type with the repeat_type */
-
-      repeat_type += op_type;
-
-      /* A minimum of zero is handled either as the special case * or ?, or as
-      an UPTO, with the maximum given. */
-
-      if (repeat_min == 0)
-        {
-        if (repeat_max == -1) *code++ = OP_STAR + repeat_type;
-          else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type;
-        else
-          {
-          *code++ = OP_UPTO + repeat_type;
-          PUT2INC(code, 0, repeat_max);
-          }
-        }
-
-      /* The case {1,} is handled as the special case + */
-
-      else if (repeat_min == 1 && repeat_max == -1)
-        *code++ = OP_PLUS + repeat_type;
-
-      /* The case {n,n} is just an EXACT, while the general case {n,m} is
-      handled as an EXACT followed by an UPTO. An EXACT of 1 is optimized. */
-
-      else
-        {
-        if (repeat_min != 1)
-          {
-          *code++ = OP_EXACT + op_type;  /* NB EXACT doesn't have repeat_type */
-          PUT2INC(code, 0, repeat_min);
-          }
-
-        /* If the mininum is 1 and the previous item was a character string,
-        we either have to put back the item that got cancelled if the string
-        length was 1, or add the character back onto the end of a longer
-        string. For a character type nothing need be done; it will just get
-        put back naturally. Note that the final character is always going to
-        get added below, so we leave code ready for its insertion. */
-
-        else if (*previous == OP_CHARS)
-          {
-          if (code == previous) code += 2; else
-
-          /* In UTF-8 mode, a multibyte char has its length in c, with the 0x80
-          bit set as a flag. The length will always be between 2 and 6. */
-
-#ifdef SUPPORT_UTF8
-          if (utf8 && c >= 128) previous[1] += c & 7; else
-#endif
-          previous[1]++;
-          }
-
-        /*  For a single negated character we also have to put back the
-        item that got cancelled. At present this applies only to single byte
-        characters in any mode. */
-
-        else if (*previous == OP_NOT) code++;
-
-        /* If the maximum is unlimited, insert an OP_STAR. Before doing so,
-        we have to insert the character for the previous code. In UTF-8 mode,
-        long characters have their length in c, with the 0x80 bit as a flag. */
-
-        if (repeat_max < 0)
-          {
-#ifdef SUPPORT_UTF8
-          if (utf8 && c >= 128)
-            {
-            memcpy(code, utf8_char, c & 7);
-            code += c & 7;
-            }
-          else
-#endif
-          *code++ = c;
-          *code++ = OP_STAR + repeat_type;
-          }
-
-        /* Else insert an UPTO if the max is greater than the min, again
-        preceded by the character, for the previously inserted code. */
-
-        else if (repeat_max != repeat_min)
-          {
-#ifdef SUPPORT_UTF8
-          if (utf8 && c >= 128)
-            {
-            memcpy(code, utf8_char, c & 7);
-            code += c & 7;
-            }
-          else
-#endif
-          *code++ = c;
-          repeat_max -= repeat_min;
-          *code++ = OP_UPTO + repeat_type;
-          PUT2INC(code, 0, repeat_max);
-          }
-        }
-
-      /* The character or character type itself comes last in all cases. */
-
-#ifdef SUPPORT_UTF8
-      if (utf8 && c >= 128)
-        {
-        memcpy(code, utf8_char, c & 7);
-        code += c & 7;
-        }
-      else
-#endif
-
-      *code++ = c;
-      }
-
-    /* If previous was a character class or a back reference, we put the repeat
-    stuff after it, but just skip the item if the repeat was {0,0}. */
-
-    else if (*previous == OP_CLASS ||
-             *previous == OP_NCLASS ||
-#ifdef SUPPORT_UTF8
-             *previous == OP_XCLASS ||
-#endif
-             *previous == OP_REF)
-      {
-      if (repeat_max == 0)
-        {
-        code = previous;
-        goto END_REPEAT;
-        }
-      if (repeat_min == 0 && repeat_max == -1)
-        *code++ = OP_CRSTAR + repeat_type;
-      else if (repeat_min == 1 && repeat_max == -1)
-        *code++ = OP_CRPLUS + repeat_type;
-      else if (repeat_min == 0 && repeat_max == 1)
-        *code++ = OP_CRQUERY + repeat_type;
-      else
-        {
-        *code++ = OP_CRRANGE + repeat_type;
-        PUT2INC(code, 0, repeat_min);
-        if (repeat_max == -1) repeat_max = 0;  /* 2-byte encoding for max */
-        PUT2INC(code, 0, repeat_max);
-        }
-      }
-
-    /* If previous was a bracket group, we may have to replicate it in certain
-    cases. */
-
-    else if (*previous >= OP_BRA || *previous == OP_ONCE ||
-             *previous == OP_COND)
-      {
-      register int i;
-      int ketoffset = 0;
-      int len = code - previous;
-      uschar *bralink = NULL;
-
-      /* If the maximum repeat count is unlimited, find the end of the bracket
-      by scanning through from the start, and compute the offset back to it
-      from the current code pointer. There may be an OP_OPT setting following
-      the final KET, so we can't find the end just by going back from the code
-      pointer. */
-
-      if (repeat_max == -1)
-        {
-        register uschar *ket = previous;
-        do ket += GET(ket, 1); while (*ket != OP_KET);
-        ketoffset = code - ket;
-        }
-
-      /* The case of a zero minimum is special because of the need to stick
-      OP_BRAZERO in front of it, and because the group appears once in the
-      data, whereas in other cases it appears the minimum number of times. For
-      this reason, it is simplest to treat this case separately, as otherwise
-      the code gets far too messy. There are several special subcases when the
-      minimum is zero. */
-
-      if (repeat_min == 0)
-        {
-        /* If the maximum is also zero, we just omit the group from the output
-        altogether. */
-
-        if (repeat_max == 0)
-          {
-          code = previous;
-          goto END_REPEAT;
-          }
-
-        /* If the maximum is 1 or unlimited, we just have to stick in the
-        BRAZERO and do no more at this point. */
-
-        if (repeat_max <= 1)
-          {
-          memmove(previous+1, previous, len);
-          code++;
-          *previous++ = OP_BRAZERO + repeat_type;
-          }
-
-        /* If the maximum is greater than 1 and limited, we have to replicate
-        in a nested fashion, sticking OP_BRAZERO before each set of brackets.
-        The first one has to be handled carefully because it's the original
-        copy, which has to be moved up. The remainder can be handled by code
-        that is common with the non-zero minimum case below. We just have to
-        adjust the value or repeat_max, since one less copy is required. */
-
-        else
-          {
-          int offset;
-          memmove(previous + 2 + LINK_SIZE, previous, len);
-          code += 2 + LINK_SIZE;
-          *previous++ = OP_BRAZERO + repeat_type;
-          *previous++ = OP_BRA;
-
-          /* We chain together the bracket offset fields that have to be
-          filled in later when the ends of the brackets are reached. */
-
-          offset = (bralink == NULL)? 0 : previous - bralink;
-          bralink = previous;
-          PUTINC(previous, 0, offset);
-          }
-
-        repeat_max--;
-        }
-
-      /* If the minimum is greater than zero, replicate the group as many
-      times as necessary, and adjust the maximum to the number of subsequent
-      copies that we need. If we set a first char from the group, and didn't
-      set a required char, copy the latter from the former. */
-
-      else
-        {
-        if (repeat_min > 1)
-          {
-          if (groupsetfirstbyte && reqbyte < 0) reqbyte = firstbyte;
-          for (i = 1; i < repeat_min; i++)
-            {
-            memcpy(code, previous, len);
-            code += len;
-            }
-          }
-        if (repeat_max > 0) repeat_max -= repeat_min;
-        }
-
-      /* This code is common to both the zero and non-zero minimum cases. If
-      the maximum is limited, it replicates the group in a nested fashion,
-      remembering the bracket starts on a stack. In the case of a zero minimum,
-      the first one was set up above. In all cases the repeat_max now specifies
-      the number of additional copies needed. */
-
-      if (repeat_max >= 0)
-        {
-        for (i = repeat_max - 1; i >= 0; i--)
-          {
-          *code++ = OP_BRAZERO + repeat_type;
-
-          /* All but the final copy start a new nesting, maintaining the
-          chain of brackets outstanding. */
-
-          if (i != 0)
-            {
-            int offset;
-            *code++ = OP_BRA;
-            offset = (bralink == NULL)? 0 : code - bralink;
-            bralink = code;
-            PUTINC(code, 0, offset);
-            }
-
-          memcpy(code, previous, len);
-          code += len;
-          }
-
-        /* Now chain through the pending brackets, and fill in their length
-        fields (which are holding the chain links pro tem). */
-
-        while (bralink != NULL)
-          {
-          int oldlinkoffset;
-          int offset = code - bralink + 1;
-          uschar *bra = code - offset;
-          oldlinkoffset = GET(bra, 1);
-          bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset;
-          *code++ = OP_KET;
-          PUTINC(code, 0, offset);
-          PUT(bra, 1, offset);
-          }
-        }
-
-      /* If the maximum is unlimited, set a repeater in the final copy. We
-      can't just offset backwards from the current code point, because we
-      don't know if there's been an options resetting after the ket. The
-      correct offset was computed above. */
-
-      else code[-ketoffset] = OP_KETRMAX + repeat_type;
-      }
-
-    /* Else there's some kind of shambles */
-
-    else
-      {
-      *errorptr = ERR11;
-      goto FAILED;
-      }
-
-    /* If the character following a repeat is '+', we wrap the entire repeated
-    item inside OP_ONCE brackets. This is just syntactic sugar, taken from
-    Sun's Java package. The repeated item starts at tempcode, not at previous,
-    which might be the first part of a string whose (former) last char we
-    repeated. However, we don't support '+' after a greediness '?'. */
-
-    if (possessive_quantifier)
-      {
-      int len = code - tempcode;
-      memmove(tempcode + 1+LINK_SIZE, tempcode, len);
-      code += 1 + LINK_SIZE;
-      len += 1 + LINK_SIZE;
-      tempcode[0] = OP_ONCE;
-      *code++ = OP_KET;
-      PUTINC(code, 0, len);
-      PUT(tempcode, 1, len);
-      }
-
-    /* In all case we no longer have a previous item. We also set the
-    "follows varying string" flag for subsequently encountered reqbytes if
-    it isn't already set and we have just passed a varying length item. */
-
-    END_REPEAT:
-    previous = NULL;
-    cd->req_varyopt |= reqvary;
-    break;
-
-
-    /* Start of nested bracket sub-expression, or comment or lookahead or
-    lookbehind or option setting or condition. First deal with special things
-    that can come after a bracket; all are introduced by ?, and the appearance
-    of any of them means that this is not a referencing group. They were
-    checked for validity in the first pass over the string, so we don't have to
-    check for syntax errors here.  */
-
-    case '(':
-    newoptions = options;
-    skipbytes = 0;
-
-    if (*(++ptr) == '?')
-      {
-      int set, unset;
-      int *optset;
-
-      switch (*(++ptr))
-        {
-        case '#':                 /* Comment; skip to ket */
-        ptr++;
-        while (*ptr != ')') ptr++;
-        continue;
-
-        case ':':                 /* Non-extracting bracket */
-        bravalue = OP_BRA;
-        ptr++;
-        break;
-
-        case '(':
-        bravalue = OP_COND;       /* Conditional group */
-
-        /* Condition to test for recursion */
-
-        if (ptr[1] == 'R')
-          {
-          code[1+LINK_SIZE] = OP_CREF;
-          PUT2(code, 2+LINK_SIZE, CREF_RECURSE);
-          skipbytes = 3;
-          ptr += 3;
-          }
-
-        /* Condition to test for a numbered subpattern match. We know that
-        if a digit follows ( then there will just be digits until ) because
-        the syntax was checked in the first pass. */
-
-        else if ((digitab[ptr[1]] && ctype_digit) != 0)
-          {
-          int condref;                 /* Don't amalgamate; some compilers */
-          condref = *(++ptr) - '0';    /* grumble at autoincrement in declaration */
-          while (*(++ptr) != ')') condref = condref*10 + *ptr - '0';
-          if (condref == 0)
-            {
-            *errorptr = ERR35;
-            goto FAILED;
-            }
-          ptr++;
-          code[1+LINK_SIZE] = OP_CREF;
-          PUT2(code, 2+LINK_SIZE, condref);
-          skipbytes = 3;
-          }
-        /* For conditions that are assertions, we just fall through, having
-        set bravalue above. */
-        break;
-
-        case '=':                 /* Positive lookahead */
-        bravalue = OP_ASSERT;
-        ptr++;
-        break;
-
-        case '!':                 /* Negative lookahead */
-        bravalue = OP_ASSERT_NOT;
-        ptr++;
-        break;
-
-        case '<':                 /* Lookbehinds */
-        switch (*(++ptr))
-          {
-          case '=':               /* Positive lookbehind */
-          bravalue = OP_ASSERTBACK;
-          ptr++;
-          break;
-
-          case '!':               /* Negative lookbehind */
-          bravalue = OP_ASSERTBACK_NOT;
-          ptr++;
-          break;
-          }
-        break;
-
-        case '>':                 /* One-time brackets */
-        bravalue = OP_ONCE;
-        ptr++;
-        break;
-
-        case 'C':                 /* Callout - may be followed by digits */
-        *code++ = OP_CALLOUT;
-          {
-          int n = 0;
-          while ((digitab[*(++ptr)] & ctype_digit) != 0)
-            n = n * 10 + *ptr - '0';
-          if (n > 255)
-            {
-            *errorptr = ERR38;
-            goto FAILED;
-            }
-          *code++ = n;
-          }
-        previous = NULL;
-        continue;
-
-        case 'P':                 /* Named subpattern handling */
-        if (*(++ptr) == '<')      /* Definition */
-          {
-          int i, namelen;
-          uschar *slot = cd->name_table;
-          const uschar *name;     /* Don't amalgamate; some compilers */
-          name = ++ptr;           /* grumble at autoincrement in declaration */
-
-          while (*ptr++ != '>');
-          namelen = ptr - name - 1;
-
-          for (i = 0; i < cd->names_found; i++)
-            {
-            int crc = memcmp(name, slot+2, namelen);
-            if (crc == 0)
-              {
-              if (slot[2+namelen] == 0)
-                {
-                *errorptr = ERR43;
-                goto FAILED;
-                }
-              crc = -1;             /* Current name is substring */
-              }
-            if (crc < 0)
-              {
-              memmove(slot + cd->name_entry_size, slot,
-                (cd->names_found - i) * cd->name_entry_size);
-              break;
-              }
-            slot += cd->name_entry_size;
-            }
-
-          PUT2(slot, 0, *brackets + 1);
-          memcpy(slot + 2, name, namelen);
-          slot[2+namelen] = 0;
-          cd->names_found++;
-          goto NUMBERED_GROUP;
-          }
-
-        if (*ptr == '=' || *ptr == '>')  /* Reference or recursion */
-          {
-          int i, namelen;
-          int type = *ptr++;
-          const uschar *name = ptr;
-          uschar *slot = cd->name_table;
-
-          while (*ptr != ')') ptr++;
-          namelen = ptr - name;
-
-          for (i = 0; i < cd->names_found; i++)
-            {
-            if (strncmp((char *)name, (char *)slot+2, namelen) == 0) break;
-            slot += cd->name_entry_size;
-            }
-          if (i >= cd->names_found)
-            {
-            *errorptr = ERR15;
-            goto FAILED;
-            }
-
-          recno = GET2(slot, 0);
-
-          if (type == '>') goto HANDLE_RECURSION;  /* A few lines below */
-
-          /* Back reference */
-
-          previous = code;
-          *code++ = OP_REF;
-          PUT2INC(code, 0, recno);
-          cd->backref_map |= (recno < 32)? (1 << recno) : 1;
-          if (recno > cd->top_backref) cd->top_backref = recno;
-          continue;
-          }
-
-        /* Should never happen */
-        break;
-
-        case 'R':                 /* Pattern recursion */
-        ptr++;                    /* Same as (?0)      */
-        /* Fall through */
-
-        /* Recursion or "subroutine" call */
-
-        case '0': case '1': case '2': case '3': case '4':
-        case '5': case '6': case '7': case '8': case '9':
-          {
-          const uschar *called;
-          recno = 0;
-          while((digitab[*ptr] & ctype_digit) != 0)
-            recno = recno * 10 + *ptr++ - '0';
-
-          /* Come here from code above that handles a named recursion */
-
-          HANDLE_RECURSION:
-
-          previous = code;
-
-          /* Find the bracket that is being referenced. Temporarily end the
-          regex in case it doesn't exist. */
-
-          *code = OP_END;
-          called = (recno == 0)?
-            cd->start_code : find_bracket(cd->start_code, utf8, recno);
-
-          if (called == NULL)
-            {
-            *errorptr = ERR15;
-            goto FAILED;
-            }
-
-          /* If the subpattern is still open, this is a recursive call. We
-          check to see if this is a left recursion that could loop for ever,
-          and diagnose that case. */
-
-          if (GET(called, 1) == 0 && could_be_empty(called, code, bcptr, utf8))
-            {
-            *errorptr = ERR40;
-            goto FAILED;
-            }
-
-          /* Insert the recursion/subroutine item */
-
-          *code = OP_RECURSE;
-          PUT(code, 1, called - cd->start_code);
-          code += 1 + LINK_SIZE;
-          }
-        continue;
-
-        /* Character after (? not specially recognized */
-
-        default:                  /* Option setting */
-        set = unset = 0;
-        optset = &set;
-
-        while (*ptr != ')' && *ptr != ':')
-          {
-          switch (*ptr++)
-            {
-            case '-': optset = &unset; break;
-
-            case 'i': *optset |= PCRE_CASELESS; break;
-            case 'm': *optset |= PCRE_MULTILINE; break;
-            case 's': *optset |= PCRE_DOTALL; break;
-            case 'x': *optset |= PCRE_EXTENDED; break;
-            case 'U': *optset |= PCRE_UNGREEDY; break;
-            case 'X': *optset |= PCRE_EXTRA; break;
-            }
-          }
-
-        /* Set up the changed option bits, but don't change anything yet. */
-
-        newoptions = (options | set) & (~unset);
-
-        /* If the options ended with ')' this is not the start of a nested
-        group with option changes, so the options change at this level. Compile
-        code to change the ims options if this setting actually changes any of
-        them. We also pass the new setting back so that it can be put at the
-        start of any following branches, and when this group ends (if we are in
-        a group), a resetting item can be compiled.
-
-        Note that if this item is right at the start of the pattern, the
-        options will have been abstracted and made global, so there will be no
-        change to compile. */
-
-        if (*ptr == ')')
-          {
-          if ((options & PCRE_IMS) != (newoptions & PCRE_IMS))
-            {
-            *code++ = OP_OPT;
-            *code++ = newoptions & PCRE_IMS;
-            }
-
-          /* Change options at this level, and pass them back for use
-          in subsequent branches. Reset the greedy defaults and the case
-          value for firstbyte and reqbyte. */
-
-          *optionsptr = options = newoptions;
-          greedy_default = ((newoptions & PCRE_UNGREEDY) != 0);
-          greedy_non_default = greedy_default ^ 1;
-          req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0;
-
-          previous = NULL;       /* This item can't be repeated */
-          continue;              /* It is complete */
-          }
-
-        /* If the options ended with ':' we are heading into a nested group
-        with possible change of options. Such groups are non-capturing and are
-        not assertions of any kind. All we need to do is skip over the ':';
-        the newoptions value is handled below. */
-
-        bravalue = OP_BRA;
-        ptr++;
-        }
-      }
-
-    /* If PCRE_NO_AUTO_CAPTURE is set, all unadorned brackets become
-    non-capturing and behave like (?:...) brackets */
-
-    else if ((options & PCRE_NO_AUTO_CAPTURE) != 0)
-      {
-      bravalue = OP_BRA;
-      }
-
-    /* Else we have a referencing group; adjust the opcode. If the bracket
-    number is greater than EXTRACT_BASIC_MAX, we set the opcode one higher, and
-    arrange for the true number to follow later, in an OP_BRANUMBER item. */
-
-    else
-      {
-      NUMBERED_GROUP:
-      if (++(*brackets) > EXTRACT_BASIC_MAX)
-        {
-        bravalue = OP_BRA + EXTRACT_BASIC_MAX + 1;
-        code[1+LINK_SIZE] = OP_BRANUMBER;
-        PUT2(code, 2+LINK_SIZE, *brackets);
-        skipbytes = 3;
-        }
-      else bravalue = OP_BRA + *brackets;
-      }
-
-    /* Process nested bracketed re. Assertions may not be repeated, but other
-    kinds can be. We copy code into a non-register variable in order to be able
-    to pass its address because some compilers complain otherwise. Pass in a
-    new setting for the ims options if they have changed. */
-
-    previous = (bravalue >= OP_ONCE)? code : NULL;
-    *code = bravalue;
-    tempcode = code;
-    tempreqvary = cd->req_varyopt;     /* Save value before bracket */
-
-    if (!compile_regex(
-         newoptions,                   /* The complete new option state */
-         options & PCRE_IMS,           /* The previous ims option state */
-         brackets,                     /* Extracting bracket count */
-         &tempcode,                    /* Where to put code (updated) */
-         &ptr,                         /* Input pointer (updated) */
-         errorptr,                     /* Where to put an error message */
-         (bravalue == OP_ASSERTBACK ||
-          bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */
-         skipbytes,                    /* Skip over OP_COND/OP_BRANUMBER */
-         &subfirstbyte,                /* For possible first char */
-         &subreqbyte,                  /* For possible last char */
-         bcptr,                        /* Current branch chain */
-         cd))                          /* Tables block */
-      goto FAILED;
-
-    /* At the end of compiling, code is still pointing to the start of the
-    group, while tempcode has been updated to point past the end of the group
-    and any option resetting that may follow it. The pattern pointer (ptr)
-    is on the bracket. */
-
-    /* If this is a conditional bracket, check that there are no more than
-    two branches in the group. */
-
-    else if (bravalue == OP_COND)
-      {
-      uschar *tc = code;
-      condcount = 0;
-
-      do {
-         condcount++;
-         tc += GET(tc,1);
-         }
-      while (*tc != OP_KET);
-
-      if (condcount > 2)
-        {
-        *errorptr = ERR27;
-        goto FAILED;
-        }
-
-      /* If there is just one branch, we must not make use of its firstbyte or
-      reqbyte, because this is equivalent to an empty second branch. */
-
-      if (condcount == 1) subfirstbyte = subreqbyte = REQ_NONE;
-      }
-
-    /* Handle updating of the required and first characters. Update for normal
-    brackets of all kinds, and conditions with two branches (see code above).
-    If the bracket is followed by a quantifier with zero repeat, we have to
-    back off. Hence the definition of zeroreqbyte and zerofirstbyte outside the
-    main loop so that they can be accessed for the back off. */
-
-    zeroreqbyte = reqbyte;
-    zerofirstbyte = firstbyte;
-    groupsetfirstbyte = FALSE;
-
-    if (bravalue >= OP_BRA || bravalue == OP_ONCE || bravalue == OP_COND)
-      {
-      /* If we have not yet set a firstbyte in this branch, take it from the
-      subpattern, remembering that it was set here so that a repeat of more
-      than one can replicate it as reqbyte if necessary. If the subpattern has
-      no firstbyte, set "none" for the whole branch. In both cases, a zero
-      repeat forces firstbyte to "none". */
-
-      if (firstbyte == REQ_UNSET)
-        {
-        if (subfirstbyte >= 0)
-          {
-          firstbyte = subfirstbyte;
-          groupsetfirstbyte = TRUE;
-          }
-        else firstbyte = REQ_NONE;
-        zerofirstbyte = REQ_NONE;
-        }
-
-      /* If firstbyte was previously set, convert the subpattern's firstbyte
-      into reqbyte if there wasn't one, using the vary flag that was in
-      existence beforehand. */
-
-      else if (subfirstbyte >= 0 && subreqbyte < 0)
-        subreqbyte = subfirstbyte | tempreqvary;
-
-      /* If the subpattern set a required byte (or set a first byte that isn't
-      really the first byte - see above), set it. */
-
-      if (subreqbyte >= 0) reqbyte = subreqbyte;
-      }
-
-    /* For a forward assertion, we take the reqbyte, if set. This can be
-    helpful if the pattern that follows the assertion doesn't set a different
-    char. For example, it's useful for /(?=abcde).+/. We can't set firstbyte
-    for an assertion, however because it leads to incorrect effect for patterns
-    such as /(?=a)a.+/ when the "real" "a" would then become a reqbyte instead
-    of a firstbyte. This is overcome by a scan at the end if there's no
-    firstbyte, looking for an asserted first char. */
-
-    else if (bravalue == OP_ASSERT && subreqbyte >= 0) reqbyte = subreqbyte;
-
-    /* Now update the main code pointer to the end of the group. */
-
-    code = tempcode;
-
-    /* Error if hit end of pattern */
-
-    if (*ptr != ')')
-      {
-      *errorptr = ERR14;
-      goto FAILED;
-      }
-    break;
-
-    /* Check \ for being a real metacharacter; if not, fall through and handle
-    it as a data character at the start of a string. Escape items are checked
-    for validity in the pre-compiling pass. */
-
-    case '\\':
-    tempptr = ptr;
-    c = check_escape(&ptr, errorptr, *brackets, options, FALSE, cd);
-
-    /* Handle metacharacters introduced by \. For ones like \d, the ESC_ values
-    are arranged to be the negation of the corresponding OP_values. For the
-    back references, the values are ESC_REF plus the reference number. Only
-    back references and those types that consume a character may be repeated.
-    We can test for values between ESC_b and ESC_Z for the latter; this may
-    have to change if any new ones are ever created. */
-
-    if (c < 0)
-      {
-      if (-c == ESC_Q)            /* Handle start of quoted string */
-        {
-        if (ptr[1] == '\\' && ptr[2] == 'E') ptr += 2; /* avoid empty string */
-          else inescq = TRUE;
-        continue;
-        }
-
-      /* For metasequences that actually match a character, we disable the
-      setting of a first character if it hasn't already been set. */
-
-      if (firstbyte == REQ_UNSET && -c > ESC_b && -c < ESC_Z)
-        firstbyte = REQ_NONE;
-
-      /* Set values to reset to if this is followed by a zero repeat. */
-
-      zerofirstbyte = firstbyte;
-      zeroreqbyte = reqbyte;
-
-      /* Back references are handled specially */
-
-      if (-c >= ESC_REF)
-        {
-        int number = -c - ESC_REF;
-        previous = code;
-        *code++ = OP_REF;
-        PUT2INC(code, 0, number);
-        }
-      else
-        {
-        previous = (-c > ESC_b && -c < ESC_Z)? code : NULL;
-        *code++ = -c;
-        }
-      continue;
-      }
-
-    /* Data character: reset and fall through */
-
-    ptr = tempptr;
-    c = '\\';
-
-    /* Handle a run of data characters until a metacharacter is encountered.
-    The first character is guaranteed not to be whitespace or # when the
-    extended flag is set. */
-
-    NORMAL_CHAR:
-    default:
-    previous = code;
-    *code = OP_CHARS;
-    code += 2;
-    length = 0;
-
-    do
-      {
-      /* If in \Q...\E, check for the end; if not, we always have a literal */
-
-      if (inescq)
-        {
-        if (c == '\\' && ptr[1] == 'E')
-          {
-          inescq = FALSE;
-          ptr++;
-          }
-        else
-          {
-          *code++ = c;
-          length++;
-          }
-        continue;
-        }
-
-      /* Skip white space and comments for /x patterns */
-
-      if ((options & PCRE_EXTENDED) != 0)
-        {
-        if ((cd->ctypes[c] & ctype_space) != 0) continue;
-        if (c == '#')
-          {
-          /* The space before the ; is to avoid a warning on a silly compiler
-          on the Macintosh. */
-          while ((c = *(++ptr)) != 0 && c != NEWLINE) ;
-          if (c == 0) break;
-          continue;
-          }
-        }
-
-      /* Backslash may introduce a data char or a metacharacter. Escaped items
-      are checked for validity in the pre-compiling pass. Stop the string
-      before a metaitem. */
-
-      if (c == '\\')
-        {
-        tempptr = ptr;
-        c = check_escape(&ptr, errorptr, *brackets, options, FALSE, cd);
-        if (c < 0) { ptr = tempptr; break; }
-
-        /* If a character is > 127 in UTF-8 mode, we have to turn it into
-        two or more characters in the UTF-8 encoding. */
-
-#ifdef SUPPORT_UTF8
-        if (utf8 && c > 127)
-          {
-          uschar buffer[8];
-          int len = ord2utf8(c, buffer);
-          for (c = 0; c < len; c++) *code++ = buffer[c];
-          length += len;
-          continue;
-          }
-#endif
-        }
-
-      /* Ordinary character or single-char escape */
-
-      *code++ = c;
-      length++;
-      }
-
-    /* This "while" is the end of the "do" above. */
-
-    while (length < MAXLIT && (cd->ctypes[c = *(++ptr)] & ctype_meta) == 0);
-
-    /* Update the first and last requirements. These are always bytes, even in
-    UTF-8 mode. However, there is a special case to be considered when there
-    are only one or two characters. Because this gets messy in UTF-8 mode, the
-    code is kept separate. When we get here "length" contains the number of
-    bytes. */
-
-#ifdef SUPPORT_UTF8
-    if (utf8 && length > 1)
-      {
-      uschar *t = previous + 3;                      /* After this code, t */
-      while (t < code && (*t & 0xc0) == 0x80) t++;   /* follows the 1st char */
-
-      /* Handle the case when there is only one multibyte character. It must
-      have at least two bytes because of the "length > 1" test above. */
-
-      if (t == code)
-        {
-        /* If no previous first byte, set it from this character, but revert to
-        none on a zero repeat. */
-
-        if (firstbyte == REQ_UNSET)
-          {
-          zerofirstbyte = REQ_NONE;
-          firstbyte = previous[2];
-          }
-
-        /* Otherwise, leave the first byte value alone, and don't change it on
-        a zero repeat */
-
-        else zerofirstbyte = firstbyte;
-
-        /* In both cases, a zero repeat resets the previous required byte */
-
-        zeroreqbyte = reqbyte;
-        }
-
-      /* Handle the case when there is more than one character. These may be
-      single-byte or multibyte characters */
-
-      else
-        {
-        t = code - 1;                       /* After this code, t is at the */
-        while ((*t & 0xc0) == 0x80) t--;    /* start of the last character */
-
-        /* If no previous first byte, set it from the first character, and
-        retain it on a zero repeat (of the last character). The required byte
-        is reset on a zero repeat, either to the byte before the last
-        character, unless this is the first byte of the string. In that case,
-        it reverts to its previous value. */
-
-        if (firstbyte == REQ_UNSET)
-          {
-          zerofirstbyte = firstbyte = previous[2] | req_caseopt;
-          zeroreqbyte = (t - 1 == previous + 2)?
-            reqbyte : t[-1] | req_caseopt | cd->req_varyopt;
-          }
-
-        /* If there was a previous first byte, leave it alone, and don't change
-        it on a zero repeat. The required byte is reset on a zero repeat to the
-        byte before the last character. */
-
-        else
-          {
-          zerofirstbyte = firstbyte;
-          zeroreqbyte = t[-1] | req_caseopt | cd->req_varyopt;
-          }
-        }
-
-      /* In all cases (we know length > 1), the new required byte is the last
-      byte of the string. */
-
-      reqbyte = code[-1] | req_caseopt | cd->req_varyopt;
-      }
-
-    else   /* End of UTF-8 coding */
-#endif
-
-    /* This is the code for non-UTF-8 operation, either without UTF-8 support,
-    or when UTF-8 is not enabled. */
-
-      {
-      /* firstbyte was not previously set; take it from this string */
-
-      if (firstbyte == REQ_UNSET)
-        {
-        if (length == 1)
-          {
-          zerofirstbyte = REQ_NONE;
-          firstbyte = previous[2] | req_caseopt;
-          zeroreqbyte = reqbyte;
-          }
-        else
-          {
-          zerofirstbyte = firstbyte = previous[2] | req_caseopt;
-          zeroreqbyte = (length > 2)?
-            (code[-2] | req_caseopt | cd->req_varyopt) : reqbyte;
-          reqbyte = code[-1] | req_caseopt | cd->req_varyopt;
-          }
-        }
-
-      /* firstbyte was previously set */
-
-      else
-        {
-        zerofirstbyte = firstbyte;
-        zeroreqbyte = (length == 1)? reqbyte :
-          code[-2] | req_caseopt | cd->req_varyopt;
-        reqbyte = code[-1] | req_caseopt | cd->req_varyopt;
-        }
-      }
-
-    /* Set the length in the data vector, and advance to the next state. */
-
-    previous[1] = length;
-    if (length < MAXLIT) ptr--;
-    break;
-    }
-  }                   /* end of big loop */
-
-/* Control never reaches here by falling through, only by a goto for all the
-error states. Pass back the position in the pattern so that it can be displayed
-to the user for diagnosing the error. */
-
-FAILED:
-*ptrptr = ptr;
-return FALSE;
-}
-
-
-
-
-/*************************************************
-*     Compile sequence of alternatives           *
-*************************************************/
-
-/* On entry, ptr is pointing past the bracket character, but on return
-it points to the closing bracket, or vertical bar, or end of string.
-The code variable is pointing at the byte into which the BRA operator has been
-stored. If the ims options are changed at the start (for a (?ims: group) or
-during any branch, we need to insert an OP_OPT item at the start of every
-following branch to ensure they get set correctly at run time, and also pass
-the new options into every subsequent branch compile.
-
-Argument:
-  options        option bits, including any changes for this subpattern
-  oldims         previous settings of ims option bits
-  brackets       -> int containing the number of extracting brackets used
-  codeptr        -> the address of the current code pointer
-  ptrptr         -> the address of the current pattern pointer
-  errorptr       -> pointer to error message
-  lookbehind     TRUE if this is a lookbehind assertion
-  skipbytes      skip this many bytes at start (for OP_COND, OP_BRANUMBER)
-  firstbyteptr   place to put the first required character, or a negative number
-  reqbyteptr     place to put the last required character, or a negative number
-  bcptr          pointer to the chain of currently open branches
-  cd             points to the data block with tables pointers etc.
-
-Returns:      TRUE on success
-*/
-
-static BOOL
-compile_regex(int options, int oldims, int *brackets, uschar **codeptr,
-  const uschar **ptrptr, const char **errorptr, BOOL lookbehind, int skipbytes,
-  int *firstbyteptr, int *reqbyteptr, branch_chain *bcptr, compile_data *cd)
-{
-const uschar *ptr = *ptrptr;
-uschar *code = *codeptr;
-uschar *last_branch = code;
-uschar *start_bracket = code;
-uschar *reverse_count = NULL;
-int firstbyte, reqbyte;
-int branchfirstbyte, branchreqbyte;
-branch_chain bc;
-
-bc.outer = bcptr;
-bc.current = code;
-
-firstbyte = reqbyte = REQ_UNSET;
-
-/* Offset is set zero to mark that this bracket is still open */
-
-PUT(code, 1, 0);
-code += 1 + LINK_SIZE + skipbytes;
-
-/* Loop for each alternative branch */
-
-for (;;)
-  {
-  /* Handle a change of ims options at the start of the branch */
-
-  if ((options & PCRE_IMS) != oldims)
-    {
-    *code++ = OP_OPT;
-    *code++ = options & PCRE_IMS;
-    }
-
-  /* Set up dummy OP_REVERSE if lookbehind assertion */
-
-  if (lookbehind)
-    {
-    *code++ = OP_REVERSE;
-    reverse_count = code;
-    PUTINC(code, 0, 0);
-    }
-
-  /* Now compile the branch */
-
-  if (!compile_branch(&options, brackets, &code, &ptr, errorptr,
-        &branchfirstbyte, &branchreqbyte, &bc, cd))
-    {
-    *ptrptr = ptr;
-    return FALSE;
-    }
-
-  /* If this is the first branch, the firstbyte and reqbyte values for the
-  branch become the values for the regex. */
-
-  if (*last_branch != OP_ALT)
-    {
-    firstbyte = branchfirstbyte;
-    reqbyte = branchreqbyte;
-    }
-
-  /* If this is not the first branch, the first char and reqbyte have to
-  match the values from all the previous branches, except that if the previous
-  value for reqbyte didn't have REQ_VARY set, it can still match, and we set
-  REQ_VARY for the regex. */
-
-  else
-    {
-    /* If we previously had a firstbyte, but it doesn't match the new branch,
-    we have to abandon the firstbyte for the regex, but if there was previously
-    no reqbyte, it takes on the value of the old firstbyte. */
-
-    if (firstbyte >= 0 && firstbyte != branchfirstbyte)
-      {
-      if (reqbyte < 0) reqbyte = firstbyte;
-      firstbyte = REQ_NONE;
-      }
-
-    /* If we (now or from before) have no firstbyte, a firstbyte from the
-    branch becomes a reqbyte if there isn't a branch reqbyte. */
-
-    if (firstbyte < 0 && branchfirstbyte >= 0 && branchreqbyte < 0)
-        branchreqbyte = branchfirstbyte;
-
-    /* Now ensure that the reqbytes match */
-
-    if ((reqbyte & ~REQ_VARY) != (branchreqbyte & ~REQ_VARY))
-      reqbyte = REQ_NONE;
-    else reqbyte |= branchreqbyte;   /* To "or" REQ_VARY */
-    }
-
-  /* If lookbehind, check that this branch matches a fixed-length string,
-  and put the length into the OP_REVERSE item. Temporarily mark the end of
-  the branch with OP_END. */
-
-  if (lookbehind)
-    {
-    int length;
-    *code = OP_END;
-    length = find_fixedlength(last_branch, options);
-    DPRINTF(("fixed length = %d\n", length));
-    if (length < 0)
-      {
-      *errorptr = (length == -2)? ERR36 : ERR25;
-      *ptrptr = ptr;
-      return FALSE;
-      }
-    PUT(reverse_count, 0, length);
-    }
-
-  /* Reached end of expression, either ')' or end of pattern. Go back through
-  the alternative branches and reverse the chain of offsets, with the field in
-  the BRA item now becoming an offset to the first alternative. If there are
-  no alternatives, it points to the end of the group. The length in the
-  terminating ket is always the length of the whole bracketed item. If any of
-  the ims options were changed inside the group, compile a resetting op-code
-  following, except at the very end of the pattern. Return leaving the pointer
-  at the terminating char. */
-
-  if (*ptr != '|')
-    {
-    int length = code - last_branch;
-    do
-      {
-      int prev_length = GET(last_branch, 1);
-      PUT(last_branch, 1, length);
-      length = prev_length;
-      last_branch -= length;
-      }
-    while (length > 0);
-
-    /* Fill in the ket */
-
-    *code = OP_KET;
-    PUT(code, 1, code - start_bracket);
-    code += 1 + LINK_SIZE;
-
-    /* Resetting option if needed */
-
-    if ((options & PCRE_IMS) != oldims && *ptr == ')')
-      {
-      *code++ = OP_OPT;
-      *code++ = oldims;
-      }
-
-    /* Set values to pass back */
-
-    *codeptr = code;
-    *ptrptr = ptr;
-    *firstbyteptr = firstbyte;
-    *reqbyteptr = reqbyte;
-    return TRUE;
-    }
-
-  /* Another branch follows; insert an "or" node. Its length field points back
-  to the previous branch while the bracket remains open. At the end the chain
-  is reversed. It's done like this so that the start of the bracket has a
-  zero offset until it is closed, making it possible to detect recursion. */
-
-  *code = OP_ALT;
-  PUT(code, 1, code - last_branch);
-  bc.current = last_branch = code;
-  code += 1 + LINK_SIZE;
-  ptr++;
-  }
-/* Control never reaches here */
-}
-
-
-
-
-/*************************************************
-*          Check for anchored expression         *
-*************************************************/
-
-/* Try to find out if this is an anchored regular expression. Consider each
-alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket
-all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then
-it's anchored. However, if this is a multiline pattern, then only OP_SOD
-counts, since OP_CIRC can match in the middle.
-
-We can also consider a regex to be anchored if OP_SOM starts all its branches.
-This is the code for \G, which means "match at start of match position, taking
-into account the match offset".
-
-A branch is also implicitly anchored if it starts with .* and DOTALL is set,
-because that will try the rest of the pattern at all possible matching points,
-so there is no point trying again.... er ....
-
-.... except when the .* appears inside capturing parentheses, and there is a
-subsequent back reference to those parentheses. We haven't enough information
-to catch that case precisely.
-
-At first, the best we could do was to detect when .* was in capturing brackets
-and the highest back reference was greater than or equal to that level.
-However, by keeping a bitmap of the first 31 back references, we can catch some
-of the more common cases more precisely.
-
-Arguments:
-  code           points to start of expression (the bracket)
-  options        points to the options setting
-  bracket_map    a bitmap of which brackets we are inside while testing; this
-                  handles up to substring 31; after that we just have to take
-                  the less precise approach
-  backref_map    the back reference bitmap
-
-Returns:     TRUE or FALSE
-*/
-
-static BOOL
-is_anchored(register const uschar *code, int *options, unsigned int bracket_map,
-  unsigned int backref_map)
-{
-do {
-   const uschar *scode =
-     first_significant_code(code + 1+LINK_SIZE, options, PCRE_MULTILINE);
-   register int op = *scode;
-
-   /* Capturing brackets */
-
-   if (op > OP_BRA)
-     {
-     int new_map;
-     op -= OP_BRA;
-     if (op > EXTRACT_BASIC_MAX) op = GET2(scode, 2+LINK_SIZE);
-     new_map = bracket_map | ((op < 32)? (1 << op) : 1);
-     if (!is_anchored(scode, options, new_map, backref_map)) return FALSE;
-     }
-
-   /* Other brackets */
-
-   else if (op == OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
-     {
-     if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE;
-     }
-
-   /* .* is not anchored unless DOTALL is set and it isn't in brackets that
-   are or may be referenced. */
-
-   else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR) &&
-            (*options & PCRE_DOTALL) != 0)
-     {
-     if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE;
-     }
-
-   /* Check for explicit anchoring */
-
-   else if (op != OP_SOD && op != OP_SOM &&
-           ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC))
-     return FALSE;
-   code += GET(code, 1);
-   }
-while (*code == OP_ALT);   /* Loop for each alternative */
-return TRUE;
-}
-
-
-
-/*************************************************
-*         Check for starting with ^ or .*        *
-*************************************************/
-
-/* This is called to find out if every branch starts with ^ or .* so that
-"first char" processing can be done to speed things up in multiline
-matching and for non-DOTALL patterns that start with .* (which must start at
-the beginning or after \n). As in the case of is_anchored() (see above), we
-have to take account of back references to capturing brackets that contain .*
-because in that case we can't make the assumption.
-
-Arguments:
-  code           points to start of expression (the bracket)
-  bracket_map    a bitmap of which brackets we are inside while testing; this
-                  handles up to substring 31; after that we just have to take
-                  the less precise approach
-  backref_map    the back reference bitmap
-
-Returns:         TRUE or FALSE
-*/
-
-static BOOL
-is_startline(const uschar *code, unsigned int bracket_map,
-  unsigned int backref_map)
-{
-do {
-   const uschar *scode = first_significant_code(code + 1+LINK_SIZE, NULL, 0);
-   register int op = *scode;
-
-   /* Capturing brackets */
-
-   if (op > OP_BRA)
-     {
-     int new_map;
-     op -= OP_BRA;
-     if (op > EXTRACT_BASIC_MAX) op = GET2(scode, 2+LINK_SIZE);
-     new_map = bracket_map | ((op < 32)? (1 << op) : 1);
-     if (!is_startline(scode, new_map, backref_map)) return FALSE;
-     }
-
-   /* Other brackets */
-
-   else if (op == OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
-     { if (!is_startline(scode, bracket_map, backref_map)) return FALSE; }
-
-   /* .* is not anchored unless DOTALL is set and it isn't in brackets that
-   may be referenced. */
-
-   else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR)
-     {
-     if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE;
-     }
-
-   /* Check for explicit circumflex */
-
-   else if (op != OP_CIRC) return FALSE;
-   code += GET(code, 1);
-   }
-while (*code == OP_ALT);  /* Loop for each alternative */
-return TRUE;
-}
-
-
-
-/*************************************************
-*       Check for asserted fixed first char      *
-*************************************************/
-
-/* During compilation, the "first char" settings from forward assertions are
-discarded, because they can cause conflicts with actual literals that follow.
-However, if we end up without a first char setting for an unanchored pattern,
-it is worth scanning the regex to see if there is an initial asserted first
-char. If all branches start with the same asserted char, or with a bracket all
-of whose alternatives start with the same asserted char (recurse ad lib), then
-we return that char, otherwise -1.
-
-Arguments:
-  code       points to start of expression (the bracket)
-  options    pointer to the options (used to check casing changes)
-  inassert   TRUE if in an assertion
-
-Returns:     -1 or the fixed first char
-*/
-
-static int
-find_firstassertedchar(const uschar *code, int *options, BOOL inassert)
-{
-register int c = -1;
-do {
-   int d;
-   const uschar *scode =
-     first_significant_code(code + 1+LINK_SIZE, options, PCRE_CASELESS);
-   register int op = *scode;
-
-   if (op >= OP_BRA) op = OP_BRA;
-
-   switch(op)
-     {
-     default:
-     return -1;
-
-     case OP_BRA:
-     case OP_ASSERT:
-     case OP_ONCE:
-     case OP_COND:
-     if ((d = find_firstassertedchar(scode, options, op == OP_ASSERT)) < 0)
-       return -1;
-     if (c < 0) c = d; else if (c != d) return -1;
-     break;
-
-     case OP_EXACT:       /* Fall through */
-     scode++;
-
-     case OP_CHARS:       /* Fall through */
-     scode++;
-
-     case OP_PLUS:
-     case OP_MINPLUS:
-     if (!inassert) return -1;
-     if (c < 0)
-       {
-       c = scode[1];
-       if ((*options & PCRE_CASELESS) != 0) c |= REQ_CASELESS;
-       }
-     else if (c != scode[1]) return -1;
-     break;
-     }
-
-   code += GET(code, 1);
-   }
-while (*code == OP_ALT);
-return c;
-}
-
-
-
-
-/*************************************************
-*        Compile a Regular Expression            *
-*************************************************/
-
-/* This function takes a string and returns a pointer to a block of store
-holding a compiled version of the expression.
-
-Arguments:
-  pattern      the regular expression
-  options      various option bits
-  errorptr     pointer to pointer to error text
-  erroroffset  ptr offset in pattern where error was detected
-  tables       pointer to character tables or NULL
-
-Returns:       pointer to compiled data block, or NULL on error,
-               with errorptr and erroroffset set
-*/
-
-pcre *
-pcre_compile(const char *pattern, int options, const char **errorptr,
-  int *erroroffset, const unsigned char *tables)
-{
-real_pcre *re;
-int length = 1 + LINK_SIZE;      /* For initial BRA plus length */
-int runlength;
-int c, firstbyte, reqbyte;
-int bracount = 0;
-int branch_extra = 0;
-int branch_newextra;
-int item_count = -1;
-int name_count = 0;
-int max_name_size = 0;
-#ifdef SUPPORT_UTF8
-int lastcharlength = 0;
-BOOL utf8;
-BOOL class_utf8;
-#endif
-BOOL inescq = FALSE;
-unsigned int brastackptr = 0;
-size_t size;
-uschar *code;
-const uschar *codestart;
-const uschar *ptr;
-compile_data compile_block;
-int brastack[BRASTACK_SIZE];
-uschar bralenstack[BRASTACK_SIZE];
-
-/* We can't pass back an error message if errorptr is NULL; I guess the best we
-can do is just return NULL. */
-
-if (errorptr == NULL) return NULL;
-*errorptr = NULL;
-
-/* However, we can give a message for this error */
-
-if (erroroffset == NULL)
-  {
-  *errorptr = ERR16;
-  return NULL;
-  }
-*erroroffset = 0;
-
-/* Can't support UTF8 unless PCRE has been compiled to include the code. */
-
-#ifdef SUPPORT_UTF8
-utf8 = (options & PCRE_UTF8) != 0;
-#else
-if ((options & PCRE_UTF8) != 0)
-  {
-  *errorptr = ERR32;
-  return NULL;
-  }
-#endif
-
-if ((options & ~PUBLIC_OPTIONS) != 0)
-  {
-  *errorptr = ERR17;
-  return NULL;
-  }
-
-/* Set up pointers to the individual character tables */
-
-if (tables == NULL) tables = pcre_default_tables;
-compile_block.lcc = tables + lcc_offset;
-compile_block.fcc = tables + fcc_offset;
-compile_block.cbits = tables + cbits_offset;
-compile_block.ctypes = tables + ctypes_offset;
-
-/* Maximum back reference and backref bitmap. This is updated for numeric
-references during the first pass, but for named references during the actual
-compile pass. The bitmap records up to 31 back references to help in deciding
-whether (.*) can be treated as anchored or not. */
-
-compile_block.top_backref = 0;
-compile_block.backref_map = 0;
-
-/* Reflect pattern for debugging output */
-
-DPRINTF(("------------------------------------------------------------------\n"));
-DPRINTF(("%s\n", pattern));
-
-/* The first thing to do is to make a pass over the pattern to compute the
-amount of store required to hold the compiled code. This does not have to be
-perfect as long as errors are overestimates. At the same time we can detect any
-flag settings right at the start, and extract them. Make an attempt to correct
-for any counted white space if an "extended" flag setting appears late in the
-pattern. We can't be so clever for #-comments. */
-
-ptr = (const uschar *)(pattern - 1);
-while ((c = *(++ptr)) != 0)
-  {
-  int min, max;
-  int class_optcount;
-  int bracket_length;
-  int duplength;
-
-  /* If we are inside a \Q...\E sequence, all chars are literal */
-
-  if (inescq) goto NORMAL_CHAR;
-
-  /* Otherwise, first check for ignored whitespace and comments */
-
-  if ((options & PCRE_EXTENDED) != 0)
-    {
-    if ((compile_block.ctypes[c] & ctype_space) != 0) continue;
-    if (c == '#')
-      {
-      /* The space before the ; is to avoid a warning on a silly compiler
-      on the Macintosh. */
-      while ((c = *(++ptr)) != 0 && c != NEWLINE) ;
-      if (c == 0) break;
-      continue;
-      }
-    }
-
-  item_count++;    /* Is zero for the first non-comment item */
-
-  switch(c)
-    {
-    /* A backslashed item may be an escaped "normal" character or a
-    character type. For a "normal" character, put the pointers and
-    character back so that tests for whitespace etc. in the input
-    are done correctly. */
-
-    case '\\':
-      {
-      const uschar *save_ptr = ptr;
-      c = check_escape(&ptr, errorptr, bracount, options, FALSE, &compile_block);
-      if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-      if (c >= 0)
-        {
-        ptr = save_ptr;
-        c = '\\';
-        goto NORMAL_CHAR;
-        }
-      }
-
-    /* If \Q, enter "literal" mode */
-
-    if (-c == ESC_Q)
-      {
-      inescq = TRUE;
-      continue;
-      }
-
-    /* Other escapes need one byte, and are of length one for repeats */
-
-    length++;
-#ifdef SUPPORT_UTF8
-    lastcharlength = 1;
-#endif
-
-    /* A back reference needs an additional 2 bytes, plus either one or 5
-    bytes for a repeat. We also need to keep the value of the highest
-    back reference. */
-
-    if (c <= -ESC_REF)
-      {
-      int refnum = -c - ESC_REF;
-      compile_block.backref_map |= (refnum < 32)? (1 << refnum) : 1;
-      if (refnum > compile_block.top_backref)
-        compile_block.top_backref = refnum;
-      length += 2;   /* For single back reference */
-      if (ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block))
-        {
-        ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block);
-        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-        if ((min == 0 && (max == 1 || max == -1)) ||
-          (min == 1 && max == -1))
-            length++;
-        else length += 5;
-        if (ptr[1] == '?') ptr++;
-        }
-      }
-    continue;
-
-    case '^':     /* Single-byte metacharacters */
-    case '.':
-    case '$':
-    length++;
-#ifdef SUPPORT_UTF8
-    lastcharlength = 1;
-#endif
-    continue;
-
-    case '*':            /* These repeats won't be after brackets; */
-    case '+':            /* those are handled separately */
-    case '?':
-    length++;
-    goto POSESSIVE;      /* A few lines below */
-
-    /* This covers the cases of braced repeats after a single char, metachar,
-    class, or back reference. */
-
-    case '{':
-    if (!is_counted_repeat(ptr+1, &compile_block)) goto NORMAL_CHAR;
-    ptr = read_repeat_counts(ptr+1, &min, &max, errorptr, &compile_block);
-    if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-
-    /* These special cases just insert one extra opcode */
-
-    if ((min == 0 && (max == 1 || max == -1)) ||
-      (min == 1 && max == -1))
-        length++;
-
-    /* These cases might insert additional copies of a preceding character. */
-
-    else
-      {
-#ifdef SUPPORT_UTF8
-      /* In UTF-8 mode, we should find the length in lastcharlength */
-      if (utf8)
-        {
-        if (min != 1)
-          {
-          length -= lastcharlength;   /* Uncount the original char or metachar */
-          if (min > 0) length += 3 + lastcharlength;
-          }
-        length += lastcharlength + ((max > 0)? 3 : 1);
-        }
-      else
-#endif
-
-      /* Not UTF-8 mode: all characters are one byte */
-        {
-        if (min != 1)
-          {
-          length--;   /* Uncount the original char or metachar */
-          if (min > 0) length += 4;
-          }
-
-        length += (max > 0)? 4 : 2;
-        }
-      }
-
-    if (ptr[1] == '?') ptr++;      /* Needs no extra length */
-
-    POSESSIVE:                     /* Test for possessive quantifier */
-    if (ptr[1] == '+')
-      {
-      ptr++;
-      length += 2 + 2*LINK_SIZE;   /* Allow for atomic brackets */
-      }
-    continue;
-
-    /* An alternation contains an offset to the next branch or ket. If any ims
-    options changed in the previous branch(es), and/or if we are in a
-    lookbehind assertion, extra space will be needed at the start of the
-    branch. This is handled by branch_extra. */
-
-    case '|':
-    length += 1 + LINK_SIZE + branch_extra;
-    continue;
-
-    /* A character class uses 33 characters provided that all the character
-    values are less than 256. Otherwise, it uses a bit map for low valued
-    characters, and individual items for others. Don't worry about character
-    types that aren't allowed in classes - they'll get picked up during the
-    compile. A character class that contains only one single-byte character
-    uses 2 or 3 bytes, depending on whether it is negated or not. Notice this
-    where we can. (In UTF-8 mode we can do this only for chars < 128.) */
-
-    case '[':
-    class_optcount = 0;
-
-#ifdef SUPPORT_UTF8
-    class_utf8 = FALSE;
-#endif
-
-    if (*(++ptr) == '^') ptr++;
-
-    /* Written as a "do" so that an initial ']' is taken as data */
-
-    if (*ptr != 0) do
-      {
-      /* Inside \Q...\E everything is literal except \E */
-
-      if (inescq)
-        {
-        if (*ptr != '\\' || ptr[1] != 'E') goto NON_SPECIAL_CHARACTER;
-        inescq = FALSE;
-        ptr += 1;
-        continue;
-        }
-
-      /* Outside \Q...\E, check for escapes */
-
-      if (*ptr == '\\')
-        {
-#ifdef SUPPORT_UTF8
-        int prevchar = ptr[-1];
-#endif
-        int ch = check_escape(&ptr, errorptr, bracount, options, TRUE,
-          &compile_block);
-        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-
-        /* \b is backspace inside a class */
-
-        if (-ch == ESC_b) ch = '\b';
-
-        /* \Q enters quoting mode */
-
-        if (-ch == ESC_Q)
-          {
-          inescq = TRUE;
-          continue;
-          }
-
-        /* Handle escapes that turn into characters */
-
-        if (ch >= 0)
-          {
-#ifdef SUPPORT_UTF8
-          if (utf8)
-            {
-            if (ch > 127) class_optcount = 10;  /* Ensure > 1 */
-            if (ch > 255)
-              {
-              uschar buffer[6];
-              if (!class_utf8)
-                {
-                class_utf8 = TRUE;
-                length += LINK_SIZE + 1 + 1;
-                }
-              length += 1 + ord2utf8(ch, buffer);
-
-              /* If this wide character is preceded by '-', add an extra 2 to
-              the length in case the previous character was < 128, because in
-              this case the whole range will be put into the list. */
-
-              if (prevchar == '-') length += 2;
-              }
-            }
-#endif
-          class_optcount++;            /* for possible optimization */
-          }
-        else class_optcount = 10;      /* \d, \s etc; make sure > 1 */
-        }
-
-      /* Check the syntax for POSIX stuff. The bits we actually handle are
-      checked during the real compile phase. */
-
-      else if (*ptr == '[' && check_posix_syntax(ptr, &ptr, &compile_block))
-        {
-        ptr++;
-        class_optcount = 10;    /* Make sure > 1 */
-        }
-
-      /* Anything else just increments the possible optimization count. If
-      there are wide characters, we are going to have to use an XCLASS. */
-
-      else
-        {
-        NON_SPECIAL_CHARACTER:
-        class_optcount++;
-
-#ifdef SUPPORT_UTF8
-        if (utf8)
-          {
-          int ch;
-          int extra = 0;
-          GETCHARLEN(ch, ptr, extra);
-          if (ch > 127) class_optcount = 10;   /* No optimization possible */
-          if (ch > 255)
-            {
-            if (!class_utf8)
-              {
-              class_utf8 = TRUE;
-              length += LINK_SIZE + 1 + 1;
-              }
-            length += 2 + extra;
-
-            /* If this wide character is preceded by '-', add an extra 2 to
-            the length in case the previous character was < 128, because in
-            this case the whole range will be put into the list. */
-
-            if (ptr[-1] == '-') length += 2;
-
-            /* Advance to the end of this character */
-
-            ptr += extra;
-            }
-          }
-#endif
-        }
-      }
-    while (*(++ptr) != 0 && (inescq || *ptr != ']')); /* Concludes "do" above */
-
-    if (*ptr == 0)                          /* Missing terminating ']' */
-      {
-      *errorptr = ERR6;
-      goto PCRE_ERROR_RETURN;
-      }
-
-    /* We can optimize when there was only one optimizable character. Repeats
-    for positive and negated single one-byte chars are handled by the general
-    code. Here, we handle repeats for the class opcodes. */
-
-    if (class_optcount == 1) length += 3; else
-      {
-      length += 33;
-
-      /* A repeat needs either 1 or 5 bytes. */
-
-      if (*ptr != 0 && ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block))
-        {
-        ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block);
-        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-        if ((min == 0 && (max == 1 || max == -1)) ||
-          (min == 1 && max == -1))
-            length++;
-        else length += 5;
-        if (ptr[1] == '?') ptr++;
-        }
-      }
-    continue;
-
-    /* Brackets may be genuine groups or special things */
-
-    case '(':
-    branch_newextra = 0;
-    bracket_length = 1 + LINK_SIZE;
-
-    /* Handle special forms of bracket, which all start (? */
-
-    if (ptr[1] == '?')
-      {
-      int set, unset;
-      int *optset;
-
-      switch (c = ptr[2])
-        {
-        /* Skip over comments entirely */
-        case '#':
-        ptr += 3;
-        while (*ptr != 0 && *ptr != ')') ptr++;
-        if (*ptr == 0)
-          {
-          *errorptr = ERR18;
-          goto PCRE_ERROR_RETURN;
-          }
-        continue;
-
-        /* Non-referencing groups and lookaheads just move the pointer on, and
-        then behave like a non-special bracket, except that they don't increment
-        the count of extracting brackets. Ditto for the "once only" bracket,
-        which is in Perl from version 5.005. */
-
-        case ':':
-        case '=':
-        case '!':
-        case '>':
-        ptr += 2;
-        break;
-
-        /* (?R) specifies a recursive call to the regex, which is an extension
-        to provide the facility which can be obtained by (?p{perl-code}) in
-        Perl 5.6. In Perl 5.8 this has become (??{perl-code}).
-
-        From PCRE 4.00, items such as (?3) specify subroutine-like "calls" to
-        the appropriate numbered brackets. This includes both recursive and
-        non-recursive calls. (?R) is now synonymous with (?0). */
-
-        case 'R':
-        ptr++;
-
-        case '0': case '1': case '2': case '3': case '4':
-        case '5': case '6': case '7': case '8': case '9':
-        ptr += 2;
-        if (c != 'R')
-          while ((digitab[*(++ptr)] & ctype_digit) != 0);
-        if (*ptr != ')')
-          {
-          *errorptr = ERR29;
-          goto PCRE_ERROR_RETURN;
-          }
-        length += 1 + LINK_SIZE;
-
-        /* If this item is quantified, it will get wrapped inside brackets so
-        as to use the code for quantified brackets. We jump down and use the
-        code that handles this for real brackets. */
-
-        if (ptr[1] == '+' || ptr[1] == '*' || ptr[1] == '?' || ptr[1] == '{')
-          {
-          length += 2 + 2 * LINK_SIZE;       /* to make bracketed */
-          duplength = 5 + 3 * LINK_SIZE;
-          goto HANDLE_QUANTIFIED_BRACKETS;
-          }
-        continue;
-
-        /* (?C) is an extension which provides "callout" - to provide a bit of
-        the functionality of the Perl (?{...}) feature. An optional number may
-        follow (default is zero). */
-
-        case 'C':
-        ptr += 2;
-        while ((digitab[*(++ptr)] & ctype_digit) != 0);
-        if (*ptr != ')')
-          {
-          *errorptr = ERR39;
-          goto PCRE_ERROR_RETURN;
-          }
-        length += 2;
-        continue;
-
-        /* Named subpatterns are an extension copied from Python */
-
-        case 'P':
-        ptr += 3;
-        if (*ptr == '<')
-          {
-          const uschar *p;    /* Don't amalgamate; some compilers */
-          p = ++ptr;          /* grumble at autoincrement in declaration */
-          while ((compile_block.ctypes[*ptr] & ctype_word) != 0) ptr++;
-          if (*ptr != '>')
-            {
-            *errorptr = ERR42;
-            goto PCRE_ERROR_RETURN;
-            }
-          name_count++;
-          if (ptr - p > max_name_size) max_name_size = (ptr - p);
-          break;
-          }
-
-        if (*ptr == '=' || *ptr == '>')
-          {
-          while ((compile_block.ctypes[*(++ptr)] & ctype_word) != 0);
-          if (*ptr != ')')
-            {
-            *errorptr = ERR42;
-            goto PCRE_ERROR_RETURN;
-            }
-          break;
-          }
-
-        /* Unknown character after (?P */
-
-        *errorptr = ERR41;
-        goto PCRE_ERROR_RETURN;
-
-        /* Lookbehinds are in Perl from version 5.005 */
-
-        case '<':
-        ptr += 3;
-        if (*ptr == '=' || *ptr == '!')
-          {
-          branch_newextra = 1 + LINK_SIZE;
-          length += 1 + LINK_SIZE;         /* For the first branch */
-          break;
-          }
-        *errorptr = ERR24;
-        goto PCRE_ERROR_RETURN;
-
-        /* Conditionals are in Perl from version 5.005. The bracket must either
-        be followed by a number (for bracket reference) or by an assertion
-        group, or (a PCRE extension) by 'R' for a recursion test. */
-
-        case '(':
-        if (ptr[3] == 'R' && ptr[4] == ')')
-          {
-          ptr += 4;
-          length += 3;
-          }
-        else if ((digitab[ptr[3]] & ctype_digit) != 0)
-          {
-          ptr += 4;
-          length += 3;
-          while ((digitab[*ptr] & ctype_digit) != 0) ptr++;
-          if (*ptr != ')')
-            {
-            *errorptr = ERR26;
-            goto PCRE_ERROR_RETURN;
-            }
-          }
-        else   /* An assertion must follow */
-          {
-          ptr++;   /* Can treat like ':' as far as spacing is concerned */
-          if (ptr[2] != '?' ||
-             (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<') )
-            {
-            ptr += 2;    /* To get right offset in message */
-            *errorptr = ERR28;
-            goto PCRE_ERROR_RETURN;
-            }
-          }
-        break;
-
-        /* Else loop checking valid options until ) is met. Anything else is an
-        error. If we are without any brackets, i.e. at top level, the settings
-        act as if specified in the options, so massage the options immediately.
-        This is for backward compatibility with Perl 5.004. */
-
-        default:
-        set = unset = 0;
-        optset = &set;
-        ptr += 2;
-
-        for (;; ptr++)
-          {
-          c = *ptr;
-          switch (c)
-            {
-            case 'i':
-            *optset |= PCRE_CASELESS;
-            continue;
-
-            case 'm':
-            *optset |= PCRE_MULTILINE;
-            continue;
-
-            case 's':
-            *optset |= PCRE_DOTALL;
-            continue;
-
-            case 'x':
-            *optset |= PCRE_EXTENDED;
-            continue;
-
-            case 'X':
-            *optset |= PCRE_EXTRA;
-            continue;
-
-            case 'U':
-            *optset |= PCRE_UNGREEDY;
-            continue;
-
-            case '-':
-            optset = &unset;
-            continue;
-
-            /* A termination by ')' indicates an options-setting-only item; if
-            this is at the very start of the pattern (indicated by item_count
-            being zero), we use it to set the global options. This is helpful
-            when analyzing the pattern for first characters, etc. Otherwise
-            nothing is done here and it is handled during the compiling
-            process.
-
-            [Historical note: Up to Perl 5.8, options settings at top level
-            were always global settings, wherever they appeared in the pattern.
-            That is, they were equivalent to an external setting. From 5.8
-            onwards, they apply only to what follows (which is what you might
-            expect).] */
-
-            case ')':
-            if (item_count == 0)
-              {
-              options = (options | set) & (~unset);
-              set = unset = 0;     /* To save length */
-              item_count--;        /* To allow for several */
-              }
-
-            /* Fall through */
-
-            /* A termination by ':' indicates the start of a nested group with
-            the given options set. This is again handled at compile time, but
-            we must allow for compiled space if any of the ims options are
-            set. We also have to allow for resetting space at the end of
-            the group, which is why 4 is added to the length and not just 2.
-            If there are several changes of options within the same group, this
-            will lead to an over-estimate on the length, but this shouldn't
-            matter very much. We also have to allow for resetting options at
-            the start of any alternations, which we do by setting
-            branch_newextra to 2. Finally, we record whether the case-dependent
-            flag ever changes within the regex. This is used by the "required
-            character" code. */
-
-            case ':':
-            if (((set|unset) & PCRE_IMS) != 0)
-              {
-              length += 4;
-              branch_newextra = 2;
-              if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED;
-              }
-            goto END_OPTIONS;
-
-            /* Unrecognized option character */
-
-            default:
-            *errorptr = ERR12;
-            goto PCRE_ERROR_RETURN;
-            }
-          }
-
-        /* If we hit a closing bracket, that's it - this is a freestanding
-        option-setting. We need to ensure that branch_extra is updated if
-        necessary. The only values branch_newextra can have here are 0 or 2.
-        If the value is 2, then branch_extra must either be 2 or 5, depending
-        on whether this is a lookbehind group or not. */
-
-        END_OPTIONS:
-        if (c == ')')
-          {
-          if (branch_newextra == 2 &&
-              (branch_extra == 0 || branch_extra == 1+LINK_SIZE))
-            branch_extra += branch_newextra;
-          continue;
-          }
-
-        /* If options were terminated by ':' control comes here. Fall through
-        to handle the group below. */
-        }
-      }
-
-    /* Extracting brackets must be counted so we can process escapes in a
-    Perlish way. If the number exceeds EXTRACT_BASIC_MAX we are going to
-    need an additional 3 bytes of store per extracting bracket. However, if
-    PCRE_NO_AUTO)CAPTURE is set, unadorned brackets become non-capturing, so we
-    must leave the count alone (it will aways be zero). */
-
-    else if ((options & PCRE_NO_AUTO_CAPTURE) == 0)
-      {
-      bracount++;
-      if (bracount > EXTRACT_BASIC_MAX) bracket_length += 3;
-      }
-
-    /* Save length for computing whole length at end if there's a repeat that
-    requires duplication of the group. Also save the current value of
-    branch_extra, and start the new group with the new value. If non-zero, this
-    will either be 2 for a (?imsx: group, or 3 for a lookbehind assertion. */
-
-    if (brastackptr >= sizeof(brastack)/sizeof(int))
-      {
-      *errorptr = ERR19;
-      goto PCRE_ERROR_RETURN;
-      }
-
-    bralenstack[brastackptr] = branch_extra;
-    branch_extra = branch_newextra;
-
-    brastack[brastackptr++] = length;
-    length += bracket_length;
-    continue;
-
-    /* Handle ket. Look for subsequent max/min; for certain sets of values we
-    have to replicate this bracket up to that many times. If brastackptr is
-    0 this is an unmatched bracket which will generate an error, but take care
-    not to try to access brastack[-1] when computing the length and restoring
-    the branch_extra value. */
-
-    case ')':
-    length += 1 + LINK_SIZE;
-    if (brastackptr > 0)
-      {
-      duplength = length - brastack[--brastackptr];
-      branch_extra = bralenstack[brastackptr];
-      }
-    else duplength = 0;
-
-    /* The following code is also used when a recursion such as (?3) is
-    followed by a quantifier, because in that case, it has to be wrapped inside
-    brackets so that the quantifier works. The value of duplength must be
-    set before arrival. */
-
-    HANDLE_QUANTIFIED_BRACKETS:
-
-    /* Leave ptr at the final char; for read_repeat_counts this happens
-    automatically; for the others we need an increment. */
-
-    if ((c = ptr[1]) == '{' && is_counted_repeat(ptr+2, &compile_block))
-      {
-      ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block);
-      if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-      }
-    else if (c == '*') { min = 0; max = -1; ptr++; }
-    else if (c == '+') { min = 1; max = -1; ptr++; }
-    else if (c == '?') { min = 0; max = 1;  ptr++; }
-    else { min = 1; max = 1; }
-
-    /* If the minimum is zero, we have to allow for an OP_BRAZERO before the
-    group, and if the maximum is greater than zero, we have to replicate
-    maxval-1 times; each replication acquires an OP_BRAZERO plus a nesting
-    bracket set. */
-
-    if (min == 0)
-      {
-      length++;
-      if (max > 0) length += (max - 1) * (duplength + 3 + 2*LINK_SIZE);
-      }
-
-    /* When the minimum is greater than zero, we have to replicate up to
-    minval-1 times, with no additions required in the copies. Then, if there
-    is a limited maximum we have to replicate up to maxval-1 times allowing
-    for a BRAZERO item before each optional copy and nesting brackets for all
-    but one of the optional copies. */
-
-    else
-      {
-      length += (min - 1) * duplength;
-      if (max > min)   /* Need this test as max=-1 means no limit */
-        length += (max - min) * (duplength + 3 + 2*LINK_SIZE)
-          - (2 + 2*LINK_SIZE);
-      }
-
-    /* Allow space for once brackets for "possessive quantifier" */
-
-    if (ptr[1] == '+')
-      {
-      ptr++;
-      length += 2 + 2*LINK_SIZE;
-      }
-    continue;
-
-    /* Non-special character. For a run of such characters the length required
-    is the number of characters + 2, except that the maximum run length is
-    MAXLIT. We won't get a skipped space or a non-data escape or the start of a
-    # comment as the first character, so the length can't be zero. */
-
-    NORMAL_CHAR:
-    default:
-    length += 2;
-    runlength = 0;
-    do
-      {
-#ifdef SUPPORT_UTF8
-      lastcharlength = 1;     /* Need length of last char for UTF-8 repeats */
-#endif
-
-      /* If in a \Q...\E sequence, check for end; otherwise it's a literal */
-      if (inescq)
-        {
-        if (c == '\\' && ptr[1] == 'E')
-          {
-          inescq = FALSE;
-          ptr++;
-          }
-        else runlength++;
-        continue;
-        }
-
-      /* Skip whitespace and comments for /x */
-
-      if ((options & PCRE_EXTENDED) != 0)
-        {
-        if ((compile_block.ctypes[c] & ctype_space) != 0) continue;
-        if (c == '#')
-          {
-          /* The space before the ; is to avoid a warning on a silly compiler
-          on the Macintosh. */
-          while ((c = *(++ptr)) != 0 && c != NEWLINE) ;
-          continue;
-          }
-        }
-
-      /* Backslash may introduce a data char or a metacharacter; stop the
-      string before the latter. */
-
-      if (c == '\\')
-        {
-        const uschar *saveptr = ptr;
-        c = check_escape(&ptr, errorptr, bracount, options, FALSE,
-          &compile_block);
-        if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
-        if (c < 0) { ptr = saveptr; break; }
-
-        /* In UTF-8 mode, add on the number of additional bytes needed to
-        encode this character, and save the total length in case this is a
-        final char that is repeated. */
-
-#ifdef SUPPORT_UTF8
-        if (utf8 && c > 127)
-          {
-          int i;
-          for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
-            if (c <= utf8_table1[i]) break;
-          runlength += i;
-          lastcharlength += i;
-          }
-#endif
-        }
-
-      /* Ordinary character or single-char escape */
-
-      runlength++;
-      }
-
-    /* This "while" is the end of the "do" above. */
-
-    while (runlength < MAXLIT &&
-      (compile_block.ctypes[c = *(++ptr)] & ctype_meta) == 0);
-
-    /* If we hit a meta-character, back off to point to it */
-
-    if (runlength < MAXLIT) ptr--;
-
-    /* If the last char in the string is a UTF-8 multibyte character, we must
-    set lastcharlength correctly. If it was specified as an escape, this will
-    already have been done above. However, we also have to support in-line
-    UTF-8 characters, so check backwards from where we are. */
-
-#ifdef SUPPORT_UTF8
-    if (utf8)
-      {
-      const uschar *lastptr = ptr - 1;
-      if ((*lastptr & 0x80) != 0)
-        {
-        while((*lastptr & 0xc0) == 0x80) lastptr--;
-        lastcharlength = ptr - lastptr;
-        }
-      }
-#endif
-
-    length += runlength;
-    continue;
-    }
-  }
-
-length += 2 + LINK_SIZE;    /* For final KET and END */
-
-if (length > MAX_PATTERN_SIZE)
-  {
-  *errorptr = ERR20;
-  return NULL;
-  }
-
-/* Compute the size of data block needed and get it, either from malloc or
-externally provided function. */
-
-size = length + sizeof(real_pcre) + name_count * (max_name_size + 3);
-re = (real_pcre *)(pcre_malloc)(size);
-
-if (re == NULL)
-  {
-  *errorptr = ERR21;
-  return NULL;
-  }
-
-/* Put in the magic number, and save the size, options, and table pointer */
-
-re->magic_number = MAGIC_NUMBER;
-re->size = size;
-re->options = options;
-re->tables = tables;
-re->name_entry_size = max_name_size + 3;
-re->name_count = name_count;
-
-/* The starting points of the name/number translation table and of the code are
-passed around in the compile data block. */
-
-compile_block.names_found = 0;
-compile_block.name_entry_size = max_name_size + 3;
-compile_block.name_table = (uschar *)re + sizeof(real_pcre);
-codestart = compile_block.name_table + re->name_entry_size * re->name_count;
-compile_block.start_code = codestart;
-compile_block.req_varyopt = 0;
-
-/* Set up a starting, non-extracting bracket, then compile the expression. On
-error, *errorptr will be set non-NULL, so we don't need to look at the result
-of the function here. */
-
-ptr = (const uschar *)pattern;
-code = (uschar *)codestart;
-*code = OP_BRA;
-bracount = 0;
-(void)compile_regex(options, options & PCRE_IMS, &bracount, &code, &ptr,
-  errorptr, FALSE, 0, &firstbyte, &reqbyte, NULL, &compile_block);
-re->top_bracket = bracount;
-re->top_backref = compile_block.top_backref;
-
-/* If not reached end of pattern on success, there's an excess bracket. */
-
-if (*errorptr == NULL && *ptr != 0) *errorptr = ERR22;
-
-/* Fill in the terminating state and check for disastrous overflow, but
-if debugging, leave the test till after things are printed out. */
-
-*code++ = OP_END;
-
-#ifndef DEBUG
-if (code - codestart > length) *errorptr = ERR23;
-#endif
-
-/* Give an error if there's back reference to a non-existent capturing
-subpattern. */
-
-if (re->top_backref > re->top_bracket) *errorptr = ERR15;
-
-/* Failed to compile, or error while post-processing */
-
-if (*errorptr != NULL)
-  {
-  (pcre_free)(re);
-  PCRE_ERROR_RETURN:
-  *erroroffset = ptr - (const uschar *)pattern;
-  return NULL;
-  }
-
-/* If the anchored option was not passed, set the flag if we can determine that
-the pattern is anchored by virtue of ^ characters or \A or anything else (such
-as starting with .* when DOTALL is set).
-
-Otherwise, if we know what the first character has to be, save it, because that
-speeds up unanchored matches no end. If not, see if we can set the
-PCRE_STARTLINE flag. This is helpful for multiline matches when all branches
-start with ^. and also when all branches start with .* for non-DOTALL matches.
-*/
-
-if ((options & PCRE_ANCHORED) == 0)
-  {
-  int temp_options = options;
-  if (is_anchored(codestart, &temp_options, 0, compile_block.backref_map))
-    re->options |= PCRE_ANCHORED;
-  else
-    {
-    if (firstbyte < 0)
-      firstbyte = find_firstassertedchar(codestart, &temp_options, FALSE);
-    if (firstbyte >= 0)   /* Remove caseless flag for non-caseable chars */
-      {
-      int ch = firstbyte & 255;
-      re->first_byte = ((firstbyte & REQ_CASELESS) != 0 &&
-         compile_block.fcc[ch] == ch)? ch : firstbyte;
-      re->options |= PCRE_FIRSTSET;
-      }
-    else if (is_startline(codestart, 0, compile_block.backref_map))
-      re->options |= PCRE_STARTLINE;
-    }
-  }
-
-/* For an anchored pattern, we use the "required byte" only if it follows a
-variable length item in the regex. Remove the caseless flag for non-caseable
-chars. */
-
-if (reqbyte >= 0 &&
-     ((re->options & PCRE_ANCHORED) == 0 || (reqbyte & REQ_VARY) != 0))
-  {
-  int ch = reqbyte & 255;
-  re->req_byte = ((reqbyte & REQ_CASELESS) != 0 &&
-    compile_block.fcc[ch] == ch)? (reqbyte & ~REQ_CASELESS) : reqbyte;
-  re->options |= PCRE_REQCHSET;
-  }
-
-/* Print out the compiled data for debugging */
-
-#ifdef DEBUG
-
-printf("Length = %d top_bracket = %d top_backref = %d\n",
-  length, re->top_bracket, re->top_backref);
-
-if (re->options != 0)
-  {
-  printf("%s%s%s%s%s%s%s%s%s\n",
-    ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "",
-    ((re->options & PCRE_CASELESS) != 0)? "caseless " : "",
-    ((re->options & PCRE_ICHANGED) != 0)? "case state changed " : "",
-    ((re->options & PCRE_EXTENDED) != 0)? "extended " : "",
-    ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "",
-    ((re->options & PCRE_DOTALL) != 0)? "dotall " : "",
-    ((re->options & PCRE_DOLLAR_ENDONLY) != 0)? "endonly " : "",
-    ((re->options & PCRE_EXTRA) != 0)? "extra " : "",
-    ((re->options & PCRE_UNGREEDY) != 0)? "ungreedy " : "");
-  }
-
-if ((re->options & PCRE_FIRSTSET) != 0)
-  {
-  int ch = re->first_byte & 255;
-  char *caseless = ((re->first_byte & REQ_CASELESS) == 0)? "" : " (caseless)";
-  if (isprint(ch)) printf("First char = %c%s\n", ch, caseless);
-    else printf("First char = \\x%02x%s\n", ch, caseless);
-  }
-
-if ((re->options & PCRE_REQCHSET) != 0)
-  {
-  int ch = re->req_byte & 255;
-  char *caseless = ((re->req_byte & REQ_CASELESS) == 0)? "" : " (caseless)";
-  if (isprint(ch)) printf("Req char = %c%s\n", ch, caseless);
-    else printf("Req char = \\x%02x%s\n", ch, caseless);
-  }
-
-print_internals(re, stdout);
-
-/* This check is done here in the debugging case so that the code that
-was compiled can be seen. */
-
-if (code - codestart > length)
-  {
-  *errorptr = ERR23;
-  (pcre_free)(re);
-  *erroroffset = ptr - (uschar *)pattern;
-  return NULL;
-  }
-#endif
-
-return (pcre *)re;
-}
-
-
-
-/*************************************************
-*          Match a back-reference                *
-*************************************************/
-
-/* If a back reference hasn't been set, the length that is passed is greater
-than the number of characters left in the string, so the match fails.
-
-Arguments:
-  offset      index into the offset vector
-  eptr        points into the subject
-  length      length to be matched
-  md          points to match data block
-  ims         the ims flags
-
-Returns:      TRUE if matched
-*/
-
-static BOOL
-match_ref(int offset, register const uschar *eptr, int length, match_data *md,
-  unsigned long int ims)
-{
-const uschar *p = md->start_subject + md->offset_vector[offset];
-
-#ifdef DEBUG
-if (eptr >= md->end_subject)
-  printf("matching subject <null>");
-else
-  {
-  printf("matching subject ");
-  pchars(eptr, length, TRUE, md);
-  }
-printf(" against backref ");
-pchars(p, length, FALSE, md);
-printf("\n");
-#endif
-
-/* Always fail if not enough characters left */
-
-if (length > md->end_subject - eptr) return FALSE;
-
-/* Separate the caselesss case for speed */
-
-if ((ims & PCRE_CASELESS) != 0)
-  {
-  while (length-- > 0)
-    if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE;
-  }
-else
-  { while (length-- > 0) if (*p++ != *eptr++) return FALSE; }
-
-return TRUE;
-}
-
-
-#ifdef SUPPORT_UTF8
-/*************************************************
-*       Match character against an XCLASS        *
-*************************************************/
-
-/* This function is called from within the XCLASS code below, to match a
-character against an extended class which might match values > 255.
-
-Arguments:
-  c           the character
-  data        points to the flag byte of the XCLASS data
-
-Returns:      TRUE if character matches, else FALSE
-*/
-
-static BOOL
-match_xclass(int c, const uschar *data)
-{
-int t;
-BOOL negated = (*data & XCL_NOT) != 0;
-
-/* Character values < 256 are matched against a bitmap, if one is present. If
-not, we still carry on, because there may be ranges that start below 256 in the
-additional data. */
-
-if (c < 256)
-  {
-  if ((*data & XCL_MAP) != 0 && (data[1 + c/8] & (1 << (c&7))) != 0)
-    return !negated;   /* char found */
-  }
-
-/* Now match against the list of large chars or ranges that end with a large
-char. First skip the bit map if present. */
-
-if ((*data++ & XCL_MAP) != 0) data += 32;
-
-while ((t = *data++) != XCL_END)
-  {
-  int x, y;
-  GETCHARINC(x, data);
-  if (t == XCL_SINGLE)
-    {
-    if (c == x) return !negated;
-    }
-  else
-    {
-    GETCHARINC(y, data);
-    if (c >= x && c <= y) return !negated;
-    }
-  }
-
-return negated;   /* char was not found */
-}
-#endif
-
-
-
-
-/*************************************************
-*         Match from current position            *
-*************************************************/
-
-/* On entry ecode points to the first opcode, and eptr to the first character
-in the subject string, while eptrb holds the value of eptr at the start of the
-last bracketed group - used for breaking infinite loops matching zero-length
-strings. This function is called recursively in many circumstances. Whenever it
-returns a negative (error) response, the outer incarnation must also return the
-same response.
-
-Performance note: It might be tempting to extract commonly used fields from the
-md structure (e.g. utf8, end_subject) into individual variables to improve
-performance. Tests using gcc on a SPARC disproved this; in the first case, it
-made performance worse.
-
-Arguments:
-   eptr        pointer in subject
-   ecode       position in code
-   offset_top  current top pointer
-   md          pointer to "static" info for the match
-   ims         current /i, /m, and /s options
-   eptrb       pointer to chain of blocks containing eptr at start of
-                 brackets - for testing for empty matches
-   flags       can contain
-                 match_condassert - this is an assertion condition
-                 match_isgroup - this is the start of a bracketed group
-
-Returns:       MATCH_MATCH if matched            )  these values are >= 0
-               MATCH_NOMATCH if failed to match  )
-               a negative PCRE_ERROR_xxx value if aborted by an error condition
-                 (e.g. stopped by recursion limit)
-*/
-
-static int
-match(register const uschar *eptr, register const uschar *ecode,
-  int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb,
-  int flags)
-{
-unsigned long int original_ims = ims;   /* Save for resetting on ')' */
-register int rrc;
-eptrblock newptrb;
-
-if (md->match_call_count++ >= md->match_limit) return PCRE_ERROR_MATCHLIMIT;
-
-/* At the start of a bracketed group, add the current subject pointer to the
-stack of such pointers, to be re-instated at the end of the group when we hit
-the closing ket. When match() is called in other circumstances, we don't add to
-the stack. */
-
-if ((flags & match_isgroup) != 0)
-  {
-  newptrb.prev = eptrb;
-  newptrb.saved_eptr = eptr;
-  eptrb = &newptrb;
-  }
-
-/* Now start processing the operations. */
-
-for (;;)
-  {
-  int op = (int)*ecode;
-  int min, max, ctype;
-  register int i;
-  register int c;
-  BOOL minimize = FALSE;
-
-  /* Opening capturing bracket. If there is space in the offset vector, save
-  the current subject position in the working slot at the top of the vector. We
-  mustn't change the current values of the data slot, because they may be set
-  from a previous iteration of this group, and be referred to by a reference
-  inside the group.
-
-  If the bracket fails to match, we need to restore this value and also the
-  values of the final offsets, in case they were set by a previous iteration of
-  the same bracket.
-
-  If there isn't enough space in the offset vector, treat this as if it were a
-  non-capturing bracket. Don't worry about setting the flag for the error case
-  here; that is handled in the code for KET. */
-
-  if (op > OP_BRA)
-    {
-    int offset;
-    int number = op - OP_BRA;
-
-    /* For extended extraction brackets (large number), we have to fish out the
-    number from a dummy opcode at the start. */
-
-    if (number > EXTRACT_BASIC_MAX)
-      number = GET2(ecode, 2+LINK_SIZE);
-    offset = number << 1;
-
-#ifdef DEBUG
-    printf("start bracket %d subject=", number);
-    pchars(eptr, 16, TRUE, md);
-    printf("\n");
-#endif
-
-    if (offset < md->offset_max)
-      {
-      int save_offset1 = md->offset_vector[offset];
-      int save_offset2 = md->offset_vector[offset+1];
-      int save_offset3 = md->offset_vector[md->offset_end - number];
-      int save_capture_last = md->capture_last;
-
-      DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3));
-      md->offset_vector[md->offset_end - number] = eptr - md->start_subject;
-
-      do
-        {
-        if ((rrc = match(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims,
-              eptrb, match_isgroup)) != MATCH_NOMATCH) return rrc;
-        md->capture_last = save_capture_last;
-        ecode += GET(ecode, 1);
-        }
-      while (*ecode == OP_ALT);
-
-      DPRINTF(("bracket %d failed\n", number));
-
-      md->offset_vector[offset] = save_offset1;
-      md->offset_vector[offset+1] = save_offset2;
-      md->offset_vector[md->offset_end - number] = save_offset3;
-
-      return MATCH_NOMATCH;
-      }
-
-    /* Insufficient room for saving captured contents */
-
-    else op = OP_BRA;
-    }
-
-  /* Other types of node can be handled by a switch */
-
-  switch(op)
-    {
-    case OP_BRA:     /* Non-capturing bracket: optimized */
-    DPRINTF(("start bracket 0\n"));
-    do
-      {
-      if ((rrc = match(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb,
-        match_isgroup)) != MATCH_NOMATCH) return rrc;
-      ecode += GET(ecode, 1);
-      }
-    while (*ecode == OP_ALT);
-    DPRINTF(("bracket 0 failed\n"));
-    return MATCH_NOMATCH;
-
-    /* Conditional group: compilation checked that there are no more than
-    two branches. If the condition is false, skipping the first branch takes us
-    past the end if there is only one branch, but that's OK because that is
-    exactly what going to the ket would do. */
-
-    case OP_COND:
-    if (ecode[LINK_SIZE+1] == OP_CREF) /* Condition extract or recurse test */
-      {
-      int offset = GET2(ecode, LINK_SIZE+2) << 1;  /* Doubled ref number */
-      BOOL condition = (offset == CREF_RECURSE * 2)?
-        (md->recursive != NULL) :
-        (offset < offset_top && md->offset_vector[offset] >= 0);
-      return match(eptr, ecode + (condition?
-        (LINK_SIZE + 4) : (LINK_SIZE + 1 + GET(ecode, 1))),
-        offset_top, md, ims, eptrb, match_isgroup);
-      }
-
-    /* The condition is an assertion. Call match() to evaluate it - setting
-    the final argument TRUE causes it to stop at the end of an assertion. */
-
-    else
-      {
-      if ((rrc = match(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL,
-          match_condassert | match_isgroup)) == MATCH_MATCH)
-        {
-        ecode += 1 + LINK_SIZE + GET(ecode, LINK_SIZE+2);
-        while (*ecode == OP_ALT) ecode += GET(ecode, 1);
-        }
-      else if (rrc != MATCH_NOMATCH) return rrc;
-      else ecode += GET(ecode, 1);
-      return match(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb,
-        match_isgroup);
-      }
-    /* Control never reaches here */
-
-    /* Skip over conditional reference or large extraction number data if
-    encountered. */
-
-    case OP_CREF:
-    case OP_BRANUMBER:
-    ecode += 3;
-    break;
-
-    /* End of the pattern. If we are in a recursion, we should restore the
-    offsets appropriately and continue from after the call. */
-
-    case OP_END:
-    if (md->recursive != NULL && md->recursive->group_num == 0)
-      {
-      recursion_info *rec = md->recursive;
-      DPRINTF(("Hit the end in a (?0) recursion\n"));
-      md->recursive = rec->prev;
-      memmove(md->offset_vector, rec->offset_save,
-        rec->saved_max * sizeof(int));
-      md->start_match = rec->save_start;
-      ims = original_ims;
-      ecode = rec->after_call;
-      break;
-      }
-
-    /* Otherwise, if PCRE_NOTEMPTY is set, fail if we have matched an empty
-    string - backtracking will then try other alternatives, if any. */
-
-    if (md->notempty && eptr == md->start_match) return MATCH_NOMATCH;
-    md->end_match_ptr = eptr;          /* Record where we ended */
-    md->end_offset_top = offset_top;   /* and how many extracts were taken */
-    return MATCH_MATCH;
-
-    /* Change option settings */
-
-    case OP_OPT:
-    ims = ecode[1];
-    ecode += 2;
-    DPRINTF(("ims set to %02lx\n", ims));
-    break;
-
-    /* Assertion brackets. Check the alternative branches in turn - the
-    matching won't pass the KET for an assertion. If any one branch matches,
-    the assertion is true. Lookbehind assertions have an OP_REVERSE item at the
-    start of each branch to move the current point backwards, so the code at
-    this level is identical to the lookahead case. */
-
-    case OP_ASSERT:
-    case OP_ASSERTBACK:
-    do
-      {
-      if ((rrc = match(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL,
-        match_isgroup)) == MATCH_MATCH) break;
-      if (rrc != MATCH_NOMATCH) return rrc;
-      ecode += GET(ecode, 1);
-      }
-    while (*ecode == OP_ALT);
-    if (*ecode == OP_KET) return MATCH_NOMATCH;
-
-    /* If checking an assertion for a condition, return MATCH_MATCH. */
-
-    if ((flags & match_condassert) != 0) return MATCH_MATCH;
-
-    /* Continue from after the assertion, updating the offsets high water
-    mark, since extracts may have been taken during the assertion. */
-
-    do ecode += GET(ecode,1); while (*ecode == OP_ALT);
-    ecode += 1 + LINK_SIZE;
-    offset_top = md->end_offset_top;
-    continue;
-
-    /* Negative assertion: all branches must fail to match */
-
-    case OP_ASSERT_NOT:
-    case OP_ASSERTBACK_NOT:
-    do
-      {
-      if ((rrc = match(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL,
-        match_isgroup)) == MATCH_MATCH) return MATCH_NOMATCH;
-      if (rrc != MATCH_NOMATCH) return rrc;
-      ecode += GET(ecode,1);
-      }
-    while (*ecode == OP_ALT);
-
-    if ((flags & match_condassert) != 0) return MATCH_MATCH;
-
-    ecode += 1 + LINK_SIZE;
-    continue;
-
-    /* Move the subject pointer back. This occurs only at the start of
-    each branch of a lookbehind assertion. If we are too close to the start to
-    move back, this match function fails. When working with UTF-8 we move
-    back a number of characters, not bytes. */
-
-    case OP_REVERSE:
-#ifdef SUPPORT_UTF8
-    if (md->utf8)
-      {
-      c = GET(ecode,1);
-      for (i = 0; i < c; i++)
-        {
-        eptr--;
-        if (eptr < md->start_subject) return MATCH_NOMATCH;
-        BACKCHAR(eptr)
-        }
-      }
-    else
-#endif
-
-    /* No UTF-8 support, or not in UTF-8 mode: count is byte count */
-
-      {
-      eptr -= GET(ecode,1);
-      if (eptr < md->start_subject) return MATCH_NOMATCH;
-      }
-
-    /* Skip to next op code */
-
-    ecode += 1 + LINK_SIZE;
-    break;
-
-    /* The callout item calls an external function, if one is provided, passing
-    details of the match so far. This is mainly for debugging, though the
-    function is able to force a failure. */
-
-    case OP_CALLOUT:
-    if (pcre_callout != NULL)
-      {
-      pcre_callout_block cb;
-      cb.version          = 0;   /* Version 0 of the callout block */
-      cb.callout_number   = ecode[1];
-      cb.offset_vector    = md->offset_vector;
-      cb.subject          = (const char *)md->start_subject;
-      cb.subject_length   = md->end_subject - md->start_subject;
-      cb.start_match      = md->start_match - md->start_subject;
-      cb.current_position = eptr - md->start_subject;
-      cb.capture_top      = offset_top/2;
-      cb.capture_last     = md->capture_last;
-      cb.callout_data     = md->callout_data;
-      if ((rrc = (*pcre_callout)(&cb)) > 0) return MATCH_NOMATCH;
-      if (rrc < 0) return rrc;
-      }
-    ecode += 2;
-    break;
-
-    /* Recursion either matches the current regex, or some subexpression. The
-    offset data is the offset to the starting bracket from the start of the
-    whole pattern. However, it is possible that a BRAZERO was inserted before
-    this bracket after we took the offset - we just skip it if encountered.
-
-    If there are any capturing brackets started but not finished, we have to
-    save their starting points and reinstate them after the recursion. However,
-    we don't know how many such there are (offset_top records the completed
-    total) so we just have to save all the potential data. There may be up to
-    65535 such values, which is too large to put on the stack, but using malloc
-    for small numbers seems expensive. As a compromise, the stack is used when
-    there are no more than REC_STACK_SAVE_MAX values to store; otherwise malloc
-    is used. A problem is what to do if the malloc fails ... there is no way of
-    returning to the top level with an error. Save the top REC_STACK_SAVE_MAX
-    values on the stack, and accept that the rest may be wrong.
-
-    There are also other values that have to be saved. We use a chained
-    sequence of blocks that actually live on the stack. Thanks to Robin Houston
-    for the original version of this logic. */
-
-    case OP_RECURSE:
-      {
-      int stacksave[REC_STACK_SAVE_MAX];
-      recursion_info new_recursive;
-      const uschar *callpat = md->start_code + GET(ecode, 1);
-
-      if (*callpat == OP_BRAZERO) callpat++;
-
-      new_recursive.group_num = *callpat - OP_BRA;
-
-      /* For extended extraction brackets (large number), we have to fish out
-      the number from a dummy opcode at the start. */
-
-      if (new_recursive.group_num > EXTRACT_BASIC_MAX)
-        new_recursive.group_num = GET2(callpat, 2+LINK_SIZE);
-
-      /* Add to "recursing stack" */
-
-      new_recursive.prev = md->recursive;
-      md->recursive = &new_recursive;
-
-      /* Find where to continue from afterwards */
-
-      ecode += 1 + LINK_SIZE;
-      new_recursive.after_call = ecode;
-
-      /* Now save the offset data. */
-
-      new_recursive.saved_max = md->offset_end;
-      if (new_recursive.saved_max <= REC_STACK_SAVE_MAX)
-        new_recursive.offset_save = stacksave;
-      else
-        {
-        new_recursive.offset_save =
-          (int *)(pcre_malloc)(new_recursive.saved_max * sizeof(int));
-        if (new_recursive.offset_save == NULL) return PCRE_ERROR_NOMEMORY;
-        }
-
-      memcpy(new_recursive.offset_save, md->offset_vector,
-            new_recursive.saved_max * sizeof(int));
-      new_recursive.save_start = md->start_match;
-      md->start_match = eptr;
-
-      /* OK, now we can do the recursion. For each top-level alternative we
-      restore the offset and recursion data. */
-
-      DPRINTF(("Recursing into group %d\n", new_recursive.group_num));
-      do
-        {
-        if ((rrc = match(eptr, callpat + 1 + LINK_SIZE, offset_top, md, ims,
-            eptrb, match_isgroup)) == MATCH_MATCH)
-          {
-          md->recursive = new_recursive.prev;
-          if (new_recursive.offset_save != stacksave)
-            (pcre_free)(new_recursive.offset_save);
-          return MATCH_MATCH;
-          }
-        else if (rrc != MATCH_NOMATCH) return rrc;
-
-        md->recursive = &new_recursive;
-        memcpy(md->offset_vector, new_recursive.offset_save,
-            new_recursive.saved_max * sizeof(int));
-        callpat += GET(callpat, 1);
-        }
-      while (*callpat == OP_ALT);
-
-      DPRINTF(("Recursion didn't match\n"));
-      md->recursive = new_recursive.prev;
-      if (new_recursive.offset_save != stacksave)
-        (pcre_free)(new_recursive.offset_save);
-      return MATCH_NOMATCH;
-      }
-    /* Control never reaches here */
-
-    /* "Once" brackets are like assertion brackets except that after a match,
-    the point in the subject string is not moved back. Thus there can never be
-    a move back into the brackets. Friedl calls these "atomic" subpatterns.
-    Check the alternative branches in turn - the matching won't pass the KET
-    for this kind of subpattern. If any one branch matches, we carry on as at
-    the end of a normal bracket, leaving the subject pointer. */
-
-    case OP_ONCE:
-      {
-      const uschar *prev = ecode;
-      const uschar *saved_eptr = eptr;
-
-      do
-        {
-        if ((rrc = match(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims,
-          eptrb, match_isgroup)) == MATCH_MATCH) break;
-        if (rrc != MATCH_NOMATCH) return rrc;
-        ecode += GET(ecode,1);
-        }
-      while (*ecode == OP_ALT);
-
-      /* If hit the end of the group (which could be repeated), fail */
-
-      if (*ecode != OP_ONCE && *ecode != OP_ALT) return MATCH_NOMATCH;
-
-      /* Continue as from after the assertion, updating the offsets high water
-      mark, since extracts may have been taken. */
-
-      do ecode += GET(ecode,1); while (*ecode == OP_ALT);
-
-      offset_top = md->end_offset_top;
-      eptr = md->end_match_ptr;
-
-      /* For a non-repeating ket, just continue at this level. This also
-      happens for a repeating ket if no characters were matched in the group.
-      This is the forcible breaking of infinite loops as implemented in Perl
-      5.005. If there is an options reset, it will get obeyed in the normal
-      course of events. */
-
-      if (*ecode == OP_KET || eptr == saved_eptr)
-        {
-        ecode += 1+LINK_SIZE;
-        break;
-        }
-
-      /* The repeating kets try the rest of the pattern or restart from the
-      preceding bracket, in the appropriate order. We need to reset any options
-      that changed within the bracket before re-running it, so check the next
-      opcode. */
-
-      if (ecode[1+LINK_SIZE] == OP_OPT)
-        {
-        ims = (ims & ~PCRE_IMS) | ecode[4];
-        DPRINTF(("ims set to %02lx at group repeat\n", ims));
-        }
-
-      if (*ecode == OP_KETRMIN)
-        {
-        if ((rrc = match(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims,
-             eptrb, 0)) != MATCH_NOMATCH) return rrc;
-        if ((rrc = match(eptr, prev, offset_top, md, ims, eptrb,
-             match_isgroup)) != MATCH_NOMATCH) return rrc;
-        }
-      else  /* OP_KETRMAX */
-        {
-        if ((rrc = match(eptr, prev, offset_top, md, ims, eptrb,
-             match_isgroup)) != MATCH_NOMATCH) return rrc;
-        if ((rrc = match(eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb,
-             0)) != MATCH_NOMATCH) return rrc;
-        }
-      }
-    return MATCH_NOMATCH;
-
-    /* An alternation is the end of a branch; scan along to find the end of the
-    bracketed group and go to there. */
-
-    case OP_ALT:
-    do ecode += GET(ecode,1); while (*ecode == OP_ALT);
-    break;
-
-    /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating
-    that it may occur zero times. It may repeat infinitely, or not at all -
-    i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper
-    repeat limits are compiled as a number of copies, with the optional ones
-    preceded by BRAZERO or BRAMINZERO. */
-
-    case OP_BRAZERO:
-      {
-      const uschar *next = ecode+1;
-      if ((rrc = match(eptr, next, offset_top, md, ims, eptrb, match_isgroup))
-           != MATCH_NOMATCH) return rrc;
-      do next += GET(next,1); while (*next == OP_ALT);
-      ecode = next + 1+LINK_SIZE;
-      }
-    break;
-
-    case OP_BRAMINZERO:
-      {
-      const uschar *next = ecode+1;
-      do next += GET(next,1); while (*next == OP_ALT);
-      if ((rrc = match(eptr, next + 1+LINK_SIZE, offset_top, md, ims, eptrb,
-        match_isgroup)) != MATCH_NOMATCH) return rrc;
-      ecode++;
-      }
-    break;
-
-    /* End of a group, repeated or non-repeating. If we are at the end of
-    an assertion "group", stop matching and return MATCH_MATCH, but record the
-    current high water mark for use by positive assertions. Do this also
-    for the "once" (not-backup up) groups. */
-
-    case OP_KET:
-    case OP_KETRMIN:
-    case OP_KETRMAX:
-      {
-      const uschar *prev = ecode - GET(ecode, 1);
-      const uschar *saved_eptr = eptrb->saved_eptr;
-
-      eptrb = eptrb->prev;    /* Back up the stack of bracket start pointers */
-
-      if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT ||
-          *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT ||
-          *prev == OP_ONCE)
-        {
-        md->end_match_ptr = eptr;      /* For ONCE */
-        md->end_offset_top = offset_top;
-        return MATCH_MATCH;
-        }
-
-      /* In all other cases except a conditional group we have to check the
-      group number back at the start and if necessary complete handling an
-      extraction by setting the offsets and bumping the high water mark. */
-
-      if (*prev != OP_COND)
-        {
-        int offset;
-        int number = *prev - OP_BRA;
-
-        /* For extended extraction brackets (large number), we have to fish out
-        the number from a dummy opcode at the start. */
-
-        if (number > EXTRACT_BASIC_MAX) number = GET2(prev, 2+LINK_SIZE);
-        offset = number << 1;
-
-#ifdef DEBUG
-        printf("end bracket %d", number);
-        printf("\n");
-#endif
-
-        /* Test for a numbered group. This includes groups called as a result
-        of recursion. Note that whole-pattern recursion is coded as a recurse
-        into group 0, so it won't be picked up here. Instead, we catch it when
-        the OP_END is reached. */
-
-        if (number > 0)
-          {
-          md->capture_last = number;
-          if (offset >= md->offset_max) md->offset_overflow = TRUE; else
-            {
-            md->offset_vector[offset] =
-              md->offset_vector[md->offset_end - number];
-            md->offset_vector[offset+1] = eptr - md->start_subject;
-            if (offset_top <= offset) offset_top = offset + 2;
-            }
-
-          /* Handle a recursively called group. Restore the offsets
-          appropriately and continue from after the call. */
-
-          if (md->recursive != NULL && md->recursive->group_num == number)
-            {
-            recursion_info *rec = md->recursive;
-            DPRINTF(("Recursion (%d) succeeded - continuing\n", number));
-            md->recursive = rec->prev;
-            md->start_match = rec->save_start;
-            memcpy(md->offset_vector, rec->offset_save,
-              rec->saved_max * sizeof(int));
-            ecode = rec->after_call;
-            ims = original_ims;
-            break;
-            }
-          }
-        }
-
-      /* Reset the value of the ims flags, in case they got changed during
-      the group. */
-
-      ims = original_ims;
-      DPRINTF(("ims reset to %02lx\n", ims));
-
-      /* For a non-repeating ket, just continue at this level. This also
-      happens for a repeating ket if no characters were matched in the group.
-      This is the forcible breaking of infinite loops as implemented in Perl
-      5.005. If there is an options reset, it will get obeyed in the normal
-      course of events. */
-
-      if (*ecode == OP_KET || eptr == saved_eptr)
-        {
-        ecode += 1 + LINK_SIZE;
-        break;
-        }
-
-      /* The repeating kets try the rest of the pattern or restart from the
-      preceding bracket, in the appropriate order. */
-
-      if (*ecode == OP_KETRMIN)
-        {
-        if ((rrc = match(eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb,
-             0)) != MATCH_NOMATCH) return rrc;
-        if ((rrc = match(eptr, prev, offset_top, md, ims, eptrb,
-             match_isgroup)) != MATCH_NOMATCH) return rrc;
-        }
-      else  /* OP_KETRMAX */
-        {
-        if ((rrc = match(eptr, prev, offset_top, md, ims, eptrb,
-             match_isgroup)) != MATCH_NOMATCH) return rrc;
-        if ((rrc = match(eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb,
-             0)) != MATCH_NOMATCH) return rrc;
-        }
-      }
-    return MATCH_NOMATCH;
-
-    /* Start of subject unless notbol, or after internal newline if multiline */
-
-    case OP_CIRC:
-    if (md->notbol && eptr == md->start_subject) return MATCH_NOMATCH;
-    if ((ims & PCRE_MULTILINE) != 0)
-      {
-      if (eptr != md->start_subject && eptr[-1] != NEWLINE)
-        return MATCH_NOMATCH;
-      ecode++;
-      break;
-      }
-    /* ... else fall through */
-
-    /* Start of subject assertion */
-
-    case OP_SOD:
-    if (eptr != md->start_subject) return MATCH_NOMATCH;
-    ecode++;
-    break;
-
-    /* Start of match assertion */
-
-    case OP_SOM:
-    if (eptr != md->start_subject + md->start_offset) return MATCH_NOMATCH;
-    ecode++;
-    break;
-
-    /* Assert before internal newline if multiline, or before a terminating
-    newline unless endonly is set, else end of subject unless noteol is set. */
-
-    case OP_DOLL:
-    if ((ims & PCRE_MULTILINE) != 0)
-      {
-      if (eptr < md->end_subject)
-        { if (*eptr != NEWLINE) return MATCH_NOMATCH; }
-      else
-        { if (md->noteol) return MATCH_NOMATCH; }
-      ecode++;
-      break;
-      }
-    else
-      {
-      if (md->noteol) return MATCH_NOMATCH;
-      if (!md->endonly)
-        {
-        if (eptr < md->end_subject - 1 ||
-           (eptr == md->end_subject - 1 && *eptr != NEWLINE))
-          return MATCH_NOMATCH;
-        ecode++;
-        break;
-        }
-      }
-    /* ... else fall through */
-
-    /* End of subject assertion (\z) */
-
-    case OP_EOD:
-    if (eptr < md->end_subject) return MATCH_NOMATCH;
-    ecode++;
-    break;
-
-    /* End of subject or ending \n assertion (\Z) */
-
-    case OP_EODN:
-    if (eptr < md->end_subject - 1 ||
-       (eptr == md->end_subject - 1 && *eptr != NEWLINE)) return MATCH_NOMATCH;
-    ecode++;
-    break;
-
-    /* Word boundary assertions */
-
-    case OP_NOT_WORD_BOUNDARY:
-    case OP_WORD_BOUNDARY:
-      {
-      BOOL prev_is_word, cur_is_word;
-
-      /* Find out if the previous and current characters are "word" characters.
-      It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to
-      be "non-word" characters. */
-
-#ifdef SUPPORT_UTF8
-      if (md->utf8)
-        {
-        if (eptr == md->start_subject) prev_is_word = FALSE; else
-          {
-          const uschar *lastptr = eptr - 1;
-          while((*lastptr & 0xc0) == 0x80) lastptr--;
-          GETCHAR(c, lastptr);
-          prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
-          }
-        if (eptr >= md->end_subject) cur_is_word = FALSE; else
-          {
-          GETCHAR(c, eptr);
-          cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
-          }
-        }
-      else
-#endif
-
-      /* More streamlined when not in UTF-8 mode */
-
-        {
-        prev_is_word = (eptr != md->start_subject) &&
-          ((md->ctypes[eptr[-1]] & ctype_word) != 0);
-        cur_is_word = (eptr < md->end_subject) &&
-          ((md->ctypes[*eptr] & ctype_word) != 0);
-        }
-
-      /* Now see if the situation is what we want */
-
-      if ((*ecode++ == OP_WORD_BOUNDARY)?
-           cur_is_word == prev_is_word : cur_is_word != prev_is_word)
-        return MATCH_NOMATCH;
-      }
-    break;
-
-    /* Match a single character type; inline for speed */
-
-    case OP_ANY:
-    if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == NEWLINE)
-      return MATCH_NOMATCH;
-    if (eptr++ >= md->end_subject) return MATCH_NOMATCH;
-#ifdef SUPPORT_UTF8
-    if (md->utf8)
-      while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-#endif
-    ecode++;
-    break;
-
-    /* Match a single byte, even in UTF-8 mode. This opcode really does match
-    any byte, even newline, independent of the setting of PCRE_DOTALL. */
-
-    case OP_ANYBYTE:
-    if (eptr++ >= md->end_subject) return MATCH_NOMATCH;
-    ecode++;
-    break;
-
-    case OP_NOT_DIGIT:
-    if (eptr >= md->end_subject) return MATCH_NOMATCH;
-    GETCHARINCTEST(c, eptr);
-    if (
-#ifdef SUPPORT_UTF8
-       c < 256 &&
-#endif
-       (md->ctypes[c] & ctype_digit) != 0
-       )
-      return MATCH_NOMATCH;
-    ecode++;
-    break;
-
-    case OP_DIGIT:
-    if (eptr >= md->end_subject) return MATCH_NOMATCH;
-    GETCHARINCTEST(c, eptr);
-    if (
-#ifdef SUPPORT_UTF8
-       c >= 256 ||
-#endif
-       (md->ctypes[c] & ctype_digit) == 0
-       )
-      return MATCH_NOMATCH;
-    ecode++;
-    break;
-
-    case OP_NOT_WHITESPACE:
-    if (eptr >= md->end_subject) return MATCH_NOMATCH;
-    GETCHARINCTEST(c, eptr);
-    if (
-#ifdef SUPPORT_UTF8
-       c < 256 &&
-#endif
-       (md->ctypes[c] & ctype_space) != 0
-       )
-      return MATCH_NOMATCH;
-    ecode++;
-    break;
-
-    case OP_WHITESPACE:
-    if (eptr >= md->end_subject) return MATCH_NOMATCH;
-    GETCHARINCTEST(c, eptr);
-    if (
-#ifdef SUPPORT_UTF8
-       c >= 256 ||
-#endif
-       (md->ctypes[c] & ctype_space) == 0
-       )
-      return MATCH_NOMATCH;
-    ecode++;
-    break;
-
-    case OP_NOT_WORDCHAR:
-    if (eptr >= md->end_subject) return MATCH_NOMATCH;
-    GETCHARINCTEST(c, eptr);
-    if (
-#ifdef SUPPORT_UTF8
-       c < 256 &&
-#endif
-       (md->ctypes[c] & ctype_word) != 0
-       )
-      return MATCH_NOMATCH;
-    ecode++;
-    break;
-
-    case OP_WORDCHAR:
-    if (eptr >= md->end_subject) return MATCH_NOMATCH;
-    GETCHARINCTEST(c, eptr);
-    if (
-#ifdef SUPPORT_UTF8
-       c >= 256 ||
-#endif
-       (md->ctypes[c] & ctype_word) == 0
-       )
-      return MATCH_NOMATCH;
-    ecode++;
-    break;
-
-    /* Match a back reference, possibly repeatedly. Look past the end of the
-    item to see if there is repeat information following. The code is similar
-    to that for character classes, but repeated for efficiency. Then obey
-    similar code to character type repeats - written out again for speed.
-    However, if the referenced string is the empty string, always treat
-    it as matched, any number of times (otherwise there could be infinite
-    loops). */
-
-    case OP_REF:
-      {
-      int length;
-      int offset = GET2(ecode, 1) << 1;               /* Doubled ref number */
-      ecode += 3;                                     /* Advance past item */
-
-      /* If the reference is unset, set the length to be longer than the amount
-      of subject left; this ensures that every attempt at a match fails. We
-      can't just fail here, because of the possibility of quantifiers with zero
-      minima. */
-
-      length = (offset >= offset_top || md->offset_vector[offset] < 0)?
-        md->end_subject - eptr + 1 :
-        md->offset_vector[offset+1] - md->offset_vector[offset];
-
-      /* Set up for repetition, or handle the non-repeated case */
-
-      switch (*ecode)
-        {
-        case OP_CRSTAR:
-        case OP_CRMINSTAR:
-        case OP_CRPLUS:
-        case OP_CRMINPLUS:
-        case OP_CRQUERY:
-        case OP_CRMINQUERY:
-        c = *ecode++ - OP_CRSTAR;
-        minimize = (c & 1) != 0;
-        min = rep_min[c];                 /* Pick up values from tables; */
-        max = rep_max[c];                 /* zero for max => infinity */
-        if (max == 0) max = INT_MAX;
-        break;
-
-        case OP_CRRANGE:
-        case OP_CRMINRANGE:
-        minimize = (*ecode == OP_CRMINRANGE);
-        min = GET2(ecode, 1);
-        max = GET2(ecode, 3);
-        if (max == 0) max = INT_MAX;
-        ecode += 5;
-        break;
-
-        default:               /* No repeat follows */
-        if (!match_ref(offset, eptr, length, md, ims)) return MATCH_NOMATCH;
-        eptr += length;
-        continue;              /* With the main loop */
-        }
-
-      /* If the length of the reference is zero, just continue with the
-      main loop. */
-
-      if (length == 0) continue;
-
-      /* First, ensure the minimum number of matches are present. We get back
-      the length of the reference string explicitly rather than passing the
-      address of eptr, so that eptr can be a register variable. */
-
-      for (i = 1; i <= min; i++)
-        {
-        if (!match_ref(offset, eptr, length, md, ims)) return MATCH_NOMATCH;
-        eptr += length;
-        }
-
-      /* If min = max, continue at the same level without recursion.
-      They are not both allowed to be zero. */
-
-      if (min == max) continue;
-
-      /* If minimizing, keep trying and advancing the pointer */
-
-      if (minimize)
-        {
-        for (i = min;; i++)
-          {
-          if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-               MATCH_NOMATCH) return rrc;
-          if (i >= max || !match_ref(offset, eptr, length, md, ims))
-            return MATCH_NOMATCH;
-          eptr += length;
-          }
-        /* Control never gets here */
-        }
-
-      /* If maximizing, find the longest string and work backwards */
-
-      else
-        {
-        const uschar *pp = eptr;
-        for (i = min; i < max; i++)
-          {
-          if (!match_ref(offset, eptr, length, md, ims)) break;
-          eptr += length;
-          }
-        while (eptr >= pp)
-          {
-          if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-               MATCH_NOMATCH) return rrc;
-          eptr -= length;
-          }
-        return MATCH_NOMATCH;
-        }
-      }
-    /* Control never gets here */
-
-
-
-    /* Match a bit-mapped character class, possibly repeatedly. This op code is
-    used when all the characters in the class have values in the range 0-255.
-    The only difference between OP_CLASS and OP_NCLASS occurs when a data
-    character outside the range is encountered.
-
-    First, look past the end of the item to see if there is repeat information
-    following. Then obey similar code to character type repeats - written out
-    again for speed. */
-
-    case OP_NCLASS:
-    case OP_CLASS:
-      {
-      const uschar *data = ecode + 1;  /* Save for matching */
-      ecode += 33;                     /* Advance past the item */
-
-      switch (*ecode)
-        {
-        case OP_CRSTAR:
-        case OP_CRMINSTAR:
-        case OP_CRPLUS:
-        case OP_CRMINPLUS:
-        case OP_CRQUERY:
-        case OP_CRMINQUERY:
-        c = *ecode++ - OP_CRSTAR;
-        minimize = (c & 1) != 0;
-        min = rep_min[c];                 /* Pick up values from tables; */
-        max = rep_max[c];                 /* zero for max => infinity */
-        if (max == 0) max = INT_MAX;
-        break;
-
-        case OP_CRRANGE:
-        case OP_CRMINRANGE:
-        minimize = (*ecode == OP_CRMINRANGE);
-        min = GET2(ecode, 1);
-        max = GET2(ecode, 3);
-        if (max == 0) max = INT_MAX;
-        ecode += 5;
-        break;
-
-        default:               /* No repeat follows */
-        min = max = 1;
-        break;
-        }
-
-      /* First, ensure the minimum number of matches are present. */
-
-#ifdef SUPPORT_UTF8
-      /* UTF-8 mode */
-      if (md->utf8)
-        {
-        for (i = 1; i <= min; i++)
-          {
-          if (eptr >= md->end_subject) return MATCH_NOMATCH;
-          GETCHARINC(c, eptr);
-          if (c > 255)
-            {
-            if (op == OP_CLASS) return MATCH_NOMATCH;
-            }
-          else
-            {
-            if ((data[c/8] & (1 << (c&7))) == 0) return MATCH_NOMATCH;
-            }
-          }
-        }
-      else
-#endif
-      /* Not UTF-8 mode */
-        {
-        for (i = 1; i <= min; i++)
-          {
-          if (eptr >= md->end_subject) return MATCH_NOMATCH;
-          c = *eptr++;
-          if ((data[c/8] & (1 << (c&7))) == 0) return MATCH_NOMATCH;
-          }
-        }
-
-      /* If max == min we can continue with the main loop without the
-      need to recurse. */
-
-      if (min == max) continue;
-
-      /* If minimizing, keep testing the rest of the expression and advancing
-      the pointer while it matches the class. */
-
-      if (minimize)
-        {
-#ifdef SUPPORT_UTF8
-        /* UTF-8 mode */
-        if (md->utf8)
-          {
-          for (i = min;; i++)
-            {
-            if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                 MATCH_NOMATCH) return rrc;
-            if (i >= max || eptr >= md->end_subject) return MATCH_NOMATCH;
-            GETCHARINC(c, eptr);
-            if (c > 255)
-              {
-              if (op == OP_CLASS) return MATCH_NOMATCH;
-              }
-            else
-              {
-              if ((data[c/8] & (1 << (c&7))) == 0) return MATCH_NOMATCH;
-              }
-            }
-          }
-        else
-#endif
-        /* Not UTF-8 mode */
-          {
-          for (i = min;; i++)
-            {
-            if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                 MATCH_NOMATCH) return rrc;
-            if (i >= max || eptr >= md->end_subject) return MATCH_NOMATCH;
-            c = *eptr++;
-            if ((data[c/8] & (1 << (c&7))) == 0) return MATCH_NOMATCH;
-            }
-          }
-        /* Control never gets here */
-        }
-
-      /* If maximizing, find the longest possible run, then work backwards. */
-
-      else
-        {
-        const uschar *pp = eptr;
-
-#ifdef SUPPORT_UTF8
-        /* UTF-8 mode */
-        if (md->utf8)
-          {
-          for (i = min; i < max; i++)
-            {
-            int len = 1;
-            if (eptr >= md->end_subject) break;
-            GETCHARLEN(c, eptr, len);
-            if (c > 255)
-              {
-              if (op == OP_CLASS) break;
-              }
-            else
-              {
-              if ((data[c/8] & (1 << (c&7))) == 0) break;
-              }
-            eptr += len;
-            }
-          for (;;)
-            {
-            if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                 MATCH_NOMATCH) return rrc;
-            if (eptr-- == pp) break;        /* Stop if tried at original pos */
-            BACKCHAR(eptr);
-            }
-          }
-        else
-#endif
-          /* Not UTF-8 mode */
-          {
-          for (i = min; i < max; i++)
-            {
-            if (eptr >= md->end_subject) break;
-            c = *eptr;
-            if ((data[c/8] & (1 << (c&7))) == 0) break;
-            eptr++;
-            }
-          while (eptr >= pp)
-            {
-            if ((rrc = match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) !=
-                 MATCH_NOMATCH) return rrc;
-            }
-          }
-
-        return MATCH_NOMATCH;
-        }
-      }
-    /* Control never gets here */
-
-
-    /* Match an extended character class. This opcode is encountered only
-    in UTF-8 mode, because that's the only time it is compiled. */
-
-#ifdef SUPPORT_UTF8
-    case OP_XCLASS:
-      {
-      const uschar *data = ecode + 1 + LINK_SIZE;  /* Save for matching */
-      ecode += GET(ecode, 1);                      /* Advance past the item */
-
-      switch (*ecode)
-        {
-        case OP_CRSTAR:
-        case OP_CRMINSTAR:
-        case OP_CRPLUS:
-        case OP_CRMINPLUS:
-        case OP_CRQUERY:
-        case OP_CRMINQUERY:
-        c = *ecode++ - OP_CRSTAR;
-        minimize = (c & 1) != 0;
-        min = rep_min[c];                 /* Pick up values from tables; */
-        max = rep_max[c];                 /* zero for max => infinity */
-        if (max == 0) max = INT_MAX;
-        break;
-
-        case OP_CRRANGE:
-        case OP_CRMINRANGE:
-        minimize = (*ecode == OP_CRMINRANGE);
-        min = GET2(ecode, 1);
-        max = GET2(ecode, 3);
-        if (max == 0) max = INT_MAX;
-        ecode += 5;
-        break;
-
-        default:               /* No repeat follows */
-        min = max = 1;
-        break;
-        }
-
-      /* First, ensure the minimum number of matches are present. */
-
-      for (i = 1; i <= min; i++)
-        {
-        if (eptr >= md->end_subject) return MATCH_NOMATCH;
-        GETCHARINC(c, eptr);
-        if (!match_xclass(c, data)) return MATCH_NOMATCH;
-        }
-
-      /* If max == min we can continue with the main loop without the
-      need to recurse. */
-
-      if (min == max) continue;
-
-      /* If minimizing, keep testing the rest of the expression and advancing
-      the pointer while it matches the class. */
-
-      if (minimize)
-        {
-        for (i = min;; i++)
-          {
-          if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-               MATCH_NOMATCH) return rrc;
-          if (i >= max || eptr >= md->end_subject) return MATCH_NOMATCH;
-          GETCHARINC(c, eptr);
-          if (!match_xclass(c, data)) return MATCH_NOMATCH;
-          }
-        /* Control never gets here */
-        }
-
-      /* If maximizing, find the longest possible run, then work backwards. */
-
-      else
-        {
-        const uschar *pp = eptr;
-        for (i = min; i < max; i++)
-          {
-          int len = 1;
-          if (eptr >= md->end_subject) break;
-          GETCHARLEN(c, eptr, len);
-          if (!match_xclass(c, data)) break;
-          eptr += len;
-          }
-        for(;;)
-          {
-          if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-               MATCH_NOMATCH) return rrc;
-          if (eptr-- == pp) break;        /* Stop if tried at original pos */
-          BACKCHAR(eptr)
-          }
-        return MATCH_NOMATCH;
-        }
-
-      /* Control never gets here */
-      }
-#endif    /* End of XCLASS */
-
-    /* Match a run of characters */
-
-    case OP_CHARS:
-      {
-      register int length = ecode[1];
-      ecode += 2;
-
-#ifdef DEBUG    /* Sigh. Some compilers never learn. */
-      if (eptr >= md->end_subject)
-        printf("matching subject <null> against pattern ");
-      else
-        {
-        printf("matching subject ");
-        pchars(eptr, length, TRUE, md);
-        printf(" against pattern ");
-        }
-      pchars(ecode, length, FALSE, md);
-      printf("\n");
-#endif
-
-      if (length > md->end_subject - eptr) return MATCH_NOMATCH;
-      if ((ims & PCRE_CASELESS) != 0)
-        {
-        while (length-- > 0)
-          if (md->lcc[*ecode++] != md->lcc[*eptr++])
-            return MATCH_NOMATCH;
-        }
-      else
-        {
-        while (length-- > 0) if (*ecode++ != *eptr++) return MATCH_NOMATCH;
-        }
-      }
-    break;
-
-    /* Match a single character repeatedly; different opcodes share code. */
-
-    case OP_EXACT:
-    min = max = GET2(ecode, 1);
-    ecode += 3;
-    goto REPEATCHAR;
-
-    case OP_UPTO:
-    case OP_MINUPTO:
-    min = 0;
-    max = GET2(ecode, 1);
-    minimize = *ecode == OP_MINUPTO;
-    ecode += 3;
-    goto REPEATCHAR;
-
-    case OP_STAR:
-    case OP_MINSTAR:
-    case OP_PLUS:
-    case OP_MINPLUS:
-    case OP_QUERY:
-    case OP_MINQUERY:
-    c = *ecode++ - OP_STAR;
-    minimize = (c & 1) != 0;
-    min = rep_min[c];                 /* Pick up values from tables; */
-    max = rep_max[c];                 /* zero for max => infinity */
-    if (max == 0) max = INT_MAX;
-
-    /* Common code for all repeated single-character matches. We can give
-    up quickly if there are fewer than the minimum number of characters left in
-    the subject. */
-
-    REPEATCHAR:
-#ifdef SUPPORT_UTF8
-    if (md->utf8)
-      {
-      int len = 1;
-      const uschar *charptr = ecode;
-      GETCHARLEN(c, ecode, len);
-      if (min * len > md->end_subject - eptr) return MATCH_NOMATCH;
-      ecode += len;
-
-      /* Handle multibyte character matching specially here. There is no
-      support for any kind of casing for multibyte characters. */
-
-      if (len > 1)
-        {
-        for (i = 1; i <= min; i++)
-          {
-          if (memcmp(eptr, charptr, len) != 0) return MATCH_NOMATCH;
-          eptr += len;
-          }
-
-        if (min == max) continue;
-
-        if (minimize)
-          {
-          for (i = min;; i++)
-            {
-            if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                 MATCH_NOMATCH) return rrc;
-            if (i >= max ||
-                eptr >= md->end_subject ||
-                memcmp(eptr, charptr, len) != 0)
-              return MATCH_NOMATCH;
-            eptr += len;
-            }
-          /* Control never gets here */
-          }
-        else
-          {
-          const uschar *pp = eptr;
-          for (i = min; i < max; i++)
-            {
-            if (eptr > md->end_subject - len ||
-                memcmp(eptr, charptr, len) != 0)
-              break;
-            eptr += len;
-            }
-          while (eptr >= pp)
-           {
-           if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                MATCH_NOMATCH) return rrc;
-           eptr -= len;
-           }
-          return MATCH_NOMATCH;
-          }
-        /* Control never gets here */
-        }
-
-      /* If the length of a UTF-8 character is 1, we fall through here, and
-      obey the code as for non-UTF-8 characters below, though in this case the
-      value of c will always be < 128. */
-      }
-    else
-#endif
-
-    /* When not in UTF-8 mode, load a single-byte character. */
-      {
-      if (min > md->end_subject - eptr) return MATCH_NOMATCH;
-      c = *ecode++;
-      }
-
-    /* The value of c at this point is always less than 256, though we may or
-    may not be in UTF-8 mode. The code is duplicated for the caseless and
-    caseful cases, for speed, since matching characters is likely to be quite
-    common. First, ensure the minimum number of matches are present. If min =
-    max, continue at the same level without recursing. Otherwise, if
-    minimizing, keep trying the rest of the expression and advancing one
-    matching character if failing, up to the maximum. Alternatively, if
-    maximizing, find the maximum number of characters and work backwards. */
-
-    DPRINTF(("matching %c{%d,%d} against subject %.*s\n", c, min, max,
-      max, eptr));
-
-    if ((ims & PCRE_CASELESS) != 0)
-      {
-      c = md->lcc[c];
-      for (i = 1; i <= min; i++)
-        if (c != md->lcc[*eptr++]) return MATCH_NOMATCH;
-      if (min == max) continue;
-      if (minimize)
-        {
-        for (i = min;; i++)
-          {
-          if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-               MATCH_NOMATCH) return rrc;
-          if (i >= max || eptr >= md->end_subject ||
-              c != md->lcc[*eptr++])
-            return MATCH_NOMATCH;
-          }
-        /* Control never gets here */
-        }
-      else
-        {
-        const uschar *pp = eptr;
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject || c != md->lcc[*eptr]) break;
-          eptr++;
-          }
-        while (eptr >= pp)
-          if ((rrc = match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) !=
-               MATCH_NOMATCH) return rrc;
-        return MATCH_NOMATCH;
-        }
-      /* Control never gets here */
-      }
-
-    /* Caseful comparisons (includes all multi-byte characters) */
-
-    else
-      {
-      for (i = 1; i <= min; i++) if (c != *eptr++) return MATCH_NOMATCH;
-      if (min == max) continue;
-      if (minimize)
-        {
-        for (i = min;; i++)
-          {
-          if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-               MATCH_NOMATCH) return rrc;
-          if (i >= max || eptr >= md->end_subject || c != *eptr++)
-            return MATCH_NOMATCH;
-          }
-        /* Control never gets here */
-        }
-      else
-        {
-        const uschar *pp = eptr;
-        for (i = min; i < max; i++)
-          {
-          if (eptr >= md->end_subject || c != *eptr) break;
-          eptr++;
-          }
-        while (eptr >= pp)
-         if ((rrc = match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) !=
-              MATCH_NOMATCH) return rrc;
-        return MATCH_NOMATCH;
-        }
-      }
-    /* Control never gets here */
-
-    /* Match a negated single one-byte character. The character we are
-    checking can be multibyte. */
-
-    case OP_NOT:
-    if (eptr >= md->end_subject) return MATCH_NOMATCH;
-    ecode++;
-    GETCHARINCTEST(c, eptr);
-    if ((ims & PCRE_CASELESS) != 0)
-      {
-#ifdef SUPPORT_UTF8
-      if (c < 256)
-#endif
-      c = md->lcc[c];
-      if (md->lcc[*ecode++] == c) return MATCH_NOMATCH;
-      }
-    else
-      {
-      if (*ecode++ == c) return MATCH_NOMATCH;
-      }
-    break;
-
-    /* Match a negated single one-byte character repeatedly. This is almost a
-    repeat of the code for a repeated single character, but I haven't found a
-    nice way of commoning these up that doesn't require a test of the
-    positive/negative option for each character match. Maybe that wouldn't add
-    very much to the time taken, but character matching *is* what this is all
-    about... */
-
-    case OP_NOTEXACT:
-    min = max = GET2(ecode, 1);
-    ecode += 3;
-    goto REPEATNOTCHAR;
-
-    case OP_NOTUPTO:
-    case OP_NOTMINUPTO:
-    min = 0;
-    max = GET2(ecode, 1);
-    minimize = *ecode == OP_NOTMINUPTO;
-    ecode += 3;
-    goto REPEATNOTCHAR;
-
-    case OP_NOTSTAR:
-    case OP_NOTMINSTAR:
-    case OP_NOTPLUS:
-    case OP_NOTMINPLUS:
-    case OP_NOTQUERY:
-    case OP_NOTMINQUERY:
-    c = *ecode++ - OP_NOTSTAR;
-    minimize = (c & 1) != 0;
-    min = rep_min[c];                 /* Pick up values from tables; */
-    max = rep_max[c];                 /* zero for max => infinity */
-    if (max == 0) max = INT_MAX;
-
-    /* Common code for all repeated single-character (less than 255) matches.
-    We can give up quickly if there are fewer than the minimum number of
-    characters left in the subject. */
-
-    REPEATNOTCHAR:
-    if (min > md->end_subject - eptr) return MATCH_NOMATCH;
-    c = *ecode++;
-
-    /* The code is duplicated for the caseless and caseful cases, for speed,
-    since matching characters is likely to be quite common. First, ensure the
-    minimum number of matches are present. If min = max, continue at the same
-    level without recursing. Otherwise, if minimizing, keep trying the rest of
-    the expression and advancing one matching character if failing, up to the
-    maximum. Alternatively, if maximizing, find the maximum number of
-    characters and work backwards. */
-
-    DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", c, min, max,
-      max, eptr));
-
-    if ((ims & PCRE_CASELESS) != 0)
-      {
-      c = md->lcc[c];
-
-#ifdef SUPPORT_UTF8
-      /* UTF-8 mode */
-      if (md->utf8)
-        {
-        register int d;
-        for (i = 1; i <= min; i++)
-          {
-          GETCHARINC(d, eptr);
-          if (d < 256) d = md->lcc[d];
-          if (c == d) return MATCH_NOMATCH;
-          }
-        }
-      else
-#endif
-
-      /* Not UTF-8 mode */
-        {
-        for (i = 1; i <= min; i++)
-          if (c == md->lcc[*eptr++]) return MATCH_NOMATCH;
-        }
-
-      if (min == max) continue;
-
-      if (minimize)
-        {
-#ifdef SUPPORT_UTF8
-        /* UTF-8 mode */
-        if (md->utf8)
-          {
-          register int d;
-          for (i = min;; i++)
-            {
-            if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                 MATCH_NOMATCH) return rrc;
-            GETCHARINC(d, eptr);
-            if (d < 256) d = md->lcc[d];
-            if (i >= max || eptr >= md->end_subject || c == d)
-              return MATCH_NOMATCH;
-            }
-          }
-        else
-#endif
-        /* Not UTF-8 mode */
-          {
-          for (i = min;; i++)
-            {
-            if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                 MATCH_NOMATCH) return rrc;
-            if (i >= max || eptr >= md->end_subject || c == md->lcc[*eptr++])
-              return MATCH_NOMATCH;
-            }
-          }
-        /* Control never gets here */
-        }
-
-      /* Maximize case */
-
-      else
-        {
-        const uschar *pp = eptr;
-
-#ifdef SUPPORT_UTF8
-        /* UTF-8 mode */
-        if (md->utf8)
-          {
-          register int d;
-          for (i = min; i < max; i++)
-            {
-            int len = 1;
-            if (eptr >= md->end_subject) break;
-            GETCHARLEN(d, eptr, len);
-            if (d < 256) d = md->lcc[d];
-            if (c == d) break;
-            eptr += len;
-            }
-          for(;;)
-            {
-            if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                 MATCH_NOMATCH) return rrc;
-            if (eptr-- == pp) break;        /* Stop if tried at original pos */
-            BACKCHAR(eptr);
-            }
-          }
-        else
-#endif
-        /* Not UTF-8 mode */
-          {
-          for (i = min; i < max; i++)
-            {
-            if (eptr >= md->end_subject || c == md->lcc[*eptr]) break;
-            eptr++;
-            }
-          while (eptr >= pp)
-            {
-            if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                 MATCH_NOMATCH) return rrc;
-            eptr--;
-            }
-          }
-
-        return MATCH_NOMATCH;
-        }
-      /* Control never gets here */
-      }
-
-    /* Caseful comparisons */
-
-    else
-      {
-#ifdef SUPPORT_UTF8
-      /* UTF-8 mode */
-      if (md->utf8)
-        {
-        register int d;
-        for (i = 1; i <= min; i++)
-          {
-          GETCHARINC(d, eptr);
-          if (c == d) return MATCH_NOMATCH;
-          }
-        }
-      else
-#endif
-      /* Not UTF-8 mode */
-        {
-        for (i = 1; i <= min; i++)
-          if (c == *eptr++) return MATCH_NOMATCH;
-        }
-
-      if (min == max) continue;
-
-      if (minimize)
-        {
-#ifdef SUPPORT_UTF8
-        /* UTF-8 mode */
-        if (md->utf8)
-          {
-          register int d;
-          for (i = min;; i++)
-            {
-            if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                 MATCH_NOMATCH) return rrc;
-            GETCHARINC(d, eptr);
-            if (i >= max || eptr >= md->end_subject || c == d)
-              return MATCH_NOMATCH;
-            }
-          }
-        else
-#endif
-        /* Not UTF-8 mode */
-          {
-          for (i = min;; i++)
-            {
-            if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                 MATCH_NOMATCH) return rrc;
-            if (i >= max || eptr >= md->end_subject || c == *eptr++)
-              return MATCH_NOMATCH;
-            }
-          }
-        /* Control never gets here */
-        }
-
-      /* Maximize case */
-
-      else
-        {
-        const uschar *pp = eptr;
-
-#ifdef SUPPORT_UTF8
-        /* UTF-8 mode */
-        if (md->utf8)
-          {
-          register int d;
-          for (i = min; i < max; i++)
-            {
-            int len = 1;
-            if (eptr >= md->end_subject) break;
-            GETCHARLEN(d, eptr, len);
-            if (c == d) break;
-            eptr += len;
-            }
-          for(;;)
-            {
-            if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                MATCH_NOMATCH) return rrc;
-            if (eptr-- == pp) break;        /* Stop if tried at original pos */
-            BACKCHAR(eptr);
-            }
-          }
-        else
-#endif
-        /* Not UTF-8 mode */
-          {
-          for (i = min; i < max; i++)
-            {
-            if (eptr >= md->end_subject || c == *eptr) break;
-            eptr++;
-            }
-          while (eptr >= pp)
-            {
-            if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-                MATCH_NOMATCH) return rrc;
-            eptr--;
-            }
-          }
-
-        return MATCH_NOMATCH;
-        }
-      }
-    /* Control never gets here */
-
-    /* Match a single character type repeatedly; several different opcodes
-    share code. This is very similar to the code for single characters, but we
-    repeat it in the interests of efficiency. */
-
-    case OP_TYPEEXACT:
-    min = max = GET2(ecode, 1);
-    minimize = TRUE;
-    ecode += 3;
-    goto REPEATTYPE;
-
-    case OP_TYPEUPTO:
-    case OP_TYPEMINUPTO:
-    min = 0;
-    max = GET2(ecode, 1);
-    minimize = *ecode == OP_TYPEMINUPTO;
-    ecode += 3;
-    goto REPEATTYPE;
-
-    case OP_TYPESTAR:
-    case OP_TYPEMINSTAR:
-    case OP_TYPEPLUS:
-    case OP_TYPEMINPLUS:
-    case OP_TYPEQUERY:
-    case OP_TYPEMINQUERY:
-    c = *ecode++ - OP_TYPESTAR;
-    minimize = (c & 1) != 0;
-    min = rep_min[c];                 /* Pick up values from tables; */
-    max = rep_max[c];                 /* zero for max => infinity */
-    if (max == 0) max = INT_MAX;
-
-    /* Common code for all repeated single character type matches. Note that
-    in UTF-8 mode, '.' matches a character of any length, but for the other
-    character types, the valid characters are all one-byte long. */
-
-    REPEATTYPE:
-    ctype = *ecode++;      /* Code for the character type */
-
-    /* First, ensure the minimum number of matches are present. Use inline
-    code for maximizing the speed, and do the type test once at the start
-    (i.e. keep it out of the loop). Also we can test that there are at least
-    the minimum number of bytes before we start. This isn't as effective in
-    UTF-8 mode, but it does no harm. Separate the UTF-8 code completely as that
-    is tidier. */
-
-    if (min > md->end_subject - eptr) return MATCH_NOMATCH;
-    if (min > 0)
-      {
-#ifdef SUPPORT_UTF8
-      if (md->utf8) switch(ctype)
-        {
-        case OP_ANY:
-        for (i = 1; i <= min; i++)
-          {
-          if (eptr >= md->end_subject ||
-             (*eptr++ == NEWLINE && (ims & PCRE_DOTALL) == 0))
-            return MATCH_NOMATCH;
-          while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-          }
-        break;
-
-        case OP_ANYBYTE:
-        eptr += min;
-        break;
-
-        case OP_NOT_DIGIT:
-        for (i = 1; i <= min; i++)
-          {
-          if (eptr >= md->end_subject) return MATCH_NOMATCH;
-          GETCHARINC(c, eptr);
-          if (c < 256 && (md->ctypes[c] & ctype_digit) != 0)
-            return MATCH_NOMATCH;
-          }
-        break;
-
-        case OP_DIGIT:
-        for (i = 1; i <= min; i++)
-          {
-          if (eptr >= md->end_subject ||
-             *eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0)
-            return MATCH_NOMATCH;
-          /* No need to skip more bytes - we know it's a 1-byte character */
-          }
-        break;
-
-        case OP_NOT_WHITESPACE:
-        for (i = 1; i <= min; i++)
-          {
-          if (eptr >= md->end_subject ||
-             (*eptr < 128 && (md->ctypes[*eptr++] & ctype_space) != 0))
-            return MATCH_NOMATCH;
-          while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-          }
-        break;
-
-        case OP_WHITESPACE:
-        for (i = 1; i <= min; i++)
-          {
-          if (eptr >= md->end_subject ||
-             *eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0)
-            return MATCH_NOMATCH;
-          /* No need to skip more bytes - we know it's a 1-byte character */
-          }
-        break;
-
-        case OP_NOT_WORDCHAR:
-        for (i = 1; i <= min; i++)
-          {
-          if (eptr >= md->end_subject ||
-             (*eptr < 128 && (md->ctypes[*eptr++] & ctype_word) != 0))
-            return MATCH_NOMATCH;
-          while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-          }
-        break;
-
-        case OP_WORDCHAR:
-        for (i = 1; i <= min; i++)
-          {
-          if (eptr >= md->end_subject ||
-             *eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0)
-            return MATCH_NOMATCH;
-          /* No need to skip more bytes - we know it's a 1-byte character */
-          }
-        break;
-        }
-      else
-#endif
-
-      /* Code for the non-UTF-8 case for minimum matching */
-
-      switch(ctype)
-        {
-        case OP_ANY:
-        if ((ims & PCRE_DOTALL) == 0)
-          {
-          for (i = 1; i <= min; i++)
-            if (*eptr++ == NEWLINE) return MATCH_NOMATCH;
-          }
-        else eptr += min;
-        break;
-
-        case OP_ANYBYTE:
-        eptr += min;
-        break;
-
-        case OP_NOT_DIGIT:
-        for (i = 1; i <= min; i++)
-          if ((md->ctypes[*eptr++] & ctype_digit) != 0) return MATCH_NOMATCH;
-        break;
-
-        case OP_DIGIT:
-        for (i = 1; i <= min; i++)
-          if ((md->ctypes[*eptr++] & ctype_digit) == 0) return MATCH_NOMATCH;
-        break;
-
-        case OP_NOT_WHITESPACE:
-        for (i = 1; i <= min; i++)
-          if ((md->ctypes[*eptr++] & ctype_space) != 0) return MATCH_NOMATCH;
-        break;
-
-        case OP_WHITESPACE:
-        for (i = 1; i <= min; i++)
-          if ((md->ctypes[*eptr++] & ctype_space) == 0) return MATCH_NOMATCH;
-        break;
-
-        case OP_NOT_WORDCHAR:
-        for (i = 1; i <= min; i++)
-          if ((md->ctypes[*eptr++] & ctype_word) != 0)
-            return MATCH_NOMATCH;
-        break;
-
-        case OP_WORDCHAR:
-        for (i = 1; i <= min; i++)
-          if ((md->ctypes[*eptr++] & ctype_word) == 0)
-            return MATCH_NOMATCH;
-        break;
-        }
-      }
-
-    /* If min = max, continue at the same level without recursing */
-
-    if (min == max) continue;
-
-    /* If minimizing, we have to test the rest of the pattern before each
-    subsequent match. Again, separate the UTF-8 case for speed. */
-
-    if (minimize)
-      {
-#ifdef SUPPORT_UTF8
-      /* UTF-8 mode */
-      if (md->utf8)
-        {
-        for (i = min;; i++)
-          {
-          if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-               MATCH_NOMATCH) return rrc;
-          if (i >= max || eptr >= md->end_subject) return MATCH_NOMATCH;
-
-          GETCHARINC(c, eptr);
-          switch(ctype)
-            {
-            case OP_ANY:
-            if ((ims & PCRE_DOTALL) == 0 && c == NEWLINE) return MATCH_NOMATCH;
-            break;
-
-            case OP_ANYBYTE:
-            break;
-
-            case OP_NOT_DIGIT:
-            if (c < 256 && (md->ctypes[c] & ctype_digit) != 0)
-              return MATCH_NOMATCH;
-            break;
-
-            case OP_DIGIT:
-            if (c >= 256 || (md->ctypes[c] & ctype_digit) == 0)
-              return MATCH_NOMATCH;
-            break;
-
-            case OP_NOT_WHITESPACE:
-            if (c < 256 && (md->ctypes[c] & ctype_space) != 0)
-              return MATCH_NOMATCH;
-            break;
-
-            case OP_WHITESPACE:
-            if  (c >= 256 || (md->ctypes[c] & ctype_space) == 0)
-              return MATCH_NOMATCH;
-            break;
-
-            case OP_NOT_WORDCHAR:
-            if (c < 256 && (md->ctypes[c] & ctype_word) != 0)
-              return MATCH_NOMATCH;
-            break;
-
-            case OP_WORDCHAR:
-            if (c >= 256 && (md->ctypes[c] & ctype_word) == 0)
-              return MATCH_NOMATCH;
-            break;
-            }
-          }
-        }
-      else
-#endif
-      /* Not UTF-8 mode */
-        {
-        for (i = min;; i++)
-          {
-          if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-               MATCH_NOMATCH) return rrc;
-          if (i >= max || eptr >= md->end_subject) return MATCH_NOMATCH;
-          c = *eptr++;
-          switch(ctype)
-            {
-            case OP_ANY:
-            if ((ims & PCRE_DOTALL) == 0 && c == NEWLINE) return MATCH_NOMATCH;
-            break;
-
-            case OP_ANYBYTE:
-            break;
-
-            case OP_NOT_DIGIT:
-            if ((md->ctypes[c] & ctype_digit) != 0) return MATCH_NOMATCH;
-            break;
-
-            case OP_DIGIT:
-            if ((md->ctypes[c] & ctype_digit) == 0) return MATCH_NOMATCH;
-            break;
-
-            case OP_NOT_WHITESPACE:
-            if ((md->ctypes[c] & ctype_space) != 0) return MATCH_NOMATCH;
-            break;
-
-            case OP_WHITESPACE:
-            if  ((md->ctypes[c] & ctype_space) == 0) return MATCH_NOMATCH;
-            break;
-
-            case OP_NOT_WORDCHAR:
-            if ((md->ctypes[c] & ctype_word) != 0) return MATCH_NOMATCH;
-            break;
-
-            case OP_WORDCHAR:
-            if ((md->ctypes[c] & ctype_word) == 0) return MATCH_NOMATCH;
-            break;
-            }
-          }
-        }
-      /* Control never gets here */
-      }
-
-    /* If maximizing it is worth using inline code for speed, doing the type
-    test once at the start (i.e. keep it out of the loop). Again, keep the
-    UTF-8 stuff separate. */
-
-    else
-      {
-      const uschar *pp = eptr;
-
-#ifdef SUPPORT_UTF8
-      /* UTF-8 mode */
-
-      if (md->utf8)
-        {
-        switch(ctype)
-          {
-          case OP_ANY:
-
-          /* Special code is required for UTF8, but when the maximum is unlimited
-          we don't need it, so we repeat the non-UTF8 code. This is probably
-          worth it, because .* is quite a common idiom. */
-
-          if (max < INT_MAX)
-            {
-            if ((ims & PCRE_DOTALL) == 0)
-              {
-              for (i = min; i < max; i++)
-                {
-                if (eptr >= md->end_subject || *eptr == NEWLINE) break;
-                eptr++;
-                while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-                }
-              }
-            else
-              {
-              for (i = min; i < max; i++)
-                {
-                eptr++;
-                while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
-                }
-              }
-            }
-
-          /* Handle unlimited UTF-8 repeat */
-
-          else
-            {
-            if ((ims & PCRE_DOTALL) == 0)
-              {
-              for (i = min; i < max; i++)
-                {
-                if (eptr >= md->end_subject || *eptr == NEWLINE) break;
-                eptr++;
-                }
-              break;
-              }
-            else
-              {
-              c = max - min;
-              if (c > md->end_subject - eptr) c = md->end_subject - eptr;
-              eptr += c;
-              }
-            }
-          break;
-
-          /* The byte case is the same as non-UTF8 */
-
-          case OP_ANYBYTE:
-          c = max - min;
-          if (c > md->end_subject - eptr) c = md->end_subject - eptr;
-          eptr += c;
-          break;
-
-          case OP_NOT_DIGIT:
-          for (i = min; i < max; i++)
-            {
-            int len = 1;
-            if (eptr >= md->end_subject) break;
-            GETCHARLEN(c, eptr, len);
-            if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break;
-            eptr+= len;
-            }
-          break;
-
-          case OP_DIGIT:
-          for (i = min; i < max; i++)
-            {
-            int len = 1;
-            if (eptr >= md->end_subject) break;
-            GETCHARLEN(c, eptr, len);
-            if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break;
-            eptr+= len;
-            }
-          break;
-
-          case OP_NOT_WHITESPACE:
-          for (i = min; i < max; i++)
-            {
-            int len = 1;
-            if (eptr >= md->end_subject) break;
-            GETCHARLEN(c, eptr, len);
-            if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break;
-            eptr+= len;
-            }
-          break;
-
-          case OP_WHITESPACE:
-          for (i = min; i < max; i++)
-            {
-            int len = 1;
-            if (eptr >= md->end_subject) break;
-            GETCHARLEN(c, eptr, len);
-            if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break;
-            eptr+= len;
-            }
-          break;
-
-          case OP_NOT_WORDCHAR:
-          for (i = min; i < max; i++)
-            {
-            int len = 1;
-            if (eptr >= md->end_subject) break;
-            GETCHARLEN(c, eptr, len);
-            if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break;
-            eptr+= len;
-            }
-          break;
-
-          case OP_WORDCHAR:
-          for (i = min; i < max; i++)
-            {
-            int len = 1;
-            if (eptr >= md->end_subject) break;
-            GETCHARLEN(c, eptr, len);
-            if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break;
-            eptr+= len;
-            }
-          break;
-          }
-
-        /* eptr is now past the end of the maximum run */
-
-        for(;;)
-          {
-          if ((rrc = match(eptr, ecode, offset_top, md, ims, eptrb, 0)) !=
-               MATCH_NOMATCH) return rrc;
-          if (eptr-- == pp) break;        /* Stop if tried at original pos */
-          BACKCHAR(eptr);
-          }
-        }
-      else
-#endif
-
-      /* Not UTF-8 mode */
-        {
-        switch(ctype)
-          {
-          case OP_ANY:
-          if ((ims & PCRE_DOTALL) == 0)
-            {
-            for (i = min; i < max; i++)
-              {
-              if (eptr >= md->end_subject || *eptr == NEWLINE) break;
-              eptr++;
-              }
-            break;
-            }
-          /* For DOTALL case, fall through and treat as \C */
-
-          case OP_ANYBYTE:
-          c = max - min;
-          if (c > md->end_subject - eptr) c = md->end_subject - eptr;
-          eptr += c;
-          break;
-
-          case OP_NOT_DIGIT:
-          for (i = min; i < max; i++)
-            {
-            if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0)
-              break;
-            eptr++;
-            }
-          break;
-
-          case OP_DIGIT:
-          for (i = min; i < max; i++)
-            {
-            if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0)
-              break;
-            eptr++;
-            }
-          break;
-
-          case OP_NOT_WHITESPACE:
-          for (i = min; i < max; i++)
-            {
-            if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0)
-              break;
-            eptr++;
-            }
-          break;
-
-          case OP_WHITESPACE:
-          for (i = min; i < max; i++)
-            {
-            if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0)
-              break;
-            eptr++;
-            }
-          break;
-
-          case OP_NOT_WORDCHAR:
-          for (i = min; i < max; i++)
-            {
-            if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0)
-              break;
-            eptr++;
-            }
-          break;
-
-          case OP_WORDCHAR:
-          for (i = min; i < max; i++)
-            {
-            if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0)
-              break;
-            eptr++;
-            }
-          break;
-          }
-
-        /* eptr is now past the end of the maximum run */
-
-        while (eptr >= pp)
-          {
-          if ((rrc = match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) !=
-               MATCH_NOMATCH) return rrc;
-          }
-        }
-
-      /* Get here if we can't make it match with any permitted repetitions */
-
-      return MATCH_NOMATCH;
-      }
-    /* Control never gets here */
-
-    /* There's been some horrible disaster. Since all codes > OP_BRA are
-    for capturing brackets, and there shouldn't be any gaps between 0 and
-    OP_BRA, arrival here can only mean there is something seriously wrong
-    in the code above or the OP_xxx definitions. */
-
-    default:
-    DPRINTF(("Unknown opcode %d\n", *ecode));
-    return PCRE_ERROR_UNKNOWN_NODE;
-    }
-
-  /* Do not stick any code in here without much thought; it is assumed
-  that "continue" in the code above comes out to here to repeat the main
-  loop. */
-
-  }             /* End of main loop */
-/* Control never reaches here */
-}
-
-
-
-
-/*************************************************
-*         Execute a Regular Expression           *
-*************************************************/
-
-/* This function applies a compiled re to a subject string and picks out
-portions of the string if it matches. Two elements in the vector are set for
-each substring: the offsets to the start and end of the substring.
-
-Arguments:
-  external_re     points to the compiled expression
-  extra_data      points to extra data or is NULL
-  subject         points to the subject string
-  length          length of subject string (may contain binary zeros)
-  start_offset    where to start in the subject string
-  options         option bits
-  offsets         points to a vector of ints to be filled in with offsets
-  offsetcount     the number of elements in the vector
-
-Returns:          > 0 => success; value is the number of elements filled in
-                  = 0 => success, but offsets is not big enough
-                   -1 => failed to match
-                 < -1 => some kind of unexpected problem
-*/
-
-int
-pcre_exec(const pcre *external_re, const pcre_extra *extra_data,
-  const char *subject, int length, int start_offset, int options, int *offsets,
-  int offsetcount)
-{
-int rc, resetcount, ocount;
-int first_byte = -1;
-int req_byte = -1;
-int req_byte2 = -1;
-unsigned long int ims = 0;
-BOOL using_temporary_offsets = FALSE;
-BOOL anchored;
-BOOL startline;
-BOOL first_byte_caseless = FALSE;
-BOOL req_byte_caseless = FALSE;
-match_data match_block;
-const uschar *start_bits = NULL;
-const uschar *start_match = (const uschar *)subject + start_offset;
-const uschar *end_subject;
-const uschar *req_byte_ptr = start_match - 1;
-const pcre_study_data *study;
-const real_pcre *re = (const real_pcre *)external_re;
-
-/* Plausibility checks */
-
-if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;
-if (re == NULL || subject == NULL ||
-   (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;
-
-/* Fish out the optional data from the extra_data structure, first setting
-the default values. */
-
-study = NULL;
-match_block.match_limit = MATCH_LIMIT;
-match_block.callout_data = NULL;
-
-if (extra_data != NULL)
-  {
-  register unsigned int flags = extra_data->flags;
-  if ((flags & PCRE_EXTRA_STUDY_DATA) != 0)
-    study = extra_data->study_data;
-  if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0)
-    match_block.match_limit = extra_data->match_limit;
-  if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0)
-    match_block.callout_data = extra_data->callout_data;
-  }
-
-/* Now we have re supposedly pointing to the regex */
-
-if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC;
-
-anchored = ((re->options | options) & PCRE_ANCHORED) != 0;
-startline = (re->options & PCRE_STARTLINE) != 0;
-
-match_block.start_code =
-  (const uschar *)re + sizeof(real_pcre) + re->name_count * re->name_entry_size;
-match_block.start_subject = (const uschar *)subject;
-match_block.start_offset = start_offset;
-match_block.end_subject = match_block.start_subject + length;
-end_subject = match_block.end_subject;
-
-match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;
-match_block.utf8 = (re->options & PCRE_UTF8) != 0;
-
-match_block.notbol = (options & PCRE_NOTBOL) != 0;
-match_block.noteol = (options & PCRE_NOTEOL) != 0;
-match_block.notempty = (options & PCRE_NOTEMPTY) != 0;
-
-match_block.recursive = NULL;                   /* No recursion at top level */
-
-match_block.lcc = re->tables + lcc_offset;
-match_block.ctypes = re->tables + ctypes_offset;
-
-/* The ims options can vary during the matching as a result of the presence
-of (?ims) items in the pattern. They are kept in a local variable so that
-restoring at the exit of a group is easy. */
-
-ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL);
-
-/* If the expression has got more back references than the offsets supplied can
-hold, we get a temporary bit of working store to use during the matching.
-Otherwise, we can use the vector supplied, rounding down its size to a multiple
-of 3. */
-
-ocount = offsetcount - (offsetcount % 3);
-
-if (re->top_backref > 0 && re->top_backref >= ocount/3)
-  {
-  ocount = re->top_backref * 3 + 3;
-  match_block.offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int));
-  if (match_block.offset_vector == NULL) return PCRE_ERROR_NOMEMORY;
-  using_temporary_offsets = TRUE;
-  DPRINTF(("Got memory to hold back references\n"));
-  }
-else match_block.offset_vector = offsets;
-
-match_block.offset_end = ocount;
-match_block.offset_max = (2*ocount)/3;
-match_block.offset_overflow = FALSE;
-match_block.capture_last = -1;
-
-/* Compute the minimum number of offsets that we need to reset each time. Doing
-this makes a huge difference to execution time when there aren't many brackets
-in the pattern. */
-
-resetcount = 2 + re->top_bracket * 2;
-if (resetcount > offsetcount) resetcount = ocount;
-
-/* Reset the working variable associated with each extraction. These should
-never be used unless previously set, but they get saved and restored, and so we
-initialize them to avoid reading uninitialized locations. */
-
-if (match_block.offset_vector != NULL)
-  {
-  register int *iptr = match_block.offset_vector + ocount;
-  register int *iend = iptr - resetcount/2 + 1;
-  while (--iptr >= iend) *iptr = -1;
-  }
-
-/* Set up the first character to match, if available. The first_byte value is
-never set for an anchored regular expression, but the anchoring may be forced
-at run time, so we have to test for anchoring. The first char may be unset for
-an unanchored pattern, of course. If there's no first char and the pattern was
-studied, there may be a bitmap of possible first characters. */
-
-if (!anchored)
-  {
-  if ((re->options & PCRE_FIRSTSET) != 0)
-    {
-    first_byte = re->first_byte & 255;
-    if ((first_byte_caseless = ((re->first_byte & REQ_CASELESS) != 0)) == TRUE)
-      first_byte = match_block.lcc[first_byte];
-    }
-  else
-    if (!startline && study != NULL &&
-      (study->options & PCRE_STUDY_MAPPED) != 0)
-        start_bits = study->start_bits;
-  }
-
-/* For anchored or unanchored matches, there may be a "last known required
-character" set. */
-
-if ((re->options & PCRE_REQCHSET) != 0)
-  {
-  req_byte = re->req_byte & 255;
-  req_byte_caseless = (re->req_byte & REQ_CASELESS) != 0;
-  req_byte2 = (re->tables + fcc_offset)[req_byte];  /* case flipped */
-  }
-
-/* Loop for handling unanchored repeated matching attempts; for anchored regexs
-the loop runs just once. */
-
-do
-  {
-  register int *iptr = match_block.offset_vector;
-  register int *iend = iptr + resetcount;
-
-  /* Reset the maximum number of extractions we might see. */
-
-  while (iptr < iend) *iptr++ = -1;
-
-  /* Advance to a unique first char if possible */
-
-  if (first_byte >= 0)
-    {
-    if (first_byte_caseless)
-      while (start_match < end_subject &&
-             match_block.lcc[*start_match] != first_byte)
-        start_match++;
-    else
-      while (start_match < end_subject && *start_match != first_byte)
-        start_match++;
-    }
-
-  /* Or to just after \n for a multiline match if possible */
-
-  else if (startline)
-    {
-    if (start_match > match_block.start_subject + start_offset)
-      {
-      while (start_match < end_subject && start_match[-1] != NEWLINE)
-        start_match++;
-      }
-    }
-
-  /* Or to a non-unique first char after study */
-
-  else if (start_bits != NULL)
-    {
-    while (start_match < end_subject)
-      {
-      register int c = *start_match;
-      if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; else break;
-      }
-    }
-
-#ifdef DEBUG  /* Sigh. Some compilers never learn. */
-  printf(">>>> Match against: ");
-  pchars(start_match, end_subject - start_match, TRUE, &match_block);
-  printf("\n");
-#endif
-
-  /* If req_byte is set, we know that that character must appear in the subject
-  for the match to succeed. If the first character is set, req_byte must be
-  later in the subject; otherwise the test starts at the match point. This
-  optimization can save a huge amount of backtracking in patterns with nested
-  unlimited repeats that aren't going to match. Writing separate code for
-  cased/caseless versions makes it go faster, as does using an autoincrement
-  and backing off on a match.
-
-  HOWEVER: when the subject string is very, very long, searching to its end can
-  take a long time, and give bad performance on quite ordinary patterns. This
-  showed up when somebody was matching /^C/ on a 32-megabyte string... so we
-  don't do this when the string is sufficiently long. */
-
-  if (req_byte >= 0 && end_subject - start_match < REQ_BYTE_MAX)
-    {
-    register const uschar *p = start_match + ((first_byte >= 0)? 1 : 0);
-
-    /* We don't need to repeat the search if we haven't yet reached the
-    place we found it at last time. */
-
-    if (p > req_byte_ptr)
-      {
-      if (req_byte_caseless)
-        {
-        while (p < end_subject)
-          {
-          register int pp = *p++;
-          if (pp == req_byte || pp == req_byte2) { p--; break; }
-          }
-        }
-      else
-        {
-        while (p < end_subject)
-          {
-          if (*p++ == req_byte) { p--; break; }
-          }
-        }
-
-      /* If we can't find the required character, break the matching loop */
-
-      if (p >= end_subject) break;
-
-      /* If we have found the required character, save the point where we
-      found it, so that we don't search again next time round the loop if
-      the start hasn't passed this character yet. */
-
-      req_byte_ptr = p;
-      }
-    }
-
-  /* When a match occurs, substrings will be set for all internal extractions;
-  we just need to set up the whole thing as substring 0 before returning. If
-  there were too many extractions, set the return code to zero. In the case
-  where we had to get some local store to hold offsets for backreferences, copy
-  those back references that we can. In this case there need not be overflow
-  if certain parts of the pattern were not used. */
-
-  match_block.start_match = start_match;
-  match_block.match_call_count = 0;
-
-  rc = match(start_match, match_block.start_code, 2, &match_block, ims, NULL,
-    match_isgroup);
-
-  if (rc == MATCH_NOMATCH)
-    {
-    start_match++;
-#ifdef SUPPORT_UTF8
-    if (match_block.utf8)
-      while((*start_match & 0xc0) == 0x80) start_match++;
-#endif
-    continue;
-    }
-
-  if (rc != MATCH_MATCH)
-    {
-    DPRINTF((">>>> error: returning %d\n", rc));
-    return rc;
-    }
-
-  /* We have a match! Copy the offset information from temporary store if
-  necessary */
-
-  if (using_temporary_offsets)
-    {
-    if (offsetcount >= 4)
-      {
-      memcpy(offsets + 2, match_block.offset_vector + 2,
-        (offsetcount - 2) * sizeof(int));
-      DPRINTF(("Copied offsets from temporary memory\n"));
-      }
-    if (match_block.end_offset_top > offsetcount)
-      match_block.offset_overflow = TRUE;
-
-    DPRINTF(("Freeing temporary memory\n"));
-    (pcre_free)(match_block.offset_vector);
-    }
-
-  rc = match_block.offset_overflow? 0 : match_block.end_offset_top/2;
-
-  if (offsetcount < 2) rc = 0; else
-    {
-    offsets[0] = start_match - match_block.start_subject;
-    offsets[1] = match_block.end_match_ptr - match_block.start_subject;
-    }
-
-  DPRINTF((">>>> returning %d\n", rc));
-  return rc;
-  }
-
-/* This "while" is the end of the "do" above */
-
-while (!anchored && start_match <= end_subject);
-
-if (using_temporary_offsets)
-  {
-  DPRINTF(("Freeing temporary memory\n"));
-  (pcre_free)(match_block.offset_vector);
-  }
-
-DPRINTF((">>>> returning PCRE_ERROR_NOMATCH\n"));
-
-return PCRE_ERROR_NOMATCH;
-}
-
-/* End of pcre.c */
diff -Nurp tin-1.6.2/pcre/pcre.def tin-1.8.0/pcre/pcre.def
--- tin-1.6.2/pcre/pcre.def	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/pcre.def	1970-01-01 01:00:00.000000000 +0100
@@ -1,22 +0,0 @@
-EXPORTS
-
-pcre_malloc DATA
-pcre_free DATA
-
-pcre_compile
-pcre_copy_substring
-pcre_exec
-pcre_get_substring
-pcre_get_substring_list
-pcre_free_substring
-pcre_free_substring_list
-pcre_info
-pcre_fullinfo
-pcre_maketables
-pcre_study
-pcre_version
-
-regcomp
-regexec
-regerror
-regfree
diff -Nurp tin-1.6.2/pcre/pcre.h.in tin-1.8.0/pcre/pcre.h.in
--- tin-1.6.2/pcre/pcre.h.in	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre.h.in	2005-09-12 16:35:10.000000000 +0200
@@ -0,0 +1,258 @@
+/*************************************************
+*       Perl-Compatible Regular Expressions      *
+*************************************************/
+
+/* In its original form, this is the .in file that is transformed by
+"configure" into pcre.h.
+
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+#ifndef _PCRE_H
+#define _PCRE_H
+
+/* The file pcre.h is build by "configure". Do not edit it; instead
+make changes to pcre.in. */
+
+#define PCRE_MAJOR          @PCRE_MAJOR@
+#define PCRE_MINOR          @PCRE_MINOR@
+#define PCRE_DATE           @PCRE_DATE@
+
+/* Win32 uses DLL by default; it needs special stuff for exported functions. */
+
+#ifdef _WIN32
+#  ifdef PCRE_DEFINITION
+#    ifdef DLL_EXPORT
+#      define PCRE_DATA_SCOPE __declspec(dllexport)
+#    endif
+#  else
+#    ifndef PCRE_STATIC
+#      define PCRE_DATA_SCOPE extern __declspec(dllimport)
+#    endif
+#  endif
+#endif
+
+/* For other operating systems, we use the standard "extern". */
+
+#ifndef PCRE_DATA_SCOPE
+#  ifdef __cplusplus
+#    define PCRE_DATA_SCOPE     extern "C"
+#  else
+#    define PCRE_DATA_SCOPE     extern
+#  endif
+#endif
+
+/* Have to include stdlib.h in order to ensure that size_t is defined;
+it is needed here for malloc. */
+
+#include <stdlib.h>
+
+/* Allow for C++ users */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Options */
+
+#define PCRE_CASELESS           0x00000001
+#define PCRE_MULTILINE          0x00000002
+#define PCRE_DOTALL             0x00000004
+#define PCRE_EXTENDED           0x00000008
+#define PCRE_ANCHORED           0x00000010
+#define PCRE_DOLLAR_ENDONLY     0x00000020
+#define PCRE_EXTRA              0x00000040
+#define PCRE_NOTBOL             0x00000080
+#define PCRE_NOTEOL             0x00000100
+#define PCRE_UNGREEDY           0x00000200
+#define PCRE_NOTEMPTY           0x00000400
+#define PCRE_UTF8               0x00000800
+#define PCRE_NO_AUTO_CAPTURE    0x00001000
+#define PCRE_NO_UTF8_CHECK      0x00002000
+#define PCRE_AUTO_CALLOUT       0x00004000
+#define PCRE_PARTIAL            0x00008000
+#define PCRE_DFA_SHORTEST       0x00010000
+#define PCRE_DFA_RESTART        0x00020000
+#define PCRE_FIRSTLINE          0x00040000
+
+/* Exec-time and get/set-time error codes */
+
+#define PCRE_ERROR_NOMATCH         (-1)
+#define PCRE_ERROR_NULL            (-2)
+#define PCRE_ERROR_BADOPTION       (-3)
+#define PCRE_ERROR_BADMAGIC        (-4)
+#define PCRE_ERROR_UNKNOWN_NODE    (-5)
+#define PCRE_ERROR_NOMEMORY        (-6)
+#define PCRE_ERROR_NOSUBSTRING     (-7)
+#define PCRE_ERROR_MATCHLIMIT      (-8)
+#define PCRE_ERROR_CALLOUT         (-9)  /* Never used by PCRE itself */
+#define PCRE_ERROR_BADUTF8        (-10)
+#define PCRE_ERROR_BADUTF8_OFFSET (-11)
+#define PCRE_ERROR_PARTIAL        (-12)
+#define PCRE_ERROR_BADPARTIAL     (-13)
+#define PCRE_ERROR_INTERNAL       (-14)
+#define PCRE_ERROR_BADCOUNT       (-15)
+#define PCRE_ERROR_DFA_UITEM      (-16)
+#define PCRE_ERROR_DFA_UCOND      (-17)
+#define PCRE_ERROR_DFA_UMLIMIT    (-18)
+#define PCRE_ERROR_DFA_WSSIZE     (-19)
+#define PCRE_ERROR_DFA_RECURSE    (-20)
+
+/* Request types for pcre_fullinfo() */
+
+#define PCRE_INFO_OPTIONS            0
+#define PCRE_INFO_SIZE               1
+#define PCRE_INFO_CAPTURECOUNT       2
+#define PCRE_INFO_BACKREFMAX         3
+#define PCRE_INFO_FIRSTBYTE          4
+#define PCRE_INFO_FIRSTCHAR          4  /* For backwards compatibility */
+#define PCRE_INFO_FIRSTTABLE         5
+#define PCRE_INFO_LASTLITERAL        6
+#define PCRE_INFO_NAMEENTRYSIZE      7
+#define PCRE_INFO_NAMECOUNT          8
+#define PCRE_INFO_NAMETABLE          9
+#define PCRE_INFO_STUDYSIZE         10
+#define PCRE_INFO_DEFAULT_TABLES    11
+
+/* Request types for pcre_config() */
+
+#define PCRE_CONFIG_UTF8                    0
+#define PCRE_CONFIG_NEWLINE                 1
+#define PCRE_CONFIG_LINK_SIZE               2
+#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD  3
+#define PCRE_CONFIG_MATCH_LIMIT             4
+#define PCRE_CONFIG_STACKRECURSE            5
+#define PCRE_CONFIG_UNICODE_PROPERTIES      6
+
+/* Bit flags for the pcre_extra structure */
+
+#define PCRE_EXTRA_STUDY_DATA          0x0001
+#define PCRE_EXTRA_MATCH_LIMIT         0x0002
+#define PCRE_EXTRA_CALLOUT_DATA        0x0004
+#define PCRE_EXTRA_TABLES              0x0008
+
+/* Types */
+
+struct real_pcre;                 /* declaration; the definition is private  */
+typedef struct real_pcre pcre;
+
+/* The structure for passing additional data to pcre_exec(). This is defined in
+such as way as to be extensible. Always add new fields at the end, in order to
+remain compatible. */
+
+typedef struct pcre_extra {
+  unsigned long int flags;        /* Bits for which fields are set */
+  void *study_data;               /* Opaque data from pcre_study() */
+  unsigned long int match_limit;  /* Maximum number of calls to match() */
+  void *callout_data;             /* Data passed back in callouts */
+  const unsigned char *tables;    /* Pointer to character tables */
+} pcre_extra;
+
+/* The structure for passing out data via the pcre_callout_function. We use a
+structure so that new fields can be added on the end in future versions,
+without changing the API of the function, thereby allowing old clients to work
+without modification. */
+
+typedef struct pcre_callout_block {
+  int          version;           /* Identifies version of block */
+  /* ------------------------ Version 0 ------------------------------- */
+  int          callout_number;    /* Number compiled into pattern */
+  int         *offset_vector;     /* The offset vector */
+  const char  *subject;           /* The subject being matched */
+  int          subject_length;    /* The length of the subject */
+  int          start_match;       /* Offset to start of this match attempt */
+  int          current_position;  /* Where we currently are in the subject */
+  int          capture_top;       /* Max current capture */
+  int          capture_last;      /* Most recently closed capture */
+  void        *callout_data;      /* Data passed in with the call */
+  /* ------------------- Added for Version 1 -------------------------- */
+  int          pattern_position;  /* Offset to next item in the pattern */
+  int          next_item_length;  /* Length of next item in the pattern */
+  /* ------------------------------------------------------------------ */
+} pcre_callout_block;
+
+/* Indirection for store get and free functions. These can be set to
+alternative malloc/free functions if required. Special ones are used in the
+non-recursive case for "frames". There is also an optional callout function
+that is triggered by the (?) regex item. For Virtual Pascal, these definitions
+have to take another form. */
+
+#ifndef VPCOMPAT
+PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t);
+PCRE_DATA_SCOPE void  (*pcre_free)(void *);
+PCRE_DATA_SCOPE void *(*pcre_stack_malloc)(size_t);
+PCRE_DATA_SCOPE void  (*pcre_stack_free)(void *);
+PCRE_DATA_SCOPE int   (*pcre_callout)(pcre_callout_block *);
+#else   /* VPCOMPAT */
+PCRE_DATA_SCOPE void *pcre_malloc(size_t);
+PCRE_DATA_SCOPE void  pcre_free(void *);
+PCRE_DATA_SCOPE void *pcre_stack_malloc(size_t);
+PCRE_DATA_SCOPE void  pcre_stack_free(void *);
+PCRE_DATA_SCOPE int   pcre_callout(pcre_callout_block *);
+#endif  /* VPCOMPAT */
+
+/* Exported PCRE functions */
+
+PCRE_DATA_SCOPE pcre *pcre_compile(const char *, int, const char **, int *,
+                  const unsigned char *);
+PCRE_DATA_SCOPE pcre *pcre_compile2(const char *, int, int *, const char **,
+                  int *, const unsigned char *);
+PCRE_DATA_SCOPE int  pcre_config(int, void *);
+PCRE_DATA_SCOPE int  pcre_copy_named_substring(const pcre *, const char *,
+                  int *, int, const char *, char *, int);
+PCRE_DATA_SCOPE int  pcre_copy_substring(const char *, int *, int, int, char *,
+                  int);
+PCRE_DATA_SCOPE int  pcre_dfa_exec(const pcre *, const pcre_extra *,
+                  const char *, int, int, int, int *, int , int *, int);
+PCRE_DATA_SCOPE int  pcre_exec(const pcre *, const pcre_extra *, const char *,
+                   int, int, int, int *, int);
+PCRE_DATA_SCOPE void pcre_free_substring(const char *);
+PCRE_DATA_SCOPE void pcre_free_substring_list(const char **);
+PCRE_DATA_SCOPE int  pcre_fullinfo(const pcre *, const pcre_extra *, int,
+                  void *);
+PCRE_DATA_SCOPE int  pcre_get_named_substring(const pcre *, const char *,
+                  int *, int, const char *, const char **);
+PCRE_DATA_SCOPE int  pcre_get_stringnumber(const pcre *, const char *);
+PCRE_DATA_SCOPE int  pcre_get_substring(const char *, int *, int, int,
+                  const char **);
+PCRE_DATA_SCOPE int  pcre_get_substring_list(const char *, int *, int,
+                  const char ***);
+PCRE_DATA_SCOPE int  pcre_info(const pcre *, int *, int *);
+PCRE_DATA_SCOPE const unsigned char *pcre_maketables(void);
+PCRE_DATA_SCOPE int  pcre_refcount(pcre *, int);
+PCRE_DATA_SCOPE pcre_extra *pcre_study(const pcre *, int, const char **);
+PCRE_DATA_SCOPE const char *pcre_version(void);
+
+#ifdef __cplusplus
+}  /* extern "C" */
+#endif
+
+#endif /* End of pcre.h */
diff -Nurp tin-1.6.2/pcre/pcre.in tin-1.8.0/pcre/pcre.in
--- tin-1.6.2/pcre/pcre.in	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/pcre.in	1970-01-01 01:00:00.000000000 +0100
@@ -1,184 +0,0 @@
-/*************************************************
-*       Perl-Compatible Regular Expressions      *
-*************************************************/
-
-/* Copyright (c) 1997-2003 University of Cambridge */
-
-#ifndef _PCRE_H
-#define _PCRE_H
-
-/* The file pcre.h is build by "configure". Do not edit it; instead
-make changes to pcre.in. */
-
-#define PCRE_MAJOR          @PCRE_MAJOR@
-#define PCRE_MINOR          @PCRE_MINOR@
-#define PCRE_DATE           @PCRE_DATE@
-
-/* Win32 uses DLL by default */
-
-#ifdef _WIN32
-#  ifdef PCRE_DEFINITION
-#    ifdef DLL_EXPORT
-#      define PCRE_DATA_SCOPE __declspec(dllexport)
-#    endif
-#  else
-#    ifndef PCRE_STATIC
-#      define PCRE_DATA_SCOPE __declspec(dllimport)
-#    endif
-#  endif
-#endif
-#ifndef PCRE_DATA_SCOPE
-#  define PCRE_DATA_SCOPE     extern
-#endif
-
-/* Have to include stdlib.h in order to ensure that size_t is defined;
-it is needed here for malloc. */
-
-#include <stdlib.h>
-
-/* Allow for C++ users */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Options */
-
-#define PCRE_CASELESS           0x0001
-#define PCRE_MULTILINE          0x0002
-#define PCRE_DOTALL             0x0004
-#define PCRE_EXTENDED           0x0008
-#define PCRE_ANCHORED           0x0010
-#define PCRE_DOLLAR_ENDONLY     0x0020
-#define PCRE_EXTRA              0x0040
-#define PCRE_NOTBOL             0x0080
-#define PCRE_NOTEOL             0x0100
-#define PCRE_UNGREEDY           0x0200
-#define PCRE_NOTEMPTY           0x0400
-#define PCRE_UTF8               0x0800
-#define PCRE_NO_AUTO_CAPTURE    0x1000
-
-/* Exec-time and get/set-time error codes */
-
-#define PCRE_ERROR_NOMATCH        (-1)
-#define PCRE_ERROR_NULL           (-2)
-#define PCRE_ERROR_BADOPTION      (-3)
-#define PCRE_ERROR_BADMAGIC       (-4)
-#define PCRE_ERROR_UNKNOWN_NODE   (-5)
-#define PCRE_ERROR_NOMEMORY       (-6)
-#define PCRE_ERROR_NOSUBSTRING    (-7)
-#define PCRE_ERROR_MATCHLIMIT     (-8)
-#define PCRE_ERROR_CALLOUT        (-9)  /* Never used by PCRE itself */
-
-/* Request types for pcre_fullinfo() */
-
-#define PCRE_INFO_OPTIONS            0
-#define PCRE_INFO_SIZE               1
-#define PCRE_INFO_CAPTURECOUNT       2
-#define PCRE_INFO_BACKREFMAX         3
-#define PCRE_INFO_FIRSTBYTE          4
-#define PCRE_INFO_FIRSTCHAR          4  /* For backwards compatibility */
-#define PCRE_INFO_FIRSTTABLE         5
-#define PCRE_INFO_LASTLITERAL        6
-#define PCRE_INFO_NAMEENTRYSIZE      7
-#define PCRE_INFO_NAMECOUNT          8
-#define PCRE_INFO_NAMETABLE          9
-#define PCRE_INFO_STUDYSIZE         10
-
-/* Request types for pcre_config() */
-
-#define PCRE_CONFIG_UTF8                    0
-#define PCRE_CONFIG_NEWLINE                 1
-#define PCRE_CONFIG_LINK_SIZE               2
-#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD  3
-#define PCRE_CONFIG_MATCH_LIMIT             4
-
-/* Bit flags for the pcre_extra structure */
-
-#define PCRE_EXTRA_STUDY_DATA          0x0001
-#define PCRE_EXTRA_MATCH_LIMIT         0x0002
-#define PCRE_EXTRA_CALLOUT_DATA        0x0004
-
-/* Types */
-
-struct real_pcre;                 /* declaration; the definition is private  */
-typedef struct real_pcre pcre;
-
-/* The structure for passing additional data to pcre_exec(). This is defined in
-such as way as to be extensible. */
-
-typedef struct pcre_extra {
-  unsigned long int flags;        /* Bits for which fields are set */
-  void *study_data;               /* Opaque data from pcre_study() */
-  unsigned long int match_limit;  /* Maximum number of calls to match() */
-  void *callout_data;             /* Data passed back in callouts */
-} pcre_extra;
-
-/* The structure for passing out data via the pcre_callout_function. We use a
-structure so that new fields can be added on the end in future versions,
-without changing the API of the function, thereby allowing old clients to work
-without modification. */
-
-typedef struct pcre_callout_block {
-  int          version;           /* Identifies version of block */
-  /* ------------------------ Version 0 ------------------------------- */
-  int          callout_number;    /* Number compiled into pattern */
-  int         *offset_vector;     /* The offset vector */
-  const char  *subject;           /* The subject being matched */
-  int          subject_length;    /* The length of the subject */
-  int          start_match;       /* Offset to start of this match attempt */
-  int          current_position;  /* Where we currently are */
-  int          capture_top;       /* Max current capture */
-  int          capture_last;      /* Most recently closed capture */
-  void        *callout_data;      /* Data passed in with the call */
-  /* ------------------------------------------------------------------ */
-} pcre_callout_block;
-
-/* Indirection for store get and free functions. These can be set to
-alternative malloc/free functions if required. There is also an optional
-callout function that is triggered by the (?) regex item. Some magic is
-required for Win32 DLL; it is null on other OS. For Virtual Pascal, these
-have to be different again. */
-
-#ifndef VPCOMPAT
-PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t);
-PCRE_DATA_SCOPE void  (*pcre_free)(void *);
-PCRE_DATA_SCOPE int   (*pcre_callout)(pcre_callout_block *);
-#else   /* VPCOMPAT */
-extern void *pcre_malloc(size_t);
-extern void  pcre_free(void *);
-extern int   pcre_callout(pcre_callout_block *);
-#endif  /* VPCOMPAT */
-
-/* Exported PCRE functions */
-
-extern pcre *pcre_compile(const char *, int, const char **,
-              int *, const unsigned char *);
-extern int  pcre_config(int, void *);
-extern int  pcre_copy_named_substring(const pcre *, const char *,
-              int *, int, const char *, char *, int);
-extern int  pcre_copy_substring(const char *, int *, int, int,
-              char *, int);
-extern int  pcre_exec(const pcre *, const pcre_extra *,
-              const char *, int, int, int, int *, int);
-extern void pcre_free_substring(const char *);
-extern void pcre_free_substring_list(const char **);
-extern int  pcre_fullinfo(const pcre *, const pcre_extra *, int,
-              void *);
-extern int  pcre_get_named_substring(const pcre *, const char *,
-              int *, int,  const char *, const char **);
-extern int  pcre_get_stringnumber(const pcre *, const char *);
-extern int  pcre_get_substring(const char *, int *, int, int,
-              const char **);
-extern int  pcre_get_substring_list(const char *, int *, int,
-              const char ***);
-extern int  pcre_info(const pcre *, int *, int *);
-extern const unsigned char *pcre_maketables(void);
-extern pcre_extra *pcre_study(const pcre *, int, const char **);
-extern const char *pcre_version(void);
-
-#ifdef __cplusplus
-}  /* extern "C" */
-#endif
-
-#endif /* End of pcre.h */
diff -Nurp tin-1.6.2/pcre/pcre_compile.c tin-1.8.0/pcre/pcre_compile.c
--- tin-1.6.2/pcre/pcre_compile.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_compile.c	2005-09-12 16:37:57.000000000 +0200
@@ -0,0 +1,5069 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_compile(), along with
+supporting internal functions that are not used by other modules. */
+
+
+#include "pcre_internal.h"
+
+
+/* When DEBUG is defined, we need the pcre_printint() function, which is also
+used by pcretest. DEBUG is not defined when building a production library. */
+
+#ifdef DEBUG
+#include "pcre_printint.src"
+#endif
+
+
+
+/*************************************************
+*      Code parameters and static tables         *
+*************************************************/
+
+/* Maximum number of items on the nested bracket stacks at compile time. This
+applies to the nesting of all kinds of parentheses. It does not limit
+un-nested, non-capturing parentheses. This number can be made bigger if
+necessary - it is used to dimension one int and one unsigned char vector at
+compile time. */
+
+#define BRASTACK_SIZE 200
+
+
+/* Table for handling escaped characters in the range '0'-'z'. Positive returns
+are simple data values; negative values are for special things like \d and so
+on. Zero means further processing is needed (for things like \x), or the escape
+is invalid. */
+
+#if !EBCDIC   /* This is the "normal" table for ASCII systems */
+static const short int escapes[] = {
+     0,      0,      0,      0,      0,      0,      0,      0,   /* 0 - 7 */
+     0,      0,    ':',    ';',    '<',    '=',    '>',    '?',   /* 8 - ? */
+   '@', -ESC_A, -ESC_B, -ESC_C, -ESC_D, -ESC_E,      0, -ESC_G,   /* @ - G */
+     0,      0,      0,      0,      0,      0,      0,      0,   /* H - O */
+-ESC_P, -ESC_Q,      0, -ESC_S,      0,      0,      0, -ESC_W,   /* P - W */
+-ESC_X,      0, -ESC_Z,    '[',   '\\',    ']',    '^',    '_',   /* X - _ */
+   '`',      7, -ESC_b,      0, -ESC_d,  ESC_e,  ESC_f,      0,   /* ` - g */
+     0,      0,      0,      0,      0,      0,  ESC_n,      0,   /* h - o */
+-ESC_p,      0,  ESC_r, -ESC_s,  ESC_tee,    0,      0, -ESC_w,   /* p - w */
+     0,      0, -ESC_z                                            /* x - z */
+};
+
+#else         /* This is the "abnormal" table for EBCDIC systems */
+static const short int escapes[] = {
+/*  48 */     0,     0,      0,     '.',    '<',   '(',    '+',    '|',
+/*  50 */   '&',     0,      0,       0,      0,     0,      0,      0,
+/*  58 */     0,     0,    '!',     '$',    '*',   ')',    ';',    '~',
+/*  60 */   '-',   '/',      0,       0,      0,     0,      0,      0,
+/*  68 */     0,     0,    '|',     ',',    '%',   '_',    '>',    '?',
+/*  70 */     0,     0,      0,       0,      0,     0,      0,      0,
+/*  78 */     0,   '`',    ':',     '#',    '@',  '\'',    '=',    '"',
+/*  80 */     0,     7, -ESC_b,       0, -ESC_d, ESC_e,  ESC_f,      0,
+/*  88 */     0,     0,      0,     '{',      0,     0,      0,      0,
+/*  90 */     0,     0,      0,     'l',      0, ESC_n,      0, -ESC_p,
+/*  98 */     0, ESC_r,      0,     '}',      0,     0,      0,      0,
+/*  A0 */     0,   '~', -ESC_s, ESC_tee,      0,     0, -ESC_w,      0,
+/*  A8 */     0,-ESC_z,      0,       0,      0,   '[',      0,      0,
+/*  B0 */     0,     0,      0,       0,      0,     0,      0,      0,
+/*  B8 */     0,     0,      0,       0,      0,   ']',    '=',    '-',
+/*  C0 */   '{',-ESC_A, -ESC_B,  -ESC_C, -ESC_D,-ESC_E,      0, -ESC_G,
+/*  C8 */     0,     0,      0,       0,      0,     0,      0,      0,
+/*  D0 */   '}',     0,      0,       0,      0,     0,      0, -ESC_P,
+/*  D8 */-ESC_Q,     0,      0,       0,      0,     0,      0,      0,
+/*  E0 */  '\\',     0, -ESC_S,       0,      0,     0, -ESC_W, -ESC_X,
+/*  E8 */     0,-ESC_Z,      0,       0,      0,     0,      0,      0,
+/*  F0 */     0,     0,      0,       0,      0,     0,      0,      0,
+/*  F8 */     0,     0,      0,       0,      0,     0,      0,      0
+};
+#endif
+
+
+/* Tables of names of POSIX character classes and their lengths. The list is
+terminated by a zero length entry. The first three must be alpha, upper, lower,
+as this is assumed for handling case independence. */
+
+static const char *const posix_names[] = {
+  "alpha", "lower", "upper",
+  "alnum", "ascii", "blank", "cntrl", "digit", "graph",
+  "print", "punct", "space", "word",  "xdigit" };
+
+static const uschar posix_name_lengths[] = {
+  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 };
+
+/* Table of class bit maps for each POSIX class; up to three may be combined
+to form the class. The table for [:blank:] is dynamically modified to remove
+the vertical space characters. */
+
+static const int posix_class_maps[] = {
+  cbit_lower, cbit_upper, -1,             /* alpha */
+  cbit_lower, -1,         -1,             /* lower */
+  cbit_upper, -1,         -1,             /* upper */
+  cbit_digit, cbit_lower, cbit_upper,     /* alnum */
+  cbit_print, cbit_cntrl, -1,             /* ascii */
+  cbit_space, -1,         -1,             /* blank - a GNU extension */
+  cbit_cntrl, -1,         -1,             /* cntrl */
+  cbit_digit, -1,         -1,             /* digit */
+  cbit_graph, -1,         -1,             /* graph */
+  cbit_print, -1,         -1,             /* print */
+  cbit_punct, -1,         -1,             /* punct */
+  cbit_space, -1,         -1,             /* space */
+  cbit_word,  -1,         -1,             /* word - a Perl extension */
+  cbit_xdigit,-1,         -1              /* xdigit */
+};
+
+
+/* The texts of compile-time error messages. These are "char *" because they
+are passed to the outside world. */
+
+static const char *error_texts[] = {
+  "no error",
+  "\\ at end of pattern",
+  "\\c at end of pattern",
+  "unrecognized character follows \\",
+  "numbers out of order in {} quantifier",
+  /* 5 */
+  "number too big in {} quantifier",
+  "missing terminating ] for character class",
+  "invalid escape sequence in character class",
+  "range out of order in character class",
+  "nothing to repeat",
+  /* 10 */
+  "operand of unlimited repeat could match the empty string",
+  "internal error: unexpected repeat",
+  "unrecognized character after (?",
+  "POSIX named classes are supported only within a class",
+  "missing )",
+  /* 15 */
+  "reference to non-existent subpattern",
+  "erroffset passed as NULL",
+  "unknown option bit(s) set",
+  "missing ) after comment",
+  "parentheses nested too deeply",
+  /* 20 */
+  "regular expression too large",
+  "failed to get memory",
+  "unmatched parentheses",
+  "internal error: code overflow",
+  "unrecognized character after (?<",
+  /* 25 */
+  "lookbehind assertion is not fixed length",
+  "malformed number after (?(",
+  "conditional group contains more than two branches",
+  "assertion expected after (?(",
+  "(?R or (?digits must be followed by )",
+  /* 30 */
+  "unknown POSIX class name",
+  "POSIX collating elements are not supported",
+  "this version of PCRE is not compiled with PCRE_UTF8 support",
+  "spare error",
+  "character value in \\x{...} sequence is too large",
+  /* 35 */
+  "invalid condition (?(0)",
+  "\\C not allowed in lookbehind assertion",
+  "PCRE does not support \\L, \\l, \\N, \\U, or \\u",
+  "number after (?C is > 255",
+  "closing ) for (?C expected",
+  /* 40 */
+  "recursive call could loop indefinitely",
+  "unrecognized character after (?P",
+  "syntax error after (?P",
+  "two named groups have the same name",
+  "invalid UTF-8 string",
+  /* 45 */
+  "support for \\P, \\p, and \\X has not been compiled",
+  "malformed \\P or \\p sequence",
+  "unknown property name after \\P or \\p"
+};
+
+
+/* Table to identify digits and hex digits. This is used when compiling
+patterns. Note that the tables in chartables are dependent on the locale, and
+may mark arbitrary characters as digits - but the PCRE compiling code expects
+to handle only 0-9, a-z, and A-Z as digits when compiling. That is why we have
+a private table here. It costs 256 bytes, but it is a lot faster than doing
+character value tests (at least in some simple cases I timed), and in some
+applications one wants PCRE to compile efficiently as well as match
+efficiently.
+
+For convenience, we use the same bit definitions as in chartables:
+
+  0x04   decimal digit
+  0x08   hexadecimal digit
+
+Then we can use ctype_digit and ctype_xdigit in the code. */
+
+#if !EBCDIC    /* This is the "normal" case, for ASCII systems */
+static const unsigned char digitab[] =
+  {
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   0-  7 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   8- 15 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  16- 23 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  24- 31 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*    - '  */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  ( - /  */
+  0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /*  0 - 7  */
+  0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, /*  8 - ?  */
+  0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /*  @ - G  */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  H - O  */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  P - W  */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  X - _  */
+  0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /*  ` - g  */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  h - o  */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  p - w  */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  x -127 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */
+
+#else          /* This is the "abnormal" case, for EBCDIC systems */
+static const unsigned char digitab[] =
+  {
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   0-  7  0 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*   8- 15    */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  16- 23 10 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  24- 31    */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  32- 39 20 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  40- 47    */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  48- 55 30 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  56- 63    */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*    - 71 40 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  72- |     */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  & - 87 50 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  88- ¬     */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  - -103 60 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 104- ?     */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 70 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- "     */
+  0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* 128- g  80 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  h -143    */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144- p  90 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  q -159    */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160- x  A0 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  y -175    */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  ^ -183 B0 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191    */
+  0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /*  { - G  C0 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  H -207    */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  } - P  D0 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  Q -223    */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  \ - X  E0 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  Y -239    */
+  0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /*  0 - 7  F0 */
+  0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00};/*  8 -255    */
+
+static const unsigned char ebcdic_chartab[] = { /* chartable partial dup */
+  0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /*   0-  7 */
+  0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, /*   8- 15 */
+  0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /*  16- 23 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  24- 31 */
+  0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /*  32- 39 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  40- 47 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  48- 55 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  56- 63 */
+  0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*    - 71 */
+  0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80, /*  72- |  */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  & - 87 */
+  0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00, /*  88- ¬  */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  - -103 */
+  0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x80, /* 104- ?  */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 */
+  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- "  */
+  0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* 128- g  */
+  0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /*  h -143 */
+  0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* 144- p  */
+  0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /*  q -159 */
+  0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* 160- x  */
+  0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /*  y -175 */
+  0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*  ^ -183 */
+  0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 184-191 */
+  0x80,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /*  { - G  */
+  0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /*  H -207 */
+  0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /*  } - P  */
+  0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /*  Q -223 */
+  0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /*  \ - X  */
+  0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /*  Y -239 */
+  0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /*  0 - 7  */
+  0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00};/*  8 -255 */
+#endif
+
+
+/* Definition to allow mutual recursion */
+
+static BOOL
+  compile_regex(int, int, int *, uschar **, const uschar **, int *, BOOL, int,
+    int *, int *, branch_chain *, compile_data *);
+
+
+
+/*************************************************
+*            Handle escapes                      *
+*************************************************/
+
+/* This function is called when a \ has been encountered. It either returns a
+positive value for a simple escape such as \n, or a negative value which
+encodes one of the more complicated things such as \d. When UTF-8 is enabled,
+a positive value greater than 255 may be returned. On entry, ptr is pointing at
+the \. On exit, it is on the final character of the escape sequence.
+
+Arguments:
+  ptrptr         points to the pattern position pointer
+  errorcodeptr   points to the errorcode variable
+  bracount       number of previous extracting brackets
+  options        the options bits
+  isclass        TRUE if inside a character class
+
+Returns:         zero or positive => a data character
+                 negative => a special escape sequence
+                 on error, errorptr is set
+*/
+
+static int
+check_escape(const uschar **ptrptr, int *errorcodeptr, int bracount,
+  int options, BOOL isclass)
+{
+const uschar *ptr = *ptrptr;
+int c, i;
+
+/* If backslash is at the end of the pattern, it's an error. */
+
+c = *(++ptr);
+if (c == 0) *errorcodeptr = ERR1;
+
+/* Non-alphamerics are literals. For digits or letters, do an initial lookup in
+a table. A non-zero result is something that can be returned immediately.
+Otherwise further processing may be required. */
+
+#if !EBCDIC    /* ASCII coding */
+else if (c < '0' || c > 'z') {}                           /* Not alphameric */
+else if ((i = escapes[c - '0']) != 0) c = i;
+
+#else          /* EBCDIC coding */
+else if (c < 'a' || (ebcdic_chartab[c] & 0x0E) == 0) {}   /* Not alphameric */
+else if ((i = escapes[c - 0x48]) != 0)  c = i;
+#endif
+
+/* Escapes that need further processing, or are illegal. */
+
+else
+  {
+  const uschar *oldptr;
+  switch (c)
+    {
+    /* A number of Perl escapes are not handled by PCRE. We give an explicit
+    error. */
+
+    case 'l':
+    case 'L':
+    case 'N':
+    case 'u':
+    case 'U':
+    *errorcodeptr = ERR37;
+    break;
+
+    /* The handling of escape sequences consisting of a string of digits
+    starting with one that is not zero is not straightforward. By experiment,
+    the way Perl works seems to be as follows:
+
+    Outside a character class, the digits are read as a decimal number. If the
+    number is less than 10, or if there are that many previous extracting
+    left brackets, then it is a back reference. Otherwise, up to three octal
+    digits are read to form an escaped byte. Thus \123 is likely to be octal
+    123 (cf \0123, which is octal 012 followed by the literal 3). If the octal
+    value is greater than 377, the least significant 8 bits are taken. Inside a
+    character class, \ followed by a digit is always an octal number. */
+
+    case '1': case '2': case '3': case '4': case '5':
+    case '6': case '7': case '8': case '9':
+
+    if (!isclass)
+      {
+      oldptr = ptr;
+      c -= '0';
+      while ((digitab[ptr[1]] & ctype_digit) != 0)
+        c = c * 10 + *(++ptr) - '0';
+      if (c < 10 || c <= bracount)
+        {
+        c = -(ESC_REF + c);
+        break;
+        }
+      ptr = oldptr;      /* Put the pointer back and fall through */
+      }
+
+    /* Handle an octal number following \. If the first digit is 8 or 9, Perl
+    generates a binary zero byte and treats the digit as a following literal.
+    Thus we have to pull back the pointer by one. */
+
+    if ((c = *ptr) >= '8')
+      {
+      ptr--;
+      c = 0;
+      break;
+      }
+
+    /* \0 always starts an octal number, but we may drop through to here with a
+    larger first octal digit. */
+
+    case '0':
+    c -= '0';
+    while(i++ < 2 && ptr[1] >= '0' && ptr[1] <= '7')
+        c = c * 8 + *(++ptr) - '0';
+    c &= 255;     /* Take least significant 8 bits */
+    break;
+
+    /* \x is complicated when UTF-8 is enabled. \x{ddd} is a character number
+    which can be greater than 0xff, but only if the ddd are hex digits. */
+
+    case 'x':
+#ifdef SUPPORT_UTF8
+    if (ptr[1] == '{' && (options & PCRE_UTF8) != 0)
+      {
+      const uschar *pt = ptr + 2;
+      register int count = 0;
+      c = 0;
+      while ((digitab[*pt] & ctype_xdigit) != 0)
+        {
+        int cc = *pt++;
+        count++;
+#if !EBCDIC    /* ASCII coding */
+        if (cc >= 'a') cc -= 32;               /* Convert to upper case */
+        c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10));
+#else          /* EBCDIC coding */
+        if (cc >= 'a' && cc <= 'z') cc += 64;  /* Convert to upper case */
+        c = c * 16 + cc - ((cc >= '0')? '0' : ('A' - 10));
+#endif
+        }
+      if (*pt == '}')
+        {
+        if (c < 0 || count > 8) *errorcodeptr = ERR34;
+        ptr = pt;
+        break;
+        }
+      /* If the sequence of hex digits does not end with '}', then we don't
+      recognize this construct; fall through to the normal \x handling. */
+      }
+#endif
+
+    /* Read just a single hex char */
+
+    c = 0;
+    while (i++ < 2 && (digitab[ptr[1]] & ctype_xdigit) != 0)
+      {
+      int cc;                               /* Some compilers don't like ++ */
+      cc = *(++ptr);                        /* in initializers */
+#if !EBCDIC    /* ASCII coding */
+      if (cc >= 'a') cc -= 32;              /* Convert to upper case */
+      c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10));
+#else          /* EBCDIC coding */
+      if (cc <= 'z') cc += 64;              /* Convert to upper case */
+      c = c * 16 + cc - ((cc >= '0')? '0' : ('A' - 10));
+#endif
+      }
+    break;
+
+    /* Other special escapes not starting with a digit are straightforward */
+
+    case 'c':
+    c = *(++ptr);
+    if (c == 0)
+      {
+      *errorcodeptr = ERR2;
+      return 0;
+      }
+
+    /* A letter is upper-cased; then the 0x40 bit is flipped. This coding
+    is ASCII-specific, but then the whole concept of \cx is ASCII-specific.
+    (However, an EBCDIC equivalent has now been added.) */
+
+#if !EBCDIC    /* ASCII coding */
+    if (c >= 'a' && c <= 'z') c -= 32;
+    c ^= 0x40;
+#else          /* EBCDIC coding */
+    if (c >= 'a' && c <= 'z') c += 64;
+    c ^= 0xC0;
+#endif
+    break;
+
+    /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any
+    other alphameric following \ is an error if PCRE_EXTRA was set; otherwise,
+    for Perl compatibility, it is a literal. This code looks a bit odd, but
+    there used to be some cases other than the default, and there may be again
+    in future, so I haven't "optimized" it. */
+
+    default:
+    if ((options & PCRE_EXTRA) != 0) switch(c)
+      {
+      default:
+      *errorcodeptr = ERR3;
+      break;
+      }
+    break;
+    }
+  }
+
+*ptrptr = ptr;
+return c;
+}
+
+
+
+#ifdef SUPPORT_UCP
+/*************************************************
+*               Handle \P and \p                 *
+*************************************************/
+
+/* This function is called after \P or \p has been encountered, provided that
+PCRE is compiled with support for Unicode properties. On entry, ptrptr is
+pointing at the P or p. On exit, it is pointing at the final character of the
+escape sequence.
+
+Argument:
+  ptrptr         points to the pattern position pointer
+  negptr         points to a boolean that is set TRUE for negation else FALSE
+  errorcodeptr   points to the error code variable
+
+Returns:     value from ucp_type_table, or -1 for an invalid type
+*/
+
+static int
+get_ucp(const uschar **ptrptr, BOOL *negptr, int *errorcodeptr)
+{
+int c, i, bot, top;
+const uschar *ptr = *ptrptr;
+char name[4];
+
+c = *(++ptr);
+if (c == 0) goto ERROR_RETURN;
+
+*negptr = FALSE;
+
+/* \P or \p can be followed by a one- or two-character name in {}, optionally
+preceded by ^ for negation. */
+
+if (c == '{')
+  {
+  if (ptr[1] == '^')
+    {
+    *negptr = TRUE;
+    ptr++;
+    }
+  for (i = 0; i <= 2; i++)
+    {
+    c = *(++ptr);
+    if (c == 0) goto ERROR_RETURN;
+    if (c == '}') break;
+    name[i] = c;
+    }
+  if (c !='}')   /* Try to distinguish error cases */
+    {
+    while (*(++ptr) != 0 && *ptr != '}');
+    if (*ptr == '}') goto UNKNOWN_RETURN; else goto ERROR_RETURN;
+    }
+  name[i] = 0;
+  }
+
+/* Otherwise there is just one following character */
+
+else
+  {
+  name[0] = c;
+  name[1] = 0;
+  }
+
+*ptrptr = ptr;
+
+/* Search for a recognized property name using binary chop */
+
+bot = 0;
+top = _pcre_utt_size;
+
+while (bot < top)
+  {
+  i = (bot + top)/2;
+  c = strcmp(name, _pcre_utt[i].name);
+  if (c == 0) return _pcre_utt[i].value;
+  if (c > 0) bot = i + 1; else top = i;
+  }
+
+UNKNOWN_RETURN:
+*errorcodeptr = ERR47;
+*ptrptr = ptr;
+return -1;
+
+ERROR_RETURN:
+*errorcodeptr = ERR46;
+*ptrptr = ptr;
+return -1;
+}
+#endif
+
+
+
+
+/*************************************************
+*            Check for counted repeat            *
+*************************************************/
+
+/* This function is called when a '{' is encountered in a place where it might
+start a quantifier. It looks ahead to see if it really is a quantifier or not.
+It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd}
+where the ddds are digits.
+
+Arguments:
+  p         pointer to the first char after '{'
+
+Returns:    TRUE or FALSE
+*/
+
+static BOOL
+is_counted_repeat(const uschar *p)
+{
+if ((digitab[*p++] & ctype_digit) == 0) return FALSE;
+while ((digitab[*p] & ctype_digit) != 0) p++;
+if (*p == '}') return TRUE;
+
+if (*p++ != ',') return FALSE;
+if (*p == '}') return TRUE;
+
+if ((digitab[*p++] & ctype_digit) == 0) return FALSE;
+while ((digitab[*p] & ctype_digit) != 0) p++;
+
+return (*p == '}');
+}
+
+
+
+/*************************************************
+*         Read repeat counts                     *
+*************************************************/
+
+/* Read an item of the form {n,m} and return the values. This is called only
+after is_counted_repeat() has confirmed that a repeat-count quantifier exists,
+so the syntax is guaranteed to be correct, but we need to check the values.
+
+Arguments:
+  p              pointer to first char after '{'
+  minp           pointer to int for min
+  maxp           pointer to int for max
+                 returned as -1 if no max
+  errorcodeptr   points to error code variable
+
+Returns:         pointer to '}' on success;
+                 current ptr on error, with errorcodeptr set non-zero
+*/
+
+static const uschar *
+read_repeat_counts(const uschar *p, int *minp, int *maxp, int *errorcodeptr)
+{
+int min = 0;
+int max = -1;
+
+/* Read the minimum value and do a paranoid check: a negative value indicates
+an integer overflow. */
+
+while ((digitab[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0';
+if (min < 0 || min > 65535)
+  {
+  *errorcodeptr = ERR5;
+  return p;
+  }
+
+/* Read the maximum value if there is one, and again do a paranoid on its size.
+Also, max must not be less than min. */
+
+if (*p == '}') max = min; else
+  {
+  if (*(++p) != '}')
+    {
+    max = 0;
+    while((digitab[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0';
+    if (max < 0 || max > 65535)
+      {
+      *errorcodeptr = ERR5;
+      return p;
+      }
+    if (max < min)
+      {
+      *errorcodeptr = ERR4;
+      return p;
+      }
+    }
+  }
+
+/* Fill in the required variables, and pass back the pointer to the terminating
+'}'. */
+
+*minp = min;
+*maxp = max;
+return p;
+}
+
+
+
+/*************************************************
+*      Find first significant op code            *
+*************************************************/
+
+/* This is called by several functions that scan a compiled expression looking
+for a fixed first character, or an anchoring op code etc. It skips over things
+that do not influence this. For some calls, a change of option is important.
+For some calls, it makes sense to skip negative forward and all backward
+assertions, and also the \b assertion; for others it does not.
+
+Arguments:
+  code         pointer to the start of the group
+  options      pointer to external options
+  optbit       the option bit whose changing is significant, or
+                 zero if none are
+  skipassert   TRUE if certain assertions are to be skipped
+
+Returns:       pointer to the first significant opcode
+*/
+
+static const uschar*
+first_significant_code(const uschar *code, int *options, int optbit,
+  BOOL skipassert)
+{
+for (;;)
+  {
+  switch ((int)*code)
+    {
+    case OP_OPT:
+    if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit))
+      *options = (int)code[1];
+    code += 2;
+    break;
+
+    case OP_ASSERT_NOT:
+    case OP_ASSERTBACK:
+    case OP_ASSERTBACK_NOT:
+    if (!skipassert) return code;
+    do code += GET(code, 1); while (*code == OP_ALT);
+    code += _pcre_OP_lengths[*code];
+    break;
+
+    case OP_WORD_BOUNDARY:
+    case OP_NOT_WORD_BOUNDARY:
+    if (!skipassert) return code;
+    /* Fall through */
+
+    case OP_CALLOUT:
+    case OP_CREF:
+    case OP_BRANUMBER:
+    code += _pcre_OP_lengths[*code];
+    break;
+
+    default:
+    return code;
+    }
+  }
+/* Control never reaches here */
+}
+
+
+
+
+/*************************************************
+*        Find the fixed length of a pattern      *
+*************************************************/
+
+/* Scan a pattern and compute the fixed length of subject that will match it,
+if the length is fixed. This is needed for dealing with backward assertions.
+In UTF8 mode, the result is in characters rather than bytes.
+
+Arguments:
+  code     points to the start of the pattern (the bracket)
+  options  the compiling options
+
+Returns:   the fixed length, or -1 if there is no fixed length,
+             or -2 if \C was encountered
+*/
+
+static int
+find_fixedlength(uschar *code, int options)
+{
+int length = -1;
+
+register int branchlength = 0;
+register uschar *cc = code + 1 + LINK_SIZE;
+
+/* Scan along the opcodes for this branch. If we get to the end of the
+branch, check the length against that of the other branches. */
+
+for (;;)
+  {
+  int d;
+  register int op = *cc;
+  if (op >= OP_BRA) op = OP_BRA;
+
+  switch (op)
+    {
+    case OP_BRA:
+    case OP_ONCE:
+    case OP_COND:
+    d = find_fixedlength(cc, options);
+    if (d < 0) return d;
+    branchlength += d;
+    do cc += GET(cc, 1); while (*cc == OP_ALT);
+    cc += 1 + LINK_SIZE;
+    break;
+
+    /* Reached end of a branch; if it's a ket it is the end of a nested
+    call. If it's ALT it is an alternation in a nested call. If it is
+    END it's the end of the outer call. All can be handled by the same code. */
+
+    case OP_ALT:
+    case OP_KET:
+    case OP_KETRMAX:
+    case OP_KETRMIN:
+    case OP_END:
+    if (length < 0) length = branchlength;
+      else if (length != branchlength) return -1;
+    if (*cc != OP_ALT) return length;
+    cc += 1 + LINK_SIZE;
+    branchlength = 0;
+    break;
+
+    /* Skip over assertive subpatterns */
+
+    case OP_ASSERT:
+    case OP_ASSERT_NOT:
+    case OP_ASSERTBACK:
+    case OP_ASSERTBACK_NOT:
+    do cc += GET(cc, 1); while (*cc == OP_ALT);
+    /* Fall through */
+
+    /* Skip over things that don't match chars */
+
+    case OP_REVERSE:
+    case OP_BRANUMBER:
+    case OP_CREF:
+    case OP_OPT:
+    case OP_CALLOUT:
+    case OP_SOD:
+    case OP_SOM:
+    case OP_EOD:
+    case OP_EODN:
+    case OP_CIRC:
+    case OP_DOLL:
+    case OP_NOT_WORD_BOUNDARY:
+    case OP_WORD_BOUNDARY:
+    cc += _pcre_OP_lengths[*cc];
+    break;
+
+    /* Handle literal characters */
+
+    case OP_CHAR:
+    case OP_CHARNC:
+    branchlength++;
+    cc += 2;
+#ifdef SUPPORT_UTF8
+    if ((options & PCRE_UTF8) != 0)
+      {
+      while ((*cc & 0xc0) == 0x80) cc++;
+      }
+#endif
+    break;
+
+    /* Handle exact repetitions. The count is already in characters, but we
+    need to skip over a multibyte character in UTF8 mode.  */
+
+    case OP_EXACT:
+    branchlength += GET2(cc,1);
+    cc += 4;
+#ifdef SUPPORT_UTF8
+    if ((options & PCRE_UTF8) != 0)
+      {
+      while((*cc & 0x80) == 0x80) cc++;
+      }
+#endif
+    break;
+
+    case OP_TYPEEXACT:
+    branchlength += GET2(cc,1);
+    cc += 4;
+    break;
+
+    /* Handle single-char matchers */
+
+    case OP_PROP:
+    case OP_NOTPROP:
+    cc++;
+    /* Fall through */
+
+    case OP_NOT_DIGIT:
+    case OP_DIGIT:
+    case OP_NOT_WHITESPACE:
+    case OP_WHITESPACE:
+    case OP_NOT_WORDCHAR:
+    case OP_WORDCHAR:
+    case OP_ANY:
+    branchlength++;
+    cc++;
+    break;
+
+    /* The single-byte matcher isn't allowed */
+
+    case OP_ANYBYTE:
+    return -2;
+
+    /* Check a class for variable quantification */
+
+#ifdef SUPPORT_UTF8
+    case OP_XCLASS:
+    cc += GET(cc, 1) - 33;
+    /* Fall through */
+#endif
+
+    case OP_CLASS:
+    case OP_NCLASS:
+    cc += 33;
+
+    switch (*cc)
+      {
+      case OP_CRSTAR:
+      case OP_CRMINSTAR:
+      case OP_CRQUERY:
+      case OP_CRMINQUERY:
+      return -1;
+
+      case OP_CRRANGE:
+      case OP_CRMINRANGE:
+      if (GET2(cc,1) != GET2(cc,3)) return -1;
+      branchlength += GET2(cc,1);
+      cc += 5;
+      break;
+
+      default:
+      branchlength++;
+      }
+    break;
+
+    /* Anything else is variable length */
+
+    default:
+    return -1;
+    }
+  }
+/* Control never gets here */
+}
+
+
+
+
+/*************************************************
+*    Scan compiled regex for numbered bracket    *
+*************************************************/
+
+/* This little function scans through a compiled pattern until it finds a
+capturing bracket with the given number.
+
+Arguments:
+  code        points to start of expression
+  utf8        TRUE in UTF-8 mode
+  number      the required bracket number
+
+Returns:      pointer to the opcode for the bracket, or NULL if not found
+*/
+
+static const uschar *
+find_bracket(const uschar *code, BOOL utf8, int number)
+{
+#ifndef SUPPORT_UTF8
+utf8 = utf8;               /* Stop pedantic compilers complaining */
+#endif
+
+for (;;)
+  {
+  register int c = *code;
+  if (c == OP_END) return NULL;
+  else if (c > OP_BRA)
+    {
+    int n = c - OP_BRA;
+    if (n > EXTRACT_BASIC_MAX) n = GET2(code, 2+LINK_SIZE);
+    if (n == number) return (uschar *)code;
+    code += _pcre_OP_lengths[OP_BRA];
+    }
+  else
+    {
+    code += _pcre_OP_lengths[c];
+
+#ifdef SUPPORT_UTF8
+
+    /* In UTF-8 mode, opcodes that are followed by a character may be followed
+    by a multi-byte character. The length in the table is a minimum, so we have
+    to scan along to skip the extra bytes. All opcodes are less than 128, so we
+    can use relatively efficient code. */
+
+    if (utf8) switch(c)
+      {
+      case OP_CHAR:
+      case OP_CHARNC:
+      case OP_EXACT:
+      case OP_UPTO:
+      case OP_MINUPTO:
+      case OP_STAR:
+      case OP_MINSTAR:
+      case OP_PLUS:
+      case OP_MINPLUS:
+      case OP_QUERY:
+      case OP_MINQUERY:
+      while ((*code & 0xc0) == 0x80) code++;
+      break;
+
+      /* XCLASS is used for classes that cannot be represented just by a bit
+      map. This includes negated single high-valued characters. The length in
+      the table is zero; the actual length is stored in the compiled code. */
+
+      case OP_XCLASS:
+      code += GET(code, 1) + 1;
+      break;
+      }
+#endif
+    }
+  }
+}
+
+
+
+/*************************************************
+*   Scan compiled regex for recursion reference  *
+*************************************************/
+
+/* This little function scans through a compiled pattern until it finds an
+instance of OP_RECURSE.
+
+Arguments:
+  code        points to start of expression
+  utf8        TRUE in UTF-8 mode
+
+Returns:      pointer to the opcode for OP_RECURSE, or NULL if not found
+*/
+
+static const uschar *
+find_recurse(const uschar *code, BOOL utf8)
+{
+#ifndef SUPPORT_UTF8
+utf8 = utf8;               /* Stop pedantic compilers complaining */
+#endif
+
+for (;;)
+  {
+  register int c = *code;
+  if (c == OP_END) return NULL;
+  else if (c == OP_RECURSE) return code;
+  else if (c > OP_BRA)
+    {
+    code += _pcre_OP_lengths[OP_BRA];
+    }
+  else
+    {
+    code += _pcre_OP_lengths[c];
+
+#ifdef SUPPORT_UTF8
+
+    /* In UTF-8 mode, opcodes that are followed by a character may be followed
+    by a multi-byte character. The length in the table is a minimum, so we have
+    to scan along to skip the extra bytes. All opcodes are less than 128, so we
+    can use relatively efficient code. */
+
+    if (utf8) switch(c)
+      {
+      case OP_CHAR:
+      case OP_CHARNC:
+      case OP_EXACT:
+      case OP_UPTO:
+      case OP_MINUPTO:
+      case OP_STAR:
+      case OP_MINSTAR:
+      case OP_PLUS:
+      case OP_MINPLUS:
+      case OP_QUERY:
+      case OP_MINQUERY:
+      while ((*code & 0xc0) == 0x80) code++;
+      break;
+
+      /* XCLASS is used for classes that cannot be represented just by a bit
+      map. This includes negated single high-valued characters. The length in
+      the table is zero; the actual length is stored in the compiled code. */
+
+      case OP_XCLASS:
+      code += GET(code, 1) + 1;
+      break;
+      }
+#endif
+    }
+  }
+}
+
+
+
+/*************************************************
+*    Scan compiled branch for non-emptiness      *
+*************************************************/
+
+/* This function scans through a branch of a compiled pattern to see whether it
+can match the empty string or not. It is called only from could_be_empty()
+below. Note that first_significant_code() skips over assertions. If we hit an
+unclosed bracket, we return "empty" - this means we've struck an inner bracket
+whose current branch will already have been scanned.
+
+Arguments:
+  code        points to start of search
+  endcode     points to where to stop
+  utf8        TRUE if in UTF8 mode
+
+Returns:      TRUE if what is matched could be empty
+*/
+
+static BOOL
+could_be_empty_branch(const uschar *code, const uschar *endcode, BOOL utf8)
+{
+register int c;
+for (code = first_significant_code(code + 1 + LINK_SIZE, NULL, 0, TRUE);
+     code < endcode;
+     code = first_significant_code(code + _pcre_OP_lengths[c], NULL, 0, TRUE))
+  {
+  const uschar *ccode;
+
+  c = *code;
+
+  if (c >= OP_BRA)
+    {
+    BOOL empty_branch;
+    if (GET(code, 1) == 0) return TRUE;    /* Hit unclosed bracket */
+
+    /* Scan a closed bracket */
+
+    empty_branch = FALSE;
+    do
+      {
+      if (!empty_branch && could_be_empty_branch(code, endcode, utf8))
+        empty_branch = TRUE;
+      code += GET(code, 1);
+      }
+    while (*code == OP_ALT);
+    if (!empty_branch) return FALSE;   /* All branches are non-empty */
+    code += 1 + LINK_SIZE;
+    c = *code;
+    }
+
+  else switch (c)
+    {
+    /* Check for quantifiers after a class */
+
+#ifdef SUPPORT_UTF8
+    case OP_XCLASS:
+    ccode = code + GET(code, 1);
+    goto CHECK_CLASS_REPEAT;
+#endif
+
+    case OP_CLASS:
+    case OP_NCLASS:
+    ccode = code + 33;
+
+#ifdef SUPPORT_UTF8
+    CHECK_CLASS_REPEAT:
+#endif
+
+    switch (*ccode)
+      {
+      case OP_CRSTAR:            /* These could be empty; continue */
+      case OP_CRMINSTAR:
+      case OP_CRQUERY:
+      case OP_CRMINQUERY:
+      break;
+
+      default:                   /* Non-repeat => class must match */
+      case OP_CRPLUS:            /* These repeats aren't empty */
+      case OP_CRMINPLUS:
+      return FALSE;
+
+      case OP_CRRANGE:
+      case OP_CRMINRANGE:
+      if (GET2(ccode, 1) > 0) return FALSE;  /* Minimum > 0 */
+      break;
+      }
+    break;
+
+    /* Opcodes that must match a character */
+
+    case OP_PROP:
+    case OP_NOTPROP:
+    case OP_EXTUNI:
+    case OP_NOT_DIGIT:
+    case OP_DIGIT:
+    case OP_NOT_WHITESPACE:
+    case OP_WHITESPACE:
+    case OP_NOT_WORDCHAR:
+    case OP_WORDCHAR:
+    case OP_ANY:
+    case OP_ANYBYTE:
+    case OP_CHAR:
+    case OP_CHARNC:
+    case OP_NOT:
+    case OP_PLUS:
+    case OP_MINPLUS:
+    case OP_EXACT:
+    case OP_NOTPLUS:
+    case OP_NOTMINPLUS:
+    case OP_NOTEXACT:
+    case OP_TYPEPLUS:
+    case OP_TYPEMINPLUS:
+    case OP_TYPEEXACT:
+    return FALSE;
+
+    /* End of branch */
+
+    case OP_KET:
+    case OP_KETRMAX:
+    case OP_KETRMIN:
+    case OP_ALT:
+    return TRUE;
+
+    /* In UTF-8 mode, STAR, MINSTAR, QUERY, MINQUERY, UPTO, and MINUPTO  may be
+    followed by a multibyte character */
+
+#ifdef SUPPORT_UTF8
+    case OP_STAR:
+    case OP_MINSTAR:
+    case OP_QUERY:
+    case OP_MINQUERY:
+    case OP_UPTO:
+    case OP_MINUPTO:
+    if (utf8) while ((code[2] & 0xc0) == 0x80) code++;
+    break;
+#endif
+    }
+  }
+
+return TRUE;
+}
+
+
+
+/*************************************************
+*    Scan compiled regex for non-emptiness       *
+*************************************************/
+
+/* This function is called to check for left recursive calls. We want to check
+the current branch of the current pattern to see if it could match the empty
+string. If it could, we must look outwards for branches at other levels,
+stopping when we pass beyond the bracket which is the subject of the recursion.
+
+Arguments:
+  code        points to start of the recursion
+  endcode     points to where to stop (current RECURSE item)
+  bcptr       points to the chain of current (unclosed) branch starts
+  utf8        TRUE if in UTF-8 mode
+
+Returns:      TRUE if what is matched could be empty
+*/
+
+static BOOL
+could_be_empty(const uschar *code, const uschar *endcode, branch_chain *bcptr,
+  BOOL utf8)
+{
+while (bcptr != NULL && bcptr->current >= code)
+  {
+  if (!could_be_empty_branch(bcptr->current, endcode, utf8)) return FALSE;
+  bcptr = bcptr->outer;
+  }
+return TRUE;
+}
+
+
+
+/*************************************************
+*           Check for POSIX class syntax         *
+*************************************************/
+
+/* This function is called when the sequence "[:" or "[." or "[=" is
+encountered in a character class. It checks whether this is followed by an
+optional ^ and then a sequence of letters, terminated by a matching ":]" or
+".]" or "=]".
+
+Argument:
+  ptr      pointer to the initial [
+  endptr   where to return the end pointer
+  cd       pointer to compile data
+
+Returns:   TRUE or FALSE
+*/
+
+static BOOL
+check_posix_syntax(const uschar *ptr, const uschar **endptr, compile_data *cd)
+{
+int terminator;          /* Don't combine these lines; the Solaris cc */
+terminator = *(++ptr);   /* compiler warns about "non-constant" initializer. */
+if (*(++ptr) == '^') ptr++;
+while ((cd->ctypes[*ptr] & ctype_letter) != 0) ptr++;
+if (*ptr == terminator && ptr[1] == ']')
+  {
+  *endptr = ptr;
+  return TRUE;
+  }
+return FALSE;
+}
+
+
+
+
+/*************************************************
+*          Check POSIX class name                *
+*************************************************/
+
+/* This function is called to check the name given in a POSIX-style class entry
+such as [:alnum:].
+
+Arguments:
+  ptr        points to the first letter
+  len        the length of the name
+
+Returns:     a value representing the name, or -1 if unknown
+*/
+
+static int
+check_posix_name(const uschar *ptr, int len)
+{
+register int yield = 0;
+while (posix_name_lengths[yield] != 0)
+  {
+  if (len == posix_name_lengths[yield] &&
+    strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield;
+  yield++;
+  }
+return -1;
+}
+
+
+/*************************************************
+*    Adjust OP_RECURSE items in repeated group   *
+*************************************************/
+
+/* OP_RECURSE items contain an offset from the start of the regex to the group
+that is referenced. This means that groups can be replicated for fixed
+repetition simply by copying (because the recursion is allowed to refer to
+earlier groups that are outside the current group). However, when a group is
+optional (i.e. the minimum quantifier is zero), OP_BRAZERO is inserted before
+it, after it has been compiled. This means that any OP_RECURSE items within it
+that refer to the group itself or any contained groups have to have their
+offsets adjusted. That is the job of this function. Before it is called, the
+partially compiled regex must be temporarily terminated with OP_END.
+
+Arguments:
+  group      points to the start of the group
+  adjust     the amount by which the group is to be moved
+  utf8       TRUE in UTF-8 mode
+  cd         contains pointers to tables etc.
+
+Returns:     nothing
+*/
+
+static void
+adjust_recurse(uschar *group, int adjust, BOOL utf8, compile_data *cd)
+{
+uschar *ptr = group;
+while ((ptr = (uschar *)find_recurse(ptr, utf8)) != NULL)
+  {
+  int offset = GET(ptr, 1);
+  if (cd->start_code + offset >= group) PUT(ptr, 1, offset + adjust);
+  ptr += 1 + LINK_SIZE;
+  }
+}
+
+
+
+/*************************************************
+*        Insert an automatic callout point       *
+*************************************************/
+
+/* This function is called when the PCRE_AUTO_CALLOUT option is set, to insert
+callout points before each pattern item.
+
+Arguments:
+  code           current code pointer
+  ptr            current pattern pointer
+  cd             pointers to tables etc
+
+Returns:         new code pointer
+*/
+
+static uschar *
+auto_callout(uschar *code, const uschar *ptr, compile_data *cd)
+{
+*code++ = OP_CALLOUT;
+*code++ = 255;
+PUT(code, 0, ptr - cd->start_pattern);  /* Pattern offset */
+PUT(code, LINK_SIZE, 0);                /* Default length */
+return code + 2*LINK_SIZE;
+}
+
+
+
+/*************************************************
+*         Complete a callout item                *
+*************************************************/
+
+/* A callout item contains the length of the next item in the pattern, which
+we can't fill in till after we have reached the relevant point. This is used
+for both automatic and manual callouts.
+
+Arguments:
+  previous_callout   points to previous callout item
+  ptr                current pattern pointer
+  cd                 pointers to tables etc
+
+Returns:             nothing
+*/
+
+static void
+complete_callout(uschar *previous_callout, const uschar *ptr, compile_data *cd)
+{
+int length = ptr - cd->start_pattern - GET(previous_callout, 2);
+PUT(previous_callout, 2 + LINK_SIZE, length);
+}
+
+
+
+#ifdef SUPPORT_UCP
+/*************************************************
+*           Get othercase range                  *
+*************************************************/
+
+/* This function is passed the start and end of a class range, in UTF-8 mode
+with UCP support. It searches up the characters, looking for internal ranges of
+characters in the "other" case. Each call returns the next one, updating the
+start address.
+
+Arguments:
+  cptr        points to starting character value; updated
+  d           end value
+  ocptr       where to put start of othercase range
+  odptr       where to put end of othercase range
+
+Yield:        TRUE when range returned; FALSE when no more
+*/
+
+static BOOL
+get_othercase_range(int *cptr, int d, int *ocptr, int *odptr)
+{
+int c, chartype, othercase, next;
+
+for (c = *cptr; c <= d; c++)
+  {
+  if (_pcre_ucp_findchar(c, &chartype, &othercase) == ucp_L && othercase != 0)
+    break;
+  }
+
+if (c > d) return FALSE;
+
+*ocptr = othercase;
+next = othercase + 1;
+
+for (++c; c <= d; c++)
+  {
+  if (_pcre_ucp_findchar(c, &chartype, &othercase) != ucp_L ||
+        othercase != next)
+    break;
+  next++;
+  }
+
+*odptr = next - 1;
+*cptr = c;
+
+return TRUE;
+}
+#endif  /* SUPPORT_UCP */
+
+
+/*************************************************
+*           Compile one branch                   *
+*************************************************/
+
+/* Scan the pattern, compiling it into the code vector. If the options are
+changed during the branch, the pointer is used to change the external options
+bits.
+
+Arguments:
+  optionsptr     pointer to the option bits
+  brackets       points to number of extracting brackets used
+  codeptr        points to the pointer to the current code point
+  ptrptr         points to the current pattern pointer
+  errorcodeptr   points to error code variable
+  firstbyteptr   set to initial literal character, or < 0 (REQ_UNSET, REQ_NONE)
+  reqbyteptr     set to the last literal character required, else < 0
+  bcptr          points to current branch chain
+  cd             contains pointers to tables etc.
+
+Returns:         TRUE on success
+                 FALSE, with *errorcodeptr set non-zero on error
+*/
+
+static BOOL
+compile_branch(int *optionsptr, int *brackets, uschar **codeptr,
+  const uschar **ptrptr, int *errorcodeptr, int *firstbyteptr,
+  int *reqbyteptr, branch_chain *bcptr, compile_data *cd)
+{
+int repeat_type, op_type;
+int repeat_min = 0, repeat_max = 0;      /* To please picky compilers */
+int bravalue = 0;
+int greedy_default, greedy_non_default;
+int firstbyte, reqbyte;
+int zeroreqbyte, zerofirstbyte;
+int req_caseopt, reqvary, tempreqvary;
+int condcount = 0;
+int options = *optionsptr;
+int after_manual_callout = 0;
+register int c;
+register uschar *code = *codeptr;
+uschar *tempcode;
+BOOL inescq = FALSE;
+BOOL groupsetfirstbyte = FALSE;
+const uschar *ptr = *ptrptr;
+const uschar *tempptr;
+uschar *previous = NULL;
+uschar *previous_callout = NULL;
+uschar classbits[32];
+
+#ifdef SUPPORT_UTF8
+BOOL class_utf8;
+BOOL utf8 = (options & PCRE_UTF8) != 0;
+uschar *class_utf8data;
+uschar utf8_char[6];
+#else
+BOOL utf8 = FALSE;
+#endif
+
+/* Set up the default and non-default settings for greediness */
+
+greedy_default = ((options & PCRE_UNGREEDY) != 0);
+greedy_non_default = greedy_default ^ 1;
+
+/* Initialize no first byte, no required byte. REQ_UNSET means "no char
+matching encountered yet". It gets changed to REQ_NONE if we hit something that
+matches a non-fixed char first char; reqbyte just remains unset if we never
+find one.
+
+When we hit a repeat whose minimum is zero, we may have to adjust these values
+to take the zero repeat into account. This is implemented by setting them to
+zerofirstbyte and zeroreqbyte when such a repeat is encountered. The individual
+item types that can be repeated set these backoff variables appropriately. */
+
+firstbyte = reqbyte = zerofirstbyte = zeroreqbyte = REQ_UNSET;
+
+/* The variable req_caseopt contains either the REQ_CASELESS value or zero,
+according to the current setting of the caseless flag. REQ_CASELESS is a bit
+value > 255. It is added into the firstbyte or reqbyte variables to record the
+case status of the value. This is used only for ASCII characters. */
+
+req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0;
+
+/* Switch on next character until the end of the branch */
+
+for (;; ptr++)
+  {
+  BOOL negate_class;
+  BOOL possessive_quantifier;
+  BOOL is_quantifier;
+  int class_charcount;
+  int class_lastchar;
+  int newoptions;
+  int recno;
+  int skipbytes;
+  int subreqbyte;
+  int subfirstbyte;
+  int mclength;
+  uschar mcbuffer[8];
+
+  /* Next byte in the pattern */
+
+  c = *ptr;
+
+  /* If in \Q...\E, check for the end; if not, we have a literal */
+
+  if (inescq && c != 0)
+    {
+    if (c == '\\' && ptr[1] == 'E')
+      {
+      inescq = FALSE;
+      ptr++;
+      continue;
+      }
+    else
+      {
+      if (previous_callout != NULL)
+        {
+        complete_callout(previous_callout, ptr, cd);
+        previous_callout = NULL;
+        }
+      if ((options & PCRE_AUTO_CALLOUT) != 0)
+        {
+        previous_callout = code;
+        code = auto_callout(code, ptr, cd);
+        }
+      goto NORMAL_CHAR;
+      }
+    }
+
+  /* Fill in length of a previous callout, except when the next thing is
+  a quantifier. */
+
+  is_quantifier = c == '*' || c == '+' || c == '?' ||
+    (c == '{' && is_counted_repeat(ptr+1));
+
+  if (!is_quantifier && previous_callout != NULL &&
+       after_manual_callout-- <= 0)
+    {
+    complete_callout(previous_callout, ptr, cd);
+    previous_callout = NULL;
+    }
+
+  /* In extended mode, skip white space and comments */
+
+  if ((options & PCRE_EXTENDED) != 0)
+    {
+    if ((cd->ctypes[c] & ctype_space) != 0) continue;
+    if (c == '#')
+      {
+      /* The space before the ; is to avoid a warning on a silly compiler
+      on the Macintosh. */
+      while ((c = *(++ptr)) != 0 && c != NEWLINE) ;
+      if (c != 0) continue;   /* Else fall through to handle end of string */
+      }
+    }
+
+  /* No auto callout for quantifiers. */
+
+  if ((options & PCRE_AUTO_CALLOUT) != 0 && !is_quantifier)
+    {
+    previous_callout = code;
+    code = auto_callout(code, ptr, cd);
+    }
+
+  switch(c)
+    {
+    /* The branch terminates at end of string, |, or ). */
+
+    case 0:
+    case '|':
+    case ')':
+    *firstbyteptr = firstbyte;
+    *reqbyteptr = reqbyte;
+    *codeptr = code;
+    *ptrptr = ptr;
+    return TRUE;
+
+    /* Handle single-character metacharacters. In multiline mode, ^ disables
+    the setting of any following char as a first character. */
+
+    case '^':
+    if ((options & PCRE_MULTILINE) != 0)
+      {
+      if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+      }
+    previous = NULL;
+    *code++ = OP_CIRC;
+    break;
+
+    case '$':
+    previous = NULL;
+    *code++ = OP_DOLL;
+    break;
+
+    /* There can never be a first char if '.' is first, whatever happens about
+    repeats. The value of reqbyte doesn't change either. */
+
+    case '.':
+    if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+    zerofirstbyte = firstbyte;
+    zeroreqbyte = reqbyte;
+    previous = code;
+    *code++ = OP_ANY;
+    break;
+
+    /* Character classes. If the included characters are all < 255 in value, we
+    build a 32-byte bitmap of the permitted characters, except in the special
+    case where there is only one such character. For negated classes, we build
+    the map as usual, then invert it at the end. However, we use a different
+    opcode so that data characters > 255 can be handled correctly.
+
+    If the class contains characters outside the 0-255 range, a different
+    opcode is compiled. It may optionally have a bit map for characters < 256,
+    but those above are are explicitly listed afterwards. A flag byte tells
+    whether the bitmap is present, and whether this is a negated class or not.
+    */
+
+    case '[':
+    previous = code;
+
+    /* PCRE supports POSIX class stuff inside a class. Perl gives an error if
+    they are encountered at the top level, so we'll do that too. */
+
+    if ((ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') &&
+        check_posix_syntax(ptr, &tempptr, cd))
+      {
+      *errorcodeptr = (ptr[1] == ':')? ERR13 : ERR31;
+      goto FAILED;
+      }
+
+    /* If the first character is '^', set the negation flag and skip it. */
+
+    if ((c = *(++ptr)) == '^')
+      {
+      negate_class = TRUE;
+      c = *(++ptr);
+      }
+    else
+      {
+      negate_class = FALSE;
+      }
+
+    /* Keep a count of chars with values < 256 so that we can optimize the case
+    of just a single character (as long as it's < 256). For higher valued UTF-8
+    characters, we don't yet do any optimization. */
+
+    class_charcount = 0;
+    class_lastchar = -1;
+
+#ifdef SUPPORT_UTF8
+    class_utf8 = FALSE;                       /* No chars >= 256 */
+    class_utf8data = code + LINK_SIZE + 34;   /* For UTF-8 items */
+#endif
+
+    /* Initialize the 32-char bit map to all zeros. We have to build the
+    map in a temporary bit of store, in case the class contains only 1
+    character (< 256), because in that case the compiled code doesn't use the
+    bit map. */
+
+    memset(classbits, 0, 32 * sizeof(uschar));
+
+    /* Process characters until ] is reached. By writing this as a "do" it
+    means that an initial ] is taken as a data character. The first pass
+    through the regex checked the overall syntax, so we don't need to be very
+    strict here. At the start of the loop, c contains the first byte of the
+    character. */
+
+    do
+      {
+#ifdef SUPPORT_UTF8
+      if (utf8 && c > 127)
+        {                           /* Braces are required because the */
+        GETCHARLEN(c, ptr, ptr);    /* macro generates multiple statements */
+        }
+#endif
+
+      /* Inside \Q...\E everything is literal except \E */
+
+      if (inescq)
+        {
+        if (c == '\\' && ptr[1] == 'E')
+          {
+          inescq = FALSE;
+          ptr++;
+          continue;
+          }
+        else goto LONE_SINGLE_CHARACTER;
+        }
+
+      /* Handle POSIX class names. Perl allows a negation extension of the
+      form [:^name:]. A square bracket that doesn't match the syntax is
+      treated as a literal. We also recognize the POSIX constructions
+      [.ch.] and [=ch=] ("collating elements") and fault them, as Perl
+      5.6 and 5.8 do. */
+
+      if (c == '[' &&
+          (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') &&
+          check_posix_syntax(ptr, &tempptr, cd))
+        {
+        BOOL local_negate = FALSE;
+        int posix_class, i;
+        register const uschar *cbits = cd->cbits;
+
+        if (ptr[1] != ':')
+          {
+          *errorcodeptr = ERR31;
+          goto FAILED;
+          }
+
+        ptr += 2;
+        if (*ptr == '^')
+          {
+          local_negate = TRUE;
+          ptr++;
+          }
+
+        posix_class = check_posix_name(ptr, tempptr - ptr);
+        if (posix_class < 0)
+          {
+          *errorcodeptr = ERR30;
+          goto FAILED;
+          }
+
+        /* If matching is caseless, upper and lower are converted to
+        alpha. This relies on the fact that the class table starts with
+        alpha, lower, upper as the first 3 entries. */
+
+        if ((options & PCRE_CASELESS) != 0 && posix_class <= 2)
+          posix_class = 0;
+
+        /* Or into the map we are building up to 3 of the static class
+        tables, or their negations. The [:blank:] class sets up the same
+        chars as the [:space:] class (all white space). We remove the vertical
+        white space chars afterwards. */
+
+        posix_class *= 3;
+        for (i = 0; i < 3; i++)
+          {
+          BOOL blankclass = strncmp((char *)ptr, "blank", 5) == 0;
+          int taboffset = posix_class_maps[posix_class + i];
+          if (taboffset < 0) break;
+          if (local_negate)
+            {
+            if (i == 0)
+              for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+taboffset];
+            else
+              for (c = 0; c < 32; c++) classbits[c] &= ~cbits[c+taboffset];
+            if (blankclass) classbits[1] |= 0x3c;
+            }
+          else
+            {
+            for (c = 0; c < 32; c++) classbits[c] |= cbits[c+taboffset];
+            if (blankclass) classbits[1] &= ~0x3c;
+            }
+          }
+
+        ptr = tempptr + 1;
+        class_charcount = 10;  /* Set > 1; assumes more than 1 per class */
+        continue;    /* End of POSIX syntax handling */
+        }
+
+      /* Backslash may introduce a single character, or it may introduce one
+      of the specials, which just set a flag. Escaped items are checked for
+      validity in the pre-compiling pass. The sequence \b is a special case.
+      Inside a class (and only there) it is treated as backspace. Elsewhere
+      it marks a word boundary. Other escapes have preset maps ready to
+      or into the one we are building. We assume they have more than one
+      character in them, so set class_charcount bigger than one. */
+
+      if (c == '\\')
+        {
+        c = check_escape(&ptr, errorcodeptr, *brackets, options, TRUE);
+
+        if (-c == ESC_b) c = '\b';       /* \b is backslash in a class */
+        else if (-c == ESC_X) c = 'X';   /* \X is literal X in a class */
+        else if (-c == ESC_Q)            /* Handle start of quoted string */
+          {
+          if (ptr[1] == '\\' && ptr[2] == 'E')
+            {
+            ptr += 2; /* avoid empty string */
+            }
+          else inescq = TRUE;
+          continue;
+          }
+
+        if (c < 0)
+          {
+          register const uschar *cbits = cd->cbits;
+          class_charcount += 2;     /* Greater than 1 is what matters */
+          switch (-c)
+            {
+            case ESC_d:
+            for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_digit];
+            continue;
+
+            case ESC_D:
+            for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_digit];
+            continue;
+
+            case ESC_w:
+            for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_word];
+            continue;
+
+            case ESC_W:
+            for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_word];
+            continue;
+
+            case ESC_s:
+            for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_space];
+            classbits[1] &= ~0x08;   /* Perl 5.004 onwards omits VT from \s */
+            continue;
+
+            case ESC_S:
+            for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_space];
+            classbits[1] |= 0x08;    /* Perl 5.004 onwards omits VT from \s */
+            continue;
+
+#ifdef SUPPORT_UCP
+            case ESC_p:
+            case ESC_P:
+              {
+              BOOL negated;
+              int property = get_ucp(&ptr, &negated, errorcodeptr);
+              if (property < 0) goto FAILED;
+              class_utf8 = TRUE;
+              *class_utf8data++ = ((-c == ESC_p) != negated)?
+                XCL_PROP : XCL_NOTPROP;
+              *class_utf8data++ = property;
+              class_charcount -= 2;   /* Not a < 256 character */
+              }
+            continue;
+#endif
+
+            /* Unrecognized escapes are faulted if PCRE is running in its
+            strict mode. By default, for compatibility with Perl, they are
+            treated as literals. */
+
+            default:
+            if ((options & PCRE_EXTRA) != 0)
+              {
+              *errorcodeptr = ERR7;
+              goto FAILED;
+              }
+            c = *ptr;              /* The final character */
+            class_charcount -= 2;  /* Undo the default count from above */
+            }
+          }
+
+        /* Fall through if we have a single character (c >= 0). This may be
+        > 256 in UTF-8 mode. */
+
+        }   /* End of backslash handling */
+
+      /* A single character may be followed by '-' to form a range. However,
+      Perl does not permit ']' to be the end of the range. A '-' character
+      here is treated as a literal. */
+
+      if (ptr[1] == '-' && ptr[2] != ']')
+        {
+        int d;
+        ptr += 2;
+
+#ifdef SUPPORT_UTF8
+        if (utf8)
+          {                           /* Braces are required because the */
+          GETCHARLEN(d, ptr, ptr);    /* macro generates multiple statements */
+          }
+        else
+#endif
+        d = *ptr;  /* Not UTF-8 mode */
+
+        /* The second part of a range can be a single-character escape, but
+        not any of the other escapes. Perl 5.6 treats a hyphen as a literal
+        in such circumstances. */
+
+        if (d == '\\')
+          {
+          const uschar *oldptr = ptr;
+          d = check_escape(&ptr, errorcodeptr, *brackets, options, TRUE);
+
+          /* \b is backslash; \X is literal X; any other special means the '-'
+          was literal */
+
+          if (d < 0)
+            {
+            if (d == -ESC_b) d = '\b';
+            else if (d == -ESC_X) d = 'X'; else
+              {
+              ptr = oldptr - 2;
+              goto LONE_SINGLE_CHARACTER;  /* A few lines below */
+              }
+            }
+          }
+
+        /* The check that the two values are in the correct order happens in
+        the pre-pass. Optimize one-character ranges */
+
+        if (d == c) goto LONE_SINGLE_CHARACTER;  /* A few lines below */
+
+        /* In UTF-8 mode, if the upper limit is > 255, or > 127 for caseless
+        matching, we have to use an XCLASS with extra data items. Caseless
+        matching for characters > 127 is available only if UCP support is
+        available. */
+
+#ifdef SUPPORT_UTF8
+        if (utf8 && (d > 255 || ((options & PCRE_CASELESS) != 0 && d > 127)))
+          {
+          class_utf8 = TRUE;
+
+          /* With UCP support, we can find the other case equivalents of
+          the relevant characters. There may be several ranges. Optimize how
+          they fit with the basic range. */
+
+#ifdef SUPPORT_UCP
+          if ((options & PCRE_CASELESS) != 0)
+            {
+            int occ, ocd;
+            int cc = c;
+            int origd = d;
+            while (get_othercase_range(&cc, origd, &occ, &ocd))
+              {
+              if (occ >= c && ocd <= d) continue;  /* Skip embedded ranges */
+
+              if (occ < c  && ocd >= c - 1)        /* Extend the basic range */
+                {                                  /* if there is overlap,   */
+                c = occ;                           /* noting that if occ < c */
+                continue;                          /* we can't have ocd > d  */
+                }                                  /* because a subrange is  */
+              if (ocd > d && occ <= d + 1)         /* always shorter than    */
+                {                                  /* the basic range.       */
+                d = ocd;
+                continue;
+                }
+
+              if (occ == ocd)
+                {
+                *class_utf8data++ = XCL_SINGLE;
+                }
+              else
+                {
+                *class_utf8data++ = XCL_RANGE;
+                class_utf8data += _pcre_ord2utf8(occ, class_utf8data);
+                }
+              class_utf8data += _pcre_ord2utf8(ocd, class_utf8data);
+              }
+            }
+#endif  /* SUPPORT_UCP */
+
+          /* Now record the original range, possibly modified for UCP caseless
+          overlapping ranges. */
+
+          *class_utf8data++ = XCL_RANGE;
+          class_utf8data += _pcre_ord2utf8(c, class_utf8data);
+          class_utf8data += _pcre_ord2utf8(d, class_utf8data);
+
+          /* With UCP support, we are done. Without UCP support, there is no
+          caseless matching for UTF-8 characters > 127; we can use the bit map
+          for the smaller ones. */
+
+#ifdef SUPPORT_UCP
+          continue;    /* With next character in the class */
+#else
+          if ((options & PCRE_CASELESS) == 0 || c > 127) continue;
+
+          /* Adjust upper limit and fall through to set up the map */
+
+          d = 127;
+
+#endif  /* SUPPORT_UCP */
+          }
+#endif  /* SUPPORT_UTF8 */
+
+        /* We use the bit map for all cases when not in UTF-8 mode; else
+        ranges that lie entirely within 0-127 when there is UCP support; else
+        for partial ranges without UCP support. */
+
+        for (; c <= d; c++)
+          {
+          classbits[c/8] |= (1 << (c&7));
+          if ((options & PCRE_CASELESS) != 0)
+            {
+            int uc = cd->fcc[c];           /* flip case */
+            classbits[uc/8] |= (1 << (uc&7));
+            }
+          class_charcount++;                /* in case a one-char range */
+          class_lastchar = c;
+          }
+
+        continue;   /* Go get the next char in the class */
+        }
+
+      /* Handle a lone single character - we can get here for a normal
+      non-escape char, or after \ that introduces a single character or for an
+      apparent range that isn't. */
+
+      LONE_SINGLE_CHARACTER:
+
+      /* Handle a character that cannot go in the bit map */
+
+#ifdef SUPPORT_UTF8
+      if (utf8 && (c > 255 || ((options & PCRE_CASELESS) != 0 && c > 127)))
+        {
+        class_utf8 = TRUE;
+        *class_utf8data++ = XCL_SINGLE;
+        class_utf8data += _pcre_ord2utf8(c, class_utf8data);
+
+#ifdef SUPPORT_UCP
+        if ((options & PCRE_CASELESS) != 0)
+          {
+          int chartype;
+          int othercase;
+          if (_pcre_ucp_findchar(c, &chartype, &othercase) >= 0 &&
+               othercase > 0)
+            {
+            *class_utf8data++ = XCL_SINGLE;
+            class_utf8data += _pcre_ord2utf8(othercase, class_utf8data);
+            }
+          }
+#endif  /* SUPPORT_UCP */
+
+        }
+      else
+#endif  /* SUPPORT_UTF8 */
+
+      /* Handle a single-byte character */
+        {
+        classbits[c/8] |= (1 << (c&7));
+        if ((options & PCRE_CASELESS) != 0)
+          {
+          c = cd->fcc[c];   /* flip case */
+          classbits[c/8] |= (1 << (c&7));
+          }
+        class_charcount++;
+        class_lastchar = c;
+        }
+      }
+
+    /* Loop until ']' reached; the check for end of string happens inside the
+    loop. This "while" is the end of the "do" above. */
+
+    while ((c = *(++ptr)) != ']' || inescq);
+
+    /* If class_charcount is 1, we saw precisely one character whose value is
+    less than 256. In non-UTF-8 mode we can always optimize. In UTF-8 mode, we
+    can optimize the negative case only if there were no characters >= 128
+    because OP_NOT and the related opcodes like OP_NOTSTAR operate on
+    single-bytes only. This is an historical hangover. Maybe one day we can
+    tidy these opcodes to handle multi-byte characters.
+
+    The optimization throws away the bit map. We turn the item into a
+    1-character OP_CHAR[NC] if it's positive, or OP_NOT if it's negative. Note
+    that OP_NOT does not support multibyte characters. In the positive case, it
+    can cause firstbyte to be set. Otherwise, there can be no first char if
+    this item is first, whatever repeat count may follow. In the case of
+    reqbyte, save the previous value for reinstating. */
+
+#ifdef SUPPORT_UTF8
+    if (class_charcount == 1 &&
+          (!utf8 ||
+          (!class_utf8 && (!negate_class || class_lastchar < 128))))
+
+#else
+    if (class_charcount == 1)
+#endif
+      {
+      zeroreqbyte = reqbyte;
+
+      /* The OP_NOT opcode works on one-byte characters only. */
+
+      if (negate_class)
+        {
+        if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+        zerofirstbyte = firstbyte;
+        *code++ = OP_NOT;
+        *code++ = class_lastchar;
+        break;
+        }
+
+      /* For a single, positive character, get the value into mcbuffer, and
+      then we can handle this with the normal one-character code. */
+
+#ifdef SUPPORT_UTF8
+      if (utf8 && class_lastchar > 127)
+        mclength = _pcre_ord2utf8(class_lastchar, mcbuffer);
+      else
+#endif
+        {
+        mcbuffer[0] = class_lastchar;
+        mclength = 1;
+        }
+      goto ONE_CHAR;
+      }       /* End of 1-char optimization */
+
+    /* The general case - not the one-char optimization. If this is the first
+    thing in the branch, there can be no first char setting, whatever the
+    repeat count. Any reqbyte setting must remain unchanged after any kind of
+    repeat. */
+
+    if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+    zerofirstbyte = firstbyte;
+    zeroreqbyte = reqbyte;
+
+    /* If there are characters with values > 255, we have to compile an
+    extended class, with its own opcode. If there are no characters < 256,
+    we can omit the bitmap. */
+
+#ifdef SUPPORT_UTF8
+    if (class_utf8)
+      {
+      *class_utf8data++ = XCL_END;    /* Marks the end of extra data */
+      *code++ = OP_XCLASS;
+      code += LINK_SIZE;
+      *code = negate_class? XCL_NOT : 0;
+
+      /* If the map is required, install it, and move on to the end of
+      the extra data */
+
+      if (class_charcount > 0)
+        {
+        *code++ |= XCL_MAP;
+        memcpy(code, classbits, 32);
+        code = class_utf8data;
+        }
+
+      /* If the map is not required, slide down the extra data. */
+
+      else
+        {
+        int len = class_utf8data - (code + 33);
+        memmove(code + 1, code + 33, len);
+        code += len + 1;
+        }
+
+      /* Now fill in the complete length of the item */
+
+      PUT(previous, 1, code - previous);
+      break;   /* End of class handling */
+      }
+#endif
+
+    /* If there are no characters > 255, negate the 32-byte map if necessary,
+    and copy it into the code vector. If this is the first thing in the branch,
+    there can be no first char setting, whatever the repeat count. Any reqbyte
+    setting must remain unchanged after any kind of repeat. */
+
+    if (negate_class)
+      {
+      *code++ = OP_NCLASS;
+      for (c = 0; c < 32; c++) code[c] = ~classbits[c];
+      }
+    else
+      {
+      *code++ = OP_CLASS;
+      memcpy(code, classbits, 32);
+      }
+    code += 32;
+    break;
+
+    /* Various kinds of repeat; '{' is not necessarily a quantifier, but this
+    has been tested above. */
+
+    case '{':
+    if (!is_quantifier) goto NORMAL_CHAR;
+    ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorcodeptr);
+    if (*errorcodeptr != 0) goto FAILED;
+    goto REPEAT;
+
+    case '*':
+    repeat_min = 0;
+    repeat_max = -1;
+    goto REPEAT;
+
+    case '+':
+    repeat_min = 1;
+    repeat_max = -1;
+    goto REPEAT;
+
+    case '?':
+    repeat_min = 0;
+    repeat_max = 1;
+
+    REPEAT:
+    if (previous == NULL)
+      {
+      *errorcodeptr = ERR9;
+      goto FAILED;
+      }
+
+    if (repeat_min == 0)
+      {
+      firstbyte = zerofirstbyte;    /* Adjust for zero repeat */
+      reqbyte = zeroreqbyte;        /* Ditto */
+      }
+
+    /* Remember whether this is a variable length repeat */
+
+    reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY;
+
+    op_type = 0;                    /* Default single-char op codes */
+    possessive_quantifier = FALSE;  /* Default not possessive quantifier */
+
+    /* Save start of previous item, in case we have to move it up to make space
+    for an inserted OP_ONCE for the additional '+' extension. */
+
+    tempcode = previous;
+
+    /* If the next character is '+', we have a possessive quantifier. This
+    implies greediness, whatever the setting of the PCRE_UNGREEDY option.
+    If the next character is '?' this is a minimizing repeat, by default,
+    but if PCRE_UNGREEDY is set, it works the other way round. We change the
+    repeat type to the non-default. */
+
+    if (ptr[1] == '+')
+      {
+      repeat_type = 0;                  /* Force greedy */
+      possessive_quantifier = TRUE;
+      ptr++;
+      }
+    else if (ptr[1] == '?')
+      {
+      repeat_type = greedy_non_default;
+      ptr++;
+      }
+    else repeat_type = greedy_default;
+
+    /* If previous was a recursion, we need to wrap it inside brackets so that
+    it can be replicated if necessary. */
+
+    if (*previous == OP_RECURSE)
+      {
+      memmove(previous + 1 + LINK_SIZE, previous, 1 + LINK_SIZE);
+      code += 1 + LINK_SIZE;
+      *previous = OP_BRA;
+      PUT(previous, 1, code - previous);
+      *code = OP_KET;
+      PUT(code, 1, code - previous);
+      code += 1 + LINK_SIZE;
+      }
+
+    /* If previous was a character match, abolish the item and generate a
+    repeat item instead. If a char item has a minumum of more than one, ensure
+    that it is set in reqbyte - it might not be if a sequence such as x{3} is
+    the first thing in a branch because the x will have gone into firstbyte
+    instead.  */
+
+    if (*previous == OP_CHAR || *previous == OP_CHARNC)
+      {
+      /* Deal with UTF-8 characters that take up more than one byte. It's
+      easier to write this out separately than try to macrify it. Use c to
+      hold the length of the character in bytes, plus 0x80 to flag that it's a
+      length rather than a small character. */
+
+#ifdef SUPPORT_UTF8
+      if (utf8 && (code[-1] & 0x80) != 0)
+        {
+        uschar *lastchar = code - 1;
+        while((*lastchar & 0xc0) == 0x80) lastchar--;
+        c = code - lastchar;            /* Length of UTF-8 character */
+        memcpy(utf8_char, lastchar, c); /* Save the char */
+        c |= 0x80;                      /* Flag c as a length */
+        }
+      else
+#endif
+
+      /* Handle the case of a single byte - either with no UTF8 support, or
+      with UTF-8 disabled, or for a UTF-8 character < 128. */
+
+        {
+        c = code[-1];
+        if (repeat_min > 1) reqbyte = c | req_caseopt | cd->req_varyopt;
+        }
+
+      goto OUTPUT_SINGLE_REPEAT;   /* Code shared with single character types */
+      }
+
+    /* If previous was a single negated character ([^a] or similar), we use
+    one of the special opcodes, replacing it. The code is shared with single-
+    character repeats by setting opt_type to add a suitable offset into
+    repeat_type. OP_NOT is currently used only for single-byte chars. */
+
+    else if (*previous == OP_NOT)
+      {
+      op_type = OP_NOTSTAR - OP_STAR;  /* Use "not" opcodes */
+      c = previous[1];
+      goto OUTPUT_SINGLE_REPEAT;
+      }
+
+    /* If previous was a character type match (\d or similar), abolish it and
+    create a suitable repeat item. The code is shared with single-character
+    repeats by setting op_type to add a suitable offset into repeat_type. Note
+    the the Unicode property types will be present only when SUPPORT_UCP is
+    defined, but we don't wrap the little bits of code here because it just
+    makes it horribly messy. */
+
+    else if (*previous < OP_EODN)
+      {
+      uschar *oldcode;
+      int prop_type;
+      op_type = OP_TYPESTAR - OP_STAR;  /* Use type opcodes */
+      c = *previous;
+
+      OUTPUT_SINGLE_REPEAT:
+      prop_type = (*previous == OP_PROP || *previous == OP_NOTPROP)?
+        previous[1] : -1;
+
+      oldcode = code;
+      code = previous;                  /* Usually overwrite previous item */
+
+      /* If the maximum is zero then the minimum must also be zero; Perl allows
+      this case, so we do too - by simply omitting the item altogether. */
+
+      if (repeat_max == 0) goto END_REPEAT;
+
+      /* All real repeats make it impossible to handle partial matching (maybe
+      one day we will be able to remove this restriction). */
+
+      if (repeat_max != 1) cd->nopartial = TRUE;
+
+      /* Combine the op_type with the repeat_type */
+
+      repeat_type += op_type;
+
+      /* A minimum of zero is handled either as the special case * or ?, or as
+      an UPTO, with the maximum given. */
+
+      if (repeat_min == 0)
+        {
+        if (repeat_max == -1) *code++ = OP_STAR + repeat_type;
+          else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type;
+        else
+          {
+          *code++ = OP_UPTO + repeat_type;
+          PUT2INC(code, 0, repeat_max);
+          }
+        }
+
+      /* A repeat minimum of 1 is optimized into some special cases. If the
+      maximum is unlimited, we use OP_PLUS. Otherwise, the original item it
+      left in place and, if the maximum is greater than 1, we use OP_UPTO with
+      one less than the maximum. */
+
+      else if (repeat_min == 1)
+        {
+        if (repeat_max == -1)
+          *code++ = OP_PLUS + repeat_type;
+        else
+          {
+          code = oldcode;                 /* leave previous item in place */
+          if (repeat_max == 1) goto END_REPEAT;
+          *code++ = OP_UPTO + repeat_type;
+          PUT2INC(code, 0, repeat_max - 1);
+          }
+        }
+
+      /* The case {n,n} is just an EXACT, while the general case {n,m} is
+      handled as an EXACT followed by an UPTO. */
+
+      else
+        {
+        *code++ = OP_EXACT + op_type;  /* NB EXACT doesn't have repeat_type */
+        PUT2INC(code, 0, repeat_min);
+
+        /* If the maximum is unlimited, insert an OP_STAR. Before doing so,
+        we have to insert the character for the previous code. For a repeated
+        Unicode property match, there is an extra byte that defines the
+        required property. In UTF-8 mode, long characters have their length in
+        c, with the 0x80 bit as a flag. */
+
+        if (repeat_max < 0)
+          {
+#ifdef SUPPORT_UTF8
+          if (utf8 && c >= 128)
+            {
+            memcpy(code, utf8_char, c & 7);
+            code += c & 7;
+            }
+          else
+#endif
+            {
+            *code++ = c;
+            if (prop_type >= 0) *code++ = prop_type;
+            }
+          *code++ = OP_STAR + repeat_type;
+          }
+
+        /* Else insert an UPTO if the max is greater than the min, again
+        preceded by the character, for the previously inserted code. */
+
+        else if (repeat_max != repeat_min)
+          {
+#ifdef SUPPORT_UTF8
+          if (utf8 && c >= 128)
+            {
+            memcpy(code, utf8_char, c & 7);
+            code += c & 7;
+            }
+          else
+#endif
+          *code++ = c;
+          if (prop_type >= 0) *code++ = prop_type;
+          repeat_max -= repeat_min;
+          *code++ = OP_UPTO + repeat_type;
+          PUT2INC(code, 0, repeat_max);
+          }
+        }
+
+      /* The character or character type itself comes last in all cases. */
+
+#ifdef SUPPORT_UTF8
+      if (utf8 && c >= 128)
+        {
+        memcpy(code, utf8_char, c & 7);
+        code += c & 7;
+        }
+      else
+#endif
+      *code++ = c;
+
+      /* For a repeated Unicode property match, there is an extra byte that
+      defines the required property. */
+
+#ifdef SUPPORT_UCP
+      if (prop_type >= 0) *code++ = prop_type;
+#endif
+      }
+
+    /* If previous was a character class or a back reference, we put the repeat
+    stuff after it, but just skip the item if the repeat was {0,0}. */
+
+    else if (*previous == OP_CLASS ||
+             *previous == OP_NCLASS ||
+#ifdef SUPPORT_UTF8
+             *previous == OP_XCLASS ||
+#endif
+             *previous == OP_REF)
+      {
+      if (repeat_max == 0)
+        {
+        code = previous;
+        goto END_REPEAT;
+        }
+
+      /* All real repeats make it impossible to handle partial matching (maybe
+      one day we will be able to remove this restriction). */
+
+      if (repeat_max != 1) cd->nopartial = TRUE;
+
+      if (repeat_min == 0 && repeat_max == -1)
+        *code++ = OP_CRSTAR + repeat_type;
+      else if (repeat_min == 1 && repeat_max == -1)
+        *code++ = OP_CRPLUS + repeat_type;
+      else if (repeat_min == 0 && repeat_max == 1)
+        *code++ = OP_CRQUERY + repeat_type;
+      else
+        {
+        *code++ = OP_CRRANGE + repeat_type;
+        PUT2INC(code, 0, repeat_min);
+        if (repeat_max == -1) repeat_max = 0;  /* 2-byte encoding for max */
+        PUT2INC(code, 0, repeat_max);
+        }
+      }
+
+    /* If previous was a bracket group, we may have to replicate it in certain
+    cases. */
+
+    else if (*previous >= OP_BRA || *previous == OP_ONCE ||
+             *previous == OP_COND)
+      {
+      register int i;
+      int ketoffset = 0;
+      int len = code - previous;
+      uschar *bralink = NULL;
+
+      /* If the maximum repeat count is unlimited, find the end of the bracket
+      by scanning through from the start, and compute the offset back to it
+      from the current code pointer. There may be an OP_OPT setting following
+      the final KET, so we can't find the end just by going back from the code
+      pointer. */
+
+      if (repeat_max == -1)
+        {
+        register uschar *ket = previous;
+        do ket += GET(ket, 1); while (*ket != OP_KET);
+        ketoffset = code - ket;
+        }
+
+      /* The case of a zero minimum is special because of the need to stick
+      OP_BRAZERO in front of it, and because the group appears once in the
+      data, whereas in other cases it appears the minimum number of times. For
+      this reason, it is simplest to treat this case separately, as otherwise
+      the code gets far too messy. There are several special subcases when the
+      minimum is zero. */
+
+      if (repeat_min == 0)
+        {
+        /* If the maximum is also zero, we just omit the group from the output
+        altogether. */
+
+        if (repeat_max == 0)
+          {
+          code = previous;
+          goto END_REPEAT;
+          }
+
+        /* If the maximum is 1 or unlimited, we just have to stick in the
+        BRAZERO and do no more at this point. However, we do need to adjust
+        any OP_RECURSE calls inside the group that refer to the group itself or
+        any internal group, because the offset is from the start of the whole
+        regex. Temporarily terminate the pattern while doing this. */
+
+        if (repeat_max <= 1)
+          {
+          *code = OP_END;
+          adjust_recurse(previous, 1, utf8, cd);
+          memmove(previous+1, previous, len);
+          code++;
+          *previous++ = OP_BRAZERO + repeat_type;
+          }
+
+        /* If the maximum is greater than 1 and limited, we have to replicate
+        in a nested fashion, sticking OP_BRAZERO before each set of brackets.
+        The first one has to be handled carefully because it's the original
+        copy, which has to be moved up. The remainder can be handled by code
+        that is common with the non-zero minimum case below. We have to
+        adjust the value or repeat_max, since one less copy is required. Once
+        again, we may have to adjust any OP_RECURSE calls inside the group. */
+
+        else
+          {
+          int offset;
+          *code = OP_END;
+          adjust_recurse(previous, 2 + LINK_SIZE, utf8, cd);
+          memmove(previous + 2 + LINK_SIZE, previous, len);
+          code += 2 + LINK_SIZE;
+          *previous++ = OP_BRAZERO + repeat_type;
+          *previous++ = OP_BRA;
+
+          /* We chain together the bracket offset fields that have to be
+          filled in later when the ends of the brackets are reached. */
+
+          offset = (bralink == NULL)? 0 : previous - bralink;
+          bralink = previous;
+          PUTINC(previous, 0, offset);
+          }
+
+        repeat_max--;
+        }
+
+      /* If the minimum is greater than zero, replicate the group as many
+      times as necessary, and adjust the maximum to the number of subsequent
+      copies that we need. If we set a first char from the group, and didn't
+      set a required char, copy the latter from the former. */
+
+      else
+        {
+        if (repeat_min > 1)
+          {
+          if (groupsetfirstbyte && reqbyte < 0) reqbyte = firstbyte;
+          for (i = 1; i < repeat_min; i++)
+            {
+            memcpy(code, previous, len);
+            code += len;
+            }
+          }
+        if (repeat_max > 0) repeat_max -= repeat_min;
+        }
+
+      /* This code is common to both the zero and non-zero minimum cases. If
+      the maximum is limited, it replicates the group in a nested fashion,
+      remembering the bracket starts on a stack. In the case of a zero minimum,
+      the first one was set up above. In all cases the repeat_max now specifies
+      the number of additional copies needed. */
+
+      if (repeat_max >= 0)
+        {
+        for (i = repeat_max - 1; i >= 0; i--)
+          {
+          *code++ = OP_BRAZERO + repeat_type;
+
+          /* All but the final copy start a new nesting, maintaining the
+          chain of brackets outstanding. */
+
+          if (i != 0)
+            {
+            int offset;
+            *code++ = OP_BRA;
+            offset = (bralink == NULL)? 0 : code - bralink;
+            bralink = code;
+            PUTINC(code, 0, offset);
+            }
+
+          memcpy(code, previous, len);
+          code += len;
+          }
+
+        /* Now chain through the pending brackets, and fill in their length
+        fields (which are holding the chain links pro tem). */
+
+        while (bralink != NULL)
+          {
+          int oldlinkoffset;
+          int offset = code - bralink + 1;
+          uschar *bra = code - offset;
+          oldlinkoffset = GET(bra, 1);
+          bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset;
+          *code++ = OP_KET;
+          PUTINC(code, 0, offset);
+          PUT(bra, 1, offset);
+          }
+        }
+
+      /* If the maximum is unlimited, set a repeater in the final copy. We
+      can't just offset backwards from the current code point, because we
+      don't know if there's been an options resetting after the ket. The
+      correct offset was computed above. */
+
+      else code[-ketoffset] = OP_KETRMAX + repeat_type;
+      }
+
+    /* Else there's some kind of shambles */
+
+    else
+      {
+      *errorcodeptr = ERR11;
+      goto FAILED;
+      }
+
+    /* If the character following a repeat is '+', we wrap the entire repeated
+    item inside OP_ONCE brackets. This is just syntactic sugar, taken from
+    Sun's Java package. The repeated item starts at tempcode, not at previous,
+    which might be the first part of a string whose (former) last char we
+    repeated. However, we don't support '+' after a greediness '?'. */
+
+    if (possessive_quantifier)
+      {
+      int len = code - tempcode;
+      memmove(tempcode + 1+LINK_SIZE, tempcode, len);
+      code += 1 + LINK_SIZE;
+      len += 1 + LINK_SIZE;
+      tempcode[0] = OP_ONCE;
+      *code++ = OP_KET;
+      PUTINC(code, 0, len);
+      PUT(tempcode, 1, len);
+      }
+
+    /* In all case we no longer have a previous item. We also set the
+    "follows varying string" flag for subsequently encountered reqbytes if
+    it isn't already set and we have just passed a varying length item. */
+
+    END_REPEAT:
+    previous = NULL;
+    cd->req_varyopt |= reqvary;
+    break;
+
+
+    /* Start of nested bracket sub-expression, or comment or lookahead or
+    lookbehind or option setting or condition. First deal with special things
+    that can come after a bracket; all are introduced by ?, and the appearance
+    of any of them means that this is not a referencing group. They were
+    checked for validity in the first pass over the string, so we don't have to
+    check for syntax errors here.  */
+
+    case '(':
+    newoptions = options;
+    skipbytes = 0;
+
+    if (*(++ptr) == '?')
+      {
+      int set, unset;
+      int *optset;
+
+      switch (*(++ptr))
+        {
+        case '#':                 /* Comment; skip to ket */
+        ptr++;
+        while (*ptr != ')') ptr++;
+        continue;
+
+        case ':':                 /* Non-extracting bracket */
+        bravalue = OP_BRA;
+        ptr++;
+        break;
+
+        case '(':
+        bravalue = OP_COND;       /* Conditional group */
+
+        /* Condition to test for recursion */
+
+        if (ptr[1] == 'R')
+          {
+          code[1+LINK_SIZE] = OP_CREF;
+          PUT2(code, 2+LINK_SIZE, CREF_RECURSE);
+          skipbytes = 3;
+          ptr += 3;
+          }
+
+        /* Condition to test for a numbered subpattern match. We know that
+        if a digit follows ( then there will just be digits until ) because
+        the syntax was checked in the first pass. */
+
+        else if ((digitab[ptr[1]] && ctype_digit) != 0)
+          {
+          int condref;                 /* Don't amalgamate; some compilers */
+          condref = *(++ptr) - '0';    /* grumble at autoincrement in declaration */
+          while (*(++ptr) != ')') condref = condref*10 + *ptr - '0';
+          if (condref == 0)
+            {
+            *errorcodeptr = ERR35;
+            goto FAILED;
+            }
+          ptr++;
+          code[1+LINK_SIZE] = OP_CREF;
+          PUT2(code, 2+LINK_SIZE, condref);
+          skipbytes = 3;
+          }
+        /* For conditions that are assertions, we just fall through, having
+        set bravalue above. */
+        break;
+
+        case '=':                 /* Positive lookahead */
+        bravalue = OP_ASSERT;
+        ptr++;
+        break;
+
+        case '!':                 /* Negative lookahead */
+        bravalue = OP_ASSERT_NOT;
+        ptr++;
+        break;
+
+        case '<':                 /* Lookbehinds */
+        switch (*(++ptr))
+          {
+          case '=':               /* Positive lookbehind */
+          bravalue = OP_ASSERTBACK;
+          ptr++;
+          break;
+
+          case '!':               /* Negative lookbehind */
+          bravalue = OP_ASSERTBACK_NOT;
+          ptr++;
+          break;
+          }
+        break;
+
+        case '>':                 /* One-time brackets */
+        bravalue = OP_ONCE;
+        ptr++;
+        break;
+
+        case 'C':                 /* Callout - may be followed by digits; */
+        previous_callout = code;  /* Save for later completion */
+        after_manual_callout = 1; /* Skip one item before completing */
+        *code++ = OP_CALLOUT;     /* Already checked that the terminating */
+          {                       /* closing parenthesis is present. */
+          int n = 0;
+          while ((digitab[*(++ptr)] & ctype_digit) != 0)
+            n = n * 10 + *ptr - '0';
+          if (n > 255)
+            {
+            *errorcodeptr = ERR38;
+            goto FAILED;
+            }
+          *code++ = n;
+          PUT(code, 0, ptr - cd->start_pattern + 1);  /* Pattern offset */
+          PUT(code, LINK_SIZE, 0);                    /* Default length */
+          code += 2 * LINK_SIZE;
+          }
+        previous = NULL;
+        continue;
+
+        case 'P':                 /* Named subpattern handling */
+        if (*(++ptr) == '<')      /* Definition */
+          {
+          int i, namelen;
+          uschar *slot = cd->name_table;
+          const uschar *name;     /* Don't amalgamate; some compilers */
+          name = ++ptr;           /* grumble at autoincrement in declaration */
+
+          while (*ptr++ != '>');
+          namelen = ptr - name - 1;
+
+          for (i = 0; i < cd->names_found; i++)
+            {
+            int crc = memcmp(name, slot+2, namelen);
+            if (crc == 0)
+              {
+              if (slot[2+namelen] == 0)
+                {
+                *errorcodeptr = ERR43;
+                goto FAILED;
+                }
+              crc = -1;             /* Current name is substring */
+              }
+            if (crc < 0)
+              {
+              memmove(slot + cd->name_entry_size, slot,
+                (cd->names_found - i) * cd->name_entry_size);
+              break;
+              }
+            slot += cd->name_entry_size;
+            }
+
+          PUT2(slot, 0, *brackets + 1);
+          memcpy(slot + 2, name, namelen);
+          slot[2+namelen] = 0;
+          cd->names_found++;
+          goto NUMBERED_GROUP;
+          }
+
+        if (*ptr == '=' || *ptr == '>')  /* Reference or recursion */
+          {
+          int i, namelen;
+          int type = *ptr++;
+          const uschar *name = ptr;
+          uschar *slot = cd->name_table;
+
+          while (*ptr != ')') ptr++;
+          namelen = ptr - name;
+
+          for (i = 0; i < cd->names_found; i++)
+            {
+            if (strncmp((char *)name, (char *)slot+2, namelen) == 0) break;
+            slot += cd->name_entry_size;
+            }
+          if (i >= cd->names_found)
+            {
+            *errorcodeptr = ERR15;
+            goto FAILED;
+            }
+
+          recno = GET2(slot, 0);
+
+          if (type == '>') goto HANDLE_RECURSION;  /* A few lines below */
+
+          /* Back reference */
+
+          previous = code;
+          *code++ = OP_REF;
+          PUT2INC(code, 0, recno);
+          cd->backref_map |= (recno < 32)? (1 << recno) : 1;
+          if (recno > cd->top_backref) cd->top_backref = recno;
+          continue;
+          }
+
+        /* Should never happen */
+        break;
+
+        case 'R':                 /* Pattern recursion */
+        ptr++;                    /* Same as (?0)      */
+        /* Fall through */
+
+        /* Recursion or "subroutine" call */
+
+        case '0': case '1': case '2': case '3': case '4':
+        case '5': case '6': case '7': case '8': case '9':
+          {
+          const uschar *called;
+          recno = 0;
+          while((digitab[*ptr] & ctype_digit) != 0)
+            recno = recno * 10 + *ptr++ - '0';
+
+          /* Come here from code above that handles a named recursion */
+
+          HANDLE_RECURSION:
+
+          previous = code;
+
+          /* Find the bracket that is being referenced. Temporarily end the
+          regex in case it doesn't exist. */
+
+          *code = OP_END;
+          called = (recno == 0)?
+            cd->start_code : find_bracket(cd->start_code, utf8, recno);
+
+          if (called == NULL)
+            {
+            *errorcodeptr = ERR15;
+            goto FAILED;
+            }
+
+          /* If the subpattern is still open, this is a recursive call. We
+          check to see if this is a left recursion that could loop for ever,
+          and diagnose that case. */
+
+          if (GET(called, 1) == 0 && could_be_empty(called, code, bcptr, utf8))
+            {
+            *errorcodeptr = ERR40;
+            goto FAILED;
+            }
+
+          /* Insert the recursion/subroutine item */
+
+          *code = OP_RECURSE;
+          PUT(code, 1, called - cd->start_code);
+          code += 1 + LINK_SIZE;
+          }
+        continue;
+
+        /* Character after (? not specially recognized */
+
+        default:                  /* Option setting */
+        set = unset = 0;
+        optset = &set;
+
+        while (*ptr != ')' && *ptr != ':')
+          {
+          switch (*ptr++)
+            {
+            case '-': optset = &unset; break;
+
+            case 'i': *optset |= PCRE_CASELESS; break;
+            case 'm': *optset |= PCRE_MULTILINE; break;
+            case 's': *optset |= PCRE_DOTALL; break;
+            case 'x': *optset |= PCRE_EXTENDED; break;
+            case 'U': *optset |= PCRE_UNGREEDY; break;
+            case 'X': *optset |= PCRE_EXTRA; break;
+            }
+          }
+
+        /* Set up the changed option bits, but don't change anything yet. */
+
+        newoptions = (options | set) & (~unset);
+
+        /* If the options ended with ')' this is not the start of a nested
+        group with option changes, so the options change at this level. Compile
+        code to change the ims options if this setting actually changes any of
+        them. We also pass the new setting back so that it can be put at the
+        start of any following branches, and when this group ends (if we are in
+        a group), a resetting item can be compiled.
+
+        Note that if this item is right at the start of the pattern, the
+        options will have been abstracted and made global, so there will be no
+        change to compile. */
+
+        if (*ptr == ')')
+          {
+          if ((options & PCRE_IMS) != (newoptions & PCRE_IMS))
+            {
+            *code++ = OP_OPT;
+            *code++ = newoptions & PCRE_IMS;
+            }
+
+          /* Change options at this level, and pass them back for use
+          in subsequent branches. Reset the greedy defaults and the case
+          value for firstbyte and reqbyte. */
+
+          *optionsptr = options = newoptions;
+          greedy_default = ((newoptions & PCRE_UNGREEDY) != 0);
+          greedy_non_default = greedy_default ^ 1;
+          req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0;
+
+          previous = NULL;       /* This item can't be repeated */
+          continue;              /* It is complete */
+          }
+
+        /* If the options ended with ':' we are heading into a nested group
+        with possible change of options. Such groups are non-capturing and are
+        not assertions of any kind. All we need to do is skip over the ':';
+        the newoptions value is handled below. */
+
+        bravalue = OP_BRA;
+        ptr++;
+        }
+      }
+
+    /* If PCRE_NO_AUTO_CAPTURE is set, all unadorned brackets become
+    non-capturing and behave like (?:...) brackets */
+
+    else if ((options & PCRE_NO_AUTO_CAPTURE) != 0)
+      {
+      bravalue = OP_BRA;
+      }
+
+    /* Else we have a referencing group; adjust the opcode. If the bracket
+    number is greater than EXTRACT_BASIC_MAX, we set the opcode one higher, and
+    arrange for the true number to follow later, in an OP_BRANUMBER item. */
+
+    else
+      {
+      NUMBERED_GROUP:
+      if (++(*brackets) > EXTRACT_BASIC_MAX)
+        {
+        bravalue = OP_BRA + EXTRACT_BASIC_MAX + 1;
+        code[1+LINK_SIZE] = OP_BRANUMBER;
+        PUT2(code, 2+LINK_SIZE, *brackets);
+        skipbytes = 3;
+        }
+      else bravalue = OP_BRA + *brackets;
+      }
+
+    /* Process nested bracketed re. Assertions may not be repeated, but other
+    kinds can be. We copy code into a non-register variable in order to be able
+    to pass its address because some compilers complain otherwise. Pass in a
+    new setting for the ims options if they have changed. */
+
+    previous = (bravalue >= OP_ONCE)? code : NULL;
+    *code = bravalue;
+    tempcode = code;
+    tempreqvary = cd->req_varyopt;     /* Save value before bracket */
+
+    if (!compile_regex(
+         newoptions,                   /* The complete new option state */
+         options & PCRE_IMS,           /* The previous ims option state */
+         brackets,                     /* Extracting bracket count */
+         &tempcode,                    /* Where to put code (updated) */
+         &ptr,                         /* Input pointer (updated) */
+         errorcodeptr,                 /* Where to put an error message */
+         (bravalue == OP_ASSERTBACK ||
+          bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */
+         skipbytes,                    /* Skip over OP_COND/OP_BRANUMBER */
+         &subfirstbyte,                /* For possible first char */
+         &subreqbyte,                  /* For possible last char */
+         bcptr,                        /* Current branch chain */
+         cd))                          /* Tables block */
+      goto FAILED;
+
+    /* At the end of compiling, code is still pointing to the start of the
+    group, while tempcode has been updated to point past the end of the group
+    and any option resetting that may follow it. The pattern pointer (ptr)
+    is on the bracket. */
+
+    /* If this is a conditional bracket, check that there are no more than
+    two branches in the group. */
+
+    else if (bravalue == OP_COND)
+      {
+      uschar *tc = code;
+      condcount = 0;
+
+      do {
+         condcount++;
+         tc += GET(tc,1);
+         }
+      while (*tc != OP_KET);
+
+      if (condcount > 2)
+        {
+        *errorcodeptr = ERR27;
+        goto FAILED;
+        }
+
+      /* If there is just one branch, we must not make use of its firstbyte or
+      reqbyte, because this is equivalent to an empty second branch. */
+
+      if (condcount == 1) subfirstbyte = subreqbyte = REQ_NONE;
+      }
+
+    /* Handle updating of the required and first characters. Update for normal
+    brackets of all kinds, and conditions with two branches (see code above).
+    If the bracket is followed by a quantifier with zero repeat, we have to
+    back off. Hence the definition of zeroreqbyte and zerofirstbyte outside the
+    main loop so that they can be accessed for the back off. */
+
+    zeroreqbyte = reqbyte;
+    zerofirstbyte = firstbyte;
+    groupsetfirstbyte = FALSE;
+
+    if (bravalue >= OP_BRA || bravalue == OP_ONCE || bravalue == OP_COND)
+      {
+      /* If we have not yet set a firstbyte in this branch, take it from the
+      subpattern, remembering that it was set here so that a repeat of more
+      than one can replicate it as reqbyte if necessary. If the subpattern has
+      no firstbyte, set "none" for the whole branch. In both cases, a zero
+      repeat forces firstbyte to "none". */
+
+      if (firstbyte == REQ_UNSET)
+        {
+        if (subfirstbyte >= 0)
+          {
+          firstbyte = subfirstbyte;
+          groupsetfirstbyte = TRUE;
+          }
+        else firstbyte = REQ_NONE;
+        zerofirstbyte = REQ_NONE;
+        }
+
+      /* If firstbyte was previously set, convert the subpattern's firstbyte
+      into reqbyte if there wasn't one, using the vary flag that was in
+      existence beforehand. */
+
+      else if (subfirstbyte >= 0 && subreqbyte < 0)
+        subreqbyte = subfirstbyte | tempreqvary;
+
+      /* If the subpattern set a required byte (or set a first byte that isn't
+      really the first byte - see above), set it. */
+
+      if (subreqbyte >= 0) reqbyte = subreqbyte;
+      }
+
+    /* For a forward assertion, we take the reqbyte, if set. This can be
+    helpful if the pattern that follows the assertion doesn't set a different
+    char. For example, it's useful for /(?=abcde).+/. We can't set firstbyte
+    for an assertion, however because it leads to incorrect effect for patterns
+    such as /(?=a)a.+/ when the "real" "a" would then become a reqbyte instead
+    of a firstbyte. This is overcome by a scan at the end if there's no
+    firstbyte, looking for an asserted first char. */
+
+    else if (bravalue == OP_ASSERT && subreqbyte >= 0) reqbyte = subreqbyte;
+
+    /* Now update the main code pointer to the end of the group. */
+
+    code = tempcode;
+
+    /* Error if hit end of pattern */
+
+    if (*ptr != ')')
+      {
+      *errorcodeptr = ERR14;
+      goto FAILED;
+      }
+    break;
+
+    /* Check \ for being a real metacharacter; if not, fall through and handle
+    it as a data character at the start of a string. Escape items are checked
+    for validity in the pre-compiling pass. */
+
+    case '\\':
+    tempptr = ptr;
+    c = check_escape(&ptr, errorcodeptr, *brackets, options, FALSE);
+
+    /* Handle metacharacters introduced by \. For ones like \d, the ESC_ values
+    are arranged to be the negation of the corresponding OP_values. For the
+    back references, the values are ESC_REF plus the reference number. Only
+    back references and those types that consume a character may be repeated.
+    We can test for values between ESC_b and ESC_Z for the latter; this may
+    have to change if any new ones are ever created. */
+
+    if (c < 0)
+      {
+      if (-c == ESC_Q)            /* Handle start of quoted string */
+        {
+        if (ptr[1] == '\\' && ptr[2] == 'E') ptr += 2; /* avoid empty string */
+          else inescq = TRUE;
+        continue;
+        }
+
+      /* For metasequences that actually match a character, we disable the
+      setting of a first character if it hasn't already been set. */
+
+      if (firstbyte == REQ_UNSET && -c > ESC_b && -c < ESC_Z)
+        firstbyte = REQ_NONE;
+
+      /* Set values to reset to if this is followed by a zero repeat. */
+
+      zerofirstbyte = firstbyte;
+      zeroreqbyte = reqbyte;
+
+      /* Back references are handled specially */
+
+      if (-c >= ESC_REF)
+        {
+        int number = -c - ESC_REF;
+        previous = code;
+        *code++ = OP_REF;
+        PUT2INC(code, 0, number);
+        }
+
+      /* So are Unicode property matches, if supported. We know that get_ucp
+      won't fail because it was tested in the pre-pass. */
+
+#ifdef SUPPORT_UCP
+      else if (-c == ESC_P || -c == ESC_p)
+        {
+        BOOL negated;
+        int value = get_ucp(&ptr, &negated, errorcodeptr);
+        previous = code;
+        *code++ = ((-c == ESC_p) != negated)? OP_PROP : OP_NOTPROP;
+        *code++ = value;
+        }
+#endif
+
+      /* For the rest, we can obtain the OP value by negating the escape
+      value */
+
+      else
+        {
+        previous = (-c > ESC_b && -c < ESC_Z)? code : NULL;
+        *code++ = -c;
+        }
+      continue;
+      }
+
+    /* We have a data character whose value is in c. In UTF-8 mode it may have
+    a value > 127. We set its representation in the length/buffer, and then
+    handle it as a data character. */
+
+#ifdef SUPPORT_UTF8
+    if (utf8 && c > 127)
+      mclength = _pcre_ord2utf8(c, mcbuffer);
+    else
+#endif
+
+     {
+     mcbuffer[0] = c;
+     mclength = 1;
+     }
+
+    goto ONE_CHAR;
+
+    /* Handle a literal character. It is guaranteed not to be whitespace or #
+    when the extended flag is set. If we are in UTF-8 mode, it may be a
+    multi-byte literal character. */
+
+    default:
+    NORMAL_CHAR:
+    mclength = 1;
+    mcbuffer[0] = c;
+
+#ifdef SUPPORT_UTF8
+    if (utf8 && (c & 0xc0) == 0xc0)
+      {
+      while ((ptr[1] & 0xc0) == 0x80)
+        mcbuffer[mclength++] = *(++ptr);
+      }
+#endif
+
+    /* At this point we have the character's bytes in mcbuffer, and the length
+    in mclength. When not in UTF-8 mode, the length is always 1. */
+
+    ONE_CHAR:
+    previous = code;
+    *code++ = ((options & PCRE_CASELESS) != 0)? OP_CHARNC : OP_CHAR;
+    for (c = 0; c < mclength; c++) *code++ = mcbuffer[c];
+
+    /* Set the first and required bytes appropriately. If no previous first
+    byte, set it from this character, but revert to none on a zero repeat.
+    Otherwise, leave the firstbyte value alone, and don't change it on a zero
+    repeat. */
+
+    if (firstbyte == REQ_UNSET)
+      {
+      zerofirstbyte = REQ_NONE;
+      zeroreqbyte = reqbyte;
+
+      /* If the character is more than one byte long, we can set firstbyte
+      only if it is not to be matched caselessly. */
+
+      if (mclength == 1 || req_caseopt == 0)
+        {
+        firstbyte = mcbuffer[0] | req_caseopt;
+        if (mclength != 1) reqbyte = code[-1] | cd->req_varyopt;
+        }
+      else firstbyte = reqbyte = REQ_NONE;
+      }
+
+    /* firstbyte was previously set; we can set reqbyte only the length is
+    1 or the matching is caseful. */
+
+    else
+      {
+      zerofirstbyte = firstbyte;
+      zeroreqbyte = reqbyte;
+      if (mclength == 1 || req_caseopt == 0)
+        reqbyte = code[-1] | req_caseopt | cd->req_varyopt;
+      }
+
+    break;            /* End of literal character handling */
+    }
+  }                   /* end of big loop */
+
+/* Control never reaches here by falling through, only by a goto for all the
+error states. Pass back the position in the pattern so that it can be displayed
+to the user for diagnosing the error. */
+
+FAILED:
+*ptrptr = ptr;
+return FALSE;
+}
+
+
+
+
+/*************************************************
+*     Compile sequence of alternatives           *
+*************************************************/
+
+/* On entry, ptr is pointing past the bracket character, but on return
+it points to the closing bracket, or vertical bar, or end of string.
+The code variable is pointing at the byte into which the BRA operator has been
+stored. If the ims options are changed at the start (for a (?ims: group) or
+during any branch, we need to insert an OP_OPT item at the start of every
+following branch to ensure they get set correctly at run time, and also pass
+the new options into every subsequent branch compile.
+
+Argument:
+  options        option bits, including any changes for this subpattern
+  oldims         previous settings of ims option bits
+  brackets       -> int containing the number of extracting brackets used
+  codeptr        -> the address of the current code pointer
+  ptrptr         -> the address of the current pattern pointer
+  errorcodeptr   -> pointer to error code variable
+  lookbehind     TRUE if this is a lookbehind assertion
+  skipbytes      skip this many bytes at start (for OP_COND, OP_BRANUMBER)
+  firstbyteptr   place to put the first required character, or a negative number
+  reqbyteptr     place to put the last required character, or a negative number
+  bcptr          pointer to the chain of currently open branches
+  cd             points to the data block with tables pointers etc.
+
+Returns:      TRUE on success
+*/
+
+static BOOL
+compile_regex(int options, int oldims, int *brackets, uschar **codeptr,
+  const uschar **ptrptr, int *errorcodeptr, BOOL lookbehind, int skipbytes,
+  int *firstbyteptr, int *reqbyteptr, branch_chain *bcptr, compile_data *cd)
+{
+const uschar *ptr = *ptrptr;
+uschar *code = *codeptr;
+uschar *last_branch = code;
+uschar *start_bracket = code;
+uschar *reverse_count = NULL;
+int firstbyte, reqbyte;
+int branchfirstbyte, branchreqbyte;
+branch_chain bc;
+
+bc.outer = bcptr;
+bc.current = code;
+
+firstbyte = reqbyte = REQ_UNSET;
+
+/* Offset is set zero to mark that this bracket is still open */
+
+PUT(code, 1, 0);
+code += 1 + LINK_SIZE + skipbytes;
+
+/* Loop for each alternative branch */
+
+for (;;)
+  {
+  /* Handle a change of ims options at the start of the branch */
+
+  if ((options & PCRE_IMS) != oldims)
+    {
+    *code++ = OP_OPT;
+    *code++ = options & PCRE_IMS;
+    }
+
+  /* Set up dummy OP_REVERSE if lookbehind assertion */
+
+  if (lookbehind)
+    {
+    *code++ = OP_REVERSE;
+    reverse_count = code;
+    PUTINC(code, 0, 0);
+    }
+
+  /* Now compile the branch */
+
+  if (!compile_branch(&options, brackets, &code, &ptr, errorcodeptr,
+        &branchfirstbyte, &branchreqbyte, &bc, cd))
+    {
+    *ptrptr = ptr;
+    return FALSE;
+    }
+
+  /* If this is the first branch, the firstbyte and reqbyte values for the
+  branch become the values for the regex. */
+
+  if (*last_branch != OP_ALT)
+    {
+    firstbyte = branchfirstbyte;
+    reqbyte = branchreqbyte;
+    }
+
+  /* If this is not the first branch, the first char and reqbyte have to
+  match the values from all the previous branches, except that if the previous
+  value for reqbyte didn't have REQ_VARY set, it can still match, and we set
+  REQ_VARY for the regex. */
+
+  else
+    {
+    /* If we previously had a firstbyte, but it doesn't match the new branch,
+    we have to abandon the firstbyte for the regex, but if there was previously
+    no reqbyte, it takes on the value of the old firstbyte. */
+
+    if (firstbyte >= 0 && firstbyte != branchfirstbyte)
+      {
+      if (reqbyte < 0) reqbyte = firstbyte;
+      firstbyte = REQ_NONE;
+      }
+
+    /* If we (now or from before) have no firstbyte, a firstbyte from the
+    branch becomes a reqbyte if there isn't a branch reqbyte. */
+
+    if (firstbyte < 0 && branchfirstbyte >= 0 && branchreqbyte < 0)
+        branchreqbyte = branchfirstbyte;
+
+    /* Now ensure that the reqbytes match */
+
+    if ((reqbyte & ~REQ_VARY) != (branchreqbyte & ~REQ_VARY))
+      reqbyte = REQ_NONE;
+    else reqbyte |= branchreqbyte;   /* To "or" REQ_VARY */
+    }
+
+  /* If lookbehind, check that this branch matches a fixed-length string,
+  and put the length into the OP_REVERSE item. Temporarily mark the end of
+  the branch with OP_END. */
+
+  if (lookbehind)
+    {
+    int length;
+    *code = OP_END;
+    length = find_fixedlength(last_branch, options);
+    DPRINTF(("fixed length = %d\n", length));
+    if (length < 0)
+      {
+      *errorcodeptr = (length == -2)? ERR36 : ERR25;
+      *ptrptr = ptr;
+      return FALSE;
+      }
+    PUT(reverse_count, 0, length);
+    }
+
+  /* Reached end of expression, either ')' or end of pattern. Go back through
+  the alternative branches and reverse the chain of offsets, with the field in
+  the BRA item now becoming an offset to the first alternative. If there are
+  no alternatives, it points to the end of the group. The length in the
+  terminating ket is always the length of the whole bracketed item. If any of
+  the ims options were changed inside the group, compile a resetting op-code
+  following, except at the very end of the pattern. Return leaving the pointer
+  at the terminating char. */
+
+  if (*ptr != '|')
+    {
+    int length = code - last_branch;
+    do
+      {
+      int prev_length = GET(last_branch, 1);
+      PUT(last_branch, 1, length);
+      length = prev_length;
+      last_branch -= length;
+      }
+    while (length > 0);
+
+    /* Fill in the ket */
+
+    *code = OP_KET;
+    PUT(code, 1, code - start_bracket);
+    code += 1 + LINK_SIZE;
+
+    /* Resetting option if needed */
+
+    if ((options & PCRE_IMS) != oldims && *ptr == ')')
+      {
+      *code++ = OP_OPT;
+      *code++ = oldims;
+      }
+
+    /* Set values to pass back */
+
+    *codeptr = code;
+    *ptrptr = ptr;
+    *firstbyteptr = firstbyte;
+    *reqbyteptr = reqbyte;
+    return TRUE;
+    }
+
+  /* Another branch follows; insert an "or" node. Its length field points back
+  to the previous branch while the bracket remains open. At the end the chain
+  is reversed. It's done like this so that the start of the bracket has a
+  zero offset until it is closed, making it possible to detect recursion. */
+
+  *code = OP_ALT;
+  PUT(code, 1, code - last_branch);
+  bc.current = last_branch = code;
+  code += 1 + LINK_SIZE;
+  ptr++;
+  }
+/* Control never reaches here */
+}
+
+
+
+
+/*************************************************
+*          Check for anchored expression         *
+*************************************************/
+
+/* Try to find out if this is an anchored regular expression. Consider each
+alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket
+all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then
+it's anchored. However, if this is a multiline pattern, then only OP_SOD
+counts, since OP_CIRC can match in the middle.
+
+We can also consider a regex to be anchored if OP_SOM starts all its branches.
+This is the code for \G, which means "match at start of match position, taking
+into account the match offset".
+
+A branch is also implicitly anchored if it starts with .* and DOTALL is set,
+because that will try the rest of the pattern at all possible matching points,
+so there is no point trying again.... er ....
+
+.... except when the .* appears inside capturing parentheses, and there is a
+subsequent back reference to those parentheses. We haven't enough information
+to catch that case precisely.
+
+At first, the best we could do was to detect when .* was in capturing brackets
+and the highest back reference was greater than or equal to that level.
+However, by keeping a bitmap of the first 31 back references, we can catch some
+of the more common cases more precisely.
+
+Arguments:
+  code           points to start of expression (the bracket)
+  options        points to the options setting
+  bracket_map    a bitmap of which brackets we are inside while testing; this
+                  handles up to substring 31; after that we just have to take
+                  the less precise approach
+  backref_map    the back reference bitmap
+
+Returns:     TRUE or FALSE
+*/
+
+static BOOL
+is_anchored(register const uschar *code, int *options, unsigned int bracket_map,
+  unsigned int backref_map)
+{
+do {
+   const uschar *scode =
+     first_significant_code(code + 1+LINK_SIZE, options, PCRE_MULTILINE, FALSE);
+   register int op = *scode;
+
+   /* Capturing brackets */
+
+   if (op > OP_BRA)
+     {
+     int new_map;
+     op -= OP_BRA;
+     if (op > EXTRACT_BASIC_MAX) op = GET2(scode, 2+LINK_SIZE);
+     new_map = bracket_map | ((op < 32)? (1 << op) : 1);
+     if (!is_anchored(scode, options, new_map, backref_map)) return FALSE;
+     }
+
+   /* Other brackets */
+
+   else if (op == OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
+     {
+     if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE;
+     }
+
+   /* .* is not anchored unless DOTALL is set and it isn't in brackets that
+   are or may be referenced. */
+
+   else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR) &&
+            (*options & PCRE_DOTALL) != 0)
+     {
+     if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE;
+     }
+
+   /* Check for explicit anchoring */
+
+   else if (op != OP_SOD && op != OP_SOM &&
+           ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC))
+     return FALSE;
+   code += GET(code, 1);
+   }
+while (*code == OP_ALT);   /* Loop for each alternative */
+return TRUE;
+}
+
+
+
+/*************************************************
+*         Check for starting with ^ or .*        *
+*************************************************/
+
+/* This is called to find out if every branch starts with ^ or .* so that
+"first char" processing can be done to speed things up in multiline
+matching and for non-DOTALL patterns that start with .* (which must start at
+the beginning or after \n). As in the case of is_anchored() (see above), we
+have to take account of back references to capturing brackets that contain .*
+because in that case we can't make the assumption.
+
+Arguments:
+  code           points to start of expression (the bracket)
+  bracket_map    a bitmap of which brackets we are inside while testing; this
+                  handles up to substring 31; after that we just have to take
+                  the less precise approach
+  backref_map    the back reference bitmap
+
+Returns:         TRUE or FALSE
+*/
+
+static BOOL
+is_startline(const uschar *code, unsigned int bracket_map,
+  unsigned int backref_map)
+{
+do {
+   const uschar *scode = first_significant_code(code + 1+LINK_SIZE, NULL, 0,
+     FALSE);
+   register int op = *scode;
+
+   /* Capturing brackets */
+
+   if (op > OP_BRA)
+     {
+     int new_map;
+     op -= OP_BRA;
+     if (op > EXTRACT_BASIC_MAX) op = GET2(scode, 2+LINK_SIZE);
+     new_map = bracket_map | ((op < 32)? (1 << op) : 1);
+     if (!is_startline(scode, new_map, backref_map)) return FALSE;
+     }
+
+   /* Other brackets */
+
+   else if (op == OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
+     { if (!is_startline(scode, bracket_map, backref_map)) return FALSE; }
+
+   /* .* means "start at start or after \n" if it isn't in brackets that
+   may be referenced. */
+
+   else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR)
+     {
+     if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE;
+     }
+
+   /* Check for explicit circumflex */
+
+   else if (op != OP_CIRC) return FALSE;
+
+   /* Move on to the next alternative */
+
+   code += GET(code, 1);
+   }
+while (*code == OP_ALT);  /* Loop for each alternative */
+return TRUE;
+}
+
+
+
+/*************************************************
+*       Check for asserted fixed first char      *
+*************************************************/
+
+/* During compilation, the "first char" settings from forward assertions are
+discarded, because they can cause conflicts with actual literals that follow.
+However, if we end up without a first char setting for an unanchored pattern,
+it is worth scanning the regex to see if there is an initial asserted first
+char. If all branches start with the same asserted char, or with a bracket all
+of whose alternatives start with the same asserted char (recurse ad lib), then
+we return that char, otherwise -1.
+
+Arguments:
+  code       points to start of expression (the bracket)
+  options    pointer to the options (used to check casing changes)
+  inassert   TRUE if in an assertion
+
+Returns:     -1 or the fixed first char
+*/
+
+static int
+find_firstassertedchar(const uschar *code, int *options, BOOL inassert)
+{
+register int c = -1;
+do {
+   int d;
+   const uschar *scode =
+     first_significant_code(code + 1+LINK_SIZE, options, PCRE_CASELESS, TRUE);
+   register int op = *scode;
+
+   if (op >= OP_BRA) op = OP_BRA;
+
+   switch(op)
+     {
+     default:
+     return -1;
+
+     case OP_BRA:
+     case OP_ASSERT:
+     case OP_ONCE:
+     case OP_COND:
+     if ((d = find_firstassertedchar(scode, options, op == OP_ASSERT)) < 0)
+       return -1;
+     if (c < 0) c = d; else if (c != d) return -1;
+     break;
+
+     case OP_EXACT:       /* Fall through */
+     scode += 2;
+
+     case OP_CHAR:
+     case OP_CHARNC:
+     case OP_PLUS:
+     case OP_MINPLUS:
+     if (!inassert) return -1;
+     if (c < 0)
+       {
+       c = scode[1];
+       if ((*options & PCRE_CASELESS) != 0) c |= REQ_CASELESS;
+       }
+     else if (c != scode[1]) return -1;
+     break;
+     }
+
+   code += GET(code, 1);
+   }
+while (*code == OP_ALT);
+return c;
+}
+
+
+
+/*************************************************
+*        Compile a Regular Expression            *
+*************************************************/
+
+/* This function takes a string and returns a pointer to a block of store
+holding a compiled version of the expression. The original API for this
+function had no error code return variable; it is retained for backwards
+compatibility. The new function is given a new name.
+
+Arguments:
+  pattern       the regular expression
+  options       various option bits
+  errorcodeptr  pointer to error code variable (pcre_compile2() only)
+                  can be NULL if you don't want a code value
+  errorptr      pointer to pointer to error text
+  erroroffset   ptr offset in pattern where error was detected
+  tables        pointer to character tables or NULL
+
+Returns:        pointer to compiled data block, or NULL on error,
+                with errorptr and erroroffset set
+*/
+
+PCRE_EXPORT pcre *
+pcre_compile(const char *pattern, int options, const char **errorptr,
+  int *erroroffset, const unsigned char *tables)
+{
+return pcre_compile2(pattern, options, NULL, errorptr, erroroffset, tables);
+}
+
+
+PCRE_EXPORT pcre *
+pcre_compile2(const char *pattern, int options, int *errorcodeptr,
+  const char **errorptr, int *erroroffset, const unsigned char *tables)
+{
+real_pcre *re;
+int length = 1 + LINK_SIZE;      /* For initial BRA plus length */
+int c, firstbyte, reqbyte;
+int bracount = 0;
+int branch_extra = 0;
+int branch_newextra;
+int item_count = -1;
+int name_count = 0;
+int max_name_size = 0;
+int lastitemlength = 0;
+int errorcode = 0;
+#ifdef SUPPORT_UTF8
+BOOL utf8;
+BOOL class_utf8;
+#endif
+BOOL inescq = FALSE;
+BOOL capturing;
+unsigned int brastackptr = 0;
+size_t size;
+uschar *code;
+const uschar *codestart;
+const uschar *ptr;
+compile_data compile_block;
+int brastack[BRASTACK_SIZE];
+uschar bralenstack[BRASTACK_SIZE];
+
+/* We can't pass back an error message if errorptr is NULL; I guess the best we
+can do is just return NULL, but we can set a code value if there is a code
+pointer. */
+
+if (errorptr == NULL)
+  {
+  if (errorcodeptr != NULL) *errorcodeptr = 99;
+  return NULL;
+  }
+
+*errorptr = NULL;
+if (errorcodeptr != NULL) *errorcodeptr = ERR0;
+
+/* However, we can give a message for this error */
+
+if (erroroffset == NULL)
+  {
+  errorcode = ERR16;
+  goto PCRE_EARLY_ERROR_RETURN;
+  }
+
+*erroroffset = 0;
+
+/* Can't support UTF8 unless PCRE has been compiled to include the code. */
+
+#ifdef SUPPORT_UTF8
+utf8 = (options & PCRE_UTF8) != 0;
+if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0 &&
+     (*erroroffset = _pcre_valid_utf8((uschar *)pattern, -1)) >= 0)
+  {
+  errorcode = ERR44;
+  goto PCRE_EARLY_ERROR_RETURN;
+  }
+#else
+if ((options & PCRE_UTF8) != 0)
+  {
+  errorcode = ERR32;
+  goto PCRE_EARLY_ERROR_RETURN;
+  }
+#endif
+
+if ((options & ~PUBLIC_OPTIONS) != 0)
+  {
+  errorcode = ERR17;
+  goto PCRE_EARLY_ERROR_RETURN;
+  }
+
+/* Set up pointers to the individual character tables */
+
+if (tables == NULL) tables = _pcre_default_tables;
+compile_block.lcc = tables + lcc_offset;
+compile_block.fcc = tables + fcc_offset;
+compile_block.cbits = tables + cbits_offset;
+compile_block.ctypes = tables + ctypes_offset;
+
+/* Maximum back reference and backref bitmap. This is updated for numeric
+references during the first pass, but for named references during the actual
+compile pass. The bitmap records up to 31 back references to help in deciding
+whether (.*) can be treated as anchored or not. */
+
+compile_block.top_backref = 0;
+compile_block.backref_map = 0;
+
+/* Reflect pattern for debugging output */
+
+DPRINTF(("------------------------------------------------------------------\n"));
+DPRINTF(("%s\n", pattern));
+
+/* The first thing to do is to make a pass over the pattern to compute the
+amount of store required to hold the compiled code. This does not have to be
+perfect as long as errors are overestimates. At the same time we can detect any
+flag settings right at the start, and extract them. Make an attempt to correct
+for any counted white space if an "extended" flag setting appears late in the
+pattern. We can't be so clever for #-comments. */
+
+ptr = (const uschar *)(pattern - 1);
+while ((c = *(++ptr)) != 0)
+  {
+  int min, max;
+  int class_optcount;
+  int bracket_length;
+  int duplength;
+
+  /* If we are inside a \Q...\E sequence, all chars are literal */
+
+  if (inescq)
+    {
+    if ((options & PCRE_AUTO_CALLOUT) != 0) length += 2 + 2*LINK_SIZE;
+    goto NORMAL_CHAR;
+    }
+
+  /* Otherwise, first check for ignored whitespace and comments */
+
+  if ((options & PCRE_EXTENDED) != 0)
+    {
+    if ((compile_block.ctypes[c] & ctype_space) != 0) continue;
+    if (c == '#')
+      {
+      /* The space before the ; is to avoid a warning on a silly compiler
+      on the Macintosh. */
+      while ((c = *(++ptr)) != 0 && c != NEWLINE) ;
+      if (c == 0) break;
+      continue;
+      }
+    }
+
+  item_count++;    /* Is zero for the first non-comment item */
+
+  /* Allow space for auto callout before every item except quantifiers. */
+
+  if ((options & PCRE_AUTO_CALLOUT) != 0 &&
+       c != '*' && c != '+' && c != '?' &&
+       (c != '{' || !is_counted_repeat(ptr + 1)))
+    length += 2 + 2*LINK_SIZE;
+
+  switch(c)
+    {
+    /* A backslashed item may be an escaped data character or it may be a
+    character type. */
+
+    case '\\':
+    c = check_escape(&ptr, &errorcode, bracount, options, FALSE);
+    if (errorcode != 0) goto PCRE_ERROR_RETURN;
+
+    lastitemlength = 1;     /* Default length of last item for repeats */
+
+    if (c >= 0)             /* Data character */
+      {
+      length += 2;          /* For a one-byte character */
+
+#ifdef SUPPORT_UTF8
+      if (utf8 && c > 127)
+        {
+        int i;
+        for (i = 0; i < _pcre_utf8_table1_size; i++)
+          if (c <= _pcre_utf8_table1[i]) break;
+        length += i;
+        lastitemlength += i;
+        }
+#endif
+
+      continue;
+      }
+
+    /* If \Q, enter "literal" mode */
+
+    if (-c == ESC_Q)
+      {
+      inescq = TRUE;
+      continue;
+      }
+
+    /* \X is supported only if Unicode property support is compiled */
+
+#ifndef SUPPORT_UCP
+    if (-c == ESC_X)
+      {
+      errorcode = ERR45;
+      goto PCRE_ERROR_RETURN;
+      }
+#endif
+
+    /* \P and \p are for Unicode properties, but only when the support has
+    been compiled. Each item needs 2 bytes. */
+
+    else if (-c == ESC_P || -c == ESC_p)
+      {
+#ifdef SUPPORT_UCP
+      BOOL negated;
+      length += 2;
+      lastitemlength = 2;
+      if (get_ucp(&ptr, &negated, &errorcode) < 0) goto PCRE_ERROR_RETURN;
+      continue;
+#else
+      errorcode = ERR45;
+      goto PCRE_ERROR_RETURN;
+#endif
+      }
+
+    /* Other escapes need one byte */
+
+    length++;
+
+    /* A back reference needs an additional 2 bytes, plus either one or 5
+    bytes for a repeat. We also need to keep the value of the highest
+    back reference. */
+
+    if (c <= -ESC_REF)
+      {
+      int refnum = -c - ESC_REF;
+      compile_block.backref_map |= (refnum < 32)? (1 << refnum) : 1;
+      if (refnum > compile_block.top_backref)
+        compile_block.top_backref = refnum;
+      length += 2;   /* For single back reference */
+      if (ptr[1] == '{' && is_counted_repeat(ptr+2))
+        {
+        ptr = read_repeat_counts(ptr+2, &min, &max, &errorcode);
+        if (errorcode != 0) goto PCRE_ERROR_RETURN;
+        if ((min == 0 && (max == 1 || max == -1)) ||
+          (min == 1 && max == -1))
+            length++;
+        else length += 5;
+        if (ptr[1] == '?') ptr++;
+        }
+      }
+    continue;
+
+    case '^':     /* Single-byte metacharacters */
+    case '.':
+    case '$':
+    length++;
+    lastitemlength = 1;
+    continue;
+
+    case '*':            /* These repeats won't be after brackets; */
+    case '+':            /* those are handled separately */
+    case '?':
+    length++;
+    goto POSESSIVE;      /* A few lines below */
+
+    /* This covers the cases of braced repeats after a single char, metachar,
+    class, or back reference. */
+
+    case '{':
+    if (!is_counted_repeat(ptr+1)) goto NORMAL_CHAR;
+    ptr = read_repeat_counts(ptr+1, &min, &max, &errorcode);
+    if (errorcode != 0) goto PCRE_ERROR_RETURN;
+
+    /* These special cases just insert one extra opcode */
+
+    if ((min == 0 && (max == 1 || max == -1)) ||
+      (min == 1 && max == -1))
+        length++;
+
+    /* These cases might insert additional copies of a preceding character. */
+
+    else
+      {
+      if (min != 1)
+        {
+        length -= lastitemlength;   /* Uncount the original char or metachar */
+        if (min > 0) length += 3 + lastitemlength;
+        }
+      length += lastitemlength + ((max > 0)? 3 : 1);
+      }
+
+    if (ptr[1] == '?') ptr++;      /* Needs no extra length */
+
+    POSESSIVE:                     /* Test for possessive quantifier */
+    if (ptr[1] == '+')
+      {
+      ptr++;
+      length += 2 + 2*LINK_SIZE;   /* Allow for atomic brackets */
+      }
+    continue;
+
+    /* An alternation contains an offset to the next branch or ket. If any ims
+    options changed in the previous branch(es), and/or if we are in a
+    lookbehind assertion, extra space will be needed at the start of the
+    branch. This is handled by branch_extra. */
+
+    case '|':
+    length += 1 + LINK_SIZE + branch_extra;
+    continue;
+
+    /* A character class uses 33 characters provided that all the character
+    values are less than 256. Otherwise, it uses a bit map for low valued
+    characters, and individual items for others. Don't worry about character
+    types that aren't allowed in classes - they'll get picked up during the
+    compile. A character class that contains only one single-byte character
+    uses 2 or 3 bytes, depending on whether it is negated or not. Notice this
+    where we can. (In UTF-8 mode we can do this only for chars < 128.) */
+
+    case '[':
+    if (*(++ptr) == '^')
+      {
+      class_optcount = 10;  /* Greater than one */
+      ptr++;
+      }
+    else class_optcount = 0;
+
+#ifdef SUPPORT_UTF8
+    class_utf8 = FALSE;
+#endif
+
+    /* Written as a "do" so that an initial ']' is taken as data */
+
+    if (*ptr != 0) do
+      {
+      /* Inside \Q...\E everything is literal except \E */
+
+      if (inescq)
+        {
+        if (*ptr != '\\' || ptr[1] != 'E') goto GET_ONE_CHARACTER;
+        inescq = FALSE;
+        ptr += 1;
+        continue;
+        }
+
+      /* Outside \Q...\E, check for escapes */
+
+      if (*ptr == '\\')
+        {
+        c = check_escape(&ptr, &errorcode, bracount, options, TRUE);
+        if (errorcode != 0) goto PCRE_ERROR_RETURN;
+
+        /* \b is backspace inside a class; \X is literal */
+
+        if (-c == ESC_b) c = '\b';
+        else if (-c == ESC_X) c = 'X';
+
+        /* \Q enters quoting mode */
+
+        else if (-c == ESC_Q)
+          {
+          inescq = TRUE;
+          continue;
+          }
+
+        /* Handle escapes that turn into characters */
+
+        if (c >= 0) goto NON_SPECIAL_CHARACTER;
+
+        /* Escapes that are meta-things. The normal ones just affect the
+        bit map, but Unicode properties require an XCLASS extended item. */
+
+        else
+          {
+          class_optcount = 10;         /* \d, \s etc; make sure > 1 */
+#ifdef SUPPORT_UTF8
+          if (-c == ESC_p || -c == ESC_P)
+            {
+            if (!class_utf8)
+              {
+              class_utf8 = TRUE;
+              length += LINK_SIZE + 2;
+              }
+            length += 2;
+            }
+#endif
+          }
+        }
+
+      /* Check the syntax for POSIX stuff. The bits we actually handle are
+      checked during the real compile phase. */
+
+      else if (*ptr == '[' && check_posix_syntax(ptr, &ptr, &compile_block))
+        {
+        ptr++;
+        class_optcount = 10;    /* Make sure > 1 */
+        }
+
+      /* Anything else increments the possible optimization count. We have to
+      detect ranges here so that we can compute the number of extra ranges for
+      caseless wide characters when UCP support is available. If there are wide
+      characters, we are going to have to use an XCLASS, even for single
+      characters. */
+
+      else
+        {
+        int d;
+
+        GET_ONE_CHARACTER:
+
+#ifdef SUPPORT_UTF8
+        if (utf8)
+          {
+          int extra = 0;
+          GETCHARLEN(c, ptr, extra);
+          ptr += extra;
+          }
+        else c = *ptr;
+#else
+        c = *ptr;
+#endif
+
+        /* Come here from handling \ above when it escapes to a char value */
+
+        NON_SPECIAL_CHARACTER:
+        class_optcount++;
+
+        d = -1;
+        if (ptr[1] == '-')
+          {
+          uschar const *hyptr = ptr++;
+          if (ptr[1] == '\\')
+            {
+            ptr++;
+            d = check_escape(&ptr, &errorcode, bracount, options, TRUE);
+            if (errorcode != 0) goto PCRE_ERROR_RETURN;
+            if (-d == ESC_b) d = '\b';        /* backspace */
+            else if (-d == ESC_X) d = 'X';    /* literal X in a class */
+            }
+          else if (ptr[1] != 0 && ptr[1] != ']')
+            {
+            ptr++;
+#ifdef SUPPORT_UTF8
+            if (utf8)
+              {
+              int extra = 0;
+              GETCHARLEN(d, ptr, extra);
+              ptr += extra;
+              }
+            else
+#endif
+            d = *ptr;
+            }
+          if (d < 0) ptr = hyptr;      /* go back to hyphen as data */
+          }
+
+        /* If d >= 0 we have a range. In UTF-8 mode, if the end is > 255, or >
+        127 for caseless matching, we will need to use an XCLASS. */
+
+        if (d >= 0)
+          {
+          class_optcount = 10;     /* Ensure > 1 */
+          if (d < c)
+            {
+            errorcode = ERR8;
+            goto PCRE_ERROR_RETURN;
+            }
+
+#ifdef SUPPORT_UTF8
+          if (utf8 && (d > 255 || ((options & PCRE_CASELESS) != 0 && d > 127)))
+            {
+            uschar buffer[6];
+            if (!class_utf8)         /* Allow for XCLASS overhead */
+              {
+              class_utf8 = TRUE;
+              length += LINK_SIZE + 2;
+              }
+
+#ifdef SUPPORT_UCP
+            /* If we have UCP support, find out how many extra ranges are
+            needed to map the other case of characters within this range. We
+            have to mimic the range optimization here, because extending the
+            range upwards might push d over a boundary that makes is use
+            another byte in the UTF-8 representation. */
+
+            if ((options & PCRE_CASELESS) != 0)
+              {
+              int occ, ocd;
+              int cc = c;
+              int origd = d;
+              while (get_othercase_range(&cc, origd, &occ, &ocd))
+                {
+                if (occ >= c && ocd <= d) continue;   /* Skip embedded */
+
+                if (occ < c  && ocd >= c - 1)  /* Extend the basic range */
+                  {                            /* if there is overlap,   */
+                  c = occ;                     /* noting that if occ < c */
+                  continue;                    /* we can't have ocd > d  */
+                  }                            /* because a subrange is  */
+                if (ocd > d && occ <= d + 1)   /* always shorter than    */
+                  {                            /* the basic range.       */
+                  d = ocd;
+                  continue;
+                  }
+
+                /* An extra item is needed */
+
+                length += 1 + _pcre_ord2utf8(occ, buffer) +
+                  ((occ == ocd)? 0 : _pcre_ord2utf8(ocd, buffer));
+                }
+              }
+#endif  /* SUPPORT_UCP */
+
+            /* The length of the (possibly extended) range */
+
+            length += 1 + _pcre_ord2utf8(c, buffer) + _pcre_ord2utf8(d, buffer);
+            }
+#endif  /* SUPPORT_UTF8 */
+
+          }
+
+        /* We have a single character. There is nothing to be done unless we
+        are in UTF-8 mode. If the char is > 255, or 127 when caseless, we must
+        allow for an XCL_SINGLE item, doubled for caselessness if there is UCP
+        support. */
+
+        else
+          {
+#ifdef SUPPORT_UTF8
+          if (utf8 && (c > 255 || ((options & PCRE_CASELESS) != 0 && c > 127)))
+            {
+            uschar buffer[6];
+            class_optcount = 10;     /* Ensure > 1 */
+            if (!class_utf8)         /* Allow for XCLASS overhead */
+              {
+              class_utf8 = TRUE;
+              length += LINK_SIZE + 2;
+              }
+#ifdef SUPPORT_UCP
+            length += (((options & PCRE_CASELESS) != 0)? 2 : 1) *
+              (1 + _pcre_ord2utf8(c, buffer));
+#else   /* SUPPORT_UCP */
+            length += 1 + _pcre_ord2utf8(c, buffer);
+#endif  /* SUPPORT_UCP */
+            }
+#endif  /* SUPPORT_UTF8 */
+          }
+        }
+      }
+    while (*(++ptr) != 0 && (inescq || *ptr != ']')); /* Concludes "do" above */
+
+    if (*ptr == 0)                          /* Missing terminating ']' */
+      {
+      errorcode = ERR6;
+      goto PCRE_ERROR_RETURN;
+      }
+
+    /* We can optimize when there was only one optimizable character. Repeats
+    for positive and negated single one-byte chars are handled by the general
+    code. Here, we handle repeats for the class opcodes. */
+
+    if (class_optcount == 1) length += 3; else
+      {
+      length += 33;
+
+      /* A repeat needs either 1 or 5 bytes. If it is a possessive quantifier,
+      we also need extra for wrapping the whole thing in a sub-pattern. */
+
+      if (*ptr != 0 && ptr[1] == '{' && is_counted_repeat(ptr+2))
+        {
+        ptr = read_repeat_counts(ptr+2, &min, &max, &errorcode);
+        if (errorcode != 0) goto PCRE_ERROR_RETURN;
+        if ((min == 0 && (max == 1 || max == -1)) ||
+          (min == 1 && max == -1))
+            length++;
+        else length += 5;
+        if (ptr[1] == '+')
+          {
+          ptr++;
+          length += 2 + 2*LINK_SIZE;
+          }
+        else if (ptr[1] == '?') ptr++;
+        }
+      }
+    continue;
+
+    /* Brackets may be genuine groups or special things */
+
+    case '(':
+    branch_newextra = 0;
+    bracket_length = 1 + LINK_SIZE;
+    capturing = FALSE;
+
+    /* Handle special forms of bracket, which all start (? */
+
+    if (ptr[1] == '?')
+      {
+      int set, unset;
+      int *optset;
+
+      switch (c = ptr[2])
+        {
+        /* Skip over comments entirely */
+        case '#':
+        ptr += 3;
+        while (*ptr != 0 && *ptr != ')') ptr++;
+        if (*ptr == 0)
+          {
+          errorcode = ERR18;
+          goto PCRE_ERROR_RETURN;
+          }
+        continue;
+
+        /* Non-referencing groups and lookaheads just move the pointer on, and
+        then behave like a non-special bracket, except that they don't increment
+        the count of extracting brackets. Ditto for the "once only" bracket,
+        which is in Perl from version 5.005. */
+
+        case ':':
+        case '=':
+        case '!':
+        case '>':
+        ptr += 2;
+        break;
+
+        /* (?R) specifies a recursive call to the regex, which is an extension
+        to provide the facility which can be obtained by (?p{perl-code}) in
+        Perl 5.6. In Perl 5.8 this has become (??{perl-code}).
+
+        From PCRE 4.00, items such as (?3) specify subroutine-like "calls" to
+        the appropriate numbered brackets. This includes both recursive and
+        non-recursive calls. (?R) is now synonymous with (?0). */
+
+        case 'R':
+        ptr++;
+
+        case '0': case '1': case '2': case '3': case '4':
+        case '5': case '6': case '7': case '8': case '9':
+        ptr += 2;
+        if (c != 'R')
+          while ((digitab[*(++ptr)] & ctype_digit) != 0);
+        if (*ptr != ')')
+          {
+          errorcode = ERR29;
+          goto PCRE_ERROR_RETURN;
+          }
+        length += 1 + LINK_SIZE;
+
+        /* If this item is quantified, it will get wrapped inside brackets so
+        as to use the code for quantified brackets. We jump down and use the
+        code that handles this for real brackets. */
+
+        if (ptr[1] == '+' || ptr[1] == '*' || ptr[1] == '?' || ptr[1] == '{')
+          {
+          length += 2 + 2 * LINK_SIZE;       /* to make bracketed */
+          duplength = 5 + 3 * LINK_SIZE;
+          goto HANDLE_QUANTIFIED_BRACKETS;
+          }
+        continue;
+
+        /* (?C) is an extension which provides "callout" - to provide a bit of
+        the functionality of the Perl (?{...}) feature. An optional number may
+        follow (default is zero). */
+
+        case 'C':
+        ptr += 2;
+        while ((digitab[*(++ptr)] & ctype_digit) != 0);
+        if (*ptr != ')')
+          {
+          errorcode = ERR39;
+          goto PCRE_ERROR_RETURN;
+          }
+        length += 2 + 2*LINK_SIZE;
+        continue;
+
+        /* Named subpatterns are an extension copied from Python */
+
+        case 'P':
+        ptr += 3;
+
+        /* Handle the definition of a named subpattern */
+
+        if (*ptr == '<')
+          {
+          const uschar *p;    /* Don't amalgamate; some compilers */
+          p = ++ptr;          /* grumble at autoincrement in declaration */
+          while ((compile_block.ctypes[*ptr] & ctype_word) != 0) ptr++;
+          if (*ptr != '>')
+            {
+            errorcode = ERR42;
+            goto PCRE_ERROR_RETURN;
+            }
+          name_count++;
+          if (ptr - p > max_name_size) max_name_size = (ptr - p);
+          capturing = TRUE;   /* Named parentheses are always capturing */
+          break;
+          }
+
+        /* Handle back references and recursive calls to named subpatterns */
+
+        if (*ptr == '=' || *ptr == '>')
+          {
+          while ((compile_block.ctypes[*(++ptr)] & ctype_word) != 0);
+          if (*ptr != ')')
+            {
+            errorcode = ERR42;
+            goto PCRE_ERROR_RETURN;
+            }
+          break;
+          }
+
+        /* Unknown character after (?P */
+
+        errorcode = ERR41;
+        goto PCRE_ERROR_RETURN;
+
+        /* Lookbehinds are in Perl from version 5.005 */
+
+        case '<':
+        ptr += 3;
+        if (*ptr == '=' || *ptr == '!')
+          {
+          branch_newextra = 1 + LINK_SIZE;
+          length += 1 + LINK_SIZE;         /* For the first branch */
+          break;
+          }
+        errorcode = ERR24;
+        goto PCRE_ERROR_RETURN;
+
+        /* Conditionals are in Perl from version 5.005. The bracket must either
+        be followed by a number (for bracket reference) or by an assertion
+        group, or (a PCRE extension) by 'R' for a recursion test. */
+
+        case '(':
+        if (ptr[3] == 'R' && ptr[4] == ')')
+          {
+          ptr += 4;
+          length += 3;
+          }
+        else if ((digitab[ptr[3]] & ctype_digit) != 0)
+          {
+          ptr += 4;
+          length += 3;
+          while ((digitab[*ptr] & ctype_digit) != 0) ptr++;
+          if (*ptr != ')')
+            {
+            errorcode = ERR26;
+            goto PCRE_ERROR_RETURN;
+            }
+          }
+        else   /* An assertion must follow */
+          {
+          ptr++;   /* Can treat like ':' as far as spacing is concerned */
+          if (ptr[2] != '?' ||
+             (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<') )
+            {
+            ptr += 2;    /* To get right offset in message */
+            errorcode = ERR28;
+            goto PCRE_ERROR_RETURN;
+            }
+          }
+        break;
+
+        /* Else loop checking valid options until ) is met. Anything else is an
+        error. If we are without any brackets, i.e. at top level, the settings
+        act as if specified in the options, so massage the options immediately.
+        This is for backward compatibility with Perl 5.004. */
+
+        default:
+        set = unset = 0;
+        optset = &set;
+        ptr += 2;
+
+        for (;; ptr++)
+          {
+          c = *ptr;
+          switch (c)
+            {
+            case 'i':
+            *optset |= PCRE_CASELESS;
+            continue;
+
+            case 'm':
+            *optset |= PCRE_MULTILINE;
+            continue;
+
+            case 's':
+            *optset |= PCRE_DOTALL;
+            continue;
+
+            case 'x':
+            *optset |= PCRE_EXTENDED;
+            continue;
+
+            case 'X':
+            *optset |= PCRE_EXTRA;
+            continue;
+
+            case 'U':
+            *optset |= PCRE_UNGREEDY;
+            continue;
+
+            case '-':
+            optset = &unset;
+            continue;
+
+            /* A termination by ')' indicates an options-setting-only item; if
+            this is at the very start of the pattern (indicated by item_count
+            being zero), we use it to set the global options. This is helpful
+            when analyzing the pattern for first characters, etc. Otherwise
+            nothing is done here and it is handled during the compiling
+            process.
+
+            We allow for more than one options setting at the start. If such
+            settings do not change the existing options, nothing is compiled.
+            However, we must leave space just in case something is compiled.
+            This can happen for pathological sequences such as (?i)(?-i)
+            because the global options will end up with -i set. The space is
+            small and not significant. (Before I did this there was a reported
+            bug with (?i)(?-i) in a machine-generated pattern.)
+
+            [Historical note: Up to Perl 5.8, options settings at top level
+            were always global settings, wherever they appeared in the pattern.
+            That is, they were equivalent to an external setting. From 5.8
+            onwards, they apply only to what follows (which is what you might
+            expect).] */
+
+            case ')':
+            if (item_count == 0)
+              {
+              options = (options | set) & (~unset);
+              set = unset = 0;     /* To save length */
+              item_count--;        /* To allow for several */
+              length += 2;
+              }
+
+            /* Fall through */
+
+            /* A termination by ':' indicates the start of a nested group with
+            the given options set. This is again handled at compile time, but
+            we must allow for compiled space if any of the ims options are
+            set. We also have to allow for resetting space at the end of
+            the group, which is why 4 is added to the length and not just 2.
+            If there are several changes of options within the same group, this
+            will lead to an over-estimate on the length, but this shouldn't
+            matter very much. We also have to allow for resetting options at
+            the start of any alternations, which we do by setting
+            branch_newextra to 2. Finally, we record whether the case-dependent
+            flag ever changes within the regex. This is used by the "required
+            character" code. */
+
+            case ':':
+            if (((set|unset) & PCRE_IMS) != 0)
+              {
+              length += 4;
+              branch_newextra = 2;
+              if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED;
+              }
+            goto END_OPTIONS;
+
+            /* Unrecognized option character */
+
+            default:
+            errorcode = ERR12;
+            goto PCRE_ERROR_RETURN;
+            }
+          }
+
+        /* If we hit a closing bracket, that's it - this is a freestanding
+        option-setting. We need to ensure that branch_extra is updated if
+        necessary. The only values branch_newextra can have here are 0 or 2.
+        If the value is 2, then branch_extra must either be 2 or 5, depending
+        on whether this is a lookbehind group or not. */
+
+        END_OPTIONS:
+        if (c == ')')
+          {
+          if (branch_newextra == 2 &&
+              (branch_extra == 0 || branch_extra == 1+LINK_SIZE))
+            branch_extra += branch_newextra;
+          continue;
+          }
+
+        /* If options were terminated by ':' control comes here. This is a
+        non-capturing group with an options change. There is nothing more that
+        needs to be done because "capturing" is already set FALSE by default;
+        we can just fall through. */
+
+        }
+      }
+
+    /* Ordinary parentheses, not followed by '?', are capturing unless
+    PCRE_NO_AUTO_CAPTURE is set. */
+
+    else capturing = (options & PCRE_NO_AUTO_CAPTURE) == 0;
+
+    /* Capturing brackets must be counted so we can process escapes in a
+    Perlish way. If the number exceeds EXTRACT_BASIC_MAX we are going to need
+    an additional 3 bytes of memory per capturing bracket. */
+
+    if (capturing)
+      {
+      bracount++;
+      if (bracount > EXTRACT_BASIC_MAX) bracket_length += 3;
+      }
+
+    /* Save length for computing whole length at end if there's a repeat that
+    requires duplication of the group. Also save the current value of
+    branch_extra, and start the new group with the new value. If non-zero, this
+    will either be 2 for a (?imsx: group, or 3 for a lookbehind assertion. */
+
+    if (brastackptr >= sizeof(brastack)/sizeof(int))
+      {
+      errorcode = ERR19;
+      goto PCRE_ERROR_RETURN;
+      }
+
+    bralenstack[brastackptr] = branch_extra;
+    branch_extra = branch_newextra;
+
+    brastack[brastackptr++] = length;
+    length += bracket_length;
+    continue;
+
+    /* Handle ket. Look for subsequent max/min; for certain sets of values we
+    have to replicate this bracket up to that many times. If brastackptr is
+    0 this is an unmatched bracket which will generate an error, but take care
+    not to try to access brastack[-1] when computing the length and restoring
+    the branch_extra value. */
+
+    case ')':
+    length += 1 + LINK_SIZE;
+    if (brastackptr > 0)
+      {
+      duplength = length - brastack[--brastackptr];
+      branch_extra = bralenstack[brastackptr];
+      }
+    else duplength = 0;
+
+    /* The following code is also used when a recursion such as (?3) is
+    followed by a quantifier, because in that case, it has to be wrapped inside
+    brackets so that the quantifier works. The value of duplength must be
+    set before arrival. */
+
+    HANDLE_QUANTIFIED_BRACKETS:
+
+    /* Leave ptr at the final char; for read_repeat_counts this happens
+    automatically; for the others we need an increment. */
+
+    if ((c = ptr[1]) == '{' && is_counted_repeat(ptr+2))
+      {
+      ptr = read_repeat_counts(ptr+2, &min, &max, &errorcode);
+      if (errorcode != 0) goto PCRE_ERROR_RETURN;
+      }
+    else if (c == '*') { min = 0; max = -1; ptr++; }
+    else if (c == '+') { min = 1; max = -1; ptr++; }
+    else if (c == '?') { min = 0; max = 1;  ptr++; }
+    else { min = 1; max = 1; }
+
+    /* If the minimum is zero, we have to allow for an OP_BRAZERO before the
+    group, and if the maximum is greater than zero, we have to replicate
+    maxval-1 times; each replication acquires an OP_BRAZERO plus a nesting
+    bracket set. */
+
+    if (min == 0)
+      {
+      length++;
+      if (max > 0) length += (max - 1) * (duplength + 3 + 2*LINK_SIZE);
+      }
+
+    /* When the minimum is greater than zero, we have to replicate up to
+    minval-1 times, with no additions required in the copies. Then, if there
+    is a limited maximum we have to replicate up to maxval-1 times allowing
+    for a BRAZERO item before each optional copy and nesting brackets for all
+    but one of the optional copies. */
+
+    else
+      {
+      length += (min - 1) * duplength;
+      if (max > min)   /* Need this test as max=-1 means no limit */
+        length += (max - min) * (duplength + 3 + 2*LINK_SIZE)
+          - (2 + 2*LINK_SIZE);
+      }
+
+    /* Allow space for once brackets for "possessive quantifier" */
+
+    if (ptr[1] == '+')
+      {
+      ptr++;
+      length += 2 + 2*LINK_SIZE;
+      }
+    continue;
+
+    /* Non-special character. It won't be space or # in extended mode, so it is
+    always a genuine character. If we are in a \Q...\E sequence, check for the
+    end; if not, we have a literal. */
+
+    default:
+    NORMAL_CHAR:
+
+    if (inescq && c == '\\' && ptr[1] == 'E')
+      {
+      inescq = FALSE;
+      ptr++;
+      continue;
+      }
+
+    length += 2;          /* For a one-byte character */
+    lastitemlength = 1;   /* Default length of last item for repeats */
+
+    /* In UTF-8 mode, check for additional bytes. */
+
+#ifdef SUPPORT_UTF8
+    if (utf8 && (c & 0xc0) == 0xc0)
+      {
+      while ((ptr[1] & 0xc0) == 0x80)         /* Can't flow over the end */
+        {                                     /* because the end is marked */
+        lastitemlength++;                     /* by a zero byte. */
+        length++;
+        ptr++;
+        }
+      }
+#endif
+
+    continue;
+    }
+  }
+
+length += 2 + LINK_SIZE;    /* For final KET and END */
+
+if ((options & PCRE_AUTO_CALLOUT) != 0)
+  length += 2 + 2*LINK_SIZE;  /* For final callout */
+
+if (length > MAX_PATTERN_SIZE)
+  {
+  errorcode = ERR20;
+  goto PCRE_EARLY_ERROR_RETURN;
+  }
+
+/* Compute the size of data block needed and get it, either from malloc or
+externally provided function. */
+
+size = length + sizeof(real_pcre) + name_count * (max_name_size + 3);
+re = (real_pcre *)(pcre_malloc)(size);
+
+if (re == NULL)
+  {
+  errorcode = ERR21;
+  goto PCRE_EARLY_ERROR_RETURN;
+  }
+
+/* Put in the magic number, and save the sizes, options, and character table
+pointer. NULL is used for the default character tables. The nullpad field is at
+the end; it's there to help in the case when a regex compiled on a system with
+4-byte pointers is run on another with 8-byte pointers. */
+
+re->magic_number = MAGIC_NUMBER;
+re->size = size;
+re->options = options;
+re->dummy1 = 0;
+re->name_table_offset = sizeof(real_pcre);
+re->name_entry_size = max_name_size + 3;
+re->name_count = name_count;
+re->ref_count = 0;
+re->tables = (tables == _pcre_default_tables)? NULL : tables;
+re->nullpad = NULL;
+
+/* The starting points of the name/number translation table and of the code are
+passed around in the compile data block. */
+
+compile_block.names_found = 0;
+compile_block.name_entry_size = max_name_size + 3;
+compile_block.name_table = (uschar *)re + re->name_table_offset;
+codestart = compile_block.name_table + re->name_entry_size * re->name_count;
+compile_block.start_code = codestart;
+compile_block.start_pattern = (const uschar *)pattern;
+compile_block.req_varyopt = 0;
+compile_block.nopartial = FALSE;
+
+/* Set up a starting, non-extracting bracket, then compile the expression. On
+error, errorcode will be set non-zero, so we don't need to look at the result
+of the function here. */
+
+ptr = (const uschar *)pattern;
+code = (uschar *)codestart;
+*code = OP_BRA;
+bracount = 0;
+(void)compile_regex(options, options & PCRE_IMS, &bracount, &code, &ptr,
+  &errorcode, FALSE, 0, &firstbyte, &reqbyte, NULL, &compile_block);
+re->top_bracket = bracount;
+re->top_backref = compile_block.top_backref;
+
+if (compile_block.nopartial) re->options |= PCRE_NOPARTIAL;
+
+/* If not reached end of pattern on success, there's an excess bracket. */
+
+if (errorcode == 0 && *ptr != 0) errorcode = ERR22;
+
+/* Fill in the terminating state and check for disastrous overflow, but
+if debugging, leave the test till after things are printed out. */
+
+*code++ = OP_END;
+
+#ifndef DEBUG
+if (code - codestart > length) errorcode = ERR23;
+#endif
+
+/* Give an error if there's back reference to a non-existent capturing
+subpattern. */
+
+if (re->top_backref > re->top_bracket) errorcode = ERR15;
+
+/* Failed to compile, or error while post-processing */
+
+if (errorcode != 0)
+  {
+  (pcre_free)(re);
+  PCRE_ERROR_RETURN:
+  *erroroffset = ptr - (const uschar *)pattern;
+  PCRE_EARLY_ERROR_RETURN:
+  *errorptr = error_texts[errorcode];
+  if (errorcodeptr != NULL) *errorcodeptr = errorcode;
+  return NULL;
+  }
+
+/* If the anchored option was not passed, set the flag if we can determine that
+the pattern is anchored by virtue of ^ characters or \A or anything else (such
+as starting with .* when DOTALL is set).
+
+Otherwise, if we know what the first character has to be, save it, because that
+speeds up unanchored matches no end. If not, see if we can set the
+PCRE_STARTLINE flag. This is helpful for multiline matches when all branches
+start with ^. and also when all branches start with .* for non-DOTALL matches.
+*/
+
+if ((options & PCRE_ANCHORED) == 0)
+  {
+  int temp_options = options;
+  if (is_anchored(codestart, &temp_options, 0, compile_block.backref_map))
+    re->options |= PCRE_ANCHORED;
+  else
+    {
+    if (firstbyte < 0)
+      firstbyte = find_firstassertedchar(codestart, &temp_options, FALSE);
+    if (firstbyte >= 0)   /* Remove caseless flag for non-caseable chars */
+      {
+      int ch = firstbyte & 255;
+      re->first_byte = ((firstbyte & REQ_CASELESS) != 0 &&
+         compile_block.fcc[ch] == ch)? ch : firstbyte;
+      re->options |= PCRE_FIRSTSET;
+      }
+    else if (is_startline(codestart, 0, compile_block.backref_map))
+      re->options |= PCRE_STARTLINE;
+    }
+  }
+
+/* For an anchored pattern, we use the "required byte" only if it follows a
+variable length item in the regex. Remove the caseless flag for non-caseable
+bytes. */
+
+if (reqbyte >= 0 &&
+     ((re->options & PCRE_ANCHORED) == 0 || (reqbyte & REQ_VARY) != 0))
+  {
+  int ch = reqbyte & 255;
+  re->req_byte = ((reqbyte & REQ_CASELESS) != 0 &&
+    compile_block.fcc[ch] == ch)? (reqbyte & ~REQ_CASELESS) : reqbyte;
+  re->options |= PCRE_REQCHSET;
+  }
+
+/* Print out the compiled data if debugging is enabled. This is never the
+case when building a production library. */
+
+#ifdef DEBUG
+
+printf("Length = %d top_bracket = %d top_backref = %d\n",
+  length, re->top_bracket, re->top_backref);
+
+if (re->options != 0)
+  {
+  printf("%s%s%s%s%s%s%s%s%s%s\n",
+    ((re->options & PCRE_NOPARTIAL) != 0)? "nopartial " : "",
+    ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "",
+    ((re->options & PCRE_CASELESS) != 0)? "caseless " : "",
+    ((re->options & PCRE_ICHANGED) != 0)? "case state changed " : "",
+    ((re->options & PCRE_EXTENDED) != 0)? "extended " : "",
+    ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "",
+    ((re->options & PCRE_DOTALL) != 0)? "dotall " : "",
+    ((re->options & PCRE_DOLLAR_ENDONLY) != 0)? "endonly " : "",
+    ((re->options & PCRE_EXTRA) != 0)? "extra " : "",
+    ((re->options & PCRE_UNGREEDY) != 0)? "ungreedy " : "");
+  }
+
+if ((re->options & PCRE_FIRSTSET) != 0)
+  {
+  int ch = re->first_byte & 255;
+  const char *caseless = ((re->first_byte & REQ_CASELESS) == 0)? "" : " (caseless)";
+  if (isprint(ch)) printf("First char = %c%s\n", ch, caseless);
+    else printf("First char = \\x%02x%s\n", ch, caseless);
+  }
+
+if ((re->options & PCRE_REQCHSET) != 0)
+  {
+  int ch = re->req_byte & 255;
+  const char *caseless = ((re->req_byte & REQ_CASELESS) == 0)? "" : " (caseless)";
+  if (isprint(ch)) printf("Req char = %c%s\n", ch, caseless);
+    else printf("Req char = \\x%02x%s\n", ch, caseless);
+  }
+
+pcre_printint(re, stdout);
+
+/* This check is done here in the debugging case so that the code that
+was compiled can be seen. */
+
+if (code - codestart > length)
+  {
+  (pcre_free)(re);
+  *errorptr = error_texts[ERR23];
+  *erroroffset = ptr - (uschar *)pattern;
+  if (errorcodeptr != NULL) *errorcodeptr = ERR23;
+  return NULL;
+  }
+#endif
+
+return (pcre *)re;
+}
+
+/* End of pcre_compile.c */
diff -Nurp tin-1.6.2/pcre/pcre_config.c tin-1.8.0/pcre/pcre_config.c
--- tin-1.6.2/pcre/pcre_config.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_config.c	2005-09-12 16:38:09.000000000 +0200
@@ -0,0 +1,112 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_config(). */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+* Return info about what features are configured *
+*************************************************/
+
+/* This function has an extensible interface so that additional items can be
+added compatibly.
+
+Arguments:
+  what             what information is required
+  where            where to put the information
+
+Returns:           0 if data returned, negative on error
+*/
+
+PCRE_EXPORT int
+pcre_config(int what, void *where)
+{
+switch (what)
+  {
+  case PCRE_CONFIG_UTF8:
+#ifdef SUPPORT_UTF8
+  *((int *)where) = 1;
+#else
+  *((int *)where) = 0;
+#endif
+  break;
+
+  case PCRE_CONFIG_UNICODE_PROPERTIES:
+#ifdef SUPPORT_UCP
+  *((int *)where) = 1;
+#else
+  *((int *)where) = 0;
+#endif
+  break;
+
+  case PCRE_CONFIG_NEWLINE:
+  *((int *)where) = NEWLINE;
+  break;
+
+  case PCRE_CONFIG_LINK_SIZE:
+  *((int *)where) = LINK_SIZE;
+  break;
+
+  case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD:
+  *((int *)where) = POSIX_MALLOC_THRESHOLD;
+  break;
+
+  case PCRE_CONFIG_MATCH_LIMIT:
+  *((unsigned int *)where) = MATCH_LIMIT;
+  break;
+
+  case PCRE_CONFIG_STACKRECURSE:
+#ifdef NO_RECURSE
+  *((int *)where) = 0;
+#else
+  *((int *)where) = 1;
+#endif
+  break;
+
+  default: return PCRE_ERROR_BADOPTION;
+  }
+
+return 0;
+}
+
+/* End of pcre_config.c */
diff -Nurp tin-1.6.2/pcre/pcre_dfa_exec.c tin-1.8.0/pcre/pcre_dfa_exec.c
--- tin-1.6.2/pcre/pcre_dfa_exec.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_dfa_exec.c	2005-09-12 16:38:43.000000000 +0200
@@ -0,0 +1,1920 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_dfa_exec(), which is an
+alternative matching function that uses a DFA algorithm. This is NOT Perl-
+compatible, but it has advantages in certain applications. */
+
+
+#include "pcre_internal.h"
+
+
+/* For use to indent debugging output */
+
+#define SP "                   "
+
+
+
+/*************************************************
+*      Code parameters and static tables         *
+*************************************************/
+
+/* These are offsets that are used to turn the OP_TYPESTAR and friends opcodes
+into others, under special conditions. A gap of 10 between the blocks should be
+enough. */
+
+#define OP_PROP_EXTRA    (EXTRACT_BASIC_MAX+1)
+#define OP_EXTUNI_EXTRA  (EXTRACT_BASIC_MAX+11)
+
+
+/* This table identifies those opcodes that are followed immediately by a
+character that is to be tested in some way. This makes is possible to
+centralize the loading of these characters. In the case of Type * etc, the
+"character" is the opcode for \D, \d, \S, \s, \W, or \w, which will always be a
+small value. */
+
+static uschar coptable[] = {
+  0,                             /* End                                    */
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  /* \A, \G, \B, \b, \D, \d, \S, \s, \W, \w */
+  0, 0,                          /* Any, Anybyte                           */
+  0, 0, 0,                       /* NOTPROP, PROP, EXTUNI                  */
+  0, 0, 0, 0, 0,                 /* \Z, \z, Opt, ^, $                      */
+  1,                             /* Char                                   */
+  1,                             /* Charnc                                 */
+  1,                             /* not                                    */
+  /* Positive single-char repeats                                          */
+  1, 1, 1, 1, 1, 1,              /* *, *?, +, +?, ?, ??                    */
+  3, 3, 3,                       /* upto, minupto, exact                   */
+  /* Negative single-char repeats - only for chars < 256                   */
+  1, 1, 1, 1, 1, 1,              /* NOT *, *?, +, +?, ?, ??                */
+  3, 3, 3,                       /* NOT upto, minupto, exact               */
+  /* Positive type repeats                                                 */
+  1, 1, 1, 1, 1, 1,              /* Type *, *?, +, +?, ?, ??               */
+  3, 3, 3,                       /* Type upto, minupto, exact              */
+  /* Character class & ref repeats                                         */
+  0, 0, 0, 0, 0, 0,              /* *, *?, +, +?, ?, ??                    */
+  0, 0,                          /* CRRANGE, CRMINRANGE                    */
+  0,                             /* CLASS                                  */
+  0,                             /* NCLASS                                 */
+  0,                             /* XCLASS - variable length               */
+  0,                             /* REF                                    */
+  0,                             /* RECURSE                                */
+  0,                             /* CALLOUT                                */
+  0,                             /* Alt                                    */
+  0,                             /* Ket                                    */
+  0,                             /* KetRmax                                */
+  0,                             /* KetRmin                                */
+  0,                             /* Assert                                 */
+  0,                             /* Assert not                             */
+  0,                             /* Assert behind                          */
+  0,                             /* Assert behind not                      */
+  0,                             /* Reverse                                */
+  0,                             /* Once                                   */
+  0,                             /* COND                                   */
+  0,                             /* CREF                                   */
+  0, 0,                          /* BRAZERO, BRAMINZERO                    */
+  0,                             /* BRANUMBER                              */
+  0                              /* BRA                                    */
+};
+
+/* These 2 tables allow for compact code for testing for \D, \d, \S, \s, \W,
+and \w */
+
+static uschar toptable1[] = {
+  0, 0, 0, 0, 0,
+  ctype_digit, ctype_digit,
+  ctype_space, ctype_space,
+  ctype_word,  ctype_word,
+  0                               /* OP_ANY */
+};
+
+static uschar toptable2[] = {
+  0, 0, 0, 0, 0,
+  ctype_digit, 0,
+  ctype_space, 0,
+  ctype_word,  0,
+  1                               /* OP_ANY */
+};
+
+
+/* Structure for holding data about a particular state, which is in effect the
+current data for an active path through the match tree. It must consist
+entirely of ints because the working vector we are passed, and which we put
+these structures in, is a vector of ints. */
+
+typedef struct stateblock {
+  int offset;                     /* Offset to opcode */
+  int count;                      /* Count for repeats */
+  int ims;                        /* ims flag bits */
+  int data;                       /* Some use extra data */
+} stateblock;
+
+#define INTS_PER_STATEBLOCK  (sizeof(stateblock)/sizeof(int))
+
+
+#ifdef DEBUG
+/*************************************************
+*             Print character string             *
+*************************************************/
+
+/* Character string printing function for debugging.
+
+Arguments:
+  p            points to string
+  length       number of bytes
+  f            where to print
+
+Returns:       nothing
+*/
+
+static void
+pchars(unsigned char *p, int length, FILE *f)
+{
+int c;
+while (length-- > 0)
+  {
+  if (isprint(c = *(p++)))
+    fprintf(f, "%c", c);
+  else
+    fprintf(f, "\\x%02x", c);
+  }
+}
+#endif
+
+
+
+/*************************************************
+*    Execute a Regular Expression - DFA engine   *
+*************************************************/
+
+/* This internal function applies a compiled pattern to a subject string,
+starting at a given point, using a DFA engine. This function is called from the
+external one, possibly multiple times if the pattern is not anchored. The
+function calls itself recursively for some kinds of subpattern.
+
+Arguments:
+  md                the match_data block with fixed information
+  this_start_code   the opening bracket of this subexpression's code
+  current_subject   where we currently are in the subject string
+  start_offset      start offset in the subject string
+  offsets           vector to contain the matching string offsets
+  offsetcount       size of same
+  workspace         vector of workspace
+  wscount           size of same
+  ims               the current ims flags
+  rlevel            function call recursion level
+  recursing         regex recursive call level
+
+Returns:            > 0 =>
+                    = 0 =>
+                     -1 => failed to match
+                   < -1 => some kind of unexpected problem
+
+The following macros are used for adding states to the two state vectors (one
+for the current character, one for the following character). */
+
+#define ADD_ACTIVE(x,y) \
+  if (active_count++ < wscount) \
+    { \
+    next_active_state->offset = (x); \
+    next_active_state->count  = (y); \
+    next_active_state->ims    = ims; \
+    next_active_state++; \
+    DPRINTF(("%.*sADD_ACTIVE(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \
+    } \
+  else return PCRE_ERROR_DFA_WSSIZE
+
+#define ADD_ACTIVE_DATA(x,y,z) \
+  if (active_count++ < wscount) \
+    { \
+    next_active_state->offset = (x); \
+    next_active_state->count  = (y); \
+    next_active_state->ims    = ims; \
+    next_active_state->data   = (z); \
+    next_active_state++; \
+    DPRINTF(("%.*sADD_ACTIVE_DATA(%d,%d,%d)\n", rlevel*2-2, SP, (x), (y), (z))); \
+    } \
+  else return PCRE_ERROR_DFA_WSSIZE
+
+#define ADD_NEW(x,y) \
+  if (new_count++ < wscount) \
+    { \
+    next_new_state->offset = (x); \
+    next_new_state->count  = (y); \
+    next_new_state->ims    = ims; \
+    next_new_state++; \
+    DPRINTF(("%.*sADD_NEW(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \
+    } \
+  else return PCRE_ERROR_DFA_WSSIZE
+
+#define ADD_NEW_DATA(x,y,z) \
+  if (new_count++ < wscount) \
+    { \
+    next_new_state->offset = (x); \
+    next_new_state->count  = (y); \
+    next_new_state->ims    = ims; \
+    next_new_state->data   = (z); \
+    next_new_state++; \
+    DPRINTF(("%.*sADD_NEW_DATA(%d,%d,%d)\n", rlevel*2-2, SP, (x), (y), (z))); \
+    } \
+  else return PCRE_ERROR_DFA_WSSIZE
+
+/* And now, here is the code */
+
+static int
+internal_dfa_exec(
+  dfa_match_data *md,
+  const uschar *this_start_code,
+  const uschar *current_subject,
+  int start_offset,
+  int *offsets,
+  int offsetcount,
+  int *workspace,
+  int wscount,
+  int ims,
+  int  rlevel,
+  int  recursing)
+{
+stateblock *active_states, *new_states, *temp_states;
+stateblock *next_active_state, *next_new_state;
+
+const uschar *ctypes, *lcc, *fcc;
+const uschar *ptr;
+const uschar *end_code;
+
+int active_count, new_count, match_count;
+
+/* Some fields in the md block are frequently referenced, so we load them into
+independent variables in the hope that this will perform better. */
+
+const uschar *start_subject = md->start_subject;
+const uschar *end_subject = md->end_subject;
+const uschar *start_code = md->start_code;
+
+BOOL utf8 = (md->poptions & PCRE_UTF8) != 0;
+
+rlevel++;
+offsetcount &= (-2);
+
+wscount -= 2;
+wscount = (wscount - (wscount % (INTS_PER_STATEBLOCK * 2))) /
+          (2 * INTS_PER_STATEBLOCK);
+
+DPRINTF(("\n%.*s---------------------\n"
+  "%.*sCall to internal_dfa_exec f=%d r=%d\n",
+  rlevel*2-2, SP, rlevel*2-2, SP, rlevel, recursing));
+
+ctypes = md->tables + ctypes_offset;
+lcc = md->tables + lcc_offset;
+fcc = md->tables + fcc_offset;
+
+match_count = PCRE_ERROR_NOMATCH;   /* A negative number */
+
+active_states = (stateblock *)(workspace + 2);
+next_new_state = new_states = active_states + wscount;
+new_count = 0;
+
+/* The first thing in any (sub) pattern is a bracket of some sort. Push all
+the alternative states onto the list, and find out where the end is. This
+makes is possible to use this function recursively, when we want to stop at a
+matching internal ket rather than at the end.
+
+If the first opcode in the first alternative is OP_REVERSE, we are dealing with
+a backward assertion. In that case, we have to find out the maximum amount to
+move back, and set up each alternative appropriately. */
+
+if (this_start_code[1+LINK_SIZE] == OP_REVERSE)
+  {
+  int max_back = 0;
+  int gone_back;
+
+  end_code = this_start_code;
+  do
+    {
+    int back = GET(end_code, 2+LINK_SIZE);
+    if (back > max_back) max_back = back;
+    end_code += GET(end_code, 1);
+    }
+  while (*end_code == OP_ALT);
+
+  /* If we can't go back the amount required for the longest lookbehind
+  pattern, go back as far as we can; some alternatives may still be viable. */
+
+#ifdef SUPPORT_UTF8
+  /* In character mode we have to step back character by character */
+
+  if (utf8)
+    {
+    for (gone_back = 0; gone_back < max_back; gone_back++)
+      {
+      if (current_subject <= start_subject) break;
+      current_subject--;
+      while (current_subject > start_subject &&
+             (*current_subject & 0xc0) == 0x80)
+        current_subject--;
+      }
+    }
+  else
+#endif
+
+  /* In byte-mode we can do this quickly. */
+
+    {
+    gone_back = (current_subject - max_back < start_subject)?
+      current_subject - start_subject : max_back;
+    current_subject -= gone_back;
+    }
+
+  /* Now we can process the individual branches. */
+
+  end_code = this_start_code;
+  do
+    {
+    int back = GET(end_code, 2+LINK_SIZE);
+    if (back <= gone_back)
+      {
+      int bstate = end_code - start_code + 2 + 2*LINK_SIZE;
+      ADD_NEW_DATA(-bstate, 0, gone_back - back);
+      }
+    end_code += GET(end_code, 1);
+    }
+  while (*end_code == OP_ALT);
+ }
+
+/* This is the code for a "normal" subpattern (not a backward assertion). The
+start of a whole pattern is always one of these. If we are at the top level,
+we may be asked to restart matching from the same point that we reached for a
+previous partial match. We still have to scan through the top-level branches to
+find the end state. */
+
+else
+  {
+  end_code = this_start_code;
+
+  /* Restarting */
+
+  if (rlevel == 1 && (md->moptions & PCRE_DFA_RESTART) != 0)
+    {
+    do { end_code += GET(end_code, 1); } while (*end_code == OP_ALT);
+    new_count = workspace[1];
+    if (!workspace[0])
+      memcpy(new_states, active_states, new_count * sizeof(stateblock));
+    }
+
+  /* Not restarting */
+
+  else
+    {
+    do
+      {
+      ADD_NEW(end_code - start_code + 1 + LINK_SIZE, 0);
+      end_code += GET(end_code, 1);
+      }
+    while (*end_code == OP_ALT);
+    }
+  }
+
+workspace[0] = 0;    /* Bit indicating which vector is current */
+
+DPRINTF(("%.*sEnd state = %d\n", rlevel*2-2, SP, end_code - start_code));
+
+/* Loop for scanning the subject */
+
+ptr = current_subject;
+for (;;)
+  {
+  int i, j;
+  int c, d, clen, dlen;
+
+  /* Make the new state list into the active state list and empty the
+  new state list. */
+
+  temp_states = active_states;
+  active_states = new_states;
+  new_states = temp_states;
+  active_count = new_count;
+  new_count = 0;
+
+  workspace[0] ^= 1;              /* Remember for the restarting feature */
+  workspace[1] = active_count;
+
+#ifdef DEBUG
+  printf("%.*sNext character: rest of subject = \"", rlevel*2-2, SP);
+  pchars((uschar *)ptr, strlen((char *)ptr), stdout);
+  printf("\"\n");
+
+  printf("%.*sActive states: ", rlevel*2-2, SP);
+  for (i = 0; i < active_count; i++)
+    printf("%d/%d ", active_states[i].offset, active_states[i].count);
+  printf("\n");
+#endif
+
+  /* Set the pointers for adding new states */
+
+  next_active_state = active_states + active_count;
+  next_new_state = new_states;
+
+  /* Load the current character from the subject outside the loop, as many
+  different states may want to look at it, and we assume that at least one
+  will. */
+
+  if (ptr < end_subject)
+    {
+    clen = 1;
+#ifdef SUPPORT_UTF8
+    if (utf8) { GETCHARLEN(c, ptr, clen); } else
+#endif  /* SUPPORT_UTF8 */
+    c = *ptr;
+    }
+  else
+    {
+    clen = 0;    /* At end subject */
+    c = -1;
+    }
+
+  /* Scan up the active states and act on each one. The result of an action
+  may be to add more states to the currently active list (e.g. on hitting a
+  parenthesis) or it may be to put states on the new list, for considering
+  when we move the character pointer on. */
+
+  for (i = 0; i < active_count; i++)
+    {
+    stateblock *current_state = active_states + i;
+    const uschar *code;
+    int state_offset = current_state->offset;
+    int count, codevalue;
+    int chartype, othercase;
+
+#ifdef DEBUG
+    printf ("%.*sProcessing state %d c=", rlevel*2-2, SP, state_offset);
+    if (c < 0) printf("-1\n");
+      else if (c > 32 && c < 127) printf("'%c'\n", c);
+        else printf("0x%02x\n", c);
+#endif
+
+    /* This variable is referred to implicity in the ADD_xxx macros. */
+
+    ims = current_state->ims;
+
+    /* A negative offset is a special case meaning "hold off going to this
+    (negated) state until the number of characters in the data field have
+    been skipped". */
+
+    if (state_offset < 0)
+      {
+      if (current_state->data > 0)
+        {
+        DPRINTF(("%.*sSkipping this character\n", rlevel*2-2, SP));
+        ADD_NEW_DATA(state_offset, current_state->count,
+          current_state->data - 1);
+        continue;
+        }
+      else
+        {
+        current_state->offset = state_offset = -state_offset;
+        }
+      }
+
+    /* Check for a duplicate state with the same count, and skip if found. */
+
+    for (j = 0; j < i; j++)
+      {
+      if (active_states[j].offset == state_offset &&
+          active_states[j].count == current_state->count)
+        {
+        DPRINTF(("%.*sDuplicate state: skipped\n", rlevel*2-2, SP));
+        goto NEXT_ACTIVE_STATE;
+        }
+      }
+
+    /* The state offset is the offset to the opcode */
+
+    code = start_code + state_offset;
+    codevalue = *code;
+    if (codevalue >= OP_BRA) codevalue = OP_BRA; /* All brackets are equal */
+
+    /* If this opcode is followed by an inline character, load it. It is
+    tempting to test for the presence of a subject character here, but that
+    is wrong, because sometimes zero repetitions of the subject are
+    permitted.
+
+    We also use this mechanism for opcodes such as OP_TYPEPLUS that take an
+    argument that is not a data character - but is always one byte long.
+    Unfortunately, we have to take special action to deal with  \P, \p, and
+    \X in this case. To keep the other cases fast, convert these ones to new
+    opcodes. */
+
+    if (coptable[codevalue] > 0)
+      {
+      dlen = 1;
+#ifdef SUPPORT_UTF8
+      if (utf8) { GETCHARLEN(d, (code + coptable[codevalue]), dlen); } else
+#endif  /* SUPPORT_UTF8 */
+      d = code[coptable[codevalue]];
+      if (codevalue >= OP_TYPESTAR)
+        {
+        if (d == OP_ANYBYTE) return PCRE_ERROR_DFA_UITEM;
+        if (d >= OP_NOTPROP)
+          codevalue += (d == OP_EXTUNI)? OP_EXTUNI_EXTRA : OP_PROP_EXTRA;
+        }
+      }
+    else
+      {
+      dlen = 0;         /* Not strictly necessary, but compilers moan */
+      d = -1;           /* if these variables are not set. */
+      }
+
+
+    /* Now process the individual opcodes */
+
+    switch (codevalue)
+      {
+
+/* ========================================================================== */
+      /* Reached a closing bracket. If not at the end of the pattern, carry
+      on with the next opcode. Otherwise, unless we have an empty string and
+      PCRE_NOTEMPTY is set, save the match data, shifting up all previous
+      matches so we always have the longest first. */
+
+      case OP_KET:
+      case OP_KETRMIN:
+      case OP_KETRMAX:
+      if (code != end_code)
+        {
+        ADD_ACTIVE(state_offset + 1 + LINK_SIZE, 0);
+        if (codevalue != OP_KET)
+          {
+          ADD_ACTIVE(state_offset - GET(code, 1), 0);
+          }
+        }
+      else if (ptr > current_subject || (md->moptions & PCRE_NOTEMPTY) == 0)
+        {
+        if (match_count < 0) match_count = (offsetcount >= 2)? 1 : 0;
+          else if (match_count > 0 && ++match_count * 2 >= offsetcount)
+            match_count = 0;
+        count = ((match_count == 0)? offsetcount : match_count * 2) - 2;
+        if (count > 0) memmove(offsets + 2, offsets, count * sizeof(int));
+        if (offsetcount >= 2)
+          {
+          offsets[0] = current_subject - start_subject;
+          offsets[1] = ptr - start_subject;
+          DPRINTF(("%.*sSet matched string = \"%.*s\"\n", rlevel*2-2, SP,
+            offsets[1] - offsets[0], current_subject));
+          }
+        if ((md->moptions & PCRE_DFA_SHORTEST) != 0)
+          {
+          DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n"
+            "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel,
+            match_count, rlevel*2-2, SP));
+          return match_count;
+          }
+        }
+      break;
+
+/* ========================================================================== */
+      /* These opcodes add to the current list of states without looking
+      at the current character. */
+
+      /*-----------------------------------------------------------------*/
+      case OP_ALT:
+      do { code += GET(code, 1); } while (*code == OP_ALT);
+      ADD_ACTIVE(code - start_code, 0);
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_BRA:
+      do
+        {
+        ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0);
+        code += GET(code, 1);
+        }
+      while (*code == OP_ALT);
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_BRAZERO:
+      case OP_BRAMINZERO:
+      ADD_ACTIVE(state_offset + 1, 0);
+      code += 1 + GET(code, 2);
+      while (*code == OP_ALT) code += GET(code, 1);
+      ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0);
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_BRANUMBER:
+      ADD_ACTIVE(state_offset + 1 + LINK_SIZE, 0);
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_CIRC:
+      if ((ptr == start_subject && (md->moptions & PCRE_NOTBOL) == 0) ||
+          ((ims & PCRE_MULTILINE) != 0 && ptr[-1] == NEWLINE))
+        { ADD_ACTIVE(state_offset + 1, 0); }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_EOD:
+      if (ptr >= end_subject) { ADD_ACTIVE(state_offset + 1, 0); }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_OPT:
+      ims = code[1];
+      ADD_ACTIVE(state_offset + 2, 0);
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_SOD:
+      if (ptr == start_subject) { ADD_ACTIVE(state_offset + 1, 0); }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_SOM:
+      if (ptr == start_subject + start_offset) { ADD_ACTIVE(state_offset + 1, 0); }
+      break;
+
+
+/* ========================================================================== */
+      /* These opcodes inspect the next subject character, and sometimes
+      the previous one as well, but do not have an argument. The variable
+      clen contains the length of the current character and is zero if we are
+      at the end of the subject. */
+
+      /*-----------------------------------------------------------------*/
+      case OP_ANY:
+      if (clen > 0 && (c != NEWLINE || (ims & PCRE_DOTALL) != 0))
+        { ADD_NEW(state_offset + 1, 0); }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_EODN:
+      if (clen == 0 || (c == NEWLINE && ptr + 1 == end_subject))
+        { ADD_ACTIVE(state_offset + 1, 0); }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_DOLL:
+      if ((md->moptions & PCRE_NOTEOL) == 0)
+        {
+        if (clen == 0 || (c == NEWLINE && (ptr + 1 == end_subject ||
+                                (ims & PCRE_MULTILINE) != 0)))
+          { ADD_ACTIVE(state_offset + 1, 0); }
+        }
+      else if (c == NEWLINE && (ims & PCRE_MULTILINE) != 0)
+        { ADD_ACTIVE(state_offset + 1, 0); }
+      break;
+
+      /*-----------------------------------------------------------------*/
+
+      case OP_DIGIT:
+      case OP_WHITESPACE:
+      case OP_WORDCHAR:
+      if (clen > 0 && c < 256 &&
+            ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0)
+        { ADD_NEW(state_offset + 1, 0); }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_NOT_DIGIT:
+      case OP_NOT_WHITESPACE:
+      case OP_NOT_WORDCHAR:
+      if (clen > 0 && (c >= 256 ||
+            ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0))
+        { ADD_NEW(state_offset + 1, 0); }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_WORD_BOUNDARY:
+      case OP_NOT_WORD_BOUNDARY:
+        {
+        int left_word, right_word;
+
+        if (ptr > start_subject)
+          {
+          const uschar *temp = ptr - 1;
+#ifdef SUPPORT_UTF8
+          if (utf8) BACKCHAR(temp);
+#endif
+          GETCHARTEST(d, temp);
+          left_word = d < 256 && (ctypes[d] & ctype_word) != 0;
+          }
+        else left_word = 0;
+
+        if (clen > 0) right_word = c < 256 && (ctypes[c] & ctype_word) != 0;
+          else right_word = 0;
+
+        if ((left_word == right_word) == (codevalue == OP_NOT_WORD_BOUNDARY))
+          { ADD_ACTIVE(state_offset + 1, 0); }
+        }
+      break;
+
+
+#ifdef SUPPORT_UCP
+
+      /*-----------------------------------------------------------------*/
+      /* Check the next character by Unicode property. We will get here only
+      if the support is in the binary; otherwise a compile-time error occurs.
+      */
+
+      case OP_PROP:
+      case OP_NOTPROP:
+      if (clen > 0)
+        {
+        int rqdtype, category;
+        category = _pcre_ucp_findchar(c, &chartype, &othercase);
+        rqdtype = code[1];
+        if (rqdtype >= 128)
+          {
+          if ((rqdtype - 128 == category) == (codevalue == OP_PROP))
+            { ADD_NEW(state_offset + 2, 0); }
+          }
+        else
+          {
+          if ((rqdtype == chartype) == (codevalue == OP_PROP))
+            { ADD_NEW(state_offset + 2, 0); }
+          }
+        }
+      break;
+#endif
+
+
+
+/* ========================================================================== */
+      /* These opcodes likewise inspect the subject character, but have an
+      argument that is not a data character. It is one of these opcodes:
+      OP_ANY, OP_DIGIT, OP_NOT_DIGIT, OP_WHITESPACE, OP_NOT_SPACE, OP_WORDCHAR,
+      OP_NOT_WORDCHAR. The value is loaded into d. */
+
+      case OP_TYPEPLUS:
+      case OP_TYPEMINPLUS:
+      count = current_state->count;  /* Already matched */
+      if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }
+      if (clen > 0)
+        {
+        if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+            (c < 256 &&
+              (d != OP_ANY || c != '\n' || (ims & PCRE_DOTALL) != 0) &&
+              ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
+          {
+          count++;
+          ADD_NEW(state_offset, count);
+          }
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_TYPEQUERY:
+      case OP_TYPEMINQUERY:
+      ADD_ACTIVE(state_offset + 2, 0);
+      if (clen > 0)
+        {
+        if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+            (c < 256 &&
+              (d != OP_ANY || c != '\n' || (ims & PCRE_DOTALL) != 0) &&
+              ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
+          {
+          ADD_NEW(state_offset + 2, 0);
+          }
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_TYPESTAR:
+      case OP_TYPEMINSTAR:
+      ADD_ACTIVE(state_offset + 2, 0);
+      if (clen > 0)
+        {
+        if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+            (c < 256 &&
+              (d != OP_ANY || c != '\n' || (ims & PCRE_DOTALL) != 0) &&
+              ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
+          {
+          ADD_NEW(state_offset, 0);
+          }
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_TYPEEXACT:
+      case OP_TYPEUPTO:
+      case OP_TYPEMINUPTO:
+      if (codevalue != OP_TYPEEXACT)
+        { ADD_ACTIVE(state_offset + 4, 0); }
+      count = current_state->count;  /* Number already matched */
+      if (clen > 0)
+        {
+        if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) ||
+            (c < 256 &&
+              (d != OP_ANY || c != '\n' || (ims & PCRE_DOTALL) != 0) &&
+              ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0))
+          {
+          if (++count >= GET2(code, 1))
+            { ADD_NEW(state_offset + 4, 0); }
+          else
+            { ADD_NEW(state_offset, count); }
+          }
+        }
+      break;
+
+/* ========================================================================== */
+      /* These are virtual opcodes that are used when something like
+      OP_TYPEPLUS has OP_PROP, OP_NOTPROP, or OP_EXTUNI as its argument. It
+      keeps the code above fast for the other cases. The argument is in the
+      d variable. */
+
+      case OP_PROP_EXTRA + OP_TYPEPLUS:
+      case OP_PROP_EXTRA + OP_TYPEMINPLUS:
+      count = current_state->count;           /* Already matched */
+      if (count > 0) { ADD_ACTIVE(state_offset + 3, 0); }
+      if (clen > 0)
+        {
+        int category = _pcre_ucp_findchar(c, &chartype, &othercase);
+        int rqdtype = code[2];
+        if ((d == OP_PROP) ==
+            (rqdtype == ((rqdtype >= 128)? (category + 128) : chartype)))
+          { count++; ADD_NEW(state_offset, count); }
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_EXTUNI_EXTRA + OP_TYPEPLUS:
+      case OP_EXTUNI_EXTRA + OP_TYPEMINPLUS:
+      count = current_state->count;  /* Already matched */
+      if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); }
+      if (clen > 0 && _pcre_ucp_findchar(c, &chartype, &othercase) != ucp_M)
+        {
+        const uschar *nptr = ptr + clen;
+        int ncount = 0;
+        while (nptr < end_subject)
+          {
+          int nd;
+          int ndlen = 1;
+          GETCHARLEN(nd, nptr, ndlen);
+          if (_pcre_ucp_findchar(nd, &chartype, &othercase) != ucp_M) break;
+          ncount++;
+          nptr += ndlen;
+          }
+        count++;
+        ADD_NEW_DATA(-state_offset, count, ncount);
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_PROP_EXTRA + OP_TYPEQUERY:
+      case OP_PROP_EXTRA + OP_TYPEMINQUERY:
+      count = 3;
+      goto QS1;
+
+      case OP_PROP_EXTRA + OP_TYPESTAR:
+      case OP_PROP_EXTRA + OP_TYPEMINSTAR:
+      count = 0;
+
+      QS1:
+
+      ADD_ACTIVE(state_offset + 3, 0);
+      if (clen > 0)
+        {
+        int category = _pcre_ucp_findchar(c, &chartype, &othercase);
+        int rqdtype = code[2];
+        if ((d == OP_PROP) ==
+            (rqdtype == ((rqdtype >= 128)? (category + 128) : chartype)))
+          { ADD_NEW(state_offset + count, 0); }
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_EXTUNI_EXTRA + OP_TYPEQUERY:
+      case OP_EXTUNI_EXTRA + OP_TYPEMINQUERY:
+      count = 2;
+      goto QS2;
+
+      case OP_EXTUNI_EXTRA + OP_TYPESTAR:
+      case OP_EXTUNI_EXTRA + OP_TYPEMINSTAR:
+      count = 0;
+
+      QS2:
+
+      ADD_ACTIVE(state_offset + 2, 0);
+      if (clen > 0 && _pcre_ucp_findchar(c, &chartype, &othercase) != ucp_M)
+        {
+        const uschar *nptr = ptr + clen;
+        int ncount = 0;
+        while (nptr < end_subject)
+          {
+          int nd;
+          int ndlen = 1;
+          GETCHARLEN(nd, nptr, ndlen);
+          if (_pcre_ucp_findchar(nd, &chartype, &othercase) != ucp_M) break;
+          ncount++;
+          nptr += ndlen;
+          }
+        ADD_NEW_DATA(-(state_offset + count), 0, ncount);
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_PROP_EXTRA + OP_TYPEEXACT:
+      case OP_PROP_EXTRA + OP_TYPEUPTO:
+      case OP_PROP_EXTRA + OP_TYPEMINUPTO:
+      if (codevalue != OP_PROP_EXTRA + OP_TYPEEXACT)
+        { ADD_ACTIVE(state_offset + 5, 0); }
+      count = current_state->count;  /* Number already matched */
+      if (clen > 0)
+        {
+        int category = _pcre_ucp_findchar(c, &chartype, &othercase);
+        int rqdtype = code[4];
+        if ((d == OP_PROP) ==
+            (rqdtype == ((rqdtype >= 128)? (category + 128) : chartype)))
+          {
+          if (++count >= GET2(code, 1))
+            { ADD_NEW(state_offset + 5, 0); }
+          else
+            { ADD_NEW(state_offset, count); }
+          }
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_EXTUNI_EXTRA + OP_TYPEEXACT:
+      case OP_EXTUNI_EXTRA + OP_TYPEUPTO:
+      case OP_EXTUNI_EXTRA + OP_TYPEMINUPTO:
+      if (codevalue != OP_EXTUNI_EXTRA + OP_TYPEEXACT)
+        { ADD_ACTIVE(state_offset + 4, 0); }
+      count = current_state->count;  /* Number already matched */
+      if (clen > 0 && _pcre_ucp_findchar(c, &chartype, &othercase) != ucp_M)
+        {
+        const uschar *nptr = ptr + clen;
+        int ncount = 0;
+        while (nptr < end_subject)
+          {
+          int nd;
+          int ndlen = 1;
+          GETCHARLEN(nd, nptr, ndlen);
+          if (_pcre_ucp_findchar(nd, &chartype, &othercase) != ucp_M) break;
+          ncount++;
+          nptr += ndlen;
+          }
+        if (++count >= GET2(code, 1))
+          { ADD_NEW_DATA(-(state_offset + 4), 0, ncount); }
+        else
+          { ADD_NEW_DATA(-state_offset, count, ncount); }
+        }
+      break;
+
+/* ========================================================================== */
+      /* These opcodes are followed by a character that is usually compared
+      to the current subject character; it is loaded into d. We still get
+      here even if there is no subject character, because in some cases zero
+      repetitions are permitted. */
+
+      /*-----------------------------------------------------------------*/
+      case OP_CHAR:
+      if (clen > 0 && c == d) { ADD_NEW(state_offset + dlen + 1, 0); }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_CHARNC:
+      if (clen == 0) break;
+
+#ifdef SUPPORT_UTF8
+      if (utf8)
+        {
+        if (c == d) { ADD_NEW(state_offset + dlen + 1, 0); } else
+          {
+          if (c < 128) othercase = fcc[c]; else
+
+          /* If we have Unicode property support, we can use it to test the
+          other case of the character, if there is one. The result of
+          _pcre_ucp_findchar() is < 0 if the char isn't found, and othercase is
+          returned as zero if there isn't another case. */
+
+#ifdef SUPPORT_UCP
+          if (_pcre_ucp_findchar(c, &chartype, &othercase) < 0)
+#endif
+            othercase = -1;
+
+          if (d == othercase) { ADD_NEW(state_offset + dlen + 1, 0); }
+          }
+        }
+      else
+#endif  /* SUPPORT_UTF8 */
+
+      /* Non-UTF-8 mode */
+        {
+        if (lcc[c] == lcc[d]) { ADD_NEW(state_offset + 2, 0); }
+        }
+      break;
+
+
+#ifdef SUPPORT_UCP
+      /*-----------------------------------------------------------------*/
+      /* This is a tricky one because it can match more than one character.
+      Find out how many characters to skip, and then set up a negative state
+      to wait for them to pass before continuing. */
+
+      case OP_EXTUNI:
+      if (clen > 0 && _pcre_ucp_findchar(c, &chartype, &othercase) != ucp_M)
+        {
+        const uschar *nptr = ptr + clen;
+        int ncount = 0;
+        while (nptr < end_subject)
+          {
+          int nclen = 1;
+          GETCHARLEN(c, nptr, nclen);
+          if (_pcre_ucp_findchar(c, &chartype, &othercase) != ucp_M) break;
+          ncount++;
+          nptr += nclen;
+          }
+        ADD_NEW_DATA(-(state_offset + 1), 0, ncount);
+        }
+      break;
+#endif
+
+      /*-----------------------------------------------------------------*/
+      /* Match a negated single character. This is only used for one-byte
+      characters, that is, we know that d < 256. The character we are
+      checking (c) can be multibyte. */
+
+      case OP_NOT:
+      if (clen > 0)
+        {
+        int otherd = ((ims & PCRE_CASELESS) != 0)? fcc[d] : d;
+        if (c != d && c != otherd) { ADD_NEW(state_offset + dlen + 1, 0); }
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_PLUS:
+      case OP_MINPLUS:
+      case OP_NOTPLUS:
+      case OP_NOTMINPLUS:
+      count = current_state->count;  /* Already matched */
+      if (count > 0) { ADD_ACTIVE(state_offset + dlen + 1, 0); }
+      if (clen > 0)
+        {
+        int otherd = -1;
+        if ((ims & PCRE_CASELESS) != 0)
+          {
+#ifdef SUPPORT_UTF8
+          if (utf8 && c >= 128)
+            {
+#ifdef SUPPORT_UCP
+            if (_pcre_ucp_findchar(d, &chartype, &otherd) < 0) otherd = -1;
+#endif  /* SUPPORT_UCP */
+            }
+          else
+#endif  /* SUPPORT_UTF8 */
+          otherd = fcc[d];
+          }
+        if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
+          { count++; ADD_NEW(state_offset, count); }
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_QUERY:
+      case OP_MINQUERY:
+      case OP_NOTQUERY:
+      case OP_NOTMINQUERY:
+      ADD_ACTIVE(state_offset + dlen + 1, 0);
+      if (clen > 0)
+        {
+        int otherd = -1;
+        if ((ims && PCRE_CASELESS) != 0)
+          {
+#ifdef SUPPORT_UTF8
+          if (utf8 && c >= 128)
+            {
+#ifdef SUPPORT_UCP
+            if (_pcre_ucp_findchar(c, &chartype, &otherd) < 0) otherd = -1;
+#endif  /* SUPPORT_UCP */
+            }
+          else
+#endif  /* SUPPORT_UTF8 */
+          otherd = fcc[d];
+          }
+        if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
+          { ADD_NEW(state_offset + dlen + 1, 0); }
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_STAR:
+      case OP_MINSTAR:
+      case OP_NOTSTAR:
+      case OP_NOTMINSTAR:
+      ADD_ACTIVE(state_offset + dlen + 1, 0);
+      if (clen > 0)
+        {
+        int otherd = -1;
+        if ((ims && PCRE_CASELESS) != 0)
+          {
+#ifdef SUPPORT_UTF8
+          if (utf8 && c >= 128)
+            {
+#ifdef SUPPORT_UCP
+            if (_pcre_ucp_findchar(c, &chartype, &otherd) < 0) otherd = -1;
+#endif  /* SUPPORT_UCP */
+            }
+          else
+#endif  /* SUPPORT_UTF8 */
+          otherd = fcc[d];
+          }
+        if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
+          { ADD_NEW(state_offset, 0); }
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_EXACT:
+      case OP_UPTO:
+      case OP_MINUPTO:
+      case OP_NOTEXACT:
+      case OP_NOTUPTO:
+      case OP_NOTMINUPTO:
+      if (codevalue != OP_EXACT && codevalue != OP_NOTEXACT)
+        { ADD_ACTIVE(state_offset + dlen + 3, 0); }
+      count = current_state->count;  /* Number already matched */
+      if (clen > 0)
+        {
+        int otherd = -1;
+        if ((ims & PCRE_CASELESS) != 0)
+          {
+#ifdef SUPPORT_UTF8
+          if (utf8 && c >= 128)
+            {
+#ifdef SUPPORT_UCP
+            if (_pcre_ucp_findchar(d, &chartype, &otherd) < 0) otherd = -1;
+#endif  /* SUPPORT_UCP */
+            }
+          else
+#endif  /* SUPPORT_UTF8 */
+          otherd = fcc[d];
+          }
+        if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR))
+          {
+          if (++count >= GET2(code, 1))
+            { ADD_NEW(state_offset + dlen + 3, 0); }
+          else
+            { ADD_NEW(state_offset, count); }
+          }
+        }
+      break;
+
+
+/* ========================================================================== */
+      /* These are the class-handling opcodes */
+
+      case OP_CLASS:
+      case OP_NCLASS:
+      case OP_XCLASS:
+        {
+        BOOL isinclass = FALSE;
+        int next_state_offset;
+        const uschar *ecode;
+
+        /* For a simple class, there is always just a 32-byte table, and we
+        can set isinclass from it. */
+
+        if (codevalue != OP_XCLASS)
+          {
+          ecode = code + 33;
+          if (clen > 0)
+            {
+            isinclass = (c > 255)? (codevalue == OP_NCLASS) :
+              ((code[1 + c/8] & (1 << (c&7))) != 0);
+            }
+          }
+
+        /* An extended class may have a table or a list of single characters,
+        ranges, or both, and it may be positive or negative. There's a
+        function that sorts all this out. */
+
+        else
+         {
+         ecode = code + GET(code, 1);
+         if (clen > 0) isinclass = _pcre_xclass(c, code + 1 + LINK_SIZE);
+         }
+
+        /* At this point, isinclass is set for all kinds of class, and ecode
+        points to the byte after the end of the class. If there is a
+        quantifier, this is where it will be. */
+
+        next_state_offset = ecode - start_code;
+
+        switch (*ecode)
+          {
+          case OP_CRSTAR:
+          case OP_CRMINSTAR:
+          ADD_ACTIVE(next_state_offset + 1, 0);
+          if (isinclass) { ADD_NEW(state_offset, 0); }
+          break;
+
+          case OP_CRPLUS:
+          case OP_CRMINPLUS:
+          count = current_state->count;  /* Already matched */
+          if (count > 0) { ADD_ACTIVE(next_state_offset + 1, 0); }
+          if (isinclass) { count++; ADD_NEW(state_offset, count); }
+          break;
+
+          case OP_CRQUERY:
+          case OP_CRMINQUERY:
+          ADD_ACTIVE(next_state_offset + 1, 0);
+          if (isinclass) { ADD_NEW(next_state_offset + 1, 0); }
+          break;
+
+          case OP_CRRANGE:
+          case OP_CRMINRANGE:
+          count = current_state->count;  /* Already matched */
+          if (count >= GET2(ecode, 1))
+            { ADD_ACTIVE(next_state_offset + 5, 0); }
+          if (isinclass)
+            {
+            if (++count >= GET2(ecode, 3))
+              { ADD_NEW(next_state_offset + 5, 0); }
+            else
+              { ADD_NEW(state_offset, count); }
+            }
+          break;
+
+          default:
+          if (isinclass) { ADD_NEW(next_state_offset, 0); }
+          break;
+          }
+        }
+      break;
+
+/* ========================================================================== */
+      /* These are the opcodes for fancy brackets of various kinds. We have
+      to use recursion in order to handle them. */
+
+      case OP_ASSERT:
+      case OP_ASSERT_NOT:
+      case OP_ASSERTBACK:
+      case OP_ASSERTBACK_NOT:
+        {
+        int rc;
+        int local_offsets[2];
+        int local_workspace[1000];
+        const uschar *endasscode = code + GET(code, 1);
+
+        while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1);
+
+        rc = internal_dfa_exec(
+          md,                                   /* static match data */
+          code,                                 /* this subexpression's code */
+          ptr,                                  /* where we currently are */
+          ptr - start_subject,                  /* start offset */
+          local_offsets,                        /* offset vector */
+          sizeof(local_offsets)/sizeof(int),    /* size of same */
+          local_workspace,                      /* workspace vector */
+          sizeof(local_workspace)/sizeof(int),  /* size of same */
+          ims,                                  /* the current ims flags */
+          rlevel,                               /* function recursion level */
+          recursing);                           /* pass on regex recursion */
+
+        if ((rc >= 0) == (codevalue == OP_ASSERT || codevalue == OP_ASSERTBACK))
+            { ADD_ACTIVE(endasscode + LINK_SIZE + 1 - start_code, 0); }
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_COND:
+        {
+        int local_offsets[1000];
+        int local_workspace[1000];
+        int condcode = code[LINK_SIZE+1];
+
+        /* The only supported version of OP_CREF is for the value 0xffff, which
+        means "test if in a recursion". */
+
+        if (condcode == OP_CREF)
+          {
+          int value = GET2(code, LINK_SIZE+2);
+          if (value != 0xffff) return PCRE_ERROR_DFA_UCOND;
+          if (recursing > 0) { ADD_ACTIVE(state_offset + LINK_SIZE + 4, 0); }
+            else { ADD_ACTIVE(state_offset + GET(code, 1) + LINK_SIZE + 1, 0); }
+          }
+
+        /* Otherwise, the condition is an assertion */
+
+        else
+          {
+          int rc;
+          const uschar *asscode = code + LINK_SIZE + 1;
+          const uschar *endasscode = asscode + GET(asscode, 1);
+
+          while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1);
+
+          rc = internal_dfa_exec(
+            md,                                   /* fixed match data */
+            asscode,                              /* this subexpression's code */
+            ptr,                                  /* where we currently are */
+            ptr - start_subject,                  /* start offset */
+            local_offsets,                        /* offset vector */
+            sizeof(local_offsets)/sizeof(int),    /* size of same */
+            local_workspace,                      /* workspace vector */
+            sizeof(local_workspace)/sizeof(int),  /* size of same */
+            ims,                                  /* the current ims flags */
+            rlevel,                               /* function recursion level */
+            recursing);                           /* pass on regex recursion */
+
+          if ((rc >= 0) ==
+                (condcode == OP_ASSERT || condcode == OP_ASSERTBACK))
+            { ADD_ACTIVE(endasscode + LINK_SIZE + 1 - start_code, 0); }
+          else
+            { ADD_ACTIVE(state_offset + GET(code, 1) + LINK_SIZE + 1, 0); }
+          }
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_RECURSE:
+        {
+        int local_offsets[1000];
+        int local_workspace[1000];
+        int rc;
+
+        DPRINTF(("%.*sStarting regex recursion %d\n", rlevel*2-2, SP,
+          recursing + 1));
+
+        rc = internal_dfa_exec(
+          md,                                   /* fixed match data */
+          start_code + GET(code, 1),            /* this subexpression's code */
+          ptr,                                  /* where we currently are */
+          ptr - start_subject,                  /* start offset */
+          local_offsets,                        /* offset vector */
+          sizeof(local_offsets)/sizeof(int),    /* size of same */
+          local_workspace,                      /* workspace vector */
+          sizeof(local_workspace)/sizeof(int),  /* size of same */
+          ims,                                  /* the current ims flags */
+          rlevel,                               /* function recursion level */
+          recursing + 1);                       /* regex recurse level */
+
+        DPRINTF(("%.*sReturn from regex recursion %d: rc=%d\n", rlevel*2-2, SP,
+          recursing + 1, rc));
+
+        /* Ran out of internal offsets */
+
+        if (rc == 0) return PCRE_ERROR_DFA_RECURSE;
+
+        /* For each successful matched substring, set up the next state with a
+        count of characters to skip before trying it. Note that the count is in
+        characters, not bytes. */
+
+        if (rc > 0)
+          {
+          for (rc = rc*2 - 2; rc >= 0; rc -= 2)
+            {
+            const uschar *p = start_subject + local_offsets[rc];
+            const uschar *pp = start_subject + local_offsets[rc+1];
+            int charcount = local_offsets[rc+1] - local_offsets[rc];
+            while (p < pp) if ((*p++ & 0xc0) == 0x80) charcount--;
+            if (charcount > 0)
+              {
+              ADD_NEW_DATA(-(state_offset + LINK_SIZE + 1), 0, (charcount - 1));
+              }
+            else
+              {
+              ADD_ACTIVE(state_offset + LINK_SIZE + 1, 0);
+              }
+            }
+          }
+        else if (rc != PCRE_ERROR_NOMATCH) return rc;
+        }
+      break;
+
+      /*-----------------------------------------------------------------*/
+      case OP_ONCE:
+        {
+        int local_offsets[2];
+        int local_workspace[1000];
+
+        int rc = internal_dfa_exec(
+          md,                                   /* fixed match data */
+          code,                                 /* this subexpression's code */
+          ptr,                                  /* where we currently are */
+          ptr - start_subject,                  /* start offset */
+          local_offsets,                        /* offset vector */
+          sizeof(local_offsets)/sizeof(int),    /* size of same */
+          local_workspace,                      /* workspace vector */
+          sizeof(local_workspace)/sizeof(int),  /* size of same */
+          ims,                                  /* the current ims flags */
+          rlevel,                               /* function recursion level */
+          recursing);                           /* pass on regex recursion */
+
+        if (rc >= 0)
+          {
+          const uschar *end_subpattern = code;
+          int charcount = local_offsets[1] - local_offsets[0];
+          int next_state_offset, repeat_state_offset;
+
+          do { end_subpattern += GET(end_subpattern, 1); }
+            while (*end_subpattern == OP_ALT);
+          next_state_offset = end_subpattern - start_code + LINK_SIZE + 1;
+
+          /* If the end of this subpattern is KETRMAX or KETRMIN, we must
+          arrange for the repeat state also to be added to the relevant list.
+          Calculate the offset, or set -1 for no repeat. */
+
+          repeat_state_offset = (*end_subpattern == OP_KETRMAX ||
+                                 *end_subpattern == OP_KETRMIN)?
+            end_subpattern - start_code - GET(end_subpattern, 1) : -1;
+
+          /* If we have matched an empty string, add the next state at the
+          current character pointer. This is important so that the duplicate
+          checking kicks in, which is what breaks infinite loops that match an
+          empty string. */
+
+          if (charcount == 0)
+            {
+            ADD_ACTIVE(next_state_offset, 0);
+            }
+
+          /* Optimization: if there are no more active states, and there
+          are no new states yet set up, then skip over the subject string
+          right here, to save looping. Otherwise, set up the new state to swing
+          into action when the end of the substring is reached. */
+
+          else if (i + 1 >= active_count && new_count == 0)
+            {
+            ptr += charcount;
+            clen = 0;
+            ADD_NEW(next_state_offset, 0);
+
+            /* If we are adding a repeat state at the new character position,
+            we must fudge things so that it is the only current state.
+            Otherwise, it might be a duplicate of one we processed before, and
+            that would cause it to be skipped. */
+
+            if (repeat_state_offset >= 0)
+              {
+              next_active_state = active_states;
+              active_count = 0;
+              i = -1;
+              ADD_ACTIVE(repeat_state_offset, 0);
+              }
+            }
+          else
+            {
+            const uschar *p = start_subject + local_offsets[0];
+            const uschar *pp = start_subject + local_offsets[1];
+            while (p < pp) if ((*p++ & 0xc0) == 0x80) charcount--;
+            ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1));
+            if (repeat_state_offset >= 0)
+              { ADD_NEW_DATA(-repeat_state_offset, 0, (charcount - 1)); }
+            }
+
+          }
+        else if (rc != PCRE_ERROR_NOMATCH) return rc;
+        }
+      break;
+
+
+/* ========================================================================== */
+      /* Handle callouts */
+
+      case OP_CALLOUT:
+      if (pcre_callout != NULL)
+        {
+        int rrc;
+        pcre_callout_block cb;
+        cb.version          = 1;   /* Version 1 of the callout block */
+        cb.callout_number   = code[1];
+        cb.offset_vector    = offsets;
+        cb.subject          = (char *)start_subject;
+        cb.subject_length   = end_subject - start_subject;
+        cb.start_match      = current_subject - start_subject;
+        cb.current_position = ptr - start_subject;
+        cb.pattern_position = GET(code, 2);
+        cb.next_item_length = GET(code, 2 + LINK_SIZE);
+        cb.capture_top      = 1;
+        cb.capture_last     = -1;
+        cb.callout_data     = md->callout_data;
+        if ((rrc = (*pcre_callout)(&cb)) < 0) return rrc;   /* Abandon */
+        if (rrc == 0) { ADD_ACTIVE(state_offset + 2 + 2*LINK_SIZE, 0); }
+        }
+      break;
+
+
+/* ========================================================================== */
+      default:        /* Unsupported opcode */
+      return PCRE_ERROR_DFA_UITEM;
+      }
+
+    NEXT_ACTIVE_STATE: continue;
+
+    }      /* End of loop scanning active states */
+
+  /* We have finished the processing at the current subject character. If no
+  new states have been set for the next character, we have found all the
+  matches that we are going to find. If we are at the top level and partial
+  matching has been requested, check for appropriate conditions. */
+
+  if (new_count <= 0)
+    {
+    if (match_count < 0 &&                     /* No matches found */
+        rlevel == 1 &&                         /* Top level match function */
+        (md->moptions & PCRE_PARTIAL) != 0 &&  /* Want partial matching */
+        ptr >= end_subject &&                  /* Reached end of subject */
+        ptr > current_subject)                 /* Matched non-empty string */
+      {
+      if (offsetcount >= 2)
+        {
+        offsets[0] = current_subject - start_subject;
+        offsets[1] = end_subject - start_subject;
+        }
+      match_count = PCRE_ERROR_PARTIAL;
+      }
+
+    DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n"
+      "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, match_count,
+      rlevel*2-2, SP));
+    return match_count;
+    }
+
+  /* One or more states are active for the next character. */
+
+  ptr += clen;    /* Advance to next subject character */
+  }               /* Loop to move along the subject string */
+
+/* Control never gets here, but we must keep the compiler happy. */
+
+DPRINTF(("%.*s+++ Unexpected end of internal_dfa_exec %d +++\n"
+  "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, rlevel*2-2, SP));
+return PCRE_ERROR_NOMATCH;
+}
+
+
+
+
+/*************************************************
+*    Execute a Regular Expression - DFA engine   *
+*************************************************/
+
+/* This external function applies a compiled re to a subject string using a DFA
+engine. This function calls the internal function multiple times if the pattern
+is not anchored.
+
+Arguments:
+  argument_re     points to the compiled expression
+  extra_data      points to extra data or is NULL (not currently used)
+  subject         points to the subject string
+  length          length of subject string (may contain binary zeros)
+  start_offset    where to start in the subject string
+  options         option bits
+  offsets         vector of match offsets
+  offsetcount     size of same
+  workspace       workspace vector
+  wscount         size of same
+
+Returns:          > 0 => number of match offset pairs placed in offsets
+                  = 0 => offsets overflowed; longest matches are present
+                   -1 => failed to match
+                 < -1 => some kind of unexpected problem
+*/
+
+PCRE_EXPORT int
+pcre_dfa_exec(const pcre *argument_re, const pcre_extra *extra_data,
+  const char *subject, int length, int start_offset, int options, int *offsets,
+  int offsetcount, int *workspace, int wscount)
+{
+real_pcre *re = (real_pcre *)argument_re;
+dfa_match_data match_block;
+BOOL utf8, anchored, startline, firstline;
+const uschar *current_subject, *end_subject, *lcc;
+
+pcre_study_data internal_study;
+const pcre_study_data *study = NULL;
+real_pcre internal_re;
+
+const uschar *req_byte_ptr;
+const uschar *start_bits = NULL;
+BOOL first_byte_caseless = FALSE;
+BOOL req_byte_caseless = FALSE;
+int first_byte = -1;
+int req_byte = -1;
+int req_byte2 = -1;
+
+/* Plausibility checks */
+
+if ((options & ~PUBLIC_DFA_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;
+if (re == NULL || subject == NULL || workspace == NULL ||
+   (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;
+if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;
+if (wscount < 20) return PCRE_ERROR_DFA_WSSIZE;
+
+/* We need to find the pointer to any study data before we test for byte
+flipping, so we scan the extra_data block first. This may set two fields in the
+match block, so we must initialize them beforehand. However, the other fields
+in the match block must not be set until after the byte flipping. */
+
+match_block.tables = re->tables;
+match_block.callout_data = NULL;
+
+if (extra_data != NULL)
+  {
+  unsigned int flags = extra_data->flags;
+  if ((flags & PCRE_EXTRA_STUDY_DATA) != 0)
+    study = (const pcre_study_data *)extra_data->study_data;
+  if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0) return PCRE_ERROR_DFA_UMLIMIT;
+  if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0)
+    match_block.callout_data = extra_data->callout_data;
+  if ((flags & PCRE_EXTRA_TABLES) != 0)
+    match_block.tables = extra_data->tables;
+  }
+
+/* Check that the first field in the block is the magic number. If it is not,
+test for a regex that was compiled on a host of opposite endianness. If this is
+the case, flipped values are put in internal_re and internal_study if there was
+study data too. */
+
+if (re->magic_number != MAGIC_NUMBER)
+  {
+  re = _pcre_try_flipped(re, &internal_re, study, &internal_study);
+  if (re == NULL) return PCRE_ERROR_BADMAGIC;
+  if (study != NULL) study = &internal_study;
+  }
+
+/* Set some local values */
+
+current_subject = (const unsigned char *)subject + start_offset;
+end_subject = (const unsigned char *)subject + length;
+req_byte_ptr = current_subject - 1;
+
+utf8 = (re->options & PCRE_UTF8) != 0;
+anchored = (options & PCRE_ANCHORED) != 0 || (re->options & PCRE_ANCHORED) != 0;
+
+/* The remaining fixed data for passing around. */
+
+match_block.start_code = (const uschar *)argument_re +
+    re->name_table_offset + re->name_count * re->name_entry_size;
+match_block.start_subject = (const unsigned char *)subject;
+match_block.end_subject = end_subject;
+match_block.moptions = options;
+match_block.poptions = re->options;
+
+/* Check a UTF-8 string if required. Unfortunately there's no way of passing
+back the character offset. */
+
+#ifdef SUPPORT_UTF8
+if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0)
+  {
+  if (_pcre_valid_utf8((uschar *)subject, length) >= 0)
+    return PCRE_ERROR_BADUTF8;
+  if (start_offset > 0 && start_offset < length)
+    {
+    int tb = ((uschar *)subject)[start_offset];
+    if (tb > 127)
+      {
+      tb &= 0xc0;
+      if (tb != 0 && tb != 0xc0) return PCRE_ERROR_BADUTF8_OFFSET;
+      }
+    }
+  }
+#endif
+
+/* If the exec call supplied NULL for tables, use the inbuilt ones. This
+is a feature that makes it possible to save compiled regex and re-use them
+in other programs later. */
+
+if (match_block.tables == NULL) match_block.tables = _pcre_default_tables;
+
+/* The lower casing table and the "must be at the start of a line" flag are
+used in a loop when finding where to start. */
+
+lcc = match_block.tables + lcc_offset;
+startline = (re->options & PCRE_STARTLINE) != 0;
+firstline = (re->options & PCRE_FIRSTLINE) != 0;
+
+/* Set up the first character to match, if available. The first_byte value is
+never set for an anchored regular expression, but the anchoring may be forced
+at run time, so we have to test for anchoring. The first char may be unset for
+an unanchored pattern, of course. If there's no first char and the pattern was
+studied, there may be a bitmap of possible first characters. */
+
+if (!anchored)
+  {
+  if ((re->options & PCRE_FIRSTSET) != 0)
+    {
+    first_byte = re->first_byte & 255;
+    if ((first_byte_caseless = ((re->first_byte & REQ_CASELESS) != 0)) == TRUE)
+      first_byte = lcc[first_byte];
+    }
+  else
+    {
+    if (startline && study != NULL &&
+         (study->options & PCRE_STUDY_MAPPED) != 0)
+      start_bits = study->start_bits;
+    }
+  }
+
+/* For anchored or unanchored matches, there may be a "last known required
+character" set. */
+
+if ((re->options & PCRE_REQCHSET) != 0)
+  {
+  req_byte = re->req_byte & 255;
+  req_byte_caseless = (re->req_byte & REQ_CASELESS) != 0;
+  req_byte2 = (match_block.tables + fcc_offset)[req_byte];  /* case flipped */
+  }
+
+/* Call the main matching function, looping for a non-anchored regex after a
+failed match. Unless restarting, optimize by moving to the first match
+character if possible, when not anchored. Then unless wanting a partial match,
+check for a required later character. */
+
+for (;;)
+  {
+  int rc;
+
+  if ((options & PCRE_DFA_RESTART) == 0)
+    {
+    const uschar *save_end_subject = end_subject;
+
+    /* Advance to a unique first char if possible. If firstline is TRUE, the
+    start of the match is constrained to the first line of a multiline string.
+    Implement this by temporarily adjusting end_subject so that we stop scanning
+    at a newline. If the match fails at the newline, later code breaks this loop.
+    */
+
+    if (firstline)
+      {
+      const uschar *t = current_subject;
+      while (t < save_end_subject && *t != '\n') t++;
+      end_subject = t;
+      }
+
+    if (first_byte >= 0)
+      {
+      if (first_byte_caseless)
+        while (current_subject < end_subject &&
+               lcc[*current_subject] != first_byte)
+          current_subject++;
+      else
+        while (current_subject < end_subject && *current_subject != first_byte)
+          current_subject++;
+      }
+
+    /* Or to just after \n for a multiline match if possible */
+
+    else if (startline)
+      {
+      if (current_subject > match_block.start_subject + start_offset)
+        {
+        while (current_subject < end_subject && current_subject[-1] != NEWLINE)
+          current_subject++;
+        }
+      }
+
+    /* Or to a non-unique first char after study */
+
+    else if (start_bits != NULL)
+      {
+      while (current_subject < end_subject)
+        {
+        register unsigned int c = *current_subject;
+        if ((start_bits[c/8] & (1 << (c&7))) == 0) current_subject++;
+          else break;
+        }
+      }
+
+    /* Restore fudged end_subject */
+
+    end_subject = save_end_subject;
+    }
+
+  /* If req_byte is set, we know that that character must appear in the subject
+  for the match to succeed. If the first character is set, req_byte must be
+  later in the subject; otherwise the test starts at the match point. This
+  optimization can save a huge amount of work in patterns with nested unlimited
+  repeats that aren't going to match. Writing separate code for cased/caseless
+  versions makes it go faster, as does using an autoincrement and backing off
+  on a match.
+
+  HOWEVER: when the subject string is very, very long, searching to its end can
+  take a long time, and give bad performance on quite ordinary patterns. This
+  showed up when somebody was matching /^C/ on a 32-megabyte string... so we
+  don't do this when the string is sufficiently long.
+
+  ALSO: this processing is disabled when partial matching is requested.
+  */
+
+  if (req_byte >= 0 &&
+      end_subject - current_subject < REQ_BYTE_MAX &&
+      (options & PCRE_PARTIAL) == 0)
+    {
+    register const uschar *p = current_subject + ((first_byte >= 0)? 1 : 0);
+
+    /* We don't need to repeat the search if we haven't yet reached the
+    place we found it at last time. */
+
+    if (p > req_byte_ptr)
+      {
+      if (req_byte_caseless)
+        {
+        while (p < end_subject)
+          {
+          register int pp = *p++;
+          if (pp == req_byte || pp == req_byte2) { p--; break; }
+          }
+        }
+      else
+        {
+        while (p < end_subject)
+          {
+          if (*p++ == req_byte) { p--; break; }
+          }
+        }
+
+      /* If we can't find the required character, break the matching loop,
+      which will cause a return or PCRE_ERROR_NOMATCH. */
+
+      if (p >= end_subject) break;
+
+      /* If we have found the required character, save the point where we
+      found it, so that we don't search again next time round the loop if
+      the start hasn't passed this character yet. */
+
+      req_byte_ptr = p;
+      }
+    }
+
+  /* OK, now we can do the business */
+
+  rc = internal_dfa_exec(
+    &match_block,                              /* fixed match data */
+    match_block.start_code,                    /* this subexpression's code */
+    current_subject,                           /* where we currently are */
+    start_offset,                              /* start offset in subject */
+    offsets,                                   /* offset vector */
+    offsetcount,                               /* size of same */
+    workspace,                                 /* workspace vector */
+    wscount,                                   /* size of same */
+    re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL), /* ims flags */
+    0,                                         /* function recurse level */
+    0);                                        /* regex recurse level */
+
+  /* Anything other than "no match" means we are done, always; otherwise, carry
+  on only if not anchored. */
+
+  if (rc != PCRE_ERROR_NOMATCH || anchored) return rc;
+
+  /* Advance to the next subject character unless we are at the end of a line
+  and firstline is set. */
+
+  if (firstline && *current_subject == NEWLINE) break;
+  current_subject++;
+
+#ifdef SUPPORT_UTF8
+  if (utf8)
+    {
+    while (current_subject < end_subject && (*current_subject & 0xc0) == 0x80)
+      current_subject++;
+    }
+#endif
+
+  if (current_subject > end_subject) break;
+  }
+
+return PCRE_ERROR_NOMATCH;
+}
+
+/* End of pcre_dfa_exec.c */
diff -Nurp tin-1.6.2/pcre/pcre_exec.c tin-1.8.0/pcre/pcre_exec.c
--- tin-1.6.2/pcre/pcre_exec.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_exec.c	2005-09-12 16:38:16.000000000 +0200
@@ -0,0 +1,3632 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains pcre_exec(), the externally visible function that does
+pattern matching using an NFA algorithm, trying to mimic Perl as closely as
+possible. There are also some static supporting functions. */
+
+
+#include "pcre_internal.h"
+
+
+/* Structure for building a chain of data that actually lives on the
+stack, for holding the values of the subject pointer at the start of each
+subpattern, so as to detect when an empty string has been matched by a
+subpattern - to break infinite loops. When NO_RECURSE is set, these blocks
+are on the heap, not on the stack. */
+
+typedef struct eptrblock {
+  struct eptrblock *epb_prev;
+  const uschar *epb_saved_eptr;
+} eptrblock;
+
+/* Flag bits for the match() function */
+
+#define match_condassert   0x01    /* Called to check a condition assertion */
+#define match_isgroup      0x02    /* Set if start of bracketed group */
+
+/* Non-error returns from the match() function. Error returns are externally
+defined PCRE_ERROR_xxx codes, which are all negative. */
+
+#define MATCH_MATCH        1
+#define MATCH_NOMATCH      0
+
+/* Maximum number of ints of offset to save on the stack for recursive calls.
+If the offset vector is bigger, malloc is used. This should be a multiple of 3,
+because the offset vector is always a multiple of 3 long. */
+
+#define REC_STACK_SAVE_MAX 30
+
+/* Min and max values for the common repeats; for the maxima, 0 => infinity */
+
+static const char rep_min[] = { 0, 0, 1, 1, 0, 0 };
+static const char rep_max[] = { 0, 0, 0, 0, 1, 1 };
+
+
+
+#ifdef DEBUG
+/*************************************************
+*        Debugging function to print chars       *
+*************************************************/
+
+/* Print a sequence of chars in printable format, stopping at the end of the
+subject if the requested.
+
+Arguments:
+  p           points to characters
+  length      number to print
+  is_subject  TRUE if printing from within md->start_subject
+  md          pointer to matching data block, if is_subject is TRUE
+
+Returns:     nothing
+*/
+
+static void
+pchars(const uschar *p, int length, BOOL is_subject, match_data *md)
+{
+int c;
+if (is_subject && length > md->end_subject - p) length = md->end_subject - p;
+while (length-- > 0)
+  if (isprint(c = *(p++))) printf("%c", c); else printf("\\x%02x", c);
+}
+#endif
+
+
+
+/*************************************************
+*          Match a back-reference                *
+*************************************************/
+
+/* If a back reference hasn't been set, the length that is passed is greater
+than the number of characters left in the string, so the match fails.
+
+Arguments:
+  offset      index into the offset vector
+  eptr        points into the subject
+  length      length to be matched
+  md          points to match data block
+  ims         the ims flags
+
+Returns:      TRUE if matched
+*/
+
+static BOOL
+match_ref(int offset, register const uschar *eptr, int length, match_data *md,
+  unsigned long int ims)
+{
+const uschar *p = md->start_subject + md->offset_vector[offset];
+
+#ifdef DEBUG
+if (eptr >= md->end_subject)
+  printf("matching subject <null>");
+else
+  {
+  printf("matching subject ");
+  pchars(eptr, length, TRUE, md);
+  }
+printf(" against backref ");
+pchars(p, length, FALSE, md);
+printf("\n");
+#endif
+
+/* Always fail if not enough characters left */
+
+if (length > md->end_subject - eptr) return FALSE;
+
+/* Separate the caselesss case for speed */
+
+if ((ims & PCRE_CASELESS) != 0)
+  {
+  while (length-- > 0)
+    if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE;
+  }
+else
+  { while (length-- > 0) if (*p++ != *eptr++) return FALSE; }
+
+return TRUE;
+}
+
+
+
+/***************************************************************************
+****************************************************************************
+                   RECURSION IN THE match() FUNCTION
+
+The match() function is highly recursive. Some regular expressions can cause
+it to recurse thousands of times. I was writing for Unix, so I just let it
+call itself recursively. This uses the stack for saving everything that has
+to be saved for a recursive call. On Unix, the stack can be large, and this
+works fine.
+
+It turns out that on non-Unix systems there are problems with programs that
+use a lot of stack. (This despite the fact that every last chip has oodles
+of memory these days, and techniques for extending the stack have been known
+for decades.) So....
+
+There is a fudge, triggered by defining NO_RECURSE, which avoids recursive
+calls by keeping local variables that need to be preserved in blocks of memory
+obtained from malloc instead instead of on the stack. Macros are used to
+achieve this so that the actual code doesn't look very different to what it
+always used to.
+****************************************************************************
+***************************************************************************/
+
+
+/* These versions of the macros use the stack, as normal */
+
+#ifndef NO_RECURSE
+#define REGISTER register
+#define RMATCH(rx,ra,rb,rc,rd,re,rf,rg) rx = match(ra,rb,rc,rd,re,rf,rg)
+#define RRETURN(ra) return ra
+#else
+
+
+/* These versions of the macros manage a private stack on the heap. Note
+that the rd argument of RMATCH isn't actually used. It's the md argument of
+match(), which never changes. */
+
+#define REGISTER
+
+#define RMATCH(rx,ra,rb,rc,rd,re,rf,rg)\
+  {\
+  heapframe *newframe = (pcre_stack_malloc)(sizeof(heapframe));\
+  if (setjmp(frame->Xwhere) == 0)\
+    {\
+    newframe->Xeptr = ra;\
+    newframe->Xecode = rb;\
+    newframe->Xoffset_top = rc;\
+    newframe->Xims = re;\
+    newframe->Xeptrb = rf;\
+    newframe->Xflags = rg;\
+    newframe->Xprevframe = frame;\
+    frame = newframe;\
+    DPRINTF(("restarting from line %d\n", __LINE__));\
+    goto HEAP_RECURSE;\
+    }\
+  else\
+    {\
+    DPRINTF(("longjumped back to line %d\n", __LINE__));\
+    frame = md->thisframe;\
+    rx = frame->Xresult;\
+    }\
+  }
+
+#define RRETURN(ra)\
+  {\
+  heapframe *newframe = frame;\
+  frame = newframe->Xprevframe;\
+  (pcre_stack_free)(newframe);\
+  if (frame != NULL)\
+    {\
+    frame->Xresult = ra;\
+    md->thisframe = frame;\
+    longjmp(frame->Xwhere, 1);\
+    }\
+  return ra;\
+  }
+
+
+/* Structure for remembering the local variables in a private frame */
+
+typedef struct heapframe {
+  struct heapframe *Xprevframe;
+
+  /* Function arguments that may change */
+
+  const uschar *Xeptr;
+  const uschar *Xecode;
+  int Xoffset_top;
+  long int Xims;
+  eptrblock *Xeptrb;
+  int Xflags;
+
+  /* Function local variables */
+
+  const uschar *Xcallpat;
+  const uschar *Xcharptr;
+  const uschar *Xdata;
+  const uschar *Xnext;
+  const uschar *Xpp;
+  const uschar *Xprev;
+  const uschar *Xsaved_eptr;
+
+  recursion_info Xnew_recursive;
+
+  BOOL Xcur_is_word;
+  BOOL Xcondition;
+  BOOL Xminimize;
+  BOOL Xprev_is_word;
+
+  unsigned long int Xoriginal_ims;
+
+#ifdef SUPPORT_UCP
+  int Xprop_type;
+  int Xprop_fail_result;
+  int Xprop_category;
+  int Xprop_chartype;
+  int Xprop_othercase;
+  int Xprop_test_against;
+  int *Xprop_test_variable;
+#endif
+
+  int Xctype;
+  int Xfc;
+  int Xfi;
+  int Xlength;
+  int Xmax;
+  int Xmin;
+  int Xnumber;
+  int Xoffset;
+  int Xop;
+  int Xsave_capture_last;
+  int Xsave_offset1, Xsave_offset2, Xsave_offset3;
+  int Xstacksave[REC_STACK_SAVE_MAX];
+
+  eptrblock Xnewptrb;
+
+  /* Place to pass back result, and where to jump back to */
+
+  int  Xresult;
+  jmp_buf Xwhere;
+
+} heapframe;
+
+#endif
+
+
+/***************************************************************************
+***************************************************************************/
+
+
+
+/*************************************************
+*         Match from current position            *
+*************************************************/
+
+/* On entry ecode points to the first opcode, and eptr to the first character
+in the subject string, while eptrb holds the value of eptr at the start of the
+last bracketed group - used for breaking infinite loops matching zero-length
+strings. This function is called recursively in many circumstances. Whenever it
+returns a negative (error) response, the outer incarnation must also return the
+same response.
+
+Performance note: It might be tempting to extract commonly used fields from the
+md structure (e.g. utf8, end_subject) into individual variables to improve
+performance. Tests using gcc on a SPARC disproved this; in the first case, it
+made performance worse.
+
+Arguments:
+   eptr        pointer in subject
+   ecode       position in code
+   offset_top  current top pointer
+   md          pointer to "static" info for the match
+   ims         current /i, /m, and /s options
+   eptrb       pointer to chain of blocks containing eptr at start of
+                 brackets - for testing for empty matches
+   flags       can contain
+                 match_condassert - this is an assertion condition
+                 match_isgroup - this is the start of a bracketed group
+
+Returns:       MATCH_MATCH if matched            )  these values are >= 0
+               MATCH_NOMATCH if failed to match  )
+               a negative PCRE_ERROR_xxx value if aborted by an error condition
+                 (e.g. stopped by recursion limit)
+*/
+
+static int
+match(REGISTER const uschar *eptr, REGISTER const uschar *ecode,
+  int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb,
+  int flags)
+{
+/* These variables do not need to be preserved over recursion in this function,
+so they can be ordinary variables in all cases. Mark them with "register"
+because they are used a lot in loops. */
+
+register int  rrc;    /* Returns from recursive calls */
+register int  i;      /* Used for loops not involving calls to RMATCH() */
+register int  c;      /* Character values not kept over RMATCH() calls */
+register BOOL utf8;   /* Local copy of UTF-8 flag for speed */
+
+/* When recursion is not being used, all "local" variables that have to be
+preserved over calls to RMATCH() are part of a "frame" which is obtained from
+heap storage. Set up the top-level frame here; others are obtained from the
+heap whenever RMATCH() does a "recursion". See the macro definitions above. */
+
+#ifdef NO_RECURSE
+heapframe *frame = (pcre_stack_malloc)(sizeof(heapframe));
+frame->Xprevframe = NULL;            /* Marks the top level */
+
+/* Copy in the original argument variables */
+
+frame->Xeptr = eptr;
+frame->Xecode = ecode;
+frame->Xoffset_top = offset_top;
+frame->Xims = ims;
+frame->Xeptrb = eptrb;
+frame->Xflags = flags;
+
+/* This is where control jumps back to to effect "recursion" */
+
+HEAP_RECURSE:
+
+/* Macros make the argument variables come from the current frame */
+
+#define eptr               frame->Xeptr
+#define ecode              frame->Xecode
+#define offset_top         frame->Xoffset_top
+#define ims                frame->Xims
+#define eptrb              frame->Xeptrb
+#define flags              frame->Xflags
+
+/* Ditto for the local variables */
+
+#ifdef SUPPORT_UTF8
+#define charptr            frame->Xcharptr
+#endif
+#define callpat            frame->Xcallpat
+#define data               frame->Xdata
+#define next               frame->Xnext
+#define pp                 frame->Xpp
+#define prev               frame->Xprev
+#define saved_eptr         frame->Xsaved_eptr
+
+#define new_recursive      frame->Xnew_recursive
+
+#define cur_is_word        frame->Xcur_is_word
+#define condition          frame->Xcondition
+#define minimize           frame->Xminimize
+#define prev_is_word       frame->Xprev_is_word
+
+#define original_ims       frame->Xoriginal_ims
+
+#ifdef SUPPORT_UCP
+#define prop_type          frame->Xprop_type
+#define prop_fail_result   frame->Xprop_fail_result
+#define prop_category      frame->Xprop_category
+#define prop_chartype      frame->Xprop_chartype
+#define prop_othercase     frame->Xprop_othercase
+#define prop_test_against  frame->Xprop_test_against
+#define prop_test_variable frame->Xprop_test_variable
+#endif
+
+#define ctype              frame->Xctype
+#define fc                 frame->Xfc
+#define fi                 frame->Xfi
+#define length             frame->Xlength
+#define max                frame->Xmax
+#define min                frame->Xmin
+#define number             frame->Xnumber
+#define offset             frame->Xoffset
+#define op                 frame->Xop
+#define save_capture_last  frame->Xsave_capture_last
+#define save_offset1       frame->Xsave_offset1
+#define save_offset2       frame->Xsave_offset2
+#define save_offset3       frame->Xsave_offset3
+#define stacksave          frame->Xstacksave
+
+#define newptrb            frame->Xnewptrb
+
+/* When recursion is being used, local variables are allocated on the stack and
+get preserved during recursion in the normal way. In this environment, fi and
+i, and fc and c, can be the same variables. */
+
+#else
+#define fi i
+#define fc c
+
+
+#ifdef SUPPORT_UTF8                /* Many of these variables are used ony */
+const uschar *charptr;             /* small blocks of the code. My normal  */
+#endif                             /* style of coding would have declared  */
+const uschar *callpat;             /* them within each of those blocks.    */
+const uschar *data;                /* However, in order to accommodate the */
+const uschar *next;                /* version of this code that uses an    */
+const uschar *pp;                  /* external "stack" implemented on the  */
+const uschar *prev;                /* heap, it is easier to declare them   */
+const uschar *saved_eptr;          /* all here, so the declarations can    */
+                                   /* be cut out in a block. The only      */
+recursion_info new_recursive;      /* declarations within blocks below are */
+                                   /* for variables that do not have to    */
+BOOL cur_is_word;                  /* be preserved over a recursive call   */
+BOOL condition;                    /* to RMATCH().                         */
+BOOL minimize;
+BOOL prev_is_word;
+
+unsigned long int original_ims;
+
+#ifdef SUPPORT_UCP
+int prop_type;
+int prop_fail_result;
+int prop_category;
+int prop_chartype;
+int prop_othercase;
+int prop_test_against;
+int *prop_test_variable;
+#endif
+
+int ctype;
+int length;
+int max;
+int min;
+int number;
+int offset;
+int op;
+int save_capture_last;
+int save_offset1, save_offset2, save_offset3;
+int stacksave[REC_STACK_SAVE_MAX];
+
+eptrblock newptrb;
+#endif
+
+/* These statements are here to stop the compiler complaining about unitialized
+variables. */
+
+#ifdef SUPPORT_UCP
+prop_fail_result = 0;
+prop_test_against = 0;
+prop_test_variable = NULL;
+#endif
+
+/* OK, now we can get on with the real code of the function. Recursion is
+specified by the macros RMATCH and RRETURN. When NO_RECURSE is *not* defined,
+these just turn into a recursive call to match() and a "return", respectively.
+However, RMATCH isn't like a function call because it's quite a complicated
+macro. It has to be used in one particular way. This shouldn't, however, impact
+performance when true recursion is being used. */
+
+if (md->match_call_count++ >= md->match_limit) RRETURN(PCRE_ERROR_MATCHLIMIT);
+
+original_ims = ims;    /* Save for resetting on ')' */
+utf8 = md->utf8;       /* Local copy of the flag */
+
+/* At the start of a bracketed group, add the current subject pointer to the
+stack of such pointers, to be re-instated at the end of the group when we hit
+the closing ket. When match() is called in other circumstances, we don't add to
+this stack. */
+
+if ((flags & match_isgroup) != 0)
+  {
+  newptrb.epb_prev = eptrb;
+  newptrb.epb_saved_eptr = eptr;
+  eptrb = &newptrb;
+  }
+
+/* Now start processing the operations. */
+
+for (;;)
+  {
+  op = *ecode;
+  minimize = FALSE;
+
+  /* For partial matching, remember if we ever hit the end of the subject after
+  matching at least one subject character. */
+
+  if (md->partial &&
+      eptr >= md->end_subject &&
+      eptr > md->start_match)
+    md->hitend = TRUE;
+
+  /* Opening capturing bracket. If there is space in the offset vector, save
+  the current subject position in the working slot at the top of the vector. We
+  mustn't change the current values of the data slot, because they may be set
+  from a previous iteration of this group, and be referred to by a reference
+  inside the group.
+
+  If the bracket fails to match, we need to restore this value and also the
+  values of the final offsets, in case they were set by a previous iteration of
+  the same bracket.
+
+  If there isn't enough space in the offset vector, treat this as if it were a
+  non-capturing bracket. Don't worry about setting the flag for the error case
+  here; that is handled in the code for KET. */
+
+  if (op > OP_BRA)
+    {
+    number = op - OP_BRA;
+
+    /* For extended extraction brackets (large number), we have to fish out the
+    number from a dummy opcode at the start. */
+
+    if (number > EXTRACT_BASIC_MAX)
+      number = GET2(ecode, 2+LINK_SIZE);
+    offset = number << 1;
+
+#ifdef DEBUG
+    printf("start bracket %d subject=", number);
+    pchars(eptr, 16, TRUE, md);
+    printf("\n");
+#endif
+
+    if (offset < md->offset_max)
+      {
+      save_offset1 = md->offset_vector[offset];
+      save_offset2 = md->offset_vector[offset+1];
+      save_offset3 = md->offset_vector[md->offset_end - number];
+      save_capture_last = md->capture_last;
+
+      DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3));
+      md->offset_vector[md->offset_end - number] = eptr - md->start_subject;
+
+      do
+        {
+        RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb,
+          match_isgroup);
+        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+        md->capture_last = save_capture_last;
+        ecode += GET(ecode, 1);
+        }
+      while (*ecode == OP_ALT);
+
+      DPRINTF(("bracket %d failed\n", number));
+
+      md->offset_vector[offset] = save_offset1;
+      md->offset_vector[offset+1] = save_offset2;
+      md->offset_vector[md->offset_end - number] = save_offset3;
+
+      RRETURN(MATCH_NOMATCH);
+      }
+
+    /* Insufficient room for saving captured contents */
+
+    else op = OP_BRA;
+    }
+
+  /* Other types of node can be handled by a switch */
+
+  switch(op)
+    {
+    case OP_BRA:     /* Non-capturing bracket: optimized */
+    DPRINTF(("start bracket 0\n"));
+    do
+      {
+      RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb,
+        match_isgroup);
+      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+      ecode += GET(ecode, 1);
+      }
+    while (*ecode == OP_ALT);
+    DPRINTF(("bracket 0 failed\n"));
+    RRETURN(MATCH_NOMATCH);
+
+    /* Conditional group: compilation checked that there are no more than
+    two branches. If the condition is false, skipping the first branch takes us
+    past the end if there is only one branch, but that's OK because that is
+    exactly what going to the ket would do. */
+
+    case OP_COND:
+    if (ecode[LINK_SIZE+1] == OP_CREF) /* Condition extract or recurse test */
+      {
+      offset = GET2(ecode, LINK_SIZE+2) << 1;  /* Doubled ref number */
+      condition = (offset == CREF_RECURSE * 2)?
+        (md->recursive != NULL) :
+        (offset < offset_top && md->offset_vector[offset] >= 0);
+      RMATCH(rrc, eptr, ecode + (condition?
+        (LINK_SIZE + 4) : (LINK_SIZE + 1 + GET(ecode, 1))),
+        offset_top, md, ims, eptrb, match_isgroup);
+      RRETURN(rrc);
+      }
+
+    /* The condition is an assertion. Call match() to evaluate it - setting
+    the final argument TRUE causes it to stop at the end of an assertion. */
+
+    else
+      {
+      RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL,
+          match_condassert | match_isgroup);
+      if (rrc == MATCH_MATCH)
+        {
+        ecode += 1 + LINK_SIZE + GET(ecode, LINK_SIZE+2);
+        while (*ecode == OP_ALT) ecode += GET(ecode, 1);
+        }
+      else if (rrc != MATCH_NOMATCH)
+        {
+        RRETURN(rrc);         /* Need braces because of following else */
+        }
+      else ecode += GET(ecode, 1);
+      RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb,
+        match_isgroup);
+      RRETURN(rrc);
+      }
+    /* Control never reaches here */
+
+    /* Skip over conditional reference or large extraction number data if
+    encountered. */
+
+    case OP_CREF:
+    case OP_BRANUMBER:
+    ecode += 3;
+    break;
+
+    /* End of the pattern. If we are in a recursion, we should restore the
+    offsets appropriately and continue from after the call. */
+
+    case OP_END:
+    if (md->recursive != NULL && md->recursive->group_num == 0)
+      {
+      recursion_info *rec = md->recursive;
+      DPRINTF(("Hit the end in a (?0) recursion\n"));
+      md->recursive = rec->prevrec;
+      memmove(md->offset_vector, rec->offset_save,
+        rec->saved_max * sizeof(int));
+      md->start_match = rec->save_start;
+      ims = original_ims;
+      ecode = rec->after_call;
+      break;
+      }
+
+    /* Otherwise, if PCRE_NOTEMPTY is set, fail if we have matched an empty
+    string - backtracking will then try other alternatives, if any. */
+
+    if (md->notempty && eptr == md->start_match) RRETURN(MATCH_NOMATCH);
+    md->end_match_ptr = eptr;          /* Record where we ended */
+    md->end_offset_top = offset_top;   /* and how many extracts were taken */
+    RRETURN(MATCH_MATCH);
+
+    /* Change option settings */
+
+    case OP_OPT:
+    ims = ecode[1];
+    ecode += 2;
+    DPRINTF(("ims set to %02lx\n", ims));
+    break;
+
+    /* Assertion brackets. Check the alternative branches in turn - the
+    matching won't pass the KET for an assertion. If any one branch matches,
+    the assertion is true. Lookbehind assertions have an OP_REVERSE item at the
+    start of each branch to move the current point backwards, so the code at
+    this level is identical to the lookahead case. */
+
+    case OP_ASSERT:
+    case OP_ASSERTBACK:
+    do
+      {
+      RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL,
+        match_isgroup);
+      if (rrc == MATCH_MATCH) break;
+      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+      ecode += GET(ecode, 1);
+      }
+    while (*ecode == OP_ALT);
+    if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH);
+
+    /* If checking an assertion for a condition, return MATCH_MATCH. */
+
+    if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH);
+
+    /* Continue from after the assertion, updating the offsets high water
+    mark, since extracts may have been taken during the assertion. */
+
+    do ecode += GET(ecode,1); while (*ecode == OP_ALT);
+    ecode += 1 + LINK_SIZE;
+    offset_top = md->end_offset_top;
+    continue;
+
+    /* Negative assertion: all branches must fail to match */
+
+    case OP_ASSERT_NOT:
+    case OP_ASSERTBACK_NOT:
+    do
+      {
+      RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL,
+        match_isgroup);
+      if (rrc == MATCH_MATCH) RRETURN(MATCH_NOMATCH);
+      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+      ecode += GET(ecode,1);
+      }
+    while (*ecode == OP_ALT);
+
+    if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH);
+
+    ecode += 1 + LINK_SIZE;
+    continue;
+
+    /* Move the subject pointer back. This occurs only at the start of
+    each branch of a lookbehind assertion. If we are too close to the start to
+    move back, this match function fails. When working with UTF-8 we move
+    back a number of characters, not bytes. */
+
+    case OP_REVERSE:
+#ifdef SUPPORT_UTF8
+    if (utf8)
+      {
+      c = GET(ecode,1);
+      for (i = 0; i < c; i++)
+        {
+        eptr--;
+        if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH);
+        BACKCHAR(eptr)
+        }
+      }
+    else
+#endif
+
+    /* No UTF-8 support, or not in UTF-8 mode: count is byte count */
+
+      {
+      eptr -= GET(ecode,1);
+      if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH);
+      }
+
+    /* Skip to next op code */
+
+    ecode += 1 + LINK_SIZE;
+    break;
+
+    /* The callout item calls an external function, if one is provided, passing
+    details of the match so far. This is mainly for debugging, though the
+    function is able to force a failure. */
+
+    case OP_CALLOUT:
+    if (pcre_callout != NULL)
+      {
+      pcre_callout_block cb;
+      cb.version          = 1;   /* Version 1 of the callout block */
+      cb.callout_number   = ecode[1];
+      cb.offset_vector    = md->offset_vector;
+      cb.subject          = (const char *)md->start_subject;
+      cb.subject_length   = md->end_subject - md->start_subject;
+      cb.start_match      = md->start_match - md->start_subject;
+      cb.current_position = eptr - md->start_subject;
+      cb.pattern_position = GET(ecode, 2);
+      cb.next_item_length = GET(ecode, 2 + LINK_SIZE);
+      cb.capture_top      = offset_top/2;
+      cb.capture_last     = md->capture_last;
+      cb.callout_data     = md->callout_data;
+      if ((rrc = (*pcre_callout)(&cb)) > 0) RRETURN(MATCH_NOMATCH);
+      if (rrc < 0) RRETURN(rrc);
+      }
+    ecode += 2 + 2*LINK_SIZE;
+    break;
+
+    /* Recursion either matches the current regex, or some subexpression. The
+    offset data is the offset to the starting bracket from the start of the
+    whole pattern. (This is so that it works from duplicated subpatterns.)
+
+    If there are any capturing brackets started but not finished, we have to
+    save their starting points and reinstate them after the recursion. However,
+    we don't know how many such there are (offset_top records the completed
+    total) so we just have to save all the potential data. There may be up to
+    65535 such values, which is too large to put on the stack, but using malloc
+    for small numbers seems expensive. As a compromise, the stack is used when
+    there are no more than REC_STACK_SAVE_MAX values to store; otherwise malloc
+    is used. A problem is what to do if the malloc fails ... there is no way of
+    returning to the top level with an error. Save the top REC_STACK_SAVE_MAX
+    values on the stack, and accept that the rest may be wrong.
+
+    There are also other values that have to be saved. We use a chained
+    sequence of blocks that actually live on the stack. Thanks to Robin Houston
+    for the original version of this logic. */
+
+    case OP_RECURSE:
+      {
+      callpat = md->start_code + GET(ecode, 1);
+      new_recursive.group_num = *callpat - OP_BRA;
+
+      /* For extended extraction brackets (large number), we have to fish out
+      the number from a dummy opcode at the start. */
+
+      if (new_recursive.group_num > EXTRACT_BASIC_MAX)
+        new_recursive.group_num = GET2(callpat, 2+LINK_SIZE);
+
+      /* Add to "recursing stack" */
+
+      new_recursive.prevrec = md->recursive;
+      md->recursive = &new_recursive;
+
+      /* Find where to continue from afterwards */
+
+      ecode += 1 + LINK_SIZE;
+      new_recursive.after_call = ecode;
+
+      /* Now save the offset data. */
+
+      new_recursive.saved_max = md->offset_end;
+      if (new_recursive.saved_max <= REC_STACK_SAVE_MAX)
+        new_recursive.offset_save = stacksave;
+      else
+        {
+        new_recursive.offset_save =
+          (int *)(pcre_malloc)(new_recursive.saved_max * sizeof(int));
+        if (new_recursive.offset_save == NULL) RRETURN(PCRE_ERROR_NOMEMORY);
+        }
+
+      memcpy(new_recursive.offset_save, md->offset_vector,
+            new_recursive.saved_max * sizeof(int));
+      new_recursive.save_start = md->start_match;
+      md->start_match = eptr;
+
+      /* OK, now we can do the recursion. For each top-level alternative we
+      restore the offset and recursion data. */
+
+      DPRINTF(("Recursing into group %d\n", new_recursive.group_num));
+      do
+        {
+        RMATCH(rrc, eptr, callpat + 1 + LINK_SIZE, offset_top, md, ims,
+            eptrb, match_isgroup);
+        if (rrc == MATCH_MATCH)
+          {
+          md->recursive = new_recursive.prevrec;
+          if (new_recursive.offset_save != stacksave)
+            (pcre_free)(new_recursive.offset_save);
+          RRETURN(MATCH_MATCH);
+          }
+        else if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+
+        md->recursive = &new_recursive;
+        memcpy(md->offset_vector, new_recursive.offset_save,
+            new_recursive.saved_max * sizeof(int));
+        callpat += GET(callpat, 1);
+        }
+      while (*callpat == OP_ALT);
+
+      DPRINTF(("Recursion didn't match\n"));
+      md->recursive = new_recursive.prevrec;
+      if (new_recursive.offset_save != stacksave)
+        (pcre_free)(new_recursive.offset_save);
+      RRETURN(MATCH_NOMATCH);
+      }
+    /* Control never reaches here */
+
+    /* "Once" brackets are like assertion brackets except that after a match,
+    the point in the subject string is not moved back. Thus there can never be
+    a move back into the brackets. Friedl calls these "atomic" subpatterns.
+    Check the alternative branches in turn - the matching won't pass the KET
+    for this kind of subpattern. If any one branch matches, we carry on as at
+    the end of a normal bracket, leaving the subject pointer. */
+
+    case OP_ONCE:
+      {
+      prev = ecode;
+      saved_eptr = eptr;
+
+      do
+        {
+        RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims,
+          eptrb, match_isgroup);
+        if (rrc == MATCH_MATCH) break;
+        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+        ecode += GET(ecode,1);
+        }
+      while (*ecode == OP_ALT);
+
+      /* If hit the end of the group (which could be repeated), fail */
+
+      if (*ecode != OP_ONCE && *ecode != OP_ALT) RRETURN(MATCH_NOMATCH);
+
+      /* Continue as from after the assertion, updating the offsets high water
+      mark, since extracts may have been taken. */
+
+      do ecode += GET(ecode,1); while (*ecode == OP_ALT);
+
+      offset_top = md->end_offset_top;
+      eptr = md->end_match_ptr;
+
+      /* For a non-repeating ket, just continue at this level. This also
+      happens for a repeating ket if no characters were matched in the group.
+      This is the forcible breaking of infinite loops as implemented in Perl
+      5.005. If there is an options reset, it will get obeyed in the normal
+      course of events. */
+
+      if (*ecode == OP_KET || eptr == saved_eptr)
+        {
+        ecode += 1+LINK_SIZE;
+        break;
+        }
+
+      /* The repeating kets try the rest of the pattern or restart from the
+      preceding bracket, in the appropriate order. We need to reset any options
+      that changed within the bracket before re-running it, so check the next
+      opcode. */
+
+      if (ecode[1+LINK_SIZE] == OP_OPT)
+        {
+        ims = (ims & ~PCRE_IMS) | ecode[4];
+        DPRINTF(("ims set to %02lx at group repeat\n", ims));
+        }
+
+      if (*ecode == OP_KETRMIN)
+        {
+        RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0);
+        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+        RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup);
+        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+        }
+      else  /* OP_KETRMAX */
+        {
+        RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup);
+        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+        RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0);
+        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+        }
+      }
+    RRETURN(MATCH_NOMATCH);
+
+    /* An alternation is the end of a branch; scan along to find the end of the
+    bracketed group and go to there. */
+
+    case OP_ALT:
+    do ecode += GET(ecode,1); while (*ecode == OP_ALT);
+    break;
+
+    /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating
+    that it may occur zero times. It may repeat infinitely, or not at all -
+    i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper
+    repeat limits are compiled as a number of copies, with the optional ones
+    preceded by BRAZERO or BRAMINZERO. */
+
+    case OP_BRAZERO:
+      {
+      next = ecode+1;
+      RMATCH(rrc, eptr, next, offset_top, md, ims, eptrb, match_isgroup);
+      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+      do next += GET(next,1); while (*next == OP_ALT);
+      ecode = next + 1+LINK_SIZE;
+      }
+    break;
+
+    case OP_BRAMINZERO:
+      {
+      next = ecode+1;
+      do next += GET(next,1); while (*next == OP_ALT);
+      RMATCH(rrc, eptr, next + 1+LINK_SIZE, offset_top, md, ims, eptrb,
+        match_isgroup);
+      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+      ecode++;
+      }
+    break;
+
+    /* End of a group, repeated or non-repeating. If we are at the end of
+    an assertion "group", stop matching and return MATCH_MATCH, but record the
+    current high water mark for use by positive assertions. Do this also
+    for the "once" (not-backup up) groups. */
+
+    case OP_KET:
+    case OP_KETRMIN:
+    case OP_KETRMAX:
+      {
+      prev = ecode - GET(ecode, 1);
+      saved_eptr = eptrb->epb_saved_eptr;
+
+      /* Back up the stack of bracket start pointers. */
+
+      eptrb = eptrb->epb_prev;
+
+      if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT ||
+          *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT ||
+          *prev == OP_ONCE)
+        {
+        md->end_match_ptr = eptr;      /* For ONCE */
+        md->end_offset_top = offset_top;
+        RRETURN(MATCH_MATCH);
+        }
+
+      /* In all other cases except a conditional group we have to check the
+      group number back at the start and if necessary complete handling an
+      extraction by setting the offsets and bumping the high water mark. */
+
+      if (*prev != OP_COND)
+        {
+        number = *prev - OP_BRA;
+
+        /* For extended extraction brackets (large number), we have to fish out
+        the number from a dummy opcode at the start. */
+
+        if (number > EXTRACT_BASIC_MAX) number = GET2(prev, 2+LINK_SIZE);
+        offset = number << 1;
+
+#ifdef DEBUG
+        printf("end bracket %d", number);
+        printf("\n");
+#endif
+
+        /* Test for a numbered group. This includes groups called as a result
+        of recursion. Note that whole-pattern recursion is coded as a recurse
+        into group 0, so it won't be picked up here. Instead, we catch it when
+        the OP_END is reached. */
+
+        if (number > 0)
+          {
+          md->capture_last = number;
+          if (offset >= md->offset_max) md->offset_overflow = TRUE; else
+            {
+            md->offset_vector[offset] =
+              md->offset_vector[md->offset_end - number];
+            md->offset_vector[offset+1] = eptr - md->start_subject;
+            if (offset_top <= offset) offset_top = offset + 2;
+            }
+
+          /* Handle a recursively called group. Restore the offsets
+          appropriately and continue from after the call. */
+
+          if (md->recursive != NULL && md->recursive->group_num == number)
+            {
+            recursion_info *rec = md->recursive;
+            DPRINTF(("Recursion (%d) succeeded - continuing\n", number));
+            md->recursive = rec->prevrec;
+            md->start_match = rec->save_start;
+            memcpy(md->offset_vector, rec->offset_save,
+              rec->saved_max * sizeof(int));
+            ecode = rec->after_call;
+            ims = original_ims;
+            break;
+            }
+          }
+        }
+
+      /* Reset the value of the ims flags, in case they got changed during
+      the group. */
+
+      ims = original_ims;
+      DPRINTF(("ims reset to %02lx\n", ims));
+
+      /* For a non-repeating ket, just continue at this level. This also
+      happens for a repeating ket if no characters were matched in the group.
+      This is the forcible breaking of infinite loops as implemented in Perl
+      5.005. If there is an options reset, it will get obeyed in the normal
+      course of events. */
+
+      if (*ecode == OP_KET || eptr == saved_eptr)
+        {
+        ecode += 1 + LINK_SIZE;
+        break;
+        }
+
+      /* The repeating kets try the rest of the pattern or restart from the
+      preceding bracket, in the appropriate order. */
+
+      if (*ecode == OP_KETRMIN)
+        {
+        RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0);
+        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+        RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup);
+        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+        }
+      else  /* OP_KETRMAX */
+        {
+        RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup);
+        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+        RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0);
+        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+        }
+      }
+
+    RRETURN(MATCH_NOMATCH);
+
+    /* Start of subject unless notbol, or after internal newline if multiline */
+
+    case OP_CIRC:
+    if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH);
+    if ((ims & PCRE_MULTILINE) != 0)
+      {
+      if (eptr != md->start_subject && eptr[-1] != NEWLINE)
+        RRETURN(MATCH_NOMATCH);
+      ecode++;
+      break;
+      }
+    /* ... else fall through */
+
+    /* Start of subject assertion */
+
+    case OP_SOD:
+    if (eptr != md->start_subject) RRETURN(MATCH_NOMATCH);
+    ecode++;
+    break;
+
+    /* Start of match assertion */
+
+    case OP_SOM:
+    if (eptr != md->start_subject + md->start_offset) RRETURN(MATCH_NOMATCH);
+    ecode++;
+    break;
+
+    /* Assert before internal newline if multiline, or before a terminating
+    newline unless endonly is set, else end of subject unless noteol is set. */
+
+    case OP_DOLL:
+    if ((ims & PCRE_MULTILINE) != 0)
+      {
+      if (eptr < md->end_subject)
+        { if (*eptr != NEWLINE) RRETURN(MATCH_NOMATCH); }
+      else
+        { if (md->noteol) RRETURN(MATCH_NOMATCH); }
+      ecode++;
+      break;
+      }
+    else
+      {
+      if (md->noteol) RRETURN(MATCH_NOMATCH);
+      if (!md->endonly)
+        {
+        if (eptr < md->end_subject - 1 ||
+           (eptr == md->end_subject - 1 && *eptr != NEWLINE))
+          RRETURN(MATCH_NOMATCH);
+        ecode++;
+        break;
+        }
+      }
+    /* ... else fall through */
+
+    /* End of subject assertion (\z) */
+
+    case OP_EOD:
+    if (eptr < md->end_subject) RRETURN(MATCH_NOMATCH);
+    ecode++;
+    break;
+
+    /* End of subject or ending \n assertion (\Z) */
+
+    case OP_EODN:
+    if (eptr < md->end_subject - 1 ||
+       (eptr == md->end_subject - 1 && *eptr != NEWLINE)) RRETURN(MATCH_NOMATCH);
+    ecode++;
+    break;
+
+    /* Word boundary assertions */
+
+    case OP_NOT_WORD_BOUNDARY:
+    case OP_WORD_BOUNDARY:
+      {
+
+      /* Find out if the previous and current characters are "word" characters.
+      It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to
+      be "non-word" characters. */
+
+#ifdef SUPPORT_UTF8
+      if (utf8)
+        {
+        if (eptr == md->start_subject) prev_is_word = FALSE; else
+          {
+          const uschar *lastptr = eptr - 1;
+          while((*lastptr & 0xc0) == 0x80) lastptr--;
+          GETCHAR(c, lastptr);
+          prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
+          }
+        if (eptr >= md->end_subject) cur_is_word = FALSE; else
+          {
+          GETCHAR(c, eptr);
+          cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
+          }
+        }
+      else
+#endif
+
+      /* More streamlined when not in UTF-8 mode */
+
+        {
+        prev_is_word = (eptr != md->start_subject) &&
+          ((md->ctypes[eptr[-1]] & ctype_word) != 0);
+        cur_is_word = (eptr < md->end_subject) &&
+          ((md->ctypes[*eptr] & ctype_word) != 0);
+        }
+
+      /* Now see if the situation is what we want */
+
+      if ((*ecode++ == OP_WORD_BOUNDARY)?
+           cur_is_word == prev_is_word : cur_is_word != prev_is_word)
+        RRETURN(MATCH_NOMATCH);
+      }
+    break;
+
+    /* Match a single character type; inline for speed */
+
+    case OP_ANY:
+    if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == NEWLINE)
+      RRETURN(MATCH_NOMATCH);
+    if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH);
+#ifdef SUPPORT_UTF8
+    if (utf8)
+      while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+#endif
+    ecode++;
+    break;
+
+    /* Match a single byte, even in UTF-8 mode. This opcode really does match
+    any byte, even newline, independent of the setting of PCRE_DOTALL. */
+
+    case OP_ANYBYTE:
+    if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH);
+    ecode++;
+    break;
+
+    case OP_NOT_DIGIT:
+    if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+    GETCHARINCTEST(c, eptr);
+    if (
+#ifdef SUPPORT_UTF8
+       c < 256 &&
+#endif
+       (md->ctypes[c] & ctype_digit) != 0
+       )
+      RRETURN(MATCH_NOMATCH);
+    ecode++;
+    break;
+
+    case OP_DIGIT:
+    if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+    GETCHARINCTEST(c, eptr);
+    if (
+#ifdef SUPPORT_UTF8
+       c >= 256 ||
+#endif
+       (md->ctypes[c] & ctype_digit) == 0
+       )
+      RRETURN(MATCH_NOMATCH);
+    ecode++;
+    break;
+
+    case OP_NOT_WHITESPACE:
+    if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+    GETCHARINCTEST(c, eptr);
+    if (
+#ifdef SUPPORT_UTF8
+       c < 256 &&
+#endif
+       (md->ctypes[c] & ctype_space) != 0
+       )
+      RRETURN(MATCH_NOMATCH);
+    ecode++;
+    break;
+
+    case OP_WHITESPACE:
+    if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+    GETCHARINCTEST(c, eptr);
+    if (
+#ifdef SUPPORT_UTF8
+       c >= 256 ||
+#endif
+       (md->ctypes[c] & ctype_space) == 0
+       )
+      RRETURN(MATCH_NOMATCH);
+    ecode++;
+    break;
+
+    case OP_NOT_WORDCHAR:
+    if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+    GETCHARINCTEST(c, eptr);
+    if (
+#ifdef SUPPORT_UTF8
+       c < 256 &&
+#endif
+       (md->ctypes[c] & ctype_word) != 0
+       )
+      RRETURN(MATCH_NOMATCH);
+    ecode++;
+    break;
+
+    case OP_WORDCHAR:
+    if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+    GETCHARINCTEST(c, eptr);
+    if (
+#ifdef SUPPORT_UTF8
+       c >= 256 ||
+#endif
+       (md->ctypes[c] & ctype_word) == 0
+       )
+      RRETURN(MATCH_NOMATCH);
+    ecode++;
+    break;
+
+#ifdef SUPPORT_UCP
+    /* Check the next character by Unicode property. We will get here only
+    if the support is in the binary; otherwise a compile-time error occurs. */
+
+    case OP_PROP:
+    case OP_NOTPROP:
+    if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+    GETCHARINCTEST(c, eptr);
+      {
+      int chartype, rqdtype;
+      int othercase;
+      int category = _pcre_ucp_findchar(c, &chartype, &othercase);
+
+      rqdtype = *(++ecode);
+      ecode++;
+
+      if (rqdtype >= 128)
+        {
+        if ((rqdtype - 128 != category) == (op == OP_PROP))
+          RRETURN(MATCH_NOMATCH);
+        }
+      else
+        {
+        if ((rqdtype != chartype) == (op == OP_PROP))
+          RRETURN(MATCH_NOMATCH);
+        }
+      }
+    break;
+
+    /* Match an extended Unicode sequence. We will get here only if the support
+    is in the binary; otherwise a compile-time error occurs. */
+
+    case OP_EXTUNI:
+    if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+    GETCHARINCTEST(c, eptr);
+      {
+      int chartype;
+      int othercase;
+      int category = _pcre_ucp_findchar(c, &chartype, &othercase);
+      if (category == ucp_M) RRETURN(MATCH_NOMATCH);
+      while (eptr < md->end_subject)
+        {
+        int len = 1;
+        if (!utf8) c = *eptr; else
+          {
+          GETCHARLEN(c, eptr, len);
+          }
+        category = _pcre_ucp_findchar(c, &chartype, &othercase);
+        if (category != ucp_M) break;
+        eptr += len;
+        }
+      }
+    ecode++;
+    break;
+#endif
+
+
+    /* Match a back reference, possibly repeatedly. Look past the end of the
+    item to see if there is repeat information following. The code is similar
+    to that for character classes, but repeated for efficiency. Then obey
+    similar code to character type repeats - written out again for speed.
+    However, if the referenced string is the empty string, always treat
+    it as matched, any number of times (otherwise there could be infinite
+    loops). */
+
+    case OP_REF:
+      {
+      offset = GET2(ecode, 1) << 1;               /* Doubled ref number */
+      ecode += 3;                                 /* Advance past item */
+
+      /* If the reference is unset, set the length to be longer than the amount
+      of subject left; this ensures that every attempt at a match fails. We
+      can't just fail here, because of the possibility of quantifiers with zero
+      minima. */
+
+      length = (offset >= offset_top || md->offset_vector[offset] < 0)?
+        md->end_subject - eptr + 1 :
+        md->offset_vector[offset+1] - md->offset_vector[offset];
+
+      /* Set up for repetition, or handle the non-repeated case */
+
+      switch (*ecode)
+        {
+        case OP_CRSTAR:
+        case OP_CRMINSTAR:
+        case OP_CRPLUS:
+        case OP_CRMINPLUS:
+        case OP_CRQUERY:
+        case OP_CRMINQUERY:
+        c = *ecode++ - OP_CRSTAR;
+        minimize = (c & 1) != 0;
+        min = rep_min[c];                 /* Pick up values from tables; */
+        max = rep_max[c];                 /* zero for max => infinity */
+        if (max == 0) max = INT_MAX;
+        break;
+
+        case OP_CRRANGE:
+        case OP_CRMINRANGE:
+        minimize = (*ecode == OP_CRMINRANGE);
+        min = GET2(ecode, 1);
+        max = GET2(ecode, 3);
+        if (max == 0) max = INT_MAX;
+        ecode += 5;
+        break;
+
+        default:               /* No repeat follows */
+        if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH);
+        eptr += length;
+        continue;              /* With the main loop */
+        }
+
+      /* If the length of the reference is zero, just continue with the
+      main loop. */
+
+      if (length == 0) continue;
+
+      /* First, ensure the minimum number of matches are present. We get back
+      the length of the reference string explicitly rather than passing the
+      address of eptr, so that eptr can be a register variable. */
+
+      for (i = 1; i <= min; i++)
+        {
+        if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH);
+        eptr += length;
+        }
+
+      /* If min = max, continue at the same level without recursion.
+      They are not both allowed to be zero. */
+
+      if (min == max) continue;
+
+      /* If minimizing, keep trying and advancing the pointer */
+
+      if (minimize)
+        {
+        for (fi = min;; fi++)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (fi >= max || !match_ref(offset, eptr, length, md, ims))
+            RRETURN(MATCH_NOMATCH);
+          eptr += length;
+          }
+        /* Control never gets here */
+        }
+
+      /* If maximizing, find the longest string and work backwards */
+
+      else
+        {
+        pp = eptr;
+        for (i = min; i < max; i++)
+          {
+          if (!match_ref(offset, eptr, length, md, ims)) break;
+          eptr += length;
+          }
+        while (eptr >= pp)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          eptr -= length;
+          }
+        RRETURN(MATCH_NOMATCH);
+        }
+      }
+    /* Control never gets here */
+
+
+
+    /* Match a bit-mapped character class, possibly repeatedly. This op code is
+    used when all the characters in the class have values in the range 0-255,
+    and either the matching is caseful, or the characters are in the range
+    0-127 when UTF-8 processing is enabled. The only difference between
+    OP_CLASS and OP_NCLASS occurs when a data character outside the range is
+    encountered.
+
+    First, look past the end of the item to see if there is repeat information
+    following. Then obey similar code to character type repeats - written out
+    again for speed. */
+
+    case OP_NCLASS:
+    case OP_CLASS:
+      {
+      data = ecode + 1;                /* Save for matching */
+      ecode += 33;                     /* Advance past the item */
+
+      switch (*ecode)
+        {
+        case OP_CRSTAR:
+        case OP_CRMINSTAR:
+        case OP_CRPLUS:
+        case OP_CRMINPLUS:
+        case OP_CRQUERY:
+        case OP_CRMINQUERY:
+        c = *ecode++ - OP_CRSTAR;
+        minimize = (c & 1) != 0;
+        min = rep_min[c];                 /* Pick up values from tables; */
+        max = rep_max[c];                 /* zero for max => infinity */
+        if (max == 0) max = INT_MAX;
+        break;
+
+        case OP_CRRANGE:
+        case OP_CRMINRANGE:
+        minimize = (*ecode == OP_CRMINRANGE);
+        min = GET2(ecode, 1);
+        max = GET2(ecode, 3);
+        if (max == 0) max = INT_MAX;
+        ecode += 5;
+        break;
+
+        default:               /* No repeat follows */
+        min = max = 1;
+        break;
+        }
+
+      /* First, ensure the minimum number of matches are present. */
+
+#ifdef SUPPORT_UTF8
+      /* UTF-8 mode */
+      if (utf8)
+        {
+        for (i = 1; i <= min; i++)
+          {
+          if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+          GETCHARINC(c, eptr);
+          if (c > 255)
+            {
+            if (op == OP_CLASS) RRETURN(MATCH_NOMATCH);
+            }
+          else
+            {
+            if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
+            }
+          }
+        }
+      else
+#endif
+      /* Not UTF-8 mode */
+        {
+        for (i = 1; i <= min; i++)
+          {
+          if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+          c = *eptr++;
+          if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
+          }
+        }
+
+      /* If max == min we can continue with the main loop without the
+      need to recurse. */
+
+      if (min == max) continue;
+
+      /* If minimizing, keep testing the rest of the expression and advancing
+      the pointer while it matches the class. */
+
+      if (minimize)
+        {
+#ifdef SUPPORT_UTF8
+        /* UTF-8 mode */
+        if (utf8)
+          {
+          for (fi = min;; fi++)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+            GETCHARINC(c, eptr);
+            if (c > 255)
+              {
+              if (op == OP_CLASS) RRETURN(MATCH_NOMATCH);
+              }
+            else
+              {
+              if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
+              }
+            }
+          }
+        else
+#endif
+        /* Not UTF-8 mode */
+          {
+          for (fi = min;; fi++)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+            c = *eptr++;
+            if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
+            }
+          }
+        /* Control never gets here */
+        }
+
+      /* If maximizing, find the longest possible run, then work backwards. */
+
+      else
+        {
+        pp = eptr;
+
+#ifdef SUPPORT_UTF8
+        /* UTF-8 mode */
+        if (utf8)
+          {
+          for (i = min; i < max; i++)
+            {
+            int len = 1;
+            if (eptr >= md->end_subject) break;
+            GETCHARLEN(c, eptr, len);
+            if (c > 255)
+              {
+              if (op == OP_CLASS) break;
+              }
+            else
+              {
+              if ((data[c/8] & (1 << (c&7))) == 0) break;
+              }
+            eptr += len;
+            }
+          for (;;)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            if (eptr-- == pp) break;        /* Stop if tried at original pos */
+            BACKCHAR(eptr);
+            }
+          }
+        else
+#endif
+          /* Not UTF-8 mode */
+          {
+          for (i = min; i < max; i++)
+            {
+            if (eptr >= md->end_subject) break;
+            c = *eptr;
+            if ((data[c/8] & (1 << (c&7))) == 0) break;
+            eptr++;
+            }
+          while (eptr >= pp)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            eptr--;
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            }
+          }
+
+        RRETURN(MATCH_NOMATCH);
+        }
+      }
+    /* Control never gets here */
+
+
+    /* Match an extended character class. This opcode is encountered only
+    in UTF-8 mode, because that's the only time it is compiled. */
+
+#ifdef SUPPORT_UTF8
+    case OP_XCLASS:
+      {
+      data = ecode + 1 + LINK_SIZE;                /* Save for matching */
+      ecode += GET(ecode, 1);                      /* Advance past the item */
+
+      switch (*ecode)
+        {
+        case OP_CRSTAR:
+        case OP_CRMINSTAR:
+        case OP_CRPLUS:
+        case OP_CRMINPLUS:
+        case OP_CRQUERY:
+        case OP_CRMINQUERY:
+        c = *ecode++ - OP_CRSTAR;
+        minimize = (c & 1) != 0;
+        min = rep_min[c];                 /* Pick up values from tables; */
+        max = rep_max[c];                 /* zero for max => infinity */
+        if (max == 0) max = INT_MAX;
+        break;
+
+        case OP_CRRANGE:
+        case OP_CRMINRANGE:
+        minimize = (*ecode == OP_CRMINRANGE);
+        min = GET2(ecode, 1);
+        max = GET2(ecode, 3);
+        if (max == 0) max = INT_MAX;
+        ecode += 5;
+        break;
+
+        default:               /* No repeat follows */
+        min = max = 1;
+        break;
+        }
+
+      /* First, ensure the minimum number of matches are present. */
+
+      for (i = 1; i <= min; i++)
+        {
+        if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+        GETCHARINC(c, eptr);
+        if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH);
+        }
+
+      /* If max == min we can continue with the main loop without the
+      need to recurse. */
+
+      if (min == max) continue;
+
+      /* If minimizing, keep testing the rest of the expression and advancing
+      the pointer while it matches the class. */
+
+      if (minimize)
+        {
+        for (fi = min;; fi++)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+          GETCHARINC(c, eptr);
+          if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH);
+          }
+        /* Control never gets here */
+        }
+
+      /* If maximizing, find the longest possible run, then work backwards. */
+
+      else
+        {
+        pp = eptr;
+        for (i = min; i < max; i++)
+          {
+          int len = 1;
+          if (eptr >= md->end_subject) break;
+          GETCHARLEN(c, eptr, len);
+          if (!_pcre_xclass(c, data)) break;
+          eptr += len;
+          }
+        for(;;)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (eptr-- == pp) break;        /* Stop if tried at original pos */
+          BACKCHAR(eptr)
+          }
+        RRETURN(MATCH_NOMATCH);
+        }
+
+      /* Control never gets here */
+      }
+#endif    /* End of XCLASS */
+
+    /* Match a single character, casefully */
+
+    case OP_CHAR:
+#ifdef SUPPORT_UTF8
+    if (utf8)
+      {
+      length = 1;
+      ecode++;
+      GETCHARLEN(fc, ecode, length);
+      if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+      while (length-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH);
+      }
+    else
+#endif
+
+    /* Non-UTF-8 mode */
+      {
+      if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH);
+      if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH);
+      ecode += 2;
+      }
+    break;
+
+    /* Match a single character, caselessly */
+
+    case OP_CHARNC:
+#ifdef SUPPORT_UTF8
+    if (utf8)
+      {
+      length = 1;
+      ecode++;
+      GETCHARLEN(fc, ecode, length);
+
+      if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+
+      /* If the pattern character's value is < 128, we have only one byte, and
+      can use the fast lookup table. */
+
+      if (fc < 128)
+        {
+        if (md->lcc[*ecode++] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
+        }
+
+      /* Otherwise we must pick up the subject character */
+
+      else
+        {
+        int dc;
+        GETCHARINC(dc, eptr);
+        ecode += length;
+
+        /* If we have Unicode property support, we can use it to test the other
+        case of the character, if there is one. The result of _pcre_ucp_findchar() is
+        < 0 if the char isn't found, and othercase is returned as zero if there
+        isn't one. */
+
+        if (fc != dc)
+          {
+#ifdef SUPPORT_UCP
+          int chartype;
+          int othercase;
+          if (_pcre_ucp_findchar(fc, &chartype, &othercase) < 0 || dc != othercase)
+#endif
+            RRETURN(MATCH_NOMATCH);
+          }
+        }
+      }
+    else
+#endif   /* SUPPORT_UTF8 */
+
+    /* Non-UTF-8 mode */
+      {
+      if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH);
+      if (md->lcc[ecode[1]] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
+      ecode += 2;
+      }
+    break;
+
+    /* Match a single character repeatedly; different opcodes share code. */
+
+    case OP_EXACT:
+    min = max = GET2(ecode, 1);
+    ecode += 3;
+    goto REPEATCHAR;
+
+    case OP_UPTO:
+    case OP_MINUPTO:
+    min = 0;
+    max = GET2(ecode, 1);
+    minimize = *ecode == OP_MINUPTO;
+    ecode += 3;
+    goto REPEATCHAR;
+
+    case OP_STAR:
+    case OP_MINSTAR:
+    case OP_PLUS:
+    case OP_MINPLUS:
+    case OP_QUERY:
+    case OP_MINQUERY:
+    c = *ecode++ - OP_STAR;
+    minimize = (c & 1) != 0;
+    min = rep_min[c];                 /* Pick up values from tables; */
+    max = rep_max[c];                 /* zero for max => infinity */
+    if (max == 0) max = INT_MAX;
+
+    /* Common code for all repeated single-character matches. We can give
+    up quickly if there are fewer than the minimum number of characters left in
+    the subject. */
+
+    REPEATCHAR:
+#ifdef SUPPORT_UTF8
+    if (utf8)
+      {
+      length = 1;
+      charptr = ecode;
+      GETCHARLEN(fc, ecode, length);
+      if (min * length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+      ecode += length;
+
+      /* Handle multibyte character matching specially here. There is
+      support for caseless matching if UCP support is present. */
+
+      if (length > 1)
+        {
+        int oclength = 0;
+        uschar occhars[8];
+
+#ifdef SUPPORT_UCP
+        int othercase;
+        int chartype;
+        if ((ims & PCRE_CASELESS) != 0 &&
+             _pcre_ucp_findchar(fc, &chartype, &othercase) >= 0 &&
+             othercase > 0)
+          oclength = _pcre_ord2utf8(othercase, occhars);
+#endif  /* SUPPORT_UCP */
+
+        for (i = 1; i <= min; i++)
+          {
+          if (memcmp(eptr, charptr, length) == 0) eptr += length;
+          /* Need braces because of following else */
+          else if (oclength == 0) { RRETURN(MATCH_NOMATCH); }
+          else
+            {
+            if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH);
+            eptr += oclength;
+            }
+          }
+
+        if (min == max) continue;
+
+        if (minimize)
+          {
+          for (fi = min;; fi++)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+            if (memcmp(eptr, charptr, length) == 0) eptr += length;
+            /* Need braces because of following else */
+            else if (oclength == 0) { RRETURN(MATCH_NOMATCH); }
+            else
+              {
+              if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH);
+              eptr += oclength;
+              }
+            }
+          /* Control never gets here */
+          }
+        else
+          {
+          pp = eptr;
+          for (i = min; i < max; i++)
+            {
+            if (eptr > md->end_subject - length) break;
+            if (memcmp(eptr, charptr, length) == 0) eptr += length;
+            else if (oclength == 0) break;
+            else
+              {
+              if (memcmp(eptr, occhars, oclength) != 0) break;
+              eptr += oclength;
+              }
+            }
+          while (eptr >= pp)
+           {
+           RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+           if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+           eptr -= length;
+           }
+          RRETURN(MATCH_NOMATCH);
+          }
+        /* Control never gets here */
+        }
+
+      /* If the length of a UTF-8 character is 1, we fall through here, and
+      obey the code as for non-UTF-8 characters below, though in this case the
+      value of fc will always be < 128. */
+      }
+    else
+#endif  /* SUPPORT_UTF8 */
+
+    /* When not in UTF-8 mode, load a single-byte character. */
+      {
+      if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+      fc = *ecode++;
+      }
+
+    /* The value of fc at this point is always less than 256, though we may or
+    may not be in UTF-8 mode. The code is duplicated for the caseless and
+    caseful cases, for speed, since matching characters is likely to be quite
+    common. First, ensure the minimum number of matches are present. If min =
+    max, continue at the same level without recursing. Otherwise, if
+    minimizing, keep trying the rest of the expression and advancing one
+    matching character if failing, up to the maximum. Alternatively, if
+    maximizing, find the maximum number of characters and work backwards. */
+
+    DPRINTF(("matching %c{%d,%d} against subject %.*s\n", fc, min, max,
+      max, eptr));
+
+    if ((ims & PCRE_CASELESS) != 0)
+      {
+      fc = md->lcc[fc];
+      for (i = 1; i <= min; i++)
+        if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
+      if (min == max) continue;
+      if (minimize)
+        {
+        for (fi = min;; fi++)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (fi >= max || eptr >= md->end_subject ||
+              fc != md->lcc[*eptr++])
+            RRETURN(MATCH_NOMATCH);
+          }
+        /* Control never gets here */
+        }
+      else
+        {
+        pp = eptr;
+        for (i = min; i < max; i++)
+          {
+          if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break;
+          eptr++;
+          }
+        while (eptr >= pp)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          eptr--;
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          }
+        RRETURN(MATCH_NOMATCH);
+        }
+      /* Control never gets here */
+      }
+
+    /* Caseful comparisons (includes all multi-byte characters) */
+
+    else
+      {
+      for (i = 1; i <= min; i++) if (fc != *eptr++) RRETURN(MATCH_NOMATCH);
+      if (min == max) continue;
+      if (minimize)
+        {
+        for (fi = min;; fi++)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (fi >= max || eptr >= md->end_subject || fc != *eptr++)
+            RRETURN(MATCH_NOMATCH);
+          }
+        /* Control never gets here */
+        }
+      else
+        {
+        pp = eptr;
+        for (i = min; i < max; i++)
+          {
+          if (eptr >= md->end_subject || fc != *eptr) break;
+          eptr++;
+          }
+        while (eptr >= pp)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          eptr--;
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          }
+        RRETURN(MATCH_NOMATCH);
+        }
+      }
+    /* Control never gets here */
+
+    /* Match a negated single one-byte character. The character we are
+    checking can be multibyte. */
+
+    case OP_NOT:
+    if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+    ecode++;
+    GETCHARINCTEST(c, eptr);
+    if ((ims & PCRE_CASELESS) != 0)
+      {
+#ifdef SUPPORT_UTF8
+      if (c < 256)
+#endif
+      c = md->lcc[c];
+      if (md->lcc[*ecode++] == c) RRETURN(MATCH_NOMATCH);
+      }
+    else
+      {
+      if (*ecode++ == c) RRETURN(MATCH_NOMATCH);
+      }
+    break;
+
+    /* Match a negated single one-byte character repeatedly. This is almost a
+    repeat of the code for a repeated single character, but I haven't found a
+    nice way of commoning these up that doesn't require a test of the
+    positive/negative option for each character match. Maybe that wouldn't add
+    very much to the time taken, but character matching *is* what this is all
+    about... */
+
+    case OP_NOTEXACT:
+    min = max = GET2(ecode, 1);
+    ecode += 3;
+    goto REPEATNOTCHAR;
+
+    case OP_NOTUPTO:
+    case OP_NOTMINUPTO:
+    min = 0;
+    max = GET2(ecode, 1);
+    minimize = *ecode == OP_NOTMINUPTO;
+    ecode += 3;
+    goto REPEATNOTCHAR;
+
+    case OP_NOTSTAR:
+    case OP_NOTMINSTAR:
+    case OP_NOTPLUS:
+    case OP_NOTMINPLUS:
+    case OP_NOTQUERY:
+    case OP_NOTMINQUERY:
+    c = *ecode++ - OP_NOTSTAR;
+    minimize = (c & 1) != 0;
+    min = rep_min[c];                 /* Pick up values from tables; */
+    max = rep_max[c];                 /* zero for max => infinity */
+    if (max == 0) max = INT_MAX;
+
+    /* Common code for all repeated single-byte matches. We can give up quickly
+    if there are fewer than the minimum number of bytes left in the
+    subject. */
+
+    REPEATNOTCHAR:
+    if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+    fc = *ecode++;
+
+    /* The code is duplicated for the caseless and caseful cases, for speed,
+    since matching characters is likely to be quite common. First, ensure the
+    minimum number of matches are present. If min = max, continue at the same
+    level without recursing. Otherwise, if minimizing, keep trying the rest of
+    the expression and advancing one matching character if failing, up to the
+    maximum. Alternatively, if maximizing, find the maximum number of
+    characters and work backwards. */
+
+    DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", fc, min, max,
+      max, eptr));
+
+    if ((ims & PCRE_CASELESS) != 0)
+      {
+      fc = md->lcc[fc];
+
+#ifdef SUPPORT_UTF8
+      /* UTF-8 mode */
+      if (utf8)
+        {
+        register int d;
+        for (i = 1; i <= min; i++)
+          {
+          GETCHARINC(d, eptr);
+          if (d < 256) d = md->lcc[d];
+          if (fc == d) RRETURN(MATCH_NOMATCH);
+          }
+        }
+      else
+#endif
+
+      /* Not UTF-8 mode */
+        {
+        for (i = 1; i <= min; i++)
+          if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
+        }
+
+      if (min == max) continue;
+
+      if (minimize)
+        {
+#ifdef SUPPORT_UTF8
+        /* UTF-8 mode */
+        if (utf8)
+          {
+          register int d;
+          for (fi = min;; fi++)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            GETCHARINC(d, eptr);
+            if (d < 256) d = md->lcc[d];
+            if (fi >= max || eptr >= md->end_subject || fc == d)
+              RRETURN(MATCH_NOMATCH);
+            }
+          }
+        else
+#endif
+        /* Not UTF-8 mode */
+          {
+          for (fi = min;; fi++)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            if (fi >= max || eptr >= md->end_subject || fc == md->lcc[*eptr++])
+              RRETURN(MATCH_NOMATCH);
+            }
+          }
+        /* Control never gets here */
+        }
+
+      /* Maximize case */
+
+      else
+        {
+        pp = eptr;
+
+#ifdef SUPPORT_UTF8
+        /* UTF-8 mode */
+        if (utf8)
+          {
+          register int d;
+          for (i = min; i < max; i++)
+            {
+            int len = 1;
+            if (eptr >= md->end_subject) break;
+            GETCHARLEN(d, eptr, len);
+            if (d < 256) d = md->lcc[d];
+            if (fc == d) break;
+            eptr += len;
+            }
+          for(;;)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            if (eptr-- == pp) break;        /* Stop if tried at original pos */
+            BACKCHAR(eptr);
+            }
+          }
+        else
+#endif
+        /* Not UTF-8 mode */
+          {
+          for (i = min; i < max; i++)
+            {
+            if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break;
+            eptr++;
+            }
+          while (eptr >= pp)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            eptr--;
+            }
+          }
+
+        RRETURN(MATCH_NOMATCH);
+        }
+      /* Control never gets here */
+      }
+
+    /* Caseful comparisons */
+
+    else
+      {
+#ifdef SUPPORT_UTF8
+      /* UTF-8 mode */
+      if (utf8)
+        {
+        register int d;
+        for (i = 1; i <= min; i++)
+          {
+          GETCHARINC(d, eptr);
+          if (fc == d) RRETURN(MATCH_NOMATCH);
+          }
+        }
+      else
+#endif
+      /* Not UTF-8 mode */
+        {
+        for (i = 1; i <= min; i++)
+          if (fc == *eptr++) RRETURN(MATCH_NOMATCH);
+        }
+
+      if (min == max) continue;
+
+      if (minimize)
+        {
+#ifdef SUPPORT_UTF8
+        /* UTF-8 mode */
+        if (utf8)
+          {
+          register int d;
+          for (fi = min;; fi++)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            GETCHARINC(d, eptr);
+            if (fi >= max || eptr >= md->end_subject || fc == d)
+              RRETURN(MATCH_NOMATCH);
+            }
+          }
+        else
+#endif
+        /* Not UTF-8 mode */
+          {
+          for (fi = min;; fi++)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            if (fi >= max || eptr >= md->end_subject || fc == *eptr++)
+              RRETURN(MATCH_NOMATCH);
+            }
+          }
+        /* Control never gets here */
+        }
+
+      /* Maximize case */
+
+      else
+        {
+        pp = eptr;
+
+#ifdef SUPPORT_UTF8
+        /* UTF-8 mode */
+        if (utf8)
+          {
+          register int d;
+          for (i = min; i < max; i++)
+            {
+            int len = 1;
+            if (eptr >= md->end_subject) break;
+            GETCHARLEN(d, eptr, len);
+            if (fc == d) break;
+            eptr += len;
+            }
+          for(;;)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            if (eptr-- == pp) break;        /* Stop if tried at original pos */
+            BACKCHAR(eptr);
+            }
+          }
+        else
+#endif
+        /* Not UTF-8 mode */
+          {
+          for (i = min; i < max; i++)
+            {
+            if (eptr >= md->end_subject || fc == *eptr) break;
+            eptr++;
+            }
+          while (eptr >= pp)
+            {
+            RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+            eptr--;
+            }
+          }
+
+        RRETURN(MATCH_NOMATCH);
+        }
+      }
+    /* Control never gets here */
+
+    /* Match a single character type repeatedly; several different opcodes
+    share code. This is very similar to the code for single characters, but we
+    repeat it in the interests of efficiency. */
+
+    case OP_TYPEEXACT:
+    min = max = GET2(ecode, 1);
+    minimize = TRUE;
+    ecode += 3;
+    goto REPEATTYPE;
+
+    case OP_TYPEUPTO:
+    case OP_TYPEMINUPTO:
+    min = 0;
+    max = GET2(ecode, 1);
+    minimize = *ecode == OP_TYPEMINUPTO;
+    ecode += 3;
+    goto REPEATTYPE;
+
+    case OP_TYPESTAR:
+    case OP_TYPEMINSTAR:
+    case OP_TYPEPLUS:
+    case OP_TYPEMINPLUS:
+    case OP_TYPEQUERY:
+    case OP_TYPEMINQUERY:
+    c = *ecode++ - OP_TYPESTAR;
+    minimize = (c & 1) != 0;
+    min = rep_min[c];                 /* Pick up values from tables; */
+    max = rep_max[c];                 /* zero for max => infinity */
+    if (max == 0) max = INT_MAX;
+
+    /* Common code for all repeated single character type matches. Note that
+    in UTF-8 mode, '.' matches a character of any length, but for the other
+    character types, the valid characters are all one-byte long. */
+
+    REPEATTYPE:
+    ctype = *ecode++;      /* Code for the character type */
+
+#ifdef SUPPORT_UCP
+    if (ctype == OP_PROP || ctype == OP_NOTPROP)
+      {
+      prop_fail_result = ctype == OP_NOTPROP;
+      prop_type = *ecode++;
+      if (prop_type >= 128)
+        {
+        prop_test_against = prop_type - 128;
+        prop_test_variable = &prop_category;
+        }
+      else
+        {
+        prop_test_against = prop_type;
+        prop_test_variable = &prop_chartype;
+        }
+      }
+    else prop_type = -1;
+#endif
+
+    /* First, ensure the minimum number of matches are present. Use inline
+    code for maximizing the speed, and do the type test once at the start
+    (i.e. keep it out of the loop). Also we can test that there are at least
+    the minimum number of bytes before we start. This isn't as effective in
+    UTF-8 mode, but it does no harm. Separate the UTF-8 code completely as that
+    is tidier. Also separate the UCP code, which can be the same for both UTF-8
+    and single-bytes. */
+
+    if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+    if (min > 0)
+      {
+#ifdef SUPPORT_UCP
+      if (prop_type > 0)
+        {
+        for (i = 1; i <= min; i++)
+          {
+          GETCHARINC(c, eptr);
+          prop_category = _pcre_ucp_findchar(c, &prop_chartype, &prop_othercase);
+          if ((*prop_test_variable == prop_test_against) == prop_fail_result)
+            RRETURN(MATCH_NOMATCH);
+          }
+        }
+
+      /* Match extended Unicode sequences. We will get here only if the
+      support is in the binary; otherwise a compile-time error occurs. */
+
+      else if (ctype == OP_EXTUNI)
+        {
+        for (i = 1; i <= min; i++)
+          {
+          GETCHARINCTEST(c, eptr);
+          prop_category = _pcre_ucp_findchar(c, &prop_chartype, &prop_othercase);
+          if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH);
+          while (eptr < md->end_subject)
+            {
+            int len = 1;
+            if (!utf8) c = *eptr; else
+              {
+              GETCHARLEN(c, eptr, len);
+              }
+            prop_category = _pcre_ucp_findchar(c, &prop_chartype, &prop_othercase);
+            if (prop_category != ucp_M) break;
+            eptr += len;
+            }
+          }
+        }
+
+      else
+#endif     /* SUPPORT_UCP */
+
+/* Handle all other cases when the coding is UTF-8 */
+
+#ifdef SUPPORT_UTF8
+      if (utf8) switch(ctype)
+        {
+        case OP_ANY:
+        for (i = 1; i <= min; i++)
+          {
+          if (eptr >= md->end_subject ||
+             (*eptr++ == NEWLINE && (ims & PCRE_DOTALL) == 0))
+            RRETURN(MATCH_NOMATCH);
+          while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+          }
+        break;
+
+        case OP_ANYBYTE:
+        eptr += min;
+        break;
+
+        case OP_NOT_DIGIT:
+        for (i = 1; i <= min; i++)
+          {
+          if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+          GETCHARINC(c, eptr);
+          if (c < 128 && (md->ctypes[c] & ctype_digit) != 0)
+            RRETURN(MATCH_NOMATCH);
+          }
+        break;
+
+        case OP_DIGIT:
+        for (i = 1; i <= min; i++)
+          {
+          if (eptr >= md->end_subject ||
+             *eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0)
+            RRETURN(MATCH_NOMATCH);
+          /* No need to skip more bytes - we know it's a 1-byte character */
+          }
+        break;
+
+        case OP_NOT_WHITESPACE:
+        for (i = 1; i <= min; i++)
+          {
+          if (eptr >= md->end_subject ||
+             (*eptr < 128 && (md->ctypes[*eptr++] & ctype_space) != 0))
+            RRETURN(MATCH_NOMATCH);
+          while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+          }
+        break;
+
+        case OP_WHITESPACE:
+        for (i = 1; i <= min; i++)
+          {
+          if (eptr >= md->end_subject ||
+             *eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0)
+            RRETURN(MATCH_NOMATCH);
+          /* No need to skip more bytes - we know it's a 1-byte character */
+          }
+        break;
+
+        case OP_NOT_WORDCHAR:
+        for (i = 1; i <= min; i++)
+          {
+          if (eptr >= md->end_subject ||
+             (*eptr < 128 && (md->ctypes[*eptr++] & ctype_word) != 0))
+            RRETURN(MATCH_NOMATCH);
+          while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+          }
+        break;
+
+        case OP_WORDCHAR:
+        for (i = 1; i <= min; i++)
+          {
+          if (eptr >= md->end_subject ||
+             *eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0)
+            RRETURN(MATCH_NOMATCH);
+          /* No need to skip more bytes - we know it's a 1-byte character */
+          }
+        break;
+
+        default:
+        RRETURN(PCRE_ERROR_INTERNAL);
+        }  /* End switch(ctype) */
+
+      else
+#endif     /* SUPPORT_UTF8 */
+
+      /* Code for the non-UTF-8 case for minimum matching of operators other
+      than OP_PROP and OP_NOTPROP. */
+
+      switch(ctype)
+        {
+        case OP_ANY:
+        if ((ims & PCRE_DOTALL) == 0)
+          {
+          for (i = 1; i <= min; i++)
+            if (*eptr++ == NEWLINE) RRETURN(MATCH_NOMATCH);
+          }
+        else eptr += min;
+        break;
+
+        case OP_ANYBYTE:
+        eptr += min;
+        break;
+
+        case OP_NOT_DIGIT:
+        for (i = 1; i <= min; i++)
+          if ((md->ctypes[*eptr++] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH);
+        break;
+
+        case OP_DIGIT:
+        for (i = 1; i <= min; i++)
+          if ((md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH);
+        break;
+
+        case OP_NOT_WHITESPACE:
+        for (i = 1; i <= min; i++)
+          if ((md->ctypes[*eptr++] & ctype_space) != 0) RRETURN(MATCH_NOMATCH);
+        break;
+
+        case OP_WHITESPACE:
+        for (i = 1; i <= min; i++)
+          if ((md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH);
+        break;
+
+        case OP_NOT_WORDCHAR:
+        for (i = 1; i <= min; i++)
+          if ((md->ctypes[*eptr++] & ctype_word) != 0)
+            RRETURN(MATCH_NOMATCH);
+        break;
+
+        case OP_WORDCHAR:
+        for (i = 1; i <= min; i++)
+          if ((md->ctypes[*eptr++] & ctype_word) == 0)
+            RRETURN(MATCH_NOMATCH);
+        break;
+
+        default:
+        RRETURN(PCRE_ERROR_INTERNAL);
+        }
+      }
+
+    /* If min = max, continue at the same level without recursing */
+
+    if (min == max) continue;
+
+    /* If minimizing, we have to test the rest of the pattern before each
+    subsequent match. Again, separate the UTF-8 case for speed, and also
+    separate the UCP cases. */
+
+    if (minimize)
+      {
+#ifdef SUPPORT_UCP
+      if (prop_type > 0)
+        {
+        for (fi = min;; fi++)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+          GETCHARINC(c, eptr);
+          prop_category = _pcre_ucp_findchar(c, &prop_chartype, &prop_othercase);
+          if ((*prop_test_variable == prop_test_against) == prop_fail_result)
+            RRETURN(MATCH_NOMATCH);
+          }
+        }
+
+      /* Match extended Unicode sequences. We will get here only if the
+      support is in the binary; otherwise a compile-time error occurs. */
+
+      else if (ctype == OP_EXTUNI)
+        {
+        for (fi = min;; fi++)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+          GETCHARINCTEST(c, eptr);
+          prop_category = _pcre_ucp_findchar(c, &prop_chartype, &prop_othercase);
+          if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH);
+          while (eptr < md->end_subject)
+            {
+            int len = 1;
+            if (!utf8) c = *eptr; else
+              {
+              GETCHARLEN(c, eptr, len);
+              }
+            prop_category = _pcre_ucp_findchar(c, &prop_chartype, &prop_othercase);
+            if (prop_category != ucp_M) break;
+            eptr += len;
+            }
+          }
+        }
+
+      else
+#endif     /* SUPPORT_UCP */
+
+#ifdef SUPPORT_UTF8
+      /* UTF-8 mode */
+      if (utf8)
+        {
+        for (fi = min;; fi++)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+
+          GETCHARINC(c, eptr);
+          switch(ctype)
+            {
+            case OP_ANY:
+            if ((ims & PCRE_DOTALL) == 0 && c == NEWLINE) RRETURN(MATCH_NOMATCH);
+            break;
+
+            case OP_ANYBYTE:
+            break;
+
+            case OP_NOT_DIGIT:
+            if (c < 256 && (md->ctypes[c] & ctype_digit) != 0)
+              RRETURN(MATCH_NOMATCH);
+            break;
+
+            case OP_DIGIT:
+            if (c >= 256 || (md->ctypes[c] & ctype_digit) == 0)
+              RRETURN(MATCH_NOMATCH);
+            break;
+
+            case OP_NOT_WHITESPACE:
+            if (c < 256 && (md->ctypes[c] & ctype_space) != 0)
+              RRETURN(MATCH_NOMATCH);
+            break;
+
+            case OP_WHITESPACE:
+            if  (c >= 256 || (md->ctypes[c] & ctype_space) == 0)
+              RRETURN(MATCH_NOMATCH);
+            break;
+
+            case OP_NOT_WORDCHAR:
+            if (c < 256 && (md->ctypes[c] & ctype_word) != 0)
+              RRETURN(MATCH_NOMATCH);
+            break;
+
+            case OP_WORDCHAR:
+            if (c >= 256 || (md->ctypes[c] & ctype_word) == 0)
+              RRETURN(MATCH_NOMATCH);
+            break;
+
+            default:
+            RRETURN(PCRE_ERROR_INTERNAL);
+            }
+          }
+        }
+      else
+#endif
+      /* Not UTF-8 mode */
+        {
+        for (fi = min;; fi++)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+          c = *eptr++;
+          switch(ctype)
+            {
+            case OP_ANY:
+            if ((ims & PCRE_DOTALL) == 0 && c == NEWLINE) RRETURN(MATCH_NOMATCH);
+            break;
+
+            case OP_ANYBYTE:
+            break;
+
+            case OP_NOT_DIGIT:
+            if ((md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH);
+            break;
+
+            case OP_DIGIT:
+            if ((md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH);
+            break;
+
+            case OP_NOT_WHITESPACE:
+            if ((md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH);
+            break;
+
+            case OP_WHITESPACE:
+            if  ((md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH);
+            break;
+
+            case OP_NOT_WORDCHAR:
+            if ((md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH);
+            break;
+
+            case OP_WORDCHAR:
+            if ((md->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH);
+            break;
+
+            default:
+            RRETURN(PCRE_ERROR_INTERNAL);
+            }
+          }
+        }
+      /* Control never gets here */
+      }
+
+    /* If maximizing it is worth using inline code for speed, doing the type
+    test once at the start (i.e. keep it out of the loop). Again, keep the
+    UTF-8 and UCP stuff separate. */
+
+    else
+      {
+      pp = eptr;  /* Remember where we started */
+
+#ifdef SUPPORT_UCP
+      if (prop_type > 0)
+        {
+        for (i = min; i < max; i++)
+          {
+          int len = 1;
+          if (eptr >= md->end_subject) break;
+          GETCHARLEN(c, eptr, len);
+          prop_category = _pcre_ucp_findchar(c, &prop_chartype, &prop_othercase);
+          if ((*prop_test_variable == prop_test_against) == prop_fail_result)
+            break;
+          eptr+= len;
+          }
+
+        /* eptr is now past the end of the maximum run */
+
+        for(;;)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (eptr-- == pp) break;        /* Stop if tried at original pos */
+          BACKCHAR(eptr);
+          }
+        }
+
+      /* Match extended Unicode sequences. We will get here only if the
+      support is in the binary; otherwise a compile-time error occurs. */
+
+      else if (ctype == OP_EXTUNI)
+        {
+        for (i = min; i < max; i++)
+          {
+          if (eptr >= md->end_subject) break;
+          GETCHARINCTEST(c, eptr);
+          prop_category = _pcre_ucp_findchar(c, &prop_chartype, &prop_othercase);
+          if (prop_category == ucp_M) break;
+          while (eptr < md->end_subject)
+            {
+            int len = 1;
+            if (!utf8) c = *eptr; else
+              {
+              GETCHARLEN(c, eptr, len);
+              }
+            prop_category = _pcre_ucp_findchar(c, &prop_chartype, &prop_othercase);
+            if (prop_category != ucp_M) break;
+            eptr += len;
+            }
+          }
+
+        /* eptr is now past the end of the maximum run */
+
+        for(;;)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (eptr-- == pp) break;        /* Stop if tried at original pos */
+          for (;;)                        /* Move back over one extended */
+            {
+            int len = 1;
+            BACKCHAR(eptr);
+            if (!utf8) c = *eptr; else
+              {
+              GETCHARLEN(c, eptr, len);
+              }
+            prop_category = _pcre_ucp_findchar(c, &prop_chartype, &prop_othercase);
+            if (prop_category != ucp_M) break;
+            eptr--;
+            }
+          }
+        }
+
+      else
+#endif   /* SUPPORT_UCP */
+
+#ifdef SUPPORT_UTF8
+      /* UTF-8 mode */
+
+      if (utf8)
+        {
+        switch(ctype)
+          {
+          case OP_ANY:
+
+          /* Special code is required for UTF8, but when the maximum is unlimited
+          we don't need it, so we repeat the non-UTF8 code. This is probably
+          worth it, because .* is quite a common idiom. */
+
+          if (max < INT_MAX)
+            {
+            if ((ims & PCRE_DOTALL) == 0)
+              {
+              for (i = min; i < max; i++)
+                {
+                if (eptr >= md->end_subject || *eptr == NEWLINE) break;
+                eptr++;
+                while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+                }
+              }
+            else
+              {
+              for (i = min; i < max; i++)
+                {
+                eptr++;
+                while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+                }
+              }
+            }
+
+          /* Handle unlimited UTF-8 repeat */
+
+          else
+            {
+            if ((ims & PCRE_DOTALL) == 0)
+              {
+              for (i = min; i < max; i++)
+                {
+                if (eptr >= md->end_subject || *eptr == NEWLINE) break;
+                eptr++;
+                }
+              break;
+              }
+            else
+              {
+              c = max - min;
+              if (c > md->end_subject - eptr) c = md->end_subject - eptr;
+              eptr += c;
+              }
+            }
+          break;
+
+          /* The byte case is the same as non-UTF8 */
+
+          case OP_ANYBYTE:
+          c = max - min;
+          if (c > md->end_subject - eptr) c = md->end_subject - eptr;
+          eptr += c;
+          break;
+
+          case OP_NOT_DIGIT:
+          for (i = min; i < max; i++)
+            {
+            int len = 1;
+            if (eptr >= md->end_subject) break;
+            GETCHARLEN(c, eptr, len);
+            if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break;
+            eptr+= len;
+            }
+          break;
+
+          case OP_DIGIT:
+          for (i = min; i < max; i++)
+            {
+            int len = 1;
+            if (eptr >= md->end_subject) break;
+            GETCHARLEN(c, eptr, len);
+            if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break;
+            eptr+= len;
+            }
+          break;
+
+          case OP_NOT_WHITESPACE:
+          for (i = min; i < max; i++)
+            {
+            int len = 1;
+            if (eptr >= md->end_subject) break;
+            GETCHARLEN(c, eptr, len);
+            if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break;
+            eptr+= len;
+            }
+          break;
+
+          case OP_WHITESPACE:
+          for (i = min; i < max; i++)
+            {
+            int len = 1;
+            if (eptr >= md->end_subject) break;
+            GETCHARLEN(c, eptr, len);
+            if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break;
+            eptr+= len;
+            }
+          break;
+
+          case OP_NOT_WORDCHAR:
+          for (i = min; i < max; i++)
+            {
+            int len = 1;
+            if (eptr >= md->end_subject) break;
+            GETCHARLEN(c, eptr, len);
+            if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break;
+            eptr+= len;
+            }
+          break;
+
+          case OP_WORDCHAR:
+          for (i = min; i < max; i++)
+            {
+            int len = 1;
+            if (eptr >= md->end_subject) break;
+            GETCHARLEN(c, eptr, len);
+            if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break;
+            eptr+= len;
+            }
+          break;
+
+          default:
+          RRETURN(PCRE_ERROR_INTERNAL);
+          }
+
+        /* eptr is now past the end of the maximum run */
+
+        for(;;)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          if (eptr-- == pp) break;        /* Stop if tried at original pos */
+          BACKCHAR(eptr);
+          }
+        }
+      else
+#endif
+
+      /* Not UTF-8 mode */
+        {
+        switch(ctype)
+          {
+          case OP_ANY:
+          if ((ims & PCRE_DOTALL) == 0)
+            {
+            for (i = min; i < max; i++)
+              {
+              if (eptr >= md->end_subject || *eptr == NEWLINE) break;
+              eptr++;
+              }
+            break;
+            }
+          /* For DOTALL case, fall through and treat as \C */
+
+          case OP_ANYBYTE:
+          c = max - min;
+          if (c > md->end_subject - eptr) c = md->end_subject - eptr;
+          eptr += c;
+          break;
+
+          case OP_NOT_DIGIT:
+          for (i = min; i < max; i++)
+            {
+            if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0)
+              break;
+            eptr++;
+            }
+          break;
+
+          case OP_DIGIT:
+          for (i = min; i < max; i++)
+            {
+            if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0)
+              break;
+            eptr++;
+            }
+          break;
+
+          case OP_NOT_WHITESPACE:
+          for (i = min; i < max; i++)
+            {
+            if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0)
+              break;
+            eptr++;
+            }
+          break;
+
+          case OP_WHITESPACE:
+          for (i = min; i < max; i++)
+            {
+            if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0)
+              break;
+            eptr++;
+            }
+          break;
+
+          case OP_NOT_WORDCHAR:
+          for (i = min; i < max; i++)
+            {
+            if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0)
+              break;
+            eptr++;
+            }
+          break;
+
+          case OP_WORDCHAR:
+          for (i = min; i < max; i++)
+            {
+            if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0)
+              break;
+            eptr++;
+            }
+          break;
+
+          default:
+          RRETURN(PCRE_ERROR_INTERNAL);
+          }
+
+        /* eptr is now past the end of the maximum run */
+
+        while (eptr >= pp)
+          {
+          RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+          eptr--;
+          if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+          }
+        }
+
+      /* Get here if we can't make it match with any permitted repetitions */
+
+      RRETURN(MATCH_NOMATCH);
+      }
+    /* Control never gets here */
+
+    /* There's been some horrible disaster. Since all codes > OP_BRA are
+    for capturing brackets, and there shouldn't be any gaps between 0 and
+    OP_BRA, arrival here can only mean there is something seriously wrong
+    in the code above or the OP_xxx definitions. */
+
+    default:
+    DPRINTF(("Unknown opcode %d\n", *ecode));
+    RRETURN(PCRE_ERROR_UNKNOWN_NODE);
+    }
+
+  /* Do not stick any code in here without much thought; it is assumed
+  that "continue" in the code above comes out to here to repeat the main
+  loop. */
+
+  }             /* End of main loop */
+/* Control never reaches here */
+}
+
+
+/***************************************************************************
+****************************************************************************
+                   RECURSION IN THE match() FUNCTION
+
+Undefine all the macros that were defined above to handle this. */
+
+#ifdef NO_RECURSE
+#undef eptr
+#undef ecode
+#undef offset_top
+#undef ims
+#undef eptrb
+#undef flags
+
+#undef callpat
+#undef charptr
+#undef data
+#undef next
+#undef pp
+#undef prev
+#undef saved_eptr
+
+#undef new_recursive
+
+#undef cur_is_word
+#undef condition
+#undef minimize
+#undef prev_is_word
+
+#undef original_ims
+
+#undef ctype
+#undef length
+#undef max
+#undef min
+#undef number
+#undef offset
+#undef op
+#undef save_capture_last
+#undef save_offset1
+#undef save_offset2
+#undef save_offset3
+#undef stacksave
+
+#undef newptrb
+
+#endif
+
+/* These two are defined as macros in both cases */
+
+#undef fc
+#undef fi
+
+/***************************************************************************
+***************************************************************************/
+
+
+
+/*************************************************
+*         Execute a Regular Expression           *
+*************************************************/
+
+/* This function applies a compiled re to a subject string and picks out
+portions of the string if it matches. Two elements in the vector are set for
+each substring: the offsets to the start and end of the substring.
+
+Arguments:
+  argument_re     points to the compiled expression
+  extra_data      points to extra data or is NULL
+  subject         points to the subject string
+  length          length of subject string (may contain binary zeros)
+  start_offset    where to start in the subject string
+  options         option bits
+  offsets         points to a vector of ints to be filled in with offsets
+  offsetcount     the number of elements in the vector
+
+Returns:          > 0 => success; value is the number of elements filled in
+                  = 0 => success, but offsets is not big enough
+                   -1 => failed to match
+                 < -1 => some kind of unexpected problem
+*/
+
+PCRE_EXPORT int
+pcre_exec(const pcre *argument_re, const pcre_extra *extra_data,
+  const char *subject, int length, int start_offset, int options, int *offsets,
+  int offsetcount)
+{
+int rc, resetcount, ocount;
+int first_byte = -1;
+int req_byte = -1;
+int req_byte2 = -1;
+unsigned long int ims = 0;
+BOOL using_temporary_offsets = FALSE;
+BOOL anchored;
+BOOL startline;
+BOOL firstline;
+BOOL first_byte_caseless = FALSE;
+BOOL req_byte_caseless = FALSE;
+match_data match_block;
+const uschar *tables;
+const uschar *start_bits = NULL;
+const uschar *start_match = (const uschar *)subject + start_offset;
+const uschar *end_subject;
+const uschar *req_byte_ptr = start_match - 1;
+
+pcre_study_data internal_study;
+const pcre_study_data *study;
+
+real_pcre internal_re;
+const real_pcre *external_re = (const real_pcre *)argument_re;
+const real_pcre *re = external_re;
+
+/* Plausibility checks */
+
+if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;
+if (re == NULL || subject == NULL ||
+   (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;
+if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;
+
+/* Fish out the optional data from the extra_data structure, first setting
+the default values. */
+
+study = NULL;
+match_block.match_limit = MATCH_LIMIT;
+match_block.callout_data = NULL;
+
+/* The table pointer is always in native byte order. */
+
+tables = external_re->tables;
+
+if (extra_data != NULL)
+  {
+  register unsigned int flags = extra_data->flags;
+  if ((flags & PCRE_EXTRA_STUDY_DATA) != 0)
+    study = (const pcre_study_data *)extra_data->study_data;
+  if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0)
+    match_block.match_limit = extra_data->match_limit;
+  if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0)
+    match_block.callout_data = extra_data->callout_data;
+  if ((flags & PCRE_EXTRA_TABLES) != 0) tables = extra_data->tables;
+  }
+
+/* If the exec call supplied NULL for tables, use the inbuilt ones. This
+is a feature that makes it possible to save compiled regex and re-use them
+in other programs later. */
+
+if (tables == NULL) tables = _pcre_default_tables;
+
+/* Check that the first field in the block is the magic number. If it is not,
+test for a regex that was compiled on a host of opposite endianness. If this is
+the case, flipped values are put in internal_re and internal_study if there was
+study data too. */
+
+if (re->magic_number != MAGIC_NUMBER)
+  {
+  re = _pcre_try_flipped(re, &internal_re, study, &internal_study);
+  if (re == NULL) return PCRE_ERROR_BADMAGIC;
+  if (study != NULL) study = &internal_study;
+  }
+
+/* Set up other data */
+
+anchored = ((re->options | options) & PCRE_ANCHORED) != 0;
+startline = (re->options & PCRE_STARTLINE) != 0;
+firstline = (re->options & PCRE_FIRSTLINE) != 0;
+
+/* The code starts after the real_pcre block and the capture name table. */
+
+match_block.start_code = (const uschar *)external_re + re->name_table_offset +
+  re->name_count * re->name_entry_size;
+
+match_block.start_subject = (const uschar *)subject;
+match_block.start_offset = start_offset;
+match_block.end_subject = match_block.start_subject + length;
+end_subject = match_block.end_subject;
+
+match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;
+match_block.utf8 = (re->options & PCRE_UTF8) != 0;
+
+match_block.notbol = (options & PCRE_NOTBOL) != 0;
+match_block.noteol = (options & PCRE_NOTEOL) != 0;
+match_block.notempty = (options & PCRE_NOTEMPTY) != 0;
+match_block.partial = (options & PCRE_PARTIAL) != 0;
+match_block.hitend = FALSE;
+
+match_block.recursive = NULL;                   /* No recursion at top level */
+
+match_block.lcc = tables + lcc_offset;
+match_block.ctypes = tables + ctypes_offset;
+
+/* Partial matching is supported only for a restricted set of regexes at the
+moment. */
+
+if (match_block.partial && (re->options & PCRE_NOPARTIAL) != 0)
+  return PCRE_ERROR_BADPARTIAL;
+
+/* Check a UTF-8 string if required. Unfortunately there's no way of passing
+back the character offset. */
+
+#ifdef SUPPORT_UTF8
+if (match_block.utf8 && (options & PCRE_NO_UTF8_CHECK) == 0)
+  {
+  if (_pcre_valid_utf8((uschar *)subject, length) >= 0)
+    return PCRE_ERROR_BADUTF8;
+  if (start_offset > 0 && start_offset < length)
+    {
+    int tb = ((uschar *)subject)[start_offset];
+    if (tb > 127)
+      {
+      tb &= 0xc0;
+      if (tb != 0 && tb != 0xc0) return PCRE_ERROR_BADUTF8_OFFSET;
+      }
+    }
+  }
+#endif
+
+/* The ims options can vary during the matching as a result of the presence
+of (?ims) items in the pattern. They are kept in a local variable so that
+restoring at the exit of a group is easy. */
+
+ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL);
+
+/* If the expression has got more back references than the offsets supplied can
+hold, we get a temporary chunk of working store to use during the matching.
+Otherwise, we can use the vector supplied, rounding down its size to a multiple
+of 3. */
+
+ocount = offsetcount - (offsetcount % 3);
+
+if (re->top_backref > 0 && re->top_backref >= ocount/3)
+  {
+  ocount = re->top_backref * 3 + 3;
+  match_block.offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int));
+  if (match_block.offset_vector == NULL) return PCRE_ERROR_NOMEMORY;
+  using_temporary_offsets = TRUE;
+  DPRINTF(("Got memory to hold back references\n"));
+  }
+else match_block.offset_vector = offsets;
+
+match_block.offset_end = ocount;
+match_block.offset_max = (2*ocount)/3;
+match_block.offset_overflow = FALSE;
+match_block.capture_last = -1;
+
+/* Compute the minimum number of offsets that we need to reset each time. Doing
+this makes a huge difference to execution time when there aren't many brackets
+in the pattern. */
+
+resetcount = 2 + re->top_bracket * 2;
+if (resetcount > offsetcount) resetcount = ocount;
+
+/* Reset the working variable associated with each extraction. These should
+never be used unless previously set, but they get saved and restored, and so we
+initialize them to avoid reading uninitialized locations. */
+
+if (match_block.offset_vector != NULL)
+  {
+  register int *iptr = match_block.offset_vector + ocount;
+  register int *iend = iptr - resetcount/2 + 1;
+  while (--iptr >= iend) *iptr = -1;
+  }
+
+/* Set up the first character to match, if available. The first_byte value is
+never set for an anchored regular expression, but the anchoring may be forced
+at run time, so we have to test for anchoring. The first char may be unset for
+an unanchored pattern, of course. If there's no first char and the pattern was
+studied, there may be a bitmap of possible first characters. */
+
+if (!anchored)
+  {
+  if ((re->options & PCRE_FIRSTSET) != 0)
+    {
+    first_byte = re->first_byte & 255;
+    if ((first_byte_caseless = ((re->first_byte & REQ_CASELESS) != 0)) == TRUE)
+      first_byte = match_block.lcc[first_byte];
+    }
+  else
+    if (!startline && study != NULL &&
+      (study->options & PCRE_STUDY_MAPPED) != 0)
+        start_bits = study->start_bits;
+  }
+
+/* For anchored or unanchored matches, there may be a "last known required
+character" set. */
+
+if ((re->options & PCRE_REQCHSET) != 0)
+  {
+  req_byte = re->req_byte & 255;
+  req_byte_caseless = (re->req_byte & REQ_CASELESS) != 0;
+  req_byte2 = (tables + fcc_offset)[req_byte];  /* case flipped */
+  }
+
+/* Loop for handling unanchored repeated matching attempts; for anchored regexs
+the loop runs just once. */
+
+do
+  {
+  const uschar *save_end_subject = end_subject;
+
+  /* Reset the maximum number of extractions we might see. */
+
+  if (match_block.offset_vector != NULL)
+    {
+    register int *iptr = match_block.offset_vector;
+    register int *iend = iptr + resetcount;
+    while (iptr < iend) *iptr++ = -1;
+    }
+
+  /* Advance to a unique first char if possible. If firstline is TRUE, the
+  start of the match is constrained to the first line of a multiline string.
+  Implement this by temporarily adjusting end_subject so that we stop scanning
+  at a newline. If the match fails at the newline, later code breaks this loop.
+  */
+
+  if (firstline)
+    {
+    const uschar *t = start_match;
+    while (t < save_end_subject && *t != '\n') t++;
+    end_subject = t;
+    }
+
+  /* Now test for a unique first byte */
+
+  if (first_byte >= 0)
+    {
+    if (first_byte_caseless)
+      while (start_match < end_subject &&
+             match_block.lcc[*start_match] != first_byte)
+        start_match++;
+    else
+      while (start_match < end_subject && *start_match != first_byte)
+        start_match++;
+    }
+
+  /* Or to just after \n for a multiline match if possible */
+
+  else if (startline)
+    {
+    if (start_match > match_block.start_subject + start_offset)
+      {
+      while (start_match < end_subject && start_match[-1] != NEWLINE)
+        start_match++;
+      }
+    }
+
+  /* Or to a non-unique first char after study */
+
+  else if (start_bits != NULL)
+    {
+    while (start_match < end_subject)
+      {
+      register unsigned int c = *start_match;
+      if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; else break;
+      }
+    }
+
+  /* Restore fudged end_subject */
+
+  end_subject = save_end_subject;
+
+#ifdef DEBUG  /* Sigh. Some compilers never learn. */
+  printf(">>>> Match against: ");
+  pchars(start_match, end_subject - start_match, TRUE, &match_block);
+  printf("\n");
+#endif
+
+  /* If req_byte is set, we know that that character must appear in the subject
+  for the match to succeed. If the first character is set, req_byte must be
+  later in the subject; otherwise the test starts at the match point. This
+  optimization can save a huge amount of backtracking in patterns with nested
+  unlimited repeats that aren't going to match. Writing separate code for
+  cased/caseless versions makes it go faster, as does using an autoincrement
+  and backing off on a match.
+
+  HOWEVER: when the subject string is very, very long, searching to its end can
+  take a long time, and give bad performance on quite ordinary patterns. This
+  showed up when somebody was matching /^C/ on a 32-megabyte string... so we
+  don't do this when the string is sufficiently long.
+
+  ALSO: this processing is disabled when partial matching is requested.
+  */
+
+  if (req_byte >= 0 &&
+      end_subject - start_match < REQ_BYTE_MAX &&
+      !match_block.partial)
+    {
+    register const uschar *p = start_match + ((first_byte >= 0)? 1 : 0);
+
+    /* We don't need to repeat the search if we haven't yet reached the
+    place we found it at last time. */
+
+    if (p > req_byte_ptr)
+      {
+      if (req_byte_caseless)
+        {
+        while (p < end_subject)
+          {
+          register int pp = *p++;
+          if (pp == req_byte || pp == req_byte2) { p--; break; }
+          }
+        }
+      else
+        {
+        while (p < end_subject)
+          {
+          if (*p++ == req_byte) { p--; break; }
+          }
+        }
+
+      /* If we can't find the required character, break the matching loop */
+
+      if (p >= end_subject) break;
+
+      /* If we have found the required character, save the point where we
+      found it, so that we don't search again next time round the loop if
+      the start hasn't passed this character yet. */
+
+      req_byte_ptr = p;
+      }
+    }
+
+  /* When a match occurs, substrings will be set for all internal extractions;
+  we just need to set up the whole thing as substring 0 before returning. If
+  there were too many extractions, set the return code to zero. In the case
+  where we had to get some local store to hold offsets for backreferences, copy
+  those back references that we can. In this case there need not be overflow
+  if certain parts of the pattern were not used. */
+
+  match_block.start_match = start_match;
+  match_block.match_call_count = 0;
+
+  rc = match(start_match, match_block.start_code, 2, &match_block, ims, NULL,
+    match_isgroup);
+
+  /* When the result is no match, if the subject's first character was a
+  newline and the PCRE_FIRSTLINE option is set, break (which will return
+  PCRE_ERROR_NOMATCH). The option requests that a match occur before the first
+  newline in the subject. Otherwise, advance the pointer to the next character
+  and continue - but the continuation will actually happen only when the
+  pattern is not anchored. */
+
+  if (rc == MATCH_NOMATCH)
+    {
+    if (firstline && *start_match == NEWLINE) break;
+    start_match++;
+#ifdef SUPPORT_UTF8
+    if (match_block.utf8)
+      while(start_match < end_subject && (*start_match & 0xc0) == 0x80)
+        start_match++;
+#endif
+    continue;
+    }
+
+  if (rc != MATCH_MATCH)
+    {
+    DPRINTF((">>>> error: returning %d\n", rc));
+    return rc;
+    }
+
+  /* We have a match! Copy the offset information from temporary store if
+  necessary */
+
+  if (using_temporary_offsets)
+    {
+    if (offsetcount >= 4)
+      {
+      memcpy(offsets + 2, match_block.offset_vector + 2,
+        (offsetcount - 2) * sizeof(int));
+      DPRINTF(("Copied offsets from temporary memory\n"));
+      }
+    if (match_block.end_offset_top > offsetcount)
+      match_block.offset_overflow = TRUE;
+
+    DPRINTF(("Freeing temporary memory\n"));
+    (pcre_free)(match_block.offset_vector);
+    }
+
+  rc = match_block.offset_overflow? 0 : match_block.end_offset_top/2;
+
+  if (offsetcount < 2) rc = 0; else
+    {
+    offsets[0] = start_match - match_block.start_subject;
+    offsets[1] = match_block.end_match_ptr - match_block.start_subject;
+    }
+
+  DPRINTF((">>>> returning %d\n", rc));
+  return rc;
+  }
+
+/* This "while" is the end of the "do" above */
+
+while (!anchored && start_match <= end_subject);
+
+if (using_temporary_offsets)
+  {
+  DPRINTF(("Freeing temporary memory\n"));
+  (pcre_free)(match_block.offset_vector);
+  }
+
+if (match_block.partial && match_block.hitend)
+  {
+  DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n"));
+  return PCRE_ERROR_PARTIAL;
+  }
+else
+  {
+  DPRINTF((">>>> returning PCRE_ERROR_NOMATCH\n"));
+  return PCRE_ERROR_NOMATCH;
+  }
+}
+
+/* End of pcre_exec.c */
diff -Nurp tin-1.6.2/pcre/pcre_fullinfo.c tin-1.8.0/pcre/pcre_fullinfo.c
--- tin-1.6.2/pcre/pcre_fullinfo.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_fullinfo.c	2005-09-12 16:38:55.000000000 +0200
@@ -0,0 +1,149 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/*PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_fullinfo(), which returns
+information about a compiled pattern. */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+*        Return info about compiled pattern      *
+*************************************************/
+
+/* This is a newer "info" function which has an extensible interface so
+that additional items can be added compatibly.
+
+Arguments:
+  argument_re      points to compiled code
+  extra_data       points extra data, or NULL
+  what             what information is required
+  where            where to put the information
+
+Returns:           0 if data returned, negative on error
+*/
+
+PCRE_EXPORT int
+pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data, int what,
+  void *where)
+{
+real_pcre internal_re;
+pcre_study_data internal_study;
+const real_pcre *re = (const real_pcre *)argument_re;
+const pcre_study_data *study = NULL;
+
+if (re == NULL || where == NULL) return PCRE_ERROR_NULL;
+
+if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)
+  study = (const pcre_study_data *)extra_data->study_data;
+
+if (re->magic_number != MAGIC_NUMBER)
+  {
+  re = _pcre_try_flipped(re, &internal_re, study, &internal_study);
+  if (re == NULL) return PCRE_ERROR_BADMAGIC;
+  if (study != NULL) study = &internal_study;
+  }
+
+switch (what)
+  {
+  case PCRE_INFO_OPTIONS:
+  *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS;
+  break;
+
+  case PCRE_INFO_SIZE:
+  *((size_t *)where) = re->size;
+  break;
+
+  case PCRE_INFO_STUDYSIZE:
+  *((size_t *)where) = (study == NULL)? 0 : study->size;
+  break;
+
+  case PCRE_INFO_CAPTURECOUNT:
+  *((int *)where) = re->top_bracket;
+  break;
+
+  case PCRE_INFO_BACKREFMAX:
+  *((int *)where) = re->top_backref;
+  break;
+
+  case PCRE_INFO_FIRSTBYTE:
+  *((int *)where) =
+    ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte :
+    ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
+  break;
+
+  /* Make sure we pass back the pointer to the bit vector in the external
+  block, not the internal copy (with flipped integer fields). */
+
+  case PCRE_INFO_FIRSTTABLE:
+  *((const uschar **)where) =
+    (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)?
+      ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;
+  break;
+
+  case PCRE_INFO_LASTLITERAL:
+  *((int *)where) =
+    ((re->options & PCRE_REQCHSET) != 0)? re->req_byte : -1;
+  break;
+
+  case PCRE_INFO_NAMEENTRYSIZE:
+  *((int *)where) = re->name_entry_size;
+  break;
+
+  case PCRE_INFO_NAMECOUNT:
+  *((int *)where) = re->name_count;
+  break;
+
+  case PCRE_INFO_NAMETABLE:
+  *((const uschar **)where) = (const uschar *)re + re->name_table_offset;
+  break;
+
+  case PCRE_INFO_DEFAULT_TABLES:
+  *((const uschar **)where) = (const uschar *)(_pcre_default_tables);
+  break;
+
+  default: return PCRE_ERROR_BADOPTION;
+  }
+
+return 0;
+}
+
+/* End of pcre_fullinfo.c */
diff -Nurp tin-1.6.2/pcre/pcre_get.c tin-1.8.0/pcre/pcre_get.c
--- tin-1.6.2/pcre/pcre_get.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_get.c	2005-06-28 10:31:26.000000000 +0200
@@ -0,0 +1,352 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains some convenience functions for extracting substrings
+from the subject string after a regex match has succeeded. The original idea
+for these functions came from Scott Wimer. */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+*           Find number for named string         *
+*************************************************/
+
+/* This function is used by the two extraction functions below, as well
+as being generally available.
+
+Arguments:
+  code        the compiled regex
+  stringname  the name whose number is required
+
+Returns:      the number of the named parentheses, or a negative number
+                (PCRE_ERROR_NOSUBSTRING) if not found
+*/
+
+int
+pcre_get_stringnumber(const pcre *code, const char *stringname)
+{
+int rc;
+int entrysize;
+int top, bot;
+uschar *nametable;
+
+if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
+  return rc;
+if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
+
+if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
+  return rc;
+if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
+  return rc;
+
+bot = 0;
+while (top > bot)
+  {
+  int mid = (top + bot) / 2;
+  uschar *entry = nametable + entrysize*mid;
+  int c = strcmp(stringname, (char *)(entry + 2));
+  if (c == 0) return (entry[0] << 8) + entry[1];
+  if (c > 0) bot = mid + 1; else top = mid;
+  }
+
+return PCRE_ERROR_NOSUBSTRING;
+}
+
+
+
+/*************************************************
+*      Copy captured string to given buffer      *
+*************************************************/
+
+/* This function copies a single captured substring into a given buffer.
+Note that we use memcpy() rather than strncpy() in case there are binary zeros
+in the string.
+
+Arguments:
+  subject        the subject string that was matched
+  ovector        pointer to the offsets table
+  stringcount    the number of substrings that were captured
+                   (i.e. the yield of the pcre_exec call, unless
+                   that was zero, in which case it should be 1/3
+                   of the offset table size)
+  stringnumber   the number of the required substring
+  buffer         where to put the substring
+  size           the size of the buffer
+
+Returns:         if successful:
+                   the length of the copied string, not including the zero
+                   that is put on the end; can be zero
+                 if not successful:
+                   PCRE_ERROR_NOMEMORY (-6) buffer too small
+                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
+*/
+
+int
+pcre_copy_substring(const char *subject, int *ovector, int stringcount,
+  int stringnumber, char *buffer, int size)
+{
+int yield;
+if (stringnumber < 0 || stringnumber >= stringcount)
+  return PCRE_ERROR_NOSUBSTRING;
+stringnumber *= 2;
+yield = ovector[stringnumber+1] - ovector[stringnumber];
+if (size < yield + 1) return PCRE_ERROR_NOMEMORY;
+memcpy(buffer, subject + ovector[stringnumber], yield);
+buffer[yield] = 0;
+return yield;
+}
+
+
+
+/*************************************************
+*   Copy named captured string to given buffer   *
+*************************************************/
+
+/* This function copies a single captured substring into a given buffer,
+identifying it by name.
+
+Arguments:
+  code           the compiled regex
+  subject        the subject string that was matched
+  ovector        pointer to the offsets table
+  stringcount    the number of substrings that were captured
+                   (i.e. the yield of the pcre_exec call, unless
+                   that was zero, in which case it should be 1/3
+                   of the offset table size)
+  stringname     the name of the required substring
+  buffer         where to put the substring
+  size           the size of the buffer
+
+Returns:         if successful:
+                   the length of the copied string, not including the zero
+                   that is put on the end; can be zero
+                 if not successful:
+                   PCRE_ERROR_NOMEMORY (-6) buffer too small
+                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
+*/
+
+int
+pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector,
+  int stringcount, const char *stringname, char *buffer, int size)
+{
+int n = pcre_get_stringnumber(code, stringname);
+if (n <= 0) return n;
+return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);
+}
+
+
+
+/*************************************************
+*      Copy all captured strings to new store    *
+*************************************************/
+
+/* This function gets one chunk of store and builds a list of pointers and all
+of the captured substrings in it. A NULL pointer is put on the end of the list.
+
+Arguments:
+  subject        the subject string that was matched
+  ovector        pointer to the offsets table
+  stringcount    the number of substrings that were captured
+                   (i.e. the yield of the pcre_exec call, unless
+                   that was zero, in which case it should be 1/3
+                   of the offset table size)
+  listptr        set to point to the list of pointers
+
+Returns:         if successful: 0
+                 if not successful:
+                   PCRE_ERROR_NOMEMORY (-6) failed to get store
+*/
+
+int
+pcre_get_substring_list(const char *subject, int *ovector, int stringcount,
+  const char ***listptr)
+{
+int i;
+int size = sizeof(char *);
+int double_count = stringcount * 2;
+char **stringlist;
+char *p;
+
+for (i = 0; i < double_count; i += 2)
+  size += sizeof(char *) + ovector[i+1] - ovector[i] + 1;
+
+stringlist = (char **)(pcre_malloc)(size);
+if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
+
+*listptr = (const char **)stringlist;
+p = (char *)(stringlist + stringcount + 1);
+
+for (i = 0; i < double_count; i += 2)
+  {
+  int len = ovector[i+1] - ovector[i];
+  memcpy(p, subject + ovector[i], len);
+  *stringlist++ = p;
+  p += len;
+  *p++ = 0;
+  }
+
+*stringlist = NULL;
+return 0;
+}
+
+
+
+/*************************************************
+*   Free store obtained by get_substring_list    *
+*************************************************/
+
+/* This function exists for the benefit of people calling PCRE from non-C
+programs that can call its functions, but not free() or (pcre_free)() directly.
+
+Argument:   the result of a previous pcre_get_substring_list()
+Returns:    nothing
+*/
+
+void
+pcre_free_substring_list(const char **pointer)
+{
+(pcre_free)((void *)pointer);
+}
+
+
+
+/*************************************************
+*      Copy captured string to new store         *
+*************************************************/
+
+/* This function copies a single captured substring into a piece of new
+store
+
+Arguments:
+  subject        the subject string that was matched
+  ovector        pointer to the offsets table
+  stringcount    the number of substrings that were captured
+                   (i.e. the yield of the pcre_exec call, unless
+                   that was zero, in which case it should be 1/3
+                   of the offset table size)
+  stringnumber   the number of the required substring
+  stringptr      where to put a pointer to the substring
+
+Returns:         if successful:
+                   the length of the string, not including the zero that
+                   is put on the end; can be zero
+                 if not successful:
+                   PCRE_ERROR_NOMEMORY (-6) failed to get store
+                   PCRE_ERROR_NOSUBSTRING (-7) substring not present
+*/
+
+int
+pcre_get_substring(const char *subject, int *ovector, int stringcount,
+  int stringnumber, const char **stringptr)
+{
+int yield;
+char *substring;
+if (stringnumber < 0 || stringnumber >= stringcount)
+  return PCRE_ERROR_NOSUBSTRING;
+stringnumber *= 2;
+yield = ovector[stringnumber+1] - ovector[stringnumber];
+substring = (char *)(pcre_malloc)(yield + 1);
+if (substring == NULL) return PCRE_ERROR_NOMEMORY;
+memcpy(substring, subject + ovector[stringnumber], yield);
+substring[yield] = 0;
+*stringptr = substring;
+return yield;
+}
+
+
+
+/*************************************************
+*   Copy named captured string to new store      *
+*************************************************/
+
+/* This function copies a single captured substring, identified by name, into
+new store.
+
+Arguments:
+  code           the compiled regex
+  subject        the subject string that was matched
+  ovector        pointer to the offsets table
+  stringcount    the number of substrings that were captured
+                   (i.e. the yield of the pcre_exec call, unless
+                   that was zero, in which case it should be 1/3
+                   of the offset table size)
+  stringname     the name of the required substring
+  stringptr      where to put the pointer
+
+Returns:         if successful:
+                   the length of the copied string, not including the zero
+                   that is put on the end; can be zero
+                 if not successful:
+                   PCRE_ERROR_NOMEMORY (-6) couldn't get memory
+                   PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
+*/
+
+int
+pcre_get_named_substring(const pcre *code, const char *subject, int *ovector,
+  int stringcount, const char *stringname, const char **stringptr)
+{
+int n = pcre_get_stringnumber(code, stringname);
+if (n <= 0) return n;
+return pcre_get_substring(subject, ovector, stringcount, n, stringptr);
+}
+
+
+
+
+/*************************************************
+*       Free store obtained by get_substring     *
+*************************************************/
+
+/* This function exists for the benefit of people calling PCRE from non-C
+programs that can call its functions, but not free() or (pcre_free)() directly.
+
+Argument:   the result of a previous pcre_get_substring()
+Returns:    nothing
+*/
+
+void
+pcre_free_substring(const char *pointer)
+{
+(pcre_free)((void *)pointer);
+}
+
+/* End of pcre_get.c */
diff -Nurp tin-1.6.2/pcre/pcre_globals.c tin-1.8.0/pcre/pcre_globals.c
--- tin-1.6.2/pcre/pcre_globals.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_globals.c	2005-06-28 10:31:26.000000000 +0200
@@ -0,0 +1,69 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains global variables that are exported by the PCRE library.
+PCRE is thread-clean and doesn't use any global variables in the normal sense.
+However, it calls memory allocation and freeing functions via the four
+indirections below, and it can optionally do callouts, using the fifth
+indirection. These values can be changed by the caller, but are shared between
+all threads. However, when compiling for Virtual Pascal, things are done
+differently, and global variables are not used (see pcre.in). */
+
+
+#include "pcre_internal.h"
+
+
+#ifndef VPCOMPAT
+#ifdef __cplusplus
+extern "C" void *(*pcre_malloc)(size_t) = malloc;
+extern "C" void  (*pcre_free)(void *) = free;
+extern "C" void *(*pcre_stack_malloc)(size_t) = malloc;
+extern "C" void  (*pcre_stack_free)(void *) = free;
+extern "C" int   (*pcre_callout)(pcre_callout_block *) = NULL;
+#else
+void *(*pcre_malloc)(size_t) = malloc;
+void  (*pcre_free)(void *) = free;
+void *(*pcre_stack_malloc)(size_t) = malloc;
+void  (*pcre_stack_free)(void *) = free;
+int   (*pcre_callout)(pcre_callout_block *) = NULL;
+#endif
+#endif
+
+/* End of pcre_globals.c */
diff -Nurp tin-1.6.2/pcre/pcre_info.c tin-1.8.0/pcre/pcre_info.c
--- tin-1.6.2/pcre/pcre_info.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_info.c	2005-09-12 16:39:03.000000000 +0200
@@ -0,0 +1,89 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_info(), which gives some
+information about a compiled pattern. However, use of this function is now
+deprecated, as it has been superseded by pcre_fullinfo(). */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+* (Obsolete) Return info about compiled pattern  *
+*************************************************/
+
+/* This is the original "info" function. It picks potentially useful data out
+of the private structure, but its interface was too rigid. It remains for
+backwards compatibility. The public options are passed back in an int - though
+the re->options field has been expanded to a long int, all the public options
+at the low end of it, and so even on 16-bit systems this will still be OK.
+Therefore, I haven't changed the API for pcre_info().
+
+Arguments:
+  argument_re   points to compiled code
+  optptr        where to pass back the options
+  first_byte    where to pass back the first character,
+                or -1 if multiline and all branches start ^,
+                or -2 otherwise
+
+Returns:        number of capturing subpatterns
+                or negative values on error
+*/
+
+PCRE_EXPORT int
+pcre_info(const pcre *argument_re, int *optptr, int *first_byte)
+{
+real_pcre internal_re;
+const real_pcre *re = (const real_pcre *)argument_re;
+if (re == NULL) return PCRE_ERROR_NULL;
+if (re->magic_number != MAGIC_NUMBER)
+  {
+  re = _pcre_try_flipped(re, &internal_re, NULL, NULL);
+  if (re == NULL) return PCRE_ERROR_BADMAGIC;
+  }
+if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS);
+if (first_byte != NULL)
+  *first_byte = ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte :
+     ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
+return re->top_bracket;
+}
+
+/* End of pcre_info.c */
diff -Nurp tin-1.6.2/pcre/pcre_internal.h tin-1.8.0/pcre/pcre_internal.h
--- tin-1.6.2/pcre/pcre_internal.h	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_internal.h	2005-09-12 16:39:11.000000000 +0200
@@ -0,0 +1,904 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+/* This header contains definitions that are shared between the different
+modules, but which are not relevant to the exported API. This includes some
+functions whose names all begin with "_pcre_". */
+
+#ifndef PCRE_INTERNAL_H
+#define PCRE_INTERNAL_H
+
+/* Define DEBUG to get debugging output on stdout. */
+
+#if 0
+#define DEBUG
+#endif
+
+/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef
+inline, and there are *still* stupid compilers about that don't like indented
+pre-processor statements, or at least there were when I first wrote this. After
+all, it had only been about 10 years then... */
+
+#ifdef DEBUG
+#define DPRINTF(p) printf p
+#else
+#define DPRINTF(p) /*nothing*/
+#endif
+
+
+/* Get the definitions provided by running "configure" */
+
+#include "config.h"
+
+/* Standard C headers plus the external interface definition. The only time
+setjmp and stdarg are used is when NO_RECURSE is set. */
+
+#include <ctype.h>
+#include <limits.h>
+#include <setjmp.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef PCRE_SPY
+#define PCRE_DEFINITION       /* Win32 __declspec(export) trigger for .dll */
+#endif
+
+/* We need to have types that specify unsigned 16-bit and 32-bit integers. We
+cannot determine these outside the compilation (e.g. by running a program as
+part of "configure") because PCRE is often cross-compiled for use on other
+systems. Instead we make use of the maximum sizes that are available at
+preprocessor time in standard C environments. */
+
+#if USHRT_MAX == 65535
+  typedef unsigned short pcre_uint16;
+#elif UINT_MAX == 65535
+  typedef unsigned int pcre_uint16;
+#else
+  #error Cannot determine a type for 16-bit unsigned integers
+#endif
+
+#if UINT_MAX == 4294967295
+  typedef unsigned int pcre_uint32;
+#elif ULONG_MAX == 4294967295
+  typedef unsigned long int pcre_uint32;
+#else
+  #error Cannot determine a type for 32-bit unsigned integers
+#endif
+
+/* All character handling must be done as unsigned characters. Otherwise there
+are problems with top-bit-set characters and functions such as isspace().
+However, we leave the interface to the outside world as char *, because that
+should make things easier for callers. We define a short type for unsigned char
+to save lots of typing. I tried "uchar", but it causes problems on Digital
+Unix, where it is defined in sys/types, so use "uschar" instead. */
+
+typedef unsigned char uschar;
+
+/* Include the public PCRE header and the definitions of UCP character property
+values. */
+
+#include "pcre.h"
+#include "ucp.h"
+
+/* When compiling for use with the Virtual Pascal compiler, these functions
+need to have their names changed. PCRE must be compiled with the -DVPCOMPAT
+option on the command line. */
+
+#ifdef VPCOMPAT
+#define strncmp(s1,s2,m) _strncmp(s1,s2,m)
+#define memcpy(d,s,n)    _memcpy(d,s,n)
+#define memmove(d,s,n)   _memmove(d,s,n)
+#define memset(s,c,n)    _memset(s,c,n)
+#else  /* VPCOMPAT */
+
+/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(),
+define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY
+is set. Otherwise, include an emulating function for those systems that have
+neither (there some non-Unix environments where this is the case). This assumes
+that all calls to memmove are moving strings upwards in store, which is the
+case in PCRE. */
+
+#if ! HAVE_MEMMOVE
+#undef  memmove        /* some systems may have a macro */
+#if HAVE_BCOPY
+#define memmove(a, b, c) bcopy(b, a, c)
+#else  /* HAVE_BCOPY */
+void *
+pcre_memmove(unsigned char *dest, const unsigned char *src, size_t n)
+{
+int i;
+dest += n;
+src += n;
+for (i = 0; i < n; ++i) *(--dest) =  *(--src);
+}
+#define memmove(a, b, c) pcre_memmove(a, b, c)
+#endif   /* not HAVE_BCOPY */
+#endif   /* not HAVE_MEMMOVE */
+#endif   /* not VPCOMPAT */
+
+
+/* PCRE keeps offsets in its compiled code as 2-byte quantities (always stored
+in big-endian order) by default. These are used, for example, to link from the
+start of a subpattern to its alternatives and its end. The use of 2 bytes per
+offset limits the size of the compiled regex to around 64K, which is big enough
+for almost everybody. However, I received a request for an even bigger limit.
+For this reason, and also to make the code easier to maintain, the storing and
+loading of offsets from the byte string is now handled by the macros that are
+defined here.
+
+The macros are controlled by the value of LINK_SIZE. This defaults to 2 in
+the config.h file, but can be overridden by using -D on the command line. This
+is automated on Unix systems via the "configure" command. */
+
+#if LINK_SIZE == 2
+
+#define PUT(a,n,d)   \
+  (a[n] = (d) >> 8), \
+  (a[(n)+1] = (d) & 255)
+
+#define GET(a,n) \
+  (((a)[n] << 8) | (a)[(n)+1])
+
+#define MAX_PATTERN_SIZE (1 << 16)
+
+
+#elif LINK_SIZE == 3
+
+#define PUT(a,n,d)       \
+  (a[n] = (d) >> 16),    \
+  (a[(n)+1] = (d) >> 8), \
+  (a[(n)+2] = (d) & 255)
+
+#define GET(a,n) \
+  (((a)[n] << 16) | ((a)[(n)+1] << 8) | (a)[(n)+2])
+
+#define MAX_PATTERN_SIZE (1 << 24)
+
+
+#elif LINK_SIZE == 4
+
+#define PUT(a,n,d)        \
+  (a[n] = (d) >> 24),     \
+  (a[(n)+1] = (d) >> 16), \
+  (a[(n)+2] = (d) >> 8),  \
+  (a[(n)+3] = (d) & 255)
+
+#define GET(a,n) \
+  (((a)[n] << 24) | ((a)[(n)+1] << 16) | ((a)[(n)+2] << 8) | (a)[(n)+3])
+
+#define MAX_PATTERN_SIZE (1 << 30)   /* Keep it positive */
+
+
+#else
+#error LINK_SIZE must be either 2, 3, or 4
+#endif
+
+
+/* Convenience macro defined in terms of the others */
+
+#define PUTINC(a,n,d)   PUT(a,n,d), a += LINK_SIZE
+
+
+/* PCRE uses some other 2-byte quantities that do not change when the size of
+offsets changes. There are used for repeat counts and for other things such as
+capturing parenthesis numbers in back references. */
+
+#define PUT2(a,n,d)   \
+  a[n] = (d) >> 8; \
+  a[(n)+1] = (d) & 255
+
+#define GET2(a,n) \
+  (((a)[n] << 8) | (a)[(n)+1])
+
+#define PUT2INC(a,n,d)  PUT2(a,n,d), a += 2
+
+
+/* When UTF-8 encoding is being used, a character is no longer just a single
+byte. The macros for character handling generate simple sequences when used in
+byte-mode, and more complicated ones for UTF-8 characters. */
+
+#ifndef SUPPORT_UTF8
+#define GETCHAR(c, eptr) c = *eptr;
+#define GETCHARTEST(c, eptr) c = *eptr;
+#define GETCHARINC(c, eptr) c = *eptr++;
+#define GETCHARINCTEST(c, eptr) c = *eptr++;
+#define GETCHARLEN(c, eptr, len) c = *eptr;
+#define BACKCHAR(eptr)
+
+#else   /* SUPPORT_UTF8 */
+
+/* Get the next UTF-8 character, not advancing the pointer. This is called when
+we know we are in UTF-8 mode. */
+
+#define GETCHAR(c, eptr) \
+  c = *eptr; \
+  if ((c & 0xc0) == 0xc0) \
+    { \
+    int gcii; \
+    int gcaa = _pcre_utf8_table4[c & 0x3f];  /* Number of additional bytes */ \
+    int gcss = 6*gcaa; \
+    c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
+    for (gcii = 1; gcii <= gcaa; gcii++) \
+      { \
+      gcss -= 6; \
+      c |= (eptr[gcii] & 0x3f) << gcss; \
+      } \
+    }
+
+/* Get the next UTF-8 character, testing for UTF-8 mode, and not advancing the
+pointer. */
+
+#define GETCHARTEST(c, eptr) \
+  c = *eptr; \
+  if (utf8 && (c & 0xc0) == 0xc0) \
+    { \
+    int gcii; \
+    int gcaa = _pcre_utf8_table4[c & 0x3f];  /* Number of additional bytes */ \
+    int gcss = 6*gcaa; \
+    c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
+    for (gcii = 1; gcii <= gcaa; gcii++) \
+      { \
+      gcss -= 6; \
+      c |= (eptr[gcii] & 0x3f) << gcss; \
+      } \
+    }
+
+/* Get the next UTF-8 character, advancing the pointer. This is called when we
+know we are in UTF-8 mode. */
+
+#define GETCHARINC(c, eptr) \
+  c = *eptr++; \
+  if ((c & 0xc0) == 0xc0) \
+    { \
+    int gcaa = _pcre_utf8_table4[c & 0x3f];  /* Number of additional bytes */ \
+    int gcss = 6*gcaa; \
+    c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
+    while (gcaa-- > 0) \
+      { \
+      gcss -= 6; \
+      c |= (*eptr++ & 0x3f) << gcss; \
+      } \
+    }
+
+/* Get the next character, testing for UTF-8 mode, and advancing the pointer */
+
+#define GETCHARINCTEST(c, eptr) \
+  c = *eptr++; \
+  if (utf8 && (c & 0xc0) == 0xc0) \
+    { \
+    int gcaa = _pcre_utf8_table4[c & 0x3f];  /* Number of additional bytes */ \
+    int gcss = 6*gcaa; \
+    c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
+    while (gcaa-- > 0) \
+      { \
+      gcss -= 6; \
+      c |= (*eptr++ & 0x3f) << gcss; \
+      } \
+    }
+
+/* Get the next UTF-8 character, not advancing the pointer, incrementing length
+if there are extra bytes. This is called when we know we are in UTF-8 mode. */
+
+#define GETCHARLEN(c, eptr, len) \
+  c = *eptr; \
+  if ((c & 0xc0) == 0xc0) \
+    { \
+    int gcii; \
+    int gcaa = _pcre_utf8_table4[c & 0x3f];  /* Number of additional bytes */ \
+    int gcss = 6*gcaa; \
+    c = (c & _pcre_utf8_table3[gcaa]) << gcss; \
+    for (gcii = 1; gcii <= gcaa; gcii++) \
+      { \
+      gcss -= 6; \
+      c |= (eptr[gcii] & 0x3f) << gcss; \
+      } \
+    len += gcaa; \
+    }
+
+/* If the pointer is not at the start of a character, move it back until
+it is. Called only in UTF-8 mode. */
+
+#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--;
+
+#endif
+
+
+/* In case there is no definition of offsetof() provided - though any proper
+Standard C system should have one. */
+
+#ifndef offsetof
+#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field))
+#endif
+
+
+/* These are the public options that can change during matching. */
+
+#define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL)
+
+/* Private options flags start at the most significant end of the four bytes,
+but skip the top bit so we can use ints for convenience without getting tangled
+with negative values. The public options defined in pcre.h start at the least
+significant end. Make sure they don't overlap! */
+
+#define PCRE_FIRSTSET      0x40000000  /* first_byte is set */
+#define PCRE_REQCHSET      0x20000000  /* req_byte is set */
+#define PCRE_STARTLINE     0x10000000  /* start after \n for multiline */
+#define PCRE_ICHANGED      0x08000000  /* i option changes within regex */
+#define PCRE_NOPARTIAL     0x04000000  /* can't use partial with this regex */
+
+/* Options for the "extra" block produced by pcre_study(). */
+
+#define PCRE_STUDY_MAPPED   0x01     /* a map of starting chars exists */
+
+/* Masks for identifying the public options that are permitted at compile
+time, run time, or study time, respectively. */
+
+#define PUBLIC_OPTIONS \
+  (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \
+   PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \
+   PCRE_NO_AUTO_CAPTURE|PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT|PCRE_FIRSTLINE)
+
+#define PUBLIC_EXEC_OPTIONS \
+  (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \
+   PCRE_PARTIAL)
+
+#define PUBLIC_DFA_EXEC_OPTIONS \
+  (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \
+   PCRE_PARTIAL|PCRE_DFA_SHORTEST|PCRE_DFA_RESTART)
+
+#define PUBLIC_STUDY_OPTIONS 0   /* None defined */
+
+/* Magic number to provide a small check against being handed junk. Also used
+to detect whether a pattern was compiled on a host of different endianness. */
+
+#define MAGIC_NUMBER  0x50435245UL   /* 'PCRE' */
+
+/* Negative values for the firstchar and reqchar variables */
+
+#define REQ_UNSET (-2)
+#define REQ_NONE  (-1)
+
+/* The maximum remaining length of subject we are prepared to search for a
+req_byte match. */
+
+#define REQ_BYTE_MAX 1000
+
+/* Flags added to firstbyte or reqbyte; a "non-literal" item is either a
+variable-length repeat, or a anything other than literal characters. */
+
+#define REQ_CASELESS 0x0100    /* indicates caselessness */
+#define REQ_VARY     0x0200    /* reqbyte followed non-literal item */
+
+/* Miscellaneous definitions */
+
+typedef int BOOL;
+
+#define FALSE   0
+#define TRUE    1
+
+/* Escape items that are just an encoding of a particular data value. Note that
+ESC_n is defined as yet another macro, which is set in config.h to either \n
+(the default) or \r (which some people want). */
+
+#ifndef ESC_e
+#define ESC_e 27
+#endif
+
+#ifndef ESC_f
+#define ESC_f '\f'
+#endif
+
+#ifndef ESC_n
+#define ESC_n NEWLINE
+#endif
+
+#ifndef ESC_r
+#define ESC_r '\r'
+#endif
+
+/* We can't officially use ESC_t because it is a POSIX reserved identifier
+(presumably because of all the others like size_t). */
+
+#ifndef ESC_tee
+#define ESC_tee '\t'
+#endif
+
+/* These are escaped items that aren't just an encoding of a particular data
+value such as \n. They must have non-zero values, as check_escape() returns
+their negation. Also, they must appear in the same order as in the opcode
+definitions below, up to ESC_z. There's a dummy for OP_ANY because it
+corresponds to "." rather than an escape sequence. The final one must be
+ESC_REF as subsequent values are used for \1, \2, \3, etc. There is are two
+tests in the code for an escape greater than ESC_b and less than ESC_Z to
+detect the types that may be repeated. These are the types that consume
+characters. If any new escapes are put in between that don't consume a
+character, that code will have to change. */
+
+enum { ESC_A = 1, ESC_G, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W,
+       ESC_w, ESC_dum1, ESC_C, ESC_P, ESC_p, ESC_X, ESC_Z, ESC_z, ESC_E,
+       ESC_Q, ESC_REF };
+
+/* Flag bits and data types for the extended class (OP_XCLASS) for classes that
+contain UTF-8 characters with values greater than 255. */
+
+#define XCL_NOT    0x01    /* Flag: this is a negative class */
+#define XCL_MAP    0x02    /* Flag: a 32-byte map is present */
+
+#define XCL_END       0    /* Marks end of individual items */
+#define XCL_SINGLE    1    /* Single item (one multibyte char) follows */
+#define XCL_RANGE     2    /* A range (two multibyte chars) follows */
+#define XCL_PROP      3    /* Unicode property (one property code) follows */
+#define XCL_NOTPROP   4    /* Unicode inverted property (ditto) */
+
+
+/* Opcode table: OP_BRA must be last, as all values >= it are used for brackets
+that extract substrings. Starting from 1 (i.e. after OP_END), the values up to
+OP_EOD must correspond in order to the list of escapes immediately above.
+Note that whenever this list is updated, the two macro definitions that follow
+must also be updated to match. */
+
+enum {
+  OP_END,            /* 0 End of pattern */
+
+  /* Values corresponding to backslashed metacharacters */
+
+  OP_SOD,            /* 1 Start of data: \A */
+  OP_SOM,            /* 2 Start of match (subject + offset): \G */
+  OP_NOT_WORD_BOUNDARY,  /*  3 \B */
+  OP_WORD_BOUNDARY,      /*  4 \b */
+  OP_NOT_DIGIT,          /*  5 \D */
+  OP_DIGIT,              /*  6 \d */
+  OP_NOT_WHITESPACE,     /*  7 \S */
+  OP_WHITESPACE,         /*  8 \s */
+  OP_NOT_WORDCHAR,       /*  9 \W */
+  OP_WORDCHAR,           /* 10 \w */
+  OP_ANY,            /* 11 Match any character */
+  OP_ANYBYTE,        /* 12 Match any byte (\C); different to OP_ANY for UTF-8 */
+  OP_NOTPROP,        /* 13 \P (not Unicode property) */
+  OP_PROP,           /* 14 \p (Unicode property) */
+  OP_EXTUNI,         /* 15 \X (extended Unicode sequence */
+  OP_EODN,           /* 16 End of data or \n at end of data: \Z. */
+  OP_EOD,            /* 17 End of data: \z */
+
+  OP_OPT,            /* 18 Set runtime options */
+  OP_CIRC,           /* 19 Start of line - varies with multiline switch */
+  OP_DOLL,           /* 20 End of line - varies with multiline switch */
+  OP_CHAR,           /* 21 Match one character, casefully */
+  OP_CHARNC,         /* 22 Match one character, caselessly */
+  OP_NOT,            /* 23 Match anything but the following char */
+
+  OP_STAR,           /* 24 The maximizing and minimizing versions of */
+  OP_MINSTAR,        /* 25 all these opcodes must come in pairs, with */
+  OP_PLUS,           /* 26 the minimizing one second. */
+  OP_MINPLUS,        /* 27 This first set applies to single characters */
+  OP_QUERY,          /* 28 */
+  OP_MINQUERY,       /* 29 */
+  OP_UPTO,           /* 30 From 0 to n matches */
+  OP_MINUPTO,        /* 31 */
+  OP_EXACT,          /* 32 Exactly n matches */
+
+  OP_NOTSTAR,        /* 33 The maximizing and minimizing versions of */
+  OP_NOTMINSTAR,     /* 34 all these opcodes must come in pairs, with */
+  OP_NOTPLUS,        /* 35 the minimizing one second. */
+  OP_NOTMINPLUS,     /* 36 This set applies to "not" single characters */
+  OP_NOTQUERY,       /* 37 */
+  OP_NOTMINQUERY,    /* 38 */
+  OP_NOTUPTO,        /* 39 From 0 to n matches */
+  OP_NOTMINUPTO,     /* 40 */
+  OP_NOTEXACT,       /* 41 Exactly n matches */
+
+  OP_TYPESTAR,       /* 42 The maximizing and minimizing versions of */
+  OP_TYPEMINSTAR,    /* 43 all these opcodes must come in pairs, with */
+  OP_TYPEPLUS,       /* 44 the minimizing one second. These codes must */
+  OP_TYPEMINPLUS,    /* 45 be in exactly the same order as those above. */
+  OP_TYPEQUERY,      /* 46 This set applies to character types such as \d */
+  OP_TYPEMINQUERY,   /* 47 */
+  OP_TYPEUPTO,       /* 48 From 0 to n matches */
+  OP_TYPEMINUPTO,    /* 49 */
+  OP_TYPEEXACT,      /* 50 Exactly n matches */
+
+  OP_CRSTAR,         /* 51 The maximizing and minimizing versions of */
+  OP_CRMINSTAR,      /* 52 all these opcodes must come in pairs, with */
+  OP_CRPLUS,         /* 53 the minimizing one second. These codes must */
+  OP_CRMINPLUS,      /* 54 be in exactly the same order as those above. */
+  OP_CRQUERY,        /* 55 These are for character classes and back refs */
+  OP_CRMINQUERY,     /* 56 */
+  OP_CRRANGE,        /* 57 These are different to the three sets above. */
+  OP_CRMINRANGE,     /* 58 */
+
+  OP_CLASS,          /* 59 Match a character class, chars < 256 only */
+  OP_NCLASS,         /* 60 Same, but the bitmap was created from a negative
+                           class - the difference is relevant only when a UTF-8
+                           character > 255 is encountered. */
+
+  OP_XCLASS,         /* 61 Extended class for handling UTF-8 chars within the
+                           class. This does both positive and negative. */
+
+  OP_REF,            /* 62 Match a back reference */
+  OP_RECURSE,        /* 63 Match a numbered subpattern (possibly recursive) */
+  OP_CALLOUT,        /* 64 Call out to external function if provided */
+
+  OP_ALT,            /* 65 Start of alternation */
+  OP_KET,            /* 66 End of group that doesn't have an unbounded repeat */
+  OP_KETRMAX,        /* 67 These two must remain together and in this */
+  OP_KETRMIN,        /* 68 order. They are for groups the repeat for ever. */
+
+  /* The assertions must come before ONCE and COND */
+
+  OP_ASSERT,         /* 69 Positive lookahead */
+  OP_ASSERT_NOT,     /* 70 Negative lookahead */
+  OP_ASSERTBACK,     /* 71 Positive lookbehind */
+  OP_ASSERTBACK_NOT, /* 72 Negative lookbehind */
+  OP_REVERSE,        /* 73 Move pointer back - used in lookbehind assertions */
+
+  /* ONCE and COND must come after the assertions, with ONCE first, as there's
+  a test for >= ONCE for a subpattern that isn't an assertion. */
+
+  OP_ONCE,           /* 74 Once matched, don't back up into the subpattern */
+  OP_COND,           /* 75 Conditional group */
+  OP_CREF,           /* 76 Used to hold an extraction string number (cond ref) */
+
+  OP_BRAZERO,        /* 77 These two must remain together and in this */
+  OP_BRAMINZERO,     /* 78 order. */
+
+  OP_BRANUMBER,      /* 79 Used for extracting brackets whose number is greater
+                           than can fit into an opcode. */
+
+  OP_BRA             /* 80 This and greater values are used for brackets that
+                           extract substrings up to EXTRACT_BASIC_MAX. After
+                           that, use is made of OP_BRANUMBER. */
+};
+
+/* WARNING WARNING WARNING: There is an implicit assumption in pcre.c and
+study.c that all opcodes are less than 128 in value. This makes handling UTF-8
+character sequences easier. */
+
+/* The highest extraction number before we have to start using additional
+bytes. (Originally PCRE didn't have support for extraction counts highter than
+this number.) The value is limited by the number of opcodes left after OP_BRA,
+i.e. 255 - OP_BRA. We actually set it a bit lower to leave room for additional
+opcodes. */
+
+#define EXTRACT_BASIC_MAX  100
+
+
+/* This macro defines textual names for all the opcodes. These are used only
+for debugging. The macro is referenced only in pcre_printint.c. */
+
+#define OP_NAME_LIST \
+  "End", "\\A", "\\G", "\\B", "\\b", "\\D", "\\d",                \
+  "\\S", "\\s", "\\W", "\\w", "Any", "Anybyte",                   \
+  "notprop", "prop", "extuni",                                    \
+  "\\Z", "\\z",                                                   \
+  "Opt", "^", "$", "char", "charnc", "not",                       \
+  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",                 \
+  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",                 \
+  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",                 \
+  "*", "*?", "+", "+?", "?", "??", "{", "{",                      \
+  "class", "nclass", "xclass", "Ref", "Recurse", "Callout",       \
+  "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not",     \
+  "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cond ref",\
+  "Brazero", "Braminzero", "Branumber", "Bra"
+
+
+/* This macro defines the length of fixed length operations in the compiled
+regex. The lengths are used when searching for specific things, and also in the
+debugging printing of a compiled regex. We use a macro so that it can be
+defined close to the definitions of the opcodes themselves.
+
+As things have been extended, some of these are no longer fixed lenths, but are
+minima instead. For example, the length of a single-character repeat may vary
+in UTF-8 mode. The code that uses this table must know about such things. */
+
+#define OP_LENGTHS \
+  1,                             /* End                                    */ \
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  /* \A, \G, \B, \B, \D, \d, \S, \s, \W, \w */ \
+  1, 1,                          /* Any, Anybyte                           */ \
+  2, 2, 1,                       /* NOTPROP, PROP, EXTUNI                  */ \
+  1, 1, 2, 1, 1,                 /* \Z, \z, Opt, ^, $                      */ \
+  2,                             /* Char  - the minimum length             */ \
+  2,                             /* Charnc  - the minimum length           */ \
+  2,                             /* not                                    */ \
+  /* Positive single-char repeats                            ** These are  */ \
+  2, 2, 2, 2, 2, 2,              /* *, *?, +, +?, ?, ??      ** minima in  */ \
+  4, 4, 4,                       /* upto, minupto, exact     ** UTF-8 mode */ \
+  /* Negative single-char repeats - only for chars < 256                   */ \
+  2, 2, 2, 2, 2, 2,              /* NOT *, *?, +, +?, ?, ??                */ \
+  4, 4, 4,                       /* NOT upto, minupto, exact               */ \
+  /* Positive type repeats                                                 */ \
+  2, 2, 2, 2, 2, 2,              /* Type *, *?, +, +?, ?, ??               */ \
+  4, 4, 4,                       /* Type upto, minupto, exact              */ \
+  /* Character class & ref repeats                                         */ \
+  1, 1, 1, 1, 1, 1,              /* *, *?, +, +?, ?, ??                    */ \
+  5, 5,                          /* CRRANGE, CRMINRANGE                    */ \
+ 33,                             /* CLASS                                  */ \
+ 33,                             /* NCLASS                                 */ \
+  0,                             /* XCLASS - variable length               */ \
+  3,                             /* REF                                    */ \
+  1+LINK_SIZE,                   /* RECURSE                                */ \
+  2+2*LINK_SIZE,                 /* CALLOUT                                */ \
+  1+LINK_SIZE,                   /* Alt                                    */ \
+  1+LINK_SIZE,                   /* Ket                                    */ \
+  1+LINK_SIZE,                   /* KetRmax                                */ \
+  1+LINK_SIZE,                   /* KetRmin                                */ \
+  1+LINK_SIZE,                   /* Assert                                 */ \
+  1+LINK_SIZE,                   /* Assert not                             */ \
+  1+LINK_SIZE,                   /* Assert behind                          */ \
+  1+LINK_SIZE,                   /* Assert behind not                      */ \
+  1+LINK_SIZE,                   /* Reverse                                */ \
+  1+LINK_SIZE,                   /* Once                                   */ \
+  1+LINK_SIZE,                   /* COND                                   */ \
+  3,                             /* CREF                                   */ \
+  1, 1,                          /* BRAZERO, BRAMINZERO                    */ \
+  3,                             /* BRANUMBER                              */ \
+  1+LINK_SIZE                    /* BRA                                    */ \
+
+
+/* A magic value for OP_CREF to indicate the "in recursion" condition. */
+
+#define CREF_RECURSE  0xffff
+
+/* Error code numbers. They are given names so that they can more easily be
+tracked. */
+
+enum { ERR0,  ERR1,  ERR2,  ERR3,  ERR4,  ERR5,  ERR6,  ERR7,  ERR8,  ERR9,
+       ERR10, ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19,
+       ERR20, ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR28, ERR29,
+       ERR30, ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39,
+       ERR40, ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47 };
+
+/* The real format of the start of the pcre block; the index of names and the
+code vector run on as long as necessary after the end. We store an explicit
+offset to the name table so that if a regex is compiled on one host, saved, and
+then run on another where the size of pointers is different, all might still
+be well. For the case of compiled-on-4 and run-on-8, we include an extra
+pointer that is always NULL. For future-proofing, a few dummy fields were
+originally included - even though you can never get this planning right - but
+there is only one left now.
+
+NOTE NOTE NOTE:
+Because people can now save and re-use compiled patterns, any additions to this
+structure should be made at the end, and something earlier (e.g. a new
+flag in the options or one of the dummy fields) should indicate that the new
+fields are present. Currently PCRE always sets the dummy fields to zero.
+NOTE NOTE NOTE:
+*/
+
+typedef struct real_pcre {
+  pcre_uint32 magic_number;
+  pcre_uint32 size;               /* Total that was malloced */
+  pcre_uint32 options;
+  pcre_uint32 dummy1;             /* For future use, maybe */
+
+  pcre_uint16 top_bracket;
+  pcre_uint16 top_backref;
+  pcre_uint16 first_byte;
+  pcre_uint16 req_byte;
+  pcre_uint16 name_table_offset;  /* Offset to name table that follows */
+  pcre_uint16 name_entry_size;    /* Size of any name items */
+  pcre_uint16 name_count;         /* Number of name items */
+  pcre_uint16 ref_count;          /* Reference count */
+
+  const unsigned char *tables;    /* Pointer to tables or NULL for std */
+  const unsigned char *nullpad;   /* NULL padding */
+} real_pcre;
+
+/* The format of the block used to store data from pcre_study(). The same
+remark (see NOTE above) about extending this structure applies. */
+
+typedef struct pcre_study_data {
+  pcre_uint32 size;               /* Total that was malloced */
+  pcre_uint32 options;
+  uschar start_bits[32];
+} pcre_study_data;
+
+/* Structure for passing "static" information around between the functions
+doing the compiling, so that they are thread-safe. */
+
+typedef struct compile_data {
+  const uschar *lcc;            /* Points to lower casing table */
+  const uschar *fcc;            /* Points to case-flipping table */
+  const uschar *cbits;          /* Points to character type table */
+  const uschar *ctypes;         /* Points to table of type maps */
+  const uschar *start_code;     /* The start of the compiled code */
+  const uschar *start_pattern;  /* The start of the pattern */
+  uschar *name_table;           /* The name/number table */
+  int  names_found;             /* Number of entries so far */
+  int  name_entry_size;         /* Size of each entry */
+  int  top_backref;             /* Maximum back reference */
+  unsigned int backref_map;     /* Bitmap of low back refs */
+  int  req_varyopt;             /* "After variable item" flag for reqbyte */
+  BOOL nopartial;               /* Set TRUE if partial won't work */
+} compile_data;
+
+/* Structure for maintaining a chain of pointers to the currently incomplete
+branches, for testing for left recursion. */
+
+typedef struct branch_chain {
+  struct branch_chain *outer;
+  uschar *current;
+} branch_chain;
+
+/* Structure for items in a linked list that represents an explicit recursive
+call within the pattern. */
+
+typedef struct recursion_info {
+  struct recursion_info *prevrec; /* Previous recursion record (or NULL) */
+  int group_num;                /* Number of group that was called */
+  const uschar *after_call;     /* "Return value": points after the call in the expr */
+  const uschar *save_start;     /* Old value of md->start_match */
+  int *offset_save;             /* Pointer to start of saved offsets */
+  int saved_max;                /* Number of saved offsets */
+} recursion_info;
+
+/* When compiling in a mode that doesn't use recursive calls to match(),
+a structure is used to remember local variables on the heap. It is defined in
+pcre.c, close to the match() function, so that it is easy to keep it in step
+with any changes of local variable. However, the pointer to the current frame
+must be saved in some "static" place over a longjmp(). We declare the
+structure here so that we can put a pointer in the match_data structure.
+NOTE: This isn't used for a "normal" compilation of pcre. */
+
+struct heapframe;
+
+/* Structure for passing "static" information around between the functions
+doing traditional NFA matching, so that they are thread-safe. */
+
+typedef struct match_data {
+  unsigned long int match_call_count; /* As it says */
+  unsigned long int match_limit;/* As it says */
+  int   *offset_vector;         /* Offset vector */
+  int    offset_end;            /* One past the end */
+  int    offset_max;            /* The maximum usable for return data */
+  const uschar *lcc;            /* Points to lower casing table */
+  const uschar *ctypes;         /* Points to table of type maps */
+  BOOL   offset_overflow;       /* Set if too many extractions */
+  BOOL   notbol;                /* NOTBOL flag */
+  BOOL   noteol;                /* NOTEOL flag */
+  BOOL   utf8;                  /* UTF8 flag */
+  BOOL   endonly;               /* Dollar not before final \n */
+  BOOL   notempty;              /* Empty string match not wanted */
+  BOOL   partial;               /* PARTIAL flag */
+  BOOL   hitend;                /* Hit the end of the subject at some point */
+  const uschar *start_code;     /* For use when recursing */
+  const uschar *start_subject;  /* Start of the subject string */
+  const uschar *end_subject;    /* End of the subject string */
+  const uschar *start_match;    /* Start of this match attempt */
+  const uschar *end_match_ptr;  /* Subject position at end match */
+  int    end_offset_top;        /* Highwater mark at end of match */
+  int    capture_last;          /* Most recent capture number */
+  int    start_offset;          /* The start offset value */
+  recursion_info *recursive;    /* Linked list of recursion data */
+  void  *callout_data;          /* To pass back to callouts */
+  struct heapframe *thisframe;  /* Used only when compiling for no recursion */
+} match_data;
+
+/* A similar structure is used for the same purpose by the DFA matching
+functions. */
+
+typedef struct dfa_match_data {
+  const uschar *start_code;     /* Start of the compiled pattern */
+  const uschar *start_subject;  /* Start of the subject string */
+  const uschar *end_subject;    /* End of subject string */
+  const uschar *tables;         /* Character tables */
+  int   moptions;               /* Match options */
+  int   poptions;               /* Pattern options */
+  void  *callout_data;          /* To pass back to callouts */
+} dfa_match_data;
+
+/* Bit definitions for entries in the pcre_ctypes table. */
+
+#define ctype_space   0x01
+#define ctype_letter  0x02
+#define ctype_digit   0x04
+#define ctype_xdigit  0x08
+#define ctype_word    0x10   /* alphameric or '_' */
+#define ctype_meta    0x80   /* regexp meta char or zero (end pattern) */
+
+/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set
+of bits for a class map. Some classes are built by combining these tables. */
+
+#define cbit_space     0      /* [:space:] or \s */
+#define cbit_xdigit   32      /* [:xdigit:] */
+#define cbit_digit    64      /* [:digit:] or \d */
+#define cbit_upper    96      /* [:upper:] */
+#define cbit_lower   128      /* [:lower:] */
+#define cbit_word    160      /* [:word:] or \w */
+#define cbit_graph   192      /* [:graph:] */
+#define cbit_print   224      /* [:print:] */
+#define cbit_punct   256      /* [:punct:] */
+#define cbit_cntrl   288      /* [:cntrl:] */
+#define cbit_length  320      /* Length of the cbits table */
+
+/* Offsets of the various tables from the base tables pointer, and
+total length. */
+
+#define lcc_offset      0
+#define fcc_offset    256
+#define cbits_offset  512
+#define ctypes_offset (cbits_offset + cbit_length)
+#define tables_length (ctypes_offset + 256)
+
+/* Layout of the UCP type table that translates property names into codes for
+pcre_ucp_findchar(). */
+
+typedef struct {
+  const char *name;
+  int value;
+} ucp_type_table;
+
+
+/* Internal shared data tables. These are tables that are used by more than one
+of the exported public functions. They have to be "external" in the C sense,
+but are not part of the PCRE public API. The data for these tables is in the
+pcre_tables.c module. */
+
+extern const int    _pcre_utf8_table1[];
+extern const int    _pcre_utf8_table2[];
+extern const int    _pcre_utf8_table3[];
+extern const uschar _pcre_utf8_table4[];
+
+extern const int    _pcre_utf8_table1_size;
+
+extern const ucp_type_table _pcre_utt[];
+extern const int _pcre_utt_size;
+
+extern const uschar _pcre_default_tables[];
+
+extern const uschar _pcre_OP_lengths[];
+
+
+/* Internal shared functions. These are functions that are used by more than
+one of the exported public functions. They have to be "external" in the C
+sense, but are not part of the PCRE public API. */
+
+extern int         _pcre_ord2utf8(int, uschar *);
+extern real_pcre * _pcre_try_flipped(const real_pcre *, real_pcre *,
+                     const pcre_study_data *, pcre_study_data *);
+extern int         _pcre_ucp_findchar(const int, int *, int *);
+extern int         _pcre_valid_utf8(const uschar *, int);
+extern BOOL        _pcre_xclass(int, const uschar *);
+
+#endif
+
+/* End of pcre_internal.h */
diff -Nurp tin-1.6.2/pcre/pcre_maketables.c tin-1.8.0/pcre/pcre_maketables.c
--- tin-1.6.2/pcre/pcre_maketables.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_maketables.c	2005-06-28 10:31:26.000000000 +0200
@@ -0,0 +1,145 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_maketables(), which builds
+character tables for PCRE in the current locale. The file is compiled on its
+own as part of the PCRE library. However, it is also included in the
+compilation of dftables.c, in which case the macro DFTABLES is defined. */
+
+
+#ifndef DFTABLES
+#include "pcre_internal.h"
+#endif
+
+
+/*************************************************
+*           Create PCRE character tables         *
+*************************************************/
+
+/* This function builds a set of character tables for use by PCRE and returns
+a pointer to them. They are build using the ctype functions, and consequently
+their contents will depend upon the current locale setting. When compiled as
+part of the library, the store is obtained via pcre_malloc(), but when compiled
+inside dftables, use malloc().
+
+Arguments:   none
+Returns:     pointer to the contiguous block of data
+*/
+
+const unsigned char *
+pcre_maketables(void)
+{
+unsigned char *yield, *p;
+int i;
+
+#ifndef DFTABLES
+yield = (unsigned char*)(pcre_malloc)(tables_length);
+#else
+yield = (unsigned char*)malloc(tables_length);
+#endif
+
+if (yield == NULL) return NULL;
+p = yield;
+
+/* First comes the lower casing table */
+
+for (i = 0; i < 256; i++) *p++ = tolower(i);
+
+/* Next the case-flipping table */
+
+for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i);
+
+/* Then the character class tables. Don't try to be clever and save effort
+on exclusive ones - in some locales things may be different. Note that the
+table for "space" includes everything "isspace" gives, including VT in the
+default locale. This makes it work for the POSIX class [:space:]. */
+
+memset(p, 0, cbit_length);
+for (i = 0; i < 256; i++)
+  {
+  if (isdigit(i))
+    {
+    p[cbit_digit  + i/8] |= 1 << (i&7);
+    p[cbit_word   + i/8] |= 1 << (i&7);
+    }
+  if (isupper(i))
+    {
+    p[cbit_upper  + i/8] |= 1 << (i&7);
+    p[cbit_word   + i/8] |= 1 << (i&7);
+    }
+  if (islower(i))
+    {
+    p[cbit_lower  + i/8] |= 1 << (i&7);
+    p[cbit_word   + i/8] |= 1 << (i&7);
+    }
+  if (i == '_')   p[cbit_word   + i/8] |= 1 << (i&7);
+  if (isspace(i)) p[cbit_space  + i/8] |= 1 << (i&7);
+  if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7);
+  if (isgraph(i)) p[cbit_graph  + i/8] |= 1 << (i&7);
+  if (isprint(i)) p[cbit_print  + i/8] |= 1 << (i&7);
+  if (ispunct(i)) p[cbit_punct  + i/8] |= 1 << (i&7);
+  if (iscntrl(i)) p[cbit_cntrl  + i/8] |= 1 << (i&7);
+  }
+p += cbit_length;
+
+/* Finally, the character type table. In this, we exclude VT from the white
+space chars, because Perl doesn't recognize it as such for \s and for comments
+within regexes. */
+
+for (i = 0; i < 256; i++)
+  {
+  int x = 0;
+  if (i != 0x0b && isspace(i)) x += ctype_space;
+  if (isalpha(i)) x += ctype_letter;
+  if (isdigit(i)) x += ctype_digit;
+  if (isxdigit(i)) x += ctype_xdigit;
+  if (isalnum(i) || i == '_') x += ctype_word;
+
+  /* Note: strchr includes the terminating zero in the characters it considers.
+  In this instance, that is ok because we want binary zero to be flagged as a
+  meta-character, which in this sense is any character that terminates a run
+  of data characters. */
+
+  if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta; *p++ = x; }
+
+return yield;
+}
+
+/* End of pcre_maketables.c */
diff -Nurp tin-1.6.2/pcre/pcre_ord2utf8.c tin-1.8.0/pcre/pcre_ord2utf8.c
--- tin-1.6.2/pcre/pcre_ord2utf8.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_ord2utf8.c	2005-09-12 16:39:20.000000000 +0200
@@ -0,0 +1,78 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This file contains a private PCRE function that converts an ordinal
+character value into a UTF8 string. */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+*       Convert character value to UTF-8         *
+*************************************************/
+
+/* This function takes an integer value in the range 0 - 0x7fffffff
+and encodes it as a UTF-8 character in 0 to 6 bytes.
+
+Arguments:
+  cvalue     the character value
+  buffer     pointer to buffer for result - at least 6 bytes long
+
+Returns:     number of characters placed in the buffer
+*/
+
+PCRE_EXPORT int
+_pcre_ord2utf8(int cvalue, uschar *buffer)
+{
+register int i, j;
+for (i = 0; i < _pcre_utf8_table1_size; i++)
+  if (cvalue <= _pcre_utf8_table1[i]) break;
+buffer += i;
+for (j = i; j > 0; j--)
+ {
+ *buffer-- = 0x80 | (cvalue & 0x3f);
+ cvalue >>= 6;
+ }
+*buffer = _pcre_utf8_table2[i] | cvalue;
+return i + 1;
+}
+
+/* End of pcre_ord2utf8.c */
diff -Nurp tin-1.6.2/pcre/pcre_printint.src tin-1.8.0/pcre/pcre_printint.src
--- tin-1.6.2/pcre/pcre_printint.src	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_printint.src	2005-09-12 16:40:01.000000000 +0200
@@ -0,0 +1,454 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains a PCRE private debugging function for printing out the
+internal form of a compiled regular expression, along with some supporting
+local functions. This source file is used in two places:
+
+(1) It is #included by pcre_compile.c when it is compiled in debugging mode
+(DEBUG defined in pcre_internal.h). It is not included in production compiles.
+
+(2) It is always #included by pcretest.c, which can be asked to print out a
+compiled regex for debugging purposes. */
+
+
+static const char *OP_names[] = { OP_NAME_LIST };
+
+
+/*************************************************
+*       Print single- or multi-byte character    *
+*************************************************/
+
+static int
+print_char(FILE *f, uschar *ptr, BOOL utf8)
+{
+int c = *ptr;
+
+if (!utf8 || (c & 0xc0) != 0xc0)
+  {
+  if (isprint(c)) fprintf(f, "%c", c); else fprintf(f, "\\x%02x", c);
+  return 0;
+  }
+else
+  {
+  int i;
+  int a = _pcre_utf8_table4[c & 0x3f];  /* Number of additional bytes */
+  int s = 6*a;
+  c = (c & _pcre_utf8_table3[a]) << s;
+  for (i = 1; i <= a; i++)
+    {
+    /* This is a check for malformed UTF-8; it should only occur if the sanity
+    check has been turned off. Rather than swallow random bytes, just stop if
+    we hit a bad one. Print it with \X instead of \x as an indication. */
+
+    if ((ptr[i] & 0xc0) != 0x80)
+      {
+      fprintf(f, "\\X{%x}", c);
+      return i - 1;
+      }
+
+    /* The byte is OK */
+
+    s -= 6;
+    c |= (ptr[i] & 0x3f) << s;
+    }
+  if (c < 128) fprintf(f, "\\x%02x", c); else fprintf(f, "\\x{%x}", c);
+  return a;
+  }
+}
+
+
+
+/*************************************************
+*          Find Unicode property name            *
+*************************************************/
+
+static const char *
+get_ucpname(int property)
+{
+#ifdef SUPPORT_UCP
+int i;
+for (i = _pcre_utt_size; i >= 0; i--)
+  {
+  if (property == _pcre_utt[i].value) break;
+  }
+return (i >= 0)? _pcre_utt[i].name : "??";
+#else
+return "??";
+#endif
+}
+
+
+
+/*************************************************
+*         Print compiled regex                   *
+*************************************************/
+
+/* Make this function work for a regex with integers either byte order.
+However, we assume that what we are passed is a compiled regex. */
+
+static void
+pcre_printint(pcre *external_re, FILE *f)
+{
+real_pcre *re = (real_pcre *)external_re;
+uschar *codestart, *code;
+BOOL utf8;
+
+unsigned int options = re->options;
+int offset = re->name_table_offset;
+int count = re->name_count;
+int size = re->name_entry_size;
+
+if (re->magic_number != MAGIC_NUMBER)
+  {
+  offset = ((offset << 8) & 0xff00) | ((offset >> 8) & 0xff);
+  count = ((count << 8) & 0xff00) | ((count >> 8) & 0xff);
+  size = ((size << 8) & 0xff00) | ((size >> 8) & 0xff);
+  options = ((options << 24) & 0xff000000) |
+            ((options <<  8) & 0x00ff0000) |
+            ((options >>  8) & 0x0000ff00) |
+            ((options >> 24) & 0x000000ff);
+  }
+
+code = codestart = (uschar *)re + offset + count * size;
+utf8 = (options & PCRE_UTF8) != 0;
+
+for(;;)
+  {
+  uschar *ccode;
+  int c;
+  int extra = 0;
+
+  fprintf(f, "%3d ", (int)(code - codestart));
+
+  if (*code >= OP_BRA)
+    {
+    if (*code - OP_BRA > EXTRACT_BASIC_MAX)
+      fprintf(f, "%3d Bra extra\n", GET(code, 1));
+    else
+      fprintf(f, "%3d Bra %d\n", GET(code, 1), *code - OP_BRA);
+    code += _pcre_OP_lengths[OP_BRA];
+    continue;
+    }
+
+  switch(*code)
+    {
+    case OP_END:
+    fprintf(f, "    %s\n", OP_names[*code]);
+    fprintf(f, "------------------------------------------------------------------\n");
+    return;
+
+    case OP_OPT:
+    fprintf(f, " %.2x %s", code[1], OP_names[*code]);
+    break;
+
+    case OP_CHAR:
+      {
+      fprintf(f, "    ");
+      do
+        {
+        code++;
+        code += 1 + print_char(f, code, utf8);
+        }
+      while (*code == OP_CHAR);
+      fprintf(f, "\n");
+      continue;
+      }
+    break;
+
+    case OP_CHARNC:
+      {
+      fprintf(f, " NC ");
+      do
+        {
+        code++;
+        code += 1 + print_char(f, code, utf8);
+        }
+      while (*code == OP_CHARNC);
+      fprintf(f, "\n");
+      continue;
+      }
+    break;
+
+    case OP_KETRMAX:
+    case OP_KETRMIN:
+    case OP_ALT:
+    case OP_KET:
+    case OP_ASSERT:
+    case OP_ASSERT_NOT:
+    case OP_ASSERTBACK:
+    case OP_ASSERTBACK_NOT:
+    case OP_ONCE:
+    case OP_COND:
+    case OP_REVERSE:
+    fprintf(f, "%3d %s", GET(code, 1), OP_names[*code]);
+    break;
+
+    case OP_BRANUMBER:
+    printf("%3d %s", GET2(code, 1), OP_names[*code]);
+    break;
+
+    case OP_CREF:
+    if (GET2(code, 1) == CREF_RECURSE)
+      fprintf(f, "    Cond recurse");
+    else
+      fprintf(f, "%3d %s", GET2(code,1), OP_names[*code]);
+    break;
+
+    case OP_STAR:
+    case OP_MINSTAR:
+    case OP_PLUS:
+    case OP_MINPLUS:
+    case OP_QUERY:
+    case OP_MINQUERY:
+    case OP_TYPESTAR:
+    case OP_TYPEMINSTAR:
+    case OP_TYPEPLUS:
+    case OP_TYPEMINPLUS:
+    case OP_TYPEQUERY:
+    case OP_TYPEMINQUERY:
+    fprintf(f, "    ");
+    if (*code >= OP_TYPESTAR)
+      {
+      fprintf(f, "%s", OP_names[code[1]]);
+      if (code[1] == OP_PROP || code[1] == OP_NOTPROP)
+        {
+        fprintf(f, " %s ", get_ucpname(code[2]));
+        extra = 1;
+        }
+      }
+    else extra = print_char(f, code+1, utf8);
+    fprintf(f, "%s", OP_names[*code]);
+    break;
+
+    case OP_EXACT:
+    case OP_UPTO:
+    case OP_MINUPTO:
+    fprintf(f, "    ");
+    extra = print_char(f, code+3, utf8);
+    fprintf(f, "{");
+    if (*code != OP_EXACT) fprintf(f, ",");
+    fprintf(f, "%d}", GET2(code,1));
+    if (*code == OP_MINUPTO) fprintf(f, "?");
+    break;
+
+    case OP_TYPEEXACT:
+    case OP_TYPEUPTO:
+    case OP_TYPEMINUPTO:
+    fprintf(f, "    %s", OP_names[code[3]]);
+    if (code[3] == OP_PROP || code[3] == OP_NOTPROP)
+      {
+      fprintf(f, " %s ", get_ucpname(code[4]));
+      extra = 1;
+      }
+    fprintf(f, "{");
+    if (*code != OP_TYPEEXACT) fprintf(f, "0,");
+    fprintf(f, "%d}", GET2(code,1));
+    if (*code == OP_TYPEMINUPTO) fprintf(f, "?");
+    break;
+
+    case OP_NOT:
+    if (isprint(c = code[1])) fprintf(f, "    [^%c]", c);
+      else fprintf(f, "    [^\\x%02x]", c);
+    break;
+
+    case OP_NOTSTAR:
+    case OP_NOTMINSTAR:
+    case OP_NOTPLUS:
+    case OP_NOTMINPLUS:
+    case OP_NOTQUERY:
+    case OP_NOTMINQUERY:
+    if (isprint(c = code[1])) fprintf(f, "    [^%c]", c);
+      else fprintf(f, "    [^\\x%02x]", c);
+    fprintf(f, "%s", OP_names[*code]);
+    break;
+
+    case OP_NOTEXACT:
+    case OP_NOTUPTO:
+    case OP_NOTMINUPTO:
+    if (isprint(c = code[3])) fprintf(f, "    [^%c]{", c);
+      else fprintf(f, "    [^\\x%02x]{", c);
+    if (*code != OP_NOTEXACT) fprintf(f, "0,");
+    fprintf(f, "%d}", GET2(code,1));
+    if (*code == OP_NOTMINUPTO) fprintf(f, "?");
+    break;
+
+    case OP_RECURSE:
+    fprintf(f, "%3d %s", GET(code, 1), OP_names[*code]);
+    break;
+
+    case OP_REF:
+    fprintf(f, "    \\%d", GET2(code,1));
+    ccode = code + _pcre_OP_lengths[*code];
+    goto CLASS_REF_REPEAT;
+
+    case OP_CALLOUT:
+    fprintf(f, "    %s %d %d %d", OP_names[*code], code[1], GET(code,2),
+      GET(code, 2 + LINK_SIZE));
+    break;
+
+    case OP_PROP:
+    case OP_NOTPROP:
+    fprintf(f, "    %s %s", OP_names[*code], get_ucpname(code[1]));
+    break;
+
+    /* OP_XCLASS can only occur in UTF-8 mode. However, there's no harm in
+    having this code always here, and it makes it less messy without all those
+    #ifdefs. */
+
+    case OP_CLASS:
+    case OP_NCLASS:
+    case OP_XCLASS:
+      {
+      int i, min, max;
+      BOOL printmap;
+
+      fprintf(f, "    [");
+
+      if (*code == OP_XCLASS)
+        {
+        extra = GET(code, 1);
+        ccode = code + LINK_SIZE + 1;
+        printmap = (*ccode & XCL_MAP) != 0;
+        if ((*ccode++ & XCL_NOT) != 0) fprintf(f, "^");
+        }
+      else
+        {
+        printmap = TRUE;
+        ccode = code + 1;
+        }
+
+      /* Print a bit map */
+
+      if (printmap)
+        {
+        for (i = 0; i < 256; i++)
+          {
+          if ((ccode[i/8] & (1 << (i&7))) != 0)
+            {
+            int j;
+            for (j = i+1; j < 256; j++)
+              if ((ccode[j/8] & (1 << (j&7))) == 0) break;
+            if (i == '-' || i == ']') fprintf(f, "\\");
+            if (isprint(i)) fprintf(f, "%c", i); else fprintf(f, "\\x%02x", i);
+            if (--j > i)
+              {
+              if (j != i + 1) fprintf(f, "-");
+              if (j == '-' || j == ']') fprintf(f, "\\");
+              if (isprint(j)) fprintf(f, "%c", j); else fprintf(f, "\\x%02x", j);
+              }
+            i = j;
+            }
+          }
+        ccode += 32;
+        }
+
+      /* For an XCLASS there is always some additional data */
+
+      if (*code == OP_XCLASS)
+        {
+        int ch;
+        while ((ch = *ccode++) != XCL_END)
+          {
+          if (ch == XCL_PROP)
+            {
+            fprintf(f, "\\p{%s}", get_ucpname(*ccode++));
+            }
+          else if (ch == XCL_NOTPROP)
+            {
+            fprintf(f, "\\P{%s}", get_ucpname(*ccode++));
+            }
+          else
+            {
+            ccode += 1 + print_char(f, ccode, TRUE);
+            if (ch == XCL_RANGE)
+              {
+              fprintf(f, "-");
+              ccode += 1 + print_char(f, ccode, TRUE);
+              }
+            }
+          }
+        }
+
+      /* Indicate a non-UTF8 class which was created by negation */
+
+      fprintf(f, "]%s", (*code == OP_NCLASS)? " (neg)" : "");
+
+      /* Handle repeats after a class or a back reference */
+
+      CLASS_REF_REPEAT:
+      switch(*ccode)
+        {
+        case OP_CRSTAR:
+        case OP_CRMINSTAR:
+        case OP_CRPLUS:
+        case OP_CRMINPLUS:
+        case OP_CRQUERY:
+        case OP_CRMINQUERY:
+        fprintf(f, "%s", OP_names[*ccode]);
+        extra += _pcre_OP_lengths[*ccode];
+        break;
+
+        case OP_CRRANGE:
+        case OP_CRMINRANGE:
+        min = GET2(ccode,1);
+        max = GET2(ccode,3);
+        if (max == 0) fprintf(f, "{%d,}", min);
+        else fprintf(f, "{%d,%d}", min, max);
+        if (*ccode == OP_CRMINRANGE) fprintf(f, "?");
+        extra += _pcre_OP_lengths[*ccode];
+        break;
+        }
+      }
+    break;
+
+    /* Anything else is just an item with no data*/
+
+    default:
+    fprintf(f, "    %s", OP_names[*code]);
+    break;
+    }
+
+  code += _pcre_OP_lengths[*code] + extra;
+  fprintf(f, "\n");
+  }
+}
+
+/* End of pcre_printint.src */
diff -Nurp tin-1.6.2/pcre/pcre_refcount.c tin-1.8.0/pcre/pcre_refcount.c
--- tin-1.6.2/pcre/pcre_refcount.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_refcount.c	2005-09-12 16:40:34.000000000 +0200
@@ -0,0 +1,77 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_refcount(), which is an
+auxiliary function that can be used to maintain a reference count in a compiled
+pattern data block. This might be helpful in applications where the block is
+shared by different users. */
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+*           Maintain reference count             *
+*************************************************/
+
+/* The reference count is a 16-bit field, initialized to zero. It is not
+possible to transfer a non-zero count from one host to a different host that
+has a different byte order - though I can't see why anyone in their right mind
+would ever want to do that!
+
+Arguments:
+  argument_re   points to compiled code
+  adjust        value to add to the count
+
+Returns:        the (possibly updated) count value (a non-negative number), or
+                a negative error number
+*/
+
+PCRE_EXPORT int
+pcre_refcount(pcre *argument_re, int adjust)
+{
+real_pcre *re = (real_pcre *)argument_re;
+if (re == NULL) return PCRE_ERROR_NULL;
+re->ref_count = (-adjust > re->ref_count)? 0 :
+                (adjust + re->ref_count > 65535)? 65535 :
+                re->ref_count + adjust;
+return re->ref_count;
+}
+
+/* End of pcre_refcount.c */
diff -Nurp tin-1.6.2/pcre/pcre_study.c tin-1.8.0/pcre/pcre_study.c
--- tin-1.6.2/pcre/pcre_study.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_study.c	2005-09-12 16:40:40.000000000 +0200
@@ -0,0 +1,482 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_study(), along with local
+supporting functions. */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+*      Set a bit and maybe its alternate case    *
+*************************************************/
+
+/* Given a character, set its bit in the table, and also the bit for the other
+version of a letter if we are caseless.
+
+Arguments:
+  start_bits    points to the bit map
+  c             is the character
+  caseless      the caseless flag
+  cd            the block with char table pointers
+
+Returns:        nothing
+*/
+
+static void
+set_bit(uschar *start_bits, unsigned int c, BOOL caseless, compile_data *cd)
+{
+start_bits[c/8] |= (1 << (c&7));
+if (caseless && (cd->ctypes[c] & ctype_letter) != 0)
+  start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7));
+}
+
+
+
+/*************************************************
+*          Create bitmap of starting chars       *
+*************************************************/
+
+/* This function scans a compiled unanchored expression and attempts to build a
+bitmap of the set of initial characters. If it can't, it returns FALSE. As time
+goes by, we may be able to get more clever at doing this.
+
+Arguments:
+  code         points to an expression
+  start_bits   points to a 32-byte table, initialized to 0
+  caseless     the current state of the caseless flag
+  utf8         TRUE if in UTF-8 mode
+  cd           the block with char table pointers
+
+Returns:       TRUE if table built, FALSE otherwise
+*/
+
+static BOOL
+set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless,
+  BOOL utf8, compile_data *cd)
+{
+register int c;
+
+/* This next statement and the later reference to dummy are here in order to
+trick the optimizer of the IBM C compiler for OS/2 into generating correct
+code. Apparently IBM isn't going to fix the problem, and we would rather not
+disable optimization (in this module it actually makes a big difference, and
+the pcre module can use all the optimization it can get). */
+
+volatile int dummy;
+
+do
+  {
+  const uschar *tcode = code + 1 + LINK_SIZE;
+  BOOL try_next = TRUE;
+
+  while (try_next)
+    {
+    /* If a branch starts with a bracket or a positive lookahead assertion,
+    recurse to set bits from within them. That's all for this branch. */
+
+    if ((int)*tcode >= OP_BRA || *tcode == OP_ASSERT)
+      {
+      if (!set_start_bits(tcode, start_bits, caseless, utf8, cd))
+        return FALSE;
+      try_next = FALSE;
+      }
+
+    else switch(*tcode)
+      {
+      default:
+      return FALSE;
+
+      /* Skip over callout */
+
+      case OP_CALLOUT:
+      tcode += 2 + 2*LINK_SIZE;
+      break;
+
+      /* Skip over extended extraction bracket number */
+
+      case OP_BRANUMBER:
+      tcode += 3;
+      break;
+
+      /* Skip over lookbehind and negative lookahead assertions */
+
+      case OP_ASSERT_NOT:
+      case OP_ASSERTBACK:
+      case OP_ASSERTBACK_NOT:
+      do tcode += GET(tcode, 1); while (*tcode == OP_ALT);
+      tcode += 1+LINK_SIZE;
+      break;
+
+      /* Skip over an option setting, changing the caseless flag */
+
+      case OP_OPT:
+      caseless = (tcode[1] & PCRE_CASELESS) != 0;
+      tcode += 2;
+      break;
+
+      /* BRAZERO does the bracket, but carries on. */
+
+      case OP_BRAZERO:
+      case OP_BRAMINZERO:
+      if (!set_start_bits(++tcode, start_bits, caseless, utf8, cd))
+        return FALSE;
+      dummy = 1;
+      do tcode += GET(tcode,1); while (*tcode == OP_ALT);
+      tcode += 1+LINK_SIZE;
+      break;
+
+      /* Single-char * or ? sets the bit and tries the next item */
+
+      case OP_STAR:
+      case OP_MINSTAR:
+      case OP_QUERY:
+      case OP_MINQUERY:
+      set_bit(start_bits, tcode[1], caseless, cd);
+      tcode += 2;
+#ifdef SUPPORT_UTF8
+      if (utf8) while ((*tcode & 0xc0) == 0x80) tcode++;
+#endif
+      break;
+
+      /* Single-char upto sets the bit and tries the next */
+
+      case OP_UPTO:
+      case OP_MINUPTO:
+      set_bit(start_bits, tcode[3], caseless, cd);
+      tcode += 4;
+#ifdef SUPPORT_UTF8
+      if (utf8) while ((*tcode & 0xc0) == 0x80) tcode++;
+#endif
+      break;
+
+      /* At least one single char sets the bit and stops */
+
+      case OP_EXACT:       /* Fall through */
+      tcode += 2;
+
+      case OP_CHAR:
+      case OP_CHARNC:
+      case OP_PLUS:
+      case OP_MINPLUS:
+      set_bit(start_bits, tcode[1], caseless, cd);
+      try_next = FALSE;
+      break;
+
+      /* Single character type sets the bits and stops */
+
+      case OP_NOT_DIGIT:
+      for (c = 0; c < 32; c++)
+        start_bits[c] |= ~cd->cbits[c+cbit_digit];
+      try_next = FALSE;
+      break;
+
+      case OP_DIGIT:
+      for (c = 0; c < 32; c++)
+        start_bits[c] |= cd->cbits[c+cbit_digit];
+      try_next = FALSE;
+      break;
+
+      case OP_NOT_WHITESPACE:
+      for (c = 0; c < 32; c++)
+        start_bits[c] |= ~cd->cbits[c+cbit_space];
+      try_next = FALSE;
+      break;
+
+      case OP_WHITESPACE:
+      for (c = 0; c < 32; c++)
+        start_bits[c] |= cd->cbits[c+cbit_space];
+      try_next = FALSE;
+      break;
+
+      case OP_NOT_WORDCHAR:
+      for (c = 0; c < 32; c++)
+        start_bits[c] |= ~cd->cbits[c+cbit_word];
+      try_next = FALSE;
+      break;
+
+      case OP_WORDCHAR:
+      for (c = 0; c < 32; c++)
+        start_bits[c] |= cd->cbits[c+cbit_word];
+      try_next = FALSE;
+      break;
+
+      /* One or more character type fudges the pointer and restarts, knowing
+      it will hit a single character type and stop there. */
+
+      case OP_TYPEPLUS:
+      case OP_TYPEMINPLUS:
+      tcode++;
+      break;
+
+      case OP_TYPEEXACT:
+      tcode += 3;
+      break;
+
+      /* Zero or more repeats of character types set the bits and then
+      try again. */
+
+      case OP_TYPEUPTO:
+      case OP_TYPEMINUPTO:
+      tcode += 2;               /* Fall through */
+
+      case OP_TYPESTAR:
+      case OP_TYPEMINSTAR:
+      case OP_TYPEQUERY:
+      case OP_TYPEMINQUERY:
+      switch(tcode[1])
+        {
+        case OP_ANY:
+        return FALSE;
+
+        case OP_NOT_DIGIT:
+        for (c = 0; c < 32; c++)
+          start_bits[c] |= ~cd->cbits[c+cbit_digit];
+        break;
+
+        case OP_DIGIT:
+        for (c = 0; c < 32; c++)
+          start_bits[c] |= cd->cbits[c+cbit_digit];
+        break;
+
+        case OP_NOT_WHITESPACE:
+        for (c = 0; c < 32; c++)
+          start_bits[c] |= ~cd->cbits[c+cbit_space];
+        break;
+
+        case OP_WHITESPACE:
+        for (c = 0; c < 32; c++)
+          start_bits[c] |= cd->cbits[c+cbit_space];
+        break;
+
+        case OP_NOT_WORDCHAR:
+        for (c = 0; c < 32; c++)
+          start_bits[c] |= ~cd->cbits[c+cbit_word];
+        break;
+
+        case OP_WORDCHAR:
+        for (c = 0; c < 32; c++)
+          start_bits[c] |= cd->cbits[c+cbit_word];
+        break;
+        }
+
+      tcode += 2;
+      break;
+
+      /* Character class where all the information is in a bit map: set the
+      bits and either carry on or not, according to the repeat count. If it was
+      a negative class, and we are operating with UTF-8 characters, any byte
+      with a value >= 0xc4 is a potentially valid starter because it starts a
+      character with a value > 255. */
+
+      case OP_NCLASS:
+      if (utf8)
+        {
+        start_bits[24] |= 0xf0;              /* Bits for 0xc4 - 0xc8 */
+        memset(start_bits+25, 0xff, 7);      /* Bits for 0xc9 - 0xff */
+        }
+      /* Fall through */
+
+      case OP_CLASS:
+        {
+        tcode++;
+
+        /* In UTF-8 mode, the bits in a bit map correspond to character
+        values, not to byte values. However, the bit map we are constructing is
+        for byte values. So we have to do a conversion for characters whose
+        value is > 127. In fact, there are only two possible starting bytes for
+        characters in the range 128 - 255. */
+
+        if (utf8)
+          {
+          for (c = 0; c < 16; c++) start_bits[c] |= tcode[c];
+          for (c = 128; c < 256; c++)
+            {
+            if ((tcode[c/8] && (1 << (c&7))) != 0)
+              {
+              int d = (c >> 6) | 0xc0;            /* Set bit for this starter */
+              start_bits[d/8] |= (1 << (d&7));    /* and then skip on to the */
+              c = (c & 0xc0) + 0x40 - 1;          /* next relevant character. */
+              }
+            }
+          }
+
+        /* In non-UTF-8 mode, the two bit maps are completely compatible. */
+
+        else
+          {
+          for (c = 0; c < 32; c++) start_bits[c] |= tcode[c];
+          }
+
+        /* Advance past the bit map, and act on what follows */
+
+        tcode += 32;
+        switch (*tcode)
+          {
+          case OP_CRSTAR:
+          case OP_CRMINSTAR:
+          case OP_CRQUERY:
+          case OP_CRMINQUERY:
+          tcode++;
+          break;
+
+          case OP_CRRANGE:
+          case OP_CRMINRANGE:
+          if (((tcode[1] << 8) + tcode[2]) == 0) tcode += 5;
+            else try_next = FALSE;
+          break;
+
+          default:
+          try_next = FALSE;
+          break;
+          }
+        }
+      break; /* End of bitmap class handling */
+
+      }      /* End of switch */
+    }        /* End of try_next loop */
+
+  code += GET(code, 1);   /* Advance to next branch */
+  }
+while (*code == OP_ALT);
+return TRUE;
+}
+
+
+
+/*************************************************
+*          Study a compiled expression           *
+*************************************************/
+
+/* This function is handed a compiled expression that it must study to produce
+information that will speed up the matching. It returns a pcre_extra block
+which then gets handed back to pcre_exec().
+
+Arguments:
+  re        points to the compiled expression
+  options   contains option bits
+  errorptr  points to where to place error messages;
+            set NULL unless error
+
+Returns:    pointer to a pcre_extra block, with study_data filled in and the
+              appropriate flag set;
+            NULL on error or if no optimization possible
+*/
+
+PCRE_EXPORT pcre_extra *
+pcre_study(const pcre *external_re, int options, const char **errorptr)
+{
+uschar start_bits[32];
+pcre_extra *extra;
+pcre_study_data *study;
+const uschar *tables;
+const real_pcre *re = (const real_pcre *)external_re;
+uschar *code = (uschar *)re + re->name_table_offset +
+  (re->name_count * re->name_entry_size);
+compile_data compile_block;
+
+*errorptr = NULL;
+
+if (re == NULL || re->magic_number != MAGIC_NUMBER)
+  {
+  *errorptr = "argument is not a compiled regular expression";
+  return NULL;
+  }
+
+if ((options & ~PUBLIC_STUDY_OPTIONS) != 0)
+  {
+  *errorptr = "unknown or incorrect option bit(s) set";
+  return NULL;
+  }
+
+/* For an anchored pattern, or an unanchored pattern that has a first char, or
+a multiline pattern that matches only at "line starts", no further processing
+at present. */
+
+if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0)
+  return NULL;
+
+/* Set the character tables in the block that is passed around */
+
+tables = re->tables;
+if (tables == NULL)
+  (void)pcre_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES,
+  (void *)(&tables));
+
+compile_block.lcc = tables + lcc_offset;
+compile_block.fcc = tables + fcc_offset;
+compile_block.cbits = tables + cbits_offset;
+compile_block.ctypes = tables + ctypes_offset;
+
+/* See if we can find a fixed set of initial characters for the pattern. */
+
+memset(start_bits, 0, 32 * sizeof(uschar));
+if (!set_start_bits(code, start_bits, (re->options & PCRE_CASELESS) != 0,
+  (re->options & PCRE_UTF8) != 0, &compile_block)) return NULL;
+
+/* Get a pcre_extra block and a pcre_study_data block. The study data is put in
+the latter, which is pointed to by the former, which may also get additional
+data set later by the calling program. At the moment, the size of
+pcre_study_data is fixed. We nevertheless save it in a field for returning via
+the pcre_fullinfo() function so that if it becomes variable in the future, we
+don't have to change that code. */
+
+extra = (pcre_extra *)(pcre_malloc)
+  (sizeof(pcre_extra) + sizeof(pcre_study_data));
+
+if (extra == NULL)
+  {
+  *errorptr = "failed to get memory";
+  return NULL;
+  }
+
+study = (pcre_study_data *)((char *)extra + sizeof(pcre_extra));
+extra->flags = PCRE_EXTRA_STUDY_DATA;
+extra->study_data = study;
+
+study->size = sizeof(pcre_study_data);
+study->options = PCRE_STUDY_MAPPED;
+memcpy(study->start_bits, start_bits, sizeof(start_bits));
+
+return extra;
+}
+
+/* End of pcre_study.c */
diff -Nurp tin-1.6.2/pcre/pcre_tables.c tin-1.8.0/pcre/pcre_tables.c
--- tin-1.6.2/pcre/pcre_tables.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_tables.c	2005-09-12 16:40:50.000000000 +0200
@@ -0,0 +1,130 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains some fixed tables that are used by more than one of the
+PCRE code modules. The tables are also #included by the pcretest program, which
+uses macros to change their names from _pcre_xxx to xxxx, thereby avoiding name
+clashes with the library. */
+
+
+#include "pcre_internal.h"
+
+
+/* Table of sizes for the fixed-length opcodes. It's defined in a macro so that
+the definition is next to the definition of the opcodes in internal.h. */
+
+const uschar _pcre_OP_lengths[] = { OP_LENGTHS };
+
+
+
+/*************************************************
+*           Tables for UTF-8 support             *
+*************************************************/
+
+/* These are the breakpoints for different numbers of bytes in a UTF-8
+character. */
+
+const int _pcre_utf8_table1[] =
+  { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff};
+
+const int _pcre_utf8_table1_size = sizeof(_pcre_utf8_table1)/sizeof(int);
+
+/* These are the indicator bits and the mask for the data bits to set in the
+first byte of a character, indexed by the number of additional bytes. */
+
+const int _pcre_utf8_table2[] = { 0,    0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
+const int _pcre_utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
+
+/* Table of the number of extra characters, indexed by the first character
+masked with 0x3f. The highest number for a valid UTF-8 character is in fact
+0x3d. */
+
+const uschar _pcre_utf8_table4[] = {
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+  3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };
+
+/* This table translates Unicode property names into code values for the
+ucp_findchar() function. */
+
+const ucp_type_table _pcre_utt[] = {
+  { "C",  128 + ucp_C },
+  { "Cc", ucp_Cc },
+  { "Cf", ucp_Cf },
+  { "Cn", ucp_Cn },
+  { "Co", ucp_Co },
+  { "Cs", ucp_Cs },
+  { "L",  128 + ucp_L },
+  { "Ll", ucp_Ll },
+  { "Lm", ucp_Lm },
+  { "Lo", ucp_Lo },
+  { "Lt", ucp_Lt },
+  { "Lu", ucp_Lu },
+  { "M",  128 + ucp_M },
+  { "Mc", ucp_Mc },
+  { "Me", ucp_Me },
+  { "Mn", ucp_Mn },
+  { "N",  128 + ucp_N },
+  { "Nd", ucp_Nd },
+  { "Nl", ucp_Nl },
+  { "No", ucp_No },
+  { "P",  128 + ucp_P },
+  { "Pc", ucp_Pc },
+  { "Pd", ucp_Pd },
+  { "Pe", ucp_Pe },
+  { "Pf", ucp_Pf },
+  { "Pi", ucp_Pi },
+  { "Po", ucp_Po },
+  { "Ps", ucp_Ps },
+  { "S",  128 + ucp_S },
+  { "Sc", ucp_Sc },
+  { "Sk", ucp_Sk },
+  { "Sm", ucp_Sm },
+  { "So", ucp_So },
+  { "Z",  128 + ucp_Z },
+  { "Zl", ucp_Zl },
+  { "Zp", ucp_Zp },
+  { "Zs", ucp_Zs }
+};
+
+const int _pcre_utt_size = sizeof(_pcre_utt)/sizeof(ucp_type_table);
+
+/* End of pcre_tables.c */
diff -Nurp tin-1.6.2/pcre/pcre_try_flipped.c tin-1.8.0/pcre/pcre_try_flipped.c
--- tin-1.6.2/pcre/pcre_try_flipped.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_try_flipped.c	2005-09-12 16:41:00.000000000 +0200
@@ -0,0 +1,132 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains an internal function that tests a compiled pattern to
+see if it was compiled with the opposite endianness. If so, it uses an
+auxiliary local function to flip the appropriate bytes. */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+*         Flip bytes in an integer               *
+*************************************************/
+
+/* This function is called when the magic number in a regex doesn't match, in
+order to flip its bytes to see if we are dealing with a pattern that was
+compiled on a host of different endianness. If so, this function is used to
+flip other byte values.
+
+Arguments:
+  value        the number to flip
+  n            the number of bytes to flip (assumed to be 2 or 4)
+
+Returns:       the flipped value
+*/
+
+static long int
+byteflip(long int value, int n)
+{
+if (n == 2) return ((value & 0x00ff) << 8) | ((value & 0xff00) >> 8);
+return ((value & 0x000000ff) << 24) |
+       ((value & 0x0000ff00) <<  8) |
+       ((value & 0x00ff0000) >>  8) |
+       ((value & 0xff000000) >> 24);
+}
+
+
+
+/*************************************************
+*       Test for a byte-flipped compiled regex   *
+*************************************************/
+
+/* This function is called from pcre_exec(), pcre_dfa_exec(), and also from
+pcre_fullinfo(). Its job is to test whether the regex is byte-flipped - that
+is, it was compiled on a system of opposite endianness. The function is called
+only when the native MAGIC_NUMBER test fails. If the regex is indeed flipped,
+we flip all the relevant values into a different data block, and return it.
+
+Arguments:
+  re               points to the regex
+  study            points to study data, or NULL
+  internal_re      points to a new regex block
+  internal_study   points to a new study block
+
+Returns:           the new block if is is indeed a byte-flipped regex
+                   NULL if it is not
+*/
+
+PCRE_EXPORT real_pcre *
+_pcre_try_flipped(const real_pcre *re, real_pcre *internal_re,
+  const pcre_study_data *study, pcre_study_data *internal_study)
+{
+if (byteflip(re->magic_number, sizeof(re->magic_number)) != MAGIC_NUMBER)
+  return NULL;
+
+*internal_re = *re;           /* To copy other fields */
+internal_re->size = byteflip(re->size, sizeof(re->size));
+internal_re->options = byteflip(re->options, sizeof(re->options));
+internal_re->top_bracket =
+  (pcre_uint16)byteflip(re->top_bracket, sizeof(re->top_bracket));
+internal_re->top_backref =
+  (pcre_uint16)byteflip(re->top_backref, sizeof(re->top_backref));
+internal_re->first_byte =
+  (pcre_uint16)byteflip(re->first_byte, sizeof(re->first_byte));
+internal_re->req_byte =
+  (pcre_uint16)byteflip(re->req_byte, sizeof(re->req_byte));
+internal_re->name_table_offset =
+  (pcre_uint16)byteflip(re->name_table_offset, sizeof(re->name_table_offset));
+internal_re->name_entry_size =
+  (pcre_uint16)byteflip(re->name_entry_size, sizeof(re->name_entry_size));
+internal_re->name_count =
+  (pcre_uint16)byteflip(re->name_count, sizeof(re->name_count));
+
+if (study != NULL)
+  {
+  *internal_study = *study;   /* To copy other fields */
+  internal_study->size = byteflip(study->size, sizeof(study->size));
+  internal_study->options = byteflip(study->options, sizeof(study->options));
+  }
+
+return internal_re;
+}
+
+/* End of pcre_tryflipped.c */
diff -Nurp tin-1.6.2/pcre/pcre_ucp_findchar.c tin-1.8.0/pcre/pcre_ucp_findchar.c
--- tin-1.6.2/pcre/pcre_ucp_findchar.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_ucp_findchar.c	2005-09-12 16:41:12.000000000 +0200
@@ -0,0 +1,161 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module compiles code for supporting the use of Unicode character
+properties. We use the (embryonic at the time of writing) UCP library, by
+including some of its files, copies of which have been put in the PCRE
+distribution. The actual search function is reproduced here, with its name
+changed. */
+
+
+#include "pcre_internal.h"
+
+#include "ucp.h"               /* Category definitions */
+#include "ucpinternal.h"       /* Internal table details */
+#include "ucptable.c"          /* The table itself */
+
+
+
+/*************************************************
+*         Search table and return data           *
+*************************************************/
+
+/* Two values are returned: the category is ucp_C, ucp_L, etc. The detailed
+character type is ucp_Lu, ucp_Nd, etc.
+
+Arguments:
+  c           the character value
+  type_ptr    the detailed character type is returned here
+  case_ptr    for letters, the opposite case is returned here, if there
+                is one, else zero
+
+Returns:      the character type category or -1 if not found
+*/
+
+PCRE_EXPORT int
+_pcre_ucp_findchar(const int c, int *type_ptr, int *case_ptr)
+{
+cnode *node = ucp_table;
+register int cc = c;
+int case_offset;
+
+for (;;)
+  {
+  register int d = node->f1 | ((node->f0 & f0_chhmask) << 16);
+  if (cc == d) break;
+  if (cc < d)
+    {
+    if ((node->f0 & f0_leftexists) == 0) return -1;
+    node ++;
+    }
+  else
+    {
+    register int roffset = (node->f2 & f2_rightmask) >> f2_rightshift;
+    if (roffset == 0) return -1;
+    node += 1 << (roffset - 1);
+    }
+  }
+
+switch ((*type_ptr = ((node->f0 & f0_typemask) >> f0_typeshift)))
+  {
+  case ucp_Cc:
+  case ucp_Cf:
+  case ucp_Cn:
+  case ucp_Co:
+  case ucp_Cs:
+  return ucp_C;
+  break;
+
+  case ucp_Ll:
+  case ucp_Lu:
+  case_offset = node->f2 & f2_casemask;
+  if ((case_offset & 0x0100) != 0) case_offset |= 0xfffff000;
+  *case_ptr = (case_offset == 0)? 0 : cc + case_offset;
+  return ucp_L;
+
+  case ucp_Lm:
+  case ucp_Lo:
+  case ucp_Lt:
+  *case_ptr = 0;
+  return ucp_L;
+  break;
+
+  case ucp_Mc:
+  case ucp_Me:
+  case ucp_Mn:
+  return ucp_M;
+  break;
+
+  case ucp_Nd:
+  case ucp_Nl:
+  case ucp_No:
+  return ucp_N;
+  break;
+
+  case ucp_Pc:
+  case ucp_Pd:
+  case ucp_Pe:
+  case ucp_Pf:
+  case ucp_Pi:
+  case ucp_Ps:
+  case ucp_Po:
+  return ucp_P;
+  break;
+
+  case ucp_Sc:
+  case ucp_Sk:
+  case ucp_Sm:
+  case ucp_So:
+  return ucp_S;
+  break;
+
+  case ucp_Zl:
+  case ucp_Zp:
+  case ucp_Zs:
+  return ucp_Z;
+  break;
+
+  default:         /* "Should never happen" */
+  return -1;
+  break;
+  }
+}
+
+/* End of pcre_ucp_findchar.c */
diff -Nurp tin-1.6.2/pcre/pcre_valid_utf8.c tin-1.8.0/pcre/pcre_valid_utf8.c
--- tin-1.6.2/pcre/pcre_valid_utf8.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_valid_utf8.c	2005-09-12 16:41:21.000000000 +0200
@@ -0,0 +1,130 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains an internal function for validating UTF-8 character
+strings. */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+*         Validate a UTF-8 string                *
+*************************************************/
+
+/* This function is called (optionally) at the start of compile or match, to
+validate that a supposed UTF-8 string is actually valid. The early check means
+that subsequent code can assume it is dealing with a valid string. The check
+can be turned off for maximum performance, but the consequences of supplying
+an invalid string are then undefined.
+
+Arguments:
+  string       points to the string
+  length       length of string, or -1 if the string is zero-terminated
+
+Returns:       < 0    if the string is a valid UTF-8 string
+               >= 0   otherwise; the value is the offset of the bad byte
+*/
+
+PCRE_EXPORT int
+_pcre_valid_utf8(const uschar *string, int length)
+{
+register const uschar *p;
+
+if (length < 0)
+  {
+  for (p = string; *p != 0; p++);
+  length = p - string;
+  }
+
+for (p = string; length-- > 0; p++)
+  {
+  register int ab;
+  register int c = *p;
+  if (c < 128) continue;
+  if ((c & 0xc0) != 0xc0) return p - string;
+  ab = _pcre_utf8_table4[c & 0x3f];  /* Number of additional bytes */
+  if (length < ab) return p - string;
+  length -= ab;
+
+  /* Check top bits in the second byte */
+  if ((*(++p) & 0xc0) != 0x80) return p - string;
+
+  /* Check for overlong sequences for each different length */
+  switch (ab)
+    {
+    /* Check for xx00 000x */
+    case 1:
+    if ((c & 0x3e) == 0) return p - string;
+    continue;   /* We know there aren't any more bytes to check */
+
+    /* Check for 1110 0000, xx0x xxxx */
+    case 2:
+    if (c == 0xe0 && (*p & 0x20) == 0) return p - string;
+    break;
+
+    /* Check for 1111 0000, xx00 xxxx */
+    case 3:
+    if (c == 0xf0 && (*p & 0x30) == 0) return p - string;
+    break;
+
+    /* Check for 1111 1000, xx00 0xxx */
+    case 4:
+    if (c == 0xf8 && (*p & 0x38) == 0) return p - string;
+    break;
+
+    /* Check for leading 0xfe or 0xff, and then for 1111 1100, xx00 00xx */
+    case 5:
+    if (c == 0xfe || c == 0xff ||
+       (c == 0xfc && (*p & 0x3c) == 0)) return p - string;
+    break;
+    }
+
+  /* Check for valid bytes after the 2nd, if any; all must start 10 */
+  while (--ab > 0)
+    {
+    if ((*(++p) & 0xc0) != 0x80) return p - string;
+    }
+  }
+
+return -1;
+}
+
+/* End of pcre_valid_utf8.c */
diff -Nurp tin-1.6.2/pcre/pcre_version.c tin-1.8.0/pcre/pcre_version.c
--- tin-1.6.2/pcre/pcre_version.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_version.c	2005-09-12 16:41:30.000000000 +0200
@@ -0,0 +1,61 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains the external function pcre_version(), which returns a
+string that identifies the PCRE version that is in use. */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+*          Return version string                 *
+*************************************************/
+
+#define STRING(a)  # a
+#define XSTRING(s) STRING(s)
+
+PCRE_EXPORT const char *
+pcre_version(void)
+{
+return XSTRING(PCRE_MAJOR) "." XSTRING(PCRE_MINOR) " " XSTRING(PCRE_DATE);
+}
+
+/* End of pcre_version.c */
diff -Nurp tin-1.6.2/pcre/pcre_xclass.c tin-1.8.0/pcre/pcre_xclass.c
--- tin-1.6.2/pcre/pcre_xclass.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/pcre_xclass.c	2005-09-12 16:41:39.000000000 +0200
@@ -0,0 +1,121 @@
+/*************************************************
+*      Perl-Compatible Regular Expressions       *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains an internal function that is used to match an extended
+class (one that contains characters whose values are > 255). It is used by both
+pcre_exec() and pcre_def_exec(). */
+
+
+#include "pcre_internal.h"
+
+
+/*************************************************
+*       Match character against an XCLASS        *
+*************************************************/
+
+/* This function is called to match a character against an extended class that
+might contain values > 255.
+
+Arguments:
+  c           the character
+  data        points to the flag byte of the XCLASS data
+
+Returns:      TRUE if character matches, else FALSE
+*/
+
+PCRE_EXPORT BOOL
+_pcre_xclass(int c, const uschar *data)
+{
+int t;
+BOOL negated = (*data & XCL_NOT) != 0;
+
+/* Character values < 256 are matched against a bitmap, if one is present. If
+not, we still carry on, because there may be ranges that start below 256 in the
+additional data. */
+
+if (c < 256)
+  {
+  if ((*data & XCL_MAP) != 0 && (data[1 + c/8] & (1 << (c&7))) != 0)
+    return !negated;   /* char found */
+  }
+
+/* First skip the bit map if present. Then match against the list of Unicode
+properties or large chars or ranges that end with a large char. We won't ever
+encounter XCL_PROP or XCL_NOTPROP when UCP support is not compiled. */
+
+if ((*data++ & XCL_MAP) != 0) data += 32;
+
+while ((t = *data++) != XCL_END)
+  {
+  int x, y;
+  if (t == XCL_SINGLE)
+    {
+    GETCHARINC(x, data);
+    if (c == x) return !negated;
+    }
+  else if (t == XCL_RANGE)
+    {
+    GETCHARINC(x, data);
+    GETCHARINC(y, data);
+    if (c >= x && c <= y) return !negated;
+    }
+
+#ifdef SUPPORT_UCP
+  else  /* XCL_PROP & XCL_NOTPROP */
+    {
+    int chartype, othercase;
+    int rqdtype = *data++;
+    int category = _pcre_ucp_findchar(c, &chartype, &othercase);
+    if (rqdtype >= 128)
+      {
+      if ((rqdtype - 128 == category) == (t == XCL_PROP)) return !negated;
+      }
+    else
+      {
+      if ((rqdtype == chartype) == (t == XCL_PROP)) return !negated;
+      }
+    }
+#endif  /* SUPPORT_UCP */
+  }
+
+return negated;   /* char did not match */
+}
+
+/* End of pcre_xclass.c */
diff -Nurp tin-1.6.2/pcre/pcredemo.c tin-1.8.0/pcre/pcredemo.c
--- tin-1.6.2/pcre/pcredemo.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/pcredemo.c	2005-06-28 10:31:26.000000000 +0200
@@ -7,10 +7,10 @@ of calling the PCRE regular expression l
 pcresample documentation for a short discussion.
 
 Compile thuswise:
-  gcc -Wall pcredemo.c -I/opt/local/include -L/opt/local/lib \
-    -R/opt/local/lib -lpcre
+  gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \
+    -R/usr/local/lib -lpcre
 
-Replace "/opt/local/include" and "/opt/local/lib" with wherever the include and
+Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and
 library files for PCRE are installed on your system. Only some operating
 systems (e.g. Solaris) use the -R option.
 */
@@ -39,12 +39,13 @@ int subject_length;
 int rc, i;
 
 
-/*************************************************************************
-* First, sort out the command line. There is only one possible option at *
-* the moment, "-g" to request repeated matching to find all occurrences, *
-* like Perl's /g option. We set the variable find_all non-zero if it is  *
-* present. Apart from that, there must be exactly two arguments.         *
-*************************************************************************/
+/**************************************************************************
+* First, sort out the command line. There is only one possible option at  *
+* the moment, "-g" to request repeated matching to find all occurrences,  *
+* like Perl's /g option. We set the variable find_all to a non-zero value *
+* if the -g option is present. Apart from that, there must be exactly two *
+* arguments.                                                              *
+**************************************************************************/
 
 find_all = 0;
 for (i = 1; i < argc; i++)
@@ -90,7 +91,7 @@ if (re == NULL)
 
 /*************************************************************************
 * If the compilation succeeded, we call PCRE again, in order to do a     *
-* pattern match against the subject string. This just does ONE match. If *
+* pattern match against the subject string. This does just ONE match. If *
 * further matching is needed, it will be done below.                     *
 *************************************************************************/
 
@@ -116,6 +117,7 @@ if (rc < 0)
     */
     default: printf("Matching error %d\n", rc); break;
     }
+  free(re);     /* Release memory used for the compiled pattern */
   return 1;
   }
 
@@ -149,12 +151,12 @@ for (i = 0; i < rc; i++)
   }
 
 
-/*************************************************************************
-* That concludes the basic part of this demonstration program. We have   *
-* compiled a pattern, and performed a single match. The code that follows*
-* first shows how to access named substrings, and then how to code for   *
-* repeated matches on the same subject.                                  *
-*************************************************************************/
+/**************************************************************************
+* That concludes the basic part of this demonstration program. We have    *
+* compiled a pattern, and performed a single match. The code that follows *
+* first shows how to access named substrings, and then how to code for    *
+* repeated matches on the same subject.                                   *
+**************************************************************************/
 
 /* See if there are any named substrings, and if so, show them by name. First
 we have to extract the count of named parentheses from the pattern. */
@@ -219,7 +221,11 @@ if (namecount <= 0) printf("No named sub
 * proceed round the loop.                                                *
 *************************************************************************/
 
-if (!find_all) return 0;   /* Finish unless -g was given */
+if (!find_all)
+  {
+  free(re);   /* Release the memory used for the compiled pattern */
+  return 0;   /* Finish unless -g was given */
+  }
 
 /* Loop for second and subsequent matches */
 
@@ -270,6 +276,7 @@ for (;;)
   if (rc < 0)
     {
     printf("Matching error %d\n", rc);
+    free(re);    /* Release memory used for the compiled pattern */
     return 1;
     }
 
@@ -310,6 +317,7 @@ for (;;)
   }      /* End of loop to find second and subsequent matches */
 
 printf("\n");
+free(re);       /* Release memory used for the compiled pattern */
 return 0;
 }
 
diff -Nurp tin-1.6.2/pcre/pcregrep.c tin-1.8.0/pcre/pcregrep.c
--- tin-1.6.2/pcre/pcregrep.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/pcregrep.c	2005-09-12 16:41:52.000000000 +0200
@@ -4,13 +4,49 @@
 
 /* This is a grep program that uses the PCRE regular expression library to do
 its pattern matching. On a Unix or Win32 system it can recurse into
-directories. */
+directories.
+
+           Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
 
 #include <ctype.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <errno.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
 #include "config.h"
 #include "pcre.h"
 
@@ -19,51 +55,89 @@ directories. */
 
 typedef int BOOL;
 
-#define VERSION "3.0 14-Jan-2003"
+#define VERSION "4.1 05-Sep-2005"
 #define MAX_PATTERN_COUNT 100
 
+#if BUFSIZ > 8192
+#define MBUFTHIRD BUFSIZ
+#else
+#define MBUFTHIRD 8192
+#endif
+
+
 
 /*************************************************
 *               Global variables                 *
 *************************************************/
 
 static char *pattern_filename = NULL;
+static char *stdin_name = (char *)"(standard input)";
 static int  pattern_count = 0;
 static pcre **pattern_list;
 static pcre_extra **hints_list;
 
+static char *include_pattern = NULL;
+static char *exclude_pattern = NULL;
+
+static pcre *include_compiled = NULL;
+static pcre *exclude_compiled = NULL;
+
+static int after_context = 0;
+static int before_context = 0;
+static int both_context = 0;
+
 static BOOL count_only = FALSE;
 static BOOL filenames = TRUE;
 static BOOL filenames_only = FALSE;
+static BOOL filenames_nomatch_only = FALSE;
+static BOOL hyphenpending = FALSE;
 static BOOL invert = FALSE;
+static BOOL multiline = FALSE;
 static BOOL number = FALSE;
+static BOOL quiet = FALSE;
 static BOOL recurse = FALSE;
 static BOOL silent = FALSE;
 static BOOL whole_lines = FALSE;
+static BOOL word_match = FALSE;
 
 /* Structure for options and list of them */
 
+enum { OP_NODATA, OP_STRING, OP_NUMBER };
+
 typedef struct option_item {
+  int type;
   int one_char;
+  void *dataptr;
   const char *long_name;
   const char *help_text;
 } option_item;
 
 static option_item optionlist[] = {
-  { -1,  "help",         "display this help and exit" },
-  { 'c', "count",        "print only a count of matching lines per FILE" },
-  { 'h', "no-filename",  "suppress the prefixing filename on output" },
-  { 'i', "ignore-case",  "ignore case distinctions" },
-  { 'l', "files-with-matches", "print only FILE names containing matches" },
-  { 'n', "line-number",  "print line number with output lines" },
-  { 'r', "recursive",    "recursively scan sub-directories" },
-  { 's', "no-messages",  "suppress error messages" },
-  { 'u', "utf-8",        "use UTF-8 mode" },
-  { 'V', "version",      "print version information and exit" },
-  { 'v', "invert-match", "select non-matching lines" },
-  { 'x', "line-regex",   "force PATTERN to match only whole lines" },
-  { 'x', "line-regexp",  "force PATTERN to match only whole lines" },
-  { 0,    NULL,           NULL }
+  { OP_NODATA, -1,  NULL,              "",              "  terminate options" },
+  { OP_NODATA, -1,  NULL,              "help",          "display this help and exit" },
+  { OP_NUMBER, 'A', &after_context,    "after-context=number", "set number of following context lines" },
+  { OP_NUMBER, 'B', &before_context,   "before-context=number", "set number of prior context lines" },
+  { OP_NUMBER, 'C', &both_context,     "context=number", "set number of context lines, before & after" },
+  { OP_NODATA, 'c', NULL,              "count",         "print only a count of matching lines per FILE" },
+  { OP_STRING, 'f', &pattern_filename, "file=path",     "read patterns from file" },
+  { OP_NODATA, 'h', NULL,              "no-filename",   "suppress the prefixing filename on output" },
+  { OP_NODATA, 'i', NULL,              "ignore-case",   "ignore case distinctions" },
+  { OP_NODATA, 'l', NULL,              "files-with-matches", "print only FILE names containing matches" },
+  { OP_NODATA, 'L', NULL,              "files-without-match","print only FILE names not containing matches" },
+  { OP_STRING, -1,  &stdin_name,       "label=name",    "set name for standard input" },
+  { OP_NODATA, 'M', NULL,              "multiline",     "run in multiline mode" },
+  { OP_NODATA, 'n', NULL,              "line-number",   "print line number with output lines" },
+  { OP_NODATA, 'q', NULL,              "quiet",         "suppress output, just set return code" },
+  { OP_NODATA, 'r', NULL,              "recursive",     "recursively scan sub-directories" },
+  { OP_STRING, -1,  &exclude_pattern,  "exclude=pattern","exclude matching files when recursing" },
+  { OP_STRING, -1,  &include_pattern,  "include=pattern","include matching files when recursing" },
+  { OP_NODATA, 's', NULL,              "no-messages",   "suppress error messages" },
+  { OP_NODATA, 'u', NULL,              "utf-8",         "use UTF-8 mode" },
+  { OP_NODATA, 'V', NULL,              "version",       "print version information and exit" },
+  { OP_NODATA, 'v', NULL,              "invert-match",  "select non-matching lines" },
+  { OP_NODATA, 'w', NULL,              "word-regex(p)", "force PATTERN to match only as a word"  },
+  { OP_NODATA, 'x', NULL,              "line-regex(p)", "force PATTERN to match only whole lines" },
+  { OP_NODATA, 0,   NULL,               NULL,            NULL }
 };
 
 
@@ -123,7 +197,8 @@ closedir(dir);
 /************* Directory scanning in Win32 ***********/
 
 /* I (Philip Hazel) have no means of testing this code. It was contributed by
-Lionel Fourquaux. */
+Lionel Fourquaux. David Burgess added a patch to define INVALID_FILE_ATTRIBUTES
+when it did not exist. */
 
 
 #elif HAVE_WIN32API
@@ -134,6 +209,10 @@ Lionel Fourquaux. */
 #ifndef WIN32_LEAN_AND_MEAN
 # define WIN32_LEAN_AND_MEAN
 #endif
+#ifndef INVALID_FILE_ATTRIBUTES
+#define INVALID_FILE_ATTRIBUTES 0xFFFFFFFF
+#endif
+
 #include <windows.h>
 
 typedef struct directory_type
@@ -253,59 +332,292 @@ return sys_errlist[n];
 
 
 /*************************************************
-*              Grep an individual file           *
+*       Print the previous "after" lines         *
+*************************************************/
+
+/* This is called if we are about to lose said lines because of buffer filling,
+and at the end of the file.
+
+Arguments:
+  lastmatchnumber   the number of the last matching line, plus one
+  lastmatchrestart  where we restarted after the last match
+  endptr            end of available data
+  printname         filename for printing
+
+Returns:            nothing
+*/
+
+static void do_after_lines(int lastmatchnumber, char *lastmatchrestart,
+  char *endptr, char *printname)
+{
+if (after_context > 0 && lastmatchnumber > 0)
+  {
+  int count = 0;
+  while (lastmatchrestart < endptr && count++ < after_context)
+    {
+    char *pp = lastmatchrestart;
+    if (printname != NULL) fprintf(stdout, "%s-", printname);
+    if (number) fprintf(stdout, "%d-", lastmatchnumber++);
+    while (*pp != '\n') pp++;
+    fprintf(stdout, "%.*s", pp - lastmatchrestart + 1, lastmatchrestart);
+    lastmatchrestart = pp + 1;
+    }
+  hyphenpending = TRUE;
+  }
+}
+
+
+
+/*************************************************
+*            Grep an individual file             *
 *************************************************/
 
+/* This is called from grep_or_recurse() below. It uses a buffer that is three
+times the value of MBUFTHIRD. The matching point is never allowed to stray into
+the top third of the buffer, thus keeping more of the file available for
+context printing or for multiline scanning. For large files, the pointer will
+be in the middle third most of the time, so the bottom third is available for
+"before" context printing.
+
+Arguments:
+  in           the fopened FILE stream
+  printname    the file name if it is to be printed for each match
+               or NULL if the file name is not to be printed
+               it cannot be NULL if filenames[_nomatch]_only is set
+
+Returns:       0 if there was at least one match
+               1 otherwise (no matches)
+*/
+
 static int
-pcregrep(FILE *in, char *name)
+pcregrep(FILE *in, char *printname)
 {
 int rc = 1;
-int linenumber = 0;
+int linenumber = 1;
+int lastmatchnumber = 0;
 int count = 0;
 int offsets[99];
-char buffer[BUFSIZ];
+char *lastmatchrestart = NULL;
+char buffer[3*MBUFTHIRD];
+char *ptr = buffer;
+char *endptr;
+size_t bufflength;
+BOOL endhyphenpending = FALSE;
+
+/* Do the first read into the start of the buffer and set up the pointer to
+end of what we have. */
+
+bufflength = fread(buffer, 1, 3*MBUFTHIRD, in);
+endptr = buffer + bufflength;
+
+/* Loop while the current pointer is not at the end of the file. For large
+files, endptr will be at the end of the buffer when we are in the middle of the
+file, but ptr will never get there, because as soon as it gets over 2/3 of the
+way, the buffer is shifted left and re-filled. */
 
-while (fgets(buffer, sizeof(buffer), in) != NULL)
+while (ptr < endptr)
   {
-  BOOL match = FALSE;
   int i;
-  int length = (int)strlen(buffer);
-  if (length > 0 && buffer[length-1] == '\n') buffer[--length] = 0;
-  linenumber++;
+  BOOL match = FALSE;
+  char *t = ptr;
+  size_t length, linelength;
+
+  /* At this point, ptr is at the start of a line. We need to find the length
+  of the subject string to pass to pcre_exec(). In multiline mode, it is the
+  length remainder of the data in the buffer. Otherwise, it is the length of
+  the next line. After matching, we always advance by the length of the next
+  line. In multiline mode the PCRE_FIRSTLINE option is used for compiling, so
+  that any match is constrained to be in the first line. */
+
+  linelength = 0;
+  while (t < endptr && *t++ != '\n') linelength++;
+  length = multiline? endptr - ptr : linelength;
+
+  /* Run through all the patterns until one matches. Note that we don't include
+  the final newline in the subject string. */
 
   for (i = 0; !match && i < pattern_count; i++)
     {
-    match = pcre_exec(pattern_list[i], hints_list[i], buffer, length, 0, 0,
+    match = pcre_exec(pattern_list[i], hints_list[i], ptr, length, 0, 0,
       offsets, 99) >= 0;
-    if (match && whole_lines && offsets[1] != length) match = FALSE;
     }
 
+  /* If it's a match or a not-match (as required), print what's wanted. */
+
   if (match != invert)
     {
+    BOOL hyphenprinted = FALSE;
+
+    if (filenames_nomatch_only) return 1;
+
     if (count_only) count++;
 
     else if (filenames_only)
       {
-      fprintf(stdout, "%s\n", (name == NULL)? "<stdin>" : name);
+      fprintf(stdout, "%s\n", printname);
       return 0;
       }
 
-    else if (silent) return 0;
+    else if (quiet) return 0;
 
     else
       {
-      if (name != NULL) fprintf(stdout, "%s:", name);
+      /* See if there is a requirement to print some "after" lines from a
+      previous match. We never print any overlaps. */
+
+      if (after_context > 0 && lastmatchnumber > 0)
+        {
+        int linecount = 0;
+        char *p = lastmatchrestart;
+
+        while (p < ptr && linecount < after_context)
+          {
+          while (*p != '\n') p++;
+          p++;
+          linecount++;
+          }
+
+        /* It is important to advance lastmatchrestart during this printing so
+        that it interacts correctly with any "before" printing below. */
+
+        while (lastmatchrestart < p)
+          {
+          char *pp = lastmatchrestart;
+          if (printname != NULL) fprintf(stdout, "%s-", printname);
+          if (number) fprintf(stdout, "%d-", lastmatchnumber++);
+          while (*pp != '\n') pp++;
+          fprintf(stdout, "%.*s", pp - lastmatchrestart + 1, lastmatchrestart);
+          lastmatchrestart = pp + 1;
+          }
+        if (lastmatchrestart != ptr) hyphenpending = TRUE;
+        }
+
+      /* If there were non-contiguous lines printed above, insert hyphens. */
+
+      if (hyphenpending)
+        {
+        fprintf(stdout, "--\n");
+        hyphenpending = FALSE;
+        hyphenprinted = TRUE;
+        }
+
+      /* See if there is a requirement to print some "before" lines for this
+      match. Again, don't print overlaps. */
+
+      if (before_context > 0)
+        {
+        int linecount = 0;
+        char *p = ptr;
+
+        while (p > buffer && (lastmatchnumber == 0 || p > lastmatchrestart) &&
+               linecount++ < before_context)
+          {
+          p--;
+          while (p > buffer && p[-1] != '\n') p--;
+          }
+
+        if (lastmatchnumber > 0 && p > lastmatchrestart && !hyphenprinted)
+          fprintf(stdout, "--\n");
+
+        while (p < ptr)
+          {
+          char *pp = p;
+          if (printname != NULL) fprintf(stdout, "%s-", printname);
+          if (number) fprintf(stdout, "%d-", linenumber - linecount--);
+          while (*pp != '\n') pp++;
+          fprintf(stdout, "%.*s", pp - p + 1, p);
+          p = pp + 1;
+          }
+        }
+
+      /* Now print the matching line(s); ensure we set hyphenpending at the end
+      of the file if any context lines are being output. */
+
+      if (after_context > 0 || before_context > 0)
+        endhyphenpending = TRUE;
+
+      if (printname != NULL) fprintf(stdout, "%s:", printname);
       if (number) fprintf(stdout, "%d:", linenumber);
-      fprintf(stdout, "%s\n", buffer);
+
+      /* In multiline mode, we want to print to the end of the line in which
+      the end of the matched string is found, so we adjust linelength and the
+      line number appropriately. Because the PCRE_FIRSTLINE option is set, the
+      start of the match will always be before the first \n character. */
+
+      if (multiline)
+        {
+        char *endmatch = ptr + offsets[1];
+        t = ptr;
+        while (t < endmatch) { if (*t++ == '\n') linenumber++; }
+        while (endmatch < endptr && *endmatch != '\n') endmatch++;
+        linelength = endmatch - ptr;
+        }
+
+      fprintf(stdout, "%.*s\n", linelength, ptr);
+      }
+
+    rc = 0;    /* Had some success */
+
+    /* Remember where the last match happened for after_context. We remember
+    where we are about to restart, and that line's number. */
+
+    lastmatchrestart = ptr + linelength + 1;
+    lastmatchnumber = linenumber + 1;
+    }
+
+  /* Advance to after the newline and increment the line number. */
+
+  ptr += linelength + 1;
+  linenumber++;
+
+  /* If we haven't yet reached the end of the file (the buffer is full), and
+  the current point is in the top 1/3 of the buffer, slide the buffer down by
+  1/3 and refill it. Before we do this, if some unprinted "after" lines are
+  about to be lost, print them. */
+
+  if (bufflength >= sizeof(buffer) && ptr > buffer + 2*MBUFTHIRD)
+    {
+    if (after_context > 0 &&
+        lastmatchnumber > 0 &&
+        lastmatchrestart < buffer + MBUFTHIRD)
+      {
+      do_after_lines(lastmatchnumber, lastmatchrestart, endptr, printname);
+      lastmatchnumber = 0;
       }
 
-    rc = 0;
+    /* Now do the shuffle */
+
+    memmove(buffer, buffer + MBUFTHIRD, 2*MBUFTHIRD);
+    ptr -= MBUFTHIRD;
+    bufflength = 2*MBUFTHIRD + fread(buffer + 2*MBUFTHIRD, 1, MBUFTHIRD, in);
+    endptr = buffer + bufflength;
+
+    /* Adjust any last match point */
+
+    if (lastmatchnumber > 0) lastmatchrestart -= MBUFTHIRD;
     }
+  }     /* Loop through the whole file */
+
+/* End of file; print final "after" lines if wanted; do_after_lines sets
+hyphenpending if it prints something. */
+
+do_after_lines(lastmatchnumber, lastmatchrestart, endptr, printname);
+hyphenpending |= endhyphenpending;
+
+/* Print the file name if we are looking for those without matches and there
+were none. If we found a match, we won't have got this far. */
+
+if (filenames_nomatch_only)
+  {
+  fprintf(stdout, "%s\n", printname);
+  return 0;
   }
 
+/* Print the match count if wanted */
+
 if (count_only)
   {
-  if (name != NULL) fprintf(stdout, "%s:", name);
+  if (printname != NULL) fprintf(stdout, "%s:", printname);
   fprintf(stdout, "%d\n", count);
   }
 
@@ -314,41 +626,81 @@ return rc;
 
 
 
-
 /*************************************************
 *     Grep a file or recurse into a directory    *
 *************************************************/
 
+/* Given a path name, if it's a directory, scan all the files if we are
+recursing; if it's a file, grep it.
+
+Arguments:
+  pathname          the path to investigate
+  dir_recurse       TRUE if recursing is wanted (-r)
+  show_filenames    TRUE if file names are wanted for multiple files, except
+                      for the only file at top level when not filenames_only
+  only_one_at_top   TRUE if the path is the only one at toplevel
+
+Returns:   0 if there was at least one match
+           1 if there were no matches
+           2 there was some kind of error
+
+However, file opening failures are suppressed if "silent" is set.
+*/
+
 static int
-grep_or_recurse(char *filename, BOOL dir_recurse, BOOL show_filenames,
+grep_or_recurse(char *pathname, BOOL dir_recurse, BOOL show_filenames,
   BOOL only_one_at_top)
 {
 int rc = 1;
 int sep;
 FILE *in;
+char *printname;
+
+/* If the file name is "-" we scan stdin */
+
+if (strcmp(pathname, "-") == 0)
+  {
+  return pcregrep(stdin,
+    (filenames_only || filenames_nomatch_only ||
+    (show_filenames && !only_one_at_top))?
+      stdin_name : NULL);
+  }
 
-/* If the file is a directory and we are recursing, scan each file within it.
-The scanning code is localized so it can be made system-specific. */
+/* If the file is a directory and we are recursing, scan each file within it,
+subject to any include or exclude patterns that were set. The scanning code is
+localized so it can be made system-specific. */
 
-if ((sep = isdirectory(filename)) != 0 && dir_recurse)
+if ((sep = isdirectory(pathname)) != 0 && dir_recurse)
   {
   char buffer[1024];
   char *nextfile;
-  directory_type *dir = opendirectory(filename);
+  directory_type *dir = opendirectory(pathname);
 
   if (dir == NULL)
     {
-    fprintf(stderr, "pcregrep: Failed to open directory %s: %s\n", filename,
-      strerror(errno));
+    if (!silent)
+      fprintf(stderr, "pcregrep: Failed to open directory %s: %s\n", pathname,
+        strerror(errno));
     return 2;
     }
 
   while ((nextfile = readdirectory(dir)) != NULL)
     {
-    int frc;
-    sprintf(buffer, "%.512s%c%.128s", filename, sep, nextfile);
+    int frc, blen;
+    sprintf(buffer, "%.512s%c%.128s", pathname, sep, nextfile);
+    blen = strlen(buffer);
+
+    if (exclude_compiled != NULL &&
+        pcre_exec(exclude_compiled, NULL, buffer, blen, 0, 0, NULL, 0) >= 0)
+      continue;
+
+    if (include_compiled != NULL &&
+        pcre_exec(include_compiled, NULL, buffer, blen, 0, 0, NULL, 0) < 0)
+      continue;
+
     frc = grep_or_recurse(buffer, dir_recurse, TRUE, FALSE);
-    if (frc == 0 && rc == 1) rc = 0;
+    if (frc > 1) rc = frc;
+     else if (frc == 0 && rc == 1) rc = 0;
     }
 
   closedirectory(dir);
@@ -360,15 +712,20 @@ the first and only argument at top level
 we are only showing the file name). Otherwise, control is via the
 show_filenames variable. */
 
-in = fopen(filename, "r");
+in = fopen(pathname, "r");
 if (in == NULL)
   {
-  fprintf(stderr, "pcregrep: Failed to open %s: %s\n", filename, strerror(errno));
+  if (!silent)
+    fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pathname,
+      strerror(errno));
   return 2;
   }
 
-rc = pcregrep(in, (filenames_only || (show_filenames && !only_one_at_top))?
-  filename : NULL);
+printname =  (filenames_only || filenames_nomatch_only ||
+  (show_filenames && !only_one_at_top))? pathname : NULL;
+
+rc = pcregrep(in, printname);
+
 fclose(in);
 return rc;
 }
@@ -383,7 +740,7 @@ return rc;
 static int
 usage(int rc)
 {
-fprintf(stderr, "Usage: pcregrep [-Vcfhilnrsvx] [long-options] [pattern] [file1 file2 ...]\n");
+fprintf(stderr, "Usage: pcregrep [-LMVcfhilnqrsvwx] [long-options] [pattern] [file1 file2 ...]\n");
 fprintf(stderr, "Type `pcregrep --help' for more information.\n");
 return rc;
 }
@@ -403,6 +760,7 @@ option_item *op;
 printf("Usage: pcregrep [OPTION]... [PATTERN] [FILE1 FILE2 ...]\n");
 printf("Search for PATTERN in each FILE or standard input.\n");
 printf("PATTERN must be present if -f is not used.\n");
+printf("\"-\" can be used as a file name to mean STDIN.\n");
 printf("Example: pcregrep -i 'hello.*world' menu.h main.c\n\n");
 
 printf("Options:\n");
@@ -418,12 +776,11 @@ for (op = optionlist; op->one_char != 0;
   printf("%.*s%s\n", n, "                    ", op->help_text);
   }
 
-printf("\n  -f<filename>  or  --file=<filename>\n");
-printf("    Read patterns from <filename> instead of using a command line option.\n");
-printf("    Trailing white space is removed; blanks lines are ignored.\n");
-printf("    There is a maximum of %d patterns.\n", MAX_PATTERN_COUNT);
+printf("\nWhen reading patterns from a file instead of using a command line option,\n");
+printf("trailing white space is removed and blank lines are ignored.\n");
+printf("There is a maximum of %d patterns.\n", MAX_PATTERN_COUNT);
 
-printf("\nWith no FILE, read standard input. If fewer than two FILEs given, assume -h.\n");
+printf("\nWith no FILEs, read standard input. If fewer than two FILEs given, assume -h.\n");
 printf("Exit status is 0 if any matches, 1 if no matches, and 2 if trouble.\n");
 }
 
@@ -431,7 +788,7 @@ printf("Exit status is 0 if any matches,
 
 
 /*************************************************
-*                Handle an option                *
+*    Handle a single-letter, no data option      *
 *************************************************/
 
 static int
@@ -443,13 +800,17 @@ switch(letter)
   case 'c': count_only = TRUE; break;
   case 'h': filenames = FALSE; break;
   case 'i': options |= PCRE_CASELESS; break;
-  case 'l': filenames_only = TRUE;
+  case 'l': filenames_only = TRUE; break;
+  case 'L': filenames_nomatch_only = TRUE; break;
+  case 'M': multiline = TRUE; options |= PCRE_MULTILINE|PCRE_FIRSTLINE; break;
   case 'n': number = TRUE; break;
+  case 'q': quiet = TRUE; break;
   case 'r': recurse = TRUE; break;
   case 's': silent = TRUE; break;
   case 'u': options |= PCRE_UTF8; break;
   case 'v': invert = TRUE; break;
-  case 'x': whole_lines = TRUE; options |= PCRE_ANCHORED; break;
+  case 'w': word_match = TRUE; break;
+  case 'x': whole_lines = TRUE; break;
 
   case 'V':
   fprintf(stderr, "pcregrep version %s using ", VERSION);
@@ -472,6 +833,8 @@ return options;
 *                Main program                    *
 *************************************************/
 
+/* Returns 0 if something matched, 1 if nothing matched, 2 after an error. */
+
 int
 main(int argc, char **argv)
 {
@@ -486,32 +849,83 @@ BOOL only_one_at_top;
 
 for (i = 1; i < argc; i++)
   {
+  option_item *op = NULL;
+  char *option_data = (char *)"";    /* default to keep compiler happy */
+  BOOL longop;
+  BOOL longopwasequals = FALSE;
+
   if (argv[i][0] != '-') break;
 
-  /* Missing options */
+  /* If we hit an argument that is just "-", it may be a reference to STDIN,
+  but only if we have previously had -f to define the patterns. */
 
-  if (argv[i][1] == 0) exit(usage(2));
+  if (argv[i][1] == 0)
+    {
+    if (pattern_filename != NULL) break;
+      else exit(usage(2));
+    }
 
-  /* Long name options */
+  /* Handle a long name option, or -- to terminate the options */
 
   if (argv[i][1] == '-')
     {
-    option_item *op;
+    char *arg = argv[i] + 2;
+    char *argequals = strchr(arg, '=');
 
-    if (strncmp(argv[i]+2, "file=", 5) == 0)
+    if (*arg == 0)    /* -- terminates options */
       {
-      pattern_filename = argv[i] + 7;
-      continue;
+      i++;
+      break;                /* out of the options-handling loop */
       }
 
+    longop = TRUE;
+
+    /* Some long options have data that follows after =, for example file=name.
+    Some options have variations in the long name spelling: specifically, we
+    allow "regexp" because GNU grep allows it, though I personally go along
+    with Jeff Friedl in preferring "regex" without the "p". These options are
+    entered in the table as "regex(p)". No option is in both these categories,
+    fortunately. */
+
     for (op = optionlist; op->one_char != 0; op++)
       {
-      if (strcmp(argv[i]+2, op->long_name) == 0)
+      char *opbra = strchr(op->long_name, '(');
+      char *equals = strchr(op->long_name, '=');
+      if (opbra == NULL)     /* Not a (p) case */
         {
-        options = handle_option(op->one_char, options);
-        break;
+        if (equals == NULL)  /* Not thing=data case */
+          {
+          if (strcmp(arg, op->long_name) == 0) break;
+          }
+        else                 /* Special case xxx=data */
+          {
+          int oplen = equals - op->long_name;
+          int arglen = (argequals == NULL)? strlen(arg) : argequals - arg;
+          if (oplen == arglen && strncmp(arg, op->long_name, oplen) == 0)
+            {
+            option_data = arg + arglen;
+            if (*option_data == '=')
+              {
+              option_data++;
+              longopwasequals = TRUE;
+              }
+            break;
+            }
+          }
+        }
+      else                   /* Special case xxxx(p) */
+        {
+        char buff1[24];
+        char buff2[24];
+        int baselen = opbra - op->long_name;
+        sprintf(buff1, "%.*s", baselen, op->long_name);
+        sprintf(buff2, "%s%.*s", buff1, strlen(op->long_name) - baselen - 2,
+          opbra + 1);
+        if (strcmp(arg, buff1) == 0 || strcmp(arg, buff2) == 0)
+          break;
         }
       }
+
     if (op->one_char == 0)
       {
       fprintf(stderr, "pcregrep: Unknown option %s\n", argv[i]);
@@ -519,34 +933,78 @@ for (i = 1; i < argc; i++)
       }
     }
 
-  /* One-char options */
+  /* One-char options; many that have no data may be in a single argument; we
+  continue till we hit the last one or one that needs data. */
 
   else
     {
     char *s = argv[i] + 1;
+    longop = FALSE;
     while (*s != 0)
       {
-      if (*s == 'f')
+      for (op = optionlist; op->one_char != 0; op++)
+        { if (*s == op->one_char) break; }
+      if (op->one_char == 0)
         {
-        pattern_filename = s + 1;
-        if (pattern_filename[0] == 0)
-          {
-          if (i >= argc - 1)
-            {
-            fprintf(stderr, "pcregrep: File name missing after -f\n");
-            exit(usage(2));
-            }
-          pattern_filename = argv[++i];
-          }
+        fprintf(stderr, "pcregrep: Unknown option letter '%c' in \"%s\"\n",
+          *s, argv[i]);
+        exit(usage(2));
+        }
+      if (op->type != OP_NODATA || s[1] == 0)
+        {
+        option_data = s+1;
         break;
         }
-      else options = handle_option(*s++, options);
+      options = handle_option(*s++, options);
+      }
+    }
+
+  /* At this point we should have op pointing to a matched option */
+
+  if (op->type == OP_NODATA)
+    options = handle_option(op->one_char, options);
+  else
+    {
+    if (*option_data == 0)
+      {
+      if (i >= argc - 1 || longopwasequals)
+        {
+        fprintf(stderr, "pcregrep: Data missing after %s\n", argv[i]);
+        exit(usage(2));
+        }
+      option_data = argv[++i];
+      }
+
+    if (op->type == OP_STRING) *((char **)op->dataptr) = option_data; else
+      {
+      char *endptr;
+      int n = strtoul(option_data, &endptr, 10);
+      if (*endptr != 0)
+        {
+        if (longop)
+          fprintf(stderr, "pcregrep: Malformed number \"%s\" after --%s\n",
+            option_data, op->long_name);
+        else
+          fprintf(stderr, "pcregrep: Malformed number \"%s\" after -%c\n",
+            option_data, op->one_char);
+        exit(usage(2));
+        }
+      *((int *)op->dataptr) = n;
       }
     }
   }
 
-pattern_list = malloc(MAX_PATTERN_COUNT * sizeof(pcre *));
-hints_list = malloc(MAX_PATTERN_COUNT * sizeof(pcre_extra *));
+/* Options have been decoded. If -C was used, its value is used as a default
+for -A and -B. */
+
+if (both_context > 0)
+  {
+  if (after_context == 0) after_context = both_context;
+  if (before_context == 0) before_context = both_context;
+  }
+
+pattern_list = (pcre **)malloc(MAX_PATTERN_COUNT * sizeof(pcre *));
+hints_list = (pcre_extra **)malloc(MAX_PATTERN_COUNT * sizeof(pcre_extra *));
 
 if (pattern_list == NULL || hints_list == NULL)
   {
@@ -559,53 +1017,91 @@ if (pattern_list == NULL || hints_list =
 if (pattern_filename != NULL)
   {
   FILE *f = fopen(pattern_filename, "r");
-  char buffer[BUFSIZ];
+  char buffer[MBUFTHIRD + 16];
+  char *rdstart;
+  int adjust = 0;
+
   if (f == NULL)
     {
     fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pattern_filename,
       strerror(errno));
     return 2;
     }
-  while (fgets(buffer, sizeof(buffer), f) != NULL)
+
+  if (whole_lines)
+    {
+    strcpy(buffer, "^(?:");
+    adjust = 4;
+    }
+  else if (word_match)
     {
-    char *s = buffer + (int)strlen(buffer);
+    strcpy(buffer, "\\b");
+    adjust = 2;
+    }
+
+  rdstart = buffer + adjust;
+  while (fgets(rdstart, MBUFTHIRD, f) != NULL)
+    {
+    char *s = rdstart + (int)strlen(rdstart);
     if (pattern_count >= MAX_PATTERN_COUNT)
       {
       fprintf(stderr, "pcregrep: Too many patterns in file (max %d)\n",
         MAX_PATTERN_COUNT);
       return 2;
       }
-    while (s > buffer && isspace((unsigned char)(s[-1]))) s--;
-    if (s == buffer) continue;
-    *s = 0;
+    while (s > rdstart && isspace((unsigned char)(s[-1]))) s--;
+    if (s == rdstart) continue;
+    if (whole_lines) strcpy(s, ")$");
+      else if (word_match)strcpy(s, "\\b");
+        else *s = 0;
     pattern_list[pattern_count] = pcre_compile(buffer, options, &error,
       &errptr, NULL);
     if (pattern_list[pattern_count++] == NULL)
       {
       fprintf(stderr, "pcregrep: Error in regex number %d at offset %d: %s\n",
-        pattern_count, errptr, error);
+        pattern_count, errptr - adjust, error);
       return 2;
       }
     }
   fclose(f);
   }
 
-/* If no file name, a single regex must be given inline */
+/* If no file name, a single regex must be given inline. */
 
 else
   {
+  char buffer[MBUFTHIRD + 16];
+  char *pat;
+  int adjust = 0;
+
   if (i >= argc) return usage(2);
-  pattern_list[0] = pcre_compile(argv[i++], options, &error, &errptr, NULL);
+
+  if (whole_lines)
+    {
+    sprintf(buffer, "^(?:%.*s)$", MBUFTHIRD, argv[i++]);
+    pat = buffer;
+    adjust = 4;
+    }
+  else if (word_match)
+    {
+    sprintf(buffer, "\\b%.*s\\b", MBUFTHIRD, argv[i++]);
+    pat = buffer;
+    adjust = 2;
+    }
+  else pat = argv[i++];
+
+  pattern_list[0] = pcre_compile(pat, options, &error, &errptr, NULL);
+
   if (pattern_list[0] == NULL)
     {
-    fprintf(stderr, "pcregrep: Error in regex at offset %d: %s\n", errptr,
-      error);
+    fprintf(stderr, "pcregrep: Error in regex at offset %d: %s\n",
+      errptr - adjust, error);
     return 2;
     }
   pattern_count++;
   }
 
-/* Study the regular expressions, as we will be running them may times */
+/* Study the regular expressions, as we will be running them many times */
 
 for (j = 0; j < pattern_count; j++)
   {
@@ -619,24 +1115,50 @@ for (j = 0; j < pattern_count; j++)
     }
   }
 
+/* If there are include or exclude patterns, compile them. */
+
+if (exclude_pattern != NULL)
+  {
+  exclude_compiled = pcre_compile(exclude_pattern, 0, &error, &errptr, NULL);
+  if (exclude_compiled == NULL)
+    {
+    fprintf(stderr, "pcregrep: Error in 'exclude' regex at offset %d: %s\n",
+      errptr, error);
+    return 2;
+    }
+  }
+
+if (include_pattern != NULL)
+  {
+  include_compiled = pcre_compile(include_pattern, 0, &error, &errptr, NULL);
+  if (include_compiled == NULL)
+    {
+    fprintf(stderr, "pcregrep: Error in 'include' regex at offset %d: %s\n",
+      errptr, error);
+    return 2;
+    }
+  }
+
 /* If there are no further arguments, do the business on stdin and exit */
 
-if (i >= argc) return pcregrep(stdin, NULL);
+if (i >= argc) return pcregrep(stdin,
+  (filenames_only || filenames_nomatch_only)? stdin_name : NULL);
 
 /* Otherwise, work through the remaining arguments as files or directories.
 Pass in the fact that there is only one argument at top level - this suppresses
-the file name if the argument is not a directory. */
+the file name if the argument is not a directory and filenames_only is not set.
+*/
 
 only_one_at_top = (i == argc - 1);
-if (filenames_only) filenames = TRUE;
 
 for (; i < argc; i++)
   {
   int frc = grep_or_recurse(argv[i], recurse, filenames, only_one_at_top);
-  if (frc == 0 && rc == 1) rc = 0;
+  if (frc > 1) rc = frc;
+    else if (frc == 0 && rc == 1) rc = 0;
   }
 
 return rc;
 }
 
-/* End */
+/* End of pcregrep */
diff -Nurp tin-1.6.2/pcre/pcreposix.c tin-1.8.0/pcre/pcreposix.c
--- tin-1.6.2/pcre/pcreposix.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/pcreposix.c	2005-09-12 16:41:59.000000000 +0200
@@ -2,103 +2,108 @@
 *      Perl-Compatible Regular Expressions       *
 *************************************************/
 
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
 
-This module is a wrapper that provides a POSIX API to the underlying PCRE
-functions.
+                       Written by Philip Hazel
+           Copyright (c) 1997-2005 University of Cambridge
 
-Written by: Philip Hazel <ph10@cam.ac.uk>
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
 
-           Copyright (c) 1997-2003 University of Cambridge
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
 
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
 -----------------------------------------------------------------------------
 */
 
-#include "internal.h"
+
+/* This module is a wrapper that provides a POSIX API to the underlying PCRE
+functions. */
+
+
+#include "pcre_internal.h"
 #include "pcreposix.h"
 #include "stdlib.h"
 
 
 
-/* Corresponding tables of PCRE error messages and POSIX error codes. */
+/* Table to translate PCRE compile time error codes into POSIX error codes. */
 
-static const char *estring[] = {
-  ERR1,  ERR2,  ERR3,  ERR4,  ERR5,  ERR6,  ERR7,  ERR8,  ERR9,  ERR10,
-  ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, ERR20,
-  ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR29, ERR29, ERR30,
-  ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39, ERR40,
-  ERR41, ERR42, ERR43 };
-
-static int eint[] = {
-  REG_EESCAPE, /* "\\ at end of pattern" */
-  REG_EESCAPE, /* "\\c at end of pattern" */
-  REG_EESCAPE, /* "unrecognized character follows \\" */
-  REG_BADBR,   /* "numbers out of order in {} quantifier" */
-  REG_BADBR,   /* "number too big in {} quantifier" */
-  REG_EBRACK,  /* "missing terminating ] for character class" */
-  REG_ECTYPE,  /* "invalid escape sequence in character class" */
-  REG_ERANGE,  /* "range out of order in character class" */
-  REG_BADRPT,  /* "nothing to repeat" */
-  REG_BADRPT,  /* "operand of unlimited repeat could match the empty string" */
-  REG_ASSERT,  /* "internal error: unexpected repeat" */
-  REG_BADPAT,  /* "unrecognized character after (?" */
-  REG_BADPAT,  /* "POSIX named classes are supported only within a class" */
-  REG_EPAREN,  /* "missing )" */
-  REG_ESUBREG, /* "reference to non-existent subpattern" */
-  REG_INVARG,  /* "erroffset passed as NULL" */
-  REG_INVARG,  /* "unknown option bit(s) set" */
-  REG_EPAREN,  /* "missing ) after comment" */
-  REG_ESIZE,   /* "parentheses nested too deeply" */
-  REG_ESIZE,   /* "regular expression too large" */
-  REG_ESPACE,  /* "failed to get memory" */
-  REG_EPAREN,  /* "unmatched brackets" */
-  REG_ASSERT,  /* "internal error: code overflow" */
-  REG_BADPAT,  /* "unrecognized character after (?<" */
-  REG_BADPAT,  /* "lookbehind assertion is not fixed length" */
-  REG_BADPAT,  /* "malformed number after (?(" */
-  REG_BADPAT,  /* "conditional group containe more than two branches" */
-  REG_BADPAT,  /* "assertion expected after (?(" */
-  REG_BADPAT,  /* "(?R or (?digits must be followed by )" */
-  REG_ECTYPE,  /* "unknown POSIX class name" */
-  REG_BADPAT,  /* "POSIX collating elements are not supported" */
-  REG_INVARG,  /* "this version of PCRE is not compiled with PCRE_UTF8 support" */
-  REG_BADPAT,  /* "spare error" */
-  REG_BADPAT,  /* "character value in \x{...} sequence is too large" */
-  REG_BADPAT,  /* "invalid condition (?(0)" */
-  REG_BADPAT,  /* "\\C not allowed in lookbehind assertion" */
-  REG_EESCAPE, /* "PCRE does not support \\L, \\l, \\N, \\P, \\p, \\U, \\u, or \\X" */
-  REG_BADPAT,  /* "number after (?C is > 255" */
-  REG_BADPAT,  /* "closing ) for (?C expected" */
-  REG_BADPAT,  /* "recursive call could loop indefinitely" */
-  REG_BADPAT,  /* "unrecognized character after (?P" */
-  REG_BADPAT,  /* "syntax error after (?P" */
-  REG_BADPAT   /* "two named groups have the same name" */
+static const int eint[] = {
+  0,           /* no error */
+  REG_EESCAPE, /* \ at end of pattern */
+  REG_EESCAPE, /* \c at end of pattern */
+  REG_EESCAPE, /* unrecognized character follows \ */
+  REG_BADBR,   /* numbers out of order in {} quantifier */
+  REG_BADBR,   /* number too big in {} quantifier */
+  REG_EBRACK,  /* missing terminating ] for character class */
+  REG_ECTYPE,  /* invalid escape sequence in character class */
+  REG_ERANGE,  /* range out of order in character class */
+  REG_BADRPT,  /* nothing to repeat */
+  REG_BADRPT,  /* operand of unlimited repeat could match the empty string */
+  REG_ASSERT,  /* internal error: unexpected repeat */
+  REG_BADPAT,  /* unrecognized character after (? */
+  REG_BADPAT,  /* POSIX named classes are supported only within a class */
+  REG_EPAREN,  /* missing ) */
+  REG_ESUBREG, /* reference to non-existent subpattern */
+  REG_INVARG,  /* erroffset passed as NULL */
+  REG_INVARG,  /* unknown option bit(s) set */
+  REG_EPAREN,  /* missing ) after comment */
+  REG_ESIZE,   /* parentheses nested too deeply */
+  REG_ESIZE,   /* regular expression too large */
+  REG_ESPACE,  /* failed to get memory */
+  REG_EPAREN,  /* unmatched brackets */
+  REG_ASSERT,  /* internal error: code overflow */
+  REG_BADPAT,  /* unrecognized character after (?< */
+  REG_BADPAT,  /* lookbehind assertion is not fixed length */
+  REG_BADPAT,  /* malformed number after (?( */
+  REG_BADPAT,  /* conditional group containe more than two branches */
+  REG_BADPAT,  /* assertion expected after (?( */
+  REG_BADPAT,  /* (?R or (?digits must be followed by ) */
+  REG_ECTYPE,  /* unknown POSIX class name */
+  REG_BADPAT,  /* POSIX collating elements are not supported */
+  REG_INVARG,  /* this version of PCRE is not compiled with PCRE_UTF8 support */
+  REG_BADPAT,  /* spare error */
+  REG_BADPAT,  /* character value in \x{...} sequence is too large */
+  REG_BADPAT,  /* invalid condition (?(0) */
+  REG_BADPAT,  /* \C not allowed in lookbehind assertion */
+  REG_EESCAPE, /* PCRE does not support \L, \l, \N, \U, or \u */
+  REG_BADPAT,  /* number after (?C is > 255 */
+  REG_BADPAT,  /* closing ) for (?C expected */
+  REG_BADPAT,  /* recursive call could loop indefinitely */
+  REG_BADPAT,  /* unrecognized character after (?P */
+  REG_BADPAT,  /* syntax error after (?P */
+  REG_BADPAT,  /* two named groups have the same name */
+  REG_BADPAT,  /* invalid UTF-8 string */
+  REG_BADPAT,  /* support for \P, \p, and \X has not been compiled */
+  REG_BADPAT,  /* malformed \P or \p sequence */
+  REG_BADPAT   /* unknown property name after \P or \p */
 };
 
 /* Table of texts corresponding to POSIX error codes */
 
-static const char *pstring[] = {
+static const char *const pstring[] = {
   "",                                /* Dummy for value 0 */
   "internal error",                  /* REG_ASSERT */
   "invalid repeat counts in {}",     /* BADBR      */
@@ -123,28 +128,10 @@ static const char *pstring[] = {
 
 
 /*************************************************
-*          Translate PCRE text code to int       *
-*************************************************/
-
-/* PCRE compile-time errors are given as strings defined as macros. We can just
-look them up in a table to turn them into POSIX-style error codes. */
-
-static int
-pcre_posix_error_code(const char *s)
-{
-size_t i;
-for (i = 0; i < sizeof(estring)/sizeof(char *); i++)
-  if (strcmp(s, estring[i]) == 0) return eint[i];
-return REG_ASSERT;
-}
-
-
-
-/*************************************************
 *          Translate error code to string        *
 *************************************************/
 
-size_t
+PCRE_EXPORT size_t
 regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
 {
 const char *message, *addmessage;
@@ -179,7 +166,7 @@ return length + addlength;
 *           Free store held by a regex           *
 *************************************************/
 
-void
+PCRE_EXPORT void
 regfree(regex_t *preg)
 {
 (pcre_free)(preg->re_pcre);
@@ -202,22 +189,25 @@ Returns:      0 on success
               various non-zero codes on failure
 */
 
-int
+PCRE_EXPORT int
 regcomp(regex_t *preg, const char *pattern, int cflags)
 {
 const char *errorptr;
 int erroffset;
+int errorcode;
 int options = 0;
 
 if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS;
 if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE;
+if ((cflags & REG_DOTALL) != 0) options |= PCRE_DOTALL;
 
-preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL);
+preg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr,
+  &erroffset, NULL);
 preg->re_erroffset = erroffset;
 
-if (preg->re_pcre == NULL) return pcre_posix_error_code(errorptr);
+if (preg->re_pcre == NULL) return eint[errorcode];
 
-preg->re_nsub = pcre_info(preg->re_pcre, NULL, NULL);
+preg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL);
 return 0;
 }
 
@@ -235,7 +225,7 @@ ints. However, if the number of possible
 block of store on the stack, to reduce the use of malloc/free. The threshold is
 in a macro that can be changed at configure time. */
 
-int
+PCRE_EXPORT int
 regexec(const regex_t *preg, const char *string, size_t nmatch,
   regmatch_t pmatch[], int eflags)
 {
@@ -264,8 +254,8 @@ if (nmatch > 0)
     }
   }
 
-rc = pcre_exec(preg->re_pcre, NULL, string, (int)strlen(string), 0, options,
-  ovector, nmatch * 3);
+rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string, (int)strlen(string),
+  0, options, ovector, nmatch * 3);
 
 if (rc == 0) rc = nmatch;    /* All captured slots were filled in */
 
@@ -293,6 +283,9 @@ else
     case PCRE_ERROR_BADMAGIC: return REG_INVARG;
     case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT;
     case PCRE_ERROR_NOMEMORY: return REG_ESPACE;
+    case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE;
+    case PCRE_ERROR_BADUTF8: return REG_INVARG;
+    case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG;
     default: return REG_ASSERT;
     }
   }
diff -Nurp tin-1.6.2/pcre/pcreposix.h tin-1.8.0/pcre/pcreposix.h
--- tin-1.6.2/pcre/pcreposix.h	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/pcreposix.h	2005-06-28 10:31:26.000000000 +0200
@@ -2,14 +2,43 @@
 *       Perl-Compatible Regular Expressions      *
 *************************************************/
 
-/* Copyright (c) 1997-2003 University of Cambridge */
-
 #ifndef _PCREPOSIX_H
 #define _PCREPOSIX_H
 
 /* This is the header for the POSIX wrapper interface to the PCRE Perl-
 Compatible Regular Expression library. It defines the things POSIX says should
-be there. I hope. */
+be there. I hope.
+
+            Copyright (c) 1997-2005 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
 
 /* Have to include stdlib.h in order to ensure that size_t is defined. */
 
@@ -28,6 +57,10 @@ extern "C" {
 #define REG_NOTBOL    0x04
 #define REG_NOTEOL    0x08
 
+/* Additional options, not defined by POSIX, but somebody wanted them. */
+
+#define REG_DOTALL    0x10
+
 /* These are not used by PCRE, but by defining them we make it easier
 to slot PCRE into existing programs that make POSIX calls. */
 
diff -Nurp tin-1.6.2/pcre/pcretest.c tin-1.8.0/pcre/pcretest.c
--- tin-1.6.2/pcre/pcretest.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/pcretest.c	2005-09-12 16:42:07.000000000 +0200
@@ -4,7 +4,37 @@
 
 /* This program was hacked up as a tester for PCRE. I really should have
 written it more tidily in the first place. Will I ever learn? It has grown and
-been extended and consequently is now rather untidy in places. */
+been extended and consequently is now rather, er, *very* untidy in places.
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of its
+      contributors may be used to endorse or promote products derived from
+      this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
 
 #include <ctype.h>
 #include <stdio.h>
@@ -12,12 +42,38 @@ been extended and consequently is now ra
 #include <stdlib.h>
 #include <time.h>
 #include <locale.h>
-
-/* We need the internal info for displaying the results of pcre_study(). Also
-for getting the opcodes for showing compiled code. */
+#include <errno.h>
 
 #define PCRE_SPY        /* For Win32 build, import data, not export */
-#include "internal.h"
+
+/* We include pcre_internal.h because we need the internal info for displaying
+the results of pcre_study() and we also need to know about the internal
+macros, structures, and other internal data values; pcretest has "inside
+information" compared to a program that strictly follows the PCRE API. */
+
+#include "pcre_internal.h"
+
+/* We need access to the data tables that PCRE uses. So as not to have to keep
+two copies, we include the source file here, changing the names of the external
+symbols to prevent clashes. */
+
+#define _pcre_utf8_table1      utf8_table1
+#define _pcre_utf8_table1_size utf8_table1_size
+#define _pcre_utf8_table2      utf8_table2
+#define _pcre_utf8_table3      utf8_table3
+#define _pcre_utf8_table4      utf8_table4
+#define _pcre_utt              utt
+#define _pcre_utt_size         utt_size
+#define _pcre_OP_lengths       OP_lengths
+
+#include "pcre_tables.c"
+
+/* We also need the pcre_printint() function for printing out compiled
+patterns. This function is in a separate file so that it can be included in
+pcre_compile.c when that module is compiled with debugging enabled. */
+
+#include "pcre_printint.src"
+
 
 /* It is possible to compile this test program without including support for
 testing the POSIX interface, though this is not available via the standard
@@ -27,6 +83,14 @@ Makefile. */
 #include "pcreposix.h"
 #endif
 
+/* It is also possible, for the benefit of the version imported into Exim, to
+build pcretest without support for UTF8 (define NOUTF8), without the interface
+to the DFA matcher (NODFA), and without the doublecheck of the old "info"
+function (define NOINFOCHECK). */
+
+
+/* Other parameters */
+
 #ifndef CLOCKS_PER_SEC
 #ifdef CLK_TCK
 #define CLOCKS_PER_SEC CLK_TCK
@@ -35,12 +99,15 @@ Makefile. */
 #endif
 #endif
 
-#define LOOPREPEAT 50000
+#define LOOPREPEAT 500000
 
 #define BUFFER_SIZE 30000
-#define DBUFFER_SIZE 1024
+#define PBUFFER_SIZE BUFFER_SIZE
+#define DBUFFER_SIZE BUFFER_SIZE
 
 
+/* Static variables */
+
 static FILE *outfile;
 static int log_store = 0;
 static int callout_count;
@@ -48,34 +115,11 @@ static int callout_extra;
 static int callout_fail_count;
 static int callout_fail_id;
 static int first_callout;
+static int show_malloc;
 static int use_utf8;
 static size_t gotten_store;
 
-
-
-static const int utf8_table1[] = {
-  0x0000007f, 0x000007ff, 0x0000ffff, 0x001fffff, 0x03ffffff, 0x7fffffff};
-
-static const int utf8_table2[] = {
-  0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
-
-static const int utf8_table3[] = {
-  0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
-
-
-
-/*************************************************
-*         Print compiled regex                   *
-*************************************************/
-
-/* The code for doing this is held in a separate file that is also included in
-pcre.c when it is compiled with the debug switch. It defines a function called
-print_internals(), which uses a table of opcode lengths defined by the macro
-OP_LENGTHS, whose name must be OP_lengths. */
-
-static uschar OP_lengths[] = { OP_LENGTHS };
-
-#include "printint.c"
+static uschar *pbuffer = NULL;
 
 
 
@@ -106,42 +150,6 @@ return(result);
 
 
 
-/*************************************************
-*       Convert character value to UTF-8         *
-*************************************************/
-
-/* This function takes an integer value in the range 0 - 0x7fffffff
-and encodes it as a UTF-8 character in 0 to 6 bytes.
-
-Arguments:
-  cvalue     the character value
-  buffer     pointer to buffer for result - at least 6 bytes long
-
-Returns:     number of characters placed in the buffer
-             -1 if input character is negative
-             0 if input character is positive but too big (only when
-             int is longer than 32 bits)
-*/
-
-static int
-ord2utf8(int cvalue, unsigned char *buffer)
-{
-register int i, j;
-for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
-  if (cvalue <= utf8_table1[i]) break;
-if (i >= sizeof(utf8_table1)/sizeof(int)) return 0;
-if (cvalue < 0) return -1;
-
-buffer += i;
-for (j = i; j > 0; j--)
- {
- *buffer-- = 0x80 | (cvalue & 0x3f);
- cvalue >>= 6;
- }
-*buffer = utf8_table2[i] | cvalue;
-return i + 1;
-}
-
 
 /*************************************************
 *            Convert UTF-8 string to value       *
@@ -158,6 +166,8 @@ Returns:   >  0 => the number of bytes c
            -6 to 0 => malformed UTF-8 character at offset = (-return)
 */
 
+#if !defined NOUTF8
+
 static int
 utf82ord(unsigned char *buffer, int *vptr)
 {
@@ -189,7 +199,7 @@ for (j = 0; j < i; j++)
 
 /* Check that encoding was the correct unique one */
 
-for (j = 0; j < sizeof(utf8_table1)/sizeof(int); j++)
+for (j = 0; j < utf8_table1_size; j++)
   if (d <= utf8_table1[j]) break;
 if (j != i) return -(i+1);
 
@@ -199,6 +209,40 @@ if (j != i) return -(i+1);
 return i+1;
 }
 
+#endif
+
+
+
+/*************************************************
+*       Convert character value to UTF-8         *
+*************************************************/
+
+/* This function takes an integer value in the range 0 - 0x7fffffff
+and encodes it as a UTF-8 character in 0 to 6 bytes.
+
+Arguments:
+  cvalue     the character value
+  buffer     pointer to buffer for result - at least 6 bytes long
+
+Returns:     number of characters placed in the buffer
+*/
+
+static int
+ord2utf8(int cvalue, uschar *buffer)
+{
+register int i, j;
+for (i = 0; i < utf8_table1_size; i++)
+  if (cvalue <= utf8_table1[i]) break;
+buffer += i;
+for (j = i; j > 0; j--)
+ {
+ *buffer-- = 0x80 | (cvalue & 0x3f);
+ cvalue >>= 6;
+ }
+*buffer = utf8_table2[i] | cvalue;
+return i + 1;
+}
+
 
 
 /*************************************************
@@ -211,11 +255,12 @@ chars without printing. */
 
 static int pchars(unsigned char *p, int length, FILE *f)
 {
-int c;
+int c = 0;
 int yield = 0;
 
 while (length-- > 0)
   {
+#if !defined NOUTF8
   if (use_utf8)
     {
     int rc = utf82ord(p, &c);
@@ -238,6 +283,7 @@ while (length-- > 0)
       continue;
       }
     }
+#endif
 
    /* Not UTF-8, or malformed UTF-8  */
 
@@ -269,7 +315,7 @@ data is not zero. */
 static int callout(pcre_callout_block *cb)
 {
 FILE *f = (first_callout | callout_extra)? outfile : NULL;
-int i, pre_start, post_start;
+int i, pre_start, post_start, subject_length;
 
 if (callout_extra)
   {
@@ -300,16 +346,26 @@ pre_start = pchars((unsigned char *)cb->
 post_start = pchars((unsigned char *)(cb->subject + cb->start_match),
   cb->current_position - cb->start_match, f);
 
+subject_length = pchars((unsigned char *)cb->subject, cb->subject_length, NULL);
+
 (void)pchars((unsigned char *)(cb->subject + cb->current_position),
   cb->subject_length - cb->current_position, f);
 
 if (f != NULL) fprintf(f, "\n");
 
 /* Always print appropriate indicators, with callout number if not already
-shown */
+shown. For automatic callouts, show the pattern offset. */
 
-if (callout_extra) fprintf(outfile, "    ");
-  else fprintf(outfile, "%3d ", cb->callout_number);
+if (cb->callout_number == 255)
+  {
+  fprintf(outfile, "%+3d ", cb->pattern_position);
+  if (cb->pattern_position > 99) fprintf(outfile, "\n    ");
+  }
+else
+  {
+  if (callout_extra) fprintf(outfile, "    ");
+    else fprintf(outfile, "%3d ", cb->callout_number);
+  }
 
 for (i = 0; i < pre_start; i++) fprintf(outfile, " ");
 fprintf(outfile, "^");
@@ -320,14 +376,23 @@ if (post_start > 0)
   fprintf(outfile, "^");
   }
 
-fprintf(outfile, "\n");
+for (i = 0; i < subject_length - pre_start - post_start + 4; i++)
+  fprintf(outfile, " ");
 
+fprintf(outfile, "%.*s", (cb->next_item_length == 0)? 1 : cb->next_item_length,
+  pbuffer + cb->pattern_position);
+
+fprintf(outfile, "\n");
 first_callout = 0;
 
-if ((int)(cb->callout_data) != 0)
+if (cb->callout_data != NULL)
   {
-  fprintf(outfile, "Callout data = %d\n", (int)(cb->callout_data));
-  return (int)(cb->callout_data);
+  int callout_data = *((int *)(cb->callout_data));
+  if (callout_data != 0)
+    {
+    fprintf(outfile, "Callout data = %d\n", callout_data);
+    return callout_data;
+    }
   }
 
 return (cb->callout_number != callout_fail_id)? 0 :
@@ -336,7 +401,7 @@ return (cb->callout_number != callout_fa
 
 
 /*************************************************
-*            Local malloc function               *
+*            Local malloc functions              *
 *************************************************/
 
 /* Alternative malloc function, to test functionality and show the size of the
@@ -344,11 +409,38 @@ compiled re. */
 
 static void *new_malloc(size_t size)
 {
+void *block = malloc(size);
 gotten_store = size;
-return malloc(size);
+if (show_malloc)
+  fprintf(outfile, "malloc       %3d %p\n", (int)size, block);
+return block;
+}
+
+static void new_free(void *block)
+{
+if (show_malloc)
+  fprintf(outfile, "free             %p\n", block);
+free(block);
 }
 
 
+/* For recursion malloc/free, to test stacking calls */
+
+static void *stack_malloc(size_t size)
+{
+void *block = malloc(size);
+if (show_malloc)
+  fprintf(outfile, "stack_malloc %3d %p\n", (int)size, block);
+return block;
+}
+
+static void stack_free(void *block)
+{
+if (show_malloc)
+  fprintf(outfile, "stack_free       %p\n", block);
+free(block);
+}
+
 
 /*************************************************
 *          Call pcre_fullinfo()                  *
@@ -366,6 +458,23 @@ if ((rc = pcre_fullinfo(re, study, optio
 
 
 /*************************************************
+*         Byte flipping function                 *
+*************************************************/
+
+static long int
+byteflip(long int value, int n)
+{
+if (n == 2) return ((value & 0x00ff) << 8) | ((value & 0xff00) >> 8);
+return ((value & 0x000000ff) << 24) |
+       ((value & 0x0000ff00) <<  8) |
+       ((value & 0x00ff0000) >>  8) |
+       ((value & 0xff000000) >> 24);
+}
+
+
+
+
+/*************************************************
 *                Main Program                    *
 *************************************************/
 
@@ -384,12 +493,14 @@ int showinfo = 0;
 int showstore = 0;
 int size_offsets = 45;
 int size_offsets_max;
-int *offsets;
+int *offsets = NULL;
 #if !defined NOPOSIX
 int posix = 0;
 #endif
 int debug = 0;
 int done = 0;
+int all_use_dfa = 0;
+int yield = 0;
 
 unsigned char *buffer;
 unsigned char *dbuffer;
@@ -397,10 +508,17 @@ unsigned char *dbuffer;
 /* Get buffers from malloc() so that Electric Fence will check their misuse
 when I am debugging. */
 
-buffer = malloc(BUFFER_SIZE);
-dbuffer = malloc(DBUFFER_SIZE);
-
-/* Static so that new_malloc can use it. */
+buffer = (unsigned char *)malloc(BUFFER_SIZE);
+dbuffer = (unsigned char *)malloc(DBUFFER_SIZE);
+pbuffer = (unsigned char *)malloc(PBUFFER_SIZE);
+
+/* The outfile variable is static so that new_malloc can use it. The _setmode()
+stuff is some magic that I don't understand, but which apparently does good
+things in Windows. It's related to line terminations.  */
+
+#if defined(_WIN32) || defined(WIN32)
+_setmode( _fileno( stdout ), 0x8000 );
+#endif  /* defined(_WIN32) || defined(WIN32) */
 
 outfile = stdout;
 
@@ -415,6 +533,9 @@ while (argc > 1 && argv[op][0] == '-')
   else if (strcmp(argv[op], "-t") == 0) timeit = 1;
   else if (strcmp(argv[op], "-i") == 0) showinfo = 1;
   else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1;
+#if !defined NODFA
+  else if (strcmp(argv[op], "-dfa") == 0) all_use_dfa = 1;
+#endif
   else if (strcmp(argv[op], "-o") == 0 && argc > 2 &&
       ((size_offsets = get_value((unsigned char *)argv[op+1], &endptr)),
         *endptr == 0))
@@ -432,6 +553,8 @@ while (argc > 1 && argv[op][0] == '-')
     printf("Compiled with\n");
     (void)pcre_config(PCRE_CONFIG_UTF8, &rc);
     printf("  %sUTF-8 support\n", rc? "" : "No ");
+    (void)pcre_config(PCRE_CONFIG_UNICODE_PROPERTIES, &rc);
+    printf("  %sUnicode properties support\n", rc? "" : "No ");
     (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);
     printf("  Newline character is %s\n", (rc == '\r')? "CR" : "LF");
     (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);
@@ -440,6 +563,8 @@ while (argc > 1 && argv[op][0] == '-')
     printf("  POSIX malloc threshold = %d\n", rc);
     (void)pcre_config(PCRE_CONFIG_MATCH_LIMIT, &rc);
     printf("  Default match limit = %d\n", rc);
+    (void)pcre_config(PCRE_CONFIG_STACKRECURSE, &rc);
+    printf("  Match recursion uses %s\n", rc? "stack" : "heap");
     exit(0);
     }
   else
@@ -447,15 +572,20 @@ while (argc > 1 && argv[op][0] == '-')
     printf("** Unknown or malformed option %s\n", argv[op]);
     printf("Usage:   pcretest [-d] [-i] [-o <n>] [-p] [-s] [-t] [<input> [<output>]]\n");
     printf("  -C     show PCRE compile-time options and exit\n");
-    printf("  -d     debug: show compiled code; implies -i\n"
-           "  -i     show information about compiled pattern\n"
+    printf("  -d     debug: show compiled code; implies -i\n");
+#if !defined NODFA
+    printf("  -dfa   force DFA matching for all subjects\n");
+#endif
+    printf("  -i     show information about compiled pattern\n"
+           "  -m     output memory used information\n"
            "  -o <n> set size of offsets vector to <n>\n");
 #if !defined NOPOSIX
     printf("  -p     use POSIX interface\n");
 #endif
-    printf("  -s     output store information\n"
+    printf("  -s     output store (memory) used information\n"
            "  -t     time compilation and execution\n");
-    return 1;
+    yield = 1;
+    goto EXIT;
     }
   op++;
   argc--;
@@ -464,39 +594,45 @@ while (argc > 1 && argv[op][0] == '-')
 /* Get the store for the offsets vector, and remember what it was */
 
 size_offsets_max = size_offsets;
-offsets = malloc(size_offsets_max * sizeof(int));
+offsets = (int *)malloc(size_offsets_max * sizeof(int));
 if (offsets == NULL)
   {
   printf("** Failed to get %d bytes of memory for offsets vector\n",
     size_offsets_max * sizeof(int));
-  return 1;
+  yield = 1;
+  goto EXIT;
   }
 
 /* Sort out the input and output files */
 
 if (argc > 1)
   {
-  infile = fopen(argv[op], "r");
+  infile = fopen(argv[op], "rb");
   if (infile == NULL)
     {
     printf("** Failed to open %s\n", argv[op]);
-    return 1;
+    yield = 1;
+    goto EXIT;
     }
   }
 
 if (argc > 2)
   {
-  outfile = fopen(argv[op+1], "w");
+  outfile = fopen(argv[op+1], "wb");
   if (outfile == NULL)
     {
     printf("** Failed to open %s\n", argv[op+1]);
-    return 1;
+    yield = 1;
+    goto EXIT;
     }
   }
 
 /* Set alternative malloc function */
 
 pcre_malloc = new_malloc;
+pcre_free = new_free;
+pcre_stack_malloc = stack_malloc;
+pcre_stack_free = stack_free;
 
 /* Heading line, then prompt for first regex if stdin */
 
@@ -516,13 +652,17 @@ while (!done)
 
   const char *error;
   unsigned char *p, *pp, *ppp;
+  unsigned char *to_file = NULL;
   const unsigned char *tables = NULL;
+  unsigned long int true_size, true_study_size = 0;
+  size_t size, regex_gotten_store;
   int do_study = 0;
   int do_debug = debug;
   int do_G = 0;
   int do_g = 0;
   int do_showinfo = showinfo;
   int do_showrest = 0;
+  int do_flip = 0;
   int erroroffset, len, delimiter;
 
   use_utf8 = 0;
@@ -536,8 +676,93 @@ while (!done)
   while (isspace(*p)) p++;
   if (*p == 0) continue;
 
-  /* Get the delimiter and seek the end of the pattern; if is isn't
-  complete, read more. */
+  /* See if the pattern is to be loaded pre-compiled from a file. */
+
+  if (*p == '<' && strchr((char *)(p+1), '<') == NULL)
+    {
+    unsigned long int magic;
+    uschar sbuf[8];
+    FILE *f;
+
+    p++;
+    pp = p + (int)strlen((char *)p);
+    while (isspace(pp[-1])) pp--;
+    *pp = 0;
+
+    f = fopen((char *)p, "rb");
+    if (f == NULL)
+      {
+      fprintf(outfile, "Failed to open %s: %s\n", p, strerror(errno));
+      continue;
+      }
+
+    if (fread(sbuf, 1, 8, f) != 8) goto FAIL_READ;
+
+    true_size =
+      (sbuf[0] << 24) | (sbuf[1] << 16) | (sbuf[2] << 8) | sbuf[3];
+    true_study_size =
+      (sbuf[4] << 24) | (sbuf[5] << 16) | (sbuf[6] << 8) | sbuf[7];
+
+    re = (real_pcre *)new_malloc(true_size);
+    regex_gotten_store = gotten_store;
+
+    if (fread(re, 1, true_size, f) != true_size) goto FAIL_READ;
+
+    magic = ((real_pcre *)re)->magic_number;
+    if (magic != MAGIC_NUMBER)
+      {
+      if (byteflip(magic, sizeof(magic)) == MAGIC_NUMBER)
+        {
+        do_flip = 1;
+        }
+      else
+        {
+        fprintf(outfile, "Data in %s is not a compiled PCRE regex\n", p);
+        fclose(f);
+        continue;
+        }
+      }
+
+    fprintf(outfile, "Compiled regex%s loaded from %s\n",
+      do_flip? " (byte-inverted)" : "", p);
+
+    /* Need to know if UTF-8 for printing data strings */
+
+    new_info(re, NULL, PCRE_INFO_OPTIONS, &options);
+    use_utf8 = (options & PCRE_UTF8) != 0;
+
+    /* Now see if there is any following study data */
+
+    if (true_study_size != 0)
+      {
+      pcre_study_data *psd;
+
+      extra = (pcre_extra *)new_malloc(sizeof(pcre_extra) + true_study_size);
+      extra->flags = PCRE_EXTRA_STUDY_DATA;
+
+      psd = (pcre_study_data *)(((char *)extra) + sizeof(pcre_extra));
+      extra->study_data = psd;
+
+      if (fread(psd, 1, true_study_size, f) != true_study_size)
+        {
+        FAIL_READ:
+        fprintf(outfile, "Failed to read data from %s\n", p);
+        if (extra != NULL) new_free(extra);
+        if (re != NULL) new_free(re);
+        fclose(f);
+        continue;
+        }
+      fprintf(outfile, "Study data loaded from %s\n", p);
+      do_study = 1;     /* To get the data output if requested */
+      }
+    else fprintf(outfile, "No study data\n");
+
+    fclose(f);
+    goto SHOW_INFO;
+    }
+
+  /* In-line pattern (the usual case). Get the delimiter and seek the end of
+  the pattern; if is isn't complete, read more. */
 
   delimiter = *p++;
 
@@ -582,9 +807,11 @@ while (!done)
 
   if (pp[1] == '\\') *pp++ = '\\';
 
-  /* Terminate the pattern at the delimiter */
+  /* Terminate the pattern at the delimiter, and save a copy of the pattern
+  for callouts. */
 
   *pp++ = 0;
+  strcpy((char *)pbuffer, (char *)p);
 
   /* Look for options after final delimiter */
 
@@ -596,6 +823,7 @@ while (!done)
     {
     switch (*pp++)
       {
+      case 'f': options |= PCRE_FIRSTLINE; break;
       case 'g': do_g = 1; break;
       case 'i': options |= PCRE_CASELESS; break;
       case 'm': options |= PCRE_MULTILINE; break;
@@ -604,8 +832,10 @@ while (!done)
 
       case '+': do_showrest = 1; break;
       case 'A': options |= PCRE_ANCHORED; break;
+      case 'C': options |= PCRE_AUTO_CALLOUT; break;
       case 'D': do_debug = do_showinfo = 1; break;
       case 'E': options |= PCRE_DOLLAR_ENDONLY; break;
+      case 'F': do_flip = 1; break;
       case 'G': do_G = 1; break;
       case 'I': do_showinfo = 1; break;
       case 'M': log_store = 1; break;
@@ -619,10 +849,12 @@ while (!done)
       case 'U': options |= PCRE_UNGREEDY; break;
       case 'X': options |= PCRE_EXTRA; break;
       case '8': options |= PCRE_UTF8; use_utf8 = 1; break;
+      case '?': options |= PCRE_NO_UTF8_CHECK; break;
 
       case 'L':
       ppp = pp;
-      while (*ppp != '\n' && *ppp != ' ') ppp++;
+      /* The '\r' test here is so that it works on Windows */
+      while (*ppp != '\n' && *ppp != '\r' && *ppp != ' ') ppp++;
       *ppp = 0;
       if (setlocale(LC_CTYPE, (const char *)pp) == NULL)
         {
@@ -633,7 +865,18 @@ while (!done)
       pp = ppp;
       break;
 
-      case '\n': case ' ': break;
+      case '>':
+      to_file = pp;
+      while (*pp != 0) pp++;
+      while (isspace(pp[-1])) pp--;
+      *pp = 0;
+      break;
+
+      case '\r':                      /* So that it works in Windows */
+      case '\n':
+      case ' ':
+      break;
+
       default:
       fprintf(outfile, "** Unknown option '%c'\n", pp[-1]);
       goto SKIP_DATA;
@@ -649,8 +892,10 @@ while (!done)
     {
     int rc;
     int cflags = 0;
+
     if ((options & PCRE_CASELESS) != 0) cflags |= REG_ICASE;
     if ((options & PCRE_MULTILINE) != 0) cflags |= REG_NEWLINE;
+    if ((options & PCRE_DOTALL) != 0) cflags |= REG_DOTALL;
     rc = regcomp(&preg, (char *)p, cflags);
 
     /* Compilation failed; go back for another re, skipping to blank line
@@ -723,19 +968,84 @@ while (!done)
               sizeof(real_pcre) -
               ((real_pcre *)re)->name_count * ((real_pcre *)re)->name_entry_size));
 
+    /* Extract the size for possible writing before possibly flipping it,
+    and remember the store that was got. */
+
+    true_size = ((real_pcre *)re)->size;
+    regex_gotten_store = gotten_store;
+
+    /* If /S was present, study the regexp to generate additional info to
+    help with the matching. */
+
+    if (do_study)
+      {
+      if (timeit)
+        {
+        register int i;
+        clock_t time_taken;
+        clock_t start_time = clock();
+        for (i = 0; i < LOOPREPEAT; i++)
+          extra = pcre_study(re, study_options, &error);
+        time_taken = clock() - start_time;
+        if (extra != NULL) free(extra);
+        fprintf(outfile, "  Study time %.3f milliseconds\n",
+          (((double)time_taken * 1000.0) / (double)LOOPREPEAT) /
+            (double)CLOCKS_PER_SEC);
+        }
+      extra = pcre_study(re, study_options, &error);
+      if (error != NULL)
+        fprintf(outfile, "Failed to study: %s\n", error);
+      else if (extra != NULL)
+        true_study_size = ((pcre_study_data *)(extra->study_data))->size;
+      }
+
+    /* If the 'F' option was present, we flip the bytes of all the integer
+    fields in the regex data block and the study block. This is to make it
+    possible to test PCRE's handling of byte-flipped patterns, e.g. those
+    compiled on a different architecture. */
+
+    if (do_flip)
+      {
+      real_pcre *rre = (real_pcre *)re;
+      rre->magic_number = byteflip(rre->magic_number, sizeof(rre->magic_number));
+      rre->size = byteflip(rre->size, sizeof(rre->size));
+      rre->options = byteflip(rre->options, sizeof(rre->options));
+      rre->top_bracket = byteflip(rre->top_bracket, sizeof(rre->top_bracket));
+      rre->top_backref = byteflip(rre->top_backref, sizeof(rre->top_backref));
+      rre->first_byte = byteflip(rre->first_byte, sizeof(rre->first_byte));
+      rre->req_byte = byteflip(rre->req_byte, sizeof(rre->req_byte));
+      rre->name_table_offset = byteflip(rre->name_table_offset,
+        sizeof(rre->name_table_offset));
+      rre->name_entry_size = byteflip(rre->name_entry_size,
+        sizeof(rre->name_entry_size));
+      rre->name_count = byteflip(rre->name_count, sizeof(rre->name_count));
+
+      if (extra != NULL)
+        {
+        pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);
+        rsd->size = byteflip(rsd->size, sizeof(rsd->size));
+        rsd->options = byteflip(rsd->options, sizeof(rsd->options));
+        }
+      }
+
+    /* Extract information from the compiled data if required */
+
+    SHOW_INFO:
+
     if (do_showinfo)
       {
-      unsigned long int get_options;
+      unsigned long int get_options, all_options;
+#if !defined NOINFOCHECK
       int old_first_char, old_options, old_count;
+#endif
       int count, backrefmax, first_char, need_char;
       int nameentrysize, namecount;
       const uschar *nametable;
-      size_t size;
 
       if (do_debug)
         {
         fprintf(outfile, "------------------------------------------------------------------\n");
-        print_internals(re, outfile);
+        pcre_printint(re, outfile);
         }
 
       new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options);
@@ -748,6 +1058,7 @@ while (!done)
       new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);
       new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);
 
+#if !defined NOINFOCHECK
       old_count = pcre_info(re, &old_options, &old_first_char);
       if (count < 0) fprintf(outfile,
         "Error %d from pcre_info()\n", count);
@@ -765,10 +1076,11 @@ while (!done)
           "Options disagreement: pcre_fullinfo=%ld pcre_info=%d\n",
             get_options, old_options);
         }
+#endif
 
-      if (size != gotten_store) fprintf(outfile,
+      if (size != regex_gotten_store) fprintf(outfile,
         "Size disagreement: pcre_fullinfo=%d call to malloc for %d\n",
-        size, gotten_store);
+        (int)size, (int)regex_gotten_store);
 
       fprintf(outfile, "Capturing subpattern count = %d\n", count);
       if (backrefmax > 0)
@@ -786,17 +1098,31 @@ while (!done)
           }
         }
 
+      /* The NOPARTIAL bit is a private bit in the options, so we have
+      to fish it out via out back door */
+
+      all_options = ((real_pcre *)re)->options;
+      if (do_flip)
+        {
+        all_options = byteflip(all_options, sizeof(all_options));
+        }
+
+      if ((all_options & PCRE_NOPARTIAL) != 0)
+        fprintf(outfile, "Partial matching not supported\n");
+
       if (get_options == 0) fprintf(outfile, "No options\n");
-        else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s\n",
+        else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s%s%s\n",
           ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",
           ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",
           ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",
           ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "",
+          ((get_options & PCRE_FIRSTLINE) != 0)? " firstline" : "",
           ((get_options & PCRE_DOTALL) != 0)? " dotall" : "",
           ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",
           ((get_options & PCRE_EXTRA) != 0)? " extra" : "",
           ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",
-          ((get_options & PCRE_UTF8) != 0)? " utf8" : "");
+          ((get_options & PCRE_UTF8) != 0)? " utf8" : "",
+          ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "");
 
       if (((((real_pcre *)re)->options) & PCRE_ICHANGED) != 0)
         fprintf(outfile, "Case state changes\n");
@@ -834,73 +1160,107 @@ while (!done)
         else
           fprintf(outfile, "Need char = %d%s\n", ch, caseless);
         }
-      }
 
-    /* If /S was present, study the regexp to generate additional info to
-    help with the matching. */
+      /* Don't output study size; at present it is in any case a fixed
+      value, but it varies, depending on the computer architecture, and
+      so messes up the test suite. (And with the /F option, it might be
+      flipped.) */
 
-    if (do_study)
-      {
-      if (timeit)
+      if (do_study)
         {
-        register int i;
-        clock_t time_taken;
-        clock_t start_time = clock();
-        for (i = 0; i < LOOPREPEAT; i++)
-          extra = pcre_study(re, study_options, &error);
-        time_taken = clock() - start_time;
-        if (extra != NULL) free(extra);
-        fprintf(outfile, "  Study time %.3f milliseconds\n",
-          (((double)time_taken * 1000.0) / (double)LOOPREPEAT) /
-            (double)CLOCKS_PER_SEC);
+        if (extra == NULL)
+          fprintf(outfile, "Study returned NULL\n");
+        else
+          {
+          uschar *start_bits = NULL;
+          new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits);
+
+          if (start_bits == NULL)
+            fprintf(outfile, "No starting byte set\n");
+          else
+            {
+            int i;
+            int c = 24;
+            fprintf(outfile, "Starting byte set: ");
+            for (i = 0; i < 256; i++)
+              {
+              if ((start_bits[i/8] & (1<<(i&7))) != 0)
+                {
+                if (c > 75)
+                  {
+                  fprintf(outfile, "\n  ");
+                  c = 2;
+                  }
+                if (isprint(i) && i != ' ')
+                  {
+                  fprintf(outfile, "%c ", i);
+                  c += 2;
+                  }
+                else
+                  {
+                  fprintf(outfile, "\\x%02x ", i);
+                  c += 5;
+                  }
+                }
+              }
+            fprintf(outfile, "\n");
+            }
+          }
         }
+      }
 
-      extra = pcre_study(re, study_options, &error);
-      if (error != NULL)
-        fprintf(outfile, "Failed to study: %s\n", error);
-      else if (extra == NULL)
-        fprintf(outfile, "Study returned NULL\n");
+    /* If the '>' option was present, we write out the regex to a file, and
+    that is all. The first 8 bytes of the file are the regex length and then
+    the study length, in big-endian order. */
 
-      else if (do_showinfo)
+    if (to_file != NULL)
+      {
+      FILE *f = fopen((char *)to_file, "wb");
+      if (f == NULL)
+        {
+        fprintf(outfile, "Unable to open %s: %s\n", to_file, strerror(errno));
+        }
+      else
         {
-        size_t size;
-        uschar *start_bits = NULL;
-        new_info(re, extra, PCRE_INFO_STUDYSIZE, &size);
-        new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits);
-        fprintf(outfile, "Study size = %d\n", size);
-        if (start_bits == NULL)
-          fprintf(outfile, "No starting character set\n");
+        uschar sbuf[8];
+        sbuf[0] = (true_size >> 24)  & 255;
+        sbuf[1] = (true_size >> 16)  & 255;
+        sbuf[2] = (true_size >>  8)  & 255;
+        sbuf[3] = (true_size)  & 255;
+
+        sbuf[4] = (true_study_size >> 24)  & 255;
+        sbuf[5] = (true_study_size >> 16)  & 255;
+        sbuf[6] = (true_study_size >>  8)  & 255;
+        sbuf[7] = (true_study_size)  & 255;
+
+        if (fwrite(sbuf, 1, 8, f) < 8 ||
+            fwrite(re, 1, true_size, f) < true_size)
+          {
+          fprintf(outfile, "Write error on %s: %s\n", to_file, strerror(errno));
+          }
         else
           {
-          int i;
-          int c = 24;
-          fprintf(outfile, "Starting character set: ");
-          for (i = 0; i < 256; i++)
+          fprintf(outfile, "Compiled regex written to %s\n", to_file);
+          if (extra != NULL)
             {
-            if ((start_bits[i/8] & (1<<(i%8))) != 0)
+            if (fwrite(extra->study_data, 1, true_study_size, f) <
+                true_study_size)
               {
-              if (c > 75)
-                {
-                fprintf(outfile, "\n  ");
-                c = 2;
-                }
-              if (isprint(i) && i != ' ')
-                {
-                fprintf(outfile, "%c ", i);
-                c += 2;
-                }
-              else
-                {
-                fprintf(outfile, "\\x%02x ", i);
-                c += 5;
-                }
+              fprintf(outfile, "Write error on %s: %s\n", to_file,
+                strerror(errno));
               }
+            else fprintf(outfile, "Study data written to %s\n", to_file);
             }
-          fprintf(outfile, "\n");
           }
+        fclose(f);
         }
+
+      new_free(re);
+      if (extra != NULL) new_free(extra);
+      if (tables != NULL) new_free((void *)tables);
+      continue;  /* With next regex */
       }
-    }
+    }        /* End of non-POSIX compile */
 
   /* Read data lines and test them */
 
@@ -920,6 +1280,7 @@ while (!done)
     int gmatched = 0;
     int start_offset = 0;
     int g_notempty = 0;
+    int use_dfa = 0;
 
     options = 0;
 
@@ -929,6 +1290,7 @@ while (!done)
     callout_count = 0;
     callout_fail_count = 999999;
     callout_fail_id = -1;
+    show_malloc = 0;
 
     if (infile == stdin) printf("data> ");
     if (fgets((char *)buffer, BUFFER_SIZE, infile) == NULL)
@@ -974,6 +1336,7 @@ while (!done)
 
         /* Handle \x{..} specially - new Perl thing for utf8 */
 
+#if !defined NOUTF8
         if (*p == '{')
           {
           unsigned char *pt = p;
@@ -992,6 +1355,7 @@ while (!done)
             }
           /* Not correct form; fall through */
           }
+#endif
 
         /* Ordinary \x */
 
@@ -1003,10 +1367,14 @@ while (!done)
           }
         break;
 
-        case 0:   /* Allows for an empty line */
+        case 0:   /* \ followed by EOF allows for an empty line */
         p--;
         continue;
 
+        case '>':
+        while(isdigit(*p)) start_offset = start_offset * 10 + *p++ - '0';
+        continue;
+
         case 'A':  /* Option setting */
         options |= PCRE_ANCHORED;
         continue;
@@ -1068,6 +1436,21 @@ while (!done)
           }
         continue;
 
+#if !defined NODFA
+        case 'D':
+#if !defined NOPOSIX
+        if (posix || do_posix)
+          printf("** Can't use dfa matching in POSIX mode: \\D ignored\n");
+        else
+#endif
+          use_dfa = 1;
+        continue;
+
+        case 'F':
+        options |= PCRE_DFA_SHORTEST;
+        continue;
+#endif
+
         case 'G':
         if (isdigit(*p))
           {
@@ -1105,27 +1488,52 @@ while (!done)
           {
           size_offsets_max = n;
           free(offsets);
-          use_offsets = offsets = malloc(size_offsets_max * sizeof(int));
+          use_offsets = offsets = (int *)malloc(size_offsets_max * sizeof(int));
           if (offsets == NULL)
             {
             printf("** Failed to get %d bytes of memory for offsets vector\n",
               size_offsets_max * sizeof(int));
-            return 1;
+            yield = 1;
+            goto EXIT;
             }
           }
         use_size_offsets = n;
         if (n == 0) use_offsets = NULL;   /* Ensures it can't write to it */
         continue;
 
+        case 'P':
+        options |= PCRE_PARTIAL;
+        continue;
+
+#if !defined NODFA
+        case 'R':
+        options |= PCRE_DFA_RESTART;
+        continue;
+#endif
+
+        case 'S':
+        show_malloc = 1;
+        continue;
+
         case 'Z':
         options |= PCRE_NOTEOL;
         continue;
+
+        case '?':
+        options |= PCRE_NO_UTF8_CHECK;
+        continue;
         }
       *q++ = c;
       }
     *q = 0;
     len = q - dbuffer;
 
+    if ((all_use_dfa || use_dfa) && find_match_limit)
+      {
+      printf("**Match limit not relevant for DFA matching: ignored\n");
+      find_match_limit = 0;
+      }
+
     /* Handle matching via the POSIX interface, which does not
     support timing or playing with the match limit or callout data. */
 
@@ -1136,7 +1544,7 @@ while (!done)
       int eflags = 0;
       regmatch_t *pmatch = NULL;
       if (use_size_offsets > 0)
-        pmatch = malloc(sizeof(regmatch_t) * use_size_offsets);
+        pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * use_size_offsets);
       if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;
       if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;
 
@@ -1183,9 +1591,23 @@ while (!done)
         register int i;
         clock_t time_taken;
         clock_t start_time = clock();
+
+#if !defined NODFA
+        if (all_use_dfa || use_dfa)
+          {
+          int workspace[1000];
+          for (i = 0; i < LOOPREPEAT; i++)
+            count = pcre_dfa_exec(re, NULL, (char *)bptr, len, start_offset,
+              options | g_notempty, use_offsets, use_size_offsets, workspace,
+              sizeof(workspace)/sizeof(int));
+          }
+        else
+#endif
+
         for (i = 0; i < LOOPREPEAT; i++)
           count = pcre_exec(re, extra, (char *)bptr, len,
             start_offset, options | g_notempty, use_offsets, use_size_offsets);
+
         time_taken = clock() - start_time;
         fprintf(outfile, "Execute time %.3f milliseconds\n",
           (((double)time_taken * 1000.0) / (double)LOOPREPEAT) /
@@ -1203,7 +1625,7 @@ while (!done)
 
         if (extra == NULL)
           {
-          extra = malloc(sizeof(pcre_extra));
+          extra = (pcre_extra *)malloc(sizeof(pcre_extra));
           extra->flags = 0;
           }
         extra->flags |= PCRE_EXTRA_MATCH_LIMIT;
@@ -1219,7 +1641,8 @@ while (!done)
             min = mid;
             mid = (mid == max - 1)? max : (max > 0)? (min + max)/2 : mid*2;
             }
-          else if (count >= 0 || count == PCRE_ERROR_NOMATCH)
+          else if (count >= 0 || count == PCRE_ERROR_NOMATCH ||
+                                 count == PCRE_ERROR_PARTIAL)
             {
             if (mid == min + 1)
               {
@@ -1242,11 +1665,11 @@ while (!done)
         {
         if (extra == NULL)
           {
-          extra = malloc(sizeof(pcre_extra));
+          extra = (pcre_extra *)malloc(sizeof(pcre_extra));
           extra->flags = 0;
           }
         extra->flags |= PCRE_EXTRA_CALLOUT_DATA;
-        extra->callout_data = (void *)callout_data;
+        extra->callout_data = &callout_data;
         count = pcre_exec(re, extra, (char *)bptr, len, start_offset,
           options | g_notempty, use_offsets, use_size_offsets);
         extra->flags &= ~PCRE_EXTRA_CALLOUT_DATA;
@@ -1255,13 +1678,30 @@ while (!done)
       /* The normal case is just to do the match once, with the default
       value of match_limit. */
 
-      else count = pcre_exec(re, extra, (char *)bptr, len,
-        start_offset, options | g_notempty, use_offsets, use_size_offsets);
+#if !defined NODFA
+      else if (all_use_dfa || use_dfa)
+        {
+        int workspace[1000];
+        count = pcre_dfa_exec(re, NULL, (char *)bptr, len, start_offset,
+          options | g_notempty, use_offsets, use_size_offsets, workspace,
+          sizeof(workspace)/sizeof(int));
+        if (count == 0)
+          {
+          fprintf(outfile, "Matched, but too many subsidiary matches\n");
+          count = use_size_offsets/2;
+          }
+        }
+#endif
 
-      if (count == 0)
+      else
         {
-        fprintf(outfile, "Matched, but too many substrings\n");
-        count = use_size_offsets/3;
+        count = pcre_exec(re, extra, (char *)bptr, len,
+          start_offset, options | g_notempty, use_offsets, use_size_offsets);
+        if (count == 0)
+          {
+          fprintf(outfile, "Matched, but too many substrings\n");
+          count = use_size_offsets/3;
+          }
         }
 
       /* Matched */
@@ -1343,26 +1783,52 @@ while (!done)
           }
         }
 
+      /* There was a partial match */
+
+      else if (count == PCRE_ERROR_PARTIAL)
+        {
+        fprintf(outfile, "Partial match");
+#if !defined NODFA
+        if ((all_use_dfa || use_dfa) && use_size_offsets > 2)
+          fprintf(outfile, ": %.*s", use_offsets[1] - use_offsets[0],
+            bptr + use_offsets[0]);
+#endif
+        fprintf(outfile, "\n");
+        break;  /* Out of the /g loop */
+        }
+
       /* Failed to match. If this is a /g or /G loop and we previously set
       g_notempty after a null match, this is not necessarily the end.
-      We want to advance the start offset, and continue. Fudge the offset
-      values to achieve this. We won't be at the end of the string - that
-      was checked before setting g_notempty. */
+      We want to advance the start offset, and continue. In the case of UTF-8
+      matching, the advance must be one character, not one byte. Fudge the
+      offset values to achieve this. We won't be at the end of the string -
+      that was checked before setting g_notempty. */
 
       else
         {
         if (g_notempty != 0)
           {
+          int onechar = 1;
           use_offsets[0] = start_offset;
-          use_offsets[1] = start_offset + 1;
+          if (use_utf8)
+            {
+            while (start_offset + onechar < len)
+              {
+              int tb = bptr[start_offset+onechar];
+              if (tb <= 127) break;
+              tb &= 0xc0;
+              if (tb != 0 && tb != 0xc0) onechar++;
+              }
+            }
+          use_offsets[1] = start_offset + onechar;
           }
         else
           {
-          if (gmatched == 0)   /* Error if no previous matches */
+          if (count == PCRE_ERROR_NOMATCH)
             {
-            if (count == -1) fprintf(outfile, "No match\n");
-              else fprintf(outfile, "Error %d\n", count);
+            if (gmatched == 0) fprintf(outfile, "No match\n");
             }
+          else fprintf(outfile, "Error %d\n", count);
           break;  /* Out of the /g loop */
           }
         }
@@ -1405,17 +1871,28 @@ while (!done)
   if (posix || do_posix) regfree(&preg);
 #endif
 
-  if (re != NULL) free(re);
-  if (extra != NULL) free(extra);
+  if (re != NULL) new_free(re);
+  if (extra != NULL) new_free(extra);
   if (tables != NULL)
     {
-    free((void *)tables);
+    new_free((void *)tables);
     setlocale(LC_CTYPE, "C");
     }
   }
 
-fprintf(outfile, "\n");
-return 0;
+if (infile == stdin) fprintf(outfile, "\n");
+
+EXIT:
+
+if (infile != NULL && infile != stdin) fclose(infile);
+if (outfile != NULL && outfile != stdout) fclose(outfile);
+
+free(buffer);
+free(dbuffer);
+free(pbuffer);
+free(offsets);
+
+return yield;
 }
 
-/* End */
+/* End of pcretest.c */
diff -Nurp tin-1.6.2/pcre/perltest tin-1.8.0/pcre/perltest
--- tin-1.6.2/pcre/perltest	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/perltest	2005-06-28 10:31:26.000000000 +0200
@@ -206,6 +206,6 @@ for (;;)
     }
   }
 
-printf $outfile "\n";
+# printf $outfile "\n";
 
 # End
diff -Nurp tin-1.6.2/pcre/printint.c tin-1.8.0/pcre/printint.c
--- tin-1.6.2/pcre/printint.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/printint.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,360 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2003 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-
-/* This module contains a debugging function for printing out the internal form
-of a compiled regular expression. It is kept in a separate file so that it can
-be #included both in the pcretest program, and in the library itself when
-compiled with the debugging switch. */
-
-
-static const char *OP_names[] = { OP_NAME_LIST };
-
-
-/*************************************************
-*       Print single- or multi-byte character    *
-*************************************************/
-
-/* These tables are actually copies of ones in pcre.c. If we compile the
-library with debugging, they are included twice, but that isn't really a
-problem - compiling with debugging is pretty rare and these are very small. */
-
-static int utf8_t3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
-
-static uschar utf8_t4[] = {
-  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-  3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };
-
-static int
-print_char(FILE *f, uschar *ptr, BOOL utf8)
-{
-int c = *ptr;
-
-if (!utf8 || (c & 0xc0) != 0xc0)
-  {
-  if (isprint(c)) fprintf(f, "%c", c); else fprintf(f, "\\x%02x", c);
-  return 0;
-  }
-else
-  {
-  int i;
-  int a = utf8_t4[c & 0x3f];  /* Number of additional bytes */
-  int s = 6*a;
-  c = (c & utf8_t3[a]) << s;
-  for (i = 1; i <= a; i++)
-    {
-    s -= 6;
-    c |= (ptr[i] & 0x3f) << s;
-    }
-  if (c < 128) fprintf(f, "\\x%02x", c); else fprintf(f, "\\x{%x}", c);
-  return a;
-  }
-}
-
-
-
-
-/*************************************************
-*         Print compiled regex                   *
-*************************************************/
-
-static void
-print_internals(pcre *external_re, FILE *f)
-{
-real_pcre *re = (real_pcre *)external_re;
-uschar *codestart =
-  (uschar *)re + sizeof(real_pcre) + re->name_count * re->name_entry_size;
-uschar *code = codestart;
-BOOL utf8 = (re->options & PCRE_UTF8) != 0;
-
-for(;;)
-  {
-  uschar *ccode;
-  int c;
-  int extra = 0;
-
-  fprintf(f, "%3d ", code - codestart);
-
-  if (*code >= OP_BRA)
-    {
-    if (*code - OP_BRA > EXTRACT_BASIC_MAX)
-      fprintf(f, "%3d Bra extra\n", GET(code, 1));
-    else
-      fprintf(f, "%3d Bra %d\n", GET(code, 1), *code - OP_BRA);
-    code += OP_lengths[OP_BRA];
-    continue;
-    }
-
-  switch(*code)
-    {
-    case OP_END:
-    fprintf(f, "    %s\n", OP_names[*code]);
-    fprintf(f, "------------------------------------------------------------------\n");
-    return;
-
-    case OP_OPT:
-    fprintf(f, " %.2x %s", code[1], OP_names[*code]);
-    break;
-
-    case OP_CHARS:
-      {
-      int charlength = code[1];
-      ccode = code + 2;
-      extra = charlength;
-      fprintf(f, "%3d ", charlength);
-      while (charlength > 0)
-        {
-        int extrabytes = print_char(f, ccode, utf8);
-        ccode += 1 + extrabytes;
-        charlength -= 1 + extrabytes;
-        }
-      }
-    break;
-
-    case OP_KETRMAX:
-    case OP_KETRMIN:
-    case OP_ALT:
-    case OP_KET:
-    case OP_ASSERT:
-    case OP_ASSERT_NOT:
-    case OP_ASSERTBACK:
-    case OP_ASSERTBACK_NOT:
-    case OP_ONCE:
-    case OP_COND:
-    case OP_REVERSE:
-    fprintf(f, "%3d %s", GET(code, 1), OP_names[*code]);
-    break;
-
-    case OP_BRANUMBER:
-    printf("%3d %s", GET2(code, 1), OP_names[*code]);
-    break;
-
-    case OP_CREF:
-    if (GET2(code, 1) == CREF_RECURSE)
-      fprintf(f, "    Cond recurse");
-    else
-      fprintf(f, "%3d %s", GET2(code,1), OP_names[*code]);
-    break;
-
-    case OP_STAR:
-    case OP_MINSTAR:
-    case OP_PLUS:
-    case OP_MINPLUS:
-    case OP_QUERY:
-    case OP_MINQUERY:
-    case OP_TYPESTAR:
-    case OP_TYPEMINSTAR:
-    case OP_TYPEPLUS:
-    case OP_TYPEMINPLUS:
-    case OP_TYPEQUERY:
-    case OP_TYPEMINQUERY:
-    fprintf(f, "    ");
-    if (*code >= OP_TYPESTAR) fprintf(f, "%s", OP_names[code[1]]);
-      else extra = print_char(f, code+1, utf8);
-    fprintf(f, "%s", OP_names[*code]);
-    break;
-
-    case OP_EXACT:
-    case OP_UPTO:
-    case OP_MINUPTO:
-    fprintf(f, "    ");
-    extra = print_char(f, code+3, utf8);
-    fprintf(f, "{");
-    if (*code != OP_EXACT) fprintf(f, ",");
-    fprintf(f, "%d}", GET2(code,1));
-    if (*code == OP_MINUPTO) fprintf(f, "?");
-    break;
-
-    case OP_TYPEEXACT:
-    case OP_TYPEUPTO:
-    case OP_TYPEMINUPTO:
-    fprintf(f, "    %s{", OP_names[code[3]]);
-    if (*code != OP_TYPEEXACT) fprintf(f, "0,");
-    fprintf(f, "%d}", GET2(code,1));
-    if (*code == OP_TYPEMINUPTO) fprintf(f, "?");
-    break;
-
-    case OP_NOT:
-    if (isprint(c = code[1])) fprintf(f, "    [^%c]", c);
-      else fprintf(f, "    [^\\x%02x]", c);
-    break;
-
-    case OP_NOTSTAR:
-    case OP_NOTMINSTAR:
-    case OP_NOTPLUS:
-    case OP_NOTMINPLUS:
-    case OP_NOTQUERY:
-    case OP_NOTMINQUERY:
-    if (isprint(c = code[1])) fprintf(f, "    [^%c]", c);
-      else fprintf(f, "    [^\\x%02x]", c);
-    fprintf(f, "%s", OP_names[*code]);
-    break;
-
-    case OP_NOTEXACT:
-    case OP_NOTUPTO:
-    case OP_NOTMINUPTO:
-    if (isprint(c = code[3])) fprintf(f, "    [^%c]{", c);
-      else fprintf(f, "    [^\\x%02x]{", c);
-    if (*code != OP_NOTEXACT) fprintf(f, ",");
-    fprintf(f, "%d}", GET2(code,1));
-    if (*code == OP_NOTMINUPTO) fprintf(f, "?");
-    break;
-
-    case OP_RECURSE:
-    fprintf(f, "%3d %s", GET(code, 1), OP_names[*code]);
-    break;
-
-    case OP_REF:
-    fprintf(f, "    \\%d", GET2(code,1));
-    ccode = code + OP_lengths[*code];
-    goto CLASS_REF_REPEAT;
-
-    case OP_CALLOUT:
-    fprintf(f, "    %s %d", OP_names[*code], code[1]);
-    break;
-
-    /* OP_XCLASS can only occur in UTF-8 mode. However, there's no harm in
-    having this code always here, and it makes it less messy without all those
-    #ifdefs. */
-
-    case OP_CLASS:
-    case OP_NCLASS:
-    case OP_XCLASS:
-      {
-      int i, min, max;
-      BOOL printmap;
-
-      fprintf(f, "    [");
-
-      if (*code == OP_XCLASS)
-        {
-        extra = GET(code, 1);
-        ccode = code + LINK_SIZE + 1;
-        printmap = (*ccode & XCL_MAP) != 0;
-        if ((*ccode++ & XCL_NOT) != 0) fprintf(f, "^");
-        }
-      else
-        {
-        printmap = TRUE;
-        ccode = code + 1;
-        }
-
-      /* Print a bit map */
-
-      if (printmap)
-        {
-        for (i = 0; i < 256; i++)
-          {
-          if ((ccode[i/8] & (1 << (i&7))) != 0)
-            {
-            int j;
-            for (j = i+1; j < 256; j++)
-              if ((ccode[j/8] & (1 << (j&7))) == 0) break;
-            if (i == '-' || i == ']') fprintf(f, "\\");
-            if (isprint(i)) fprintf(f, "%c", i); else fprintf(f, "\\x%02x", i);
-            if (--j > i)
-              {
-              fprintf(f, "-");
-              if (j == '-' || j == ']') fprintf(f, "\\");
-              if (isprint(j)) fprintf(f, "%c", j); else fprintf(f, "\\x%02x", j);
-              }
-            i = j;
-            }
-          }
-        ccode += 32;
-        }
-
-      /* For an XCLASS there is always some additional data */
-
-      if (*code == OP_XCLASS)
-        {
-        int ch;
-        while ((ch = *ccode++) != XCL_END)
-          {
-          ccode += 1 + print_char(f, ccode, TRUE);
-          if (ch == XCL_RANGE)
-            {
-            fprintf(f, "-");
-            ccode += 1 + print_char(f, ccode, TRUE);
-            }
-          }
-        }
-
-      /* Indicate a non-UTF8 class which was created by negation */
-
-      fprintf(f, "]%s", (*code == OP_NCLASS)? " (neg)" : "");
-
-      /* Handle repeats after a class or a back reference */
-
-      CLASS_REF_REPEAT:
-      switch(*ccode)
-        {
-        case OP_CRSTAR:
-        case OP_CRMINSTAR:
-        case OP_CRPLUS:
-        case OP_CRMINPLUS:
-        case OP_CRQUERY:
-        case OP_CRMINQUERY:
-        fprintf(f, "%s", OP_names[*ccode]);
-        extra = OP_lengths[*ccode];
-        break;
-
-        case OP_CRRANGE:
-        case OP_CRMINRANGE:
-        min = GET2(ccode,1);
-        max = GET2(ccode,3);
-        if (max == 0) fprintf(f, "{%d,}", min);
-        else fprintf(f, "{%d,%d}", min, max);
-        if (*ccode == OP_CRMINRANGE) fprintf(f, "?");
-        extra = OP_lengths[*ccode];
-        break;
-        }
-      }
-    break;
-
-    /* Anything else is just an item with no data*/
-
-    default:
-    fprintf(f, "    %s", OP_names[*code]);
-    break;
-    }
-
-  code += OP_lengths[*code] + extra;
-  fprintf(f, "\n");
-  }
-}
-
-/* End of printint.c */
diff -Nurp tin-1.6.2/pcre/study.c tin-1.8.0/pcre/study.c
--- tin-1.6.2/pcre/study.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/study.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,438 +0,0 @@
-/*************************************************
-*      Perl-Compatible Regular Expressions       *
-*************************************************/
-
-/*
-This is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language. See
-the file Tech.Notes for some information on the internals.
-
-Written by: Philip Hazel <ph10@cam.ac.uk>
-
-           Copyright (c) 1997-2002 University of Cambridge
-
------------------------------------------------------------------------------
-Permission is granted to anyone to use this software for any purpose on any
-computer system, and to redistribute it freely, subject to the following
-restrictions:
-
-1. This software 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.
-
-2. The origin of this software must not be misrepresented, either by
-   explicit claim or by omission.
-
-3. Altered versions must be plainly marked as such, and must not be
-   misrepresented as being the original software.
-
-4. If PCRE is embedded in any software that is released under the GNU
-   General Purpose Licence (GPL), then the terms of that licence shall
-   supersede any condition above with which it is incompatible.
------------------------------------------------------------------------------
-*/
-
-
-/* Include the internals header, which itself includes Standard C headers plus
-the external pcre header. */
-
-#include "internal.h"
-
-
-
-/*************************************************
-*      Set a bit and maybe its alternate case    *
-*************************************************/
-
-/* Given a character, set its bit in the table, and also the bit for the other
-version of a letter if we are caseless.
-
-Arguments:
-  start_bits    points to the bit map
-  c             is the character
-  caseless      the caseless flag
-  cd            the block with char table pointers
-
-Returns:        nothing
-*/
-
-static void
-set_bit(uschar *start_bits, int c, BOOL caseless, compile_data *cd)
-{
-start_bits[c/8] |= (1 << (c&7));
-if (caseless && (cd->ctypes[c] & ctype_letter) != 0)
-  start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7));
-}
-
-
-
-/*************************************************
-*          Create bitmap of starting chars       *
-*************************************************/
-
-/* This function scans a compiled unanchored expression and attempts to build a
-bitmap of the set of initial characters. If it can't, it returns FALSE. As time
-goes by, we may be able to get more clever at doing this.
-
-Arguments:
-  code         points to an expression
-  start_bits   points to a 32-byte table, initialized to 0
-  caseless     the current state of the caseless flag
-  utf8         TRUE if in UTF-8 mode
-  cd           the block with char table pointers
-
-Returns:       TRUE if table built, FALSE otherwise
-*/
-
-static BOOL
-set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless,
-  BOOL utf8, compile_data *cd)
-{
-register int c;
-
-/* This next statement and the later reference to dummy are here in order to
-trick the optimizer of the IBM C compiler for OS/2 into generating correct
-code. Apparently IBM isn't going to fix the problem, and we would rather not
-disable optimization (in this module it actually makes a big difference, and
-the pcre module can use all the optimization it can get). */
-
-volatile int dummy;
-
-do
-  {
-  const uschar *tcode = code + 1 + LINK_SIZE;
-  BOOL try_next = TRUE;
-
-  while (try_next)
-    {
-    /* If a branch starts with a bracket or a positive lookahead assertion,
-    recurse to set bits from within them. That's all for this branch. */
-
-    if ((int)*tcode >= OP_BRA || *tcode == OP_ASSERT)
-      {
-      if (!set_start_bits(tcode, start_bits, caseless, utf8, cd))
-        return FALSE;
-      try_next = FALSE;
-      }
-
-    else switch(*tcode)
-      {
-      default:
-      return FALSE;
-
-      /* Skip over callout */
-
-      case OP_CALLOUT:
-      tcode += 2;
-      break;
-
-      /* Skip over extended extraction bracket number */
-
-      case OP_BRANUMBER:
-      tcode += 3;
-      break;
-
-      /* Skip over lookbehind and negative lookahead assertions */
-
-      case OP_ASSERT_NOT:
-      case OP_ASSERTBACK:
-      case OP_ASSERTBACK_NOT:
-      do tcode += GET(tcode, 1); while (*tcode == OP_ALT);
-      tcode += 1+LINK_SIZE;
-      break;
-
-      /* Skip over an option setting, changing the caseless flag */
-
-      case OP_OPT:
-      caseless = (tcode[1] & PCRE_CASELESS) != 0;
-      tcode += 2;
-      break;
-
-      /* BRAZERO does the bracket, but carries on. */
-
-      case OP_BRAZERO:
-      case OP_BRAMINZERO:
-      if (!set_start_bits(++tcode, start_bits, caseless, utf8, cd))
-        return FALSE;
-      dummy = 1;
-      do tcode += GET(tcode,1); while (*tcode == OP_ALT);
-      tcode += 1+LINK_SIZE;
-      break;
-
-      /* Single-char * or ? sets the bit and tries the next item */
-
-      case OP_STAR:
-      case OP_MINSTAR:
-      case OP_QUERY:
-      case OP_MINQUERY:
-      set_bit(start_bits, tcode[1], caseless, cd);
-      tcode += 2;
-#ifdef SUPPORT_UTF8
-      if (utf8) while ((*tcode & 0xc0) == 0x80) tcode++;
-#endif
-      break;
-
-      /* Single-char upto sets the bit and tries the next */
-
-      case OP_UPTO:
-      case OP_MINUPTO:
-      set_bit(start_bits, tcode[3], caseless, cd);
-      tcode += 4;
-#ifdef SUPPORT_UTF8
-      if (utf8) while ((*tcode & 0xc0) == 0x80) tcode++;
-#endif
-      break;
-
-      /* At least one single char sets the bit and stops */
-
-      case OP_EXACT:       /* Fall through */
-      tcode++;
-
-      case OP_CHARS:       /* Fall through */
-      tcode++;
-
-      case OP_PLUS:
-      case OP_MINPLUS:
-      set_bit(start_bits, tcode[1], caseless, cd);
-      try_next = FALSE;
-      break;
-
-      /* Single character type sets the bits and stops */
-
-      case OP_NOT_DIGIT:
-      for (c = 0; c < 32; c++)
-        start_bits[c] |= ~cd->cbits[c+cbit_digit];
-      try_next = FALSE;
-      break;
-
-      case OP_DIGIT:
-      for (c = 0; c < 32; c++)
-        start_bits[c] |= cd->cbits[c+cbit_digit];
-      try_next = FALSE;
-      break;
-
-      case OP_NOT_WHITESPACE:
-      for (c = 0; c < 32; c++)
-        start_bits[c] |= ~cd->cbits[c+cbit_space];
-      try_next = FALSE;
-      break;
-
-      case OP_WHITESPACE:
-      for (c = 0; c < 32; c++)
-        start_bits[c] |= cd->cbits[c+cbit_space];
-      try_next = FALSE;
-      break;
-
-      case OP_NOT_WORDCHAR:
-      for (c = 0; c < 32; c++)
-        start_bits[c] |= ~cd->cbits[c+cbit_word];
-      try_next = FALSE;
-      break;
-
-      case OP_WORDCHAR:
-      for (c = 0; c < 32; c++)
-        start_bits[c] |= cd->cbits[c+cbit_word];
-      try_next = FALSE;
-      break;
-
-      /* One or more character type fudges the pointer and restarts, knowing
-      it will hit a single character type and stop there. */
-
-      case OP_TYPEPLUS:
-      case OP_TYPEMINPLUS:
-      tcode++;
-      break;
-
-      case OP_TYPEEXACT:
-      tcode += 3;
-      break;
-
-      /* Zero or more repeats of character types set the bits and then
-      try again. */
-
-      case OP_TYPEUPTO:
-      case OP_TYPEMINUPTO:
-      tcode += 2;               /* Fall through */
-
-      case OP_TYPESTAR:
-      case OP_TYPEMINSTAR:
-      case OP_TYPEQUERY:
-      case OP_TYPEMINQUERY:
-      switch(tcode[1])
-        {
-        case OP_NOT_DIGIT:
-        for (c = 0; c < 32; c++)
-          start_bits[c] |= ~cd->cbits[c+cbit_digit];
-        break;
-
-        case OP_DIGIT:
-        for (c = 0; c < 32; c++)
-          start_bits[c] |= cd->cbits[c+cbit_digit];
-        break;
-
-        case OP_NOT_WHITESPACE:
-        for (c = 0; c < 32; c++)
-          start_bits[c] |= ~cd->cbits[c+cbit_space];
-        break;
-
-        case OP_WHITESPACE:
-        for (c = 0; c < 32; c++)
-          start_bits[c] |= cd->cbits[c+cbit_space];
-        break;
-
-        case OP_NOT_WORDCHAR:
-        for (c = 0; c < 32; c++)
-          start_bits[c] |= ~cd->cbits[c+cbit_word];
-        break;
-
-        case OP_WORDCHAR:
-        for (c = 0; c < 32; c++)
-          start_bits[c] |= cd->cbits[c+cbit_word];
-        break;
-        }
-
-      tcode += 2;
-      break;
-
-      /* Character class where all the information is in a bit map: set the
-      bits and either carry on or not, according to the repeat count. If it was
-      a negative class, and we are operating with UTF-8 characters, any byte
-      with the top-bit set is a potentially valid starter because it may start
-      a character with a value > 255. (This is sub-optimal in that the
-      character may be in the range 128-255, and those characters might be
-      unwanted, but that's as far as we go for the moment.) */
-
-      case OP_NCLASS:
-      if (utf8) memset(start_bits+16, 0xff, 16);
-      /* Fall through */
-
-      case OP_CLASS:
-        {
-        tcode++;
-        for (c = 0; c < 32; c++) start_bits[c] |= tcode[c];
-        tcode += 32;
-        switch (*tcode)
-          {
-          case OP_CRSTAR:
-          case OP_CRMINSTAR:
-          case OP_CRQUERY:
-          case OP_CRMINQUERY:
-          tcode++;
-          break;
-
-          case OP_CRRANGE:
-          case OP_CRMINRANGE:
-          if (((tcode[1] << 8) + tcode[2]) == 0) tcode += 5;
-            else try_next = FALSE;
-          break;
-
-          default:
-          try_next = FALSE;
-          break;
-          }
-        }
-      break; /* End of bitmap class handling */
-
-      }      /* End of switch */
-    }        /* End of try_next loop */
-
-  code += GET(code, 1);   /* Advance to next branch */
-  }
-while (*code == OP_ALT);
-return TRUE;
-}
-
-
-
-/*************************************************
-*          Study a compiled expression           *
-*************************************************/
-
-/* This function is handed a compiled expression that it must study to produce
-information that will speed up the matching. It returns a pcre_extra block
-which then gets handed back to pcre_exec().
-
-Arguments:
-  re        points to the compiled expression
-  options   contains option bits
-  errorptr  points to where to place error messages;
-            set NULL unless error
-
-Returns:    pointer to a pcre_extra block, with study_data filled in and the
-              appropriate flag set;
-            NULL on error or if no optimization possible
-*/
-
-pcre_extra *
-pcre_study(const pcre *external_re, int options, const char **errorptr)
-{
-uschar start_bits[32];
-pcre_extra *extra;
-pcre_study_data *study;
-const real_pcre *re = (const real_pcre *)external_re;
-uschar *code = (uschar *)re + sizeof(real_pcre) +
-  (re->name_count * re->name_entry_size);
-compile_data compile_block;
-
-*errorptr = NULL;
-
-if (re == NULL || re->magic_number != MAGIC_NUMBER)
-  {
-  *errorptr = "argument is not a compiled regular expression";
-  return NULL;
-  }
-
-if ((options & ~PUBLIC_STUDY_OPTIONS) != 0)
-  {
-  *errorptr = "unknown or incorrect option bit(s) set";
-  return NULL;
-  }
-
-/* For an anchored pattern, or an unanchored pattern that has a first char, or
-a multiline pattern that matches only at "line starts", no further processing
-at present. */
-
-if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0)
-  return NULL;
-
-/* Set the character tables in the block which is passed around */
-
-compile_block.lcc = re->tables + lcc_offset;
-compile_block.fcc = re->tables + fcc_offset;
-compile_block.cbits = re->tables + cbits_offset;
-compile_block.ctypes = re->tables + ctypes_offset;
-
-/* See if we can find a fixed set of initial characters for the pattern. */
-
-memset(start_bits, 0, 32 * sizeof(uschar));
-if (!set_start_bits(code, start_bits, (re->options & PCRE_CASELESS) != 0,
-  (re->options & PCRE_UTF8) != 0, &compile_block)) return NULL;
-
-/* Get a pcre_extra block and a pcre_study_data block. The study data is put in
-the latter, which is pointed to by the former, which may also get additional
-data set later by the calling program. At the moment, the size of
-pcre_study_data is fixed. We nevertheless save it in a field for returning via
-the pcre_fullinfo() function so that if it becomes variable in the future, we
-don't have to change that code. */
-
-extra = (pcre_extra *)(pcre_malloc)
-  (sizeof(pcre_extra) + sizeof(pcre_study_data));
-
-if (extra == NULL)
-  {
-  *errorptr = "failed to get memory";
-  return NULL;
-  }
-
-study = (pcre_study_data *)((char *)extra + sizeof(pcre_extra));
-extra->flags = PCRE_EXTRA_STUDY_DATA;
-extra->study_data = study;
-
-study->size = sizeof(pcre_study_data);
-study->options = PCRE_STUDY_MAPPED;
-memcpy(study->start_bits, start_bits, sizeof(start_bits));
-
-return extra;
-}
-
-/* End of study.c */
diff -Nurp tin-1.6.2/pcre/testdata/testinput1 tin-1.8.0/pcre/testdata/testinput1
--- tin-1.6.2/pcre/testdata/testinput1	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/testdata/testinput1	2005-09-12 16:42:32.000000000 +0200
@@ -3838,4 +3838,12 @@
 /(?<=Z)X./
   \x84XAZXB
 
+/ab cd (?x) de fg/
+    ab cd defg
+
+/ab cd(?x) de fg/
+    ab cddefg
+    ** Failers 
+    abcddefg
+
 / End of testinput1 /
diff -Nurp tin-1.6.2/pcre/testdata/testinput2 tin-1.8.0/pcre/testdata/testinput2
--- tin-1.6.2/pcre/testdata/testinput2	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/testdata/testinput2	2005-09-12 16:42:32.000000000 +0200
@@ -266,6 +266,18 @@
 /(?!alphabet)[ab]/S
 
 /(?<=foo\n)^bar/m
+    foo\nbarbar 
+    ***Failers
+    rhubarb 
+    barbell
+    abc\nbarton 
+
+/^(?<=foo\n)bar/m
+    foo\nbarbar 
+    ***Failers
+    rhubarb 
+    barbell
+    abc\nbarton 
 
 /(?>^abc)/m
     abc
@@ -654,10 +666,16 @@
 
 /^[[:alnum:]]/D
 
+/^[[:^alnum:]]/D
+
 /^[[:alpha:]]/D
+
+/^[[:^alpha:]]/D
              
 /^[[:ascii:]]/D
 
+/^[[:^ascii:]]/D
+
 /^[[:blank:]]/D
 
 /^[[:cntrl:]]/D
@@ -890,20 +908,10 @@
 
 /\N{name}/
 
-/\pP/
-
-/\PP/
-
-/\p{prop}/
-
-/\P{prop}/
-
 /\u/
 
 /\U/
 
-/\X/
-
 /[/
 
 /[a-/
@@ -1061,6 +1069,12 @@
 /(?<=(abc)(?C))xyz/
    abcxyz\C+
    
+/a(b+)(c*)(?C1)/
+    abbbbbccc\C*1
+
+/a(b+?)(c*?)(?C1)/
+    abbbbbccc\C*1
+   
 /(?C)abc/ 
 
 /(?C)^abc/
@@ -1229,4 +1243,211 @@
 
 /(?P<abc>abc(?P<def>def)(?P<abc>xyz))/
 
+"\[((?P<elem>\d+)(,(?P>elem))*)\]"
+    [10,20,30,5,5,4,4,2,43,23,4234]
+    *** Failers
+    []  
+
+"\[((?P<elem>\d+)(,(?P>elem))*)?\]"
+    [10,20,30,5,5,4,4,2,43,23,4234]
+    [] 
+
+/(a(b(?2)c))?/D
+
+/(a(b(?2)c))*/D
+
+/(a(b(?2)c)){0,2}/D
+
+/[ab]{1}+/D
+
+/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/i
+     Baby Bjorn Active Carrier - With free SHIPPING!!
+
+/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/iS
+     Baby Bjorn Active Carrier - With free SHIPPING!!
+     
+/a*.*b/SD
+
+/(a|b)*.?c/SD 
+
+/abc(?C255)de(?C)f/D
+
+/abcde/CD
+  abcde
+  abcdfe 
+  
+/a*b/CD
+  ab
+  aaaab
+  aaaacb   
+
+/a+b/CD
+  ab
+  aaaab
+  aaaacb   
+
+/(abc|def)x/CD
+  abcx
+  defx
+  abcdefzx
+
+/(ab|cd){3,4}/C
+  ababab
+  abcdabcd
+  abcdcdcdcdcd  
+
+/([ab]{,4}c|xy)/CD
+    Note: that { does NOT introduce a quantifier
+
+/([ab]{1,4}c|xy){4,5}?123/CD
+    aacaacaacaacaac123
+
+/\b.*/I
+  ab cd\>1
+  
+/\b.*/Is 
+  ab cd\>1
+  
+/(?!.bcd).*/I
+  Xbcd12345 
+
+/abcde/
+    ab\P
+    abc\P
+    abcd\P
+    abcde\P   
+    the quick brown abc\P
+    ** Failers\P
+    the quick brown abxyz fox\P
+    
+"^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/(20)?\d\d$"
+    13/05/04\P
+    13/5/2004\P
+    02/05/09\P 
+    1\P
+    1/2\P
+    1/2/0\P
+    1/2/04\P    
+    0\P
+    02/\P
+    02/0\P   
+    02/1\P
+    ** Failers\P
+    \P
+    123\P
+    33/4/04\P
+    3/13/04\P
+    0/1/2003\P
+    0/\P 
+    02/0/\P 
+    02/13\P  
+
+/0{0,2}ABC/I
+    
+/\d{3,}ABC/I
+    
+/\d*ABC/I
+
+/[abc]+DE/I
+
+/[abc]?123/
+    123\P
+    a\P
+    b\P
+    c\P
+    c12\P
+    c123\P      
+
+/^(?:\d){3,5}X/
+    1\P
+    123\P
+    123X
+    1234\P
+    1234X
+    12345\P
+    12345X      
+    *** Failers 
+    1X 
+    123456\P 
+
+/abc/>testsavedregex
+<testsavedregex
+    abc
+    ** Failers
+    bca
+    
+/abc/F>testsavedregex
+<testsavedregex
+    abc
+    ** Failers
+    bca
+
+/(a|b)/S>testsavedregex
+<testsavedregex
+    abc
+    ** Failers
+    def  
+    
+/(a|b)/SF>testsavedregex
+<testsavedregex
+    abc
+    ** Failers
+    def  
+    
+~<(\w+)/?>(.)*</(\1)>~smg
+    <!DOCTYPE seite SYSTEM "http://www.lco.lineas.de/xmlCms.dtd">\n<seite>\n<dokumenteninformation>\n<seitentitel>Partner der LCO</seitentitel>\n<sprache>de</sprache>\n<seitenbeschreibung>Partner der LINEAS Consulting\nGmbH</seitenbeschreibung>\n<schluesselworte>LINEAS Consulting GmbH Hamburg\nPartnerfirmen</schluesselworte>\n<revisit>30 days</revisit>\n<robots>index,follow</robots>\n<menueinformation>\n<aktiv>ja</aktiv>\n<menueposition>3</menueposition>\n<menuetext>Partner</menuetext>\n</menueinformation>\n<lastedited>\n<autor>LCO</autor>\n<firma>LINEAS Consulting</firma>\n<datum>15.10.2003</datum>\n</lastedited>\n</dokumenteninformation>\n<inhalt>\n\n<absatzueberschrift>Die Partnerfirmen der LINEAS Consulting\nGmbH</absatzueberschrift>\n\n<absatz><link ziel="http://www.ca.com/" zielfenster="_blank">\n<bild name="logo_ca.gif" rahmen="no"/></link> <link\nziel="http://www.ey.com/" zielfenster="_blank"><bild\nname="logo_euy.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><link ziel="http://www.cisco.de/" zielfenster="_blank">\n<bild name="logo_cisco.gif" rahmen="ja"/></link></absatz>\n\n<absatz><link ziel="http://www.atelion.de/"\nzielfenster="_blank"><bild\nname="logo_atelion.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><link ziel="http://www.line-information.de/"\nzielfenster="_blank">\n<bild name="logo_line_information.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><bild name="logo_aw.gif" rahmen="no"/></absatz>\n\n<absatz><link ziel="http://www.incognis.de/"\nzielfenster="_blank"><bild\nname="logo_incognis.gif" rahmen="no"/></link></absatz>\n\n<absatz><link ziel="http://www.addcraft.com/"\nzielfenster="_blank"><bild\nname="logo_addcraft.gif" rahmen="no"/></link></absatz>\n\n<absatz><link ziel="http://www.comendo.com/"\nzielfenster="_blank"><bild\nname="logo_comendo.gif" rahmen="no"/></link></absatz>\n\n</inhalt>\n</seite>
+
+/^a/IF
+
+/line\nbreak/
+    this is a line\nbreak
+    line one\nthis is a line\nbreak in the second line 
+
+/line\nbreak/f
+    this is a line\nbreak
+    ** Failers 
+    line one\nthis is a line\nbreak in the second line 
+
+/line\nbreak/mf
+    this is a line\nbreak
+    ** Failers 
+    line one\nthis is a line\nbreak in the second line 
+
+/ab.cd/P
+    ab-cd
+    ab=cd 
+    ** Failers
+    ab\ncd
+
+/ab.cd/Ps
+    ab-cd
+    ab=cd 
+    ab\ncd
+
+/(?i)(?-i)AbCd/
+    AbCd
+    ** Failers
+    abcd  
+    
+/a{11111111111111111111}/
+
+/(){64294967295}/
+
+/(){2,4294967295}/
+
+"(?i:a)(?i:b)(?i:c)(?i:d)(?i:e)(?i:f)(?i:g)(?i:h)(?i:i)(?i:j)(k)(?i:l)A\1B"
+    abcdefghijklAkB
+
+"(?P<n0>a)(?P<n1>b)(?P<n2>c)(?P<n3>d)(?P<n4>e)(?P<n5>f)(?P<n6>g)(?P<n7>h)(?P<n8>i)(?P<n9>j)(?P<n10>k)(?P<n11>l)A\11B"
+    abcdefghijklAkB
+
+"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)A\11B"
+    abcdefghijklAkB
+
+"(?P<name0>a)(?P<name1>a)(?P<name2>a)(?P<name3>a)(?P<name4>a)(?P<name5>a)(?P<name6>a)(?P<name7>a)(?P<name8>a)(?P<name9>a)(?P<name10>a)(?P<name11>a)(?P<name12>a)(?P<name13>a)(?P<name14>a)(?P<name15>a)(?P<name16>a)(?P<name17>a)(?P<name18>a)(?P<name19>a)(?P<name20>a)(?P<name21>a)(?P<name22>a)(?P<name23>a)(?P<name24>a)(?P<name25>a)(?P<name26>a)(?P<name27>a)(?P<name28>a)(?P<name29>a)(?P<name30>a)(?P<name31>a)(?P<name32>a)(?P<name33>a)(?P<name34>a)(?P<name35>a)(?P<name36>a)(?P<name37>a)(?P<name38>a)(?P<name39>a)(?P<name40>a)(?P<name41>a)(?P<name42>a)(?P<name43>a)(?P<name44>a)(?P<name45>a)(?P<name46>a)(?P<name47>a)(?P<name48>a)(?P<name49>a)(?P<name50>a)(?P<name51>a)(?P<name52>a)(?P<name53>a)(?P<name54>a)(?P<name55>a)(?P<name56>a)(?P<name57>a)(?P<name58>a)(?P<name59>a)(?P<name60>a)(?P<name61>a)(?P<name62>a)(?P<name63>a)(?P<name64>a)(?P<name65>a)(?P<name66>a)(?P<name67>a)(?P<name68>a)(?P<name69>a)(?P<name70>a)(?P<name71>a)(?P<name72>a)(?P<name73>a)(?P<name74>a)(?P<name75>a)(?P<name76>a)(?P<name77>a)(?P<name78>a)(?P<name79>a)(?P<name80>a)(?P<name81>a)(?P<name82>a)(?P<name83>a)(?P<name84>a)(?P<name85>a)(?P<name86>a)(?P<name87>a)(?P<name88>a)(?P<name89>a)(?P<name90>a)(?P<name91>a)(?P<name92>a)(?P<name93>a)(?P<name94>a)(?P<name95>a)(?P<name96>a)(?P<name97>a)(?P<name98>a)(?P<name99>a)(?P<name100>a)"
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+"(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)"
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
 / End of testinput2 /
diff -Nurp tin-1.6.2/pcre/testdata/testinput3 tin-1.8.0/pcre/testdata/testinput3
--- tin-1.6.2/pcre/testdata/testinput3	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/testdata/testinput3	2005-09-12 16:42:32.000000000 +0200
@@ -2,7 +2,7 @@
     *** Failers
     École
 
-/^[\w]+/Lfr
+/^[\w]+/Lfr_FR
     École
 
 /^[\w]+/
@@ -12,7 +12,7 @@
 /^[\W]+/
     École
 
-/^[\W]+/Lfr
+/^[\W]+/Lfr_FR
     *** Failers
     École
 
@@ -21,7 +21,7 @@
     *** Failers
     a
 
-/[\b]/Lfr
+/[\b]/Lfr_FR
     \b
     *** Failers
     a
@@ -30,13 +30,13 @@
     *** Failers
     École
 
-/^\w+/Lfr
+/^\w+/Lfr_FR
     École
 
 /(.+)\b(.+)/
     École
 
-/(.+)\b(.+)/Lfr
+/(.+)\b(.+)/Lfr_FR
     *** Failers
     École
 
@@ -45,19 +45,19 @@
     *** Failers
     école
 
-/École/iLfr
+/École/iLfr_FR
     École
     école
 
 /\w/IS
 
-/\w/ISLfr
+/\w/ISLfr_FR
 
-/^[\xc8-\xc9]/iLfr
+/^[\xc8-\xc9]/iLfr_FR
     École
     école
 
-/^[\xc8-\xc9]/Lfr
+/^[\xc8-\xc9]/Lfr_FR
     École
     *** Failers 
     école
diff -Nurp tin-1.6.2/pcre/testdata/testinput4 tin-1.8.0/pcre/testdata/testinput4
--- tin-1.6.2/pcre/testdata/testinput4	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/testdata/testinput4	2005-09-12 16:42:32.000000000 +0200
@@ -228,19 +228,12 @@
     > >X Y
     > >\x{100} Y
   
-/\W/8
-    A.B
-    A\x{100}B 
-  
 /\d/8
     \x{100}3
     
 /\s/8
     \x{100} X
     
-/\w/8
-    \x{100}X   
-
 /\D+/8
     12abcd34
     *** Failers
@@ -479,7 +472,7 @@
     Z 
     \x{100}
     *** Failers
-    \x{101}
+    \x{102}
     y    
 
 /[\xFF]/
@@ -510,4 +503,11 @@
 /^\d*b/8
   xb 
 
+/(|a)/g8
+    catac
+    a\x{256}a 
+
+/^\x{85}$/8i
+    \x{85}
+
 / End of testinput4 /
diff -Nurp tin-1.6.2/pcre/testdata/testinput5 tin-1.8.0/pcre/testdata/testinput5
--- tin-1.6.2/pcre/testdata/testinput5	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/testdata/testinput5	2005-09-12 16:42:32.000000000 +0200
@@ -176,8 +176,6 @@
 
 /[z-\x{100}]/8D
 
-/[z-\x{100}]/8Di
-
 /[z\Qa-d]Ä€\E]/8D
     \x{100}
     Ä€ 
@@ -192,4 +190,74 @@
 
 /[^\xff]/8D
 
+/[Ã„-Ãœ]/8
+    Ã– # Matches without Study
+    \x{d6}
+    
+/[Ã„-Ãœ]/8S
+    Ã– <-- Same with Study
+    \x{d6}
+    
+/[\x{c4}-\x{dc}]/8 
+    Ã– # Matches without Study
+    \x{d6} 
+
+/[\x{c4}-\x{dc}]/8S
+    Ã– <-- Same with Study
+    \x{d6} 
+
+/[Ã]/8
+
+/Ã/8
+
+/ÃÃÃxxx/8
+
+/ÃÃÃxxx/8?D
+
+/abc/8
+    Ã]
+    Ã
+    ÃÃÃ
+    ÃÃÃ\?
+
+/anything/8
+    \xc0\x80
+    \xc1\x8f 
+    \xe0\x9f\x80
+    \xf0\x8f\x80\x80 
+    \xf8\x87\x80\x80\x80  
+    \xfc\x83\x80\x80\x80\x80
+    \xfe\x80\x80\x80\x80\x80  
+    \xff\x80\x80\x80\x80\x80  
+    \xc3\x8f
+    \xe0\xaf\x80
+    \xe1\x80\x80
+    \xf0\x9f\x80\x80 
+    \xf1\x8f\x80\x80 
+    \xf8\x88\x80\x80\x80  
+    \xf9\x87\x80\x80\x80  
+    \xfc\x84\x80\x80\x80\x80
+    \xfd\x83\x80\x80\x80\x80
+
+/\x{100}abc(xyz(?1))/8D
+
+/[^\x{100}]abc(xyz(?1))/8D
+
+/[ab\x{100}]abc(xyz(?1))/8D
+
+/(\x{100}(b(?2)c))?/D8
+
+/(\x{100}(b(?2)c)){0,2}/D8
+
+/(\x{100}(b(?1)c))?/D8
+
+/(\x{100}(b(?1)c)){0,2}/D8
+
+/\W/8
+    A.B
+    A\x{100}B 
+  
+/\w/8
+    \x{100}X   
+
 / End of testinput5 /
diff -Nurp tin-1.6.2/pcre/testdata/testinput6 tin-1.8.0/pcre/testdata/testinput6
--- tin-1.6.2/pcre/testdata/testinput6	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/testdata/testinput6	2005-09-12 16:42:32.000000000 +0200
@@ -0,0 +1,517 @@
+/^\pC\pL\pM\pN\pP\pS\pZ</8
+    \x7f\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}<
+    \np\x{300}9!\$ < 
+    ** Failers 
+    ap\x{300}9!\$ < 
+  
+/^\PC/8
+    X
+    ** Failers 
+    \x7f
+  
+/^\PL/8
+    9
+    ** Failers 
+    \x{c0}
+  
+/^\PM/8
+    X
+    ** Failers 
+    \x{30f}
+  
+/^\PN/8
+    X
+    ** Failers 
+    \x{660}
+  
+/^\PP/8
+    X
+    ** Failers 
+    \x{66c}
+  
+/^\PS/8
+    X
+    ** Failers 
+    \x{f01}
+  
+/^\PZ/8
+    X
+    ** Failers 
+    \x{1680}
+    
+/^\p{Cc}/8
+    \x{017}
+    \x{09f} 
+    ** Failers
+    \x{0600} 
+  
+/^\p{Cf}/8
+    \x{601}
+    ** Failers
+    \x{09f} 
+  
+/^\p{Cn}/8
+    ** Failers
+    \x{09f} 
+  
+/^\p{Co}/8
+    \x{f8ff}
+    ** Failers
+    \x{09f} 
+  
+/^\p{Cs}/8
+    \x{dfff}
+    ** Failers
+    \x{09f} 
+  
+/^\p{Ll}/8
+    a
+    ** Failers 
+    Z
+    \x{dfff}  
+  
+/^\p{Lm}/8
+    \x{2b0}
+    ** Failers
+    a 
+  
+/^\p{Lo}/8
+    \x{1bb}
+    ** Failers
+    a 
+    \x{2b0}
+  
+/^\p{Lt}/8
+    \x{1c5}
+    ** Failers
+    a 
+    \x{2b0}
+  
+/^\p{Lu}/8
+    A
+    ** Failers
+    \x{2b0}
+  
+/^\p{Mc}/8
+    \x{903}
+    ** Failers
+    X
+    \x{300}
+       
+/^\p{Me}/8
+    \x{488}
+    ** Failers
+    X
+    \x{903}
+    \x{300}
+  
+/^\p{Mn}/8
+    \x{300}
+    ** Failers
+    X
+    \x{903}
+  
+/^\p{Nd}+/8
+    0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669}\x{66a}
+    \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}\x{6f7}\x{6f8}\x{6f9}\x{6fa}
+    \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}\x{96d}\x{96e}\x{96f}\x{970}
+    ** Failers
+    X
+  
+/^\p{Nl}/8
+    \x{16ee}
+    ** Failers
+    X
+    \x{966}
+  
+/^\p{No}/8
+    \x{b2}
+    \x{b3}
+    ** Failers
+    X
+    \x{16ee}
+  
+/^\p{Pc}/8
+    \x5f
+    \x{203f}
+    ** Failers
+    X
+    -
+    \x{58a}
+  
+/^\p{Pd}/8
+    -
+    \x{58a}
+    ** Failers
+    X
+    \x{203f}
+  
+/^\p{Pe}/8
+    )
+    ]
+    }
+    \x{f3b}
+    ** Failers
+    X
+    \x{203f}
+    (
+    [
+    {
+    \x{f3c}
+  
+/^\p{Pf}/8
+    \x{bb}
+    \x{2019}
+    ** Failers
+    X
+    \x{203f}
+  
+/^\p{Pi}/8
+    \x{ab}
+    \x{2018}
+    ** Failers
+    X
+    \x{203f}
+  
+/^\p{Po}/8
+    !
+    \x{37e}
+    ** Failers
+    X
+    \x{203f}
+  
+/^\p{Ps}/8
+    (
+    [
+    {
+    \x{f3c}
+    ** Failers
+    X
+    )
+    ]
+    }
+    \x{f3b}
+  
+/^\p{Sc}+/8
+    $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6}
+    \x{9f2}
+    ** Failers
+    X
+    \x{2c2}
+  
+/^\p{Sk}/8
+    \x{2c2}
+    ** Failers
+    X
+    \x{9f2}
+  
+/^\p{Sm}+/8
+    +<|~\x{ac}\x{2044}
+    ** Failers
+    X
+    \x{9f2}
+  
+/^\p{So}/8
+    \x{a6}
+    \x{482} 
+    ** Failers
+    X
+    \x{9f2}
+  
+/^\p{Zl}/8
+    \x{2028}
+    ** Failers
+    X
+    \x{2029}
+  
+/^\p{Zp}/8
+    \x{2029}
+    ** Failers
+    X
+    \x{2028}
+  
+/^\p{Zs}/8
+    \ \
+    \x{a0}
+    \x{1680}
+    \x{180e}
+    \x{2000}
+    \x{2001}     
+    ** Failers
+    \x{2028}
+    \x{200d} 
+  
+/\p{Nd}+(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}+?(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,}(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,}?(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*?(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2}(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,3}(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,3}?(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}?(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}??(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(...)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(....)/8
+      ** Failers
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Lu}/8i
+    A
+    a\x{10a0}B 
+    ** Failers 
+    a
+    \x{1d00}  
+
+/\p{^Lu}/8i
+    1234
+    ** Failers
+    ABC 
+
+/\P{Lu}/8i
+    1234
+    ** Failers
+    ABC 
+
+/(?<=A\p{Nd})XYZ/8
+    A2XYZ
+    123A5XYZPQR
+    ABA\x{660}XYZpqr
+    ** Failers
+    AXYZ
+    XYZ     
+    
+/(?<!\pL)XYZ/8
+    1XYZ
+    AB=XYZ.. 
+    XYZ 
+    ** Failers
+    WXYZ 
+
+/[\p{L}]/D
+
+/[\p{^L}]/D
+
+/[\P{L}]/D
+
+/[\P{^L}]/D
+
+/[abc\p{L}\x{0660}]/8D
+
+/[\p{Nd}]/8DM
+    1234
+
+/[\p{Nd}+-]+/8DM
+    1234
+    12-34
+    12+\x{661}-34  
+    ** Failers
+    abcd  
+
+/[\P{Nd}]+/8
+    abcd
+    ** Failers
+    1234
+
+/\D+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+     
+/\P{Nd}+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\D]+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\P{Nd}]+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\D\P{Nd}]+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\pL/8
+    a
+    A 
+
+/\pL/8i
+    a
+    A 
+    
+/\p{Lu}/8 
+    A
+    aZ
+    ** Failers
+    abc   
+
+/\p{Lu}/8i
+    A
+    aZ
+    ** Failers
+    abc   
+
+/\p{Ll}/8 
+    a
+    Az
+    ** Failers
+    ABC   
+
+/\p{Ll}/8i 
+    a
+    Az
+    ** Failers
+    ABC   
+
+/^\x{c0}$/8i
+    \x{c0}
+    \x{e0} 
+
+/^\x{e0}$/8i
+    \x{c0}
+    \x{e0} 
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8
+    A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+    ** Failers
+    a\x{391}\x{10427}\x{ff3a}\x{1fb0}   
+    A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+    A\x{391}\x{1044F}\x{ff3a}\x{1fb0}
+    A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+    A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8i
+    A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+    a\x{391}\x{10427}\x{ff3a}\x{1fb0}   
+    A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+    A\x{391}\x{1044F}\x{ff3a}\x{1fb0}
+    A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+    A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iD
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8D
+
+/AB\x{1fb0}/8D
+
+/AB\x{1fb0}/8Di
+
+/\x{391}+/8i
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+
+/\x{391}{3,5}(.)/8i
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+
+/\x{391}{3,5}?(.)/8i
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+
+/[\x{391}\x{ff3a}]/8i
+    \x{391}
+    \x{ff3a}
+    \x{3b1}
+    \x{ff5a}   
+    
+/[\x{c0}\x{391}]/8i
+    \x{c0}
+    \x{e0} 
+
+/[\x{105}-\x{109}]/8iD
+    \x{104}
+    \x{105}
+    \x{109}  
+    ** Failers
+    \x{100}
+    \x{10a} 
+    
+/[z-\x{100}]/8iD 
+    Z
+    z
+    \x{39c}
+    \x{178}
+    |
+    \x{80}
+    \x{ff}
+    \x{100}
+    \x{101} 
+    ** Failers
+    \x{102}
+    Y
+    y           
+
+/[z-\x{100}]/8Di
+
+/^\X/8
+    A
+    A\x{300}BC 
+    A\x{300}\x{301}\x{302}BC 
+    *** Failers
+    \x{300}  
+
+/^[\X]/8
+    X123
+    *** Failers
+    AXYZ
+
+/^(\X*)C/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+
+/^(\X*?)C/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+
+/^(\X*)(.)/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+
+/^(\X*?)(.)/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+
+/^\X(.)/8
+    *** Failers
+    A\x{300}\x{301}\x{302}
+
+/^\X{2,3}(.)/8
+    A\x{300}\x{301}B\x{300}X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}DA\x{300}X
+    
+/^\X{2,3}?(.)/8
+    A\x{300}\x{301}B\x{300}X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}DA\x{300}X
+    
+/ End of testinput6 /
diff -Nurp tin-1.6.2/pcre/testdata/testinput7 tin-1.8.0/pcre/testdata/testinput7
--- tin-1.6.2/pcre/testdata/testinput7	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/testdata/testinput7	2005-09-12 16:42:32.000000000 +0200
@@ -0,0 +1,4013 @@
+/abc/
+    abc
+    
+/ab*c/
+    abc
+    abbbbc
+    ac
+    
+/ab+c/
+    abc
+    abbbbbbc
+    *** Failers 
+    ac
+    ab
+    
+/a*/
+    a
+    aaaaaaaaaaaaaaaaa
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\F 
+    
+/(a|abcd|african)/
+    a
+    abcd
+    african
+    
+/^abc/
+    abcdef
+    *** Failers
+    xyzabc
+    xyz\nabc    
+    
+/^abc/m
+    abcdef
+    xyz\nabc    
+    *** Failers
+    xyzabc
+    
+/\Aabc/
+    abcdef
+    *** Failers
+    xyzabc
+    xyz\nabc    
+    
+/\Aabc/m
+    abcdef
+    *** Failers
+    xyzabc
+    xyz\nabc    
+    
+/\Gabc/
+    abcdef
+    xyzabc\>3
+    *** Failers
+    xyzabc    
+    xyzabc\>2 
+    
+/x\dy\Dz/
+    x9yzz
+    x0y+z
+    *** Failers
+    xyz
+    xxy0z     
+    
+/x\sy\Sz/
+    x yzz
+    x y+z
+    *** Failers
+    xyz
+    xxyyz
+    
+/x\wy\Wz/
+    xxy+z
+    *** Failers
+    xxy0z
+    x+y+z         
+    
+/x.y/
+    x+y
+    x-y
+    *** Failers
+    x\ny
+    
+/x.y/s
+    x+y
+    x-y
+    x\ny
+
+/(a.b(?s)c.d|x.y)p.q/
+    a+bc+dp+q
+    a+bc\ndp+q
+    x\nyp+q 
+    *** Failers 
+    a\nbc\ndp+q
+    a+bc\ndp\nq
+    x\nyp\nq 
+
+/a\d\z/
+    ba0
+    *** Failers
+    ba0\n
+    ba0\ncd   
+
+/a\d\z/m
+    ba0
+    *** Failers
+    ba0\n
+    ba0\ncd   
+
+/a\d\Z/
+    ba0
+    ba0\n
+    *** Failers
+    ba0\ncd   
+
+/a\d\Z/m
+    ba0
+    ba0\n
+    *** Failers
+    ba0\ncd   
+
+/a\d$/
+    ba0
+    ba0\n
+    *** Failers
+    ba0\ncd   
+
+/a\d$/m
+    ba0
+    ba0\n
+    ba0\ncd   
+    *** Failers
+
+/abc/i
+    abc
+    aBc
+    ABC
+    
+/[^a]/
+    abcd
+    
+/ab?\w/
+    abz
+    abbz
+    azz  
+
+/x{0,3}yz/
+    ayzq
+    axyzq
+    axxyz
+    axxxyzq
+    axxxxyzq
+    *** Failers
+    ax
+    axx     
+      
+/x{3}yz/
+    axxxyzq
+    axxxxyzq
+    *** Failers
+    ax
+    axx     
+    ayzq
+    axyzq
+    axxyz
+      
+/x{2,3}yz/
+    axxyz
+    axxxyzq
+    axxxxyzq
+    *** Failers
+    ax
+    axx     
+    ayzq
+    axyzq
+      
+/[^a]+/
+    bac
+    bcdefax
+    *** Failers
+    aaaaa   
+
+/[^a]*/
+    bac
+    bcdefax
+    *** Failers
+    aaaaa   
+    
+/[^a]{3,5}/
+    xyz
+    awxyza
+    abcdefa
+    abcdefghijk
+    *** Failers
+    axya
+    axa
+    aaaaa         
+
+/\d*/
+    1234b567
+    xyz
+    
+/\D*/
+    a1234b567
+    xyz
+     
+/\d+/
+    ab1234c56
+    *** Failers
+    xyz
+    
+/\D+/
+    ab123c56
+    *** Failers
+    789
+    
+/\d?A/
+    045ABC
+    ABC
+    *** Failers
+    XYZ
+    
+/\D?A/
+    ABC
+    BAC
+    9ABC             
+    *** Failers
+
+/a+/
+    aaaa
+
+/^.*xyz/
+    xyz
+    ggggggggxyz
+    
+/^.+xyz/
+    abcdxyz
+    axyz
+    *** Failers
+    xyz
+    
+/^.?xyz/
+    xyz
+    cxyz       
+
+/^\d{2,3}X/
+    12X
+    123X
+    *** Failers
+    X
+    1X
+    1234X     
+
+/^[abcd]\d/
+    a45
+    b93
+    c99z
+    d04
+    *** Failers
+    e45
+    abcd      
+    abcd1234
+    1234  
+
+/^[abcd]*\d/
+    a45
+    b93
+    c99z
+    d04
+    abcd1234
+    1234  
+    *** Failers
+    e45
+    abcd      
+
+/^[abcd]+\d/
+    a45
+    b93
+    c99z
+    d04
+    abcd1234
+    *** Failers
+    1234  
+    e45
+    abcd      
+
+/^a+X/
+    aX
+    aaX 
+
+/^[abcd]?\d/
+    a45
+    b93
+    c99z
+    d04
+    1234  
+    *** Failers
+    abcd1234
+    e45
+
+/^[abcd]{2,3}\d/
+    ab45
+    bcd93
+    *** Failers
+    1234 
+    a36 
+    abcd1234
+    ee45
+
+/^(abc)*\d/
+    abc45
+    abcabcabc45
+    42xyz 
+    *** Failers
+
+/^(abc)+\d/
+    abc45
+    abcabcabc45
+    *** Failers
+    42xyz 
+
+/^(abc)?\d/
+    abc45
+    42xyz 
+    *** Failers
+    abcabcabc45
+
+/^(abc){2,3}\d/
+    abcabc45
+    abcabcabc45
+    *** Failers
+    abcabcabcabc45
+    abc45
+    42xyz 
+
+/1(abc|xyz)2(?1)3/
+    1abc2abc3456
+    1abc2xyz3456 
+
+/^(a*\w|ab)=(a*\w|ab)/
+    ab=ab
+
+/^(a*\w|ab)=(?1)/
+    ab=ab
+
+/^([^()]|\((?1)*\))*$/
+    abc
+    a(b)c
+    a(b(c))d  
+    *** Failers)
+    a(b(c)d  
+
+/^>abc>([^()]|\((?1)*\))*<xyz<$/
+    >abc>123<xyz<
+    >abc>1(2)3<xyz<
+    >abc>(1(2)3)<xyz<
+
+/^(?>a*)\d/
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9876
+    *** Failers 
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/< (?: (?(R) \d++  | [^<>]*+) | (?R)) * >/x
+    <>
+    <abcd>
+    <abc <123> hij>
+    <abc <def> hij>
+    <abc<>def> 
+    <abc<>      
+    *** Failers
+    <abc
+
+/^(?(?=abc)\w{3}:|\d\d)$/        
+    abc:                          
+    12                             
+    *** Failers                     
+    123                       
+    xyz                        
+                                
+/^(?(?!abc)\d\d|\w{3}:)$/      
+    abc:                        
+    12         
+    *** Failers
+    123
+    xyz    
+
+/^(?=abc)\w{5}:$/        
+    abcde:                          
+    *** Failers                     
+    abc.. 
+    123                       
+    vwxyz                        
+                                
+/^(?!abc)\d\d$/      
+    12         
+    *** Failers
+    abcde:
+    abc..  
+    123
+    vwxyz    
+
+/(?<=abc|xy)123/
+    abc12345
+    wxy123z
+    *** Failers
+    123abc
+
+/(?<!abc|xy)123/
+    123abc
+    mno123456 
+    *** Failers
+    abc12345
+    wxy123z
+
+/abc(?C1)xyz/
+    abcxyz
+    123abcxyz999 
+
+/(ab|cd){3,4}/C
+  ababab
+  abcdabcd
+  abcdcdcdcdcd  
+
+/^abc/
+    abcdef
+    *** Failers
+    abcdef\B  
+
+/^(a*|xyz)/
+    bcd
+    aaabcd
+    xyz
+    xyz\N  
+    *** Failers
+    bcd\N   
+    
+/xyz$/
+    xyz
+    xyz\n
+    *** Failers
+    xyz\Z
+    xyz\n\Z    
+    
+/xyz$/m
+    xyz
+    xyz\n 
+    abcxyz\npqr 
+    abcxyz\npqr\Z 
+    xyz\n\Z    
+    *** Failers
+    xyz\Z
+
+/\Gabc/
+    abcdef
+    defabcxyz\>3 
+    *** Failers 
+    defabcxyz
+
+/^abcdef/
+    ab\P
+    abcde\P
+    abcdef\P
+    *** Failers
+    abx\P    
+
+/^a{2,4}\d+z/
+    a\P
+    aa\P
+    aa2\P 
+    aaa\P
+    aaa23\P 
+    aaaa12345\P
+    aa0z\P
+    aaaa4444444444444z\P 
+    *** Failers
+    az\P 
+    aaaaa\P 
+    a56\P 
+
+/^abcdef/
+   abc\P
+   def\R 
+   
+/(?<=foo)bar/
+   xyzfo\P 
+   foob\R\P\>2 
+   foobar...\R\P\>4 
+   xyzfo\P
+   foobar\R\>2  
+   *** Failers
+   xyzfo\P
+   obar\R   
+
+/(ab*(cd|ef))+X/
+    adfadadaklhlkalkajhlkjahdfasdfasdfladsfjkj\P\Z
+    lkjhlkjhlkjhlkjhabbbbbbcdaefabbbbbbbefa\P\B\Z
+    cdabbbbbbbb\P\R\B\Z
+    efabbbbbbbbbbbbbbbb\P\R\B\Z
+    bbbbbbbbbbbbcdXyasdfadf\P\R\B\Z    
+
+/(a|b)/SF>testsavedregex
+<testsavedregex
+    abc
+    ** Failers
+    def  
+    
+/the quick brown fox/
+    the quick brown fox
+    The quick brown FOX
+    What do you know about the quick brown fox?
+    What do you know about THE QUICK BROWN FOX?
+
+/The quick brown fox/i
+    the quick brown fox
+    The quick brown FOX
+    What do you know about the quick brown fox?
+    What do you know about THE QUICK BROWN FOX?
+
+/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/
+    abcd\t\n\r\f\a\e9;\$\\?caxyz
+
+/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
+    abxyzpqrrrabbxyyyypqAzz
+    abxyzpqrrrabbxyyyypqAzz
+    aabxyzpqrrrabbxyyyypqAzz
+    aaabxyzpqrrrabbxyyyypqAzz
+    aaaabxyzpqrrrabbxyyyypqAzz
+    abcxyzpqrrrabbxyyyypqAzz
+    aabcxyzpqrrrabbxyyyypqAzz
+    aaabcxyzpqrrrabbxyyyypAzz
+    aaabcxyzpqrrrabbxyyyypqAzz
+    aaabcxyzpqrrrabbxyyyypqqAzz
+    aaabcxyzpqrrrabbxyyyypqqqAzz
+    aaabcxyzpqrrrabbxyyyypqqqqAzz
+    aaabcxyzpqrrrabbxyyyypqqqqqAzz
+    aaabcxyzpqrrrabbxyyyypqqqqqqAzz
+    aaaabcxyzpqrrrabbxyyyypqAzz
+    abxyzzpqrrrabbxyyyypqAzz
+    aabxyzzzpqrrrabbxyyyypqAzz
+    aaabxyzzzzpqrrrabbxyyyypqAzz
+    aaaabxyzzzzpqrrrabbxyyyypqAzz
+    abcxyzzpqrrrabbxyyyypqAzz
+    aabcxyzzzpqrrrabbxyyyypqAzz
+    aaabcxyzzzzpqrrrabbxyyyypqAzz
+    aaaabcxyzzzzpqrrrabbxyyyypqAzz
+    aaaabcxyzzzzpqrrrabbbxyyyypqAzz
+    aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
+    aaabcxyzpqrrrabbxyyyypABzz
+    aaabcxyzpqrrrabbxyyyypABBzz
+    >>>aaabxyzpqrrrabbxyyyypqAzz
+    >aaaabxyzpqrrrabbxyyyypqAzz
+    >>>>abcxyzpqrrrabbxyyyypqAzz
+    *** Failers
+    abxyzpqrrabbxyyyypqAzz
+    abxyzpqrrrrabbxyyyypqAzz
+    abxyzpqrrrabxyyyypqAzz
+    aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz
+    aaaabcxyzzzzpqrrrabbbxyyypqAzz
+    aaabcxyzpqrrrabbxyyyypqqqqqqqAzz
+
+/^(abc){1,2}zz/
+    abczz
+    abcabczz
+    *** Failers
+    zz
+    abcabcabczz
+    >>abczz
+
+/^(b+?|a){1,2}?c/
+    bc
+    bbc
+    bbbc
+    bac
+    bbac
+    aac
+    abbbbbbbbbbbc
+    bbbbbbbbbbbac
+    *** Failers
+    aaac
+    abbbbbbbbbbbac
+
+/^(b+|a){1,2}c/
+    bc
+    bbc
+    bbbc
+    bac
+    bbac
+    aac
+    abbbbbbbbbbbc
+    bbbbbbbbbbbac
+    *** Failers
+    aaac
+    abbbbbbbbbbbac
+
+/^(b+|a){1,2}?bc/
+    bbc
+
+/^(b*|ba){1,2}?bc/
+    babc
+    bbabc
+    bababc
+    *** Failers
+    bababbc
+    babababc
+
+/^(ba|b*){1,2}?bc/
+    babc
+    bbabc
+    bababc
+    *** Failers
+    bababbc
+    babababc
+
+/^\ca\cA\c[\c{\c:/
+    \x01\x01\e;z
+
+/^[ab\]cde]/
+    athing
+    bthing
+    ]thing
+    cthing
+    dthing
+    ething
+    *** Failers
+    fthing
+    [thing
+    \\thing
+
+/^[]cde]/
+    ]thing
+    cthing
+    dthing
+    ething
+    *** Failers
+    athing
+    fthing
+
+/^[^ab\]cde]/
+    fthing
+    [thing
+    \\thing
+    *** Failers
+    athing
+    bthing
+    ]thing
+    cthing
+    dthing
+    ething
+
+/^[^]cde]/
+    athing
+    fthing
+    *** Failers
+    ]thing
+    cthing
+    dthing
+    ething
+
+/^\/
+    
+
+/^ÿ/
+    ÿ
+
+/^[0-9]+$/
+    0
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+    8
+    9
+    10
+    100
+    *** Failers
+    abc
+
+/^.*nter/
+    enter
+    inter
+    uponter
+
+/^xxx[0-9]+$/
+    xxx0
+    xxx1234
+    *** Failers
+    xxx
+
+/^.+[0-9][0-9][0-9]$/
+    x123
+    xx123
+    123456
+    *** Failers
+    123
+    x1234
+
+/^.+?[0-9][0-9][0-9]$/
+    x123
+    xx123
+    123456
+    *** Failers
+    123
+    x1234
+
+/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
+    abc!pqr=apquxz.ixr.zzz.ac.uk
+    *** Failers
+    !pqr=apquxz.ixr.zzz.ac.uk
+    abc!=apquxz.ixr.zzz.ac.uk
+    abc!pqr=apquxz:ixr.zzz.ac.uk
+    abc!pqr=apquxz.ixr.zzz.ac.ukk
+
+/:/
+    Well, we need a colon: somewhere
+    *** Fail if we don't
+
+/([\da-f:]+)$/i
+    0abc
+    abc
+    fed
+    E
+    ::
+    5f03:12C0::932e
+    fed def
+    Any old stuff
+    *** Failers
+    0zzz
+    gzzz
+    fed\x20
+    Any old rubbish
+
+/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
+    .1.2.3
+    A.12.123.0
+    *** Failers
+    .1.2.3333
+    1.2.3
+    1234.2.3
+
+/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
+    1 IN SOA non-sp1 non-sp2(
+    1    IN    SOA    non-sp1    non-sp2   (
+    *** Failers
+    1IN SOA non-sp1 non-sp2(
+
+/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/
+    a.
+    Z.
+    2.
+    ab-c.pq-r.
+    sxk.zzz.ac.uk.
+    x-.y-.
+    *** Failers
+    -abc.peq.
+
+/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
+    *.a
+    *.b0-a
+    *.c3-b.c
+    *.c-a.b-c
+    *** Failers
+    *.0
+    *.a-
+    *.a-b.c-
+    *.c-a.0-c
+
+/^(?=ab(de))(abd)(e)/
+    abde
+
+/^(?!(ab)de|x)(abd)(f)/
+    abdf
+
+/^(?=(ab(cd)))(ab)/
+    abcd
+
+/^[\da-f](\.[\da-f])*$/i
+    a.b.c.d
+    A.B.C.D
+    a.b.c.1.2.3.C
+
+/^\".*\"\s*(;.*)?$/
+    \"1234\"
+    \"abcd\" ;
+    \"\" ; rhubarb
+    *** Failers
+    \"1234\" : things
+
+/^$/
+    \
+    *** Failers
+
+/   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/x
+    ab c
+    *** Failers
+    abc
+    ab cde
+
+/(?x)   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/
+    ab c
+    *** Failers
+    abc
+    ab cde
+
+/^   a\ b[c ]d       $/x
+    a bcd
+    a b d
+    *** Failers
+    abcd
+    ab d
+
+/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/
+    abcdefhijklm
+
+/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/
+    abcdefhijklm
+
+/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/
+    a+ Z0+\x08\n\x1d\x12
+
+/^[.^$|()*+?{,}]+/
+    .^\$(*+)|{?,?}
+
+/^a*\w/
+    z
+    az
+    aaaz
+    a
+    aa
+    aaaa
+    a+
+    aa+
+
+/^a*?\w/
+    z
+    az
+    aaaz
+    a
+    aa
+    aaaa
+    a+
+    aa+
+
+/^a+\w/
+    az
+    aaaz
+    aa
+    aaaa
+    aa+
+
+/^a+?\w/
+    az
+    aaaz
+    aa
+    aaaa
+    aa+
+
+/^\d{8}\w{2,}/
+    1234567890
+    12345678ab
+    12345678__
+    *** Failers
+    1234567
+
+/^[aeiou\d]{4,5}$/
+    uoie
+    1234
+    12345
+    aaaaa
+    *** Failers
+    123456
+
+/^[aeiou\d]{4,5}?/
+    uoie
+    1234
+    12345
+    aaaaa
+    123456
+
+/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/
+    From abcd  Mon Sep 01 12:33:02 1997
+
+/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
+    From abcd  Mon Sep 01 12:33:02 1997
+    From abcd  Mon Sep  1 12:33:02 1997
+    *** Failers
+    From abcd  Sep 01 12:33:02 1997
+
+/^12.34/s
+    12\n34
+    12\r34
+
+/\w+(?=\t)/
+    the quick brown\t fox
+
+/foo(?!bar)(.*)/
+    foobar is foolish see?
+
+/(?:(?!foo)...|^.{0,2})bar(.*)/
+    foobar crowbar etc
+    barrel
+    2barrel
+    A barrel
+
+/^(\D*)(?=\d)(?!123)/
+    abc456
+    *** Failers
+    abc123
+
+/^1234(?# test newlines
+  inside)/
+    1234
+
+/^1234 #comment in extended re
+  /x
+    1234
+
+/#rhubarb
+  abcd/x
+    abcd
+
+/^abcd#rhubarb/x
+    abcd
+
+/(?!^)abc/
+    the abc
+    *** Failers
+    abc
+
+/(?=^)abc/
+    abc
+    *** Failers
+    the abc
+
+/^[ab]{1,3}(ab*|b)/
+    aabbbbb
+
+/^[ab]{1,3}?(ab*|b)/
+    aabbbbb
+
+/^[ab]{1,3}?(ab*?|b)/
+    aabbbbb
+
+/^[ab]{1,3}(ab*?|b)/
+    aabbbbb
+
+/  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*                          # optional leading comment
+(?:    (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?:                      # opening quote...
+[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
+|                     #    or
+\\ [^\x80-\xff]           #   Escaped something (something != CR)
+)* "  # closing quote
+)                    # initial word
+(?:  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  \.  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*   (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?:                      # opening quote...
+[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
+|                     #    or
+\\ [^\x80-\xff]           #   Escaped something (something != CR)
+)* "  # closing quote
+)  )* # further okay, if led by a period
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  @  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*    (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                           # initial subdomain
+(?:                                  #
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  \.                        # if led by a period...
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*   (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                     #   ...further okay
+)*
+# address
+|                     #  or
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?:                      # opening quote...
+[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
+|                     #    or
+\\ [^\x80-\xff]           #   Escaped something (something != CR)
+)* "  # closing quote
+)             # one word, optionally followed by....
+(?:
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]  |  # atom and space parts, or...
+\(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)       |  # comments, or...
+
+" (?:                      # opening quote...
+[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
+|                     #    or
+\\ [^\x80-\xff]           #   Escaped something (something != CR)
+)* "  # closing quote
+# quoted strings
+)*
+<  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*                     # leading <
+(?:  @  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*    (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                           # initial subdomain
+(?:                                  #
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  \.                        # if led by a period...
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*   (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                     #   ...further okay
+)*
+
+(?:  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  ,  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  @  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*    (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                           # initial subdomain
+(?:                                  #
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  \.                        # if led by a period...
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*   (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                     #   ...further okay
+)*
+)* # further okay, if led by comma
+:                                # closing colon
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  )? #       optional route
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?:                      # opening quote...
+[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
+|                     #    or
+\\ [^\x80-\xff]           #   Escaped something (something != CR)
+)* "  # closing quote
+)                    # initial word
+(?:  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  \.  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*   (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?:                      # opening quote...
+[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
+|                     #    or
+\\ [^\x80-\xff]           #   Escaped something (something != CR)
+)* "  # closing quote
+)  )* # further okay, if led by a period
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  @  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*    (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                           # initial subdomain
+(?:                                  #
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  \.                        # if led by a period...
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*   (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                     #   ...further okay
+)*
+#       address spec
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  > #                  trailing >
+# name and address
+)  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*                       # optional trailing comment
+/x
+    Alan Other <user\@dom.ain>
+    <user\@dom.ain>
+    user\@dom.ain
+    \"A. Other\" <user.1234\@dom.ain> (a comment)
+    A. Other <user.1234\@dom.ain> (a comment)
+    \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
+    A missing angle <user\@some.where
+    *** Failers
+    The quick brown fox
+
+/[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+|                       #  or
+"                                     # "
+[^\\\x80-\xff\n\015"] *                            #   normal
+(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
+"                                     #        "
+# Quoted string
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+\.
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+|                       #  or
+"                                     # "
+[^\\\x80-\xff\n\015"] *                            #   normal
+(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
+"                                     #        "
+# Quoted string
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+|                             #  or
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+|                       #  or
+"                                     # "
+[^\\\x80-\xff\n\015"] *                            #   normal
+(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
+"                                     #        "
+# Quoted string
+)
+# leading word
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] *               # "normal" atoms and or spaces
+(?:
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+|
+"                                     # "
+[^\\\x80-\xff\n\015"] *                            #   normal
+(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
+"                                     #        "
+) # "special" comment or quoted string
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] *            #  more "normal"
+)*
+<
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# <
+(?:
+@
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+@
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)*  # additional domains
+:
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+)?     #       optional route
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+|                       #  or
+"                                     # "
+[^\\\x80-\xff\n\015"] *                            #   normal
+(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
+"                                     #        "
+# Quoted string
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+\.
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+|                       #  or
+"                                     # "
+[^\\\x80-\xff\n\015"] *                            #   normal
+(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
+"                                     #        "
+# Quoted string
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+)*
+#       address spec
+>                    #                 >
+# name and address
+)
+/x
+    Alan Other <user\@dom.ain>
+    <user\@dom.ain>
+    user\@dom.ain
+    \"A. Other\" <user.1234\@dom.ain> (a comment)
+    A. Other <user.1234\@dom.ain> (a comment)
+    \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
+    A missing angle <user\@some.where
+    *** Failers
+    The quick brown fox
+
+/abc\0def\00pqr\000xyz\0000AB/
+    abc\0def\00pqr\000xyz\0000AB
+    abc456 abc\0def\00pqr\000xyz\0000ABCDE
+
+/abc\x0def\x00pqr\x000xyz\x0000AB/
+    abc\x0def\x00pqr\x000xyz\x0000AB
+    abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE
+
+/^[\000-\037]/
+    \0A
+    \01B
+    \037C
+
+/\0*/
+    \0\0\0\0
+
+/A\x0{2,3}Z/
+    The A\x0\x0Z
+    An A\0\x0\0Z
+    *** Failers
+    A\0Z
+    A\0\x0\0\x0Z
+
+/^\s/
+    \040abc
+    \x0cabc
+    \nabc
+    \rabc
+    \tabc
+    *** Failers
+    abc
+
+/^a	b
+      c/x
+    abc
+
+/ab{1,3}bc/
+    abbbbc
+    abbbc
+    abbc
+    *** Failers
+    abc
+    abbbbbc
+
+/([^.]*)\.([^:]*):[T ]+(.*)/
+    track1.title:TBlah blah blah
+
+/([^.]*)\.([^:]*):[T ]+(.*)/i
+    track1.title:TBlah blah blah
+
+/([^.]*)\.([^:]*):[t ]+(.*)/i
+    track1.title:TBlah blah blah
+
+/^[W-c]+$/
+    WXY_^abc
+    *** Failers
+    wxy
+
+/^[W-c]+$/i
+    WXY_^abc
+    wxy_^ABC
+
+/^[\x3f-\x5F]+$/i
+    WXY_^abc
+    wxy_^ABC
+
+/^abc$/m
+    abc
+    qqq\nabc
+    abc\nzzz
+    qqq\nabc\nzzz
+
+/^abc$/
+    abc
+    *** Failers
+    qqq\nabc
+    abc\nzzz
+    qqq\nabc\nzzz
+
+/\Aabc\Z/m
+    abc
+    abc\n 
+    *** Failers
+    qqq\nabc
+    abc\nzzz
+    qqq\nabc\nzzz
+    
+/\A(.)*\Z/s
+    abc\ndef
+
+/\A(.)*\Z/m
+    *** Failers
+    abc\ndef
+
+/(?:b)|(?::+)/
+    b::c
+    c::b
+
+/[-az]+/
+    az-
+    *** Failers
+    b
+
+/[az-]+/
+    za-
+    *** Failers
+    b
+
+/[a\-z]+/
+    a-z
+    *** Failers
+    b
+
+/[a-z]+/
+    abcdxyz
+
+/[\d-]+/
+    12-34
+    *** Failers
+    aaa
+
+/[\d-z]+/
+    12-34z
+    *** Failers
+    aaa
+
+/\x5c/
+    \\
+
+/\x20Z/
+    the Zoo
+    *** Failers
+    Zulu
+
+/ab{3cd/
+    ab{3cd
+
+/ab{3,cd/
+    ab{3,cd
+
+/ab{3,4a}cd/
+    ab{3,4a}cd
+
+/{4,5a}bc/
+    {4,5a}bc
+
+/^a.b/
+    a\rb
+    *** Failers
+    a\nb
+
+/abc$/
+    abc
+    abc\n
+    *** Failers
+    abc\ndef
+
+/(abc)\123/
+    abc\x53
+
+/(abc)\223/
+    abc\x93
+
+/(abc)\323/
+    abc\xd3
+
+/(abc)\500/
+    abc\x40
+    abc\100
+
+/(abc)\5000/
+    abc\x400
+    abc\x40\x30
+    abc\1000
+    abc\100\x30
+    abc\100\060
+    abc\100\60
+
+/abc\81/
+    abc\081
+    abc\0\x38\x31
+
+/abc\91/
+    abc\091
+    abc\0\x39\x31
+
+/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
+    abcdefghijk\12S
+
+/ab\gdef/
+    abgdef
+
+/a{0}bc/
+    bc
+
+/(a|(bc)){0,0}?xyz/
+    xyz
+
+/abc[\10]de/
+    abc\010de
+
+/abc[\1]de/
+    abc\1de
+
+/(abc)[\1]de/
+    abc\1de
+
+/(?s)a.b/
+    a\nb
+
+/^([^a])([^\b])([^c]*)([^d]{3,4})/
+    baNOTccccd
+    baNOTcccd
+    baNOTccd
+    bacccd
+    *** Failers
+    anything
+    b\bc   
+    baccd
+
+/[^a]/
+    Abc
+  
+/[^a]/i
+    Abc 
+
+/[^a]+/
+    AAAaAbc
+  
+/[^a]+/i
+    AAAaAbc 
+
+/[^a]+/
+    bbb\nccc
+   
+/[^k]$/
+    abc
+    *** Failers
+    abk   
+   
+/[^k]{2,3}$/
+    abc
+    kbc
+    kabc 
+    *** Failers
+    abk
+    akb
+    akk 
+
+/^\d{8,}\@.+[^k]$/
+    12345678\@a.b.c.d
+    123456789\@x.y.z
+    *** Failers
+    12345678\@x.y.uk
+    1234567\@a.b.c.d       
+
+/[^a]/
+    aaaabcd
+    aaAabcd 
+
+/[^a]/i
+    aaaabcd
+    aaAabcd 
+
+/[^az]/
+    aaaabcd
+    aaAabcd 
+
+/[^az]/i
+    aaaabcd
+    aaAabcd 
+
+/\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377/
+ \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377
+
+/P[^*]TAIRE[^*]{1,6}?LL/
+    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
+
+/P[^*]TAIRE[^*]{1,}?LL/
+    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
+
+/(\.\d\d[1-9]?)\d+/
+    1.230003938
+    1.875000282   
+    1.235  
+                  
+/(\.\d\d((?=0)|\d(?=\d)))/
+    1.230003938      
+    1.875000282
+    *** Failers 
+    1.235 
+    
+/a(?)b/
+    ab 
+ 
+/\b(foo)\s+(\w+)/i
+    Food is on the foo table
+    
+/foo(.*)bar/
+    The food is under the bar in the barn.
+    
+/foo(.*?)bar/  
+    The food is under the bar in the barn.
+
+/(.*)(\d*)/
+    I have 2 numbers: 53147
+    
+/(.*)(\d+)/
+    I have 2 numbers: 53147
+ 
+/(.*?)(\d*)/
+    I have 2 numbers: 53147
+
+/(.*?)(\d+)/
+    I have 2 numbers: 53147
+
+/(.*)(\d+)$/
+    I have 2 numbers: 53147
+
+/(.*?)(\d+)$/
+    I have 2 numbers: 53147
+
+/(.*)\b(\d+)$/
+    I have 2 numbers: 53147
+
+/(.*\D)(\d+)$/
+    I have 2 numbers: 53147
+
+/^\D*(?!123)/
+    ABC123
+     
+/^(\D*)(?=\d)(?!123)/
+    ABC445
+    *** Failers
+    ABC123
+    
+/^[W-]46]/
+    W46]789 
+    -46]789
+    *** Failers
+    Wall
+    Zebra
+    42
+    [abcd] 
+    ]abcd[
+       
+/^[W-\]46]/
+    W46]789 
+    Wall
+    Zebra
+    Xylophone  
+    42
+    [abcd] 
+    ]abcd[
+    \\backslash 
+    *** Failers
+    -46]789
+    well
+    
+/\d\d\/\d\d\/\d\d\d\d/
+    01/01/2000
+
+/word (?:[a-zA-Z0-9]+ ){0,10}otherword/
+  word cat dog elephant mussel cow horse canary baboon snake shark otherword
+  word cat dog elephant mussel cow horse canary baboon snake shark
+
+/word (?:[a-zA-Z0-9]+ ){0,300}otherword/
+  word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
+
+/^(a){0,0}/
+    bcd
+    abc
+    aab     
+
+/^(a){0,1}/
+    bcd
+    abc
+    aab  
+
+/^(a){0,2}/
+    bcd
+    abc
+    aab  
+
+/^(a){0,3}/
+    bcd
+    abc
+    aab
+    aaa   
+
+/^(a){0,}/
+    bcd
+    abc
+    aab
+    aaa
+    aaaaaaaa    
+
+/^(a){1,1}/
+    bcd
+    abc
+    aab  
+
+/^(a){1,2}/
+    bcd
+    abc
+    aab  
+
+/^(a){1,3}/
+    bcd
+    abc
+    aab
+    aaa   
+
+/^(a){1,}/
+    bcd
+    abc
+    aab
+    aaa
+    aaaaaaaa    
+
+/.*\.gif/
+    borfle\nbib.gif\nno
+
+/.{0,}\.gif/
+    borfle\nbib.gif\nno
+
+/.*\.gif/m
+    borfle\nbib.gif\nno
+
+/.*\.gif/s
+    borfle\nbib.gif\nno
+
+/.*\.gif/ms
+    borfle\nbib.gif\nno
+    
+/.*$/
+    borfle\nbib.gif\nno
+
+/.*$/m
+    borfle\nbib.gif\nno
+
+/.*$/s
+    borfle\nbib.gif\nno
+
+/.*$/ms
+    borfle\nbib.gif\nno
+    
+/.*$/
+    borfle\nbib.gif\nno\n
+
+/.*$/m
+    borfle\nbib.gif\nno\n
+
+/.*$/s
+    borfle\nbib.gif\nno\n
+
+/.*$/ms
+    borfle\nbib.gif\nno\n
+    
+/(.*X|^B)/
+    abcde\n1234Xyz
+    BarFoo 
+    *** Failers
+    abcde\nBar  
+
+/(.*X|^B)/m
+    abcde\n1234Xyz
+    BarFoo 
+    abcde\nBar  
+
+/(.*X|^B)/s
+    abcde\n1234Xyz
+    BarFoo 
+    *** Failers
+    abcde\nBar  
+
+/(.*X|^B)/ms
+    abcde\n1234Xyz
+    BarFoo 
+    abcde\nBar  
+
+/(?s)(.*X|^B)/
+    abcde\n1234Xyz
+    BarFoo 
+    *** Failers 
+    abcde\nBar  
+
+/(?s:.*X|^B)/
+    abcde\n1234Xyz
+    BarFoo 
+    *** Failers 
+    abcde\nBar  
+
+/^.*B/
+    **** Failers
+    abc\nB
+     
+/(?s)^.*B/
+    abc\nB
+
+/(?m)^.*B/
+    abc\nB
+     
+/(?ms)^.*B/
+    abc\nB
+
+/(?ms)^B/
+    abc\nB
+
+/(?s)B$/
+    B\n
+
+/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
+    123456654321
+  
+/^\d\d\d\d\d\d\d\d\d\d\d\d/
+    123456654321 
+
+/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/
+    123456654321
+  
+/^[abc]{12}/
+    abcabcabcabc
+    
+/^[a-c]{12}/
+    abcabcabcabc
+    
+/^(a|b|c){12}/
+    abcabcabcabc 
+
+/^[abcdefghijklmnopqrstuvwxy0123456789]/
+    n
+    *** Failers 
+    z 
+
+/abcde{0,0}/
+    abcd
+    *** Failers
+    abce  
+
+/ab[cd]{0,0}e/
+    abe
+    *** Failers
+    abcde 
+    
+/ab(c){0,0}d/
+    abd
+    *** Failers
+    abcd   
+
+/a(b*)/
+    a
+    ab
+    abbbb
+    *** Failers
+    bbbbb    
+    
+/ab\d{0}e/
+    abe
+    *** Failers
+    ab1e   
+    
+/"([^\\"]+|\\.)*"/
+    the \"quick\" brown fox
+    \"the \\\"quick\\\" brown fox\" 
+
+/.*?/g+
+    abc
+  
+/\b/g+
+    abc 
+
+/\b/+g
+    abc 
+
+//g
+    abc
+
+/<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is
+  <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
+
+/a[^a]b/
+    acb
+    a\nb
+    
+/a.b/
+    acb
+    *** Failers 
+    a\nb   
+    
+/a[^a]b/s
+    acb
+    a\nb  
+    
+/a.b/s
+    acb
+    a\nb  
+
+/^(b+?|a){1,2}?c/
+    bac
+    bbac
+    bbbac
+    bbbbac
+    bbbbbac 
+
+/^(b+|a){1,2}?c/
+    bac
+    bbac
+    bbbac
+    bbbbac
+    bbbbbac 
+    
+/(?!\A)x/m
+    x\nb\n
+    a\bx\n  
+    
+/\x0{ab}/
+    \0{ab} 
+
+/(A|B)*?CD/
+    CD 
+    
+/(A|B)*CD/
+    CD 
+
+/(?<!bar)foo/
+    foo
+    catfood
+    arfootle
+    rfoosh
+    *** Failers
+    barfoo
+    towbarfoo
+
+/\w{3}(?<!bar)foo/
+    catfood
+    *** Failers
+    foo
+    barfoo
+    towbarfoo
+
+/(?<=(foo)a)bar/
+    fooabar
+    *** Failers
+    bar
+    foobbar
+      
+/\Aabc\z/m
+    abc
+    *** Failers
+    abc\n   
+    qqq\nabc
+    abc\nzzz
+    qqq\nabc\nzzz
+
+"(?>.*/)foo"
+    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
+
+"(?>.*/)foo"
+    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
+
+/(?>(\.\d\d[1-9]?))\d+/
+    1.230003938
+    1.875000282
+    *** Failers 
+    1.235 
+
+/^((?>\w+)|(?>\s+))*$/
+    now is the time for all good men to come to the aid of the party
+    *** Failers
+    this is not a line with only words and spaces!
+    
+/(\d+)(\w)/
+    12345a
+    12345+ 
+
+/((?>\d+))(\w)/
+    12345a
+    *** Failers
+    12345+ 
+
+/(?>a+)b/
+    aaab
+
+/((?>a+)b)/
+    aaab
+
+/(?>(a+))b/
+    aaab
+
+/(?>b)+/
+    aaabbbccc
+
+/(?>a+|b+|c+)*c/
+    aaabbbbccccd
+    
+/(a+|b+|c+)*c/
+    aaabbbbccccd
+
+/((?>[^()]+)|\([^()]*\))+/
+    ((abc(ade)ufh()()x
+    
+/\(((?>[^()]+)|\([^()]+\))+\)/ 
+    (abc)
+    (abc(def)xyz)
+    *** Failers
+    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   
+
+/a(?-i)b/i
+    ab
+    Ab
+    *** Failers 
+    aB
+    AB
+        
+/(a (?x)b c)d e/
+    a bcd e
+    *** Failers
+    a b cd e
+    abcd e   
+    a bcde 
+ 
+/(a b(?x)c d (?-x)e f)/
+    a bcde f
+    *** Failers
+    abcdef  
+
+/(a(?i)b)c/
+    abc
+    aBc
+    *** Failers
+    abC
+    aBC  
+    Abc
+    ABc
+    ABC
+    AbC
+    
+/a(?i:b)c/
+    abc
+    aBc
+    *** Failers 
+    ABC
+    abC
+    aBC
+    
+/a(?i:b)*c/
+    aBc
+    aBBc
+    *** Failers 
+    aBC
+    aBBC
+    
+/a(?=b(?i)c)\w\wd/
+    abcd
+    abCd
+    *** Failers
+    aBCd
+    abcD     
+    
+/(?s-i:more.*than).*million/i
+    more than million
+    more than MILLION
+    more \n than Million 
+    *** Failers
+    MORE THAN MILLION    
+    more \n than \n million 
+
+/(?:(?s-i)more.*than).*million/i
+    more than million
+    more than MILLION
+    more \n than Million 
+    *** Failers
+    MORE THAN MILLION    
+    more \n than \n million 
+    
+/(?>a(?i)b+)+c/ 
+    abc
+    aBbc
+    aBBc 
+    *** Failers
+    Abc
+    abAb    
+    abbC 
+    
+/(?=a(?i)b)\w\wc/
+    abc
+    aBc
+    *** Failers
+    Ab 
+    abC
+    aBC     
+    
+/(?<=a(?i)b)(\w\w)c/
+    abxxc
+    aBxxc
+    *** Failers
+    Abxxc
+    ABxxc
+    abxxC      
+
+/^(?(?=abc)\w{3}:|\d\d)$/
+    abc:
+    12
+    *** Failers
+    123
+    xyz    
+
+/^(?(?!abc)\d\d|\w{3}:)$/
+    abc:
+    12
+    *** Failers
+    123
+    xyz    
+    
+/(?(?<=foo)bar|cat)/
+    foobar
+    cat
+    fcat
+    focat   
+    *** Failers
+    foocat  
+
+/(?(?<!foo)cat|bar)/
+    foobar
+    cat
+    fcat
+    focat   
+    *** Failers
+    foocat  
+
+/(?>a*)*/
+    a
+    aa
+    aaaa
+    
+/(abc|)+/
+    abc
+    abcabc
+    abcabcabc
+    xyz      
+
+/([a]*)*/
+    a
+    aaaaa 
+ 
+/([ab]*)*/
+    a
+    b
+    ababab
+    aaaabcde
+    bbbb    
+ 
+/([^a]*)*/
+    b
+    bbbb
+    aaa   
+ 
+/([^ab]*)*/
+    cccc
+    abab  
+ 
+/([a]*?)*/
+    a
+    aaaa 
+ 
+/([ab]*?)*/
+    a
+    b
+    abab
+    baba   
+ 
+/([^a]*?)*/
+    b
+    bbbb
+    aaa   
+ 
+/([^ab]*?)*/
+    c
+    cccc
+    baba   
+ 
+/(?>a*)*/
+    a
+    aaabcde 
+ 
+/((?>a*))*/
+    aaaaa
+    aabbaa 
+ 
+/((?>a*?))*/
+    aaaaa
+    aabbaa 
+
+/(?(?=[^a-z]+[a-z])  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} ) /x
+    12-sep-98
+    12-09-98
+    *** Failers
+    sep-12-98
+        
+/(?i:saturday|sunday)/
+    saturday
+    sunday
+    Saturday
+    Sunday
+    SATURDAY
+    SUNDAY
+    SunDay
+    
+/(a(?i)bc|BB)x/
+    abcx
+    aBCx
+    bbx
+    BBx
+    *** Failers
+    abcX
+    aBCX
+    bbX
+    BBX               
+
+/^([ab](?i)[cd]|[ef])/
+    ac
+    aC
+    bD
+    elephant
+    Europe 
+    frog
+    France
+    *** Failers
+    Africa     
+
+/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
+    ab
+    aBd
+    xy
+    xY
+    zebra
+    Zambesi
+    *** Failers
+    aCD  
+    XY  
+
+/(?<=foo\n)^bar/m
+    foo\nbar
+    *** Failers
+    bar
+    baz\nbar   
+
+/(?<=(?<!foo)bar)baz/
+    barbaz
+    barbarbaz 
+    koobarbaz 
+    *** Failers
+    baz
+    foobarbaz 
+
+/The following tests are taken from the Perl 5.005 test suite; some of them/
+/are compatible with 5.004, but I'd rather not have to sort them out./
+
+/abc/
+    abc
+    xabcy
+    ababc
+    *** Failers
+    xbc
+    axc
+    abx
+
+/ab*c/
+    abc
+
+/ab*bc/
+    abc
+    abbc
+    abbbbc
+
+/.{1}/
+    abbbbc
+
+/.{3,4}/
+    abbbbc
+
+/ab{0,}bc/
+    abbbbc
+
+/ab+bc/
+    abbc
+    *** Failers
+    abc
+    abq
+
+/ab{1,}bc/
+
+/ab+bc/
+    abbbbc
+
+/ab{1,}bc/
+    abbbbc
+
+/ab{1,3}bc/
+    abbbbc
+
+/ab{3,4}bc/
+    abbbbc
+
+/ab{4,5}bc/
+    *** Failers
+    abq
+    abbbbc
+
+/ab?bc/
+    abbc
+    abc
+
+/ab{0,1}bc/
+    abc
+
+/ab?bc/
+
+/ab?c/
+    abc
+
+/ab{0,1}c/
+    abc
+
+/^abc$/
+    abc
+    *** Failers
+    abbbbc
+    abcc
+
+/^abc/
+    abcc
+
+/^abc$/
+
+/abc$/
+    aabc
+    *** Failers
+    aabc
+    aabcd
+
+/^/
+    abc
+
+/$/
+    abc
+
+/a.c/
+    abc
+    axc
+
+/a.*c/
+    axyzc
+
+/a[bc]d/
+    abd
+    *** Failers
+    axyzd
+    abc
+
+/a[b-d]e/
+    ace
+
+/a[b-d]/
+    aac
+
+/a[-b]/
+    a-
+
+/a[b-]/
+    a-
+
+/a]/
+    a]
+
+/a[]]b/
+    a]b
+
+/a[^bc]d/
+    aed
+    *** Failers
+    abd
+    abd
+
+/a[^-b]c/
+    adc
+
+/a[^]b]c/
+    adc
+    *** Failers
+    a-c
+    a]c
+
+/\ba\b/
+    a-
+    -a
+    -a-
+
+/\by\b/
+    *** Failers
+    xy
+    yz
+    xyz
+
+/\Ba\B/
+    *** Failers
+    a-
+    -a
+    -a-
+
+/\By\b/
+    xy
+
+/\by\B/
+    yz
+
+/\By\B/
+    xyz
+
+/\w/
+    a
+
+/\W/
+    -
+    *** Failers
+    -
+    a
+
+/a\sb/
+    a b
+
+/a\Sb/
+    a-b
+    *** Failers
+    a-b
+    a b
+
+/\d/
+    1
+
+/\D/
+    -
+    *** Failers
+    -
+    1
+
+/[\w]/
+    a
+
+/[\W]/
+    -
+    *** Failers
+    -
+    a
+
+/a[\s]b/
+    a b
+
+/a[\S]b/
+    a-b
+    *** Failers
+    a-b
+    a b
+
+/[\d]/
+    1
+
+/[\D]/
+    -
+    *** Failers
+    -
+    1
+
+/ab|cd/
+    abc
+    abcd
+
+/()ef/
+    def
+
+/$b/
+
+/a\(b/
+    a(b
+
+/a\(*b/
+    ab
+    a((b
+
+/a\\b/
+    a\b
+
+/((a))/
+    abc
+
+/(a)b(c)/
+    abc
+
+/a+b+c/
+    aabbabc
+
+/a{1,}b{1,}c/
+    aabbabc
+
+/a.+?c/
+    abcabc
+
+/(a+|b)*/
+    ab
+
+/(a+|b){0,}/
+    ab
+
+/(a+|b)+/
+    ab
+
+/(a+|b){1,}/
+    ab
+
+/(a+|b)?/
+    ab
+
+/(a+|b){0,1}/
+    ab
+
+/[^ab]*/
+    cde
+
+/abc/
+    *** Failers
+    b
+    
+
+/a*/
+    
+
+/([abc])*d/
+    abbbcd
+
+/([abc])*bcd/
+    abcd
+
+/a|b|c|d|e/
+    e
+
+/(a|b|c|d|e)f/
+    ef
+
+/abcd*efg/
+    abcdefg
+
+/ab*/
+    xabyabbbz
+    xayabbbz
+
+/(ab|cd)e/
+    abcde
+
+/[abhgefdc]ij/
+    hij
+
+/^(ab|cd)e/
+
+/(abc|)ef/
+    abcdef
+
+/(a|b)c*d/
+    abcd
+
+/(ab|ab*)bc/
+    abc
+
+/a([bc]*)c*/
+    abc
+
+/a([bc]*)(c*d)/
+    abcd
+
+/a([bc]+)(c*d)/
+    abcd
+
+/a([bc]*)(c+d)/
+    abcd
+
+/a[bcd]*dcdcde/
+    adcdcde
+
+/a[bcd]+dcdcde/
+    *** Failers
+    abcde
+    adcdcde
+
+/(ab|a)b*c/
+    abc
+
+/((a)(b)c)(d)/
+    abcd
+
+/[a-zA-Z_][a-zA-Z0-9_]*/
+    alpha
+
+/^a(bc+|b[eh])g|.h$/
+    abh
+
+/(bc+d$|ef*g.|h?i(j|k))/
+    effgz
+    ij
+    reffgz
+    *** Failers
+    effg
+    bcdd
+
+/((((((((((a))))))))))/
+    a
+
+/(((((((((a)))))))))/
+    a
+
+/multiple words of text/
+    *** Failers
+    aa
+    uh-uh
+
+/multiple words/
+    multiple words, yeah
+
+/(.*)c(.*)/
+    abcde
+
+/\((.*), (.*)\)/
+    (a, b)
+
+/[k]/
+
+/abcd/
+    abcd
+
+/a(bc)d/
+    abcd
+
+/a[-]?c/
+    ac
+
+/abc/i
+    ABC
+    XABCY
+    ABABC
+    *** Failers
+    aaxabxbaxbbx
+    XBC
+    AXC
+    ABX
+
+/ab*c/i
+    ABC
+
+/ab*bc/i
+    ABC
+    ABBC
+
+/ab*?bc/i
+    ABBBBC
+
+/ab{0,}?bc/i
+    ABBBBC
+
+/ab+?bc/i
+    ABBC
+
+/ab+bc/i
+    *** Failers
+    ABC
+    ABQ
+
+/ab{1,}bc/i
+
+/ab+bc/i
+    ABBBBC
+
+/ab{1,}?bc/i
+    ABBBBC
+
+/ab{1,3}?bc/i
+    ABBBBC
+
+/ab{3,4}?bc/i
+    ABBBBC
+
+/ab{4,5}?bc/i
+    *** Failers
+    ABQ
+    ABBBBC
+
+/ab??bc/i
+    ABBC
+    ABC
+
+/ab{0,1}?bc/i
+    ABC
+
+/ab??bc/i
+
+/ab??c/i
+    ABC
+
+/ab{0,1}?c/i
+    ABC
+
+/^abc$/i
+    ABC
+    *** Failers
+    ABBBBC
+    ABCC
+
+/^abc/i
+    ABCC
+
+/^abc$/i
+
+/abc$/i
+    AABC
+
+/^/i
+    ABC
+
+/$/i
+    ABC
+
+/a.c/i
+    ABC
+    AXC
+
+/a.*?c/i
+    AXYZC
+
+/a.*c/i
+    *** Failers
+    AABC
+    AXYZD
+
+/a[bc]d/i
+    ABD
+
+/a[b-d]e/i
+    ACE
+    *** Failers
+    ABC
+    ABD
+
+/a[b-d]/i
+    AAC
+
+/a[-b]/i
+    A-
+
+/a[b-]/i
+    A-
+
+/a]/i
+    A]
+
+/a[]]b/i
+    A]B
+
+/a[^bc]d/i
+    AED
+
+/a[^-b]c/i
+    ADC
+    *** Failers
+    ABD
+    A-C
+
+/a[^]b]c/i
+    ADC
+
+/ab|cd/i
+    ABC
+    ABCD
+
+/()ef/i
+    DEF
+
+/$b/i
+    *** Failers
+    A]C
+    B
+
+/a\(b/i
+    A(B
+
+/a\(*b/i
+    AB
+    A((B
+
+/a\\b/i
+    A\B
+
+/((a))/i
+    ABC
+
+/(a)b(c)/i
+    ABC
+
+/a+b+c/i
+    AABBABC
+
+/a{1,}b{1,}c/i
+    AABBABC
+
+/a.+?c/i
+    ABCABC
+
+/a.*?c/i
+    ABCABC
+
+/a.{0,5}?c/i
+    ABCABC
+
+/(a+|b)*/i
+    AB
+
+/(a+|b){0,}/i
+    AB
+
+/(a+|b)+/i
+    AB
+
+/(a+|b){1,}/i
+    AB
+
+/(a+|b)?/i
+    AB
+
+/(a+|b){0,1}/i
+    AB
+
+/(a+|b){0,1}?/i
+    AB
+
+/[^ab]*/i
+    CDE
+
+/abc/i
+
+/a*/i
+    
+
+/([abc])*d/i
+    ABBBCD
+
+/([abc])*bcd/i
+    ABCD
+
+/a|b|c|d|e/i
+    E
+
+/(a|b|c|d|e)f/i
+    EF
+
+/abcd*efg/i
+    ABCDEFG
+
+/ab*/i
+    XABYABBBZ
+    XAYABBBZ
+
+/(ab|cd)e/i
+    ABCDE
+
+/[abhgefdc]ij/i
+    HIJ
+
+/^(ab|cd)e/i
+    ABCDE
+
+/(abc|)ef/i
+    ABCDEF
+
+/(a|b)c*d/i
+    ABCD
+
+/(ab|ab*)bc/i
+    ABC
+
+/a([bc]*)c*/i
+    ABC
+
+/a([bc]*)(c*d)/i
+    ABCD
+
+/a([bc]+)(c*d)/i
+    ABCD
+
+/a([bc]*)(c+d)/i
+    ABCD
+
+/a[bcd]*dcdcde/i
+    ADCDCDE
+
+/a[bcd]+dcdcde/i
+
+/(ab|a)b*c/i
+    ABC
+
+/((a)(b)c)(d)/i
+    ABCD
+
+/[a-zA-Z_][a-zA-Z0-9_]*/i
+    ALPHA
+
+/^a(bc+|b[eh])g|.h$/i
+    ABH
+
+/(bc+d$|ef*g.|h?i(j|k))/i
+    EFFGZ
+    IJ
+    REFFGZ
+    *** Failers
+    ADCDCDE
+    EFFG
+    BCDD
+
+/((((((((((a))))))))))/i
+    A
+
+/(((((((((a)))))))))/i
+    A
+
+/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i
+    A
+
+/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i
+    C
+
+/multiple words of text/i
+    *** Failers
+    AA
+    UH-UH
+
+/multiple words/i
+    MULTIPLE WORDS, YEAH
+
+/(.*)c(.*)/i
+    ABCDE
+
+/\((.*), (.*)\)/i
+    (A, B)
+
+/[k]/i
+
+/abcd/i
+    ABCD
+
+/a(bc)d/i
+    ABCD
+
+/a[-]?c/i
+    AC
+
+/a(?!b)./
+    abad
+
+/a(?=d)./
+    abad
+
+/a(?=c|d)./
+    abad
+
+/a(?:b|c|d)(.)/
+    ace
+
+/a(?:b|c|d)*(.)/
+    ace
+
+/a(?:b|c|d)+?(.)/
+    ace
+    acdbcdbe
+
+/a(?:b|c|d)+(.)/
+    acdbcdbe
+
+/a(?:b|c|d){2}(.)/
+    acdbcdbe
+
+/a(?:b|c|d){4,5}(.)/
+    acdbcdbe
+
+/a(?:b|c|d){4,5}?(.)/
+    acdbcdbe
+
+/((foo)|(bar))*/
+    foobar
+
+/a(?:b|c|d){6,7}(.)/
+    acdbcdbe
+
+/a(?:b|c|d){6,7}?(.)/
+    acdbcdbe
+
+/a(?:b|c|d){5,6}(.)/
+    acdbcdbe
+
+/a(?:b|c|d){5,6}?(.)/
+    acdbcdbe
+
+/a(?:b|c|d){5,7}(.)/
+    acdbcdbe
+
+/a(?:b|c|d){5,7}?(.)/
+    acdbcdbe
+
+/a(?:b|(c|e){1,2}?|d)+?(.)/
+    ace
+
+/^(.+)?B/
+    AB
+
+/^([^a-z])|(\^)$/
+    .
+
+/^[<>]&/
+    <&OUT
+
+/(?:(f)(o)(o)|(b)(a)(r))*/
+    foobar
+
+/(?<=a)b/
+    ab
+    *** Failers
+    cb
+    b
+
+/(?<!c)b/
+    ab
+    b
+    b
+
+/(?:..)*a/
+    aba
+
+/(?:..)*?a/
+    aba
+
+/^(){3,5}/
+    abc
+
+/^(a+)*ax/
+    aax
+
+/^((a|b)+)*ax/
+    aax
+
+/^((a|bc)+)*ax/
+    aax
+
+/(a|x)*ab/
+    cab
+
+/(a)*ab/
+    cab
+
+/(?:(?i)a)b/
+    ab
+
+/((?i)a)b/
+    ab
+
+/(?:(?i)a)b/
+    Ab
+
+/((?i)a)b/
+    Ab
+
+/(?:(?i)a)b/
+    *** Failers
+    cb
+    aB
+
+/((?i)a)b/
+
+/(?i:a)b/
+    ab
+
+/((?i:a))b/
+    ab
+
+/(?i:a)b/
+    Ab
+
+/((?i:a))b/
+    Ab
+
+/(?i:a)b/
+    *** Failers
+    aB
+    aB
+
+/((?i:a))b/
+
+/(?:(?-i)a)b/i
+    ab
+
+/((?-i)a)b/i
+    ab
+
+/(?:(?-i)a)b/i
+    aB
+
+/((?-i)a)b/i
+    aB
+
+/(?:(?-i)a)b/i
+    *** Failers
+    aB
+    Ab
+
+/((?-i)a)b/i
+
+/(?:(?-i)a)b/i
+    aB
+
+/((?-i)a)b/i
+    aB
+
+/(?:(?-i)a)b/i
+    *** Failers
+    Ab
+    AB
+
+/((?-i)a)b/i
+
+/(?-i:a)b/i
+    ab
+
+/((?-i:a))b/i
+    ab
+
+/(?-i:a)b/i
+    aB
+
+/((?-i:a))b/i
+    aB
+
+/(?-i:a)b/i
+    *** Failers
+    AB
+    Ab
+
+/((?-i:a))b/i
+
+/(?-i:a)b/i
+    aB
+
+/((?-i:a))b/i
+    aB
+
+/(?-i:a)b/i
+    *** Failers
+    Ab
+    AB
+
+/((?-i:a))b/i
+
+/((?-i:a.))b/i
+    *** Failers
+    AB
+    a\nB
+
+/((?s-i:a.))b/i
+    a\nB
+
+/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/
+    cabbbb
+
+/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/
+    caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+
+/foo\w*\d{4}baz/
+    foobar1234baz
+
+/x(~~)*(?:(?:F)?)?/
+    x~~
+
+/^a(?#xxx){3}c/
+    aaac
+
+/^a (?#xxx) (?#yyy) {3}c/x
+    aaac
+
+/(?<![cd])b/
+    *** Failers
+    B\nB
+    dbcb
+
+/(?<![cd])[ab]/
+    dbaacb
+
+/(?<!(c|d))b/
+
+/(?<!(c|d))[ab]/
+    dbaacb
+
+/(?<!cd)[ab]/
+    cdaccb
+
+/^(?:a?b?)*$/
+    *** Failers
+    dbcb
+    a--
+
+/((?s)^a(.))((?m)^b$)/
+    a\nb\nc\n
+
+/((?m)^b$)/
+    a\nb\nc\n
+
+/(?m)^b/
+    a\nb\n
+
+/(?m)^(b)/
+    a\nb\n
+
+/((?m)^b)/
+    a\nb\n
+
+/\n((?m)^b)/
+    a\nb\n
+
+/((?s).)c(?!.)/
+    a\nb\nc\n
+    a\nb\nc\n
+
+/((?s)b.)c(?!.)/
+    a\nb\nc\n
+    a\nb\nc\n
+
+/^b/
+
+/()^b/
+    *** Failers
+    a\nb\nc\n
+    a\nb\nc\n
+
+/((?m)^b)/
+    a\nb\nc\n
+
+/(?(?!a)a|b)/
+
+/(?(?!a)b|a)/
+    a
+
+/(?(?=a)b|a)/
+    *** Failers
+    a
+    a
+
+/(?(?=a)a|b)/
+    a
+
+/(\w+:)+/
+    one:
+
+/$(?<=^(a))/
+    a
+
+/([\w:]+::)?(\w+)$/
+    abcd
+    xy:z:::abcd
+
+/^[^bcd]*(c+)/
+    aexycd
+
+/(a*)b+/
+    caab
+
+/([\w:]+::)?(\w+)$/
+    abcd
+    xy:z:::abcd
+    *** Failers
+    abcd:
+    abcd:
+
+/^[^bcd]*(c+)/
+    aexycd
+
+/(>a+)ab/
+
+/(?>a+)b/
+    aaab
+
+/([[:]+)/
+    a:[b]:
+
+/([[=]+)/
+    a=[b]=
+
+/([[.]+)/
+    a.[b].
+
+/((?>a+)b)/
+    aaab
+
+/(?>(a+))b/
+    aaab
+
+/((?>[^()]+)|\([^()]*\))+/
+    ((abc(ade)ufh()()x
+
+/a\Z/
+    *** Failers
+    aaab
+    a\nb\n
+
+/b\Z/
+    a\nb\n
+
+/b\z/
+
+/b\Z/
+    a\nb
+
+/b\z/
+    a\nb
+    *** Failers
+    
+/(?>.*)(?<=(abcd|wxyz))/
+    alphabetabcd
+    endingwxyz
+    *** Failers
+    a rather long string that doesn't end with one of them
+
+/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/
+    word cat dog elephant mussel cow horse canary baboon snake shark otherword
+    word cat dog elephant mussel cow horse canary baboon snake shark
+  
+/word (?>[a-zA-Z0-9]+ ){0,30}otherword/
+    word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
+
+/(?<=\d{3}(?!999))foo/
+    999foo
+    123999foo 
+    *** Failers
+    123abcfoo
+    
+/(?<=(?!...999)\d{3})foo/
+    999foo
+    123999foo 
+    *** Failers
+    123abcfoo
+
+/(?<=\d{3}(?!999)...)foo/
+    123abcfoo
+    123456foo 
+    *** Failers
+    123999foo  
+    
+/(?<=\d{3}...)(?<!999)foo/
+    123abcfoo   
+    123456foo 
+    *** Failers
+    123999foo  
+
+/((Z)+|A)*/
+    ZABCDEFG
+
+/(Z()|A)*/
+    ZABCDEFG
+
+/(Z(())|A)*/
+    ZABCDEFG
+
+/((?>Z)+|A)*/
+    ZABCDEFG
+
+/((?>)+|A)*/
+    ZABCDEFG
+
+/a*/g
+    abbab
+
+/^[a-\d]/
+    abcde
+    -things
+    0digit
+    *** Failers
+    bcdef    
+
+/^[\d-a]/
+    abcde
+    -things
+    0digit
+    *** Failers
+    bcdef    
+    
+/[[:space:]]+/
+    > \x09\x0a\x0c\x0d\x0b<
+     
+/[[:blank:]]+/
+    > \x09\x0a\x0c\x0d\x0b<
+     
+/[\s]+/
+    > \x09\x0a\x0c\x0d\x0b<
+     
+/\s+/
+    > \x09\x0a\x0c\x0d\x0b<
+     
+/ab/x
+    ab
+
+/(?!\A)x/m
+  a\nxb\n
+
+/(?!^)x/m
+  a\nxb\n
+
+/abc\Qabc\Eabc/
+    abcabcabc
+    
+/abc\Q(*+|\Eabc/
+    abc(*+|abc 
+
+/   abc\Q abc\Eabc/x
+    abc abcabc
+    *** Failers
+    abcabcabc  
+    
+/abc#comment
+    \Q#not comment
+    literal\E/x
+    abc#not comment\n    literal     
+
+/abc#comment
+    \Q#not comment
+    literal/x
+    abc#not comment\n    literal     
+
+/abc#comment
+    \Q#not comment
+    literal\E #more comment
+    /x
+    abc#not comment\n    literal     
+
+/abc#comment
+    \Q#not comment
+    literal\E #more comment/x
+    abc#not comment\n    literal     
+
+/\Qabc\$xyz\E/
+    abc\\\$xyz
+
+/\Qabc\E\$\Qxyz\E/
+    abc\$xyz
+
+/\Gabc/
+    abc
+    *** Failers
+    xyzabc  
+
+/\Gabc./g
+    abc1abc2xyzabc3
+
+/abc./g
+    abc1abc2xyzabc3 
+
+/a(?x: b c )d/
+    XabcdY
+    *** Failers 
+    Xa b c d Y 
+
+/((?x)x y z | a b c)/
+    XabcY
+    AxyzB 
+
+/(?i)AB(?-i)C/
+    XabCY
+    *** Failers
+    XabcY  
+
+/((?i)AB(?-i)C|D)E/
+    abCE
+    DE
+    *** Failers
+    abcE
+    abCe  
+    dE
+    De    
+
+/[z\Qa-d]\E]/
+    z
+    a
+    -
+    d
+    ] 
+    *** Failers
+    b     
+
+/[\z\C]/
+    z
+    C 
+    
+/\M/
+    M 
+    
+/(a+)*b/
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
+    
+/(?i)reg(?:ul(?:[aä]|ae)r|ex)/
+    REGular
+    regulaer
+    Regex  
+    regulär 
+
+/Åæåä[à-ÿÀ-ß]+/
+    Åæåäà
+    Åæåäÿ
+    ÅæåäÀ
+    Åæåäß
+
+/(?<=Z)X./
+    \x84XAZXB
+
+/^(?(2)a|(1)(2))+$/
+    123a
+
+/(?<=a|bbbb)c/
+    ac
+    bbbbc
+
+/abc/>testsavedregex
+<testsavedregex
+    abc
+    *** Failers
+    bca
+    
+/abc/F>testsavedregex
+<testsavedregex
+    abc
+    *** Failers
+    bca
+
+/(a|b)/S>testsavedregex
+<testsavedregex
+    abc
+    *** Failers
+    def  
+    
+/(a|b)/SF>testsavedregex
+<testsavedregex
+    abc
+    *** Failers
+    def  
+    
+/line\nbreak/
+    this is a line\nbreak
+    line one\nthis is a line\nbreak in the second line 
+
+/line\nbreak/f
+    this is a line\nbreak
+    ** Failers 
+    line one\nthis is a line\nbreak in the second line 
+
+/line\nbreak/mf
+    this is a line\nbreak
+    ** Failers 
+    line one\nthis is a line\nbreak in the second line 
+
+/ End of testinput7 /
diff -Nurp tin-1.6.2/pcre/testdata/testinput8 tin-1.8.0/pcre/testdata/testinput8
--- tin-1.6.2/pcre/testdata/testinput8	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/testdata/testinput8	2005-09-12 16:42:32.000000000 +0200
@@ -0,0 +1,540 @@
+/-- Do not use the \x{} construct except with patterns that have the --/
+/-- /8 option set, because PCRE doesn't recognize them as UTF-8 unless --/
+/-- that option is set. However, the latest Perls recognize them always. --/
+
+/\x{100}ab/8
+  \x{100}ab
+  
+/a\x{100}*b/8
+    ab
+    a\x{100}b  
+    a\x{100}\x{100}b  
+    
+/a\x{100}+b/8
+    a\x{100}b  
+    a\x{100}\x{100}b  
+    *** Failers 
+    ab
+     
+/\bX/8
+    Xoanon
+    +Xoanon
+    \x{300}Xoanon 
+    *** Failers 
+    YXoanon  
+    
+/\BX/8
+    YXoanon
+    *** Failers
+    Xoanon
+    +Xoanon    
+    \x{300}Xoanon 
+
+/X\b/8
+    X+oanon
+    ZX\x{300}oanon 
+    FAX 
+    *** Failers 
+    Xoanon  
+    
+/X\B/8
+    Xoanon  
+    *** Failers
+    X+oanon
+    ZX\x{300}oanon 
+    FAX 
+    
+/[^a]/8
+    abcd
+    a\x{100}   
+
+/^[abc\x{123}\x{400}-\x{402}]{2,3}\d/8
+    ab99
+    \x{123}\x{123}45
+    \x{400}\x{401}\x{402}6  
+    *** Failers
+    d99
+    \x{123}\x{122}4   
+    \x{400}\x{403}6  
+    \x{400}\x{401}\x{402}\x{402}6  
+
+/abc/8
+    Ã]
+    Ã
+    ÃÃÃ
+    ÃÃÃ\?
+
+/a.b/8
+    acb
+    a\x7fb
+    a\x{100}b 
+    *** Failers
+    a\nb  
+
+/a(.{3})b/8
+    a\x{4000}xyb 
+    a\x{4000}\x7fyb 
+    a\x{4000}\x{100}yb 
+    *** Failers
+    a\x{4000}b 
+    ac\ncb 
+
+/a(.*?)(.)/
+    a\xc0\x88b
+
+/a(.*?)(.)/8
+    a\x{100}b
+
+/a(.*)(.)/
+    a\xc0\x88b
+
+/a(.*)(.)/8
+    a\x{100}b
+
+/a(.)(.)/
+    a\xc0\x92bcd
+
+/a(.)(.)/8
+    a\x{240}bcd
+
+/a(.?)(.)/
+    a\xc0\x92bcd
+
+/a(.?)(.)/8
+    a\x{240}bcd
+
+/a(.??)(.)/
+    a\xc0\x92bcd
+
+/a(.??)(.)/8
+    a\x{240}bcd
+
+/a(.{3})b/8
+    a\x{1234}xyb 
+    a\x{1234}\x{4321}yb 
+    a\x{1234}\x{4321}\x{3412}b 
+    *** Failers
+    a\x{1234}b 
+    ac\ncb 
+
+/a(.{3,})b/8
+    a\x{1234}xyb 
+    a\x{1234}\x{4321}yb 
+    a\x{1234}\x{4321}\x{3412}b 
+    axxxxbcdefghijb 
+    a\x{1234}\x{4321}\x{3412}\x{3421}b 
+    *** Failers
+    a\x{1234}b 
+
+/a(.{3,}?)b/8
+    a\x{1234}xyb 
+    a\x{1234}\x{4321}yb 
+    a\x{1234}\x{4321}\x{3412}b 
+    axxxxbcdefghijb 
+    a\x{1234}\x{4321}\x{3412}\x{3421}b 
+    *** Failers
+    a\x{1234}b 
+
+/a(.{3,5})b/8
+    a\x{1234}xyb 
+    a\x{1234}\x{4321}yb 
+    a\x{1234}\x{4321}\x{3412}b 
+    axxxxbcdefghijb 
+    a\x{1234}\x{4321}\x{3412}\x{3421}b 
+    axbxxbcdefghijb 
+    axxxxxbcdefghijb 
+    *** Failers
+    a\x{1234}b 
+    axxxxxxbcdefghijb 
+
+/a(.{3,5}?)b/8
+    a\x{1234}xyb 
+    a\x{1234}\x{4321}yb 
+    a\x{1234}\x{4321}\x{3412}b 
+    axxxxbcdefghijb 
+    a\x{1234}\x{4321}\x{3412}\x{3421}b 
+    axbxxbcdefghijb 
+    axxxxxbcdefghijb 
+    *** Failers
+    a\x{1234}b 
+    axxxxxxbcdefghijb 
+
+/^[a\x{c0}]/8
+    *** Failers
+    \x{100}
+
+/(?<=aXb)cd/8
+    aXbcd
+
+/(?<=a\x{100}b)cd/8
+    a\x{100}bcd
+
+/(?<=a\x{100000}b)cd/8
+    a\x{100000}bcd
+    
+/(?:\x{100}){3}b/8
+    \x{100}\x{100}\x{100}b
+    *** Failers 
+    \x{100}\x{100}b
+
+/\x{ab}/8
+    \x{ab} 
+    \xc2\xab
+    *** Failers 
+    \x00{ab}
+
+/(?<=(.))X/8
+    WXYZ
+    \x{256}XYZ 
+    *** Failers
+    XYZ 
+
+/[^a]+/8g
+    bcd
+    \x{100}aY\x{256}Z 
+    
+/^[^a]{2}/8
+    \x{100}bc
+ 
+/^[^a]{2,}/8
+    \x{100}bcAa
+
+/^[^a]{2,}?/8
+    \x{100}bca
+
+/[^a]+/8ig
+    bcd
+    \x{100}aY\x{256}Z 
+    
+/^[^a]{2}/8i
+    \x{100}bc
+ 
+/^[^a]{2,}/8i
+    \x{100}bcAa
+
+/^[^a]{2,}?/8i
+    \x{100}bca
+
+/\x{100}{0,0}/8
+    abcd
+ 
+/\x{100}?/8
+    abcd
+    \x{100}\x{100} 
+
+/\x{100}{0,3}/8 
+    \x{100}\x{100} 
+    \x{100}\x{100}\x{100}\x{100} 
+    
+/\x{100}*/8
+    abce
+    \x{100}\x{100}\x{100}\x{100} 
+
+/\x{100}{1,1}/8
+    abcd\x{100}\x{100}\x{100}\x{100} 
+
+/\x{100}{1,3}/8
+    abcd\x{100}\x{100}\x{100}\x{100} 
+
+/\x{100}+/8
+    abcd\x{100}\x{100}\x{100}\x{100} 
+
+/\x{100}{3}/8
+    abcd\x{100}\x{100}\x{100}XX
+
+/\x{100}{3,5}/8
+    abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX
+
+/\x{100}{3,}/8
+    abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX
+
+/(?<=a\x{100}{2}b)X/8
+    Xyyya\x{100}\x{100}bXzzz
+
+/\D*/8
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\D*/8
+  \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+
+/\D/8
+    1X2
+    1\x{100}2 
+  
+/>\S/8
+    > >X Y
+    > >\x{100} Y
+  
+/\d/8
+    \x{100}3
+    
+/\s/8
+    \x{100} X
+    
+/\D+/8
+    12abcd34
+    *** Failers
+    1234  
+
+/\D{2,3}/8
+    12abcd34
+    12ab34
+    *** Failers  
+    1234
+    12a34  
+
+/\D{2,3}?/8
+    12abcd34
+    12ab34
+    *** Failers  
+    1234
+    12a34  
+
+/\d+/8
+    12abcd34
+    *** Failers
+
+/\d{2,3}/8
+    12abcd34
+    1234abcd
+    *** Failers  
+    1.4 
+
+/\d{2,3}?/8
+    12abcd34
+    1234abcd
+    *** Failers  
+    1.4 
+
+/\S+/8
+    12abcd34
+    *** Failers
+    \    \ 
+
+/\S{2,3}/8
+    12abcd34
+    1234abcd
+    *** Failers
+    \     \  
+
+/\S{2,3}?/8
+    12abcd34
+    1234abcd
+    *** Failers
+    \     \  
+
+/>\s+</8
+    12>      <34
+    *** Failers
+
+/>\s{2,3}</8
+    ab>  <cd
+    ab>   <ce
+    *** Failers
+    ab>    <cd 
+
+/>\s{2,3}?</8
+    ab>  <cd
+    ab>   <ce
+    *** Failers
+    ab>    <cd 
+
+/\w+/8
+    12      34
+    *** Failers
+    +++=*! 
+
+/\w{2,3}/8
+    ab  cd
+    abcd ce
+    *** Failers
+    a.b.c
+
+/\w{2,3}?/8
+    ab  cd
+    abcd ce
+    *** Failers
+    a.b.c
+
+/\W+/8
+    12====34
+    *** Failers
+    abcd 
+
+/\W{2,3}/8
+    ab====cd
+    ab==cd
+    *** Failers
+    a.b.c
+
+/\W{2,3}?/8
+    ab====cd
+    ab==cd
+    *** Failers
+    a.b.c
+
+/[\x{100}]/8
+    \x{100}
+    Z\x{100}
+    \x{100}Z
+    *** Failers 
+
+/[Z\x{100}]/8
+    Z\x{100}
+    \x{100}
+    \x{100}Z
+    *** Failers 
+
+/[\x{100}\x{200}]/8
+   ab\x{100}cd
+   ab\x{200}cd
+   *** Failers  
+
+/[\x{100}-\x{200}]/8
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{111}cd 
+   *** Failers  
+
+/[z-\x{200}]/8
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{111}cd 
+   abzcd
+   ab|cd  
+   *** Failers  
+
+/[Q\x{100}\x{200}]/8
+   ab\x{100}cd
+   ab\x{200}cd
+   Q? 
+   *** Failers  
+
+/[Q\x{100}-\x{200}]/8
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{111}cd 
+   Q? 
+   *** Failers  
+
+/[Qz-\x{200}]/8
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{111}cd 
+   abzcd
+   ab|cd  
+   Q? 
+   *** Failers  
+
+/[\x{100}\x{200}]{1,3}/8
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{200}\x{100}\x{200}\x{100}cd
+   *** Failers  
+
+/[\x{100}\x{200}]{1,3}?/8
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{200}\x{100}\x{200}\x{100}cd
+   *** Failers  
+
+/[Q\x{100}\x{200}]{1,3}/8
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{200}\x{100}\x{200}\x{100}cd
+   *** Failers  
+
+/[Q\x{100}\x{200}]{1,3}?/8
+   ab\x{100}cd
+   ab\x{200}cd
+   ab\x{200}\x{100}\x{200}\x{100}cd
+   *** Failers  
+
+/(?<=[\x{100}\x{200}])X/8
+    abc\x{200}X
+    abc\x{100}X 
+    *** Failers
+    X  
+
+/(?<=[Q\x{100}\x{200}])X/8
+    abc\x{200}X
+    abc\x{100}X 
+    abQX 
+    *** Failers
+    X  
+
+/(?<=[\x{100}\x{200}]{3})X/8
+    abc\x{100}\x{200}\x{100}X
+    *** Failers
+    abc\x{200}X
+    X  
+
+/[^\x{100}\x{200}]X/8
+    AX
+    \x{150}X
+    \x{500}X 
+    *** Failers
+    \x{100}X
+    \x{200}X   
+
+/[^Q\x{100}\x{200}]X/8
+    AX
+    \x{150}X
+    \x{500}X 
+    *** Failers
+    \x{100}X
+    \x{200}X   
+    QX 
+
+/[^\x{100}-\x{200}]X/8
+    AX
+    \x{500}X 
+    *** Failers
+    \x{100}X
+    \x{150}X
+    \x{200}X   
+
+/[z-\x{100}]/8i
+    z
+    Z 
+    \x{100}
+    *** Failers
+    \x{102}
+    y    
+
+/[\xFF]/
+    >\xff<
+
+/[\xff]/8
+    >\x{ff}<
+
+/[^\xFF]/
+    XYZ
+
+/[^\xff]/8
+    XYZ
+    \x{123} 
+
+/^[ac]*b/8
+  xb
+
+/^[ac\x{100}]*b/8
+  xb
+
+/^[^x]*b/8i
+  xb
+
+/^[^x]*b/8
+  xb
+  
+/^\d*b/8
+  xb 
+
+/(|a)/g8
+    catac
+    a\x{256}a 
+
+/^\x{85}$/8i
+    \x{85}
+
+/ End of testinput 8 / 
diff -Nurp tin-1.6.2/pcre/testdata/testinput9 tin-1.8.0/pcre/testdata/testinput9
--- tin-1.6.2/pcre/testdata/testinput9	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/testdata/testinput9	2005-09-12 16:42:32.000000000 +0200
@@ -0,0 +1,599 @@
+/\pL\P{Nd}/8
+    AB
+    *** Failers
+    A0
+    00   
+
+/\X./8
+    AB
+    A\x{300}BC 
+    A\x{300}\x{301}\x{302}BC 
+    *** Failers
+    \x{300}  
+
+/\X\X/8
+    ABC
+    A\x{300}B\x{300}\x{301}C 
+    A\x{300}\x{301}\x{302}BC 
+    *** Failers
+    \x{300}  
+
+/^\pL+/8
+    abcd
+    a 
+    *** Failers 
+
+/^\PL+/8
+    1234
+    = 
+    *** Failers 
+    abcd 
+
+/^\X+/8
+    abcdA\x{300}\x{301}\x{302}
+    A\x{300}\x{301}\x{302}
+    A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}
+    a 
+    *** Failers 
+    \x{300}\x{301}\x{302}
+
+/\X?abc/8
+    abc
+    A\x{300}abc
+    A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz
+    \x{300}abc  
+    *** Failers
+
+/^\X?abc/8
+    abc
+    A\x{300}abc
+    *** Failers
+    A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz
+    \x{300}abc  
+
+/\X*abc/8
+    abc
+    A\x{300}abc
+    A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz
+    \x{300}abc  
+    *** Failers
+
+/^\X*abc/8
+    abc
+    A\x{300}abc
+    A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz
+    *** Failers
+    \x{300}abc  
+
+/^\pL?=./8
+    A=b
+    =c 
+    *** Failers
+    1=2 
+    AAAA=b  
+
+/^\pL*=./8
+    AAAA=b
+    =c 
+    *** Failers
+    1=2  
+
+/^\X{2,3}X/8
+    A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X
+    A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X 
+    *** Failers
+    X
+    A\x{300}\x{301}\x{302}X
+    A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X
+
+/^\pC\pL\pM\pN\pP\pS\pZ</8
+    \x7f\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}<
+    \np\x{300}9!\$ < 
+    ** Failers 
+    ap\x{300}9!\$ < 
+  
+/^\PC/8
+    X
+    ** Failers 
+    \x7f
+  
+/^\PL/8
+    9
+    ** Failers 
+    \x{c0}
+  
+/^\PM/8
+    X
+    ** Failers 
+    \x{30f}
+  
+/^\PN/8
+    X
+    ** Failers 
+    \x{660}
+  
+/^\PP/8
+    X
+    ** Failers 
+    \x{66c}
+  
+/^\PS/8
+    X
+    ** Failers 
+    \x{f01}
+  
+/^\PZ/8
+    X
+    ** Failers 
+    \x{1680}
+    
+/^\p{Cc}/8
+    \x{017}
+    \x{09f} 
+    ** Failers
+    \x{0600} 
+  
+/^\p{Cf}/8
+    \x{601}
+    ** Failers
+    \x{09f} 
+  
+/^\p{Cn}/8
+    ** Failers
+    \x{09f} 
+  
+/^\p{Co}/8
+    \x{f8ff}
+    ** Failers
+    \x{09f} 
+  
+/^\p{Cs}/8
+    \x{dfff}
+    ** Failers
+    \x{09f} 
+  
+/^\p{Ll}/8
+    a
+    ** Failers 
+    Z
+    \x{dfff}  
+  
+/^\p{Lm}/8
+    \x{2b0}
+    ** Failers
+    a 
+  
+/^\p{Lo}/8
+    \x{1bb}
+    ** Failers
+    a 
+    \x{2b0}
+  
+/^\p{Lt}/8
+    \x{1c5}
+    ** Failers
+    a 
+    \x{2b0}
+  
+/^\p{Lu}/8
+    A
+    ** Failers
+    \x{2b0}
+  
+/^\p{Mc}/8
+    \x{903}
+    ** Failers
+    X
+    \x{300}
+       
+/^\p{Me}/8
+    \x{488}
+    ** Failers
+    X
+    \x{903}
+    \x{300}
+  
+/^\p{Mn}/8
+    \x{300}
+    ** Failers
+    X
+    \x{903}
+  
+/^\p{Nd}+/8
+    0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669}\x{66a}
+    \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}\x{6f7}\x{6f8}\x{6f9}\x{6fa}
+    \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}\x{96d}\x{96e}\x{96f}\x{970}
+    ** Failers
+    X
+  
+/^\p{Nl}/8
+    \x{16ee}
+    ** Failers
+    X
+    \x{966}
+  
+/^\p{No}/8
+    \x{b2}
+    \x{b3}
+    ** Failers
+    X
+    \x{16ee}
+  
+/^\p{Pc}/8
+    \x5f
+    \x{203f}
+    ** Failers
+    X
+    -
+    \x{58a}
+  
+/^\p{Pd}/8
+    -
+    \x{58a}
+    ** Failers
+    X
+    \x{203f}
+  
+/^\p{Pe}/8
+    )
+    ]
+    }
+    \x{f3b}
+    ** Failers
+    X
+    \x{203f}
+    (
+    [
+    {
+    \x{f3c}
+  
+/^\p{Pf}/8
+    \x{bb}
+    \x{2019}
+    ** Failers
+    X
+    \x{203f}
+  
+/^\p{Pi}/8
+    \x{ab}
+    \x{2018}
+    ** Failers
+    X
+    \x{203f}
+  
+/^\p{Po}/8
+    !
+    \x{37e}
+    ** Failers
+    X
+    \x{203f}
+  
+/^\p{Ps}/8
+    (
+    [
+    {
+    \x{f3c}
+    ** Failers
+    X
+    )
+    ]
+    }
+    \x{f3b}
+  
+/^\p{Sc}+/8
+    $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6}
+    \x{9f2}
+    ** Failers
+    X
+    \x{2c2}
+  
+/^\p{Sk}/8
+    \x{2c2}
+    ** Failers
+    X
+    \x{9f2}
+  
+/^\p{Sm}+/8
+    +<|~\x{ac}\x{2044}
+    ** Failers
+    X
+    \x{9f2}
+  
+/^\p{So}/8
+    \x{a6}
+    \x{482} 
+    ** Failers
+    X
+    \x{9f2}
+  
+/^\p{Zl}/8
+    \x{2028}
+    ** Failers
+    X
+    \x{2029}
+  
+/^\p{Zp}/8
+    \x{2029}
+    ** Failers
+    X
+    \x{2028}
+  
+/^\p{Zs}/8
+    \ \
+    \x{a0}
+    \x{1680}
+    \x{180e}
+    \x{2000}
+    \x{2001}     
+    ** Failers
+    \x{2028}
+    \x{200d} 
+  
+/\p{Nd}+(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}+?(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,}(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,}?(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*?(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2}(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,3}(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}{2,3}?(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}?(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}??(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(..)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(...)/8
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(....)/8
+      ** Failers
+      \x{660}\x{661}\x{662}ABC
+  
+/\p{Lu}/8i
+    A
+    a\x{10a0}B 
+    ** Failers 
+    a
+    \x{1d00}  
+
+/\p{^Lu}/8i
+    1234
+    ** Failers
+    ABC 
+
+/\P{Lu}/8i
+    1234
+    ** Failers
+    ABC 
+
+/(?<=A\p{Nd})XYZ/8
+    A2XYZ
+    123A5XYZPQR
+    ABA\x{660}XYZpqr
+    ** Failers
+    AXYZ
+    XYZ     
+    
+/(?<!\pL)XYZ/8
+    1XYZ
+    AB=XYZ.. 
+    XYZ 
+    ** Failers
+    WXYZ 
+
+/[\p{Nd}]/8
+    1234
+
+/[\p{Nd}+-]+/8
+    1234
+    12-34
+    12+\x{661}-34  
+    ** Failers
+    abcd  
+
+/[\P{Nd}]+/8
+    abcd
+    ** Failers
+    1234
+
+/\D+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+     
+/\P{Nd}+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\D]+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\P{Nd}]+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\D\P{Nd}]+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\pL/8
+    a
+    A 
+
+/\pL/8i
+    a
+    A 
+    
+/\p{Lu}/8 
+    A
+    aZ
+    ** Failers
+    abc   
+
+/\p{Lu}/8i
+    A
+    aZ
+    ** Failers
+    abc   
+
+/\p{Ll}/8 
+    a
+    Az
+    ** Failers
+    ABC   
+
+/\p{Ll}/8i 
+    a
+    Az
+    ** Failers
+    ABC   
+
+/^\x{c0}$/8i
+    \x{c0}
+    \x{e0} 
+
+/^\x{e0}$/8i
+    \x{c0}
+    \x{e0} 
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8
+    A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+    ** Failers
+    a\x{391}\x{10427}\x{ff3a}\x{1fb0}   
+    A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+    A\x{391}\x{1044F}\x{ff3a}\x{1fb0}
+    A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+    A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8i
+    A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+    a\x{391}\x{10427}\x{ff3a}\x{1fb0}   
+    A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+    A\x{391}\x{1044F}\x{ff3a}\x{1fb0}
+    A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+    A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+
+/\x{391}+/8i
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+
+/\x{391}{3,5}(.)/8i
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+
+/\x{391}{3,5}?(.)/8i
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+
+/[\x{391}\x{ff3a}]/8i
+    \x{391}
+    \x{ff3a}
+    \x{3b1}
+    \x{ff5a}   
+    
+/[\x{c0}\x{391}]/8i
+    \x{c0}
+    \x{e0} 
+
+/[\x{105}-\x{109}]/8i
+    \x{104}
+    \x{105}
+    \x{109}  
+    ** Failers
+    \x{100}
+    \x{10a} 
+    
+/[z-\x{100}]/8i 
+    Z
+    z
+    \x{39c}
+    \x{178}
+    |
+    \x{80}
+    \x{ff}
+    \x{100}
+    \x{101} 
+    ** Failers
+    \x{102}
+    Y
+    y           
+
+/[z-\x{100}]/8i
+
+/^\X/8
+    A
+    A\x{300}BC 
+    A\x{300}\x{301}\x{302}BC 
+    *** Failers
+    \x{300}  
+
+/^[\X]/8
+    X123
+    *** Failers
+    AXYZ
+
+/^(\X*)C/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+
+/^(\X*?)C/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+
+/^(\X*)(.)/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+
+/^(\X*?)(.)/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+
+/^\X(.)/8
+    *** Failers
+    A\x{300}\x{301}\x{302}
+
+/^\X{2,3}(.)/8
+    A\x{300}\x{301}B\x{300}X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}DA\x{300}X
+    
+/^\X{2,3}?(.)/8
+    A\x{300}\x{301}B\x{300}X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}DA\x{300}X
+
+/^\pN{2,3}X/
+    12X
+    123X
+    *** Failers
+    X
+    1X
+    1234X     
+
+/\x{100}/i8
+    \x{100}   
+    \x{101} 
+    
+/ End / 
diff -Nurp tin-1.6.2/pcre/testdata/testoutput1 tin-1.8.0/pcre/testdata/testoutput1
--- tin-1.6.2/pcre/testdata/testoutput1	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/testdata/testoutput1	2005-09-12 16:42:32.000000000 +0200
@@ -1,4 +1,4 @@
-PCRE version 4.3 21-May-2003
+PCRE version 6.4 05-Sep-2005
 
 /the quick brown fox/
     the quick brown fox
@@ -6271,5 +6271,16 @@ No match
   \x84XAZXB
  0: XB
 
-/ End of testinput1 /
+/ab cd (?x) de fg/
+    ab cd defg
+ 0: ab cd defg
+
+/ab cd(?x) de fg/
+    ab cddefg
+ 0: ab cddefg
+    ** Failers 
+No match
+    abcddefg
+No match
 
+/ End of testinput1 /
diff -Nurp tin-1.6.2/pcre/testdata/testoutput2 tin-1.8.0/pcre/testdata/testoutput2
--- tin-1.6.2/pcre/testdata/testoutput2	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/testdata/testoutput2	2005-09-12 16:42:33.000000000 +0200
@@ -1,4 +1,4 @@
-PCRE version 4.3 21-May-2003
+PCRE version 6.4 05-Sep-2005
 
 /(a)b|/
 Capturing subpattern count = 1
@@ -42,24 +42,28 @@ No match
 
 /a+bc/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 Need char = 'c'
 
 /a*bc/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 No first char
 Need char = 'c'
 
 /a{3}bc/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 Need char = 'c'
 
 /(abc|a+z)/
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 First char = 'a'
 No need char
@@ -111,12 +115,14 @@ Failed: unrecognized character after (? 
 
 /.*b/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char at start or follows \n
 Need char = 'b'
 
 /.*?b/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char at start or follows \n
 Need char = 'b'
@@ -136,8 +142,7 @@ Capturing subpattern count = 0
 No options
 No first char
 No need char
-Study size = 40
-Starting character set: c d e 
+Starting byte set: c d e 
     this sentence eventually mentions a cat
  0: cat
     this sentences rambles on and on for a while and then reaches elephant
@@ -148,8 +153,7 @@ Capturing subpattern count = 0
 Options: caseless
 No first char
 No need char
-Study size = 40
-Starting character set: C D E c d e 
+Starting byte set: C D E c d e 
     this sentence eventually mentions a CAT cat
  0: CAT
     this sentences rambles on and on for a while to elephant ElePhant
@@ -160,16 +164,14 @@ Capturing subpattern count = 0
 No options
 No first char
 No need char
-Study size = 40
-Starting character set: a b c d 
+Starting byte set: a b c d 
 
 /(a|[^\dZ])/S
 Capturing subpattern count = 1
 No options
 No first char
 No need char
-Study size = 40
-Starting character set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a 
+Starting byte set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a 
   \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 
   \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / : ; < = > 
   ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y [ \ ] ^ _ ` a b c d 
@@ -189,8 +191,7 @@ Capturing subpattern count = 1
 No options
 No first char
 No need char
-Study size = 40
-Starting character set: \x09 \x0a \x0c \x0d \x20 a b 
+Starting byte set: \x09 \x0a \x0c \x0d \x20 a b 
 
 /(ab\2)/
 Failed: reference to non-existent subpattern at offset 6
@@ -325,6 +326,7 @@ No need char
 
 /.*((abc)$|(def))/
 Capturing subpattern count = 3
+Partial matching not supported
 No options
 First char at start or follows \n
 No need char
@@ -401,6 +403,7 @@ Failed: missing terminating ] for charac
 
 /[^aeiou ]{3,}/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 No first char
 No need char
@@ -409,6 +412,7 @@ No need char
     
 /<.*>/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = '<'
 Need char = '>'
@@ -417,6 +421,7 @@ Need char = '>'
 
 /<.*?>/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = '<'
 Need char = '>'
@@ -425,6 +430,7 @@ Need char = '>'
 
 /<.*>/U
 Capturing subpattern count = 0
+Partial matching not supported
 Options: ungreedy
 First char = '<'
 Need char = '>'
@@ -433,6 +439,7 @@ Need char = '>'
     
 /(?U)<.*>/
 Capturing subpattern count = 0
+Partial matching not supported
 Options: ungreedy
 First char = '<'
 Need char = '>'
@@ -441,6 +448,7 @@ Need char = '>'
 
 /<.*?>/U
 Capturing subpattern count = 0
+Partial matching not supported
 Options: ungreedy
 First char = '<'
 Need char = '>'
@@ -449,6 +457,7 @@ Need char = '>'
     
 /={3,}/U
 Capturing subpattern count = 0
+Partial matching not supported
 Options: ungreedy
 First char = '='
 Need char = '='
@@ -457,6 +466,7 @@ Need char = '='
     
 /(?U)={3,}?/
 Capturing subpattern count = 0
+Partial matching not supported
 Options: ungreedy
 First char = '='
 Need char = '='
@@ -515,6 +525,7 @@ No need char
 
 /(?s).*/
 Capturing subpattern count = 0
+Partial matching not supported
 Options: anchored dotall
 No first char
 No need char
@@ -524,24 +535,21 @@ Capturing subpattern count = 0
 No options
 No first char
 No need char
-Study size = 40
-Starting character set: a b c d 
+Starting byte set: a b c d 
 
 /(?i)[abcd]/S
 Capturing subpattern count = 0
 Options: caseless
 No first char
 No need char
-Study size = 40
-Starting character set: A B C D a b c d 
+Starting byte set: A B C D a b c d 
 
 /(?m)[xy]|(b|c)/S
 Capturing subpattern count = 1
 Options: multiline
 No first char
 No need char
-Study size = 40
-Starting character set: b c x y 
+Starting byte set: b c x y 
 
 /(^a|^b)/m
 Capturing subpattern count = 1
@@ -576,6 +584,7 @@ Failed: unrecognized character after (?<
 /((?s)blah)\s+\1/
 Capturing subpattern count = 1
 Max back reference = 1
+Partial matching not supported
 No options
 First char = 'b'
 Need char = 'h'
@@ -583,6 +592,7 @@ Need char = 'h'
 /((?i)blah)\s+\1/
 Capturing subpattern count = 1
 Max back reference = 1
+Partial matching not supported
 No options
 Case state changes
 First char = 'b' (caseless)
@@ -590,14 +600,14 @@ Need char = 'h' (caseless)
 
 /((?i)b)/DS
 ------------------------------------------------------------------
-  0  16 Bra 0
-  3   8 Bra 1
+  0  15 Bra 0
+  3   7 Bra 1
   6  01 Opt
-  8   1 b
- 11   8 Ket
- 14  00 Opt
- 16  16 Ket
- 19     End
+  8  NC b
+ 10   7 Ket
+ 13  00 Opt
+ 15  15 Ket
+ 18     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
 No options
@@ -608,12 +618,12 @@ Study returned NULL
 
 /(a*b|(?i:c*(?-i)d))/S
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 Case state changes
 No first char
 No need char
-Study size = 40
-Starting character set: C a b c d 
+Starting byte set: C a b c d 
 
 /a$/
 Capturing subpattern count = 0
@@ -661,6 +671,7 @@ Need char = 'c'
 
 /^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
 Capturing subpattern count = 5
+Partial matching not supported
 Options: anchored
 No first char
 No need char
@@ -677,30 +688,53 @@ Capturing subpattern count = 0
 No options
 No first char
 No need char
-Study size = 40
-Starting character set: a b 
+Starting byte set: a b 
 
 /(?<!foo)(alpha|omega)/S
 Capturing subpattern count = 1
 No options
 No first char
 Need char = 'a'
-Study size = 40
-Starting character set: a o 
+Starting byte set: a o 
 
 /(?!alphabet)[ab]/S
 Capturing subpattern count = 0
 No options
 No first char
 No need char
-Study size = 40
-Starting character set: a b 
+Starting byte set: a b 
 
 /(?<=foo\n)^bar/m
 Capturing subpattern count = 0
 Options: multiline
+No first char
+Need char = 'r'
+    foo\nbarbar 
+ 0: bar
+    ***Failers
+No match
+    rhubarb 
+No match
+    barbell
+No match
+    abc\nbarton 
+No match
+
+/^(?<=foo\n)bar/m
+Capturing subpattern count = 0
+Options: multiline
 First char at start or follows \n
 Need char = 'r'
+    foo\nbarbar 
+ 0: bar
+    ***Failers
+No match
+    rhubarb 
+No match
+    barbell
+No match
+    abc\nbarton 
+No match
 
 /(?>^abc)/m
 Capturing subpattern count = 0
@@ -756,6 +790,7 @@ No need char
 
 /(?>.*)(?<=(abcd)|(xyz))/
 Capturing subpattern count = 2
+Partial matching not supported
 No options
 First char at start or follows \n
 No need char
@@ -978,6 +1013,7 @@ copy substring 5 failed -7
      
 /(.{20})/
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 No first char
 No need char
@@ -995,6 +1031,7 @@ copy substring 1 failed -6
      
 /(.{15})/
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 No first char
 No need char
@@ -1009,6 +1046,7 @@ No need char
 
 /(.{16})/
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 No first char
 No need char
@@ -1074,109 +1112,116 @@ No need char
 /word ((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ 
 )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ 
 )?)?)?)?)?)?)?)?)?otherword/M
-Memory allocation (code space): 428
+Memory allocation (code space): 432
 Capturing subpattern count = 8
+Partial matching not supported
 No options
 First char = 'w'
 Need char = 'd'
 
 /.*X/D
 ------------------------------------------------------------------
-  0   8 Bra 0
+  0   7 Bra 0
   3     Any*
-  5   1 X
-  8   8 Ket
- 11     End
+  5     X
+  7   7 Ket
+ 10     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char at start or follows \n
 Need char = 'X'
 
 /.*X/Ds
 ------------------------------------------------------------------
-  0   8 Bra 0
+  0   7 Bra 0
   3     Any*
-  5   1 X
-  8   8 Ket
- 11     End
+  5     X
+  7   7 Ket
+ 10     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: anchored dotall
 No first char
 Need char = 'X'
 
 /(.*X|^B)/D
 ------------------------------------------------------------------
-  0  21 Bra 0
-  3   8 Bra 1
+  0  19 Bra 0
+  3   7 Bra 1
   6     Any*
-  8   1 X
- 11   7 Alt
- 14     ^
- 15   1 B
- 18  15 Ket
- 21  21 Ket
- 24     End
+  8     X
+ 10   6 Alt
+ 13     ^
+ 14     B
+ 16  13 Ket
+ 19  19 Ket
+ 22     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 First char at start or follows \n
 No need char
 
 /(.*X|^B)/Ds
 ------------------------------------------------------------------
-  0  21 Bra 0
-  3   8 Bra 1
+  0  19 Bra 0
+  3   7 Bra 1
   6     Any*
-  8   1 X
- 11   7 Alt
- 14     ^
- 15   1 B
- 18  15 Ket
- 21  21 Ket
- 24     End
+  8     X
+ 10   6 Alt
+ 13     ^
+ 14     B
+ 16  13 Ket
+ 19  19 Ket
+ 22     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
+Partial matching not supported
 Options: anchored dotall
 No first char
 No need char
     
 /(?s)(.*X|^B)/D
 ------------------------------------------------------------------
-  0  21 Bra 0
-  3   8 Bra 1
+  0  19 Bra 0
+  3   7 Bra 1
   6     Any*
-  8   1 X
- 11   7 Alt
- 14     ^
- 15   1 B
- 18  15 Ket
- 21  21 Ket
- 24     End
+  8     X
+ 10   6 Alt
+ 13     ^
+ 14     B
+ 16  13 Ket
+ 19  19 Ket
+ 22     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
+Partial matching not supported
 Options: anchored dotall
 No first char
 No need char
 
 /(?s:.*X|^B)/D
 ------------------------------------------------------------------
-  0  27 Bra 0
-  3  10 Bra 0
+  0  25 Bra 0
+  3   9 Bra 0
   6  04 Opt
   8     Any*
- 10   1 X
- 13   9 Alt
- 16  04 Opt
- 18     ^
- 19   1 B
- 22  19 Ket
- 25  00 Opt
- 27  27 Ket
- 30     End
+ 10     X
+ 12   8 Alt
+ 15  04 Opt
+ 17     ^
+ 18     B
+ 20  17 Ket
+ 23  00 Opt
+ 25  25 Ket
+ 28     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char at start or follows \n
 No need char
@@ -1261,6 +1306,7 @@ No need char
     
 /.*iss/g+
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char at start or follows \n
 Need char = 's'
@@ -1361,36 +1407,42 @@ Need char = 'c'
 
 /a*/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 No first char
 No need char
 
 /a+/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 No need char
 
 /(baa|a+)/
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 No first char
 Need char = 'a'
 
 /a{0,3}/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 No first char
 No need char
 
 /baa{3,}/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'b'
 Need char = 'a'
 
 /"([^\\"]+|\\.)*"/
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 First char = '"'
 Need char = '"'
@@ -1445,60 +1497,70 @@ Need char = 'b'
 
 /abc*/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 Need char = 'b'
 
 /ab.c*/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 Need char = 'b'
 
 /a.c*/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 No need char
 
 /.c*/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 No first char
 No need char
 
 /ac*/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 No need char
 
 /(a.c*|b.c*)/
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 No first char
 No need char
 
 /a.c*|aba/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 No need char
 
 /.+a/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 No first char
 Need char = 'a'
 
 /(?=abcda)a.*/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 Need char = 'a'
 
 /(?=a)a.*/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 No need char
@@ -1511,12 +1573,14 @@ No need char
 
 /a\d*/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 No need char
 
 /ab\d*/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 Need char = 'b'
@@ -1535,6 +1599,7 @@ Need char = 'd'
 
 /ab\d+/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 Need char = 'b'
@@ -1652,6 +1717,7 @@ Study returned NULL
   \)            # Closing )
   /x
 Capturing subpattern count = 0
+Partial matching not supported
 Options: extended
 First char = '('
 Need char = ')'
@@ -1680,6 +1746,7 @@ No match
 
 /\(  ( (?>[^()]+) | (?R) )* \) /xg
 Capturing subpattern count = 1
+Partial matching not supported
 Options: extended
 First char = '('
 Need char = ')'
@@ -1694,6 +1761,7 @@ Need char = ')'
 
 /\(  (?: (?>[^()]+) | (?R) ) \) /x
 Capturing subpattern count = 0
+Partial matching not supported
 Options: extended
 First char = '('
 Need char = ')'
@@ -1712,6 +1780,7 @@ No match
 
 /\(  (?: (?>[^()]+) | (?R) )? \) /x
 Capturing subpattern count = 0
+Partial matching not supported
 Options: extended
 First char = '('
 Need char = ')'
@@ -1722,6 +1791,7 @@ Need char = ')'
 
 /\(  ( (?>[^()]+) | (?R) )* \) /x
 Capturing subpattern count = 1
+Partial matching not supported
 Options: extended
 First char = '('
 Need char = ')'
@@ -1731,6 +1801,7 @@ Need char = ')'
 
 /\( ( ( (?>[^()]+) | (?R) )* ) \) /x
 Capturing subpattern count = 2
+Partial matching not supported
 Options: extended
 First char = '('
 Need char = ')'
@@ -1741,6 +1812,7 @@ Need char = ')'
 
 /\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /x
 Capturing subpattern count = 3
+Partial matching not supported
 Options: extended
 First char = '('
 Need char = ')'
@@ -1757,6 +1829,7 @@ Need char = ')'
 
 /\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /x
 Capturing subpattern count = 3
+Partial matching not supported
 Options: extended
 First char = '('
 Need char = ')'
@@ -1773,6 +1846,7 @@ Need char = ')'
 
 /\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /x
 Capturing subpattern count = 11
+Partial matching not supported
 Options: extended
 First char = '('
 Need char = ')'
@@ -1792,6 +1866,7 @@ Need char = ')'
 
 /\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /x
 Capturing subpattern count = 3
+Partial matching not supported
 Options: extended
 First char = '('
 Need char = ')'
@@ -1803,6 +1878,7 @@ Need char = ')'
 
 /\( ( ( (?>[^()]+) | ((?R)) )* ) \) /x
 Capturing subpattern count = 3
+Partial matching not supported
 Options: extended
 First char = '('
 Need char = ')'
@@ -1830,6 +1906,19 @@ Options: anchored
 No first char
 No need char
 
+/^[[:^alnum:]]/D
+------------------------------------------------------------------
+  0  37 Bra 0
+  3     ^
+  4     [\x00-/:-@[-`{-\xff]
+ 37  37 Ket
+ 40     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
 /^[[:alpha:]]/D
 ------------------------------------------------------------------
   0  37 Bra 0
@@ -1842,6 +1931,19 @@ Capturing subpattern count = 0
 Options: anchored
 No first char
 No need char
+
+/^[[:^alpha:]]/D
+------------------------------------------------------------------
+  0  37 Bra 0
+  3     ^
+  4     [\x00-@[-`{-\xff]
+ 37  37 Ket
+ 40     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
              
 /^[[:ascii:]]/D
 ------------------------------------------------------------------
@@ -1856,6 +1958,19 @@ Options: anchored
 No first char
 No need char
 
+/^[[:^ascii:]]/D
+------------------------------------------------------------------
+  0  37 Bra 0
+  3     ^
+  4     [\x80-\xff]
+ 37  37 Ket
+ 40     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
 /^[[:blank:]]/D
 ------------------------------------------------------------------
   0  37 Bra 0
@@ -2016,7 +2131,7 @@ No need char
 ------------------------------------------------------------------
   0  37 Bra 0
   3     ^
-  4     [\x00-/1-2:-\xff]
+  4     [\x00-/12:-\xff]
  37  37 Ket
  40     End
 ------------------------------------------------------------------
@@ -2041,7 +2156,7 @@ No need char
 /[01[:alpha:]%]/D
 ------------------------------------------------------------------
   0  36 Bra 0
-  3     [%0-1A-Za-z]
+  3     [%01A-Za-z]
  36  36 Ket
  39     End
 ------------------------------------------------------------------
@@ -2114,6 +2229,7 @@ Need char = 'd'
 /(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\w+)\s+(\270)/
 Capturing subpattern count = 271
 Max back reference = 270
+Partial matching not supported
 No options
 No first char
 No need char
@@ -2572,12 +2688,12 @@ No first char
 No need char
 
 /a#/xMD
-Memory allocation (code space): 13
+Memory allocation (code space): 9
 ------------------------------------------------------------------
-  0   6 Bra 0
-  3   1 a
-  6   6 Ket
-  9     End
+  0   5 Bra 0
+  3     a
+  5   5 Ket
+  8     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: extended
@@ -2587,7 +2703,7 @@ No need char
 /[\s]/D
 ------------------------------------------------------------------
   0  36 Bra 0
-  3     [\x09-\x0a\x0c-\x0d ]
+  3     [\x09\x0a\x0c\x0d ]
  36  36 Ket
  39     End
 ------------------------------------------------------------------
@@ -2610,12 +2726,12 @@ No need char
 
 /a(?i)b/D
 ------------------------------------------------------------------
-  0  11 Bra 0
-  3   1 a
-  6  01 Opt
-  8   1 b
- 11  11 Ket
- 14     End
+  0   9 Bra 0
+  3     a
+  5  01 Opt
+  7  NC b
+  9   9 Ket
+ 12     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 No options
@@ -2633,15 +2749,15 @@ No match
 
 /(a(?i)b)/D
 ------------------------------------------------------------------
-  0  19 Bra 0
-  3  11 Bra 1
-  6   1 a
-  9  01 Opt
- 11   1 b
- 14  11 Ket
- 17  00 Opt
- 19  19 Ket
- 22     End
+  0  17 Bra 0
+  3   9 Bra 1
+  6     a
+  8  01 Opt
+ 10  NC b
+ 12   9 Ket
+ 15  00 Opt
+ 17  17 Ket
+ 20     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
 No options
@@ -2661,10 +2777,10 @@ No match
     
 /   (?i)abc/xD
 ------------------------------------------------------------------
-  0   8 Bra 0
-  3   3 abc
-  8   8 Ket
- 11     End
+  0   9 Bra 0
+  3  NC abc
+  9   9 Ket
+ 12     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: caseless extended
@@ -2674,10 +2790,10 @@ Need char = 'c' (caseless)
 /#this is a comment
   (?i)abc/xD
 ------------------------------------------------------------------
-  0   8 Bra 0
-  3   3 abc
-  8   8 Ket
- 11     End
+  0   9 Bra 0
+  3  NC abc
+  9   9 Ket
+ 12     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: caseless extended
@@ -2686,11 +2802,10 @@ Need char = 'c' (caseless)
 
 /123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/D
 ------------------------------------------------------------------
-  0 307 Bra 0
-  3 250 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
-255  50 12345678901234567890123456789012345678901234567890
-307 307 Ket
-310     End
+  0 603 Bra 0
+  3     123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
+603 603 Ket
+606     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 No options
@@ -2699,11 +2814,10 @@ Need char = '0'
 
 /\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/D
 ------------------------------------------------------------------
-  0 307 Bra 0
-  3 250 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
-255  50 12345678901234567890123456789012345678901234567890
-307 307 Ket
-310     End
+  0 603 Bra 0
+  3     123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
+603 603 Ket
+606     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 No options
@@ -2725,10 +2839,10 @@ No need char
 
 /\Q\Ex/D
 ------------------------------------------------------------------
-  0   6 Bra 0
-  3   1 x
-  6   6 Ket
-  9     End
+  0   5 Bra 0
+  3     x
+  5   5 Ket
+  8     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 No options
@@ -2737,10 +2851,10 @@ No need char
 
 / \Q\E/D
 ------------------------------------------------------------------
-  0   6 Bra 0
-  3   1  
-  6   6 Ket
-  9     End
+  0   5 Bra 0
+  3      
+  5   5 Ket
+  8     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 No options
@@ -2749,10 +2863,10 @@ No need char
 
 /a\Q\E/D
 ------------------------------------------------------------------
-  0   6 Bra 0
-  3   1 a
-  6   6 Ket
-  9     End
+  0   5 Bra 0
+  3     a
+  5   5 Ket
+  8     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 No options
@@ -2767,11 +2881,10 @@ No need char
 
 /a\Q\Eb/D
 ------------------------------------------------------------------
-  0   9 Bra 0
-  3   1 a
-  6   1 b
-  9   9 Ket
- 12     End
+  0   7 Bra 0
+  3     ab
+  7   7 Ket
+ 10     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 No options
@@ -2782,10 +2895,10 @@ Need char = 'b'
 
 /\Q\Eabc/D
 ------------------------------------------------------------------
-  0   8 Bra 0
-  3   3 abc
-  8   8 Ket
- 11     End
+  0   9 Bra 0
+  3     abc
+  9   9 Ket
+ 12     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 No options
@@ -2803,6 +2916,7 @@ Need char = 'c'
  15     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 No first char
 No need char
@@ -2835,36 +2949,38 @@ No need char
  14     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'x'
 No need char
 
 /x{1,3}+/D 
 ------------------------------------------------------------------
-  0  16 Bra 0
-  3  10 Once
-  6   1 x
-  9     x{,2}
- 13  10 Ket
- 16  16 Ket
- 19     End
+  0  15 Bra 0
+  3   9 Once
+  6     x
+  8     x{,2}
+ 12   9 Ket
+ 15  15 Ket
+ 18     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'x'
 No need char
 
 /(x)*+/D
 ------------------------------------------------------------------
-  0  19 Bra 0
-  3  13 Once
+  0  18 Bra 0
+  3  12 Once
   6     Brazero
-  7   6 Bra 1
- 10   1 x
- 13   6 KetRmax
- 16  13 Ket
- 19  19 Ket
- 22     End
+  7   5 Bra 1
+ 10     x
+ 12   5 KetRmax
+ 15  12 Ket
+ 18  18 Ket
+ 21     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
 No options
@@ -2873,6 +2989,7 @@ No need char
 
 /^(\w++|\s++)*$/
 Capturing subpattern count = 1
+Partial matching not supported
 Options: anchored
 No first char
 No need char
@@ -2886,6 +3003,7 @@ No match
     
 /(\d++)(\w)/
 Capturing subpattern count = 2
+Partial matching not supported
 No options
 No first char
 No need char
@@ -2900,6 +3018,7 @@ No match
 
 /a++b/
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 Need char = 'b'
@@ -2908,6 +3027,7 @@ Need char = 'b'
 
 /(a++b)/
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 First char = 'a'
 Need char = 'b'
@@ -2917,6 +3037,7 @@ Need char = 'b'
 
 /(a++)b/
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 First char = 'a'
 Need char = 'b'
@@ -2926,6 +3047,7 @@ Need char = 'b'
 
 /([^()]++|\([^()]*\))+/
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 No first char
 No need char
@@ -2935,6 +3057,7 @@ No need char
     
 /\(([^()]++|\([^()]+\))+\)/ 
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 First char = '('
 Need char = ')'
@@ -2951,24 +3074,24 @@ No match
 
 /(abc){1,3}+/D
 ------------------------------------------------------------------
-  0  50 Bra 0
-  3  44 Once
-  6   8 Bra 1
-  9   3 abc
- 14   8 Ket
- 17     Brazero
- 18  26 Bra 0
- 21   8 Bra 1
- 24   3 abc
- 29   8 Ket
- 32     Brazero
- 33   8 Bra 1
- 36   3 abc
- 41   8 Ket
- 44  26 Ket
- 47  44 Ket
- 50  50 Ket
- 53     End
+  0  53 Bra 0
+  3  47 Once
+  6   9 Bra 1
+  9     abc
+ 15   9 Ket
+ 18     Brazero
+ 19  28 Bra 0
+ 22   9 Bra 1
+ 25     abc
+ 31   9 Ket
+ 34     Brazero
+ 35   9 Bra 1
+ 38     abc
+ 44   9 Ket
+ 47  28 Ket
+ 50  47 Ket
+ 53  53 Ket
+ 56     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
 No options
@@ -2989,16 +3112,17 @@ Failed: nothing to repeat at offset 7
 
 /x(?U)a++b/D
 ------------------------------------------------------------------
-  0  17 Bra 0
-  3   1 x
-  6   5 Once
-  9     a+
- 11   5 Ket
- 14   1 b
- 17  17 Ket
- 20     End
+  0  15 Bra 0
+  3     x
+  5   5 Once
+  8     a+
+ 10   5 Ket
+ 13     b
+ 15  15 Ket
+ 18     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'x'
 Need char = 'b'
@@ -3007,16 +3131,17 @@ Need char = 'b'
 
 /(?U)xa++b/D
 ------------------------------------------------------------------
-  0  17 Bra 0
-  3   1 x
-  6   5 Once
-  9     a+
- 11   5 Ket
- 14   1 b
- 17  17 Ket
- 20     End
+  0  15 Bra 0
+  3     x
+  5   5 Once
+  8     a+
+ 10   5 Ket
+ 13     b
+ 15  15 Ket
+ 18     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: ungreedy
 First char = 'x'
 Need char = 'b'
@@ -3032,10 +3157,10 @@ Need char = 'b'
  10     a+
  12   5 Ket
  15  37 Bra 3
- 18     [a-b]+?
+ 18     [ab]+?
  52  37 Ket
  55  37 Bra 4
- 58     [b-c]+
+ 58     [bc]+
  92  37 Ket
  95   5 Bra 5
  98     \w*
@@ -3045,38 +3170,41 @@ Need char = 'b'
 109     End
 ------------------------------------------------------------------
 Capturing subpattern count = 5
+Partial matching not supported
 Options: anchored
 No first char
 No need char
 
 /^x(?U)a+b/D
 ------------------------------------------------------------------
-  0  12 Bra 0
+  0  10 Bra 0
   3     ^
-  4   1 x
-  7     a+?
-  9   1 b
- 12  12 Ket
- 15     End
+  4     x
+  6     a+?
+  8     b
+ 10  10 Ket
+ 13     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: anchored
 No first char
 Need char = 'b'
 
 /^x(?U)(a+)b/D
 ------------------------------------------------------------------
-  0  18 Bra 0
+  0  16 Bra 0
   3     ^
-  4   1 x
-  7   5 Bra 1
- 10     a+?
- 12   5 Ket
- 15   1 b
- 18  18 Ket
- 21     End
+  4     x
+  6   5 Bra 1
+  9     a+?
+ 11   5 Ket
+ 14     b
+ 16  16 Ket
+ 19     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
+Partial matching not supported
 Options: anchored
 No first char
 Need char = 'b'
@@ -3091,34 +3219,19 @@ Failed: POSIX collating elements are not
 Failed: POSIX named classes are supported only within a class at offset 0
 
 /\l/
-Failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at offset 1
+Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1
 
 /\L/
-Failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at offset 1
+Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1
 
 /\N{name}/
-Failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at offset 1
-
-/\pP/
-Failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at offset 1
-
-/\PP/
-Failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at offset 1
-
-/\p{prop}/
-Failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at offset 1
-
-/\P{prop}/
-Failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at offset 1
+Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1
 
 /\u/
-Failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at offset 1
+Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1
 
 /\U/
-Failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at offset 1
-
-/\X/
-Failed: PCRE does not support \L, \l, \N, \P, \p, \U, \u, or \X at offset 1
+Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1
 
 /[/
 Failed: missing terminating ] for character class at offset 1
@@ -3133,7 +3246,7 @@ Failed: missing terminating ] for charac
 Memory allocation (code space): 40
 ------------------------------------------------------------------
   0  36 Bra 0
-  3     [\x09-\x0a\x0c-\x0d ]
+  3     [\x09\x0a\x0c\x0d ]
  36  36 Ket
  39     End
 ------------------------------------------------------------------
@@ -3170,6 +3283,7 @@ No need char
 
 /< (?: (?(R) \d++  | [^<>]*+) | (?R)) * >/x
 Capturing subpattern count = 0
+Partial matching not supported
 Options: extended
 First char = '<'
 Need char = '>'
@@ -3191,14 +3305,13 @@ No match
 No match
 
 |8J\$WE\<\.rX\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|DM
-Memory allocation (code space): 421
+Memory allocation (code space): 826
 ------------------------------------------------------------------
-  0 417 Bra 0
-  3 250 8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:
-255 159 x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X
-416     \b
-417 417 Ket
-420     End
+  0 822 Bra 0
+  3     8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X
+821     \b
+822 822 Ket
+825     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 No options
@@ -3206,14 +3319,13 @@ First char = '8'
 Need char = 'X'
 
 |\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|DM
-Memory allocation (code space): 416
+Memory allocation (code space): 816
 ------------------------------------------------------------------
-  0 412 Bra 0
-  3 250 $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[
-255 154 %z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X
-411     \b
-412 412 Ket
-415     End
+  0 812 Bra 0
+  3     $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X
+811     \b
+812 812 Ket
+815     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 No options
@@ -3223,12 +3335,14 @@ Need char = 'X'
 /(.*)\d+\1/I
 Capturing subpattern count = 1
 Max back reference = 1
+Partial matching not supported
 No options
 No first char
 No need char
 
 /(.*)\d+/I
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 First char at start or follows \n
 No need char
@@ -3236,12 +3350,14 @@ No need char
 /(.*)\d+\1/Is
 Capturing subpattern count = 1
 Max back reference = 1
+Partial matching not supported
 Options: dotall
 No first char
 No need char
 
 /(.*)\d+/Is
 Capturing subpattern count = 1
+Partial matching not supported
 Options: anchored dotall
 No first char
 No need char
@@ -3249,6 +3365,7 @@ No need char
 /(.*(xyz))\d+\2/I
 Capturing subpattern count = 2
 Max back reference = 2
+Partial matching not supported
 No options
 First char at start or follows \n
 Need char = 'z'
@@ -3256,6 +3373,7 @@ Need char = 'z'
 /((.*))\d+\1/I
 Capturing subpattern count = 2
 Max back reference = 1
+Partial matching not supported
 No options
 No first char
 No need char
@@ -3272,6 +3390,7 @@ Need char = 'b'
 
 /(?=a).*/I
 Capturing subpattern count = 0
+Partial matching not supported
 No options
 First char = 'a'
 No need char
@@ -3378,8 +3497,7 @@ Capturing subpattern count = 0
 No options
 No first char
 No need char
-Study size = 40
-Starting character set: a b 
+Starting byte set: a b 
 
 /[^a]/I
 Capturing subpattern count = 0
@@ -3398,8 +3516,7 @@ Capturing subpattern count = 0
 No options
 No first char
 Need char = '6'
-Study size = 40
-Starting character set: 0 1 2 3 4 5 6 7 8 9 
+Starting byte set: 0 1 2 3 4 5 6 7 8 9 
 
 /a^b/I
 Capturing subpattern count = 0
@@ -3432,8 +3549,7 @@ Capturing subpattern count = 0
 Options: caseless
 No first char
 No need char
-Study size = 40
-Starting character set: A B a b 
+Starting byte set: A B a b 
 
 /[ab](?i)cd/IS
 Capturing subpattern count = 0
@@ -3441,8 +3557,7 @@ No options
 Case state changes
 No first char
 Need char = 'd' (caseless)
-Study size = 40
-Starting character set: a b 
+Starting byte set: a b 
 
 /abc(?C)def/
 Capturing subpattern count = 0
@@ -3451,11 +3566,11 @@ First char = 'a'
 Need char = 'f'
     abcdef
 --->abcdef
-  0 ^  ^
+  0 ^  ^       d
  0: abcdef
     1234abcdef 
 --->1234abcdef
-  0     ^  ^
+  0     ^  ^       d
  0: abcdef
     *** Failers
 No match
@@ -3463,7 +3578,7 @@ No match
 No match
     abcxyzf   
 --->abcxyzf
-  0 ^  ^
+  0 ^  ^        d
 No match
 
 /abc(?C)de(?C1)f/
@@ -3473,8 +3588,8 @@ First char = 'a'
 Need char = 'f'
     123abcdef
 --->123abcdef
-  0    ^  ^
-  1    ^    ^
+  0    ^  ^       d
+  1    ^    ^     f
  0: abcdef
     
 /(?C1)\dabc(?C2)def/ 
@@ -3484,22 +3599,22 @@ No first char
 Need char = 'f'
     1234abcdef
 --->1234abcdef
-  1 ^
-  1  ^
-  1   ^
-  1    ^
-  2    ^   ^
+  1 ^              \d
+  1  ^             \d
+  1   ^            \d
+  1    ^           \d
+  2    ^   ^       d
  0: 4abcdef
     *** Failers
 No match
     abcdef 
 --->abcdef
-  1 ^
-  1  ^
-  1   ^
-  1    ^
-  1     ^
-  1      ^
+  1 ^          \d
+  1  ^         \d
+  1   ^        \d
+  1    ^       \d
+  1     ^      \d
+  1      ^     \d
 No match
     
 /(?C255)ab/
@@ -3526,7 +3641,7 @@ Need char = 'f'
 No match
     \x83\x0\x61bcdef
 --->\x83\x00abcdef
-  0         ^  ^
+  0         ^  ^       d
  0: abcdef
 
 /(abc)(?C)de(?C1)f/
@@ -3536,8 +3651,8 @@ First char = 'a'
 Need char = 'f'
     123abcdef
 --->123abcdef
-  0    ^  ^
-  1    ^    ^
+  0    ^  ^       d
+  1    ^    ^     f
  0: abcdef
  1: abc
     123abcdef\C+ 
@@ -3545,12 +3660,12 @@ Callout 0: last capture = 1
  0: <unset>
  1: abc
 --->123abcdef
-       ^  ^
+       ^  ^       d
 Callout 1: last capture = 1
  0: <unset>
  1: abc
 --->123abcdef
-       ^    ^
+       ^    ^     f
  0: abcdef
  1: abc
     123abcdef\C- 
@@ -3560,8 +3675,8 @@ Callout 1: last capture = 1
 No match
     123abcdef\C!1 
 --->123abcdef
-  0    ^  ^
-  1    ^    ^
+  0    ^  ^       d
+  1    ^    ^     f
 No match
     
 /(?C0)(abc(?C1))*/
@@ -3571,34 +3686,35 @@ No first char
 No need char
     abcabcabc
 --->abcabcabc
-  0 ^
-  1 ^  ^
-  1 ^     ^
-  1 ^        ^
+  0 ^             (abc(?C1))*
+  1 ^  ^          )
+  1 ^     ^       )
+  1 ^        ^    )
  0: abcabcabc
  1: abc
     abcabc\C!1!3   
 --->abcabc
-  0 ^
-  1 ^  ^
-  1 ^     ^
+  0 ^          (abc(?C1))*
+  1 ^  ^       )
+  1 ^     ^    )
  0: abcabc
  1: abc
     *** Failers
 --->*** Failers
-  0 ^
+  0 ^               (abc(?C1))*
  0: 
     abcabcabc\C!1!3   
 --->abcabcabc
-  0 ^
-  1 ^  ^
-  1 ^     ^
-  1 ^        ^
+  0 ^             (abc(?C1))*
+  1 ^  ^          )
+  1 ^     ^       )
+  1 ^        ^    )
  0: abcabc
  1: abc
 
 /(\d{3}(?C))*/
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 No first char
 No need char
@@ -3606,36 +3722,36 @@ No need char
 Callout 0: last capture = -1
  0: <unset>
 --->123
-    ^  ^
+    ^  ^    )
  0: 123
  1: 123
     123456\C+
 Callout 0: last capture = -1
  0: <unset>
 --->123456
-    ^  ^
+    ^  ^       )
 Callout 0: last capture = 1
  0: <unset>
  1: 123
 --->123456
-    ^     ^
+    ^     ^    )
  0: 123456
  1: 456
     123456789\C+  
 Callout 0: last capture = -1
  0: <unset>
 --->123456789
-    ^  ^
+    ^  ^          )
 Callout 0: last capture = 1
  0: <unset>
  1: 123
 --->123456789
-    ^     ^
+    ^     ^       )
 Callout 0: last capture = 1
  0: <unset>
  1: 456
 --->123456789
-    ^        ^
+    ^        ^    )
  0: 123456789
  1: 789
 
@@ -3650,11 +3766,11 @@ Callout 0: last capture = 2
  1: <unset>
  2: xyz
 --->xyzabc
-    ^  ^
+    ^  ^       p
 Callout 1: last capture = -1
  0: <unset>
 --->xyzabc
-    ^
+    ^          x
  0: xyzabc
  1: xyzabc
 
@@ -3670,12 +3786,12 @@ Callout 0: last capture = 3
  2: <unset>
  3: xyz
 --->Xxyzabc
-    ^   ^
+    ^   ^       p
 Callout 1: last capture = 1
  0: <unset>
  1: X
 --->Xxyzabc
-    ^^
+    ^^          x
  0: Xxyzabc
  1: X
  2: xyzabc
@@ -3690,7 +3806,7 @@ Callout 0: last capture = 1
  0: <unset>
  1: abc
 --->abcdef
-    ^
+    ^          a
  0: abcdef
  1: abc
     
@@ -3704,11 +3820,11 @@ Callout 1: last capture = 1
  0: <unset>
  1: abc
 --->abcxyz
-    ^  ^
+    ^  ^       d
 Callout 2: last capture = -1
  0: <unset>
 --->abcxyz
-    ^
+    ^          a
  0: abcxyz
 
 /(?<=(abc)(?C))xyz/
@@ -3721,10 +3837,62 @@ Callout 0: last capture = 1
  0: <unset>
  1: abc
 --->abcxyz
-       ^
+       ^       )
  0: xyz
  1: abc
    
+/a(b+)(c*)(?C1)/
+Capturing subpattern count = 2
+Partial matching not supported
+No options
+First char = 'a'
+Need char = 'b'
+    abbbbbccc\C*1
+--->abbbbbccc
+  1 ^        ^    
+Callout data = 1
+  1 ^       ^     
+Callout data = 1
+  1 ^      ^      
+Callout data = 1
+  1 ^     ^       
+Callout data = 1
+  1 ^    ^        
+Callout data = 1
+  1 ^   ^         
+Callout data = 1
+  1 ^  ^          
+Callout data = 1
+  1 ^ ^           
+Callout data = 1
+No match
+
+/a(b+?)(c*?)(?C1)/
+Capturing subpattern count = 2
+Partial matching not supported
+No options
+First char = 'a'
+Need char = 'b'
+    abbbbbccc\C*1
+--->abbbbbccc
+  1 ^ ^           
+Callout data = 1
+  1 ^  ^          
+Callout data = 1
+  1 ^   ^         
+Callout data = 1
+  1 ^    ^        
+Callout data = 1
+  1 ^     ^       
+Callout data = 1
+  1 ^      ^      
+Callout data = 1
+  1 ^       ^     
+Callout data = 1
+  1 ^        ^    
+Callout data = 1
+No match
+   
 /(?C)abc/ 
 Capturing subpattern count = 0
 No options
@@ -3742,8 +3910,7 @@ Capturing subpattern count = 0
 No options
 No first char
 No need char
-Study size = 40
-Starting character set: a b 
+Starting byte set: a b 
 
 /(?R)/
 Failed: recursive call could loop indefinitely at offset 3
@@ -3828,14 +3995,14 @@ Need char = '<'
 
 /(a(?1)b)/D
 ------------------------------------------------------------------
-  0  18 Bra 0
-  3  12 Bra 1
-  6   1 a
-  9   3 Recurse
- 12   1 b
- 15  12 Ket
- 18  18 Ket
- 21     End
+  0  16 Bra 0
+  3  10 Bra 1
+  6     a
+  8   3 Recurse
+ 11     b
+ 13  10 Ket
+ 16  16 Ket
+ 19     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
 No options
@@ -3844,16 +4011,16 @@ Need char = 'b'
 
 /(a(?1)+b)/D
 ------------------------------------------------------------------
-  0  24 Bra 0
-  3  18 Bra 1
-  6   1 a
-  9   6 Bra 0
- 12   3 Recurse
- 15   6 KetRmax
- 18   1 b
- 21  18 Ket
- 24  24 Ket
- 27     End
+  0  22 Bra 0
+  3  16 Bra 1
+  6     a
+  8   6 Bra 0
+ 11   3 Recurse
+ 14   6 KetRmax
+ 17     b
+ 19  16 Ket
+ 22  22 Ket
+ 25     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
 No options
@@ -3863,6 +4030,7 @@ Need char = 'b'
 /^\W*(?:((.)\W*(?1)\W*\2|)|((.)\W*(?3)\W*\4|\W*.\W*))\W*$/i
 Capturing subpattern count = 4
 Max back reference = 4
+Partial matching not supported
 Options: anchored caseless
 No first char
 No need char
@@ -3895,6 +4063,7 @@ No match
     
 /^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/
 Capturing subpattern count = 2
+Partial matching not supported
 Options: anchored
 No first char
 No need char
@@ -3935,6 +4104,7 @@ No match
 
 /((< (?: (?(R) \d++  | [^<>]*+) | (?2)) * >))/x
 Capturing subpattern count = 2
+Partial matching not supported
 Options: extended
 First char = '<'
 Need char = '>'
@@ -4017,19 +4187,19 @@ No need char
 
 /a(?P<name1>b|c)d(?P<longername2>e)/D
 ------------------------------------------------------------------
-  0  33 Bra 0
-  3   1 a
-  6   6 Bra 1
-  9   1 b
- 12   6 Alt
- 15   1 c
- 18  12 Ket
- 21   1 d
- 24   6 Bra 2
- 27   1 e
- 30   6 Ket
- 33  33 Ket
- 36     End
+  0  28 Bra 0
+  3     a
+  5   5 Bra 1
+  8     b
+ 10   5 Alt
+ 13     c
+ 15  10 Ket
+ 18     d
+ 20   5 Bra 2
+ 23     e
+ 25   5 Ket
+ 28  28 Ket
+ 31     End
 ------------------------------------------------------------------
 Capturing subpattern count = 2
 Named capturing subpatterns:
@@ -4049,21 +4219,21 @@ Need char = 'e'
 
 /(?:a(?P<c>c(?P<d>d)))(?P<a>a)/D
 ------------------------------------------------------------------
-  0  39 Bra 0
-  3  24 Bra 0
-  6   1 a
-  9  15 Bra 1
- 12   1 c
- 15   6 Bra 2
- 18   1 d
- 21   6 Ket
- 24  15 Ket
- 27  24 Ket
- 30   6 Bra 3
- 33   1 a
- 36   6 Ket
- 39  39 Ket
- 42     End
+  0  35 Bra 0
+  3  21 Bra 0
+  6     a
+  8  13 Bra 1
+ 11     c
+ 13   5 Bra 2
+ 16     d
+ 18   5 Ket
+ 21  13 Ket
+ 24  21 Ket
+ 27   5 Bra 3
+ 30     a
+ 32   5 Ket
+ 35  35 Ket
+ 38     End
 ------------------------------------------------------------------
 Capturing subpattern count = 3
 Named capturing subpatterns:
@@ -4076,19 +4246,19 @@ Need char = 'a'
 
 /(?P<a>a)...(?P=a)bbb(?P>a)d/D
 ------------------------------------------------------------------
-  0  29 Bra 0
-  3   6 Bra 1
-  6   1 a
-  9   6 Ket
+  0  28 Bra 0
+  3   5 Bra 1
+  6     a
+  8   5 Ket
+ 11     Any
  12     Any
  13     Any
- 14     Any
- 15     \1
- 18   3 bbb
+ 14     \1
+ 17     bbb
  23   3 Recurse
- 26   1 d
- 29  29 Ket
- 32     End
+ 26     d
+ 28  28 Ket
+ 31     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
 Max back reference = 1
@@ -4106,6 +4276,7 @@ Named capturing subpatterns:
   one     1
   three   3
   two     2
+Partial matching not supported
 Options: anchored caseless
 No first char
 No need char
@@ -4151,6 +4322,7 @@ No need char
 
 /(.*)a/sI
 Capturing subpattern count = 1
+Partial matching not supported
 Options: anchored dotall
 No first char
 Need char = 'a'
@@ -4158,6 +4330,7 @@ Need char = 'a'
 /(.*)a\1/sI
 Capturing subpattern count = 1
 Max back reference = 1
+Partial matching not supported
 Options: dotall
 No first char
 Need char = 'a'
@@ -4165,12 +4338,14 @@ Need char = 'a'
 /(.*)a(b)\2/sI
 Capturing subpattern count = 2
 Max back reference = 2
+Partial matching not supported
 Options: anchored dotall
 No first char
 Need char = 'b'
 
 /((.*)a|(.*)b)z/sI
 Capturing subpattern count = 3
+Partial matching not supported
 Options: anchored dotall
 No first char
 Need char = 'z'
@@ -4178,6 +4353,7 @@ Need char = 'z'
 /((.*)a|(.*)b)z\1/sI
 Capturing subpattern count = 3
 Max back reference = 1
+Partial matching not supported
 Options: dotall
 No first char
 Need char = 'z'
@@ -4185,6 +4361,7 @@ Need char = 'z'
 /((.*)a|(.*)b)z\2/sI
 Capturing subpattern count = 3
 Max back reference = 2
+Partial matching not supported
 Options: dotall
 No first char
 Need char = 'z'
@@ -4192,6 +4369,7 @@ Need char = 'z'
 /((.*)a|(.*)b)z\3/sI
 Capturing subpattern count = 3
 Max back reference = 3
+Partial matching not supported
 Options: dotall
 No first char
 Need char = 'z'
@@ -4199,12 +4377,14 @@ Need char = 'z'
 /((.*)a|^(.*)b)z\3/sI
 Capturing subpattern count = 3
 Max back reference = 3
+Partial matching not supported
 Options: anchored dotall
 No first char
 Need char = 'z'
 
 /(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/sI
 Capturing subpattern count = 31
+Partial matching not supported
 Options: anchored dotall
 No first char
 No need char
@@ -4212,6 +4392,7 @@ No need char
 /(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31/sI
 Capturing subpattern count = 31
 Max back reference = 31
+Partial matching not supported
 Options: dotall
 No first char
 No need char
@@ -4219,21 +4400,22 @@ No need char
 /(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32/sI
 Capturing subpattern count = 32
 Max back reference = 32
+Partial matching not supported
 Options: dotall
 No first char
 No need char
 
 /(a)(bc)/ND
 ------------------------------------------------------------------
-  0  22 Bra 0
-  3   6 Bra 0
-  6   1 a
-  9   6 Ket
- 12   7 Bra 0
- 15   2 bc
- 19   7 Ket
- 22  22 Ket
- 25     End
+  0  21 Bra 0
+  3   5 Bra 0
+  6     a
+  8   5 Ket
+ 11   7 Bra 0
+ 14     bc
+ 18   7 Ket
+ 21  21 Ket
+ 24     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options:
@@ -4244,15 +4426,15 @@ Need char = 'c'
 
 /(?P<one>a)(bc)/ND
 ------------------------------------------------------------------
-  0  22 Bra 0
-  3   6 Bra 1
-  6   1 a
-  9   6 Ket
- 12   7 Bra 0
- 15   2 bc
- 19   7 Ket
- 22  22 Ket
- 25     End
+  0  21 Bra 0
+  3   5 Bra 1
+  6     a
+  8   5 Ket
+ 11   7 Bra 0
+ 14     bc
+ 18   7 Ket
+ 21  21 Ket
+ 24     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
 Named capturing subpatterns:
@@ -4266,15 +4448,15 @@ Need char = 'c'
 
 /(a)(?P<named>bc)/ND
 ------------------------------------------------------------------
-  0  22 Bra 0
-  3   6 Bra 0
-  6   1 a
-  9   6 Ket
- 12   7 Bra 1
- 15   2 bc
- 19   7 Ket
- 22  22 Ket
- 25     End
+  0  21 Bra 0
+  3   5 Bra 0
+  6     a
+  8   5 Ket
+ 11   7 Bra 1
+ 14     bc
+ 18   7 Ket
+ 21  21 Ket
+ 24     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
 Named capturing subpatterns:
@@ -4285,6 +4467,7 @@ Need char = 'c'
 
 /(a+)*zz/
 Capturing subpattern count = 1
+Partial matching not supported
 No options
 No first char
 Need char = 'z'
@@ -4303,23 +4486,23 @@ First char = 'a'
 Need char = 'b'
    aaabbb
 --->aaabbb
-  1 ^  ^
+  1 ^  ^       b
  0: aaabbb
  1: aaabbb
    aaabbb\C*0
 --->aaabbb
-  1 ^  ^
+  1 ^  ^       b
  0: aaabbb
  1: aaabbb
    aaabbb\C*1
 --->aaabbb
-  1 ^  ^
+  1 ^  ^       b
 Callout data = 1
  0: ab
  1: ab
    aaabbb\C*-1
 --->aaabbb
-  1 ^  ^
+  1 ^  ^       b
 Callout data = -1
 No match
 
@@ -4414,9 +4597,1350 @@ Failed: two named groups have the same n
 /(?P<abc>abc(?P<def>def)(?P<abc>xyz))/
 Failed: two named groups have the same name at offset 31
 
-/ End of testinput2 /
+"\[((?P<elem>\d+)(,(?P>elem))*)\]"
+Capturing subpattern count = 3
+Named capturing subpatterns:
+  elem   2
+Partial matching not supported
+No options
+First char = '['
+Need char = ']'
+    [10,20,30,5,5,4,4,2,43,23,4234]
+ 0: [10,20,30,5,5,4,4,2,43,23,4234]
+ 1: 10,20,30,5,5,4,4,2,43,23,4234
+ 2: 10
+ 3: ,4234
+    *** Failers
+No match
+    []  
+No match
+
+"\[((?P<elem>\d+)(,(?P>elem))*)?\]"
+Capturing subpattern count = 3
+Named capturing subpatterns:
+  elem   2
+Partial matching not supported
+No options
+First char = '['
+Need char = ']'
+    [10,20,30,5,5,4,4,2,43,23,4234]
+ 0: [10,20,30,5,5,4,4,2,43,23,4234]
+ 1: 10,20,30,5,5,4,4,2,43,23,4234
+ 2: 10
+ 3: ,4234
+    [] 
+ 0: []
+
+/(a(b(?2)c))?/D
+------------------------------------------------------------------
+  0  25 Bra 0
+  3     Brazero
+  4  18 Bra 1
+  7     a
+  9  10 Bra 2
+ 12     b
+ 14   9 Recurse
+ 17     c
+ 19  10 Ket
+ 22  18 Ket
+ 25  25 Ket
+ 28     End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+No options
+No first char
+No need char
+
+/(a(b(?2)c))*/D
+------------------------------------------------------------------
+  0  25 Bra 0
+  3     Brazero
+  4  18 Bra 1
+  7     a
+  9  10 Bra 2
+ 12     b
+ 14   9 Recurse
+ 17     c
+ 19  10 Ket
+ 22  18 KetRmax
+ 25  25 Ket
+ 28     End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+No options
+No first char
+No need char
+
+/(a(b(?2)c)){0,2}/D
+------------------------------------------------------------------
+  0  53 Bra 0
+  3     Brazero
+  4  46 Bra 0
+  7  18 Bra 1
+ 10     a
+ 12  10 Bra 2
+ 15     b
+ 17  12 Recurse
+ 20     c
+ 22  10 Ket
+ 25  18 Ket
+ 28     Brazero
+ 29  18 Bra 1
+ 32     a
+ 34  10 Bra 2
+ 37     b
+ 39  12 Recurse
+ 42     c
+ 44  10 Ket
+ 47  18 Ket
+ 50  46 Ket
+ 53  53 Ket
+ 56     End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+No options
+No first char
+No need char
+
+/[ab]{1}+/D
+------------------------------------------------------------------
+  0  47 Bra 0
+  3  41 Once
+  6     [ab]{1,1}
+ 44  41 Ket
+ 47  47 Ket
+ 50     End
+------------------------------------------------------------------
 Capturing subpattern count = 0
 No options
-First char = ' '
-Need char = ' '
+No first char
+No need char
+
+/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/i
+Capturing subpattern count = 3
+Partial matching not supported
+Options: caseless
+No first char
+Need char = 'g' (caseless)
+     Baby Bjorn Active Carrier - With free SHIPPING!!
+ 0: Baby Bjorn Active Carrier - With free SHIPPING!!
+ 1: Baby Bjorn Active Carrier - With free SHIPPING!!
 
+/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/iS
+Capturing subpattern count = 3
+Partial matching not supported
+Options: caseless
+No first char
+Need char = 'g' (caseless)
+Study returned NULL
+     Baby Bjorn Active Carrier - With free SHIPPING!!
+ 0: Baby Bjorn Active Carrier - With free SHIPPING!!
+ 1: Baby Bjorn Active Carrier - With free SHIPPING!!
+     
+/a*.*b/SD
+------------------------------------------------------------------
+  0   9 Bra 0
+  3     a*
+  5     Any*
+  7     b
+  9   9 Ket
+ 12     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+Need char = 'b'
+Study returned NULL
+
+/(a|b)*.?c/SD 
+------------------------------------------------------------------
+  0  21 Bra 0
+  3     Brazero
+  4   5 Bra 1
+  7     a
+  9   5 Alt
+ 12     b
+ 14  10 KetRmax
+ 17     Any?
+ 19     c
+ 21  21 Ket
+ 24     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+No options
+No first char
+Need char = 'c'
+Study returned NULL
+
+/abc(?C255)de(?C)f/D
+------------------------------------------------------------------
+  0  27 Bra 0
+  3     abc
+  9     Callout 255 10 1
+ 15     de
+ 19     Callout 0 16 1
+ 25     f
+ 27  27 Ket
+ 30     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'f'
+
+/abcde/CD
+------------------------------------------------------------------
+  0  49 Bra 0
+  3     Callout 255 0 1
+  9     a
+ 11     Callout 255 1 1
+ 17     b
+ 19     Callout 255 2 1
+ 25     c
+ 27     Callout 255 3 1
+ 33     d
+ 35     Callout 255 4 1
+ 41     e
+ 43     Callout 255 5 0
+ 49  49 Ket
+ 52     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options:
+First char = 'a'
+Need char = 'e'
+  abcde
+--->abcde
+ +0 ^         a
+ +1 ^^        b
+ +2 ^ ^       c
+ +3 ^  ^      d
+ +4 ^   ^     e
+ +5 ^    ^    
+ 0: abcde
+  abcdfe 
+--->abcdfe
+ +0 ^          a
+ +1 ^^         b
+ +2 ^ ^        c
+ +3 ^  ^       d
+ +4 ^   ^      e
+No match
+  
+/a*b/CD
+------------------------------------------------------------------
+  0  25 Bra 0
+  3     Callout 255 0 2
+  9     a*
+ 11     Callout 255 2 1
+ 17     b
+ 19     Callout 255 3 0
+ 25  25 Ket
+ 28     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options:
+No first char
+Need char = 'b'
+  ab
+--->ab
+ +0 ^      a*
+ +2 ^^     b
+ +3 ^ ^    
+ 0: ab
+  aaaab
+--->aaaab
+ +0 ^         a*
+ +2 ^   ^     b
+ +3 ^    ^    
+ 0: aaaab
+  aaaacb   
+--->aaaacb
+ +0 ^          a*
+ +2 ^   ^      b
+ +2 ^  ^       b
+ +2 ^ ^        b
+ +2 ^^         b
+ +2 ^          b
+ +0  ^         a*
+ +2  ^  ^      b
+ +2  ^ ^       b
+ +2  ^^        b
+ +2  ^         b
+ +0   ^        a*
+ +2   ^ ^      b
+ +2   ^^       b
+ +2   ^        b
+ +0    ^       a*
+ +2    ^^      b
+ +2    ^       b
+ +0     ^      a*
+ +2     ^      b
+ +0      ^     a*
+ +2      ^     b
+ +3      ^^    
+ 0: b
+
+/a+b/CD
+------------------------------------------------------------------
+  0  25 Bra 0
+  3     Callout 255 0 2
+  9     a+
+ 11     Callout 255 2 1
+ 17     b
+ 19     Callout 255 3 0
+ 25  25 Ket
+ 28     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options:
+First char = 'a'
+Need char = 'b'
+  ab
+--->ab
+ +0 ^      a+
+ +2 ^^     b
+ +3 ^ ^    
+ 0: ab
+  aaaab
+--->aaaab
+ +0 ^         a+
+ +2 ^   ^     b
+ +3 ^    ^    
+ 0: aaaab
+  aaaacb   
+--->aaaacb
+ +0 ^          a+
+ +2 ^   ^      b
+ +2 ^  ^       b
+ +2 ^ ^        b
+ +2 ^^         b
+ +0  ^         a+
+ +2  ^  ^      b
+ +2  ^ ^       b
+ +2  ^^        b
+ +0   ^        a+
+ +2   ^ ^      b
+ +2   ^^       b
+ +0    ^       a+
+ +2    ^^      b
+No match
+
+/(abc|def)x/CD
+------------------------------------------------------------------
+  0  92 Bra 0
+  3     Callout 255 0 9
+  9  33 Bra 1
+ 12     Callout 255 1 1
+ 18     a
+ 20     Callout 255 2 1
+ 26     b
+ 28     Callout 255 3 1
+ 34     c
+ 36     Callout 255 4 0
+ 42  33 Alt
+ 45     Callout 255 5 1
+ 51     d
+ 53     Callout 255 6 1
+ 59     e
+ 61     Callout 255 7 1
+ 67     f
+ 69     Callout 255 8 0
+ 75  66 Ket
+ 78     Callout 255 9 1
+ 84     x
+ 86     Callout 255 10 0
+ 92  92 Ket
+ 95     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options:
+No first char
+Need char = 'x'
+  abcx
+--->abcx
+ +0 ^        (abc|def)
+ +1 ^        a
+ +2 ^^       b
+ +3 ^ ^      c
+ +4 ^  ^     |
+ +9 ^  ^     x
++10 ^   ^    
+ 0: abcx
+ 1: abc
+  defx
+--->defx
+ +0 ^        (abc|def)
+ +1 ^        a
+ +5 ^        d
+ +6 ^^       e
+ +7 ^ ^      f
+ +8 ^  ^     )
+ +9 ^  ^     x
++10 ^   ^    
+ 0: defx
+ 1: def
+  abcdefzx
+--->abcdefzx
+ +0 ^            (abc|def)
+ +1 ^            a
+ +2 ^^           b
+ +3 ^ ^          c
+ +4 ^  ^         |
+ +9 ^  ^         x
+ +5 ^            d
+ +0  ^           (abc|def)
+ +1  ^           a
+ +5  ^           d
+ +0   ^          (abc|def)
+ +1   ^          a
+ +5   ^          d
+ +0    ^         (abc|def)
+ +1    ^         a
+ +5    ^         d
+ +6    ^^        e
+ +7    ^ ^       f
+ +8    ^  ^      )
+ +9    ^  ^      x
+ +0     ^        (abc|def)
+ +1     ^        a
+ +5     ^        d
+ +0      ^       (abc|def)
+ +1      ^       a
+ +5      ^       d
+ +0       ^      (abc|def)
+ +1       ^      a
+ +5       ^      d
+ +0        ^     (abc|def)
+ +1        ^     a
+ +5        ^     d
+No match
+
+/(ab|cd){3,4}/C
+Capturing subpattern count = 1
+Options:
+No first char
+No need char
+  ababab
+--->ababab
+ +0 ^          (ab|cd){3,4}
+ +1 ^          a
+ +2 ^^         b
+ +3 ^ ^        |
+ +1 ^ ^        a
+ +2 ^  ^       b
+ +3 ^   ^      |
+ +1 ^   ^      a
+ +2 ^    ^     b
+ +3 ^     ^    |
+ +1 ^     ^    a
+ +4 ^     ^    c
++12 ^     ^    
+ 0: ababab
+ 1: ab
+  abcdabcd
+--->abcdabcd
+ +0 ^            (ab|cd){3,4}
+ +1 ^            a
+ +2 ^^           b
+ +3 ^ ^          |
+ +1 ^ ^          a
+ +4 ^ ^          c
+ +5 ^  ^         d
+ +6 ^   ^        )
+ +1 ^   ^        a
+ +2 ^    ^       b
+ +3 ^     ^      |
+ +1 ^     ^      a
+ +4 ^     ^      c
+ +5 ^      ^     d
+ +6 ^       ^    )
++12 ^       ^    
+ 0: abcdabcd
+ 1: cd
+  abcdcdcdcdcd  
+--->abcdcdcdcdcd
+ +0 ^                (ab|cd){3,4}
+ +1 ^                a
+ +2 ^^               b
+ +3 ^ ^              |
+ +1 ^ ^              a
+ +4 ^ ^              c
+ +5 ^  ^             d
+ +6 ^   ^            )
+ +1 ^   ^            a
+ +4 ^   ^            c
+ +5 ^    ^           d
+ +6 ^     ^          )
+ +1 ^     ^          a
+ +4 ^     ^          c
+ +5 ^      ^         d
+ +6 ^       ^        )
++12 ^       ^        
+ 0: abcdcdcd
+ 1: cd
+
+/([ab]{,4}c|xy)/CD
+------------------------------------------------------------------
+  0 131 Bra 0
+  3     Callout 255 0 14
+  9  88 Bra 1
+ 12     Callout 255 1 4
+ 18     [ab]
+ 51     Callout 255 5 1
+ 57     {
+ 59     Callout 255 6 1
+ 65     ,
+ 67     Callout 255 7 1
+ 73     4
+ 75     Callout 255 8 1
+ 81     }
+ 83     Callout 255 9 1
+ 89     c
+ 91     Callout 255 10 0
+ 97  25 Alt
+100     Callout 255 11 1
+106     x
+108     Callout 255 12 1
+114     y
+116     Callout 255 13 0
+122 113 Ket
+125     Callout 255 14 0
+131 131 Ket
+134     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options:
+No first char
+No need char
+    Note: that { does NOT introduce a quantifier
+--->Note: that { does NOT introduce a quantifier
+ +0 ^                                                ([ab]{,4}c|xy)
+ +1 ^                                                [ab]
++11 ^                                                x
+ +0  ^                                               ([ab]{,4}c|xy)
+ +1  ^                                               [ab]
++11  ^                                               x
+ +0   ^                                              ([ab]{,4}c|xy)
+ +1   ^                                              [ab]
++11   ^                                              x
+ +0    ^                                             ([ab]{,4}c|xy)
+ +1    ^                                             [ab]
++11    ^                                             x
+ +0     ^                                            ([ab]{,4}c|xy)
+ +1     ^                                            [ab]
++11     ^                                            x
+ +0      ^                                           ([ab]{,4}c|xy)
+ +1      ^                                           [ab]
++11      ^                                           x
+ +0       ^                                          ([ab]{,4}c|xy)
+ +1       ^                                          [ab]
++11       ^                                          x
+ +0        ^                                         ([ab]{,4}c|xy)
+ +1        ^                                         [ab]
++11        ^                                         x
+ +0         ^                                        ([ab]{,4}c|xy)
+ +1         ^                                        [ab]
+ +5         ^^                                       {
++11         ^                                        x
+ +0          ^                                       ([ab]{,4}c|xy)
+ +1          ^                                       [ab]
++11          ^                                       x
+ +0           ^                                      ([ab]{,4}c|xy)
+ +1           ^                                      [ab]
++11           ^                                      x
+ +0            ^                                     ([ab]{,4}c|xy)
+ +1            ^                                     [ab]
++11            ^                                     x
+ +0             ^                                    ([ab]{,4}c|xy)
+ +1             ^                                    [ab]
++11             ^                                    x
+ +0              ^                                   ([ab]{,4}c|xy)
+ +1              ^                                   [ab]
++11              ^                                   x
+ +0               ^                                  ([ab]{,4}c|xy)
+ +1               ^                                  [ab]
++11               ^                                  x
+ +0                ^                                 ([ab]{,4}c|xy)
+ +1                ^                                 [ab]
++11                ^                                 x
+ +0                 ^                                ([ab]{,4}c|xy)
+ +1                 ^                                [ab]
++11                 ^                                x
+ +0                  ^                               ([ab]{,4}c|xy)
+ +1                  ^                               [ab]
++11                  ^                               x
+ +0                   ^                              ([ab]{,4}c|xy)
+ +1                   ^                              [ab]
++11                   ^                              x
+ +0                    ^                             ([ab]{,4}c|xy)
+ +1                    ^                             [ab]
++11                    ^                             x
+ +0                     ^                            ([ab]{,4}c|xy)
+ +1                     ^                            [ab]
++11                     ^                            x
+ +0                      ^                           ([ab]{,4}c|xy)
+ +1                      ^                           [ab]
++11                      ^                           x
+ +0                       ^                          ([ab]{,4}c|xy)
+ +1                       ^                          [ab]
++11                       ^                          x
+ +0                        ^                         ([ab]{,4}c|xy)
+ +1                        ^                         [ab]
++11                        ^                         x
+ +0                         ^                        ([ab]{,4}c|xy)
+ +1                         ^                        [ab]
++11                         ^                        x
+ +0                          ^                       ([ab]{,4}c|xy)
+ +1                          ^                       [ab]
++11                          ^                       x
+ +0                           ^                      ([ab]{,4}c|xy)
+ +1                           ^                      [ab]
++11                           ^                      x
+ +0                            ^                     ([ab]{,4}c|xy)
+ +1                            ^                     [ab]
++11                            ^                     x
+ +0                             ^                    ([ab]{,4}c|xy)
+ +1                             ^                    [ab]
++11                             ^                    x
+ +0                              ^                   ([ab]{,4}c|xy)
+ +1                              ^                   [ab]
++11                              ^                   x
+ +0                               ^                  ([ab]{,4}c|xy)
+ +1                               ^                  [ab]
++11                               ^                  x
+ +0                                ^                 ([ab]{,4}c|xy)
+ +1                                ^                 [ab]
++11                                ^                 x
+ +0                                 ^                ([ab]{,4}c|xy)
+ +1                                 ^                [ab]
+ +5                                 ^^               {
++11                                 ^                x
+ +0                                  ^               ([ab]{,4}c|xy)
+ +1                                  ^               [ab]
++11                                  ^               x
+ +0                                   ^              ([ab]{,4}c|xy)
+ +1                                   ^              [ab]
++11                                   ^              x
+ +0                                    ^             ([ab]{,4}c|xy)
+ +1                                    ^             [ab]
++11                                    ^             x
+ +0                                     ^            ([ab]{,4}c|xy)
+ +1                                     ^            [ab]
+ +5                                     ^^           {
++11                                     ^            x
+ +0                                      ^           ([ab]{,4}c|xy)
+ +1                                      ^           [ab]
++11                                      ^           x
+ +0                                       ^          ([ab]{,4}c|xy)
+ +1                                       ^          [ab]
++11                                       ^          x
+ +0                                        ^         ([ab]{,4}c|xy)
+ +1                                        ^         [ab]
++11                                        ^         x
+ +0                                         ^        ([ab]{,4}c|xy)
+ +1                                         ^        [ab]
++11                                         ^        x
+ +0                                          ^       ([ab]{,4}c|xy)
+ +1                                          ^       [ab]
++11                                          ^       x
+ +0                                           ^      ([ab]{,4}c|xy)
+ +1                                           ^      [ab]
++11                                           ^      x
+ +0                                            ^     ([ab]{,4}c|xy)
+ +1                                            ^     [ab]
++11                                            ^     x
+ +0                                             ^    ([ab]{,4}c|xy)
+ +1                                             ^    [ab]
++11                                             ^    x
+No match
+
+/([ab]{1,4}c|xy){4,5}?123/CD
+------------------------------------------------------------------
+  0 485 Bra 0
+  3     Callout 255 0 21
+  9  61 Bra 1
+ 12     Callout 255 1 9
+ 18     [ab]{1,4}
+ 56     Callout 255 10 1
+ 62     c
+ 64     Callout 255 11 0
+ 70  25 Alt
+ 73     Callout 255 12 1
+ 79     x
+ 81     Callout 255 13 1
+ 87     y
+ 89     Callout 255 14 0
+ 95  86 Ket
+ 98  61 Bra 1
+101     Callout 255 1 9
+107     [ab]{1,4}
+145     Callout 255 10 1
+151     c
+153     Callout 255 11 0
+159  25 Alt
+162     Callout 255 12 1
+168     x
+170     Callout 255 13 1
+176     y
+178     Callout 255 14 0
+184  86 Ket
+187  61 Bra 1
+190     Callout 255 1 9
+196     [ab]{1,4}
+234     Callout 255 10 1
+240     c
+242     Callout 255 11 0
+248  25 Alt
+251     Callout 255 12 1
+257     x
+259     Callout 255 13 1
+265     y
+267     Callout 255 14 0
+273  86 Ket
+276  61 Bra 1
+279     Callout 255 1 9
+285     [ab]{1,4}
+323     Callout 255 10 1
+329     c
+331     Callout 255 11 0
+337  25 Alt
+340     Callout 255 12 1
+346     x
+348     Callout 255 13 1
+354     y
+356     Callout 255 14 0
+362  86 Ket
+365     Braminzero
+366  61 Bra 1
+369     Callout 255 1 9
+375     [ab]{1,4}
+413     Callout 255 10 1
+419     c
+421     Callout 255 11 0
+427  25 Alt
+430     Callout 255 12 1
+436     x
+438     Callout 255 13 1
+444     y
+446     Callout 255 14 0
+452  86 Ket
+455     Callout 255 21 1
+461     1
+463     Callout 255 22 1
+469     2
+471     Callout 255 23 1
+477     3
+479     Callout 255 24 0
+485 485 Ket
+488     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Partial matching not supported
+Options:
+No first char
+Need char = '3'
+    aacaacaacaacaac123
+--->aacaacaacaacaac123
+ +0 ^                      ([ab]{1,4}c|xy){4,5}?
+ +1 ^                      [ab]{1,4}
++10 ^ ^                    c
++11 ^  ^                   |
+ +1 ^  ^                   [ab]{1,4}
++10 ^    ^                 c
++11 ^     ^                |
+ +1 ^     ^                [ab]{1,4}
++10 ^       ^              c
++11 ^        ^             |
+ +1 ^        ^             [ab]{1,4}
++10 ^          ^           c
++11 ^           ^          |
++21 ^           ^          1
+ +1 ^           ^          [ab]{1,4}
++10 ^             ^        c
++11 ^              ^       |
++21 ^              ^       1
++22 ^               ^      2
++23 ^                ^     3
++24 ^                 ^    
+ 0: aacaacaacaacaac123
+ 1: aac
+
+/\b.*/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+No need char
+  ab cd\>1
+ 0:  cd
+  
+/\b.*/Is 
+Capturing subpattern count = 0
+Partial matching not supported
+Options: dotall
+No first char
+No need char
+  ab cd\>1
+ 0:  cd
+  
+/(?!.bcd).*/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+No need char
+  Xbcd12345 
+ 0: bcd12345
+
+/abcde/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'e'
+    ab\P
+Partial match
+    abc\P
+Partial match
+    abcd\P
+Partial match
+    abcde\P   
+ 0: abcde
+    the quick brown abc\P
+Partial match
+    ** Failers\P
+No match
+    the quick brown abxyz fox\P
+No match
+    
+"^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/(20)?\d\d$"
+Capturing subpattern count = 3
+Options: anchored
+No first char
+Need char = '/'
+    13/05/04\P
+ 0: 13/05/04
+ 1: 13
+ 2: 05
+    13/5/2004\P
+ 0: 13/5/2004
+ 1: 13
+ 2: 5
+ 3: 20
+    02/05/09\P 
+ 0: 02/05/09
+ 1: 02
+ 2: 05
+    1\P
+Partial match
+    1/2\P
+Partial match
+    1/2/0\P
+Partial match
+    1/2/04\P    
+ 0: 1/2/04
+ 1: 1
+ 2: 2
+    0\P
+Partial match
+    02/\P
+Partial match
+    02/0\P   
+Partial match
+    02/1\P
+Partial match
+    ** Failers\P
+No match
+    \P
+No match
+    123\P
+No match
+    33/4/04\P
+No match
+    3/13/04\P
+No match
+    0/1/2003\P
+No match
+    0/\P 
+No match
+    02/0/\P 
+No match
+    02/13\P  
+No match
+
+/0{0,2}ABC/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+Need char = 'C'
+    
+/\d{3,}ABC/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+Need char = 'C'
+    
+/\d*ABC/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+Need char = 'C'
+
+/[abc]+DE/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+Need char = 'E'
+
+/[abc]?123/
+Capturing subpattern count = 0
+No options
+No first char
+Need char = '3'
+    123\P
+ 0: 123
+    a\P
+Partial match
+    b\P
+Partial match
+    c\P
+Partial match
+    c12\P
+Partial match
+    c123\P      
+ 0: c123
+
+/^(?:\d){3,5}X/
+Capturing subpattern count = 0
+Options: anchored
+No first char
+Need char = 'X'
+    1\P
+Partial match
+    123\P
+Partial match
+    123X
+ 0: 123X
+    1234\P
+Partial match
+    1234X
+ 0: 1234X
+    12345\P
+Partial match
+    12345X      
+ 0: 12345X
+    *** Failers 
+No match
+    1X 
+No match
+    123456\P 
+No match
+
+/abc/>testsavedregex
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+Compiled regex written to testsavedregex
+<testsavedregex
+Compiled regex loaded from testsavedregex
+No study data
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+    abc
+ 0: abc
+    ** Failers
+No match
+    bca
+No match
+    
+/abc/F>testsavedregex
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+Compiled regex written to testsavedregex
+<testsavedregex
+Compiled regex (byte-inverted) loaded from testsavedregex
+No study data
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+    abc
+ 0: abc
+    ** Failers
+No match
+    bca
+No match
+
+/(a|b)/S>testsavedregex
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+Starting byte set: a b 
+Compiled regex written to testsavedregex
+Study data written to testsavedregex
+<testsavedregex
+Compiled regex loaded from testsavedregex
+Study data loaded from testsavedregex
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+Starting byte set: a b 
+    abc
+ 0: a
+ 1: a
+    ** Failers
+ 0: a
+ 1: a
+    def  
+No match
+    
+/(a|b)/SF>testsavedregex
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+Starting byte set: a b 
+Compiled regex written to testsavedregex
+Study data written to testsavedregex
+<testsavedregex
+Compiled regex (byte-inverted) loaded from testsavedregex
+Study data loaded from testsavedregex
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+Starting byte set: a b 
+    abc
+ 0: a
+ 1: a
+    ** Failers
+ 0: a
+ 1: a
+    def  
+No match
+    
+~<(\w+)/?>(.)*</(\1)>~smg
+Capturing subpattern count = 3
+Max back reference = 1
+Partial matching not supported
+Options: multiline dotall
+First char = '<'
+Need char = '>'
+    <!DOCTYPE seite SYSTEM "http://www.lco.lineas.de/xmlCms.dtd">\n<seite>\n<dokumenteninformation>\n<seitentitel>Partner der LCO</seitentitel>\n<sprache>de</sprache>\n<seitenbeschreibung>Partner der LINEAS Consulting\nGmbH</seitenbeschreibung>\n<schluesselworte>LINEAS Consulting GmbH Hamburg\nPartnerfirmen</schluesselworte>\n<revisit>30 days</revisit>\n<robots>index,follow</robots>\n<menueinformation>\n<aktiv>ja</aktiv>\n<menueposition>3</menueposition>\n<menuetext>Partner</menuetext>\n</menueinformation>\n<lastedited>\n<autor>LCO</autor>\n<firma>LINEAS Consulting</firma>\n<datum>15.10.2003</datum>\n</lastedited>\n</dokumenteninformation>\n<inhalt>\n\n<absatzueberschrift>Die Partnerfirmen der LINEAS Consulting\nGmbH</absatzueberschrift>\n\n<absatz><link ziel="http://www.ca.com/" zielfenster="_blank">\n<bild name="logo_ca.gif" rahmen="no"/></link> <link\nziel="http://www.ey.com/" zielfenster="_blank"><bild\nname="logo_euy.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><link ziel="http://www.cisco.de/" zielfenster="_blank">\n<bild name="logo_cisco.gif" rahmen="ja"/></link></absatz>\n\n<absatz><link ziel="http://www.atelion.de/"\nzielfenster="_blank"><bild\nname="logo_atelion.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><link ziel="http://www.line-information.de/"\nzielfenster="_blank">\n<bild name="logo_line_information.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><bild name="logo_aw.gif" rahmen="no"/></absatz>\n\n<absatz><link ziel="http://www.incognis.de/"\nzielfenster="_blank"><bild\nname="logo_incognis.gif" rahmen="no"/></link></absatz>\n\n<absatz><link ziel="http://www.addcraft.com/"\nzielfenster="_blank"><bild\nname="logo_addcraft.gif" rahmen="no"/></link></absatz>\n\n<absatz><link ziel="http://www.comendo.com/"\nzielfenster="_blank"><bild\nname="logo_comendo.gif" rahmen="no"/></link></absatz>\n\n</inhalt>\n</seite>
+ 0: <seite>\x0a<dokumenteninformation>\x0a<seitentitel>Partner der LCO</seitentitel>\x0a<sprache>de</sprache>\x0a<seitenbeschreibung>Partner der LINEAS Consulting\x0aGmbH</seitenbeschreibung>\x0a<schluesselworte>LINEAS Consulting GmbH Hamburg\x0aPartnerfirmen</schluesselworte>\x0a<revisit>30 days</revisit>\x0a<robots>index,follow</robots>\x0a<menueinformation>\x0a<aktiv>ja</aktiv>\x0a<menueposition>3</menueposition>\x0a<menuetext>Partner</menuetext>\x0a</menueinformation>\x0a<lastedited>\x0a<autor>LCO</autor>\x0a<firma>LINEAS Consulting</firma>\x0a<datum>15.10.2003</datum>\x0a</lastedited>\x0a</dokumenteninformation>\x0a<inhalt>\x0a\x0a<absatzueberschrift>Die Partnerfirmen der LINEAS Consulting\x0aGmbH</absatzueberschrift>\x0a\x0a<absatz><link ziel="http://www.ca.com/" zielfenster="_blank">\x0a<bild name="logo_ca.gif" rahmen="no"/></link> <link\x0aziel="http://www.ey.com/" zielfenster="_blank"><bild\x0aname="logo_euy.gif" rahmen="no"/></link>\x0a</absatz>\x0a\x0a<absatz><link ziel="http://www.cisco.de/" zielfenster="_blank">\x0a<bild name="logo_cisco.gif" rahmen="ja"/></link></absatz>\x0a\x0a<absatz><link ziel="http://www.atelion.de/"\x0azielfenster="_blank"><bild\x0aname="logo_atelion.gif" rahmen="no"/></link>\x0a</absatz>\x0a\x0a<absatz><link ziel="http://www.line-information.de/"\x0azielfenster="_blank">\x0a<bild name="logo_line_information.gif" rahmen="no"/></link>\x0a</absatz>\x0a\x0a<absatz><bild name="logo_aw.gif" rahmen="no"/></absatz>\x0a\x0a<absatz><link ziel="http://www.incognis.de/"\x0azielfenster="_blank"><bild\x0aname="logo_incognis.gif" rahmen="no"/></link></absatz>\x0a\x0a<absatz><link ziel="http://www.addcraft.com/"\x0azielfenster="_blank"><bild\x0aname="logo_addcraft.gif" rahmen="no"/></link></absatz>\x0a\x0a<absatz><link ziel="http://www.comendo.com/"\x0azielfenster="_blank"><bild\x0aname="logo_comendo.gif" rahmen="no"/></link></absatz>\x0a\x0a</inhalt>\x0a</seite>
+ 1: seite
+ 2: \x0a
+ 3: seite
+
+/^a/IF
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/line\nbreak/
+Capturing subpattern count = 0
+No options
+First char = 'l'
+Need char = 'k'
+    this is a line\nbreak
+ 0: line\x0abreak
+    line one\nthis is a line\nbreak in the second line 
+ 0: line\x0abreak
+
+/line\nbreak/f
+Capturing subpattern count = 0
+Options: firstline
+First char = 'l'
+Need char = 'k'
+    this is a line\nbreak
+ 0: line\x0abreak
+    ** Failers 
+No match
+    line one\nthis is a line\nbreak in the second line 
+No match
+
+/line\nbreak/mf
+Capturing subpattern count = 0
+Options: multiline firstline
+First char = 'l'
+Need char = 'k'
+    this is a line\nbreak
+ 0: line\x0abreak
+    ** Failers 
+No match
+    line one\nthis is a line\nbreak in the second line 
+No match
+
+/ab.cd/P
+    ab-cd
+ 0: ab-cd
+    ab=cd 
+ 0: ab=cd
+    ** Failers
+No match: POSIX code 17: match failed
+    ab\ncd
+No match: POSIX code 17: match failed
+
+/ab.cd/Ps
+    ab-cd
+ 0: ab-cd
+    ab=cd 
+ 0: ab=cd
+    ab\ncd
+ 0: ab\x0acd
+
+/(?i)(?-i)AbCd/
+Capturing subpattern count = 0
+No options
+First char = 'A'
+Need char = 'd'
+    AbCd
+ 0: AbCd
+    ** Failers
+No match
+    abcd  
+No match
+    
+/a{11111111111111111111}/
+Failed: number too big in {} quantifier at offset 22
+
+/(){64294967295}/
+Failed: number too big in {} quantifier at offset 14
+
+/(){2,4294967295}/
+Failed: number too big in {} quantifier at offset 15
+
+"(?i:a)(?i:b)(?i:c)(?i:d)(?i:e)(?i:f)(?i:g)(?i:h)(?i:i)(?i:j)(k)(?i:l)A\1B"
+Capturing subpattern count = 1
+Max back reference = 1
+No options
+Case state changes
+First char = 'a' (caseless)
+Need char = 'B'
+    abcdefghijklAkB
+ 0: abcdefghijklAkB
+ 1: k
+
+"(?P<n0>a)(?P<n1>b)(?P<n2>c)(?P<n3>d)(?P<n4>e)(?P<n5>f)(?P<n6>g)(?P<n7>h)(?P<n8>i)(?P<n9>j)(?P<n10>k)(?P<n11>l)A\11B"
+Capturing subpattern count = 12
+Max back reference = 11
+Named capturing subpatterns:
+  n0    1
+  n1    2
+  n10  11
+  n11  12
+  n2    3
+  n3    4
+  n4    5
+  n5    6
+  n6    7
+  n7    8
+  n8    9
+  n9   10
+No options
+First char = 'a'
+Need char = 'B'
+    abcdefghijklAkB
+ 0: abcdefghijklAkB
+ 1: a
+ 2: b
+ 3: c
+ 4: d
+ 5: e
+ 6: f
+ 7: g
+ 8: h
+ 9: i
+10: j
+11: k
+12: l
+
+"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)A\11B"
+Capturing subpattern count = 12
+Max back reference = 11
+No options
+First char = 'a'
+Need char = 'B'
+    abcdefghijklAkB
+ 0: abcdefghijklAkB
+ 1: a
+ 2: b
+ 3: c
+ 4: d
+ 5: e
+ 6: f
+ 7: g
+ 8: h
+ 9: i
+10: j
+11: k
+12: l
+
+"(?P<name0>a)(?P<name1>a)(?P<name2>a)(?P<name3>a)(?P<name4>a)(?P<name5>a)(?P<name6>a)(?P<name7>a)(?P<name8>a)(?P<name9>a)(?P<name10>a)(?P<name11>a)(?P<name12>a)(?P<name13>a)(?P<name14>a)(?P<name15>a)(?P<name16>a)(?P<name17>a)(?P<name18>a)(?P<name19>a)(?P<name20>a)(?P<name21>a)(?P<name22>a)(?P<name23>a)(?P<name24>a)(?P<name25>a)(?P<name26>a)(?P<name27>a)(?P<name28>a)(?P<name29>a)(?P<name30>a)(?P<name31>a)(?P<name32>a)(?P<name33>a)(?P<name34>a)(?P<name35>a)(?P<name36>a)(?P<name37>a)(?P<name38>a)(?P<name39>a)(?P<name40>a)(?P<name41>a)(?P<name42>a)(?P<name43>a)(?P<name44>a)(?P<name45>a)(?P<name46>a)(?P<name47>a)(?P<name48>a)(?P<name49>a)(?P<name50>a)(?P<name51>a)(?P<name52>a)(?P<name53>a)(?P<name54>a)(?P<name55>a)(?P<name56>a)(?P<name57>a)(?P<name58>a)(?P<name59>a)(?P<name60>a)(?P<name61>a)(?P<name62>a)(?P<name63>a)(?P<name64>a)(?P<name65>a)(?P<name66>a)(?P<name67>a)(?P<name68>a)(?P<name69>a)(?P<name70>a)(?P<name71>a)(?P<name72>a)(?P<name73>a)(?P<name74>a)(?P<name75>a)(?P<name76>a)(?P<name77>a)(?P<name78>a)(?P<name79>a)(?P<name80>a)(?P<name81>a)(?P<name82>a)(?P<name83>a)(?P<name84>a)(?P<name85>a)(?P<name86>a)(?P<name87>a)(?P<name88>a)(?P<name89>a)(?P<name90>a)(?P<name91>a)(?P<name92>a)(?P<name93>a)(?P<name94>a)(?P<name95>a)(?P<name96>a)(?P<name97>a)(?P<name98>a)(?P<name99>a)(?P<name100>a)"
+Capturing subpattern count = 101
+Named capturing subpatterns:
+  name0     1
+  name1     2
+  name10   11
+  name100 101
+  name11   12
+  name12   13
+  name13   14
+  name14   15
+  name15   16
+  name16   17
+  name17   18
+  name18   19
+  name19   20
+  name2     3
+  name20   21
+  name21   22
+  name22   23
+  name23   24
+  name24   25
+  name25   26
+  name26   27
+  name27   28
+  name28   29
+  name29   30
+  name3     4
+  name30   31
+  name31   32
+  name32   33
+  name33   34
+  name34   35
+  name35   36
+  name36   37
+  name37   38
+  name38   39
+  name39   40
+  name4     5
+  name40   41
+  name41   42
+  name42   43
+  name43   44
+  name44   45
+  name45   46
+  name46   47
+  name47   48
+  name48   49
+  name49   50
+  name5     6
+  name50   51
+  name51   52
+  name52   53
+  name53   54
+  name54   55
+  name55   56
+  name56   57
+  name57   58
+  name58   59
+  name59   60
+  name6     7
+  name60   61
+  name61   62
+  name62   63
+  name63   64
+  name64   65
+  name65   66
+  name66   67
+  name67   68
+  name68   69
+  name69   70
+  name7     8
+  name70   71
+  name71   72
+  name72   73
+  name73   74
+  name74   75
+  name75   76
+  name76   77
+  name77   78
+  name78   79
+  name79   80
+  name8     9
+  name80   81
+  name81   82
+  name82   83
+  name83   84
+  name84   85
+  name85   86
+  name86   87
+  name87   88
+  name88   89
+  name89   90
+  name9    10
+  name90   91
+  name91   92
+  name92   93
+  name93   94
+  name94   95
+  name95   96
+  name96   97
+  name97   98
+  name98   99
+  name99  100
+No options
+First char = 'a'
+Need char = 'a'
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but too many substrings
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 1: a
+ 2: a
+ 3: a
+ 4: a
+ 5: a
+ 6: a
+ 7: a
+ 8: a
+ 9: a
+10: a
+11: a
+12: a
+13: a
+14: a
+
+"(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)"
+Capturing subpattern count = 101
+No options
+First char = 'a'
+Need char = 'a'
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but too many substrings
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 1: a
+ 2: a
+ 3: a
+ 4: a
+ 5: a
+ 6: a
+ 7: a
+ 8: a
+ 9: a
+10: a
+11: a
+12: a
+13: a
+14: a
+
+/ End of testinput2 /
+Capturing subpattern count = 0
+No options
+First char = ' '
+Need char = ' '
diff -Nurp tin-1.6.2/pcre/testdata/testoutput3 tin-1.8.0/pcre/testdata/testoutput3
--- tin-1.6.2/pcre/testdata/testoutput3	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/testdata/testoutput3	2005-09-12 16:42:33.000000000 +0200
@@ -1,4 +1,4 @@
-PCRE version 4.3 21-May-2003
+PCRE version 6.4 05-Sep-2005
 
 /^[\w]+/
     *** Failers
@@ -6,7 +6,7 @@ No match
     École
 No match
 
-/^[\w]+/Lfr
+/^[\w]+/Lfr_FR
     École
  0: École
 
@@ -20,7 +20,7 @@ No match
     École
  0: \xc9
 
-/^[\W]+/Lfr
+/^[\W]+/Lfr_FR
     *** Failers
  0: *** 
     École
@@ -34,7 +34,7 @@ No match
     a
 No match
 
-/[\b]/Lfr
+/[\b]/Lfr_FR
     \b
  0: \x08
     *** Failers
@@ -48,7 +48,7 @@ No match
     École
 No match
 
-/^\w+/Lfr
+/^\w+/Lfr_FR
     École
  0: École
 
@@ -58,7 +58,7 @@ No match
  1: \xc9
  2: cole
 
-/(.+)\b(.+)/Lfr
+/(.+)\b(.+)/Lfr_FR
     *** Failers
  0: *** Failers
  1: *** 
@@ -74,7 +74,7 @@ No match
     école
 No match
 
-/École/iLfr
+/École/iLfr_FR
     École
  0: École
     école
@@ -85,28 +85,26 @@ Capturing subpattern count = 0
 No options
 No first char
 No need char
-Study size = 40
-Starting character set: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P 
+Starting byte set: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P 
   Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z 
 
-/\w/ISLfr
+/\w/ISLfr_FR
 Capturing subpattern count = 0
 No options
 No first char
 No need char
-Study size = 40
-Starting character set: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P 
+Starting byte set: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P 
   Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z 
-  À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å 
-  æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ 
+  µ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â ã ä 
+  å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ 
 
-/^[\xc8-\xc9]/iLfr
+/^[\xc8-\xc9]/iLfr_FR
     École
  0: É
     école
  0: é
 
-/^[\xc8-\xc9]/Lfr
+/^[\xc8-\xc9]/Lfr_FR
     École
  0: É
     *** Failers 
@@ -115,4 +113,3 @@ No match
 No match
 
 / End of testinput3 /
-
diff -Nurp tin-1.6.2/pcre/testdata/testoutput4 tin-1.8.0/pcre/testdata/testoutput4
--- tin-1.6.2/pcre/testdata/testoutput4	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/testdata/testoutput4	2005-09-12 16:42:33.000000000 +0200
@@ -1,4 +1,4 @@
-PCRE version 4.3 21-May-2003
+PCRE version 6.4 05-Sep-2005
 
 /-- Do not use the \x{} construct except with patterns that have the --/
 /-- /8 option set, because PCRE doesn't recognize them as UTF-8 unless --/
@@ -409,12 +409,6 @@ No match
     > >\x{100} Y
  0: >\x{100}
   
-/\W/8
-    A.B
- 0: .
-    A\x{100}B 
- 0: \x{100}
-  
 /\d/8
     \x{100}3
  0: 3
@@ -423,10 +417,6 @@ No match
     \x{100} X
  0:  
     
-/\w/8
-    \x{100}X   
- 0: X
-
 /\D+/8
     12abcd34
  0: abcd
@@ -831,7 +821,7 @@ No match
  0: \x{100}
     *** Failers
 No match
-    \x{101}
+    \x{102}
 No match
     y    
 No match
@@ -874,5 +864,40 @@ No match
   xb 
 No match
 
-/ End of testinput4 /
+/(|a)/g8
+    catac
+ 0: 
+ 1: 
+ 0: 
+ 1: 
+ 0: a
+ 1: a
+ 0: 
+ 1: 
+ 0: 
+ 1: 
+ 0: a
+ 1: a
+ 0: 
+ 1: 
+ 0: 
+ 1: 
+    a\x{256}a 
+ 0: 
+ 1: 
+ 0: a
+ 1: a
+ 0: 
+ 1: 
+ 0: 
+ 1: 
+ 0: a
+ 1: a
+ 0: 
+ 1: 
+
+/^\x{85}$/8i
+    \x{85}
+ 0: \x{85}
 
+/ End of testinput4 /
diff -Nurp tin-1.6.2/pcre/testdata/testoutput5 tin-1.8.0/pcre/testdata/testoutput5
--- tin-1.6.2/pcre/testdata/testoutput5	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/testdata/testoutput5	2005-09-12 16:42:33.000000000 +0200
@@ -1,12 +1,12 @@
-PCRE version 4.3 21-May-2003
+PCRE version 6.4 05-Sep-2005
 
 /\x{100}/8DM
-Memory allocation (code space): 11
+Memory allocation (code space): 10
 ------------------------------------------------------------------
-  0   7 Bra 0
-  3   2 \x{100}
-  7   7 Ket
- 10     End
+  0   6 Bra 0
+  3     \x{100}
+  6   6 Ket
+  9     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -14,12 +14,12 @@ First char = 196
 Need char = 128
 
 /\x{1000}/8DM
-Memory allocation (code space): 12
+Memory allocation (code space): 11
 ------------------------------------------------------------------
-  0   8 Bra 0
-  3   3 \x{1000}
-  8   8 Ket
- 11     End
+  0   7 Bra 0
+  3     \x{1000}
+  7   7 Ket
+ 10     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -27,12 +27,12 @@ First char = 225
 Need char = 128
 
 /\x{10000}/8DM
-Memory allocation (code space): 13
+Memory allocation (code space): 12
 ------------------------------------------------------------------
-  0   9 Bra 0
-  3   4 \x{10000}
-  9   9 Ket
- 12     End
+  0   8 Bra 0
+  3     \x{10000}
+  8   8 Ket
+ 11     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -40,12 +40,12 @@ First char = 240
 Need char = 128
 
 /\x{100000}/8DM
-Memory allocation (code space): 13
+Memory allocation (code space): 12
 ------------------------------------------------------------------
-  0   9 Bra 0
-  3   4 \x{100000}
-  9   9 Ket
- 12     End
+  0   8 Bra 0
+  3     \x{100000}
+  8   8 Ket
+ 11     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -53,12 +53,12 @@ First char = 244
 Need char = 128
 
 /\x{1000000}/8DM
-Memory allocation (code space): 14
+Memory allocation (code space): 13
 ------------------------------------------------------------------
-  0  10 Bra 0
-  3   5 \x{1000000}
- 10  10 Ket
- 13     End
+  0   9 Bra 0
+  3     \x{1000000}
+  9   9 Ket
+ 12     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -66,12 +66,12 @@ First char = 249
 Need char = 128
 
 /\x{4000000}/8DM
-Memory allocation (code space): 15
+Memory allocation (code space): 14
 ------------------------------------------------------------------
-  0  11 Bra 0
-  3   6 \x{4000000}
- 11  11 Ket
- 14     End
+  0  10 Bra 0
+  3     \x{4000000}
+ 10  10 Ket
+ 13     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -79,12 +79,12 @@ First char = 252
 Need char = 128
 
 /\x{7fffFFFF}/8DM
-Memory allocation (code space): 15
+Memory allocation (code space): 14
 ------------------------------------------------------------------
-  0  11 Bra 0
-  3   6 \x{7fffffff}
- 11  11 Ket
- 14     End
+  0  10 Bra 0
+  3     \x{7fffffff}
+ 10  10 Ket
+ 13     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -92,17 +92,17 @@ First char = 253
 Need char = 191
 
 /[\x{ff}]/8DM
-Memory allocation (code space): 40
+Memory allocation (code space): 10
 ------------------------------------------------------------------
-  0  36 Bra 0
-  3     [\xff]
- 36  36 Ket
- 39     End
+  0   6 Bra 0
+  3     \x{ff}
+  6   6 Ket
+  9     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
-No first char
-No need char
+First char = 195
+Need char = 191
 
 /[\x{100}]/8DM
 Memory allocation (code space): 47
@@ -129,10 +129,10 @@ Failed: character value in \x{...} seque
 
 /\x80/8D
 ------------------------------------------------------------------
-  0   7 Bra 0
-  3   2 \x{80}
-  7   7 Ket
- 10     End
+  0   6 Bra 0
+  3     \x{80}
+  6   6 Ket
+  9     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -141,10 +141,10 @@ Need char = 128
 
 /\xff/8D
 ------------------------------------------------------------------
-  0   7 Bra 0
-  3   2 \x{ff}
-  7   7 Ket
- 10     End
+  0   6 Bra 0
+  3     \x{ff}
+  6   6 Ket
+  9     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -153,10 +153,10 @@ Need char = 191
 
 /\x{0041}\x{2262}\x{0391}\x{002e}/D8
 ------------------------------------------------------------------
-  0  12 Bra 0
-  3   7 A\x{2262}\x{391}.
- 12  12 Ket
- 15     End
+  0  14 Bra 0
+  3     A\x{2262}\x{391}.
+ 14  14 Ket
+ 17     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -167,10 +167,10 @@ Need char = '.'
     
 /\x{D55c}\x{ad6d}\x{C5B4}/D8 
 ------------------------------------------------------------------
-  0  14 Bra 0
-  3   9 \x{d55c}\x{ad6d}\x{c5b4}
- 14  14 Ket
- 17     End
+  0  15 Bra 0
+  3     \x{d55c}\x{ad6d}\x{c5b4}
+ 15  15 Ket
+ 18     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -181,10 +181,10 @@ Need char = 180
 
 /\x{65e5}\x{672c}\x{8a9e}/D8
 ------------------------------------------------------------------
-  0  14 Bra 0
-  3   9 \x{65e5}\x{672c}\x{8a9e}
- 14  14 Ket
- 17     End
+  0  15 Bra 0
+  3     \x{65e5}\x{672c}\x{8a9e}
+ 15  15 Ket
+ 18     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -195,10 +195,10 @@ Need char = 158
 
 /\x{80}/D8
 ------------------------------------------------------------------
-  0   7 Bra 0
-  3   2 \x{80}
-  7   7 Ket
- 10     End
+  0   6 Bra 0
+  3     \x{80}
+  6   6 Ket
+  9     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -207,10 +207,10 @@ Need char = 128
 
 /\x{084}/D8
 ------------------------------------------------------------------
-  0   7 Bra 0
-  3   2 \x{84}
-  7   7 Ket
- 10     End
+  0   6 Bra 0
+  3     \x{84}
+  6   6 Ket
+  9     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -219,10 +219,10 @@ Need char = 132
 
 /\x{104}/D8
 ------------------------------------------------------------------
-  0   7 Bra 0
-  3   2 \x{104}
-  7   7 Ket
- 10     End
+  0   6 Bra 0
+  3     \x{104}
+  6   6 Ket
+  9     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -231,10 +231,10 @@ Need char = 132
 
 /\x{861}/D8
 ------------------------------------------------------------------
-  0   8 Bra 0
-  3   3 \x{861}
-  8   8 Ket
- 11     End
+  0   7 Bra 0
+  3     \x{861}
+  7   7 Ket
+ 10     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -243,10 +243,10 @@ Need char = 161
 
 /\x{212ab}/D8
 ------------------------------------------------------------------
-  0   9 Bra 0
-  3   4 \x{212ab}
-  9   9 Ket
- 12     End
+  0   8 Bra 0
+  3     \x{212ab}
+  8   8 Ket
+ 11     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -255,14 +255,15 @@ Need char = 171
 
 /.{3,5}X/D8
 ------------------------------------------------------------------
-  0  14 Bra 0
+  0  13 Bra 0
   3     Any{3}
   7     Any{0,2}
- 11   1 X
- 14  14 Ket
- 17     End
+ 11     X
+ 13  13 Ket
+ 16     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: utf8
 No first char
 Need char = 'X'
@@ -279,6 +280,7 @@ Need char = 'X'
  14     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: utf8
 No first char
 No need char
@@ -349,7 +351,7 @@ No match
 ------------------------------------------------------------------
   0  37 Bra 0
   3     ^
-  4     [a-b]
+  4     [ab]
  37  37 Ket
  40     End
 ------------------------------------------------------------------
@@ -402,21 +404,16 @@ Capturing subpattern count = 0
 Options: utf8
 No first char
 No need char
-Study size = 40
-Starting character set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a 
+Starting byte set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a 
   \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 
   \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 
   5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y 
   Z [ \ ] ^ _ ` c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f 
-  \x80 \x81 \x82 \x83 \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e 
-  \x8f \x90 \x91 \x92 \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d 
-  \x9e \x9f \xa0 \xa1 \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac 
-  \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb 
-  \xbc \xbd \xbe \xbf \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca 
-  \xcb \xcc \xcd \xce \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 
-  \xda \xdb \xdc \xdd \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 
-  \xe9 \xea \xeb \xec \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 
-  \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe \xff 
+  \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 
+  \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf 
+  \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee 
+  \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd 
+  \xfe \xff 
     \x{f1}
  0: \x{f1}
     \x{bf}
@@ -441,6 +438,7 @@ No match
  16     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: utf8
 First char = 196
 Need char = 128
@@ -450,79 +448,79 @@ Study returned NULL
 
 /(\x{100}+|x)/8SD
 ------------------------------------------------------------------
-  0  18 Bra 0
+  0  17 Bra 0
   3   6 Bra 1
   6     \x{100}+
-  9   6 Alt
- 12   1 x
- 15  12 Ket
- 18  18 Ket
- 21     End
+  9   5 Alt
+ 12     x
+ 14  11 Ket
+ 17  17 Ket
+ 20     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
+Partial matching not supported
 Options: utf8
 No first char
 No need char
-Study size = 40
-Starting character set: x \xc4 
+Starting byte set: x \xc4 
 
 /(\x{100}*a|x)/8SD
 ------------------------------------------------------------------
-  0  21 Bra 0
-  3   9 Bra 1
+  0  19 Bra 0
+  3   8 Bra 1
   6     \x{100}*
-  9   1 a
- 12   6 Alt
- 15   1 x
- 18  15 Ket
- 21  21 Ket
- 24     End
+  9     a
+ 11   5 Alt
+ 14     x
+ 16  13 Ket
+ 19  19 Ket
+ 22     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
+Partial matching not supported
 Options: utf8
 No first char
 No need char
-Study size = 40
-Starting character set: a x \xc4 
+Starting byte set: a x \xc4 
 
 /(\x{100}{0,2}a|x)/8SD
 ------------------------------------------------------------------
-  0  23 Bra 0
-  3  11 Bra 1
+  0  21 Bra 0
+  3  10 Bra 1
   6     \x{100}{,2}
- 11   1 a
- 14   6 Alt
- 17   1 x
- 20  17 Ket
- 23  23 Ket
- 26     End
+ 11     a
+ 13   5 Alt
+ 16     x
+ 18  15 Ket
+ 21  21 Ket
+ 24     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
+Partial matching not supported
 Options: utf8
 No first char
 No need char
-Study size = 40
-Starting character set: a x \xc4 
+Starting byte set: a x \xc4 
 
 /(\x{100}{1,2}a|x)/8SD
 ------------------------------------------------------------------
-  0  27 Bra 0
-  3  15 Bra 1
-  6   2 \x{100}
- 10     \x{100}{,1}
- 15   1 a
- 18   6 Alt
- 21   1 x
- 24  21 Ket
- 27  27 Ket
- 30     End
+  0  24 Bra 0
+  3  13 Bra 1
+  6     \x{100}
+  9     \x{100}{,1}
+ 14     a
+ 16   5 Alt
+ 19     x
+ 21  18 Ket
+ 24  24 Ket
+ 27     End
 ------------------------------------------------------------------
 Capturing subpattern count = 1
+Partial matching not supported
 Options: utf8
 No first char
 No need char
-Study size = 40
-Starting character set: x \xc4 
+Starting byte set: x \xc4 
 
 /\x{100}*(\d+|"(?1)")/8
     1234
@@ -550,10 +548,10 @@ No match
 
 /\x{100}/8D
 ------------------------------------------------------------------
-  0   7 Bra 0
-  3   2 \x{100}
-  7   7 Ket
- 10     End
+  0   6 Bra 0
+  3     \x{100}
+  6   6 Ket
+  9     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
@@ -568,19 +566,21 @@ Need char = 128
   9     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: utf8
 No first char
 No need char
 
 /a\x{100}*/8D
 ------------------------------------------------------------------
-  0   9 Bra 0
-  3   1 a
-  6     \x{100}*
-  9   9 Ket
- 12     End
+  0   8 Bra 0
+  3     a
+  5     \x{100}*
+  8   8 Ket
+ 11     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: utf8
 First char = 'a'
 No need char
@@ -588,12 +588,13 @@ No need char
 /ab\x{100}*/8D
 ------------------------------------------------------------------
   0  10 Bra 0
-  3   2 ab
+  3     ab
   7     \x{100}*
  10  10 Ket
  13     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: utf8
 First char = 'a'
 Need char = 'b'
@@ -601,12 +602,13 @@ Need char = 'b'
 /a\x{100}\x{101}*/8D
 ------------------------------------------------------------------
   0  11 Bra 0
-  3   3 a\x{100}
+  3     a\x{100}
   8     \x{101}*
  11  11 Ket
  14     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: utf8
 First char = 'a'
 Need char = 128
@@ -614,25 +616,27 @@ Need char = 128
 /a\x{100}\x{101}+/8D
 ------------------------------------------------------------------
   0  11 Bra 0
-  3   3 a\x{100}
+  3     a\x{100}
   8     \x{101}+
  11  11 Ket
  14     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: utf8
 First char = 'a'
 Need char = 129
 
 /\x{100}*A/8D
 ------------------------------------------------------------------
-  0   9 Bra 0
+  0   8 Bra 0
   3     \x{100}*
-  6   1 A
-  9   9 Ket
- 12     End
+  6     A
+  8   8 Ket
+ 11     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: utf8
 No first char
 Need char = 'A'
@@ -649,6 +653,7 @@ Need char = 'A'
  13     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
+Partial matching not supported
 Options: utf8
 No first char
 No need char
@@ -746,18 +751,6 @@ Options: utf8
 No first char
 No need char
 
-/[z-\x{100}]/8Di
-------------------------------------------------------------------
-  0  45 Bra 0
-  3     [Zz-\xff\x{100}-\x{100}]
- 45  45 Ket
- 48     End
-------------------------------------------------------------------
-Capturing subpattern count = 0
-Options: caseless utf8
-No first char
-No need char
-
 /[z\Qa-d]Ä€\E]/8D
 ------------------------------------------------------------------
   0  43 Bra 0
@@ -776,10 +769,10 @@ No need char
 
 /[\xFF]/D
 ------------------------------------------------------------------
-  0   6 Bra 0
-  3   1 \xff
-  6   6 Ket
-  9     End
+  0   5 Bra 0
+  3     \xff
+  5   5 Ket
+  8     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 No options
@@ -790,15 +783,15 @@ No need char
 
 /[\xff]/D8
 ------------------------------------------------------------------
-  0  36 Bra 0
-  3     [\xff]
- 36  36 Ket
- 39     End
+  0   6 Bra 0
+  3     \x{ff}
+  6   6 Ket
+  9     End
 ------------------------------------------------------------------
 Capturing subpattern count = 0
 Options: utf8
-No first char
-No need char
+First char = 195
+Need char = 191
     >\x{ff}<
  0: \x{ff}
 
@@ -826,5 +819,257 @@ Options: utf8
 No first char
 No need char
 
-/ End of testinput5 /
+/[Ã„-Ãœ]/8
+    Ã– # Matches without Study
+ 0: \x{d6}
+    \x{d6}
+ 0: \x{d6}
+    
+/[Ã„-Ãœ]/8S
+    Ã– <-- Same with Study
+ 0: \x{d6}
+    \x{d6}
+ 0: \x{d6}
+    
+/[\x{c4}-\x{dc}]/8 
+    Ã– # Matches without Study
+ 0: \x{d6}
+    \x{d6} 
+ 0: \x{d6}
+
+/[\x{c4}-\x{dc}]/8S
+    Ã– <-- Same with Study
+ 0: \x{d6}
+    \x{d6} 
+ 0: \x{d6}
+
+/[Ã]/8
+Failed: invalid UTF-8 string at offset 2
+
+/Ã/8
+Failed: invalid UTF-8 string at offset 0
+
+/ÃÃÃxxx/8
+Failed: invalid UTF-8 string at offset 1
+
+/ÃÃÃxxx/8?D
+------------------------------------------------------------------
+  0  15 Bra 0
+  3     \X{c0}\X{c0}\X{c0}xxx
+ 15  15 Ket
+ 18     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8 no_utf8_check
+First char = 195
+Need char = 'x'
+
+/abc/8
+    Ã]
+Error -10
+    Ã
+Error -10
+    ÃÃÃ
+Error -10
+    ÃÃÃ\?
+No match
+
+/anything/8
+    \xc0\x80
+Error -10
+    \xc1\x8f 
+Error -10
+    \xe0\x9f\x80
+Error -10
+    \xf0\x8f\x80\x80 
+Error -10
+    \xf8\x87\x80\x80\x80  
+Error -10
+    \xfc\x83\x80\x80\x80\x80
+Error -10
+    \xfe\x80\x80\x80\x80\x80  
+Error -10
+    \xff\x80\x80\x80\x80\x80  
+Error -10
+    \xc3\x8f
+No match
+    \xe0\xaf\x80
+No match
+    \xe1\x80\x80
+No match
+    \xf0\x9f\x80\x80 
+No match
+    \xf1\x8f\x80\x80 
+No match
+    \xf8\x88\x80\x80\x80  
+No match
+    \xf9\x87\x80\x80\x80  
+No match
+    \xfc\x84\x80\x80\x80\x80
+No match
+    \xfd\x83\x80\x80\x80\x80
+No match
+
+/\x{100}abc(xyz(?1))/8D
+------------------------------------------------------------------
+  0  27 Bra 0
+  3     \x{100}abc
+ 12  12 Bra 1
+ 15     xyz
+ 21  12 Recurse
+ 24  12 Ket
+ 27  27 Ket
+ 30     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf8
+First char = 196
+Need char = 'z'
+
+/[^\x{100}]abc(xyz(?1))/8D
+------------------------------------------------------------------
+  0  32 Bra 0
+  3     [^\x{100}]
+ 11     abc
+ 17  12 Bra 1
+ 20     xyz
+ 26  17 Recurse
+ 29  12 Ket
+ 32  32 Ket
+ 35     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf8
+No first char
+Need char = 'z'
+
+/[ab\x{100}]abc(xyz(?1))/8D
+------------------------------------------------------------------
+  0  64 Bra 0
+  3     [ab\x{100}]
+ 43     abc
+ 49  12 Bra 1
+ 52     xyz
+ 58  49 Recurse
+ 61  12 Ket
+ 64  64 Ket
+ 67     End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf8
+No first char
+Need char = 'z'
 
+/(\x{100}(b(?2)c))?/D8
+------------------------------------------------------------------
+  0  26 Bra 0
+  3     Brazero
+  4  19 Bra 1
+  7     \x{100}
+ 10  10 Bra 2
+ 13     b
+ 15  10 Recurse
+ 18     c
+ 20  10 Ket
+ 23  19 Ket
+ 26  26 Ket
+ 29     End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+Options: utf8
+No first char
+No need char
+
+/(\x{100}(b(?2)c)){0,2}/D8
+------------------------------------------------------------------
+  0  55 Bra 0
+  3     Brazero
+  4  48 Bra 0
+  7  19 Bra 1
+ 10     \x{100}
+ 13  10 Bra 2
+ 16     b
+ 18  13 Recurse
+ 21     c
+ 23  10 Ket
+ 26  19 Ket
+ 29     Brazero
+ 30  19 Bra 1
+ 33     \x{100}
+ 36  10 Bra 2
+ 39     b
+ 41  13 Recurse
+ 44     c
+ 46  10 Ket
+ 49  19 Ket
+ 52  48 Ket
+ 55  55 Ket
+ 58     End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+Options: utf8
+No first char
+No need char
+
+/(\x{100}(b(?1)c))?/D8
+------------------------------------------------------------------
+  0  26 Bra 0
+  3     Brazero
+  4  19 Bra 1
+  7     \x{100}
+ 10  10 Bra 2
+ 13     b
+ 15   4 Recurse
+ 18     c
+ 20  10 Ket
+ 23  19 Ket
+ 26  26 Ket
+ 29     End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+Options: utf8
+No first char
+No need char
+
+/(\x{100}(b(?1)c)){0,2}/D8
+------------------------------------------------------------------
+  0  55 Bra 0
+  3     Brazero
+  4  48 Bra 0
+  7  19 Bra 1
+ 10     \x{100}
+ 13  10 Bra 2
+ 16     b
+ 18   7 Recurse
+ 21     c
+ 23  10 Ket
+ 26  19 Ket
+ 29     Brazero
+ 30  19 Bra 1
+ 33     \x{100}
+ 36  10 Bra 2
+ 39     b
+ 41   7 Recurse
+ 44     c
+ 46  10 Ket
+ 49  19 Ket
+ 52  48 Ket
+ 55  55 Ket
+ 58     End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+Options: utf8
+No first char
+No need char
+
+/\W/8
+    A.B
+ 0: .
+    A\x{100}B 
+ 0: \x{100}
+  
+/\w/8
+    \x{100}X   
+ 0: X
+
+/ End of testinput5 /
diff -Nurp tin-1.6.2/pcre/testdata/testoutput6 tin-1.8.0/pcre/testdata/testoutput6
--- tin-1.6.2/pcre/testdata/testoutput6	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/testdata/testoutput6	2005-09-12 16:42:33.000000000 +0200
@@ -0,0 +1,1013 @@
+PCRE version 6.4 05-Sep-2005
+
+/^\pC\pL\pM\pN\pP\pS\pZ</8
+    \x7f\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}<
+ 0: \x{7f}\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}<
+    \np\x{300}9!\$ < 
+ 0: \x{0a}p\x{300}9!$ <
+    ** Failers 
+No match
+    ap\x{300}9!\$ < 
+No match
+  
+/^\PC/8
+    X
+ 0: X
+    ** Failers 
+ 0: *
+    \x7f
+No match
+  
+/^\PL/8
+    9
+ 0: 9
+    ** Failers 
+ 0: *
+    \x{c0}
+No match
+  
+/^\PM/8
+    X
+ 0: X
+    ** Failers 
+ 0: *
+    \x{30f}
+No match
+  
+/^\PN/8
+    X
+ 0: X
+    ** Failers 
+ 0: *
+    \x{660}
+No match
+  
+/^\PP/8
+    X
+ 0: X
+    ** Failers 
+No match
+    \x{66c}
+No match
+  
+/^\PS/8
+    X
+ 0: X
+    ** Failers 
+ 0: *
+    \x{f01}
+No match
+  
+/^\PZ/8
+    X
+ 0: X
+    ** Failers 
+ 0: *
+    \x{1680}
+No match
+    
+/^\p{Cc}/8
+    \x{017}
+ 0: \x{17}
+    \x{09f} 
+ 0: \x{9f}
+    ** Failers
+No match
+    \x{0600} 
+No match
+  
+/^\p{Cf}/8
+    \x{601}
+ 0: \x{601}
+    ** Failers
+No match
+    \x{09f} 
+No match
+  
+/^\p{Cn}/8
+    ** Failers
+No match
+    \x{09f} 
+No match
+  
+/^\p{Co}/8
+    \x{f8ff}
+ 0: \x{f8ff}
+    ** Failers
+No match
+    \x{09f} 
+No match
+  
+/^\p{Cs}/8
+    \x{dfff}
+ 0: \x{dfff}
+    ** Failers
+No match
+    \x{09f} 
+No match
+  
+/^\p{Ll}/8
+    a
+ 0: a
+    ** Failers 
+No match
+    Z
+No match
+    \x{dfff}  
+No match
+  
+/^\p{Lm}/8
+    \x{2b0}
+ 0: \x{2b0}
+    ** Failers
+No match
+    a 
+No match
+  
+/^\p{Lo}/8
+    \x{1bb}
+ 0: \x{1bb}
+    ** Failers
+No match
+    a 
+No match
+    \x{2b0}
+No match
+  
+/^\p{Lt}/8
+    \x{1c5}
+ 0: \x{1c5}
+    ** Failers
+No match
+    a 
+No match
+    \x{2b0}
+No match
+  
+/^\p{Lu}/8
+    A
+ 0: A
+    ** Failers
+No match
+    \x{2b0}
+No match
+  
+/^\p{Mc}/8
+    \x{903}
+ 0: \x{903}
+    ** Failers
+No match
+    X
+No match
+    \x{300}
+No match
+       
+/^\p{Me}/8
+    \x{488}
+ 0: \x{488}
+    ** Failers
+No match
+    X
+No match
+    \x{903}
+No match
+    \x{300}
+No match
+  
+/^\p{Mn}/8
+    \x{300}
+ 0: \x{300}
+    ** Failers
+No match
+    X
+No match
+    \x{903}
+No match
+  
+/^\p{Nd}+/8
+    0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669}\x{66a}
+ 0: 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669}
+    \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}\x{6f7}\x{6f8}\x{6f9}\x{6fa}
+ 0: \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}\x{6f7}\x{6f8}\x{6f9}
+    \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}\x{96d}\x{96e}\x{96f}\x{970}
+ 0: \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}\x{96d}\x{96e}\x{96f}
+    ** Failers
+No match
+    X
+No match
+  
+/^\p{Nl}/8
+    \x{16ee}
+ 0: \x{16ee}
+    ** Failers
+No match
+    X
+No match
+    \x{966}
+No match
+  
+/^\p{No}/8
+    \x{b2}
+ 0: \x{b2}
+    \x{b3}
+ 0: \x{b3}
+    ** Failers
+No match
+    X
+No match
+    \x{16ee}
+No match
+  
+/^\p{Pc}/8
+    \x5f
+ 0: _
+    \x{203f}
+ 0: \x{203f}
+    ** Failers
+No match
+    X
+No match
+    -
+No match
+    \x{58a}
+No match
+  
+/^\p{Pd}/8
+    -
+ 0: -
+    \x{58a}
+ 0: \x{58a}
+    ** Failers
+No match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Pe}/8
+    )
+ 0: )
+    ]
+ 0: ]
+    }
+ 0: }
+    \x{f3b}
+ 0: \x{f3b}
+    ** Failers
+No match
+    X
+No match
+    \x{203f}
+No match
+    (
+No match
+    [
+No match
+    {
+No match
+    \x{f3c}
+No match
+  
+/^\p{Pf}/8
+    \x{bb}
+ 0: \x{bb}
+    \x{2019}
+ 0: \x{2019}
+    ** Failers
+No match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Pi}/8
+    \x{ab}
+ 0: \x{ab}
+    \x{2018}
+ 0: \x{2018}
+    ** Failers
+No match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Po}/8
+    !
+ 0: !
+    \x{37e}
+ 0: \x{37e}
+    ** Failers
+ 0: *
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Ps}/8
+    (
+ 0: (
+    [
+ 0: [
+    {
+ 0: {
+    \x{f3c}
+ 0: \x{f3c}
+    ** Failers
+No match
+    X
+No match
+    )
+No match
+    ]
+No match
+    }
+No match
+    \x{f3b}
+No match
+  
+/^\p{Sc}+/8
+    $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6}
+ 0: $\x{a2}\x{a3}\x{a4}\x{a5}
+    \x{9f2}
+ 0: \x{9f2}
+    ** Failers
+No match
+    X
+No match
+    \x{2c2}
+No match
+  
+/^\p{Sk}/8
+    \x{2c2}
+ 0: \x{2c2}
+    ** Failers
+No match
+    X
+No match
+    \x{9f2}
+No match
+  
+/^\p{Sm}+/8
+    +<|~\x{ac}\x{2044}
+ 0: +<|~\x{ac}\x{2044}
+    ** Failers
+No match
+    X
+No match
+    \x{9f2}
+No match
+  
+/^\p{So}/8
+    \x{a6}
+ 0: \x{a6}
+    \x{482} 
+ 0: \x{482}
+    ** Failers
+No match
+    X
+No match
+    \x{9f2}
+No match
+  
+/^\p{Zl}/8
+    \x{2028}
+ 0: \x{2028}
+    ** Failers
+No match
+    X
+No match
+    \x{2029}
+No match
+  
+/^\p{Zp}/8
+    \x{2029}
+ 0: \x{2029}
+    ** Failers
+No match
+    X
+No match
+    \x{2028}
+No match
+  
+/^\p{Zs}/8
+    \ \
+ 0:  
+    \x{a0}
+ 0: \x{a0}
+    \x{1680}
+ 0: \x{1680}
+    \x{180e}
+ 0: \x{180e}
+    \x{2000}
+ 0: \x{2000}
+    \x{2001}     
+ 0: \x{2001}
+    ** Failers
+No match
+    \x{2028}
+No match
+    \x{200d} 
+No match
+  
+/\p{Nd}+(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+  
+/\p{Nd}+?(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}
+ 1: \x{661}\x{662}
+  
+/\p{Nd}{2,}(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+  
+/\p{Nd}{2,}?(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}A
+ 1: \x{662}A
+  
+/\p{Nd}*(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+  
+/\p{Nd}*?(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}
+ 1: \x{660}\x{661}
+  
+/\p{Nd}{2}(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}A
+ 1: \x{662}A
+  
+/\p{Nd}{2,3}(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+  
+/\p{Nd}{2,3}?(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}A
+ 1: \x{662}A
+  
+/\p{Nd}?(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}
+ 1: \x{661}\x{662}
+  
+/\p{Nd}??(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}
+ 1: \x{660}\x{661}
+  
+/\p{Nd}*+(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+  
+/\p{Nd}*+(...)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}ABC
+ 1: ABC
+  
+/\p{Nd}*+(....)/8
+      ** Failers
+ 0: ** F
+ 1: ** F
+      \x{660}\x{661}\x{662}ABC
+No match
+  
+/\p{Lu}/8i
+    A
+ 0: A
+    a\x{10a0}B 
+ 0: \x{10a0}
+    ** Failers 
+ 0: F
+    a
+No match
+    \x{1d00}  
+No match
+
+/\p{^Lu}/8i
+    1234
+ 0: 1
+    ** Failers
+ 0: *
+    ABC 
+No match
+
+/\P{Lu}/8i
+    1234
+ 0: 1
+    ** Failers
+ 0: *
+    ABC 
+No match
+
+/(?<=A\p{Nd})XYZ/8
+    A2XYZ
+ 0: XYZ
+    123A5XYZPQR
+ 0: XYZ
+    ABA\x{660}XYZpqr
+ 0: XYZ
+    ** Failers
+No match
+    AXYZ
+No match
+    XYZ     
+No match
+    
+/(?<!\pL)XYZ/8
+    1XYZ
+ 0: XYZ
+    AB=XYZ.. 
+ 0: XYZ
+    XYZ 
+ 0: XYZ
+    ** Failers
+No match
+    WXYZ 
+No match
+
+/[\p{L}]/D
+------------------------------------------------------------------
+  0  10 Bra 0
+  3     [\p{L}]
+ 10  10 Ket
+ 13     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[\p{^L}]/D
+------------------------------------------------------------------
+  0  10 Bra 0
+  3     [\P{L}]
+ 10  10 Ket
+ 13     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[\P{L}]/D
+------------------------------------------------------------------
+  0  10 Bra 0
+  3     [\P{L}]
+ 10  10 Ket
+ 13     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[\P{^L}]/D
+------------------------------------------------------------------
+  0  10 Bra 0
+  3     [\p{L}]
+ 10  10 Ket
+ 13     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[abc\p{L}\x{0660}]/8D
+------------------------------------------------------------------
+  0  45 Bra 0
+  3     [a-c\p{L}\x{660}]
+ 45  45 Ket
+ 48     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+No first char
+No need char
+
+/[\p{Nd}]/8DM
+Memory allocation (code space): 46
+------------------------------------------------------------------
+  0  10 Bra 0
+  3     [\p{Nd}]
+ 10  10 Ket
+ 13     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+No first char
+No need char
+    1234
+ 0: 1
+
+/[\p{Nd}+-]+/8DM
+Memory allocation (code space): 47
+------------------------------------------------------------------
+  0  43 Bra 0
+  3     [+\-\p{Nd}]+
+ 43  43 Ket
+ 46     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: utf8
+No first char
+No need char
+    1234
+ 0: 1234
+    12-34
+ 0: 12-34
+    12+\x{661}-34  
+ 0: 12+\x{661}-34
+    ** Failers
+No match
+    abcd  
+No match
+
+/[\P{Nd}]+/8
+    abcd
+ 0: abcd
+    ** Failers
+ 0: ** Failers
+    1234
+No match
+
+/\D+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+     
+/\P{Nd}+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\D]+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\P{Nd}]+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\D\P{Nd}]+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\pL/8
+    a
+ 0: a
+    A 
+ 0: A
+
+/\pL/8i
+    a
+ 0: a
+    A 
+ 0: A
+    
+/\p{Lu}/8 
+    A
+ 0: A
+    aZ
+ 0: Z
+    ** Failers
+ 0: F
+    abc   
+No match
+
+/\p{Lu}/8i
+    A
+ 0: A
+    aZ
+ 0: Z
+    ** Failers
+ 0: F
+    abc   
+No match
+
+/\p{Ll}/8 
+    a
+ 0: a
+    Az
+ 0: z
+    ** Failers
+ 0: a
+    ABC   
+No match
+
+/\p{Ll}/8i 
+    a
+ 0: a
+    Az
+ 0: z
+    ** Failers
+ 0: a
+    ABC   
+No match
+
+/^\x{c0}$/8i
+    \x{c0}
+ 0: \x{c0}
+    \x{e0} 
+ 0: \x{e0}
+
+/^\x{e0}$/8i
+    \x{c0}
+ 0: \x{c0}
+    \x{e0} 
+ 0: \x{e0}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8
+    A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 0: A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+    ** Failers
+No match
+    a\x{391}\x{10427}\x{ff3a}\x{1fb0}   
+No match
+    A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+No match
+    A\x{391}\x{1044F}\x{ff3a}\x{1fb0}
+No match
+    A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+No match
+    A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+No match
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8i
+    A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 0: A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+    a\x{391}\x{10427}\x{ff3a}\x{1fb0}   
+ 0: a\x{391}\x{10427}\x{ff3a}\x{1fb0}
+    A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+ 0: A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+    A\x{391}\x{1044F}\x{ff3a}\x{1fb0}
+ 0: A\x{391}\x{1044f}\x{ff3a}\x{1fb0}
+    A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+ 0: A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+    A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+ 0: A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iD
+------------------------------------------------------------------
+  0  21 Bra 0
+  3  NC A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 21  21 Ket
+ 24     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf8
+First char = 'A' (caseless)
+No need char
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8D
+------------------------------------------------------------------
+  0  21 Bra 0
+  3     A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 21  21 Ket
+ 24     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 'A'
+Need char = 176
+
+/AB\x{1fb0}/8D
+------------------------------------------------------------------
+  0  11 Bra 0
+  3     AB\x{1fb0}
+ 11  11 Ket
+ 14     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 'A'
+Need char = 176
+
+/AB\x{1fb0}/8Di
+------------------------------------------------------------------
+  0  11 Bra 0
+  3  NC AB\x{1fb0}
+ 11  11 Ket
+ 14     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf8
+First char = 'A' (caseless)
+Need char = 'B' (caseless)
+
+/\x{391}+/8i
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+ 0: \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+
+/\x{391}{3,5}(.)/8i
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+ 0: \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+ 1: X
+
+/\x{391}{3,5}?(.)/8i
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+ 0: \x{391}\x{3b1}\x{3b1}\x{3b1}
+ 1: \x{3b1}
+
+/[\x{391}\x{ff3a}]/8i
+    \x{391}
+ 0: \x{391}
+    \x{ff3a}
+ 0: \x{ff3a}
+    \x{3b1}
+ 0: \x{3b1}
+    \x{ff5a}   
+ 0: \x{ff5a}
+    
+/[\x{c0}\x{391}]/8i
+    \x{c0}
+ 0: \x{c0}
+    \x{e0} 
+ 0: \x{e0}
+
+/[\x{105}-\x{109}]/8iD
+------------------------------------------------------------------
+  0  13 Bra 0
+  3     [\x{104}-\x{109}]
+ 13  13 Ket
+ 16     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf8
+No first char
+No need char
+    \x{104}
+ 0: \x{104}
+    \x{105}
+ 0: \x{105}
+    \x{109}  
+ 0: \x{109}
+    ** Failers
+No match
+    \x{100}
+No match
+    \x{10a} 
+No match
+    
+/[z-\x{100}]/8iD 
+------------------------------------------------------------------
+  0  20 Bra 0
+  3     [Z\x{39c}\x{178}z-\x{101}]
+ 20  20 Ket
+ 23     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf8
+No first char
+No need char
+    Z
+ 0: Z
+    z
+ 0: z
+    \x{39c}
+ 0: \x{39c}
+    \x{178}
+ 0: \x{178}
+    |
+ 0: |
+    \x{80}
+ 0: \x{80}
+    \x{ff}
+ 0: \x{ff}
+    \x{100}
+ 0: \x{100}
+    \x{101} 
+ 0: \x{101}
+    ** Failers
+No match
+    \x{102}
+No match
+    Y
+No match
+    y           
+No match
+
+/[z-\x{100}]/8Di
+------------------------------------------------------------------
+  0  20 Bra 0
+  3     [Z\x{39c}\x{178}z-\x{101}]
+ 20  20 Ket
+ 23     End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf8
+No first char
+No need char
+
+/^\X/8
+    A
+ 0: A
+    A\x{300}BC 
+ 0: A\x{300}
+    A\x{300}\x{301}\x{302}BC 
+ 0: A\x{300}\x{301}\x{302}
+    *** Failers
+ 0: *
+    \x{300}  
+No match
+
+/^[\X]/8
+    X123
+ 0: X
+    *** Failers
+No match
+    AXYZ
+No match
+
+/^(\X*)C/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+ 0: A\x{300}\x{301}\x{302}BC
+ 1: A\x{300}\x{301}\x{302}B
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+ 0: A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+ 1: A\x{300}\x{301}\x{302}BCA\x{300}\x{301}
+
+/^(\X*?)C/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+ 0: A\x{300}\x{301}\x{302}BC
+ 1: A\x{300}\x{301}\x{302}B
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+ 0: A\x{300}\x{301}\x{302}BC
+ 1: A\x{300}\x{301}\x{302}B
+
+/^(\X*)(.)/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+ 0: A\x{300}\x{301}\x{302}BCA
+ 1: A\x{300}\x{301}\x{302}BC
+ 2: A
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+ 0: A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+ 1: A\x{300}\x{301}\x{302}BCA\x{300}\x{301}
+ 2: C
+
+/^(\X*?)(.)/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+ 0: A
+ 1: 
+ 2: A
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+ 0: A
+ 1: 
+ 2: A
+
+/^\X(.)/8
+    *** Failers
+ 0: **
+ 1: *
+    A\x{300}\x{301}\x{302}
+No match
+
+/^\X{2,3}(.)/8
+    A\x{300}\x{301}B\x{300}X
+ 0: A\x{300}\x{301}B\x{300}X
+ 1: X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}
+ 0: A\x{300}\x{301}B\x{300}C
+ 1: C
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+ 0: A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+ 1: X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}DA\x{300}X
+ 0: A\x{300}\x{301}B\x{300}C\x{300}\x{301}D
+ 1: D
+    
+/^\X{2,3}?(.)/8
+    A\x{300}\x{301}B\x{300}X
+ 0: A\x{300}\x{301}B\x{300}X
+ 1: X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}
+ 0: A\x{300}\x{301}B\x{300}C
+ 1: C
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+ 0: A\x{300}\x{301}B\x{300}C
+ 1: C
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}DA\x{300}X
+ 0: A\x{300}\x{301}B\x{300}C
+ 1: C
+    
+/ End of testinput6 /
diff -Nurp tin-1.6.2/pcre/testdata/testoutput7 tin-1.8.0/pcre/testdata/testoutput7
--- tin-1.6.2/pcre/testdata/testoutput7	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/testdata/testoutput7	2005-09-12 16:42:33.000000000 +0200
@@ -0,0 +1,6516 @@
+PCRE version 6.4 05-Sep-2005
+
+/abc/
+    abc
+ 0: abc
+    
+/ab*c/
+    abc
+ 0: abc
+    abbbbc
+ 0: abbbbc
+    ac
+ 0: ac
+    
+/ab+c/
+    abc
+ 0: abc
+    abbbbbbc
+ 0: abbbbbbc
+    *** Failers 
+No match
+    ac
+No match
+    ab
+No match
+    
+/a*/
+    a
+ 0: a
+ 1: 
+    aaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaa
+ 1: aaaaaaaaaaaaaaaa
+ 2: aaaaaaaaaaaaaaa
+ 3: aaaaaaaaaaaaaa
+ 4: aaaaaaaaaaaaa
+ 5: aaaaaaaaaaaa
+ 6: aaaaaaaaaaa
+ 7: aaaaaaaaaa
+ 8: aaaaaaaaa
+ 9: aaaaaaaa
+10: aaaaaaa
+11: aaaaaa
+12: aaaaa
+13: aaaa
+14: aaa
+15: aa
+16: a
+17: 
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
+Matched, but too many subsidiary matches
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 3: aaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 4: aaaaaaaaaaaaaaaaaaaaaaaaaa
+ 5: aaaaaaaaaaaaaaaaaaaaaaaaa
+ 6: aaaaaaaaaaaaaaaaaaaaaaaa
+ 7: aaaaaaaaaaaaaaaaaaaaaaa
+ 8: aaaaaaaaaaaaaaaaaaaaaa
+ 9: aaaaaaaaaaaaaaaaaaaaa
+10: aaaaaaaaaaaaaaaaaaaa
+11: aaaaaaaaaaaaaaaaaaa
+12: aaaaaaaaaaaaaaaaaa
+13: aaaaaaaaaaaaaaaaa
+14: aaaaaaaaaaaaaaaa
+15: aaaaaaaaaaaaaaa
+16: aaaaaaaaaaaaaa
+17: aaaaaaaaaaaaa
+18: aaaaaaaaaaaa
+19: aaaaaaaaaaa
+20: aaaaaaaaaa
+21: aaaaaaaaa
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\F 
+ 0: 
+    
+/(a|abcd|african)/
+    a
+ 0: a
+    abcd
+ 0: abcd
+ 1: a
+    african
+ 0: african
+ 1: a
+    
+/^abc/
+    abcdef
+ 0: abc
+    *** Failers
+No match
+    xyzabc
+No match
+    xyz\nabc    
+No match
+    
+/^abc/m
+    abcdef
+ 0: abc
+    xyz\nabc    
+ 0: abc
+    *** Failers
+No match
+    xyzabc
+No match
+    
+/\Aabc/
+    abcdef
+ 0: abc
+    *** Failers
+No match
+    xyzabc
+No match
+    xyz\nabc    
+No match
+    
+/\Aabc/m
+    abcdef
+ 0: abc
+    *** Failers
+No match
+    xyzabc
+No match
+    xyz\nabc    
+No match
+    
+/\Gabc/
+    abcdef
+ 0: abc
+    xyzabc\>3
+ 0: abc
+    *** Failers
+No match
+    xyzabc    
+No match
+    xyzabc\>2 
+No match
+    
+/x\dy\Dz/
+    x9yzz
+ 0: x9yzz
+    x0y+z
+ 0: x0y+z
+    *** Failers
+No match
+    xyz
+No match
+    xxy0z     
+No match
+    
+/x\sy\Sz/
+    x yzz
+ 0: x yzz
+    x y+z
+ 0: x y+z
+    *** Failers
+No match
+    xyz
+No match
+    xxyyz
+No match
+    
+/x\wy\Wz/
+    xxy+z
+ 0: xxy+z
+    *** Failers
+No match
+    xxy0z
+No match
+    x+y+z         
+No match
+    
+/x.y/
+    x+y
+ 0: x+y
+    x-y
+ 0: x-y
+    *** Failers
+No match
+    x\ny
+No match
+    
+/x.y/s
+    x+y
+ 0: x+y
+    x-y
+ 0: x-y
+    x\ny
+ 0: x\x0ay
+
+/(a.b(?s)c.d|x.y)p.q/
+    a+bc+dp+q
+ 0: a+bc+dp+q
+    a+bc\ndp+q
+ 0: a+bc\x0adp+q
+    x\nyp+q 
+ 0: x\x0ayp+q
+    *** Failers 
+No match
+    a\nbc\ndp+q
+No match
+    a+bc\ndp\nq
+No match
+    x\nyp\nq 
+No match
+
+/a\d\z/
+    ba0
+ 0: a0
+    *** Failers
+No match
+    ba0\n
+No match
+    ba0\ncd   
+No match
+
+/a\d\z/m
+    ba0
+ 0: a0
+    *** Failers
+No match
+    ba0\n
+No match
+    ba0\ncd   
+No match
+
+/a\d\Z/
+    ba0
+ 0: a0
+    ba0\n
+ 0: a0
+    *** Failers
+No match
+    ba0\ncd   
+No match
+
+/a\d\Z/m
+    ba0
+ 0: a0
+    ba0\n
+ 0: a0
+    *** Failers
+No match
+    ba0\ncd   
+No match
+
+/a\d$/
+    ba0
+ 0: a0
+    ba0\n
+ 0: a0
+    *** Failers
+No match
+    ba0\ncd   
+No match
+
+/a\d$/m
+    ba0
+ 0: a0
+    ba0\n
+ 0: a0
+    ba0\ncd   
+ 0: a0
+    *** Failers
+No match
+
+/abc/i
+    abc
+ 0: abc
+    aBc
+ 0: aBc
+    ABC
+ 0: ABC
+    
+/[^a]/
+    abcd
+ 0: b
+    
+/ab?\w/
+    abz
+ 0: abz
+ 1: ab
+    abbz
+ 0: abb
+ 1: ab
+    azz  
+ 0: az
+
+/x{0,3}yz/
+    ayzq
+ 0: yz
+    axyzq
+ 0: xyz
+    axxyz
+ 0: xxyz
+    axxxyzq
+ 0: xxxyz
+    axxxxyzq
+ 0: xxxyz
+    *** Failers
+No match
+    ax
+No match
+    axx     
+No match
+      
+/x{3}yz/
+    axxxyzq
+ 0: xxxyz
+    axxxxyzq
+ 0: xxxyz
+    *** Failers
+No match
+    ax
+No match
+    axx     
+No match
+    ayzq
+No match
+    axyzq
+No match
+    axxyz
+No match
+      
+/x{2,3}yz/
+    axxyz
+ 0: xxyz
+    axxxyzq
+ 0: xxxyz
+    axxxxyzq
+ 0: xxxyz
+    *** Failers
+No match
+    ax
+No match
+    axx     
+No match
+    ayzq
+No match
+    axyzq
+No match
+      
+/[^a]+/
+    bac
+ 0: b
+    bcdefax
+ 0: bcdef
+ 1: bcde
+ 2: bcd
+ 3: bc
+ 4: b
+    *** Failers
+ 0: *** F
+ 1: *** 
+ 2: ***
+ 3: **
+ 4: *
+    aaaaa   
+No match
+
+/[^a]*/
+    bac
+ 0: b
+ 1: 
+    bcdefax
+ 0: bcdef
+ 1: bcde
+ 2: bcd
+ 3: bc
+ 4: b
+ 5: 
+    *** Failers
+ 0: *** F
+ 1: *** 
+ 2: ***
+ 3: **
+ 4: *
+ 5: 
+    aaaaa   
+ 0: 
+    
+/[^a]{3,5}/
+    xyz
+ 0: xyz
+    awxyza
+ 0: wxyz
+ 1: wxy
+    abcdefa
+ 0: bcdef
+ 1: bcde
+ 2: bcd
+    abcdefghijk
+ 0: bcdef
+ 1: bcde
+ 2: bcd
+    *** Failers
+ 0: *** F
+ 1: *** 
+ 2: ***
+    axya
+No match
+    axa
+No match
+    aaaaa         
+No match
+
+/\d*/
+    1234b567
+ 0: 1234
+ 1: 123
+ 2: 12
+ 3: 1
+ 4: 
+    xyz
+ 0: 
+    
+/\D*/
+    a1234b567
+ 0: a
+ 1: 
+    xyz
+ 0: xyz
+ 1: xy
+ 2: x
+ 3: 
+     
+/\d+/
+    ab1234c56
+ 0: 1234
+ 1: 123
+ 2: 12
+ 3: 1
+    *** Failers
+No match
+    xyz
+No match
+    
+/\D+/
+    ab123c56
+ 0: ab
+ 1: a
+    *** Failers
+ 0: *** Failers
+ 1: *** Failer
+ 2: *** Faile
+ 3: *** Fail
+ 4: *** Fai
+ 5: *** Fa
+ 6: *** F
+ 7: *** 
+ 8: ***
+ 9: **
+10: *
+    789
+No match
+    
+/\d?A/
+    045ABC
+ 0: 5A
+    ABC
+ 0: A
+    *** Failers
+No match
+    XYZ
+No match
+    
+/\D?A/
+    ABC
+ 0: A
+    BAC
+ 0: BA
+    9ABC             
+ 0: A
+    *** Failers
+No match
+
+/a+/
+    aaaa
+ 0: aaaa
+ 1: aaa
+ 2: aa
+ 3: a
+
+/^.*xyz/
+    xyz
+ 0: xyz
+    ggggggggxyz
+ 0: ggggggggxyz
+    
+/^.+xyz/
+    abcdxyz
+ 0: abcdxyz
+    axyz
+ 0: axyz
+    *** Failers
+No match
+    xyz
+No match
+    
+/^.?xyz/
+    xyz
+ 0: xyz
+    cxyz       
+ 0: cxyz
+
+/^\d{2,3}X/
+    12X
+ 0: 12X
+    123X
+ 0: 123X
+    *** Failers
+No match
+    X
+No match
+    1X
+No match
+    1234X     
+No match
+
+/^[abcd]\d/
+    a45
+ 0: a4
+    b93
+ 0: b9
+    c99z
+ 0: c9
+    d04
+ 0: d0
+    *** Failers
+No match
+    e45
+No match
+    abcd      
+No match
+    abcd1234
+No match
+    1234  
+No match
+
+/^[abcd]*\d/
+    a45
+ 0: a4
+    b93
+ 0: b9
+    c99z
+ 0: c9
+    d04
+ 0: d0
+    abcd1234
+ 0: abcd1
+    1234  
+ 0: 1
+    *** Failers
+No match
+    e45
+No match
+    abcd      
+No match
+
+/^[abcd]+\d/
+    a45
+ 0: a4
+    b93
+ 0: b9
+    c99z
+ 0: c9
+    d04
+ 0: d0
+    abcd1234
+ 0: abcd1
+    *** Failers
+No match
+    1234  
+No match
+    e45
+No match
+    abcd      
+No match
+
+/^a+X/
+    aX
+ 0: aX
+    aaX 
+ 0: aaX
+
+/^[abcd]?\d/
+    a45
+ 0: a4
+    b93
+ 0: b9
+    c99z
+ 0: c9
+    d04
+ 0: d0
+    1234  
+ 0: 1
+    *** Failers
+No match
+    abcd1234
+No match
+    e45
+No match
+
+/^[abcd]{2,3}\d/
+    ab45
+ 0: ab4
+    bcd93
+ 0: bcd9
+    *** Failers
+No match
+    1234 
+No match
+    a36 
+No match
+    abcd1234
+No match
+    ee45
+No match
+
+/^(abc)*\d/
+    abc45
+ 0: abc4
+    abcabcabc45
+ 0: abcabcabc4
+    42xyz 
+ 0: 4
+    *** Failers
+No match
+
+/^(abc)+\d/
+    abc45
+ 0: abc4
+    abcabcabc45
+ 0: abcabcabc4
+    *** Failers
+No match
+    42xyz 
+No match
+
+/^(abc)?\d/
+    abc45
+ 0: abc4
+    42xyz 
+ 0: 4
+    *** Failers
+No match
+    abcabcabc45
+No match
+
+/^(abc){2,3}\d/
+    abcabc45
+ 0: abcabc4
+    abcabcabc45
+ 0: abcabcabc4
+    *** Failers
+No match
+    abcabcabcabc45
+No match
+    abc45
+No match
+    42xyz 
+No match
+
+/1(abc|xyz)2(?1)3/
+    1abc2abc3456
+ 0: 1abc2abc3
+    1abc2xyz3456 
+ 0: 1abc2xyz3
+
+/^(a*\w|ab)=(a*\w|ab)/
+    ab=ab
+ 0: ab=ab
+ 1: ab=a
+
+/^(a*\w|ab)=(?1)/
+    ab=ab
+ 0: ab=ab
+ 1: ab=a
+
+/^([^()]|\((?1)*\))*$/
+    abc
+ 0: abc
+    a(b)c
+ 0: a(b)c
+    a(b(c))d  
+ 0: a(b(c))d
+    *** Failers)
+No match
+    a(b(c)d  
+No match
+
+/^>abc>([^()]|\((?1)*\))*<xyz<$/
+    >abc>123<xyz<
+ 0: >abc>123<xyz<
+    >abc>1(2)3<xyz<
+ 0: >abc>1(2)3<xyz<
+    >abc>(1(2)3)<xyz<
+ 0: >abc>(1(2)3)<xyz<
+
+/^(?>a*)\d/
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9876
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9
+    *** Failers 
+No match
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+No match
+
+/< (?: (?(R) \d++  | [^<>]*+) | (?R)) * >/x
+    <>
+ 0: <>
+    <abcd>
+ 0: <abcd>
+    <abc <123> hij>
+ 0: <abc <123> hij>
+    <abc <def> hij>
+ 0: <def>
+    <abc<>def> 
+ 0: <abc<>def>
+    <abc<>      
+ 0: <>
+    *** Failers
+No match
+    <abc
+No match
+
+/^(?(?=abc)\w{3}:|\d\d)$/        
+    abc:                          
+ 0: abc:
+    12                             
+ 0: 12
+    *** Failers                     
+No match
+    123                       
+No match
+    xyz                        
+No match
+                                
+/^(?(?!abc)\d\d|\w{3}:)$/      
+    abc:                        
+ 0: abc:
+    12         
+ 0: 12
+    *** Failers
+No match
+    123
+No match
+    xyz    
+No match
+
+/^(?=abc)\w{5}:$/        
+    abcde:                          
+ 0: abcde:
+    *** Failers                     
+No match
+    abc.. 
+No match
+    123                       
+No match
+    vwxyz                        
+No match
+                                
+/^(?!abc)\d\d$/      
+    12         
+ 0: 12
+    *** Failers
+No match
+    abcde:
+No match
+    abc..  
+No match
+    123
+No match
+    vwxyz    
+No match
+
+/(?<=abc|xy)123/
+    abc12345
+ 0: 123
+    wxy123z
+ 0: 123
+    *** Failers
+No match
+    123abc
+No match
+
+/(?<!abc|xy)123/
+    123abc
+ 0: 123
+    mno123456 
+ 0: 123
+    *** Failers
+No match
+    abc12345
+No match
+    wxy123z
+No match
+
+/abc(?C1)xyz/
+    abcxyz
+--->abcxyz
+  1 ^  ^       x
+ 0: abcxyz
+    123abcxyz999 
+--->123abcxyz999
+  1    ^  ^          x
+ 0: abcxyz
+
+/(ab|cd){3,4}/C
+  ababab
+--->ababab
+ +0 ^          (ab|cd){3,4}
+ +1 ^          a
+ +4 ^          c
+ +2 ^^         b
+ +3 ^ ^        |
+ +1 ^ ^        a
+ +4 ^ ^        c
+ +2 ^  ^       b
+ +3 ^   ^      |
+ +1 ^   ^      a
+ +4 ^   ^      c
+ +2 ^    ^     b
+ +3 ^     ^    |
++12 ^     ^    
+ +1 ^     ^    a
+ +4 ^     ^    c
+ 0: ababab
+  abcdabcd
+--->abcdabcd
+ +0 ^            (ab|cd){3,4}
+ +1 ^            a
+ +4 ^            c
+ +2 ^^           b
+ +3 ^ ^          |
+ +1 ^ ^          a
+ +4 ^ ^          c
+ +5 ^  ^         d
+ +6 ^   ^        )
+ +1 ^   ^        a
+ +4 ^   ^        c
+ +2 ^    ^       b
+ +3 ^     ^      |
++12 ^     ^      
+ +1 ^     ^      a
+ +4 ^     ^      c
+ +5 ^      ^     d
+ +6 ^       ^    )
++12 ^       ^    
+ 0: abcdabcd
+ 1: abcdab
+  abcdcdcdcdcd  
+--->abcdcdcdcdcd
+ +0 ^                (ab|cd){3,4}
+ +1 ^                a
+ +4 ^                c
+ +2 ^^               b
+ +3 ^ ^              |
+ +1 ^ ^              a
+ +4 ^ ^              c
+ +5 ^  ^             d
+ +6 ^   ^            )
+ +1 ^   ^            a
+ +4 ^   ^            c
+ +5 ^    ^           d
+ +6 ^     ^          )
++12 ^     ^          
+ +1 ^     ^          a
+ +4 ^     ^          c
+ +5 ^      ^         d
+ +6 ^       ^        )
++12 ^       ^        
+ 0: abcdcdcd
+ 1: abcdcd
+
+/^abc/
+    abcdef
+ 0: abc
+    *** Failers
+No match
+    abcdef\B  
+No match
+
+/^(a*|xyz)/
+    bcd
+ 0: 
+    aaabcd
+ 0: aaa
+ 1: aa
+ 2: a
+ 3: 
+    xyz
+ 0: xyz
+ 1: 
+    xyz\N  
+ 0: xyz
+    *** Failers
+ 0: 
+    bcd\N   
+No match
+    
+/xyz$/
+    xyz
+ 0: xyz
+    xyz\n
+ 0: xyz
+    *** Failers
+No match
+    xyz\Z
+No match
+    xyz\n\Z    
+No match
+    
+/xyz$/m
+    xyz
+ 0: xyz
+    xyz\n 
+ 0: xyz
+    abcxyz\npqr 
+ 0: xyz
+    abcxyz\npqr\Z 
+ 0: xyz
+    xyz\n\Z    
+ 0: xyz
+    *** Failers
+No match
+    xyz\Z
+No match
+
+/\Gabc/
+    abcdef
+ 0: abc
+    defabcxyz\>3 
+ 0: abc
+    *** Failers 
+No match
+    defabcxyz
+No match
+
+/^abcdef/
+    ab\P
+Partial match: ab
+    abcde\P
+Partial match: abcde
+    abcdef\P
+ 0: abcdef
+    *** Failers
+No match
+    abx\P    
+No match
+
+/^a{2,4}\d+z/
+    a\P
+Partial match: a
+    aa\P
+Partial match: aa
+    aa2\P 
+Partial match: aa2
+    aaa\P
+Partial match: aaa
+    aaa23\P 
+Partial match: aaa23
+    aaaa12345\P
+Partial match: aaaa12345
+    aa0z\P
+ 0: aa0z
+    aaaa4444444444444z\P 
+ 0: aaaa4444444444444z
+    *** Failers
+No match
+    az\P 
+No match
+    aaaaa\P 
+No match
+    a56\P 
+No match
+
+/^abcdef/
+   abc\P
+Partial match: abc
+   def\R 
+ 0: def
+   
+/(?<=foo)bar/
+   xyzfo\P 
+No match
+   foob\R\P\>2 
+Partial match: b
+   foobar...\R\P\>4 
+ 0: ar
+   xyzfo\P
+No match
+   foobar\R\>2  
+ 0: bar
+   *** Failers
+No match
+   xyzfo\P
+No match
+   obar\R   
+No match
+
+/(ab*(cd|ef))+X/
+    adfadadaklhlkalkajhlkjahdfasdfasdfladsfjkj\P\Z
+No match
+    lkjhlkjhlkjhlkjhabbbbbbcdaefabbbbbbbefa\P\B\Z
+Partial match: abbbbbbcdaefabbbbbbbefa
+    cdabbbbbbbb\P\R\B\Z
+Partial match: cdabbbbbbbb
+    efabbbbbbbbbbbbbbbb\P\R\B\Z
+Partial match: efabbbbbbbbbbbbbbbb
+    bbbbbbbbbbbbcdXyasdfadf\P\R\B\Z    
+ 0: bbbbbbbbbbbbcdX
+
+/(a|b)/SF>testsavedregex
+Compiled regex written to testsavedregex
+Study data written to testsavedregex
+<testsavedregex
+Compiled regex (byte-inverted) loaded from testsavedregex
+Study data loaded from testsavedregex
+    abc
+ 0: a
+    ** Failers
+ 0: a
+    def  
+No match
+    
+/the quick brown fox/
+    the quick brown fox
+ 0: the quick brown fox
+    The quick brown FOX
+No match
+    What do you know about the quick brown fox?
+ 0: the quick brown fox
+    What do you know about THE QUICK BROWN FOX?
+No match
+
+/The quick brown fox/i
+    the quick brown fox
+ 0: the quick brown fox
+    The quick brown FOX
+ 0: The quick brown FOX
+    What do you know about the quick brown fox?
+ 0: the quick brown fox
+    What do you know about THE QUICK BROWN FOX?
+ 0: THE QUICK BROWN FOX
+
+/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/
+    abcd\t\n\r\f\a\e9;\$\\?caxyz
+ 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz
+
+/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
+    abxyzpqrrrabbxyyyypqAzz
+ 0: abxyzpqrrrabbxyyyypqAzz
+    abxyzpqrrrabbxyyyypqAzz
+ 0: abxyzpqrrrabbxyyyypqAzz
+    aabxyzpqrrrabbxyyyypqAzz
+ 0: aabxyzpqrrrabbxyyyypqAzz
+    aaabxyzpqrrrabbxyyyypqAzz
+ 0: aaabxyzpqrrrabbxyyyypqAzz
+    aaaabxyzpqrrrabbxyyyypqAzz
+ 0: aaaabxyzpqrrrabbxyyyypqAzz
+    abcxyzpqrrrabbxyyyypqAzz
+ 0: abcxyzpqrrrabbxyyyypqAzz
+    aabcxyzpqrrrabbxyyyypqAzz
+ 0: aabcxyzpqrrrabbxyyyypqAzz
+    aaabcxyzpqrrrabbxyyyypAzz
+ 0: aaabcxyzpqrrrabbxyyyypAzz
+    aaabcxyzpqrrrabbxyyyypqAzz
+ 0: aaabcxyzpqrrrabbxyyyypqAzz
+    aaabcxyzpqrrrabbxyyyypqqAzz
+ 0: aaabcxyzpqrrrabbxyyyypqqAzz
+    aaabcxyzpqrrrabbxyyyypqqqAzz
+ 0: aaabcxyzpqrrrabbxyyyypqqqAzz
+    aaabcxyzpqrrrabbxyyyypqqqqAzz
+ 0: aaabcxyzpqrrrabbxyyyypqqqqAzz
+    aaabcxyzpqrrrabbxyyyypqqqqqAzz
+ 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz
+    aaabcxyzpqrrrabbxyyyypqqqqqqAzz
+ 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz
+    aaaabcxyzpqrrrabbxyyyypqAzz
+ 0: aaaabcxyzpqrrrabbxyyyypqAzz
+    abxyzzpqrrrabbxyyyypqAzz
+ 0: abxyzzpqrrrabbxyyyypqAzz
+    aabxyzzzpqrrrabbxyyyypqAzz
+ 0: aabxyzzzpqrrrabbxyyyypqAzz
+    aaabxyzzzzpqrrrabbxyyyypqAzz
+ 0: aaabxyzzzzpqrrrabbxyyyypqAzz
+    aaaabxyzzzzpqrrrabbxyyyypqAzz
+ 0: aaaabxyzzzzpqrrrabbxyyyypqAzz
+    abcxyzzpqrrrabbxyyyypqAzz
+ 0: abcxyzzpqrrrabbxyyyypqAzz
+    aabcxyzzzpqrrrabbxyyyypqAzz
+ 0: aabcxyzzzpqrrrabbxyyyypqAzz
+    aaabcxyzzzzpqrrrabbxyyyypqAzz
+ 0: aaabcxyzzzzpqrrrabbxyyyypqAzz
+    aaaabcxyzzzzpqrrrabbxyyyypqAzz
+ 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz
+    aaaabcxyzzzzpqrrrabbbxyyyypqAzz
+ 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz
+    aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
+ 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
+    aaabcxyzpqrrrabbxyyyypABzz
+ 0: aaabcxyzpqrrrabbxyyyypABzz
+    aaabcxyzpqrrrabbxyyyypABBzz
+ 0: aaabcxyzpqrrrabbxyyyypABBzz
+    >>>aaabxyzpqrrrabbxyyyypqAzz
+ 0: aaabxyzpqrrrabbxyyyypqAzz
+    >aaaabxyzpqrrrabbxyyyypqAzz
+ 0: aaaabxyzpqrrrabbxyyyypqAzz
+    >>>>abcxyzpqrrrabbxyyyypqAzz
+ 0: abcxyzpqrrrabbxyyyypqAzz
+    *** Failers
+No match
+    abxyzpqrrabbxyyyypqAzz
+No match
+    abxyzpqrrrrabbxyyyypqAzz
+No match
+    abxyzpqrrrabxyyyypqAzz
+No match
+    aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz
+No match
+    aaaabcxyzzzzpqrrrabbbxyyypqAzz
+No match
+    aaabcxyzpqrrrabbxyyyypqqqqqqqAzz
+No match
+
+/^(abc){1,2}zz/
+    abczz
+ 0: abczz
+    abcabczz
+ 0: abcabczz
+    *** Failers
+No match
+    zz
+No match
+    abcabcabczz
+No match
+    >>abczz
+No match
+
+/^(b+?|a){1,2}?c/
+    bc
+ 0: bc
+    bbc
+ 0: bbc
+    bbbc
+ 0: bbbc
+    bac
+ 0: bac
+    bbac
+ 0: bbac
+    aac
+ 0: aac
+    abbbbbbbbbbbc
+ 0: abbbbbbbbbbbc
+    bbbbbbbbbbbac
+ 0: bbbbbbbbbbbac
+    *** Failers
+No match
+    aaac
+No match
+    abbbbbbbbbbbac
+No match
+
+/^(b+|a){1,2}c/
+    bc
+ 0: bc
+    bbc
+ 0: bbc
+    bbbc
+ 0: bbbc
+    bac
+ 0: bac
+    bbac
+ 0: bbac
+    aac
+ 0: aac
+    abbbbbbbbbbbc
+ 0: abbbbbbbbbbbc
+    bbbbbbbbbbbac
+ 0: bbbbbbbbbbbac
+    *** Failers
+No match
+    aaac
+No match
+    abbbbbbbbbbbac
+No match
+
+/^(b+|a){1,2}?bc/
+    bbc
+ 0: bbc
+
+/^(b*|ba){1,2}?bc/
+    babc
+ 0: babc
+    bbabc
+ 0: bbabc
+    bababc
+ 0: bababc
+    *** Failers
+No match
+    bababbc
+No match
+    babababc
+No match
+
+/^(ba|b*){1,2}?bc/
+    babc
+ 0: babc
+    bbabc
+ 0: bbabc
+    bababc
+ 0: bababc
+    *** Failers
+No match
+    bababbc
+No match
+    babababc
+No match
+
+/^\ca\cA\c[\c{\c:/
+    \x01\x01\e;z
+ 0: \x01\x01\x1b;z
+
+/^[ab\]cde]/
+    athing
+ 0: a
+    bthing
+ 0: b
+    ]thing
+ 0: ]
+    cthing
+ 0: c
+    dthing
+ 0: d
+    ething
+ 0: e
+    *** Failers
+No match
+    fthing
+No match
+    [thing
+No match
+    \\thing
+No match
+
+/^[]cde]/
+    ]thing
+ 0: ]
+    cthing
+ 0: c
+    dthing
+ 0: d
+    ething
+ 0: e
+    *** Failers
+No match
+    athing
+No match
+    fthing
+No match
+
+/^[^ab\]cde]/
+    fthing
+ 0: f
+    [thing
+ 0: [
+    \\thing
+ 0: \
+    *** Failers
+ 0: *
+    athing
+No match
+    bthing
+No match
+    ]thing
+No match
+    cthing
+No match
+    dthing
+No match
+    ething
+No match
+
+/^[^]cde]/
+    athing
+ 0: a
+    fthing
+ 0: f
+    *** Failers
+ 0: *
+    ]thing
+No match
+    cthing
+No match
+    dthing
+No match
+    ething
+No match
+
+/^\/
+    
+ 0: \x81
+
+/^ÿ/
+    ÿ
+ 0: \xff
+
+/^[0-9]+$/
+    0
+ 0: 0
+    1
+ 0: 1
+    2
+ 0: 2
+    3
+ 0: 3
+    4
+ 0: 4
+    5
+ 0: 5
+    6
+ 0: 6
+    7
+ 0: 7
+    8
+ 0: 8
+    9
+ 0: 9
+    10
+ 0: 10
+    100
+ 0: 100
+    *** Failers
+No match
+    abc
+No match
+
+/^.*nter/
+    enter
+ 0: enter
+    inter
+ 0: inter
+    uponter
+ 0: uponter
+
+/^xxx[0-9]+$/
+    xxx0
+ 0: xxx0
+    xxx1234
+ 0: xxx1234
+    *** Failers
+No match
+    xxx
+No match
+
+/^.+[0-9][0-9][0-9]$/
+    x123
+ 0: x123
+    xx123
+ 0: xx123
+    123456
+ 0: 123456
+    *** Failers
+No match
+    123
+No match
+    x1234
+ 0: x1234
+
+/^.+?[0-9][0-9][0-9]$/
+    x123
+ 0: x123
+    xx123
+ 0: xx123
+    123456
+ 0: 123456
+    *** Failers
+No match
+    123
+No match
+    x1234
+ 0: x1234
+
+/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
+    abc!pqr=apquxz.ixr.zzz.ac.uk
+ 0: abc!pqr=apquxz.ixr.zzz.ac.uk
+    *** Failers
+No match
+    !pqr=apquxz.ixr.zzz.ac.uk
+No match
+    abc!=apquxz.ixr.zzz.ac.uk
+No match
+    abc!pqr=apquxz:ixr.zzz.ac.uk
+No match
+    abc!pqr=apquxz.ixr.zzz.ac.ukk
+No match
+
+/:/
+    Well, we need a colon: somewhere
+ 0: :
+    *** Fail if we don't
+No match
+
+/([\da-f:]+)$/i
+    0abc
+ 0: 0abc
+    abc
+ 0: abc
+    fed
+ 0: fed
+    E
+ 0: E
+    ::
+ 0: ::
+    5f03:12C0::932e
+ 0: 5f03:12C0::932e
+    fed def
+ 0: def
+    Any old stuff
+ 0: ff
+    *** Failers
+No match
+    0zzz
+No match
+    gzzz
+No match
+    fed\x20
+No match
+    Any old rubbish
+No match
+
+/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
+    .1.2.3
+ 0: .1.2.3
+    A.12.123.0
+ 0: A.12.123.0
+    *** Failers
+No match
+    .1.2.3333
+No match
+    1.2.3
+No match
+    1234.2.3
+No match
+
+/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
+    1 IN SOA non-sp1 non-sp2(
+ 0: 1 IN SOA non-sp1 non-sp2(
+    1    IN    SOA    non-sp1    non-sp2   (
+ 0: 1    IN    SOA    non-sp1    non-sp2   (
+    *** Failers
+No match
+    1IN SOA non-sp1 non-sp2(
+No match
+
+/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/
+    a.
+ 0: a.
+    Z.
+ 0: Z.
+    2.
+ 0: 2.
+    ab-c.pq-r.
+ 0: ab-c.pq-r.
+    sxk.zzz.ac.uk.
+ 0: sxk.zzz.ac.uk.
+    x-.y-.
+ 0: x-.y-.
+    *** Failers
+No match
+    -abc.peq.
+No match
+
+/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
+    *.a
+ 0: *.a
+    *.b0-a
+ 0: *.b0-a
+    *.c3-b.c
+ 0: *.c3-b.c
+    *.c-a.b-c
+ 0: *.c-a.b-c
+    *** Failers
+No match
+    *.0
+No match
+    *.a-
+No match
+    *.a-b.c-
+No match
+    *.c-a.0-c
+No match
+
+/^(?=ab(de))(abd)(e)/
+    abde
+ 0: abde
+
+/^(?!(ab)de|x)(abd)(f)/
+    abdf
+ 0: abdf
+
+/^(?=(ab(cd)))(ab)/
+    abcd
+ 0: ab
+
+/^[\da-f](\.[\da-f])*$/i
+    a.b.c.d
+ 0: a.b.c.d
+    A.B.C.D
+ 0: A.B.C.D
+    a.b.c.1.2.3.C
+ 0: a.b.c.1.2.3.C
+
+/^\".*\"\s*(;.*)?$/
+    \"1234\"
+ 0: "1234"
+    \"abcd\" ;
+ 0: "abcd" ;
+    \"\" ; rhubarb
+ 0: "" ; rhubarb
+    *** Failers
+No match
+    \"1234\" : things
+No match
+
+/^$/
+    \
+ 0: 
+    *** Failers
+No match
+
+/   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/x
+    ab c
+ 0: ab c
+    *** Failers
+No match
+    abc
+No match
+    ab cde
+No match
+
+/(?x)   ^    a   (?# begins with a)  b\sc (?# then b c) $ (?# then end)/
+    ab c
+ 0: ab c
+    *** Failers
+No match
+    abc
+No match
+    ab cde
+No match
+
+/^   a\ b[c ]d       $/x
+    a bcd
+ 0: a bcd
+    a b d
+ 0: a b d
+    *** Failers
+No match
+    abcd
+No match
+    ab d
+No match
+
+/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/
+    abcdefhijklm
+ 0: abcdefhijklm
+
+/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/
+    abcdefhijklm
+ 0: abcdefhijklm
+
+/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/
+    a+ Z0+\x08\n\x1d\x12
+ 0: a+ Z0+\x08\x0a\x1d\x12
+
+/^[.^$|()*+?{,}]+/
+    .^\$(*+)|{?,?}
+ 0: .^$(*+)|{?,?}
+ 1: .^$(*+)|{?,?
+ 2: .^$(*+)|{?,
+ 3: .^$(*+)|{?
+ 4: .^$(*+)|{
+ 5: .^$(*+)|
+ 6: .^$(*+)
+ 7: .^$(*+
+ 8: .^$(*
+ 9: .^$(
+10: .^$
+11: .^
+12: .
+
+/^a*\w/
+    z
+ 0: z
+    az
+ 0: az
+ 1: a
+    aaaz
+ 0: aaaz
+ 1: aaa
+ 2: aa
+ 3: a
+    a
+ 0: a
+    aa
+ 0: aa
+ 1: a
+    aaaa
+ 0: aaaa
+ 1: aaa
+ 2: aa
+ 3: a
+    a+
+ 0: a
+    aa+
+ 0: aa
+ 1: a
+
+/^a*?\w/
+    z
+ 0: z
+    az
+ 0: az
+ 1: a
+    aaaz
+ 0: aaaz
+ 1: aaa
+ 2: aa
+ 3: a
+    a
+ 0: a
+    aa
+ 0: aa
+ 1: a
+    aaaa
+ 0: aaaa
+ 1: aaa
+ 2: aa
+ 3: a
+    a+
+ 0: a
+    aa+
+ 0: aa
+ 1: a
+
+/^a+\w/
+    az
+ 0: az
+    aaaz
+ 0: aaaz
+ 1: aaa
+ 2: aa
+    aa
+ 0: aa
+    aaaa
+ 0: aaaa
+ 1: aaa
+ 2: aa
+    aa+
+ 0: aa
+
+/^a+?\w/
+    az
+ 0: az
+    aaaz
+ 0: aaaz
+ 1: aaa
+ 2: aa
+    aa
+ 0: aa
+    aaaa
+ 0: aaaa
+ 1: aaa
+ 2: aa
+    aa+
+ 0: aa
+
+/^\d{8}\w{2,}/
+    1234567890
+ 0: 1234567890
+    12345678ab
+ 0: 12345678ab
+    12345678__
+ 0: 12345678__
+    *** Failers
+No match
+    1234567
+No match
+
+/^[aeiou\d]{4,5}$/
+    uoie
+ 0: uoie
+    1234
+ 0: 1234
+    12345
+ 0: 12345
+    aaaaa
+ 0: aaaaa
+    *** Failers
+No match
+    123456
+No match
+
+/^[aeiou\d]{4,5}?/
+    uoie
+ 0: uoie
+    1234
+ 0: 1234
+    12345
+ 0: 12345
+ 1: 1234
+    aaaaa
+ 0: aaaaa
+ 1: aaaa
+    123456
+ 0: 12345
+ 1: 1234
+
+/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/
+    From abcd  Mon Sep 01 12:33:02 1997
+ 0: From abcd  Mon Sep 01 12:33
+
+/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
+    From abcd  Mon Sep 01 12:33:02 1997
+ 0: From abcd  Mon Sep 01 12:33
+    From abcd  Mon Sep  1 12:33:02 1997
+ 0: From abcd  Mon Sep  1 12:33
+    *** Failers
+No match
+    From abcd  Sep 01 12:33:02 1997
+No match
+
+/^12.34/s
+    12\n34
+ 0: 12\x0a34
+    12\r34
+ 0: 12\x0d34
+
+/\w+(?=\t)/
+    the quick brown\t fox
+ 0: brown
+
+/foo(?!bar)(.*)/
+    foobar is foolish see?
+ 0: foolish see?
+ 1: foolish see
+ 2: foolish se
+ 3: foolish s
+ 4: foolish 
+ 5: foolish
+ 6: foolis
+ 7: fooli
+ 8: fool
+ 9: foo
+
+/(?:(?!foo)...|^.{0,2})bar(.*)/
+    foobar crowbar etc
+ 0: rowbar etc
+ 1: rowbar et
+ 2: rowbar e
+ 3: rowbar 
+ 4: rowbar
+    barrel
+ 0: barrel
+ 1: barre
+ 2: barr
+ 3: bar
+    2barrel
+ 0: 2barrel
+ 1: 2barre
+ 2: 2barr
+ 3: 2bar
+    A barrel
+ 0: A barrel
+ 1: A barre
+ 2: A barr
+ 3: A bar
+
+/^(\D*)(?=\d)(?!123)/
+    abc456
+ 0: abc
+    *** Failers
+No match
+    abc123
+No match
+
+/^1234(?# test newlines
+  inside)/
+    1234
+ 0: 1234
+
+/^1234 #comment in extended re
+  /x
+    1234
+ 0: 1234
+
+/#rhubarb
+  abcd/x
+    abcd
+ 0: abcd
+
+/^abcd#rhubarb/x
+    abcd
+ 0: abcd
+
+/(?!^)abc/
+    the abc
+ 0: abc
+    *** Failers
+No match
+    abc
+No match
+
+/(?=^)abc/
+    abc
+ 0: abc
+    *** Failers
+No match
+    the abc
+No match
+
+/^[ab]{1,3}(ab*|b)/
+    aabbbbb
+ 0: aabbbbb
+ 1: aabbbb
+ 2: aabbb
+ 3: aabb
+ 4: aab
+ 5: aa
+
+/^[ab]{1,3}?(ab*|b)/
+    aabbbbb
+ 0: aabbbbb
+ 1: aabbbb
+ 2: aabbb
+ 3: aabb
+ 4: aab
+ 5: aa
+
+/^[ab]{1,3}?(ab*?|b)/
+    aabbbbb
+ 0: aabbbbb
+ 1: aabbbb
+ 2: aabbb
+ 3: aabb
+ 4: aab
+ 5: aa
+
+/^[ab]{1,3}(ab*?|b)/
+    aabbbbb
+ 0: aabbbbb
+ 1: aabbbb
+ 2: aabbb
+ 3: aabb
+ 4: aab
+ 5: aa
+
+/  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*                          # optional leading comment
+(?:    (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?:                      # opening quote...
+[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
+|                     #    or
+\\ [^\x80-\xff]           #   Escaped something (something != CR)
+)* "  # closing quote
+)                    # initial word
+(?:  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  \.  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*   (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?:                      # opening quote...
+[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
+|                     #    or
+\\ [^\x80-\xff]           #   Escaped something (something != CR)
+)* "  # closing quote
+)  )* # further okay, if led by a period
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  @  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*    (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                           # initial subdomain
+(?:                                  #
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  \.                        # if led by a period...
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*   (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                     #   ...further okay
+)*
+# address
+|                     #  or
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?:                      # opening quote...
+[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
+|                     #    or
+\\ [^\x80-\xff]           #   Escaped something (something != CR)
+)* "  # closing quote
+)             # one word, optionally followed by....
+(?:
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]  |  # atom and space parts, or...
+\(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)       |  # comments, or...
+
+" (?:                      # opening quote...
+[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
+|                     #    or
+\\ [^\x80-\xff]           #   Escaped something (something != CR)
+)* "  # closing quote
+# quoted strings
+)*
+<  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*                     # leading <
+(?:  @  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*    (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                           # initial subdomain
+(?:                                  #
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  \.                        # if led by a period...
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*   (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                     #   ...further okay
+)*
+
+(?:  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  ,  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  @  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*    (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                           # initial subdomain
+(?:                                  #
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  \.                        # if led by a period...
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*   (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                     #   ...further okay
+)*
+)* # further okay, if led by comma
+:                                # closing colon
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  )? #       optional route
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?:                      # opening quote...
+[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
+|                     #    or
+\\ [^\x80-\xff]           #   Escaped something (something != CR)
+)* "  # closing quote
+)                    # initial word
+(?:  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  \.  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*   (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?:                      # opening quote...
+[^\\\x80-\xff\n\015"]                #   Anything except backslash and quote
+|                     #    or
+\\ [^\x80-\xff]           #   Escaped something (something != CR)
+)* "  # closing quote
+)  )* # further okay, if led by a period
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  @  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*    (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                           # initial subdomain
+(?:                                  #
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  \.                        # if led by a period...
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*   (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|   \[                         # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*    #    stuff
+\]                        #           ]
+)                     #   ...further okay
+)*
+#       address spec
+(?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*  > #                  trailing >
+# name and address
+)  (?: [\040\t] |  \(
+(?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  |  \( (?:  [^\\\x80-\xff\n\015()]  |  \\ [^\x80-\xff]  )* \)  )*
+\)  )*                       # optional trailing comment
+/x
+    Alan Other <user\@dom.ain>
+ 0: Alan Other <user@dom.ain>
+    <user\@dom.ain>
+ 0: user@dom.ain
+ 1: user@dom
+    user\@dom.ain
+ 0: user@dom.ain
+ 1: user@dom
+    \"A. Other\" <user.1234\@dom.ain> (a comment)
+ 0: "A. Other" <user.1234@dom.ain> (a comment)
+ 1: "A. Other" <user.1234@dom.ain> 
+ 2: "A. Other" <user.1234@dom.ain>
+    A. Other <user.1234\@dom.ain> (a comment)
+ 0:  Other <user.1234@dom.ain> (a comment)
+ 1:  Other <user.1234@dom.ain> 
+ 2:  Other <user.1234@dom.ain>
+    \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
+ 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
+ 1: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re
+    A missing angle <user\@some.where
+ 0: user@some.where
+ 1: user@some
+    *** Failers
+No match
+    The quick brown fox
+No match
+
+/[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+|                       #  or
+"                                     # "
+[^\\\x80-\xff\n\015"] *                            #   normal
+(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
+"                                     #        "
+# Quoted string
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+\.
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+|                       #  or
+"                                     # "
+[^\\\x80-\xff\n\015"] *                            #   normal
+(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
+"                                     #        "
+# Quoted string
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+|                             #  or
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+|                       #  or
+"                                     # "
+[^\\\x80-\xff\n\015"] *                            #   normal
+(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
+"                                     #        "
+# Quoted string
+)
+# leading word
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] *               # "normal" atoms and or spaces
+(?:
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+|
+"                                     # "
+[^\\\x80-\xff\n\015"] *                            #   normal
+(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
+"                                     #        "
+) # "special" comment or quoted string
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] *            #  more "normal"
+)*
+<
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# <
+(?:
+@
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+@
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)*  # additional domains
+:
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+)?     #       optional route
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+|                       #  or
+"                                     # "
+[^\\\x80-\xff\n\015"] *                            #   normal
+(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
+"                                     #        "
+# Quoted string
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+\.
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+|                       #  or
+"                                     # "
+[^\\\x80-\xff\n\015"] *                            #   normal
+(?:  \\ [^\x80-\xff]  [^\\\x80-\xff\n\015"] * )*        #   ( special normal* )*
+"                                     #        "
+# Quoted string
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+    # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[                            # [
+(?: [^\\\x80-\xff\n\015\[\]] |  \\ [^\x80-\xff]  )*     #    stuff
+\]                           #           ]
+)
+[\040\t]*                    # Nab whitespace.
+(?:
+\(                              #  (
+[^\\\x80-\xff\n\015()] *                             #     normal*
+(?:                                 #       (
+(?:  \\ [^\x80-\xff]  |
+\(                            #  (
+[^\\\x80-\xff\n\015()] *                            #     normal*
+(?:  \\ [^\x80-\xff]   [^\\\x80-\xff\n\015()] * )*        #     (special normal*)*
+\)                           #                       )
+)    #         special
+[^\\\x80-\xff\n\015()] *                         #         normal*
+)*                                  #            )*
+\)                             #                )
+[\040\t]* )*    # If comment found, allow more spaces.
+# optional trailing comments
+)*
+#       address spec
+>                    #                 >
+# name and address
+)
+/x
+    Alan Other <user\@dom.ain>
+ 0: Alan Other <user@dom.ain>
+    <user\@dom.ain>
+ 0: user@dom.ain
+ 1: user@dom
+    user\@dom.ain
+ 0: user@dom.ain
+ 1: user@dom
+    \"A. Other\" <user.1234\@dom.ain> (a comment)
+ 0: "A. Other" <user.1234@dom.ain>
+    A. Other <user.1234\@dom.ain> (a comment)
+ 0:  Other <user.1234@dom.ain>
+    \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
+ 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
+ 1: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re
+    A missing angle <user\@some.where
+ 0: user@some.where
+ 1: user@some
+    *** Failers
+No match
+    The quick brown fox
+No match
+
+/abc\0def\00pqr\000xyz\0000AB/
+    abc\0def\00pqr\000xyz\0000AB
+ 0: abc\x00def\x00pqr\x00xyz\x000AB
+    abc456 abc\0def\00pqr\000xyz\0000ABCDE
+ 0: abc\x00def\x00pqr\x00xyz\x000AB
+
+/abc\x0def\x00pqr\x000xyz\x0000AB/
+    abc\x0def\x00pqr\x000xyz\x0000AB
+ 0: abc\x0def\x00pqr\x000xyz\x0000AB
+    abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE
+ 0: abc\x0def\x00pqr\x000xyz\x0000AB
+
+/^[\000-\037]/
+    \0A
+ 0: \x00
+    \01B
+ 0: \x01
+    \037C
+ 0: \x1f
+
+/\0*/
+    \0\0\0\0
+ 0: \x00\x00\x00\x00
+ 1: \x00\x00\x00
+ 2: \x00\x00
+ 3: \x00
+ 4: 
+
+/A\x0{2,3}Z/
+    The A\x0\x0Z
+ 0: A\x00\x00Z
+    An A\0\x0\0Z
+ 0: A\x00\x00\x00Z
+    *** Failers
+No match
+    A\0Z
+No match
+    A\0\x0\0\x0Z
+No match
+
+/^\s/
+    \040abc
+ 0:  
+    \x0cabc
+ 0: \x0c
+    \nabc
+ 0: \x0a
+    \rabc
+ 0: \x0d
+    \tabc
+ 0: \x09
+    *** Failers
+No match
+    abc
+No match
+
+/^a	b
+      c/x
+    abc
+ 0: abc
+
+/ab{1,3}bc/
+    abbbbc
+ 0: abbbbc
+    abbbc
+ 0: abbbc
+    abbc
+ 0: abbc
+    *** Failers
+No match
+    abc
+No match
+    abbbbbc
+No match
+
+/([^.]*)\.([^:]*):[T ]+(.*)/
+    track1.title:TBlah blah blah
+ 0: track1.title:TBlah blah blah
+ 1: track1.title:TBlah blah bla
+ 2: track1.title:TBlah blah bl
+ 3: track1.title:TBlah blah b
+ 4: track1.title:TBlah blah 
+ 5: track1.title:TBlah blah
+ 6: track1.title:TBlah bla
+ 7: track1.title:TBlah bl
+ 8: track1.title:TBlah b
+ 9: track1.title:TBlah 
+10: track1.title:TBlah
+11: track1.title:TBla
+12: track1.title:TBl
+13: track1.title:TB
+14: track1.title:T
+
+/([^.]*)\.([^:]*):[T ]+(.*)/i
+    track1.title:TBlah blah blah
+ 0: track1.title:TBlah blah blah
+ 1: track1.title:TBlah blah bla
+ 2: track1.title:TBlah blah bl
+ 3: track1.title:TBlah blah b
+ 4: track1.title:TBlah blah 
+ 5: track1.title:TBlah blah
+ 6: track1.title:TBlah bla
+ 7: track1.title:TBlah bl
+ 8: track1.title:TBlah b
+ 9: track1.title:TBlah 
+10: track1.title:TBlah
+11: track1.title:TBla
+12: track1.title:TBl
+13: track1.title:TB
+14: track1.title:T
+
+/([^.]*)\.([^:]*):[t ]+(.*)/i
+    track1.title:TBlah blah blah
+ 0: track1.title:TBlah blah blah
+ 1: track1.title:TBlah blah bla
+ 2: track1.title:TBlah blah bl
+ 3: track1.title:TBlah blah b
+ 4: track1.title:TBlah blah 
+ 5: track1.title:TBlah blah
+ 6: track1.title:TBlah bla
+ 7: track1.title:TBlah bl
+ 8: track1.title:TBlah b
+ 9: track1.title:TBlah 
+10: track1.title:TBlah
+11: track1.title:TBla
+12: track1.title:TBl
+13: track1.title:TB
+14: track1.title:T
+
+/^[W-c]+$/
+    WXY_^abc
+ 0: WXY_^abc
+    *** Failers
+No match
+    wxy
+No match
+
+/^[W-c]+$/i
+    WXY_^abc
+ 0: WXY_^abc
+    wxy_^ABC
+ 0: wxy_^ABC
+
+/^[\x3f-\x5F]+$/i
+    WXY_^abc
+ 0: WXY_^abc
+    wxy_^ABC
+ 0: wxy_^ABC
+
+/^abc$/m
+    abc
+ 0: abc
+    qqq\nabc
+ 0: abc
+    abc\nzzz
+ 0: abc
+    qqq\nabc\nzzz
+ 0: abc
+
+/^abc$/
+    abc
+ 0: abc
+    *** Failers
+No match
+    qqq\nabc
+No match
+    abc\nzzz
+No match
+    qqq\nabc\nzzz
+No match
+
+/\Aabc\Z/m
+    abc
+ 0: abc
+    abc\n 
+ 0: abc
+    *** Failers
+No match
+    qqq\nabc
+No match
+    abc\nzzz
+No match
+    qqq\nabc\nzzz
+No match
+    
+/\A(.)*\Z/s
+    abc\ndef
+ 0: abc\x0adef
+
+/\A(.)*\Z/m
+    *** Failers
+ 0: *** Failers
+    abc\ndef
+No match
+
+/(?:b)|(?::+)/
+    b::c
+ 0: b
+    c::b
+ 0: ::
+ 1: :
+
+/[-az]+/
+    az-
+ 0: az-
+ 1: az
+ 2: a
+    *** Failers
+ 0: a
+    b
+No match
+
+/[az-]+/
+    za-
+ 0: za-
+ 1: za
+ 2: z
+    *** Failers
+ 0: a
+    b
+No match
+
+/[a\-z]+/
+    a-z
+ 0: a-z
+ 1: a-
+ 2: a
+    *** Failers
+ 0: a
+    b
+No match
+
+/[a-z]+/
+    abcdxyz
+ 0: abcdxyz
+ 1: abcdxy
+ 2: abcdx
+ 3: abcd
+ 4: abc
+ 5: ab
+ 6: a
+
+/[\d-]+/
+    12-34
+ 0: 12-34
+ 1: 12-3
+ 2: 12-
+ 3: 12
+ 4: 1
+    *** Failers
+No match
+    aaa
+No match
+
+/[\d-z]+/
+    12-34z
+ 0: 12-34z
+ 1: 12-34
+ 2: 12-3
+ 3: 12-
+ 4: 12
+ 5: 1
+    *** Failers
+No match
+    aaa
+No match
+
+/\x5c/
+    \\
+ 0: \
+
+/\x20Z/
+    the Zoo
+ 0:  Z
+    *** Failers
+No match
+    Zulu
+No match
+
+/ab{3cd/
+    ab{3cd
+ 0: ab{3cd
+
+/ab{3,cd/
+    ab{3,cd
+ 0: ab{3,cd
+
+/ab{3,4a}cd/
+    ab{3,4a}cd
+ 0: ab{3,4a}cd
+
+/{4,5a}bc/
+    {4,5a}bc
+ 0: {4,5a}bc
+
+/^a.b/
+    a\rb
+ 0: a\x0db
+    *** Failers
+No match
+    a\nb
+No match
+
+/abc$/
+    abc
+ 0: abc
+    abc\n
+ 0: abc
+    *** Failers
+No match
+    abc\ndef
+No match
+
+/(abc)\123/
+    abc\x53
+ 0: abcS
+
+/(abc)\223/
+    abc\x93
+ 0: abc\x93
+
+/(abc)\323/
+    abc\xd3
+ 0: abc\xd3
+
+/(abc)\500/
+    abc\x40
+ 0: abc@
+    abc\100
+ 0: abc@
+
+/(abc)\5000/
+    abc\x400
+ 0: abc@0
+    abc\x40\x30
+ 0: abc@0
+    abc\1000
+ 0: abc@0
+    abc\100\x30
+ 0: abc@0
+    abc\100\060
+ 0: abc@0
+    abc\100\60
+ 0: abc@0
+
+/abc\81/
+    abc\081
+ 0: abc\x0081
+    abc\0\x38\x31
+ 0: abc\x0081
+
+/abc\91/
+    abc\091
+ 0: abc\x0091
+    abc\0\x39\x31
+ 0: abc\x0091
+
+/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
+    abcdefghijk\12S
+ 0: abcdefghijk\x0aS
+
+/ab\gdef/
+    abgdef
+ 0: abgdef
+
+/a{0}bc/
+    bc
+ 0: bc
+
+/(a|(bc)){0,0}?xyz/
+    xyz
+ 0: xyz
+
+/abc[\10]de/
+    abc\010de
+ 0: abc\x08de
+
+/abc[\1]de/
+    abc\1de
+ 0: abc\x01de
+
+/(abc)[\1]de/
+    abc\1de
+ 0: abc\x01de
+
+/(?s)a.b/
+    a\nb
+ 0: a\x0ab
+
+/^([^a])([^\b])([^c]*)([^d]{3,4})/
+    baNOTccccd
+ 0: baNOTcccc
+ 1: baNOTccc
+ 2: baNOTcc
+ 3: baNOTc
+ 4: baNOT
+    baNOTcccd
+ 0: baNOTccc
+ 1: baNOTcc
+ 2: baNOTc
+ 3: baNOT
+    baNOTccd
+ 0: baNOTcc
+ 1: baNOTc
+ 2: baNOT
+    bacccd
+ 0: baccc
+    *** Failers
+ 0: *** Failers
+ 1: *** Failer
+ 2: *** Faile
+ 3: *** Fail
+ 4: *** Fai
+ 5: *** Fa
+ 6: *** F
+    anything
+No match
+    b\bc   
+No match
+    baccd
+No match
+
+/[^a]/
+    Abc
+ 0: A
+  
+/[^a]/i
+    Abc 
+ 0: b
+
+/[^a]+/
+    AAAaAbc
+ 0: AAA
+ 1: AA
+ 2: A
+  
+/[^a]+/i
+    AAAaAbc 
+ 0: bc
+ 1: b
+
+/[^a]+/
+    bbb\nccc
+ 0: bbb\x0accc
+ 1: bbb\x0acc
+ 2: bbb\x0ac
+ 3: bbb\x0a
+ 4: bbb
+ 5: bb
+ 6: b
+   
+/[^k]$/
+    abc
+ 0: c
+    *** Failers
+ 0: s
+    abk   
+No match
+   
+/[^k]{2,3}$/
+    abc
+ 0: abc
+    kbc
+ 0: bc
+    kabc 
+ 0: abc
+    *** Failers
+ 0: ers
+    abk
+No match
+    akb
+No match
+    akk 
+No match
+
+/^\d{8,}\@.+[^k]$/
+    12345678\@a.b.c.d
+ 0: 12345678@a.b.c.d
+    123456789\@x.y.z
+ 0: 123456789@x.y.z
+    *** Failers
+No match
+    12345678\@x.y.uk
+No match
+    1234567\@a.b.c.d       
+No match
+
+/[^a]/
+    aaaabcd
+ 0: b
+    aaAabcd 
+ 0: A
+
+/[^a]/i
+    aaaabcd
+ 0: b
+    aaAabcd 
+ 0: b
+
+/[^az]/
+    aaaabcd
+ 0: b
+    aaAabcd 
+ 0: A
+
+/[^az]/i
+    aaaabcd
+ 0: b
+    aaAabcd 
+ 0: b
+
+/\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377/
+ \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377
+ 0: \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff
+
+/P[^*]TAIRE[^*]{1,6}?LL/
+    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
+ 0: PSTAIREISLL
+
+/P[^*]TAIRE[^*]{1,}?LL/
+    xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
+ 0: PSTAIREISLL
+
+/(\.\d\d[1-9]?)\d+/
+    1.230003938
+ 0: .230003938
+ 1: .23000393
+ 2: .2300039
+ 3: .230003
+ 4: .23000
+ 5: .2300
+ 6: .230
+    1.875000282   
+ 0: .875000282
+ 1: .87500028
+ 2: .8750002
+ 3: .875000
+ 4: .87500
+ 5: .8750
+ 6: .875
+    1.235  
+ 0: .235
+                  
+/(\.\d\d((?=0)|\d(?=\d)))/
+    1.230003938      
+ 0: .230
+ 1: .23
+    1.875000282
+ 0: .875
+    *** Failers 
+No match
+    1.235 
+No match
+    
+/a(?)b/
+    ab 
+ 0: ab
+ 
+/\b(foo)\s+(\w+)/i
+    Food is on the foo table
+ 0: foo table
+ 1: foo tabl
+ 2: foo tab
+ 3: foo ta
+ 4: foo t
+    
+/foo(.*)bar/
+    The food is under the bar in the barn.
+ 0: food is under the bar in the bar
+ 1: food is under the bar
+    
+/foo(.*?)bar/  
+    The food is under the bar in the barn.
+ 0: food is under the bar in the bar
+ 1: food is under the bar
+
+/(.*)(\d*)/
+    I have 2 numbers: 53147
+Matched, but too many subsidiary matches
+ 0: I have 2 numbers: 53147
+ 1: I have 2 numbers: 5314
+ 2: I have 2 numbers: 531
+ 3: I have 2 numbers: 53
+ 4: I have 2 numbers: 5
+ 5: I have 2 numbers: 
+ 6: I have 2 numbers:
+ 7: I have 2 numbers
+ 8: I have 2 number
+ 9: I have 2 numbe
+10: I have 2 numb
+11: I have 2 num
+12: I have 2 nu
+13: I have 2 n
+14: I have 2 
+15: I have 2
+16: I have 
+17: I have
+18: I hav
+19: I ha
+20: I h
+21: I 
+    
+/(.*)(\d+)/
+    I have 2 numbers: 53147
+ 0: I have 2 numbers: 53147
+ 1: I have 2 numbers: 5314
+ 2: I have 2 numbers: 531
+ 3: I have 2 numbers: 53
+ 4: I have 2 numbers: 5
+ 5: I have 2
+ 
+/(.*?)(\d*)/
+    I have 2 numbers: 53147
+Matched, but too many subsidiary matches
+ 0: I have 2 numbers: 53147
+ 1: I have 2 numbers: 5314
+ 2: I have 2 numbers: 531
+ 3: I have 2 numbers: 53
+ 4: I have 2 numbers: 5
+ 5: I have 2 numbers: 
+ 6: I have 2 numbers:
+ 7: I have 2 numbers
+ 8: I have 2 number
+ 9: I have 2 numbe
+10: I have 2 numb
+11: I have 2 num
+12: I have 2 nu
+13: I have 2 n
+14: I have 2 
+15: I have 2
+16: I have 
+17: I have
+18: I hav
+19: I ha
+20: I h
+21: I 
+
+/(.*?)(\d+)/
+    I have 2 numbers: 53147
+ 0: I have 2 numbers: 53147
+ 1: I have 2 numbers: 5314
+ 2: I have 2 numbers: 531
+ 3: I have 2 numbers: 53
+ 4: I have 2 numbers: 5
+ 5: I have 2
+
+/(.*)(\d+)$/
+    I have 2 numbers: 53147
+ 0: I have 2 numbers: 53147
+
+/(.*?)(\d+)$/
+    I have 2 numbers: 53147
+ 0: I have 2 numbers: 53147
+
+/(.*)\b(\d+)$/
+    I have 2 numbers: 53147
+ 0: I have 2 numbers: 53147
+
+/(.*\D)(\d+)$/
+    I have 2 numbers: 53147
+ 0: I have 2 numbers: 53147
+
+/^\D*(?!123)/
+    ABC123
+ 0: AB
+ 1: A
+ 2: 
+     
+/^(\D*)(?=\d)(?!123)/
+    ABC445
+ 0: ABC
+    *** Failers
+No match
+    ABC123
+No match
+    
+/^[W-]46]/
+    W46]789 
+ 0: W46]
+    -46]789
+ 0: -46]
+    *** Failers
+No match
+    Wall
+No match
+    Zebra
+No match
+    42
+No match
+    [abcd] 
+No match
+    ]abcd[
+No match
+       
+/^[W-\]46]/
+    W46]789 
+ 0: W
+    Wall
+ 0: W
+    Zebra
+ 0: Z
+    Xylophone  
+ 0: X
+    42
+ 0: 4
+    [abcd] 
+ 0: [
+    ]abcd[
+ 0: ]
+    \\backslash 
+ 0: \
+    *** Failers
+No match
+    -46]789
+No match
+    well
+No match
+    
+/\d\d\/\d\d\/\d\d\d\d/
+    01/01/2000
+ 0: 01/01/2000
+
+/word (?:[a-zA-Z0-9]+ ){0,10}otherword/
+  word cat dog elephant mussel cow horse canary baboon snake shark otherword
+ 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword
+  word cat dog elephant mussel cow horse canary baboon snake shark
+No match
+
+/word (?:[a-zA-Z0-9]+ ){0,300}otherword/
+  word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
+No match
+
+/^(a){0,0}/
+    bcd
+ 0: 
+    abc
+ 0: 
+    aab     
+ 0: 
+
+/^(a){0,1}/
+    bcd
+ 0: 
+    abc
+ 0: a
+ 1: 
+    aab  
+ 0: a
+ 1: 
+
+/^(a){0,2}/
+    bcd
+ 0: 
+    abc
+ 0: a
+ 1: 
+    aab  
+ 0: aa
+ 1: a
+ 2: 
+
+/^(a){0,3}/
+    bcd
+ 0: 
+    abc
+ 0: a
+ 1: 
+    aab
+ 0: aa
+ 1: a
+ 2: 
+    aaa   
+ 0: aaa
+ 1: aa
+ 2: a
+ 3: 
+
+/^(a){0,}/
+    bcd
+ 0: 
+    abc
+ 0: a
+ 1: 
+    aab
+ 0: aa
+ 1: a
+ 2: 
+    aaa
+ 0: aaa
+ 1: aa
+ 2: a
+ 3: 
+    aaaaaaaa    
+ 0: aaaaaaaa
+ 1: aaaaaaa
+ 2: aaaaaa
+ 3: aaaaa
+ 4: aaaa
+ 5: aaa
+ 6: aa
+ 7: a
+ 8: 
+
+/^(a){1,1}/
+    bcd
+No match
+    abc
+ 0: a
+    aab  
+ 0: a
+
+/^(a){1,2}/
+    bcd
+No match
+    abc
+ 0: a
+    aab  
+ 0: aa
+ 1: a
+
+/^(a){1,3}/
+    bcd
+No match
+    abc
+ 0: a
+    aab
+ 0: aa
+ 1: a
+    aaa   
+ 0: aaa
+ 1: aa
+ 2: a
+
+/^(a){1,}/
+    bcd
+No match
+    abc
+ 0: a
+    aab
+ 0: aa
+ 1: a
+    aaa
+ 0: aaa
+ 1: aa
+ 2: a
+    aaaaaaaa    
+ 0: aaaaaaaa
+ 1: aaaaaaa
+ 2: aaaaaa
+ 3: aaaaa
+ 4: aaaa
+ 5: aaa
+ 6: aa
+ 7: a
+
+/.*\.gif/
+    borfle\nbib.gif\nno
+ 0: bib.gif
+
+/.{0,}\.gif/
+    borfle\nbib.gif\nno
+ 0: bib.gif
+
+/.*\.gif/m
+    borfle\nbib.gif\nno
+ 0: bib.gif
+
+/.*\.gif/s
+    borfle\nbib.gif\nno
+ 0: borfle\x0abib.gif
+
+/.*\.gif/ms
+    borfle\nbib.gif\nno
+ 0: borfle\x0abib.gif
+    
+/.*$/
+    borfle\nbib.gif\nno
+ 0: no
+
+/.*$/m
+    borfle\nbib.gif\nno
+ 0: borfle
+
+/.*$/s
+    borfle\nbib.gif\nno
+ 0: borfle\x0abib.gif\x0ano
+
+/.*$/ms
+    borfle\nbib.gif\nno
+ 0: borfle\x0abib.gif\x0ano
+ 1: borfle\x0abib.gif
+ 2: borfle
+    
+/.*$/
+    borfle\nbib.gif\nno\n
+ 0: no
+
+/.*$/m
+    borfle\nbib.gif\nno\n
+ 0: borfle
+
+/.*$/s
+    borfle\nbib.gif\nno\n
+ 0: borfle\x0abib.gif\x0ano\x0a
+ 1: borfle\x0abib.gif\x0ano
+
+/.*$/ms
+    borfle\nbib.gif\nno\n
+ 0: borfle\x0abib.gif\x0ano\x0a
+ 1: borfle\x0abib.gif\x0ano
+ 2: borfle\x0abib.gif
+ 3: borfle
+    
+/(.*X|^B)/
+    abcde\n1234Xyz
+ 0: 1234X
+    BarFoo 
+ 0: B
+    *** Failers
+No match
+    abcde\nBar  
+No match
+
+/(.*X|^B)/m
+    abcde\n1234Xyz
+ 0: 1234X
+    BarFoo 
+ 0: B
+    abcde\nBar  
+ 0: B
+
+/(.*X|^B)/s
+    abcde\n1234Xyz
+ 0: abcde\x0a1234X
+    BarFoo 
+ 0: B
+    *** Failers
+No match
+    abcde\nBar  
+No match
+
+/(.*X|^B)/ms
+    abcde\n1234Xyz
+ 0: abcde\x0a1234X
+    BarFoo 
+ 0: B
+    abcde\nBar  
+ 0: B
+
+/(?s)(.*X|^B)/
+    abcde\n1234Xyz
+ 0: abcde\x0a1234X
+    BarFoo 
+ 0: B
+    *** Failers 
+No match
+    abcde\nBar  
+No match
+
+/(?s:.*X|^B)/
+    abcde\n1234Xyz
+ 0: abcde\x0a1234X
+    BarFoo 
+ 0: B
+    *** Failers 
+No match
+    abcde\nBar  
+No match
+
+/^.*B/
+    **** Failers
+No match
+    abc\nB
+No match
+     
+/(?s)^.*B/
+    abc\nB
+ 0: abc\x0aB
+
+/(?m)^.*B/
+    abc\nB
+ 0: B
+     
+/(?ms)^.*B/
+    abc\nB
+ 0: abc\x0aB
+
+/(?ms)^B/
+    abc\nB
+ 0: B
+
+/(?s)B$/
+    B\n
+ 0: B
+
+/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
+    123456654321
+ 0: 123456654321
+  
+/^\d\d\d\d\d\d\d\d\d\d\d\d/
+    123456654321 
+ 0: 123456654321
+
+/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/
+    123456654321
+ 0: 123456654321
+  
+/^[abc]{12}/
+    abcabcabcabc
+ 0: abcabcabcabc
+    
+/^[a-c]{12}/
+    abcabcabcabc
+ 0: abcabcabcabc
+    
+/^(a|b|c){12}/
+    abcabcabcabc 
+ 0: abcabcabcabc
+
+/^[abcdefghijklmnopqrstuvwxy0123456789]/
+    n
+ 0: n
+    *** Failers 
+No match
+    z 
+No match
+
+/abcde{0,0}/
+    abcd
+ 0: abcd
+    *** Failers
+No match
+    abce  
+No match
+
+/ab[cd]{0,0}e/
+    abe
+ 0: abe
+    *** Failers
+No match
+    abcde 
+No match
+    
+/ab(c){0,0}d/
+    abd
+ 0: abd
+    *** Failers
+No match
+    abcd   
+No match
+
+/a(b*)/
+    a
+ 0: a
+    ab
+ 0: ab
+ 1: a
+    abbbb
+ 0: abbbb
+ 1: abbb
+ 2: abb
+ 3: ab
+ 4: a
+    *** Failers
+ 0: a
+    bbbbb    
+No match
+    
+/ab\d{0}e/
+    abe
+ 0: abe
+    *** Failers
+No match
+    ab1e   
+No match
+    
+/"([^\\"]+|\\.)*"/
+    the \"quick\" brown fox
+ 0: "quick"
+    \"the \\\"quick\\\" brown fox\" 
+ 0: "the \"quick\" brown fox"
+
+/.*?/g+
+    abc
+ 0: abc
+ 0+ 
+ 1: ab
+ 2: a
+ 3: 
+ 0: 
+ 0+ 
+  
+/\b/g+
+    abc 
+ 0: 
+ 0+ abc
+ 0: 
+ 0+ 
+
+/\b/+g
+    abc 
+ 0: 
+ 0+ abc
+ 0: 
+ 0+ 
+
+//g
+    abc
+ 0: 
+ 0: 
+ 0: 
+ 0: 
+
+/<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is
+  <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
+ 0: <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
+
+/a[^a]b/
+    acb
+ 0: acb
+    a\nb
+ 0: a\x0ab
+    
+/a.b/
+    acb
+ 0: acb
+    *** Failers 
+No match
+    a\nb   
+No match
+    
+/a[^a]b/s
+    acb
+ 0: acb
+    a\nb  
+ 0: a\x0ab
+    
+/a.b/s
+    acb
+ 0: acb
+    a\nb  
+ 0: a\x0ab
+
+/^(b+?|a){1,2}?c/
+    bac
+ 0: bac
+    bbac
+ 0: bbac
+    bbbac
+ 0: bbbac
+    bbbbac
+ 0: bbbbac
+    bbbbbac 
+ 0: bbbbbac
+
+/^(b+|a){1,2}?c/
+    bac
+ 0: bac
+    bbac
+ 0: bbac
+    bbbac
+ 0: bbbac
+    bbbbac
+ 0: bbbbac
+    bbbbbac 
+ 0: bbbbbac
+    
+/(?!\A)x/m
+    x\nb\n
+No match
+    a\bx\n  
+ 0: x
+    
+/\x0{ab}/
+    \0{ab} 
+ 0: \x00{ab}
+
+/(A|B)*?CD/
+    CD 
+ 0: CD
+    
+/(A|B)*CD/
+    CD 
+ 0: CD
+
+/(?<!bar)foo/
+    foo
+ 0: foo
+    catfood
+ 0: foo
+    arfootle
+ 0: foo
+    rfoosh
+ 0: foo
+    *** Failers
+No match
+    barfoo
+No match
+    towbarfoo
+No match
+
+/\w{3}(?<!bar)foo/
+    catfood
+ 0: catfoo
+    *** Failers
+No match
+    foo
+No match
+    barfoo
+No match
+    towbarfoo
+No match
+
+/(?<=(foo)a)bar/
+    fooabar
+ 0: bar
+    *** Failers
+No match
+    bar
+No match
+    foobbar
+No match
+      
+/\Aabc\z/m
+    abc
+ 0: abc
+    *** Failers
+No match
+    abc\n   
+No match
+    qqq\nabc
+No match
+    abc\nzzz
+No match
+    qqq\nabc\nzzz
+No match
+
+"(?>.*/)foo"
+    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
+No match
+
+"(?>.*/)foo"
+    /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
+ 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
+
+/(?>(\.\d\d[1-9]?))\d+/
+    1.230003938
+ 0: .230003938
+ 1: .23000393
+ 2: .2300039
+ 3: .230003
+ 4: .23000
+ 5: .2300
+ 6: .230
+    1.875000282
+ 0: .875000282
+ 1: .87500028
+ 2: .8750002
+ 3: .875000
+ 4: .87500
+ 5: .8750
+    *** Failers 
+No match
+    1.235 
+No match
+
+/^((?>\w+)|(?>\s+))*$/
+    now is the time for all good men to come to the aid of the party
+ 0: now is the time for all good men to come to the aid of the party
+    *** Failers
+No match
+    this is not a line with only words and spaces!
+No match
+    
+/(\d+)(\w)/
+    12345a
+ 0: 12345a
+ 1: 12345
+ 2: 1234
+ 3: 123
+ 4: 12
+    12345+ 
+ 0: 12345
+ 1: 1234
+ 2: 123
+ 3: 12
+
+/((?>\d+))(\w)/
+    12345a
+ 0: 12345a
+    *** Failers
+No match
+    12345+ 
+No match
+
+/(?>a+)b/
+    aaab
+ 0: aaab
+
+/((?>a+)b)/
+    aaab
+ 0: aaab
+
+/(?>(a+))b/
+    aaab
+ 0: aaab
+
+/(?>b)+/
+    aaabbbccc
+ 0: bbb
+ 1: bb
+ 2: b
+
+/(?>a+|b+|c+)*c/
+    aaabbbbccccd
+ 0: aaabbbbcccc
+ 1: aaabbbbc
+    
+/(a+|b+|c+)*c/
+    aaabbbbccccd
+ 0: aaabbbbcccc
+ 1: aaabbbbccc
+ 2: aaabbbbcc
+ 3: aaabbbbc
+
+/((?>[^()]+)|\([^()]*\))+/
+    ((abc(ade)ufh()()x
+ 0: abc(ade)ufh()()x
+ 1: abc(ade)ufh()()
+ 2: abc(ade)ufh()
+ 3: abc(ade)ufh
+ 4: abc(ade)
+ 5: abc
+    
+/\(((?>[^()]+)|\([^()]+\))+\)/ 
+    (abc)
+ 0: (abc)
+    (abc(def)xyz)
+ 0: (abc(def)xyz)
+    *** Failers
+No match
+    ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa   
+No match
+
+/a(?-i)b/i
+    ab
+ 0: ab
+    Ab
+ 0: Ab
+    *** Failers 
+No match
+    aB
+No match
+    AB
+No match
+        
+/(a (?x)b c)d e/
+    a bcd e
+ 0: a bcd e
+    *** Failers
+No match
+    a b cd e
+No match
+    abcd e   
+No match
+    a bcde 
+No match
+ 
+/(a b(?x)c d (?-x)e f)/
+    a bcde f
+ 0: a bcde f
+    *** Failers
+No match
+    abcdef  
+No match
+
+/(a(?i)b)c/
+    abc
+ 0: abc
+    aBc
+ 0: aBc
+    *** Failers
+No match
+    abC
+No match
+    aBC  
+No match
+    Abc
+No match
+    ABc
+No match
+    ABC
+No match
+    AbC
+No match
+    
+/a(?i:b)c/
+    abc
+ 0: abc
+    aBc
+ 0: aBc
+    *** Failers 
+No match
+    ABC
+No match
+    abC
+No match
+    aBC
+No match
+    
+/a(?i:b)*c/
+    aBc
+ 0: aBc
+    aBBc
+ 0: aBBc
+    *** Failers 
+No match
+    aBC
+No match
+    aBBC
+No match
+    
+/a(?=b(?i)c)\w\wd/
+    abcd
+ 0: abcd
+    abCd
+ 0: abCd
+    *** Failers
+No match
+    aBCd
+No match
+    abcD     
+No match
+    
+/(?s-i:more.*than).*million/i
+    more than million
+ 0: more than million
+    more than MILLION
+ 0: more than MILLION
+    more \n than Million 
+ 0: more \x0a than Million
+    *** Failers
+No match
+    MORE THAN MILLION    
+No match
+    more \n than \n million 
+No match
+
+/(?:(?s-i)more.*than).*million/i
+    more than million
+ 0: more than million
+    more than MILLION
+ 0: more than MILLION
+    more \n than Million 
+ 0: more \x0a than Million
+    *** Failers
+No match
+    MORE THAN MILLION    
+No match
+    more \n than \n million 
+No match
+    
+/(?>a(?i)b+)+c/ 
+    abc
+ 0: abc
+    aBbc
+ 0: aBbc
+    aBBc 
+ 0: aBBc
+    *** Failers
+No match
+    Abc
+No match
+    abAb    
+No match
+    abbC 
+No match
+    
+/(?=a(?i)b)\w\wc/
+    abc
+ 0: abc
+    aBc
+ 0: aBc
+    *** Failers
+No match
+    Ab 
+No match
+    abC
+No match
+    aBC     
+No match
+    
+/(?<=a(?i)b)(\w\w)c/
+    abxxc
+ 0: xxc
+    aBxxc
+ 0: xxc
+    *** Failers
+No match
+    Abxxc
+No match
+    ABxxc
+No match
+    abxxC      
+No match
+
+/^(?(?=abc)\w{3}:|\d\d)$/
+    abc:
+ 0: abc:
+    12
+ 0: 12
+    *** Failers
+No match
+    123
+No match
+    xyz    
+No match
+
+/^(?(?!abc)\d\d|\w{3}:)$/
+    abc:
+ 0: abc:
+    12
+ 0: 12
+    *** Failers
+No match
+    123
+No match
+    xyz    
+No match
+    
+/(?(?<=foo)bar|cat)/
+    foobar
+ 0: bar
+    cat
+ 0: cat
+    fcat
+ 0: cat
+    focat   
+ 0: cat
+    *** Failers
+No match
+    foocat  
+No match
+
+/(?(?<!foo)cat|bar)/
+    foobar
+ 0: bar
+    cat
+ 0: cat
+    fcat
+ 0: cat
+    focat   
+ 0: cat
+    *** Failers
+No match
+    foocat  
+No match
+
+/(?>a*)*/
+    a
+ 0: a
+ 1: 
+    aa
+ 0: aa
+ 1: 
+    aaaa
+ 0: aaaa
+ 1: 
+    
+/(abc|)+/
+    abc
+ 0: abc
+ 1: 
+    abcabc
+ 0: abcabc
+ 1: abc
+ 2: 
+    abcabcabc
+ 0: abcabcabc
+ 1: abcabc
+ 2: abc
+ 3: 
+    xyz      
+ 0: 
+
+/([a]*)*/
+    a
+ 0: a
+ 1: 
+    aaaaa 
+ 0: aaaaa
+ 1: aaaa
+ 2: aaa
+ 3: aa
+ 4: a
+ 5: 
+ 
+/([ab]*)*/
+    a
+ 0: a
+ 1: 
+    b
+ 0: b
+ 1: 
+    ababab
+ 0: ababab
+ 1: ababa
+ 2: abab
+ 3: aba
+ 4: ab
+ 5: a
+ 6: 
+    aaaabcde
+ 0: aaaab
+ 1: aaaa
+ 2: aaa
+ 3: aa
+ 4: a
+ 5: 
+    bbbb    
+ 0: bbbb
+ 1: bbb
+ 2: bb
+ 3: b
+ 4: 
+ 
+/([^a]*)*/
+    b
+ 0: b
+ 1: 
+    bbbb
+ 0: bbbb
+ 1: bbb
+ 2: bb
+ 3: b
+ 4: 
+    aaa   
+ 0: 
+ 
+/([^ab]*)*/
+    cccc
+ 0: cccc
+ 1: ccc
+ 2: cc
+ 3: c
+ 4: 
+    abab  
+ 0: 
+ 
+/([a]*?)*/
+    a
+ 0: a
+ 1: 
+    aaaa 
+ 0: aaaa
+ 1: aaa
+ 2: aa
+ 3: a
+ 4: 
+ 
+/([ab]*?)*/
+    a
+ 0: a
+ 1: 
+    b
+ 0: b
+ 1: 
+    abab
+ 0: abab
+ 1: aba
+ 2: ab
+ 3: a
+ 4: 
+    baba   
+ 0: baba
+ 1: bab
+ 2: ba
+ 3: b
+ 4: 
+ 
+/([^a]*?)*/
+    b
+ 0: b
+ 1: 
+    bbbb
+ 0: bbbb
+ 1: bbb
+ 2: bb
+ 3: b
+ 4: 
+    aaa   
+ 0: 
+ 
+/([^ab]*?)*/
+    c
+ 0: c
+ 1: 
+    cccc
+ 0: cccc
+ 1: ccc
+ 2: cc
+ 3: c
+ 4: 
+    baba   
+ 0: 
+ 
+/(?>a*)*/
+    a
+ 0: a
+ 1: 
+    aaabcde 
+ 0: aaa
+ 1: 
+ 
+/((?>a*))*/
+    aaaaa
+ 0: aaaaa
+ 1: 
+    aabbaa 
+ 0: aa
+ 1: 
+ 
+/((?>a*?))*/
+    aaaaa
+ 0: aaaaa
+ 1: 
+    aabbaa 
+ 0: aa
+ 1: 
+
+/(?(?=[^a-z]+[a-z])  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} ) /x
+    12-sep-98
+ 0: 12-sep-98
+    12-09-98
+ 0: 12-09-98
+    *** Failers
+No match
+    sep-12-98
+No match
+        
+/(?i:saturday|sunday)/
+    saturday
+ 0: saturday
+    sunday
+ 0: sunday
+    Saturday
+ 0: Saturday
+    Sunday
+ 0: Sunday
+    SATURDAY
+ 0: SATURDAY
+    SUNDAY
+ 0: SUNDAY
+    SunDay
+ 0: SunDay
+    
+/(a(?i)bc|BB)x/
+    abcx
+ 0: abcx
+    aBCx
+ 0: aBCx
+    bbx
+ 0: bbx
+    BBx
+ 0: BBx
+    *** Failers
+No match
+    abcX
+No match
+    aBCX
+No match
+    bbX
+No match
+    BBX               
+No match
+
+/^([ab](?i)[cd]|[ef])/
+    ac
+ 0: ac
+    aC
+ 0: aC
+    bD
+ 0: bD
+    elephant
+ 0: e
+    Europe 
+ 0: E
+    frog
+ 0: f
+    France
+ 0: F
+    *** Failers
+No match
+    Africa     
+No match
+
+/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
+    ab
+ 0: ab
+    aBd
+ 0: aBd
+    xy
+ 0: xy
+    xY
+ 0: xY
+    zebra
+ 0: z
+    Zambesi
+ 0: Z
+    *** Failers
+No match
+    aCD  
+No match
+    XY  
+No match
+
+/(?<=foo\n)^bar/m
+    foo\nbar
+ 0: bar
+    *** Failers
+No match
+    bar
+No match
+    baz\nbar   
+No match
+
+/(?<=(?<!foo)bar)baz/
+    barbaz
+ 0: baz
+    barbarbaz 
+ 0: baz
+    koobarbaz 
+ 0: baz
+    *** Failers
+No match
+    baz
+No match
+    foobarbaz 
+No match
+
+/The following tests are taken from the Perl 5.005 test suite; some of them/
+/are compatible with 5.004, but I'd rather not have to sort them out./
+No match
+
+/abc/
+    abc
+ 0: abc
+    xabcy
+ 0: abc
+    ababc
+ 0: abc
+    *** Failers
+No match
+    xbc
+No match
+    axc
+No match
+    abx
+No match
+
+/ab*c/
+    abc
+ 0: abc
+
+/ab*bc/
+    abc
+ 0: abc
+    abbc
+ 0: abbc
+    abbbbc
+ 0: abbbbc
+
+/.{1}/
+    abbbbc
+ 0: a
+
+/.{3,4}/
+    abbbbc
+ 0: abbb
+ 1: abb
+
+/ab{0,}bc/
+    abbbbc
+ 0: abbbbc
+
+/ab+bc/
+    abbc
+ 0: abbc
+    *** Failers
+No match
+    abc
+No match
+    abq
+No match
+
+/ab{1,}bc/
+
+/ab+bc/
+    abbbbc
+ 0: abbbbc
+
+/ab{1,}bc/
+    abbbbc
+ 0: abbbbc
+
+/ab{1,3}bc/
+    abbbbc
+ 0: abbbbc
+
+/ab{3,4}bc/
+    abbbbc
+ 0: abbbbc
+
+/ab{4,5}bc/
+    *** Failers
+No match
+    abq
+No match
+    abbbbc
+No match
+
+/ab?bc/
+    abbc
+ 0: abbc
+    abc
+ 0: abc
+
+/ab{0,1}bc/
+    abc
+ 0: abc
+
+/ab?bc/
+
+/ab?c/
+    abc
+ 0: abc
+
+/ab{0,1}c/
+    abc
+ 0: abc
+
+/^abc$/
+    abc
+ 0: abc
+    *** Failers
+No match
+    abbbbc
+No match
+    abcc
+No match
+
+/^abc/
+    abcc
+ 0: abc
+
+/^abc$/
+
+/abc$/
+    aabc
+ 0: abc
+    *** Failers
+No match
+    aabc
+ 0: abc
+    aabcd
+No match
+
+/^/
+    abc
+ 0: 
+
+/$/
+    abc
+ 0: 
+
+/a.c/
+    abc
+ 0: abc
+    axc
+ 0: axc
+
+/a.*c/
+    axyzc
+ 0: axyzc
+
+/a[bc]d/
+    abd
+ 0: abd
+    *** Failers
+No match
+    axyzd
+No match
+    abc
+No match
+
+/a[b-d]e/
+    ace
+ 0: ace
+
+/a[b-d]/
+    aac
+ 0: ac
+
+/a[-b]/
+    a-
+ 0: a-
+
+/a[b-]/
+    a-
+ 0: a-
+
+/a]/
+    a]
+ 0: a]
+
+/a[]]b/
+    a]b
+ 0: a]b
+
+/a[^bc]d/
+    aed
+ 0: aed
+    *** Failers
+No match
+    abd
+No match
+    abd
+No match
+
+/a[^-b]c/
+    adc
+ 0: adc
+
+/a[^]b]c/
+    adc
+ 0: adc
+    *** Failers
+No match
+    a-c
+ 0: a-c
+    a]c
+No match
+
+/\ba\b/
+    a-
+ 0: a
+    -a
+ 0: a
+    -a-
+ 0: a
+
+/\by\b/
+    *** Failers
+No match
+    xy
+No match
+    yz
+No match
+    xyz
+No match
+
+/\Ba\B/
+    *** Failers
+ 0: a
+    a-
+No match
+    -a
+No match
+    -a-
+No match
+
+/\By\b/
+    xy
+ 0: y
+
+/\by\B/
+    yz
+ 0: y
+
+/\By\B/
+    xyz
+ 0: y
+
+/\w/
+    a
+ 0: a
+
+/\W/
+    -
+ 0: -
+    *** Failers
+ 0: *
+    -
+ 0: -
+    a
+No match
+
+/a\sb/
+    a b
+ 0: a b
+
+/a\Sb/
+    a-b
+ 0: a-b
+    *** Failers
+No match
+    a-b
+ 0: a-b
+    a b
+No match
+
+/\d/
+    1
+ 0: 1
+
+/\D/
+    -
+ 0: -
+    *** Failers
+ 0: *
+    -
+ 0: -
+    1
+No match
+
+/[\w]/
+    a
+ 0: a
+
+/[\W]/
+    -
+ 0: -
+    *** Failers
+ 0: *
+    -
+ 0: -
+    a
+No match
+
+/a[\s]b/
+    a b
+ 0: a b
+
+/a[\S]b/
+    a-b
+ 0: a-b
+    *** Failers
+No match
+    a-b
+ 0: a-b
+    a b
+No match
+
+/[\d]/
+    1
+ 0: 1
+
+/[\D]/
+    -
+ 0: -
+    *** Failers
+ 0: *
+    -
+ 0: -
+    1
+No match
+
+/ab|cd/
+    abc
+ 0: ab
+    abcd
+ 0: ab
+
+/()ef/
+    def
+ 0: ef
+
+/$b/
+
+/a\(b/
+    a(b
+ 0: a(b
+
+/a\(*b/
+    ab
+ 0: ab
+    a((b
+ 0: a((b
+
+/a\\b/
+    a\b
+No match
+
+/((a))/
+    abc
+ 0: a
+
+/(a)b(c)/
+    abc
+ 0: abc
+
+/a+b+c/
+    aabbabc
+ 0: abc
+
+/a{1,}b{1,}c/
+    aabbabc
+ 0: abc
+
+/a.+?c/
+    abcabc
+ 0: abcabc
+ 1: abc
+
+/(a+|b)*/
+    ab
+ 0: ab
+ 1: a
+ 2: 
+
+/(a+|b){0,}/
+    ab
+ 0: ab
+ 1: a
+ 2: 
+
+/(a+|b)+/
+    ab
+ 0: ab
+ 1: a
+
+/(a+|b){1,}/
+    ab
+ 0: ab
+ 1: a
+
+/(a+|b)?/
+    ab
+ 0: a
+ 1: 
+
+/(a+|b){0,1}/
+    ab
+ 0: a
+ 1: 
+
+/[^ab]*/
+    cde
+ 0: cde
+ 1: cd
+ 2: c
+ 3: 
+
+/abc/
+    *** Failers
+No match
+    b
+No match
+    
+
+/a*/
+    
+
+/([abc])*d/
+    abbbcd
+ 0: abbbcd
+
+/([abc])*bcd/
+    abcd
+ 0: abcd
+
+/a|b|c|d|e/
+    e
+ 0: e
+
+/(a|b|c|d|e)f/
+    ef
+ 0: ef
+
+/abcd*efg/
+    abcdefg
+ 0: abcdefg
+
+/ab*/
+    xabyabbbz
+ 0: ab
+ 1: a
+    xayabbbz
+ 0: a
+
+/(ab|cd)e/
+    abcde
+ 0: cde
+
+/[abhgefdc]ij/
+    hij
+ 0: hij
+
+/^(ab|cd)e/
+
+/(abc|)ef/
+    abcdef
+ 0: ef
+
+/(a|b)c*d/
+    abcd
+ 0: bcd
+
+/(ab|ab*)bc/
+    abc
+ 0: abc
+
+/a([bc]*)c*/
+    abc
+ 0: abc
+ 1: ab
+ 2: a
+
+/a([bc]*)(c*d)/
+    abcd
+ 0: abcd
+
+/a([bc]+)(c*d)/
+    abcd
+ 0: abcd
+
+/a([bc]*)(c+d)/
+    abcd
+ 0: abcd
+
+/a[bcd]*dcdcde/
+    adcdcde
+ 0: adcdcde
+
+/a[bcd]+dcdcde/
+    *** Failers
+No match
+    abcde
+No match
+    adcdcde
+No match
+
+/(ab|a)b*c/
+    abc
+ 0: abc
+
+/((a)(b)c)(d)/
+    abcd
+ 0: abcd
+
+/[a-zA-Z_][a-zA-Z0-9_]*/
+    alpha
+ 0: alpha
+ 1: alph
+ 2: alp
+ 3: al
+ 4: a
+
+/^a(bc+|b[eh])g|.h$/
+    abh
+ 0: bh
+
+/(bc+d$|ef*g.|h?i(j|k))/
+    effgz
+ 0: effgz
+    ij
+ 0: ij
+    reffgz
+ 0: effgz
+    *** Failers
+No match
+    effg
+No match
+    bcdd
+No match
+
+/((((((((((a))))))))))/
+    a
+ 0: a
+
+/(((((((((a)))))))))/
+    a
+ 0: a
+
+/multiple words of text/
+    *** Failers
+No match
+    aa
+No match
+    uh-uh
+No match
+
+/multiple words/
+    multiple words, yeah
+ 0: multiple words
+
+/(.*)c(.*)/
+    abcde
+ 0: abcde
+ 1: abcd
+ 2: abc
+
+/\((.*), (.*)\)/
+    (a, b)
+ 0: (a, b)
+
+/[k]/
+
+/abcd/
+    abcd
+ 0: abcd
+
+/a(bc)d/
+    abcd
+ 0: abcd
+
+/a[-]?c/
+    ac
+ 0: ac
+
+/abc/i
+    ABC
+ 0: ABC
+    XABCY
+ 0: ABC
+    ABABC
+ 0: ABC
+    *** Failers
+No match
+    aaxabxbaxbbx
+No match
+    XBC
+No match
+    AXC
+No match
+    ABX
+No match
+
+/ab*c/i
+    ABC
+ 0: ABC
+
+/ab*bc/i
+    ABC
+ 0: ABC
+    ABBC
+ 0: ABBC
+
+/ab*?bc/i
+    ABBBBC
+ 0: ABBBBC
+
+/ab{0,}?bc/i
+    ABBBBC
+ 0: ABBBBC
+
+/ab+?bc/i
+    ABBC
+ 0: ABBC
+
+/ab+bc/i
+    *** Failers
+No match
+    ABC
+No match
+    ABQ
+No match
+
+/ab{1,}bc/i
+
+/ab+bc/i
+    ABBBBC
+ 0: ABBBBC
+
+/ab{1,}?bc/i
+    ABBBBC
+ 0: ABBBBC
+
+/ab{1,3}?bc/i
+    ABBBBC
+ 0: ABBBBC
+
+/ab{3,4}?bc/i
+    ABBBBC
+ 0: ABBBBC
+
+/ab{4,5}?bc/i
+    *** Failers
+No match
+    ABQ
+No match
+    ABBBBC
+No match
+
+/ab??bc/i
+    ABBC
+ 0: ABBC
+    ABC
+ 0: ABC
+
+/ab{0,1}?bc/i
+    ABC
+ 0: ABC
+
+/ab??bc/i
+
+/ab??c/i
+    ABC
+ 0: ABC
+
+/ab{0,1}?c/i
+    ABC
+ 0: ABC
+
+/^abc$/i
+    ABC
+ 0: ABC
+    *** Failers
+No match
+    ABBBBC
+No match
+    ABCC
+No match
+
+/^abc/i
+    ABCC
+ 0: ABC
+
+/^abc$/i
+
+/abc$/i
+    AABC
+ 0: ABC
+
+/^/i
+    ABC
+ 0: 
+
+/$/i
+    ABC
+ 0: 
+
+/a.c/i
+    ABC
+ 0: ABC
+    AXC
+ 0: AXC
+
+/a.*?c/i
+    AXYZC
+ 0: AXYZC
+
+/a.*c/i
+    *** Failers
+No match
+    AABC
+ 0: AABC
+    AXYZD
+No match
+
+/a[bc]d/i
+    ABD
+ 0: ABD
+
+/a[b-d]e/i
+    ACE
+ 0: ACE
+    *** Failers
+No match
+    ABC
+No match
+    ABD
+No match
+
+/a[b-d]/i
+    AAC
+ 0: AC
+
+/a[-b]/i
+    A-
+ 0: A-
+
+/a[b-]/i
+    A-
+ 0: A-
+
+/a]/i
+    A]
+ 0: A]
+
+/a[]]b/i
+    A]B
+ 0: A]B
+
+/a[^bc]d/i
+    AED
+ 0: AED
+
+/a[^-b]c/i
+    ADC
+ 0: ADC
+    *** Failers
+No match
+    ABD
+No match
+    A-C
+No match
+
+/a[^]b]c/i
+    ADC
+ 0: ADC
+
+/ab|cd/i
+    ABC
+ 0: AB
+    ABCD
+ 0: AB
+
+/()ef/i
+    DEF
+ 0: EF
+
+/$b/i
+    *** Failers
+No match
+    A]C
+No match
+    B
+No match
+
+/a\(b/i
+    A(B
+ 0: A(B
+
+/a\(*b/i
+    AB
+ 0: AB
+    A((B
+ 0: A((B
+
+/a\\b/i
+    A\B
+No match
+
+/((a))/i
+    ABC
+ 0: A
+
+/(a)b(c)/i
+    ABC
+ 0: ABC
+
+/a+b+c/i
+    AABBABC
+ 0: ABC
+
+/a{1,}b{1,}c/i
+    AABBABC
+ 0: ABC
+
+/a.+?c/i
+    ABCABC
+ 0: ABCABC
+ 1: ABC
+
+/a.*?c/i
+    ABCABC
+ 0: ABCABC
+ 1: ABC
+
+/a.{0,5}?c/i
+    ABCABC
+ 0: ABCABC
+ 1: ABC
+
+/(a+|b)*/i
+    AB
+ 0: AB
+ 1: A
+ 2: 
+
+/(a+|b){0,}/i
+    AB
+ 0: AB
+ 1: A
+ 2: 
+
+/(a+|b)+/i
+    AB
+ 0: AB
+ 1: A
+
+/(a+|b){1,}/i
+    AB
+ 0: AB
+ 1: A
+
+/(a+|b)?/i
+    AB
+ 0: A
+ 1: 
+
+/(a+|b){0,1}/i
+    AB
+ 0: A
+ 1: 
+
+/(a+|b){0,1}?/i
+    AB
+ 0: A
+ 1: 
+
+/[^ab]*/i
+    CDE
+ 0: CDE
+ 1: CD
+ 2: C
+ 3: 
+
+/abc/i
+
+/a*/i
+    
+
+/([abc])*d/i
+    ABBBCD
+ 0: ABBBCD
+
+/([abc])*bcd/i
+    ABCD
+ 0: ABCD
+
+/a|b|c|d|e/i
+    E
+ 0: E
+
+/(a|b|c|d|e)f/i
+    EF
+ 0: EF
+
+/abcd*efg/i
+    ABCDEFG
+ 0: ABCDEFG
+
+/ab*/i
+    XABYABBBZ
+ 0: AB
+ 1: A
+    XAYABBBZ
+ 0: A
+
+/(ab|cd)e/i
+    ABCDE
+ 0: CDE
+
+/[abhgefdc]ij/i
+    HIJ
+ 0: HIJ
+
+/^(ab|cd)e/i
+    ABCDE
+No match
+
+/(abc|)ef/i
+    ABCDEF
+ 0: EF
+
+/(a|b)c*d/i
+    ABCD
+ 0: BCD
+
+/(ab|ab*)bc/i
+    ABC
+ 0: ABC
+
+/a([bc]*)c*/i
+    ABC
+ 0: ABC
+ 1: AB
+ 2: A
+
+/a([bc]*)(c*d)/i
+    ABCD
+ 0: ABCD
+
+/a([bc]+)(c*d)/i
+    ABCD
+ 0: ABCD
+
+/a([bc]*)(c+d)/i
+    ABCD
+ 0: ABCD
+
+/a[bcd]*dcdcde/i
+    ADCDCDE
+ 0: ADCDCDE
+
+/a[bcd]+dcdcde/i
+
+/(ab|a)b*c/i
+    ABC
+ 0: ABC
+
+/((a)(b)c)(d)/i
+    ABCD
+ 0: ABCD
+
+/[a-zA-Z_][a-zA-Z0-9_]*/i
+    ALPHA
+ 0: ALPHA
+ 1: ALPH
+ 2: ALP
+ 3: AL
+ 4: A
+
+/^a(bc+|b[eh])g|.h$/i
+    ABH
+ 0: BH
+
+/(bc+d$|ef*g.|h?i(j|k))/i
+    EFFGZ
+ 0: EFFGZ
+    IJ
+ 0: IJ
+    REFFGZ
+ 0: EFFGZ
+    *** Failers
+No match
+    ADCDCDE
+No match
+    EFFG
+No match
+    BCDD
+No match
+
+/((((((((((a))))))))))/i
+    A
+ 0: A
+
+/(((((((((a)))))))))/i
+    A
+ 0: A
+
+/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i
+    A
+ 0: A
+
+/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i
+    C
+ 0: C
+
+/multiple words of text/i
+    *** Failers
+No match
+    AA
+No match
+    UH-UH
+No match
+
+/multiple words/i
+    MULTIPLE WORDS, YEAH
+ 0: MULTIPLE WORDS
+
+/(.*)c(.*)/i
+    ABCDE
+ 0: ABCDE
+ 1: ABCD
+ 2: ABC
+
+/\((.*), (.*)\)/i
+    (A, B)
+ 0: (A, B)
+
+/[k]/i
+
+/abcd/i
+    ABCD
+ 0: ABCD
+
+/a(bc)d/i
+    ABCD
+ 0: ABCD
+
+/a[-]?c/i
+    AC
+ 0: AC
+
+/a(?!b)./
+    abad
+ 0: ad
+
+/a(?=d)./
+    abad
+ 0: ad
+
+/a(?=c|d)./
+    abad
+ 0: ad
+
+/a(?:b|c|d)(.)/
+    ace
+ 0: ace
+
+/a(?:b|c|d)*(.)/
+    ace
+ 0: ace
+ 1: ac
+
+/a(?:b|c|d)+?(.)/
+    ace
+ 0: ace
+    acdbcdbe
+ 0: acdbcdbe
+ 1: acdbcdb
+ 2: acdbcd
+ 3: acdbc
+ 4: acdb
+ 5: acd
+
+/a(?:b|c|d)+(.)/
+    acdbcdbe
+ 0: acdbcdbe
+ 1: acdbcdb
+ 2: acdbcd
+ 3: acdbc
+ 4: acdb
+ 5: acd
+
+/a(?:b|c|d){2}(.)/
+    acdbcdbe
+ 0: acdb
+
+/a(?:b|c|d){4,5}(.)/
+    acdbcdbe
+ 0: acdbcdb
+ 1: acdbcd
+
+/a(?:b|c|d){4,5}?(.)/
+    acdbcdbe
+ 0: acdbcdb
+ 1: acdbcd
+
+/((foo)|(bar))*/
+    foobar
+ 0: foobar
+ 1: foo
+ 2: 
+
+/a(?:b|c|d){6,7}(.)/
+    acdbcdbe
+ 0: acdbcdbe
+
+/a(?:b|c|d){6,7}?(.)/
+    acdbcdbe
+ 0: acdbcdbe
+
+/a(?:b|c|d){5,6}(.)/
+    acdbcdbe
+ 0: acdbcdbe
+ 1: acdbcdb
+
+/a(?:b|c|d){5,6}?(.)/
+    acdbcdbe
+ 0: acdbcdbe
+ 1: acdbcdb
+
+/a(?:b|c|d){5,7}(.)/
+    acdbcdbe
+ 0: acdbcdbe
+ 1: acdbcdb
+
+/a(?:b|c|d){5,7}?(.)/
+    acdbcdbe
+ 0: acdbcdbe
+ 1: acdbcdb
+
+/a(?:b|(c|e){1,2}?|d)+?(.)/
+    ace
+ 0: ace
+
+/^(.+)?B/
+    AB
+ 0: AB
+
+/^([^a-z])|(\^)$/
+    .
+ 0: .
+
+/^[<>]&/
+    <&OUT
+ 0: <&
+
+/(?:(f)(o)(o)|(b)(a)(r))*/
+    foobar
+ 0: foobar
+ 1: foo
+ 2: 
+
+/(?<=a)b/
+    ab
+ 0: b
+    *** Failers
+No match
+    cb
+No match
+    b
+No match
+
+/(?<!c)b/
+    ab
+ 0: b
+    b
+ 0: b
+    b
+ 0: b
+
+/(?:..)*a/
+    aba
+ 0: aba
+ 1: a
+
+/(?:..)*?a/
+    aba
+ 0: aba
+ 1: a
+
+/^(){3,5}/
+    abc
+ 0: 
+
+/^(a+)*ax/
+    aax
+ 0: aax
+
+/^((a|b)+)*ax/
+    aax
+ 0: aax
+
+/^((a|bc)+)*ax/
+    aax
+ 0: aax
+
+/(a|x)*ab/
+    cab
+ 0: ab
+
+/(a)*ab/
+    cab
+ 0: ab
+
+/(?:(?i)a)b/
+    ab
+ 0: ab
+
+/((?i)a)b/
+    ab
+ 0: ab
+
+/(?:(?i)a)b/
+    Ab
+ 0: Ab
+
+/((?i)a)b/
+    Ab
+ 0: Ab
+
+/(?:(?i)a)b/
+    *** Failers
+No match
+    cb
+No match
+    aB
+No match
+
+/((?i)a)b/
+
+/(?i:a)b/
+    ab
+ 0: ab
+
+/((?i:a))b/
+    ab
+ 0: ab
+
+/(?i:a)b/
+    Ab
+ 0: Ab
+
+/((?i:a))b/
+    Ab
+ 0: Ab
+
+/(?i:a)b/
+    *** Failers
+No match
+    aB
+No match
+    aB
+No match
+
+/((?i:a))b/
+
+/(?:(?-i)a)b/i
+    ab
+ 0: ab
+
+/((?-i)a)b/i
+    ab
+ 0: ab
+
+/(?:(?-i)a)b/i
+    aB
+ 0: aB
+
+/((?-i)a)b/i
+    aB
+ 0: aB
+
+/(?:(?-i)a)b/i
+    *** Failers
+No match
+    aB
+ 0: aB
+    Ab
+No match
+
+/((?-i)a)b/i
+
+/(?:(?-i)a)b/i
+    aB
+ 0: aB
+
+/((?-i)a)b/i
+    aB
+ 0: aB
+
+/(?:(?-i)a)b/i
+    *** Failers
+No match
+    Ab
+No match
+    AB
+No match
+
+/((?-i)a)b/i
+
+/(?-i:a)b/i
+    ab
+ 0: ab
+
+/((?-i:a))b/i
+    ab
+ 0: ab
+
+/(?-i:a)b/i
+    aB
+ 0: aB
+
+/((?-i:a))b/i
+    aB
+ 0: aB
+
+/(?-i:a)b/i
+    *** Failers
+No match
+    AB
+No match
+    Ab
+No match
+
+/((?-i:a))b/i
+
+/(?-i:a)b/i
+    aB
+ 0: aB
+
+/((?-i:a))b/i
+    aB
+ 0: aB
+
+/(?-i:a)b/i
+    *** Failers
+No match
+    Ab
+No match
+    AB
+No match
+
+/((?-i:a))b/i
+
+/((?-i:a.))b/i
+    *** Failers
+No match
+    AB
+No match
+    a\nB
+No match
+
+/((?s-i:a.))b/i
+    a\nB
+ 0: a\x0aB
+
+/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/
+    cabbbb
+ 0: cabbbb
+
+/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/
+    caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+ 0: caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+
+/foo\w*\d{4}baz/
+    foobar1234baz
+ 0: foobar1234baz
+
+/x(~~)*(?:(?:F)?)?/
+    x~~
+ 0: x~~
+ 1: x
+
+/^a(?#xxx){3}c/
+    aaac
+ 0: aaac
+
+/^a (?#xxx) (?#yyy) {3}c/x
+    aaac
+ 0: aaac
+
+/(?<![cd])b/
+    *** Failers
+No match
+    B\nB
+No match
+    dbcb
+No match
+
+/(?<![cd])[ab]/
+    dbaacb
+ 0: a
+
+/(?<!(c|d))b/
+
+/(?<!(c|d))[ab]/
+    dbaacb
+ 0: a
+
+/(?<!cd)[ab]/
+    cdaccb
+ 0: b
+
+/^(?:a?b?)*$/
+    *** Failers
+No match
+    dbcb
+No match
+    a--
+No match
+
+/((?s)^a(.))((?m)^b$)/
+    a\nb\nc\n
+ 0: a\x0ab
+
+/((?m)^b$)/
+    a\nb\nc\n
+ 0: b
+
+/(?m)^b/
+    a\nb\n
+ 0: b
+
+/(?m)^(b)/
+    a\nb\n
+ 0: b
+
+/((?m)^b)/
+    a\nb\n
+ 0: b
+
+/\n((?m)^b)/
+    a\nb\n
+ 0: \x0ab
+
+/((?s).)c(?!.)/
+    a\nb\nc\n
+ 0: \x0ac
+    a\nb\nc\n
+ 0: \x0ac
+
+/((?s)b.)c(?!.)/
+    a\nb\nc\n
+ 0: b\x0ac
+    a\nb\nc\n
+ 0: b\x0ac
+
+/^b/
+
+/()^b/
+    *** Failers
+No match
+    a\nb\nc\n
+No match
+    a\nb\nc\n
+No match
+
+/((?m)^b)/
+    a\nb\nc\n
+ 0: b
+
+/(?(?!a)a|b)/
+
+/(?(?!a)b|a)/
+    a
+ 0: a
+
+/(?(?=a)b|a)/
+    *** Failers
+No match
+    a
+No match
+    a
+No match
+
+/(?(?=a)a|b)/
+    a
+ 0: a
+
+/(\w+:)+/
+    one:
+ 0: one:
+
+/$(?<=^(a))/
+    a
+ 0: 
+
+/([\w:]+::)?(\w+)$/
+    abcd
+ 0: abcd
+    xy:z:::abcd
+ 0: xy:z:::abcd
+
+/^[^bcd]*(c+)/
+    aexycd
+ 0: aexyc
+
+/(a*)b+/
+    caab
+ 0: aab
+
+/([\w:]+::)?(\w+)$/
+    abcd
+ 0: abcd
+    xy:z:::abcd
+ 0: xy:z:::abcd
+    *** Failers
+ 0: Failers
+    abcd:
+No match
+    abcd:
+No match
+
+/^[^bcd]*(c+)/
+    aexycd
+ 0: aexyc
+
+/(>a+)ab/
+
+/(?>a+)b/
+    aaab
+ 0: aaab
+
+/([[:]+)/
+    a:[b]:
+ 0: :[
+ 1: :
+
+/([[=]+)/
+    a=[b]=
+ 0: =[
+ 1: =
+
+/([[.]+)/
+    a.[b].
+ 0: .[
+ 1: .
+
+/((?>a+)b)/
+    aaab
+ 0: aaab
+
+/(?>(a+))b/
+    aaab
+ 0: aaab
+
+/((?>[^()]+)|\([^()]*\))+/
+    ((abc(ade)ufh()()x
+ 0: abc(ade)ufh()()x
+ 1: abc(ade)ufh()()
+ 2: abc(ade)ufh()
+ 3: abc(ade)ufh
+ 4: abc(ade)
+ 5: abc
+
+/a\Z/
+    *** Failers
+No match
+    aaab
+No match
+    a\nb\n
+No match
+
+/b\Z/
+    a\nb\n
+ 0: b
+
+/b\z/
+
+/b\Z/
+    a\nb
+ 0: b
+
+/b\z/
+    a\nb
+ 0: b
+    *** Failers
+No match
+    
+/(?>.*)(?<=(abcd|wxyz))/
+    alphabetabcd
+ 0: alphabetabcd
+    endingwxyz
+ 0: endingwxyz
+    *** Failers
+No match
+    a rather long string that doesn't end with one of them
+No match
+
+/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/
+    word cat dog elephant mussel cow horse canary baboon snake shark otherword
+ 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword
+    word cat dog elephant mussel cow horse canary baboon snake shark
+No match
+  
+/word (?>[a-zA-Z0-9]+ ){0,30}otherword/
+    word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
+No match
+
+/(?<=\d{3}(?!999))foo/
+    999foo
+ 0: foo
+    123999foo 
+ 0: foo
+    *** Failers
+No match
+    123abcfoo
+No match
+    
+/(?<=(?!...999)\d{3})foo/
+    999foo
+ 0: foo
+    123999foo 
+ 0: foo
+    *** Failers
+No match
+    123abcfoo
+No match
+
+/(?<=\d{3}(?!999)...)foo/
+    123abcfoo
+ 0: foo
+    123456foo 
+ 0: foo
+    *** Failers
+No match
+    123999foo  
+No match
+    
+/(?<=\d{3}...)(?<!999)foo/
+    123abcfoo   
+ 0: foo
+    123456foo 
+ 0: foo
+    *** Failers
+No match
+    123999foo  
+No match
+
+/((Z)+|A)*/
+    ZABCDEFG
+ 0: ZA
+ 1: Z
+ 2: 
+
+/(Z()|A)*/
+    ZABCDEFG
+ 0: ZA
+ 1: Z
+ 2: 
+
+/(Z(())|A)*/
+    ZABCDEFG
+ 0: ZA
+ 1: Z
+ 2: 
+
+/((?>Z)+|A)*/
+    ZABCDEFG
+ 0: ZA
+ 1: Z
+ 2: 
+
+/((?>)+|A)*/
+    ZABCDEFG
+ 0: 
+
+/a*/g
+    abbab
+ 0: a
+ 1: 
+ 0: 
+ 0: 
+ 0: a
+ 1: 
+ 0: 
+ 0: 
+
+/^[a-\d]/
+    abcde
+ 0: a
+    -things
+ 0: -
+    0digit
+ 0: 0
+    *** Failers
+No match
+    bcdef    
+No match
+
+/^[\d-a]/
+    abcde
+ 0: a
+    -things
+ 0: -
+    0digit
+ 0: 0
+    *** Failers
+No match
+    bcdef    
+No match
+    
+/[[:space:]]+/
+    > \x09\x0a\x0c\x0d\x0b<
+ 0:  \x09\x0a\x0c\x0d\x0b
+ 1:  \x09\x0a\x0c\x0d
+ 2:  \x09\x0a\x0c
+ 3:  \x09\x0a
+ 4:  \x09
+ 5:  
+     
+/[[:blank:]]+/
+    > \x09\x0a\x0c\x0d\x0b<
+ 0:  \x09
+ 1:  
+     
+/[\s]+/
+    > \x09\x0a\x0c\x0d\x0b<
+ 0:  \x09\x0a\x0c\x0d
+ 1:  \x09\x0a\x0c
+ 2:  \x09\x0a
+ 3:  \x09
+ 4:  
+     
+/\s+/
+    > \x09\x0a\x0c\x0d\x0b<
+ 0:  \x09\x0a\x0c\x0d
+ 1:  \x09\x0a\x0c
+ 2:  \x09\x0a
+ 3:  \x09
+ 4:  
+     
+/ab/x
+    ab
+No match
+
+/(?!\A)x/m
+  a\nxb\n
+ 0: x
+
+/(?!^)x/m
+  a\nxb\n
+No match
+
+/abc\Qabc\Eabc/
+    abcabcabc
+ 0: abcabcabc
+    
+/abc\Q(*+|\Eabc/
+    abc(*+|abc 
+ 0: abc(*+|abc
+
+/   abc\Q abc\Eabc/x
+    abc abcabc
+ 0: abc abcabc
+    *** Failers
+No match
+    abcabcabc  
+No match
+    
+/abc#comment
+    \Q#not comment
+    literal\E/x
+    abc#not comment\n    literal     
+ 0: abc#not comment\x0a    literal
+
+/abc#comment
+    \Q#not comment
+    literal/x
+    abc#not comment\n    literal     
+ 0: abc#not comment\x0a    literal
+
+/abc#comment
+    \Q#not comment
+    literal\E #more comment
+    /x
+    abc#not comment\n    literal     
+ 0: abc#not comment\x0a    literal
+
+/abc#comment
+    \Q#not comment
+    literal\E #more comment/x
+    abc#not comment\n    literal     
+ 0: abc#not comment\x0a    literal
+
+/\Qabc\$xyz\E/
+    abc\\\$xyz
+ 0: abc\$xyz
+
+/\Qabc\E\$\Qxyz\E/
+    abc\$xyz
+ 0: abc$xyz
+
+/\Gabc/
+    abc
+ 0: abc
+    *** Failers
+No match
+    xyzabc  
+No match
+
+/\Gabc./g
+    abc1abc2xyzabc3
+ 0: abc1
+ 0: abc2
+
+/abc./g
+    abc1abc2xyzabc3 
+ 0: abc1
+ 0: abc2
+ 0: abc3
+
+/a(?x: b c )d/
+    XabcdY
+ 0: abcd
+    *** Failers 
+No match
+    Xa b c d Y 
+No match
+
+/((?x)x y z | a b c)/
+    XabcY
+ 0: abc
+    AxyzB 
+ 0: xyz
+
+/(?i)AB(?-i)C/
+    XabCY
+ 0: abC
+    *** Failers
+No match
+    XabcY  
+No match
+
+/((?i)AB(?-i)C|D)E/
+    abCE
+ 0: abCE
+    DE
+ 0: DE
+    *** Failers
+No match
+    abcE
+No match
+    abCe  
+No match
+    dE
+No match
+    De    
+No match
+
+/[z\Qa-d]\E]/
+    z
+ 0: z
+    a
+ 0: a
+    -
+ 0: -
+    d
+ 0: d
+    ] 
+ 0: ]
+    *** Failers
+ 0: a
+    b     
+No match
+
+/[\z\C]/
+    z
+ 0: z
+    C 
+ 0: C
+    
+/\M/
+    M 
+ 0: M
+    
+/(a+)*b/
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
+No match
+    
+/(?i)reg(?:ul(?:[aä]|ae)r|ex)/
+    REGular
+ 0: REGular
+    regulaer
+ 0: regulaer
+    Regex  
+ 0: Regex
+    regulär 
+ 0: regul\xe4r
+
+/Åæåä[à-ÿÀ-ß]+/
+    Åæåäà
+ 0: \xc5\xe6\xe5\xe4\xe0
+    Åæåäÿ
+ 0: \xc5\xe6\xe5\xe4\xff
+    ÅæåäÀ
+ 0: \xc5\xe6\xe5\xe4\xc0
+    Åæåäß
+ 0: \xc5\xe6\xe5\xe4\xdf
+
+/(?<=Z)X./
+    \x84XAZXB
+ 0: XB
+
+/^(?(2)a|(1)(2))+$/
+    123a
+Error -17
+
+/(?<=a|bbbb)c/
+    ac
+ 0: c
+    bbbbc
+ 0: c
+
+/abc/>testsavedregex
+Compiled regex written to testsavedregex
+<testsavedregex
+Compiled regex loaded from testsavedregex
+No study data
+    abc
+ 0: abc
+    *** Failers
+No match
+    bca
+No match
+    
+/abc/F>testsavedregex
+Compiled regex written to testsavedregex
+<testsavedregex
+Compiled regex (byte-inverted) loaded from testsavedregex
+No study data
+    abc
+ 0: abc
+    *** Failers
+No match
+    bca
+No match
+
+/(a|b)/S>testsavedregex
+Compiled regex written to testsavedregex
+Study data written to testsavedregex
+<testsavedregex
+Compiled regex loaded from testsavedregex
+Study data loaded from testsavedregex
+    abc
+ 0: a
+    *** Failers
+ 0: a
+    def  
+No match
+    
+/(a|b)/SF>testsavedregex
+Compiled regex written to testsavedregex
+Study data written to testsavedregex
+<testsavedregex
+Compiled regex (byte-inverted) loaded from testsavedregex
+Study data loaded from testsavedregex
+    abc
+ 0: a
+    *** Failers
+ 0: a
+    def  
+No match
+    
+/line\nbreak/
+    this is a line\nbreak
+ 0: line\x0abreak
+    line one\nthis is a line\nbreak in the second line 
+ 0: line\x0abreak
+
+/line\nbreak/f
+    this is a line\nbreak
+ 0: line\x0abreak
+    ** Failers 
+No match
+    line one\nthis is a line\nbreak in the second line 
+No match
+
+/line\nbreak/mf
+    this is a line\nbreak
+ 0: line\x0abreak
+    ** Failers 
+No match
+    line one\nthis is a line\nbreak in the second line 
+No match
+
+/ End of testinput7 /
diff -Nurp tin-1.6.2/pcre/testdata/testoutput8 tin-1.8.0/pcre/testdata/testoutput8
--- tin-1.6.2/pcre/testdata/testoutput8	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/testdata/testoutput8	2005-09-12 16:42:33.000000000 +0200
@@ -0,0 +1,1033 @@
+PCRE version 6.4 05-Sep-2005
+
+/-- Do not use the \x{} construct except with patterns that have the --/
+/-- /8 option set, because PCRE doesn't recognize them as UTF-8 unless --/
+No match
+/-- that option is set. However, the latest Perls recognize them always. --/
+No match
+
+/\x{100}ab/8
+  \x{100}ab
+ 0: \x{100}ab
+  
+/a\x{100}*b/8
+    ab
+ 0: ab
+    a\x{100}b  
+ 0: a\x{100}b
+    a\x{100}\x{100}b  
+ 0: a\x{100}\x{100}b
+    
+/a\x{100}+b/8
+    a\x{100}b  
+ 0: a\x{100}b
+    a\x{100}\x{100}b  
+ 0: a\x{100}\x{100}b
+    *** Failers 
+No match
+    ab
+No match
+     
+/\bX/8
+    Xoanon
+ 0: X
+    +Xoanon
+ 0: X
+    \x{300}Xoanon 
+ 0: X
+    *** Failers 
+No match
+    YXoanon  
+No match
+    
+/\BX/8
+    YXoanon
+ 0: X
+    *** Failers
+No match
+    Xoanon
+No match
+    +Xoanon    
+No match
+    \x{300}Xoanon 
+No match
+
+/X\b/8
+    X+oanon
+ 0: X
+    ZX\x{300}oanon 
+ 0: X
+    FAX 
+ 0: X
+    *** Failers 
+No match
+    Xoanon  
+No match
+    
+/X\B/8
+    Xoanon  
+ 0: X
+    *** Failers
+No match
+    X+oanon
+No match
+    ZX\x{300}oanon 
+No match
+    FAX 
+No match
+    
+/[^a]/8
+    abcd
+ 0: b
+    a\x{100}   
+ 0: \x{100}
+
+/^[abc\x{123}\x{400}-\x{402}]{2,3}\d/8
+    ab99
+ 0: ab9
+    \x{123}\x{123}45
+ 0: \x{123}\x{123}4
+    \x{400}\x{401}\x{402}6  
+ 0: \x{400}\x{401}\x{402}6
+    *** Failers
+No match
+    d99
+No match
+    \x{123}\x{122}4   
+No match
+    \x{400}\x{403}6  
+No match
+    \x{400}\x{401}\x{402}\x{402}6  
+No match
+
+/abc/8
+    Ã]
+Error -10
+    Ã
+Error -10
+    ÃÃÃ
+Error -10
+    ÃÃÃ\?
+No match
+
+/a.b/8
+    acb
+ 0: acb
+    a\x7fb
+ 0: a\x{7f}b
+    a\x{100}b 
+ 0: a\x{100}b
+    *** Failers
+No match
+    a\nb  
+No match
+
+/a(.{3})b/8
+    a\x{4000}xyb 
+ 0: a\x{4000}xyb
+    a\x{4000}\x7fyb 
+ 0: a\x{4000}\x{7f}yb
+    a\x{4000}\x{100}yb 
+ 0: a\x{4000}\x{100}yb
+    *** Failers
+No match
+    a\x{4000}b 
+No match
+    ac\ncb 
+No match
+
+/a(.*?)(.)/
+    a\xc0\x88b
+ 0: a\xc0\x88b
+ 1: a\xc0\x88
+ 2: a\xc0
+
+/a(.*?)(.)/8
+    a\x{100}b
+ 0: a\x{100}b
+ 1: a\x{100}
+
+/a(.*)(.)/
+    a\xc0\x88b
+ 0: a\xc0\x88b
+ 1: a\xc0\x88
+ 2: a\xc0
+
+/a(.*)(.)/8
+    a\x{100}b
+ 0: a\x{100}b
+ 1: a\x{100}
+
+/a(.)(.)/
+    a\xc0\x92bcd
+ 0: a\xc0\x92
+
+/a(.)(.)/8
+    a\x{240}bcd
+ 0: a\x{240}b
+
+/a(.?)(.)/
+    a\xc0\x92bcd
+ 0: a\xc0\x92
+ 1: a\xc0
+
+/a(.?)(.)/8
+    a\x{240}bcd
+ 0: a\x{240}b
+ 1: a\x{240}
+
+/a(.??)(.)/
+    a\xc0\x92bcd
+ 0: a\xc0\x92
+ 1: a\xc0
+
+/a(.??)(.)/8
+    a\x{240}bcd
+ 0: a\x{240}b
+ 1: a\x{240}
+
+/a(.{3})b/8
+    a\x{1234}xyb 
+ 0: a\x{1234}xyb
+    a\x{1234}\x{4321}yb 
+ 0: a\x{1234}\x{4321}yb
+    a\x{1234}\x{4321}\x{3412}b 
+ 0: a\x{1234}\x{4321}\x{3412}b
+    *** Failers
+No match
+    a\x{1234}b 
+No match
+    ac\ncb 
+No match
+
+/a(.{3,})b/8
+    a\x{1234}xyb 
+ 0: a\x{1234}xyb
+    a\x{1234}\x{4321}yb 
+ 0: a\x{1234}\x{4321}yb
+    a\x{1234}\x{4321}\x{3412}b 
+ 0: a\x{1234}\x{4321}\x{3412}b
+    axxxxbcdefghijb 
+ 0: axxxxbcdefghijb
+ 1: axxxxb
+    a\x{1234}\x{4321}\x{3412}\x{3421}b 
+ 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
+    *** Failers
+No match
+    a\x{1234}b 
+No match
+
+/a(.{3,}?)b/8
+    a\x{1234}xyb 
+ 0: a\x{1234}xyb
+    a\x{1234}\x{4321}yb 
+ 0: a\x{1234}\x{4321}yb
+    a\x{1234}\x{4321}\x{3412}b 
+ 0: a\x{1234}\x{4321}\x{3412}b
+    axxxxbcdefghijb 
+ 0: axxxxbcdefghijb
+ 1: axxxxb
+    a\x{1234}\x{4321}\x{3412}\x{3421}b 
+ 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
+    *** Failers
+No match
+    a\x{1234}b 
+No match
+
+/a(.{3,5})b/8
+    a\x{1234}xyb 
+ 0: a\x{1234}xyb
+    a\x{1234}\x{4321}yb 
+ 0: a\x{1234}\x{4321}yb
+    a\x{1234}\x{4321}\x{3412}b 
+ 0: a\x{1234}\x{4321}\x{3412}b
+    axxxxbcdefghijb 
+ 0: axxxxb
+    a\x{1234}\x{4321}\x{3412}\x{3421}b 
+ 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
+    axbxxbcdefghijb 
+ 0: axbxxb
+    axxxxxbcdefghijb 
+ 0: axxxxxb
+    *** Failers
+No match
+    a\x{1234}b 
+No match
+    axxxxxxbcdefghijb 
+No match
+
+/a(.{3,5}?)b/8
+    a\x{1234}xyb 
+ 0: a\x{1234}xyb
+    a\x{1234}\x{4321}yb 
+ 0: a\x{1234}\x{4321}yb
+    a\x{1234}\x{4321}\x{3412}b 
+ 0: a\x{1234}\x{4321}\x{3412}b
+    axxxxbcdefghijb 
+ 0: axxxxb
+    a\x{1234}\x{4321}\x{3412}\x{3421}b 
+ 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
+    axbxxbcdefghijb 
+ 0: axbxxb
+    axxxxxbcdefghijb 
+ 0: axxxxxb
+    *** Failers
+No match
+    a\x{1234}b 
+No match
+    axxxxxxbcdefghijb 
+No match
+
+/^[a\x{c0}]/8
+    *** Failers
+No match
+    \x{100}
+No match
+
+/(?<=aXb)cd/8
+    aXbcd
+ 0: cd
+
+/(?<=a\x{100}b)cd/8
+    a\x{100}bcd
+ 0: cd
+
+/(?<=a\x{100000}b)cd/8
+    a\x{100000}bcd
+ 0: cd
+    
+/(?:\x{100}){3}b/8
+    \x{100}\x{100}\x{100}b
+ 0: \x{100}\x{100}\x{100}b
+    *** Failers 
+No match
+    \x{100}\x{100}b
+No match
+
+/\x{ab}/8
+    \x{ab} 
+ 0: \x{ab}
+    \xc2\xab
+ 0: \x{ab}
+    *** Failers 
+No match
+    \x00{ab}
+No match
+
+/(?<=(.))X/8
+    WXYZ
+ 0: X
+    \x{256}XYZ 
+ 0: X
+    *** Failers
+No match
+    XYZ 
+No match
+
+/[^a]+/8g
+    bcd
+ 0: bcd
+ 1: bc
+ 2: b
+    \x{100}aY\x{256}Z 
+ 0: \x{100}
+ 0: Y\x{256}Z
+ 1: Y\x{256}
+ 2: Y
+    
+/^[^a]{2}/8
+    \x{100}bc
+ 0: \x{100}b
+ 
+/^[^a]{2,}/8
+    \x{100}bcAa
+ 0: \x{100}bcA
+ 1: \x{100}bc
+ 2: \x{100}b
+
+/^[^a]{2,}?/8
+    \x{100}bca
+ 0: \x{100}bc
+ 1: \x{100}b
+
+/[^a]+/8ig
+    bcd
+ 0: bcd
+ 1: bc
+ 2: b
+    \x{100}aY\x{256}Z 
+ 0: \x{100}
+ 0: Y\x{256}Z
+ 1: Y\x{256}
+ 2: Y
+    
+/^[^a]{2}/8i
+    \x{100}bc
+ 0: \x{100}b
+ 
+/^[^a]{2,}/8i
+    \x{100}bcAa
+ 0: \x{100}bc
+ 1: \x{100}b
+
+/^[^a]{2,}?/8i
+    \x{100}bca
+ 0: \x{100}bc
+ 1: \x{100}b
+
+/\x{100}{0,0}/8
+    abcd
+ 0: 
+ 
+/\x{100}?/8
+    abcd
+ 0: 
+    \x{100}\x{100} 
+ 0: \x{100}
+ 1: 
+
+/\x{100}{0,3}/8 
+    \x{100}\x{100} 
+ 0: \x{100}\x{100}
+ 1: \x{100}
+ 2: 
+    \x{100}\x{100}\x{100}\x{100} 
+ 0: \x{100}\x{100}\x{100}
+ 1: \x{100}\x{100}
+ 2: \x{100}
+ 3: 
+    
+/\x{100}*/8
+    abce
+ 0: 
+    \x{100}\x{100}\x{100}\x{100} 
+ 0: \x{100}\x{100}\x{100}\x{100}
+ 1: \x{100}\x{100}\x{100}
+ 2: \x{100}\x{100}
+ 3: \x{100}
+ 4: 
+
+/\x{100}{1,1}/8
+    abcd\x{100}\x{100}\x{100}\x{100} 
+ 0: \x{100}
+
+/\x{100}{1,3}/8
+    abcd\x{100}\x{100}\x{100}\x{100} 
+ 0: \x{100}\x{100}\x{100}
+ 1: \x{100}\x{100}
+ 2: \x{100}
+
+/\x{100}+/8
+    abcd\x{100}\x{100}\x{100}\x{100} 
+ 0: \x{100}\x{100}\x{100}\x{100}
+ 1: \x{100}\x{100}\x{100}
+ 2: \x{100}\x{100}
+ 3: \x{100}
+
+/\x{100}{3}/8
+    abcd\x{100}\x{100}\x{100}XX
+ 0: \x{100}\x{100}\x{100}
+
+/\x{100}{3,5}/8
+    abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX
+ 0: \x{100}\x{100}\x{100}\x{100}\x{100}
+ 1: \x{100}\x{100}\x{100}\x{100}
+ 2: \x{100}\x{100}\x{100}
+
+/\x{100}{3,}/8
+    abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX
+ 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 1: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 2: \x{100}\x{100}\x{100}\x{100}\x{100}
+ 3: \x{100}\x{100}\x{100}\x{100}
+ 4: \x{100}\x{100}\x{100}
+
+/(?<=a\x{100}{2}b)X/8
+    Xyyya\x{100}\x{100}bXzzz
+ 0: X
+
+/\D*/8
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but too many subsidiary matches
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\D*/8
+  \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+Matched, but too many subsidiary matches
+ 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 1: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 2: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 3: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 4: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 5: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 6: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 7: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 8: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 9: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+10: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+11: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+12: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+13: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+14: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+15: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+16: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+17: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+18: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+19: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+20: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+21: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+
+/\D/8
+    1X2
+ 0: X
+    1\x{100}2 
+ 0: \x{100}
+  
+/>\S/8
+    > >X Y
+ 0: >X
+    > >\x{100} Y
+ 0: >\x{100}
+  
+/\d/8
+    \x{100}3
+ 0: 3
+    
+/\s/8
+    \x{100} X
+ 0:  
+    
+/\D+/8
+    12abcd34
+ 0: abcd
+ 1: abc
+ 2: ab
+ 3: a
+    *** Failers
+ 0: *** Failers
+ 1: *** Failer
+ 2: *** Faile
+ 3: *** Fail
+ 4: *** Fai
+ 5: *** Fa
+ 6: *** F
+ 7: *** 
+ 8: ***
+ 9: **
+10: *
+    1234  
+No match
+
+/\D{2,3}/8
+    12abcd34
+ 0: abc
+ 1: ab
+    12ab34
+ 0: ab
+    *** Failers  
+ 0: ***
+ 1: **
+    1234
+No match
+    12a34  
+No match
+
+/\D{2,3}?/8
+    12abcd34
+ 0: abc
+ 1: ab
+    12ab34
+ 0: ab
+    *** Failers  
+ 0: ***
+ 1: **
+    1234
+No match
+    12a34  
+No match
+
+/\d+/8
+    12abcd34
+ 0: 12
+ 1: 1
+    *** Failers
+No match
+
+/\d{2,3}/8
+    12abcd34
+ 0: 12
+    1234abcd
+ 0: 123
+ 1: 12
+    *** Failers  
+No match
+    1.4 
+No match
+
+/\d{2,3}?/8
+    12abcd34
+ 0: 12
+    1234abcd
+ 0: 123
+ 1: 12
+    *** Failers  
+No match
+    1.4 
+No match
+
+/\S+/8
+    12abcd34
+ 0: 12abcd34
+ 1: 12abcd3
+ 2: 12abcd
+ 3: 12abc
+ 4: 12ab
+ 5: 12a
+ 6: 12
+ 7: 1
+    *** Failers
+ 0: ***
+ 1: **
+ 2: *
+    \    \ 
+No match
+
+/\S{2,3}/8
+    12abcd34
+ 0: 12a
+ 1: 12
+    1234abcd
+ 0: 123
+ 1: 12
+    *** Failers
+ 0: ***
+ 1: **
+    \     \  
+No match
+
+/\S{2,3}?/8
+    12abcd34
+ 0: 12a
+ 1: 12
+    1234abcd
+ 0: 123
+ 1: 12
+    *** Failers
+ 0: ***
+ 1: **
+    \     \  
+No match
+
+/>\s+</8
+    12>      <34
+ 0: >      <
+    *** Failers
+No match
+
+/>\s{2,3}</8
+    ab>  <cd
+ 0: >  <
+    ab>   <ce
+ 0: >   <
+    *** Failers
+No match
+    ab>    <cd 
+No match
+
+/>\s{2,3}?</8
+    ab>  <cd
+ 0: >  <
+    ab>   <ce
+ 0: >   <
+    *** Failers
+No match
+    ab>    <cd 
+No match
+
+/\w+/8
+    12      34
+ 0: 12
+ 1: 1
+    *** Failers
+ 0: Failers
+ 1: Failer
+ 2: Faile
+ 3: Fail
+ 4: Fai
+ 5: Fa
+ 6: F
+    +++=*! 
+No match
+
+/\w{2,3}/8
+    ab  cd
+ 0: ab
+    abcd ce
+ 0: abc
+ 1: ab
+    *** Failers
+ 0: Fai
+ 1: Fa
+    a.b.c
+No match
+
+/\w{2,3}?/8
+    ab  cd
+ 0: ab
+    abcd ce
+ 0: abc
+ 1: ab
+    *** Failers
+ 0: Fai
+ 1: Fa
+    a.b.c
+No match
+
+/\W+/8
+    12====34
+ 0: ====
+ 1: ===
+ 2: ==
+ 3: =
+    *** Failers
+ 0: *** 
+ 1: ***
+ 2: **
+ 3: *
+    abcd 
+No match
+
+/\W{2,3}/8
+    ab====cd
+ 0: ===
+ 1: ==
+    ab==cd
+ 0: ==
+    *** Failers
+ 0: ***
+ 1: **
+    a.b.c
+No match
+
+/\W{2,3}?/8
+    ab====cd
+ 0: ===
+ 1: ==
+    ab==cd
+ 0: ==
+    *** Failers
+ 0: ***
+ 1: **
+    a.b.c
+No match
+
+/[\x{100}]/8
+    \x{100}
+ 0: \x{100}
+    Z\x{100}
+ 0: \x{100}
+    \x{100}Z
+ 0: \x{100}
+    *** Failers 
+No match
+
+/[Z\x{100}]/8
+    Z\x{100}
+ 0: Z
+    \x{100}
+ 0: \x{100}
+    \x{100}Z
+ 0: \x{100}
+    *** Failers 
+No match
+
+/[\x{100}\x{200}]/8
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   *** Failers  
+No match
+
+/[\x{100}-\x{200}]/8
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   ab\x{111}cd 
+ 0: \x{111}
+   *** Failers  
+No match
+
+/[z-\x{200}]/8
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   ab\x{111}cd 
+ 0: \x{111}
+   abzcd
+ 0: z
+   ab|cd  
+ 0: |
+   *** Failers  
+No match
+
+/[Q\x{100}\x{200}]/8
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   Q? 
+ 0: Q
+   *** Failers  
+No match
+
+/[Q\x{100}-\x{200}]/8
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   ab\x{111}cd 
+ 0: \x{111}
+   Q? 
+ 0: Q
+   *** Failers  
+No match
+
+/[Qz-\x{200}]/8
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   ab\x{111}cd 
+ 0: \x{111}
+   abzcd
+ 0: z
+   ab|cd  
+ 0: |
+   Q? 
+ 0: Q
+   *** Failers  
+No match
+
+/[\x{100}\x{200}]{1,3}/8
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   ab\x{200}\x{100}\x{200}\x{100}cd
+ 0: \x{200}\x{100}\x{200}
+ 1: \x{200}\x{100}
+ 2: \x{200}
+   *** Failers  
+No match
+
+/[\x{100}\x{200}]{1,3}?/8
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   ab\x{200}\x{100}\x{200}\x{100}cd
+ 0: \x{200}\x{100}\x{200}
+ 1: \x{200}\x{100}
+ 2: \x{200}
+   *** Failers  
+No match
+
+/[Q\x{100}\x{200}]{1,3}/8
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   ab\x{200}\x{100}\x{200}\x{100}cd
+ 0: \x{200}\x{100}\x{200}
+ 1: \x{200}\x{100}
+ 2: \x{200}
+   *** Failers  
+No match
+
+/[Q\x{100}\x{200}]{1,3}?/8
+   ab\x{100}cd
+ 0: \x{100}
+   ab\x{200}cd
+ 0: \x{200}
+   ab\x{200}\x{100}\x{200}\x{100}cd
+ 0: \x{200}\x{100}\x{200}
+ 1: \x{200}\x{100}
+ 2: \x{200}
+   *** Failers  
+No match
+
+/(?<=[\x{100}\x{200}])X/8
+    abc\x{200}X
+ 0: X
+    abc\x{100}X 
+ 0: X
+    *** Failers
+No match
+    X  
+No match
+
+/(?<=[Q\x{100}\x{200}])X/8
+    abc\x{200}X
+ 0: X
+    abc\x{100}X 
+ 0: X
+    abQX 
+ 0: X
+    *** Failers
+No match
+    X  
+No match
+
+/(?<=[\x{100}\x{200}]{3})X/8
+    abc\x{100}\x{200}\x{100}X
+ 0: X
+    *** Failers
+No match
+    abc\x{200}X
+No match
+    X  
+No match
+
+/[^\x{100}\x{200}]X/8
+    AX
+ 0: AX
+    \x{150}X
+ 0: \x{150}X
+    \x{500}X 
+ 0: \x{500}X
+    *** Failers
+No match
+    \x{100}X
+No match
+    \x{200}X   
+No match
+
+/[^Q\x{100}\x{200}]X/8
+    AX
+ 0: AX
+    \x{150}X
+ 0: \x{150}X
+    \x{500}X 
+ 0: \x{500}X
+    *** Failers
+No match
+    \x{100}X
+No match
+    \x{200}X   
+No match
+    QX 
+No match
+
+/[^\x{100}-\x{200}]X/8
+    AX
+ 0: AX
+    \x{500}X 
+ 0: \x{500}X
+    *** Failers
+No match
+    \x{100}X
+No match
+    \x{150}X
+No match
+    \x{200}X   
+No match
+
+/[z-\x{100}]/8i
+    z
+ 0: z
+    Z 
+ 0: Z
+    \x{100}
+ 0: \x{100}
+    *** Failers
+No match
+    \x{102}
+No match
+    y    
+No match
+
+/[\xFF]/
+    >\xff<
+ 0: \xff
+
+/[\xff]/8
+    >\x{ff}<
+ 0: \x{ff}
+
+/[^\xFF]/
+    XYZ
+ 0: X
+
+/[^\xff]/8
+    XYZ
+ 0: X
+    \x{123} 
+ 0: \x{123}
+
+/^[ac]*b/8
+  xb
+No match
+
+/^[ac\x{100}]*b/8
+  xb
+No match
+
+/^[^x]*b/8i
+  xb
+No match
+
+/^[^x]*b/8
+  xb
+No match
+  
+/^\d*b/8
+  xb 
+No match
+
+/(|a)/g8
+    catac
+ 0: 
+ 0: a
+ 1: 
+ 0: 
+ 0: a
+ 1: 
+ 0: 
+ 0: 
+    a\x{256}a 
+ 0: a
+ 1: 
+ 0: 
+ 0: a
+ 1: 
+ 0: 
+
+/^\x{85}$/8i
+    \x{85}
+ 0: \x{85}
+
+/ End of testinput 8 / 
diff -Nurp tin-1.6.2/pcre/testdata/testoutput9 tin-1.8.0/pcre/testdata/testoutput9
--- tin-1.6.2/pcre/testdata/testoutput9	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/testdata/testoutput9	2005-09-12 16:42:33.000000000 +0200
@@ -0,0 +1,1234 @@
+PCRE version 6.4 05-Sep-2005
+
+/\pL\P{Nd}/8
+    AB
+ 0: AB
+    *** Failers
+ 0: Fa
+    A0
+No match
+    00   
+No match
+
+/\X./8
+    AB
+ 0: AB
+    A\x{300}BC 
+ 0: A\x{300}B
+    A\x{300}\x{301}\x{302}BC 
+ 0: A\x{300}\x{301}\x{302}B
+    *** Failers
+ 0: **
+    \x{300}  
+No match
+
+/\X\X/8
+    ABC
+ 0: AB
+    A\x{300}B\x{300}\x{301}C 
+ 0: A\x{300}B\x{300}\x{301}
+    A\x{300}\x{301}\x{302}BC 
+ 0: A\x{300}\x{301}\x{302}B
+    *** Failers
+ 0: **
+    \x{300}  
+No match
+
+/^\pL+/8
+    abcd
+ 0: abcd
+ 1: abc
+ 2: ab
+ 3: a
+    a 
+ 0: a
+    *** Failers 
+No match
+
+/^\PL+/8
+    1234
+ 0: 1234
+ 1: 123
+ 2: 12
+ 3: 1
+    = 
+ 0: =
+    *** Failers 
+ 0: *** 
+ 1: ***
+ 2: **
+ 3: *
+    abcd 
+No match
+
+/^\X+/8
+    abcdA\x{300}\x{301}\x{302}
+ 0: abcdA\x{300}\x{301}\x{302}
+ 1: abcd
+ 2: abc
+ 3: ab
+ 4: a
+    A\x{300}\x{301}\x{302}
+ 0: A\x{300}\x{301}\x{302}
+    A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}
+ 0: A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}
+ 1: A\x{300}\x{301}\x{302}
+    a 
+ 0: a
+    *** Failers 
+ 0: *** Failers
+ 1: *** Failer
+ 2: *** Faile
+ 3: *** Fail
+ 4: *** Fai
+ 5: *** Fa
+ 6: *** F
+ 7: *** 
+ 8: ***
+ 9: **
+10: *
+    \x{300}\x{301}\x{302}
+No match
+
+/\X?abc/8
+    abc
+ 0: abc
+    A\x{300}abc
+ 0: A\x{300}abc
+    A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz
+ 0: A\x{300}abc
+    \x{300}abc  
+ 0: abc
+    *** Failers
+No match
+
+/^\X?abc/8
+    abc
+ 0: abc
+    A\x{300}abc
+ 0: A\x{300}abc
+    *** Failers
+No match
+    A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz
+No match
+    \x{300}abc  
+No match
+
+/\X*abc/8
+    abc
+ 0: abc
+    A\x{300}abc
+ 0: A\x{300}abc
+    A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz
+ 0: A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abc
+    \x{300}abc  
+ 0: abc
+    *** Failers
+No match
+
+/^\X*abc/8
+    abc
+ 0: abc
+    A\x{300}abc
+ 0: A\x{300}abc
+    A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abcxyz
+ 0: A\x{300}\x{301}\x{302}A\x{300}A\x{300}A\x{300}abc
+    *** Failers
+No match
+    \x{300}abc  
+No match
+
+/^\pL?=./8
+    A=b
+ 0: A=b
+    =c 
+ 0: =c
+    *** Failers
+No match
+    1=2 
+No match
+    AAAA=b  
+No match
+
+/^\pL*=./8
+    AAAA=b
+ 0: AAAA=b
+    =c 
+ 0: =c
+    *** Failers
+No match
+    1=2  
+No match
+
+/^\X{2,3}X/8
+    A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X
+ 0: A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X
+    A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X 
+ 0: A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X
+    *** Failers
+No match
+    X
+No match
+    A\x{300}\x{301}\x{302}X
+No match
+    A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}A\x{300}\x{301}\x{302}X
+No match
+
+/^\pC\pL\pM\pN\pP\pS\pZ</8
+    \x7f\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}<
+ 0: \x{7f}\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}<
+    \np\x{300}9!\$ < 
+ 0: \x{0a}p\x{300}9!$ <
+    ** Failers 
+No match
+    ap\x{300}9!\$ < 
+No match
+  
+/^\PC/8
+    X
+ 0: X
+    ** Failers 
+ 0: *
+    \x7f
+No match
+  
+/^\PL/8
+    9
+ 0: 9
+    ** Failers 
+ 0: *
+    \x{c0}
+No match
+  
+/^\PM/8
+    X
+ 0: X
+    ** Failers 
+ 0: *
+    \x{30f}
+No match
+  
+/^\PN/8
+    X
+ 0: X
+    ** Failers 
+ 0: *
+    \x{660}
+No match
+  
+/^\PP/8
+    X
+ 0: X
+    ** Failers 
+No match
+    \x{66c}
+No match
+  
+/^\PS/8
+    X
+ 0: X
+    ** Failers 
+ 0: *
+    \x{f01}
+No match
+  
+/^\PZ/8
+    X
+ 0: X
+    ** Failers 
+ 0: *
+    \x{1680}
+No match
+    
+/^\p{Cc}/8
+    \x{017}
+ 0: \x{17}
+    \x{09f} 
+ 0: \x{9f}
+    ** Failers
+No match
+    \x{0600} 
+No match
+  
+/^\p{Cf}/8
+    \x{601}
+ 0: \x{601}
+    ** Failers
+No match
+    \x{09f} 
+No match
+  
+/^\p{Cn}/8
+    ** Failers
+No match
+    \x{09f} 
+No match
+  
+/^\p{Co}/8
+    \x{f8ff}
+ 0: \x{f8ff}
+    ** Failers
+No match
+    \x{09f} 
+No match
+  
+/^\p{Cs}/8
+    \x{dfff}
+ 0: \x{dfff}
+    ** Failers
+No match
+    \x{09f} 
+No match
+  
+/^\p{Ll}/8
+    a
+ 0: a
+    ** Failers 
+No match
+    Z
+No match
+    \x{dfff}  
+No match
+  
+/^\p{Lm}/8
+    \x{2b0}
+ 0: \x{2b0}
+    ** Failers
+No match
+    a 
+No match
+  
+/^\p{Lo}/8
+    \x{1bb}
+ 0: \x{1bb}
+    ** Failers
+No match
+    a 
+No match
+    \x{2b0}
+No match
+  
+/^\p{Lt}/8
+    \x{1c5}
+ 0: \x{1c5}
+    ** Failers
+No match
+    a 
+No match
+    \x{2b0}
+No match
+  
+/^\p{Lu}/8
+    A
+ 0: A
+    ** Failers
+No match
+    \x{2b0}
+No match
+  
+/^\p{Mc}/8
+    \x{903}
+ 0: \x{903}
+    ** Failers
+No match
+    X
+No match
+    \x{300}
+No match
+       
+/^\p{Me}/8
+    \x{488}
+ 0: \x{488}
+    ** Failers
+No match
+    X
+No match
+    \x{903}
+No match
+    \x{300}
+No match
+  
+/^\p{Mn}/8
+    \x{300}
+ 0: \x{300}
+    ** Failers
+No match
+    X
+No match
+    \x{903}
+No match
+  
+/^\p{Nd}+/8
+    0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669}\x{66a}
+ 0: 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669}
+ 1: 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}
+ 2: 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}
+ 3: 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}
+ 4: 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}
+ 5: 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}
+ 6: 0123456789\x{660}\x{661}\x{662}\x{663}
+ 7: 0123456789\x{660}\x{661}\x{662}
+ 8: 0123456789\x{660}\x{661}
+ 9: 0123456789\x{660}
+10: 0123456789
+11: 012345678
+12: 01234567
+13: 0123456
+14: 012345
+15: 01234
+16: 0123
+17: 012
+18: 01
+19: 0
+    \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}\x{6f7}\x{6f8}\x{6f9}\x{6fa}
+ 0: \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}\x{6f7}\x{6f8}\x{6f9}
+ 1: \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}\x{6f7}\x{6f8}
+ 2: \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}\x{6f7}
+ 3: \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}
+ 4: \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}
+ 5: \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}
+ 6: \x{6f0}\x{6f1}\x{6f2}\x{6f3}
+ 7: \x{6f0}\x{6f1}\x{6f2}
+ 8: \x{6f0}\x{6f1}
+ 9: \x{6f0}
+    \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}\x{96d}\x{96e}\x{96f}\x{970}
+ 0: \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}\x{96d}\x{96e}\x{96f}
+ 1: \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}\x{96d}\x{96e}
+ 2: \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}\x{96d}
+ 3: \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}
+ 4: \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}
+ 5: \x{966}\x{967}\x{968}\x{969}\x{96a}
+ 6: \x{966}\x{967}\x{968}\x{969}
+ 7: \x{966}\x{967}\x{968}
+ 8: \x{966}\x{967}
+ 9: \x{966}
+    ** Failers
+No match
+    X
+No match
+  
+/^\p{Nl}/8
+    \x{16ee}
+ 0: \x{16ee}
+    ** Failers
+No match
+    X
+No match
+    \x{966}
+No match
+  
+/^\p{No}/8
+    \x{b2}
+ 0: \x{b2}
+    \x{b3}
+ 0: \x{b3}
+    ** Failers
+No match
+    X
+No match
+    \x{16ee}
+No match
+  
+/^\p{Pc}/8
+    \x5f
+ 0: _
+    \x{203f}
+ 0: \x{203f}
+    ** Failers
+No match
+    X
+No match
+    -
+No match
+    \x{58a}
+No match
+  
+/^\p{Pd}/8
+    -
+ 0: -
+    \x{58a}
+ 0: \x{58a}
+    ** Failers
+No match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Pe}/8
+    )
+ 0: )
+    ]
+ 0: ]
+    }
+ 0: }
+    \x{f3b}
+ 0: \x{f3b}
+    ** Failers
+No match
+    X
+No match
+    \x{203f}
+No match
+    (
+No match
+    [
+No match
+    {
+No match
+    \x{f3c}
+No match
+  
+/^\p{Pf}/8
+    \x{bb}
+ 0: \x{bb}
+    \x{2019}
+ 0: \x{2019}
+    ** Failers
+No match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Pi}/8
+    \x{ab}
+ 0: \x{ab}
+    \x{2018}
+ 0: \x{2018}
+    ** Failers
+No match
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Po}/8
+    !
+ 0: !
+    \x{37e}
+ 0: \x{37e}
+    ** Failers
+ 0: *
+    X
+No match
+    \x{203f}
+No match
+  
+/^\p{Ps}/8
+    (
+ 0: (
+    [
+ 0: [
+    {
+ 0: {
+    \x{f3c}
+ 0: \x{f3c}
+    ** Failers
+No match
+    X
+No match
+    )
+No match
+    ]
+No match
+    }
+No match
+    \x{f3b}
+No match
+  
+/^\p{Sc}+/8
+    $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6}
+ 0: $\x{a2}\x{a3}\x{a4}\x{a5}
+ 1: $\x{a2}\x{a3}\x{a4}
+ 2: $\x{a2}\x{a3}
+ 3: $\x{a2}
+ 4: $
+    \x{9f2}
+ 0: \x{9f2}
+    ** Failers
+No match
+    X
+No match
+    \x{2c2}
+No match
+  
+/^\p{Sk}/8
+    \x{2c2}
+ 0: \x{2c2}
+    ** Failers
+No match
+    X
+No match
+    \x{9f2}
+No match
+  
+/^\p{Sm}+/8
+    +<|~\x{ac}\x{2044}
+ 0: +<|~\x{ac}\x{2044}
+ 1: +<|~\x{ac}
+ 2: +<|~
+ 3: +<|
+ 4: +<
+ 5: +
+    ** Failers
+No match
+    X
+No match
+    \x{9f2}
+No match
+  
+/^\p{So}/8
+    \x{a6}
+ 0: \x{a6}
+    \x{482} 
+ 0: \x{482}
+    ** Failers
+No match
+    X
+No match
+    \x{9f2}
+No match
+  
+/^\p{Zl}/8
+    \x{2028}
+ 0: \x{2028}
+    ** Failers
+No match
+    X
+No match
+    \x{2029}
+No match
+  
+/^\p{Zp}/8
+    \x{2029}
+ 0: \x{2029}
+    ** Failers
+No match
+    X
+No match
+    \x{2028}
+No match
+  
+/^\p{Zs}/8
+    \ \
+ 0:  
+    \x{a0}
+ 0: \x{a0}
+    \x{1680}
+ 0: \x{1680}
+    \x{180e}
+ 0: \x{180e}
+    \x{2000}
+ 0: \x{2000}
+    \x{2001}     
+ 0: \x{2001}
+    ** Failers
+No match
+    \x{2028}
+No match
+    \x{200d} 
+No match
+  
+/\p{Nd}+(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: \x{660}\x{661}\x{662}A
+ 2: \x{660}\x{661}\x{662}
+  
+/\p{Nd}+?(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: \x{660}\x{661}\x{662}A
+ 2: \x{660}\x{661}\x{662}
+  
+/\p{Nd}{2,}(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: \x{660}\x{661}\x{662}A
+  
+/\p{Nd}{2,}?(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: \x{660}\x{661}\x{662}A
+  
+/\p{Nd}*(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: \x{660}\x{661}\x{662}A
+ 2: \x{660}\x{661}\x{662}
+ 3: \x{660}\x{661}
+  
+/\p{Nd}*?(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: \x{660}\x{661}\x{662}A
+ 2: \x{660}\x{661}\x{662}
+ 3: \x{660}\x{661}
+  
+/\p{Nd}{2}(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}A
+  
+/\p{Nd}{2,3}(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: \x{660}\x{661}\x{662}A
+  
+/\p{Nd}{2,3}?(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: \x{660}\x{661}\x{662}A
+  
+/\p{Nd}?(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}
+ 1: \x{660}\x{661}
+  
+/\p{Nd}??(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}
+ 1: \x{660}\x{661}
+  
+/\p{Nd}*+(..)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+  
+/\p{Nd}*+(...)/8
+      \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}ABC
+  
+/\p{Nd}*+(....)/8
+      ** Failers
+ 0: ** F
+      \x{660}\x{661}\x{662}ABC
+No match
+  
+/\p{Lu}/8i
+    A
+ 0: A
+    a\x{10a0}B 
+ 0: \x{10a0}
+    ** Failers 
+ 0: F
+    a
+No match
+    \x{1d00}  
+No match
+
+/\p{^Lu}/8i
+    1234
+ 0: 1
+    ** Failers
+ 0: *
+    ABC 
+No match
+
+/\P{Lu}/8i
+    1234
+ 0: 1
+    ** Failers
+ 0: *
+    ABC 
+No match
+
+/(?<=A\p{Nd})XYZ/8
+    A2XYZ
+ 0: XYZ
+    123A5XYZPQR
+ 0: XYZ
+    ABA\x{660}XYZpqr
+ 0: XYZ
+    ** Failers
+No match
+    AXYZ
+No match
+    XYZ     
+No match
+    
+/(?<!\pL)XYZ/8
+    1XYZ
+ 0: XYZ
+    AB=XYZ.. 
+ 0: XYZ
+    XYZ 
+ 0: XYZ
+    ** Failers
+No match
+    WXYZ 
+No match
+
+/[\p{Nd}]/8
+    1234
+ 0: 1
+
+/[\p{Nd}+-]+/8
+    1234
+ 0: 1234
+ 1: 123
+ 2: 12
+ 3: 1
+    12-34
+ 0: 12-34
+ 1: 12-3
+ 2: 12-
+ 3: 12
+ 4: 1
+    12+\x{661}-34  
+ 0: 12+\x{661}-34
+ 1: 12+\x{661}-3
+ 2: 12+\x{661}-
+ 3: 12+\x{661}
+ 4: 12+
+ 5: 12
+ 6: 1
+    ** Failers
+No match
+    abcd  
+No match
+
+/[\P{Nd}]+/8
+    abcd
+ 0: abcd
+ 1: abc
+ 2: ab
+ 3: a
+    ** Failers
+ 0: ** Failers
+ 1: ** Failer
+ 2: ** Faile
+ 3: ** Fail
+ 4: ** Fai
+ 5: ** Fa
+ 6: ** F
+ 7: ** 
+ 8: **
+ 9: *
+    1234
+No match
+
+/\D+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but too many subsidiary matches
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+     
+/\P{Nd}+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but too many subsidiary matches
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\D]+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but too many subsidiary matches
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\P{Nd}]+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but too many subsidiary matches
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\D\P{Nd}]+/8
+    11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+Matched, but too many subsidiary matches
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 2: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 3: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 6: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 7: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 8: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 9: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+10: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+11: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+12: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+13: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+14: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+15: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+16: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+17: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+18: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+19: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+20: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+21: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\pL/8
+    a
+ 0: a
+    A 
+ 0: A
+
+/\pL/8i
+    a
+ 0: a
+    A 
+ 0: A
+    
+/\p{Lu}/8 
+    A
+ 0: A
+    aZ
+ 0: Z
+    ** Failers
+ 0: F
+    abc   
+No match
+
+/\p{Lu}/8i
+    A
+ 0: A
+    aZ
+ 0: Z
+    ** Failers
+ 0: F
+    abc   
+No match
+
+/\p{Ll}/8 
+    a
+ 0: a
+    Az
+ 0: z
+    ** Failers
+ 0: a
+    ABC   
+No match
+
+/\p{Ll}/8i 
+    a
+ 0: a
+    Az
+ 0: z
+    ** Failers
+ 0: a
+    ABC   
+No match
+
+/^\x{c0}$/8i
+    \x{c0}
+ 0: \x{c0}
+    \x{e0} 
+ 0: \x{e0}
+
+/^\x{e0}$/8i
+    \x{c0}
+ 0: \x{c0}
+    \x{e0} 
+ 0: \x{e0}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8
+    A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 0: A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+    ** Failers
+No match
+    a\x{391}\x{10427}\x{ff3a}\x{1fb0}   
+No match
+    A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+No match
+    A\x{391}\x{1044F}\x{ff3a}\x{1fb0}
+No match
+    A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+No match
+    A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+No match
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8i
+    A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 0: A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+    a\x{391}\x{10427}\x{ff3a}\x{1fb0}   
+ 0: a\x{391}\x{10427}\x{ff3a}\x{1fb0}
+    A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+ 0: A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+    A\x{391}\x{1044F}\x{ff3a}\x{1fb0}
+ 0: A\x{391}\x{1044f}\x{ff3a}\x{1fb0}
+    A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+ 0: A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+    A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+ 0: A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+
+/\x{391}+/8i
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+ 0: \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+ 1: \x{391}\x{3b1}\x{3b1}\x{3b1}
+ 2: \x{391}\x{3b1}\x{3b1}
+ 3: \x{391}\x{3b1}
+ 4: \x{391}
+
+/\x{391}{3,5}(.)/8i
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+ 0: \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+ 1: \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+ 2: \x{391}\x{3b1}\x{3b1}\x{3b1}
+
+/\x{391}{3,5}?(.)/8i
+    \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+ 0: \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+ 1: \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+ 2: \x{391}\x{3b1}\x{3b1}\x{3b1}
+
+/[\x{391}\x{ff3a}]/8i
+    \x{391}
+ 0: \x{391}
+    \x{ff3a}
+ 0: \x{ff3a}
+    \x{3b1}
+ 0: \x{3b1}
+    \x{ff5a}   
+ 0: \x{ff5a}
+    
+/[\x{c0}\x{391}]/8i
+    \x{c0}
+ 0: \x{c0}
+    \x{e0} 
+ 0: \x{e0}
+
+/[\x{105}-\x{109}]/8i
+    \x{104}
+ 0: \x{104}
+    \x{105}
+ 0: \x{105}
+    \x{109}  
+ 0: \x{109}
+    ** Failers
+No match
+    \x{100}
+No match
+    \x{10a} 
+No match
+    
+/[z-\x{100}]/8i 
+    Z
+ 0: Z
+    z
+ 0: z
+    \x{39c}
+ 0: \x{39c}
+    \x{178}
+ 0: \x{178}
+    |
+ 0: |
+    \x{80}
+ 0: \x{80}
+    \x{ff}
+ 0: \x{ff}
+    \x{100}
+ 0: \x{100}
+    \x{101} 
+ 0: \x{101}
+    ** Failers
+No match
+    \x{102}
+No match
+    Y
+No match
+    y           
+No match
+
+/[z-\x{100}]/8i
+
+/^\X/8
+    A
+ 0: A
+    A\x{300}BC 
+ 0: A\x{300}
+    A\x{300}\x{301}\x{302}BC 
+ 0: A\x{300}\x{301}\x{302}
+    *** Failers
+ 0: *
+    \x{300}  
+No match
+
+/^[\X]/8
+    X123
+ 0: X
+    *** Failers
+No match
+    AXYZ
+No match
+
+/^(\X*)C/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+ 0: A\x{300}\x{301}\x{302}BC
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+ 0: A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+ 1: A\x{300}\x{301}\x{302}BC
+
+/^(\X*?)C/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+ 0: A\x{300}\x{301}\x{302}BC
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+ 0: A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+ 1: A\x{300}\x{301}\x{302}BC
+
+/^(\X*)(.)/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+ 0: A\x{300}\x{301}\x{302}BCA
+ 1: A\x{300}\x{301}\x{302}BC
+ 2: A\x{300}\x{301}\x{302}B
+ 3: A
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+ 0: A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+ 1: A\x{300}\x{301}\x{302}BCA
+ 2: A\x{300}\x{301}\x{302}BC
+ 3: A\x{300}\x{301}\x{302}B
+ 4: A
+
+/^(\X*?)(.)/8
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301} 
+ 0: A\x{300}\x{301}\x{302}BCA
+ 1: A\x{300}\x{301}\x{302}BC
+ 2: A\x{300}\x{301}\x{302}B
+ 3: A
+    A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C 
+ 0: A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+ 1: A\x{300}\x{301}\x{302}BCA
+ 2: A\x{300}\x{301}\x{302}BC
+ 3: A\x{300}\x{301}\x{302}B
+ 4: A
+
+/^\X(.)/8
+    *** Failers
+ 0: **
+    A\x{300}\x{301}\x{302}
+No match
+
+/^\X{2,3}(.)/8
+    A\x{300}\x{301}B\x{300}X
+ 0: A\x{300}\x{301}B\x{300}X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}
+ 0: A\x{300}\x{301}B\x{300}C
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+ 0: A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+ 1: A\x{300}\x{301}B\x{300}C
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}DA\x{300}X
+ 0: A\x{300}\x{301}B\x{300}C\x{300}\x{301}D
+ 1: A\x{300}\x{301}B\x{300}C
+    
+/^\X{2,3}?(.)/8
+    A\x{300}\x{301}B\x{300}X
+ 0: A\x{300}\x{301}B\x{300}X
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}
+ 0: A\x{300}\x{301}B\x{300}C
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+ 0: A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+ 1: A\x{300}\x{301}B\x{300}C
+    A\x{300}\x{301}B\x{300}C\x{300}\x{301}DA\x{300}X
+ 0: A\x{300}\x{301}B\x{300}C\x{300}\x{301}D
+ 1: A\x{300}\x{301}B\x{300}C
+
+/^\pN{2,3}X/
+    12X
+ 0: 12X
+    123X
+ 0: 123X
+    *** Failers
+No match
+    X
+No match
+    1X
+No match
+    1234X     
+No match
+
+/\x{100}/i8
+    \x{100}   
+ 0: \x{100}
+    \x{101} 
+ 0: \x{101}
+    
+/ End / 
diff -Nurp tin-1.6.2/pcre/ucp.h tin-1.8.0/pcre/ucp.h
--- tin-1.6.2/pcre/ucp.h	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/ucp.h	2005-09-12 16:42:51.000000000 +0200
@@ -0,0 +1,58 @@
+/*************************************************
+*     libucp - Unicode Property Table handler    *
+*************************************************/
+
+
+#ifndef _UCP_H
+#define _UCP_H
+
+/* These are the character categories that are returned by ucp_findchar */
+
+enum {
+  ucp_C,     /* Other */
+  ucp_L,     /* Letter */
+  ucp_M,     /* Mark */
+  ucp_N,     /* Number */
+  ucp_P,     /* Punctuation */
+  ucp_S,     /* Symbol */
+  ucp_Z      /* Separator */
+};
+
+/* These are the detailed character types that are returned by ucp_findchar */
+
+enum {
+  ucp_Cc,    /* Control */
+  ucp_Cf,    /* Format */
+  ucp_Cn,    /* Unassigned */
+  ucp_Co,    /* Private use */
+  ucp_Cs,    /* Surrogate */
+  ucp_Ll,    /* Lower case letter */
+  ucp_Lm,    /* Modifier letter */
+  ucp_Lo,    /* Other letter */
+  ucp_Lt,    /* Title case letter */
+  ucp_Lu,    /* Upper case letter */
+  ucp_Mc,    /* Spacing mark */
+  ucp_Me,    /* Enclosing mark */
+  ucp_Mn,    /* Non-spacing mark */
+  ucp_Nd,    /* Decimal number */
+  ucp_Nl,    /* Letter number */
+  ucp_No,    /* Other number */
+  ucp_Pc,    /* Connector punctuation */
+  ucp_Pd,    /* Dash punctuation */
+  ucp_Pe,    /* Close punctuation */
+  ucp_Pf,    /* Final punctuation */
+  ucp_Pi,    /* Initial punctuation */
+  ucp_Po,    /* Other punctuation */
+  ucp_Ps,    /* Open punctuation */
+  ucp_Sc,    /* Currency symbol */
+  ucp_Sk,    /* Modifier symbol */
+  ucp_Sm,    /* Mathematical symbol */
+  ucp_So,    /* Other symbol */
+  ucp_Zl,    /* Line separator */
+  ucp_Zp,    /* Paragraph separator */
+  ucp_Zs     /* Space separator */
+};
+
+#endif
+
+/* End of ucp.h */
diff -Nurp tin-1.6.2/pcre/ucpinternal.h tin-1.8.0/pcre/ucpinternal.h
--- tin-1.6.2/pcre/ucpinternal.h	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/ucpinternal.h	2005-06-28 10:31:26.000000000 +0200
@@ -0,0 +1,91 @@
+/*************************************************
+*     libucp - Unicode Property Table handler    *
+*************************************************/
+
+/* Internal header file defining the layout of compact nodes in the tree. */
+
+typedef struct cnode {
+  unsigned short int f0;
+  unsigned short int f1;
+  unsigned short int f2;
+} cnode;
+
+/* Things for the f0 field */
+
+#define f0_leftexists   0x8000    /* Left child exists */
+#define f0_typemask     0x3f00    /* Type bits */
+#define f0_typeshift         8    /* Type shift */
+#define f0_chhmask      0x00ff    /* Character high bits */
+
+/* Things for the f2 field */
+
+#define f2_rightmask    0xf000    /* Mask for right offset bits */
+#define f2_rightshift       12    /* Shift for right offset */
+#define f2_casemask     0x0fff    /* Mask for case offset */
+
+/* The tree consists of a vector of structures of type cnode, with the root
+node as the first element. The three short ints (16-bits) are used as follows:
+
+(f0) (1) The 0x8000 bit of f0 is set if a left child exists. The child's node
+         is the next node in the vector.
+     (2) The 0x4000 bits of f0 is spare.
+     (3) The 0x3f00 bits of f0 contain the character type; this is a number
+         defined by the enumeration in ucp.h (e.g. ucp_Lu).
+     (4) The bottom 8 bits of f0 contain the most significant byte of the
+         character's 24-bit codepoint.
+
+(f1) (1) The f1 field contains the two least significant bytes of the
+         codepoint.
+
+(f2) (1) The 0xf000 bits of f2 contain zero if there is no right child of this
+         node. Otherwise, they contain one plus the exponent of the power of
+         two of the offset to the right node (e.g. a value of 3 means 8). The
+         units of the offset are node items.
+
+     (2) The 0x0fff bits of f2 contain the signed offset from this character to
+         its alternate cased value. They are zero if there is no such
+         character.
+
+
+-----------------------------------------------------------------------------
+||.|.| type (6) | ms char (8) ||  ls char (16)  ||....|  case offset (12)  ||
+-----------------------------------------------------------------------------
+  | |                                              |
+  | |-> spare                                      |
+  |                                        exponent of right
+  |-> left child exists                       child offset
+
+
+The upper/lower casing information is set only for characters that come in
+pairs. There are (at present) four non-one-to-one mappings in the Unicode data.
+These are ignored. They are:
+
+  1FBE Greek Prosgegrammeni (lower, with upper -> capital iota)
+  2126 Ohm
+  212A Kelvin
+  212B Angstrom
+
+Certainly for the last three, having an alternate case would seem to be a
+mistake. I don't know any Greek, so cannot comment on the first one.
+
+
+When searching the tree, proceed as follows:
+
+(1) Start at the first node.
+
+(2) Extract the character value from f1 and the bottom 8 bits of f0;
+
+(3) Compare with the character being sought. If equal, we are done.
+
+(4) If the test character is smaller, inspect the f0_leftexists flag. If it is
+    not set, the character is not in the tree. If it is set, move to the next
+    node, and go to (2).
+
+(5) If the test character is bigger, extract the f2_rightmask bits from f2, and
+    shift them right by f2_rightshift. If the result is zero, the character is
+    not in the tree. Otherwise, calculate the number of nodes to skip by
+    shifting the value 1 left by this number minus one. Go to (2).
+*/
+
+
+/* End of internal.h */
diff -Nurp tin-1.6.2/pcre/ucptable.c tin-1.8.0/pcre/ucptable.c
--- tin-1.6.2/pcre/ucptable.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/pcre/ucptable.c	2005-06-28 10:31:26.000000000 +0200
@@ -0,0 +1,15105 @@
+/* This source module is automatically generated from the Unicode
+property table. See internal.h for a description of the layout. */
+
+static cnode ucp_table[] = {
+  { 0x9a00, 0x2f1f, 0xe000 },
+  { 0x8700, 0x1558, 0xd000 },
+  { 0x8700, 0x0a99, 0xc000 },
+  { 0x8500, 0x0435, 0xbfe0 },
+  { 0x8500, 0x01ff, 0xafff },
+  { 0x8500, 0x00ff, 0x9079 },
+  { 0x8000, 0x007f, 0x8000 },
+  { 0x9500, 0x003f, 0x7000 },
+  { 0x8000, 0x001f, 0x6000 },
+  { 0x8000, 0x000f, 0x5000 },
+  { 0x8000, 0x0007, 0x4000 },
+  { 0x8000, 0x0003, 0x3000 },
+  { 0x8000, 0x0001, 0x2000 },
+  { 0x0000, 0x0000, 0x0000 },
+  { 0x0000, 0x0002, 0x0000 },
+  { 0x8000, 0x0005, 0x2000 },
+  { 0x0000, 0x0004, 0x0000 },
+  { 0x0000, 0x0006, 0x0000 },
+  { 0x8000, 0x000b, 0x3000 },
+  { 0x8000, 0x0009, 0x2000 },
+  { 0x0000, 0x0008, 0x0000 },
+  { 0x0000, 0x000a, 0x0000 },
+  { 0x8000, 0x000d, 0x2000 },
+  { 0x0000, 0x000c, 0x0000 },
+  { 0x0000, 0x000e, 0x0000 },
+  { 0x8000, 0x0017, 0x4000 },
+  { 0x8000, 0x0013, 0x3000 },
+  { 0x8000, 0x0011, 0x2000 },
+  { 0x0000, 0x0010, 0x0000 },
+  { 0x0000, 0x0012, 0x0000 },
+  { 0x8000, 0x0015, 0x2000 },
+  { 0x0000, 0x0014, 0x0000 },
+  { 0x0000, 0x0016, 0x0000 },
+  { 0x8000, 0x001b, 0x3000 },
+  { 0x8000, 0x0019, 0x2000 },
+  { 0x0000, 0x0018, 0x0000 },
+  { 0x0000, 0x001a, 0x0000 },
+  { 0x8000, 0x001d, 0x2000 },
+  { 0x0000, 0x001c, 0x0000 },
+  { 0x0000, 0x001e, 0x0000 },
+  { 0x9500, 0x002f, 0x5000 },
+  { 0x9500, 0x0027, 0x4000 },
+  { 0x9500, 0x0023, 0x3000 },
+  { 0x9500, 0x0021, 0x2000 },
+  { 0x1d00, 0x0020, 0x0000 },
+  { 0x1500, 0x0022, 0x0000 },
+  { 0x9500, 0x0025, 0x2000 },
+  { 0x1700, 0x0024, 0x0000 },
+  { 0x1500, 0x0026, 0x0000 },
+  { 0x9900, 0x002b, 0x3000 },
+  { 0x9200, 0x0029, 0x2000 },
+  { 0x1600, 0x0028, 0x0000 },
+  { 0x1500, 0x002a, 0x0000 },
+  { 0x9100, 0x002d, 0x2000 },
+  { 0x1500, 0x002c, 0x0000 },
+  { 0x1500, 0x002e, 0x0000 },
+  { 0x8d00, 0x0037, 0x4000 },
+  { 0x8d00, 0x0033, 0x3000 },
+  { 0x8d00, 0x0031, 0x2000 },
+  { 0x0d00, 0x0030, 0x0000 },
+  { 0x0d00, 0x0032, 0x0000 },
+  { 0x8d00, 0x0035, 0x2000 },
+  { 0x0d00, 0x0034, 0x0000 },
+  { 0x0d00, 0x0036, 0x0000 },
+  { 0x9500, 0x003b, 0x3000 },
+  { 0x8d00, 0x0039, 0x2000 },
+  { 0x0d00, 0x0038, 0x0000 },
+  { 0x1500, 0x003a, 0x0000 },
+  { 0x9900, 0x003d, 0x2000 },
+  { 0x1900, 0x003c, 0x0000 },
+  { 0x1900, 0x003e, 0x0000 },
+  { 0x9000, 0x005f, 0x6000 },
+  { 0x8900, 0x004f, 0x5020 },
+  { 0x8900, 0x0047, 0x4020 },
+  { 0x8900, 0x0043, 0x3020 },
+  { 0x8900, 0x0041, 0x2020 },
+  { 0x1500, 0x0040, 0x0000 },
+  { 0x0900, 0x0042, 0x0020 },
+  { 0x8900, 0x0045, 0x2020 },
+  { 0x0900, 0x0044, 0x0020 },
+  { 0x0900, 0x0046, 0x0020 },
+  { 0x8900, 0x004b, 0x3020 },
+  { 0x8900, 0x0049, 0x2020 },
+  { 0x0900, 0x0048, 0x0020 },
+  { 0x0900, 0x004a, 0x0020 },
+  { 0x8900, 0x004d, 0x2020 },
+  { 0x0900, 0x004c, 0x0020 },
+  { 0x0900, 0x004e, 0x0020 },
+  { 0x8900, 0x0057, 0x4020 },
+  { 0x8900, 0x0053, 0x3020 },
+  { 0x8900, 0x0051, 0x2020 },
+  { 0x0900, 0x0050, 0x0020 },
+  { 0x0900, 0x0052, 0x0020 },
+  { 0x8900, 0x0055, 0x2020 },
+  { 0x0900, 0x0054, 0x0020 },
+  { 0x0900, 0x0056, 0x0020 },
+  { 0x9600, 0x005b, 0x3000 },
+  { 0x8900, 0x0059, 0x2020 },
+  { 0x0900, 0x0058, 0x0020 },
+  { 0x0900, 0x005a, 0x0020 },
+  { 0x9200, 0x005d, 0x2000 },
+  { 0x1500, 0x005c, 0x0000 },
+  { 0x1800, 0x005e, 0x0000 },
+  { 0x8500, 0x006f, 0x5fe0 },
+  { 0x8500, 0x0067, 0x4fe0 },
+  { 0x8500, 0x0063, 0x3fe0 },
+  { 0x8500, 0x0061, 0x2fe0 },
+  { 0x1800, 0x0060, 0x0000 },
+  { 0x0500, 0x0062, 0x0fe0 },
+  { 0x8500, 0x0065, 0x2fe0 },
+  { 0x0500, 0x0064, 0x0fe0 },
+  { 0x0500, 0x0066, 0x0fe0 },
+  { 0x8500, 0x006b, 0x3fe0 },
+  { 0x8500, 0x0069, 0x2fe0 },
+  { 0x0500, 0x0068, 0x0fe0 },
+  { 0x0500, 0x006a, 0x0fe0 },
+  { 0x8500, 0x006d, 0x2fe0 },
+  { 0x0500, 0x006c, 0x0fe0 },
+  { 0x0500, 0x006e, 0x0fe0 },
+  { 0x8500, 0x0077, 0x4fe0 },
+  { 0x8500, 0x0073, 0x3fe0 },
+  { 0x8500, 0x0071, 0x2fe0 },
+  { 0x0500, 0x0070, 0x0fe0 },
+  { 0x0500, 0x0072, 0x0fe0 },
+  { 0x8500, 0x0075, 0x2fe0 },
+  { 0x0500, 0x0074, 0x0fe0 },
+  { 0x0500, 0x0076, 0x0fe0 },
+  { 0x9600, 0x007b, 0x3000 },
+  { 0x8500, 0x0079, 0x2fe0 },
+  { 0x0500, 0x0078, 0x0fe0 },
+  { 0x0500, 0x007a, 0x0fe0 },
+  { 0x9200, 0x007d, 0x2000 },
+  { 0x1900, 0x007c, 0x0000 },
+  { 0x1900, 0x007e, 0x0000 },
+  { 0x9500, 0x00bf, 0x7000 },
+  { 0x8000, 0x009f, 0x6000 },
+  { 0x8000, 0x008f, 0x5000 },
+  { 0x8000, 0x0087, 0x4000 },
+  { 0x8000, 0x0083, 0x3000 },
+  { 0x8000, 0x0081, 0x2000 },
+  { 0x0000, 0x0080, 0x0000 },
+  { 0x0000, 0x0082, 0x0000 },
+  { 0x8000, 0x0085, 0x2000 },
+  { 0x0000, 0x0084, 0x0000 },
+  { 0x0000, 0x0086, 0x0000 },
+  { 0x8000, 0x008b, 0x3000 },
+  { 0x8000, 0x0089, 0x2000 },
+  { 0x0000, 0x0088, 0x0000 },
+  { 0x0000, 0x008a, 0x0000 },
+  { 0x8000, 0x008d, 0x2000 },
+  { 0x0000, 0x008c, 0x0000 },
+  { 0x0000, 0x008e, 0x0000 },
+  { 0x8000, 0x0097, 0x4000 },
+  { 0x8000, 0x0093, 0x3000 },
+  { 0x8000, 0x0091, 0x2000 },
+  { 0x0000, 0x0090, 0x0000 },
+  { 0x0000, 0x0092, 0x0000 },
+  { 0x8000, 0x0095, 0x2000 },
+  { 0x0000, 0x0094, 0x0000 },
+  { 0x0000, 0x0096, 0x0000 },
+  { 0x8000, 0x009b, 0x3000 },
+  { 0x8000, 0x0099, 0x2000 },
+  { 0x0000, 0x0098, 0x0000 },
+  { 0x0000, 0x009a, 0x0000 },
+  { 0x8000, 0x009d, 0x2000 },
+  { 0x0000, 0x009c, 0x0000 },
+  { 0x0000, 0x009e, 0x0000 },
+  { 0x9800, 0x00af, 0x5000 },
+  { 0x9a00, 0x00a7, 0x4000 },
+  { 0x9700, 0x00a3, 0x3000 },
+  { 0x9500, 0x00a1, 0x2000 },
+  { 0x1d00, 0x00a0, 0x0000 },
+  { 0x1700, 0x00a2, 0x0000 },
+  { 0x9700, 0x00a5, 0x2000 },
+  { 0x1700, 0x00a4, 0x0000 },
+  { 0x1a00, 0x00a6, 0x0000 },
+  { 0x9400, 0x00ab, 0x3000 },
+  { 0x9a00, 0x00a9, 0x2000 },
+  { 0x1800, 0x00a8, 0x0000 },
+  { 0x0500, 0x00aa, 0x0000 },
+  { 0x8100, 0x00ad, 0x2000 },
+  { 0x1900, 0x00ac, 0x0000 },
+  { 0x1a00, 0x00ae, 0x0000 },
+  { 0x9500, 0x00b7, 0x4000 },
+  { 0x8f00, 0x00b3, 0x3000 },
+  { 0x9900, 0x00b1, 0x2000 },
+  { 0x1a00, 0x00b0, 0x0000 },
+  { 0x0f00, 0x00b2, 0x0000 },
+  { 0x8500, 0x00b5, 0x22e7 },
+  { 0x1800, 0x00b4, 0x0000 },
+  { 0x1a00, 0x00b6, 0x0000 },
+  { 0x9300, 0x00bb, 0x3000 },
+  { 0x8f00, 0x00b9, 0x2000 },
+  { 0x1800, 0x00b8, 0x0000 },
+  { 0x0500, 0x00ba, 0x0000 },
+  { 0x8f00, 0x00bd, 0x2000 },
+  { 0x0f00, 0x00bc, 0x0000 },
+  { 0x0f00, 0x00be, 0x0000 },
+  { 0x8500, 0x00df, 0x6000 },
+  { 0x8900, 0x00cf, 0x5020 },
+  { 0x8900, 0x00c7, 0x4020 },
+  { 0x8900, 0x00c3, 0x3020 },
+  { 0x8900, 0x00c1, 0x2020 },
+  { 0x0900, 0x00c0, 0x0020 },
+  { 0x0900, 0x00c2, 0x0020 },
+  { 0x8900, 0x00c5, 0x2020 },
+  { 0x0900, 0x00c4, 0x0020 },
+  { 0x0900, 0x00c6, 0x0020 },
+  { 0x8900, 0x00cb, 0x3020 },
+  { 0x8900, 0x00c9, 0x2020 },
+  { 0x0900, 0x00c8, 0x0020 },
+  { 0x0900, 0x00ca, 0x0020 },
+  { 0x8900, 0x00cd, 0x2020 },
+  { 0x0900, 0x00cc, 0x0020 },
+  { 0x0900, 0x00ce, 0x0020 },
+  { 0x9900, 0x00d7, 0x4000 },
+  { 0x8900, 0x00d3, 0x3020 },
+  { 0x8900, 0x00d1, 0x2020 },
+  { 0x0900, 0x00d0, 0x0020 },
+  { 0x0900, 0x00d2, 0x0020 },
+  { 0x8900, 0x00d5, 0x2020 },
+  { 0x0900, 0x00d4, 0x0020 },
+  { 0x0900, 0x00d6, 0x0020 },
+  { 0x8900, 0x00db, 0x3020 },
+  { 0x8900, 0x00d9, 0x2020 },
+  { 0x0900, 0x00d8, 0x0020 },
+  { 0x0900, 0x00da, 0x0020 },
+  { 0x8900, 0x00dd, 0x2020 },
+  { 0x0900, 0x00dc, 0x0020 },
+  { 0x0900, 0x00de, 0x0020 },
+  { 0x8500, 0x00ef, 0x5fe0 },
+  { 0x8500, 0x00e7, 0x4fe0 },
+  { 0x8500, 0x00e3, 0x3fe0 },
+  { 0x8500, 0x00e1, 0x2fe0 },
+  { 0x0500, 0x00e0, 0x0fe0 },
+  { 0x0500, 0x00e2, 0x0fe0 },
+  { 0x8500, 0x00e5, 0x2fe0 },
+  { 0x0500, 0x00e4, 0x0fe0 },
+  { 0x0500, 0x00e6, 0x0fe0 },
+  { 0x8500, 0x00eb, 0x3fe0 },
+  { 0x8500, 0x00e9, 0x2fe0 },
+  { 0x0500, 0x00e8, 0x0fe0 },
+  { 0x0500, 0x00ea, 0x0fe0 },
+  { 0x8500, 0x00ed, 0x2fe0 },
+  { 0x0500, 0x00ec, 0x0fe0 },
+  { 0x0500, 0x00ee, 0x0fe0 },
+  { 0x9900, 0x00f7, 0x4000 },
+  { 0x8500, 0x00f3, 0x3fe0 },
+  { 0x8500, 0x00f1, 0x2fe0 },
+  { 0x0500, 0x00f0, 0x0fe0 },
+  { 0x0500, 0x00f2, 0x0fe0 },
+  { 0x8500, 0x00f5, 0x2fe0 },
+  { 0x0500, 0x00f4, 0x0fe0 },
+  { 0x0500, 0x00f6, 0x0fe0 },
+  { 0x8500, 0x00fb, 0x3fe0 },
+  { 0x8500, 0x00f9, 0x2fe0 },
+  { 0x0500, 0x00f8, 0x0fe0 },
+  { 0x0500, 0x00fa, 0x0fe0 },
+  { 0x8500, 0x00fd, 0x2fe0 },
+  { 0x0500, 0x00fc, 0x0fe0 },
+  { 0x0500, 0x00fe, 0x0fe0 },
+  { 0x8500, 0x017f, 0x8ed4 },
+  { 0x8900, 0x013f, 0x7001 },
+  { 0x8500, 0x011f, 0x6fff },
+  { 0x8500, 0x010f, 0x5fff },
+  { 0x8500, 0x0107, 0x4fff },
+  { 0x8500, 0x0103, 0x3fff },
+  { 0x8500, 0x0101, 0x2fff },
+  { 0x0900, 0x0100, 0x0001 },
+  { 0x0900, 0x0102, 0x0001 },
+  { 0x8500, 0x0105, 0x2fff },
+  { 0x0900, 0x0104, 0x0001 },
+  { 0x0900, 0x0106, 0x0001 },
+  { 0x8500, 0x010b, 0x3fff },
+  { 0x8500, 0x0109, 0x2fff },
+  { 0x0900, 0x0108, 0x0001 },
+  { 0x0900, 0x010a, 0x0001 },
+  { 0x8500, 0x010d, 0x2fff },
+  { 0x0900, 0x010c, 0x0001 },
+  { 0x0900, 0x010e, 0x0001 },
+  { 0x8500, 0x0117, 0x4fff },
+  { 0x8500, 0x0113, 0x3fff },
+  { 0x8500, 0x0111, 0x2fff },
+  { 0x0900, 0x0110, 0x0001 },
+  { 0x0900, 0x0112, 0x0001 },
+  { 0x8500, 0x0115, 0x2fff },
+  { 0x0900, 0x0114, 0x0001 },
+  { 0x0900, 0x0116, 0x0001 },
+  { 0x8500, 0x011b, 0x3fff },
+  { 0x8500, 0x0119, 0x2fff },
+  { 0x0900, 0x0118, 0x0001 },
+  { 0x0900, 0x011a, 0x0001 },
+  { 0x8500, 0x011d, 0x2fff },
+  { 0x0900, 0x011c, 0x0001 },
+  { 0x0900, 0x011e, 0x0001 },
+  { 0x8500, 0x012f, 0x5fff },
+  { 0x8500, 0x0127, 0x4fff },
+  { 0x8500, 0x0123, 0x3fff },
+  { 0x8500, 0x0121, 0x2fff },
+  { 0x0900, 0x0120, 0x0001 },
+  { 0x0900, 0x0122, 0x0001 },
+  { 0x8500, 0x0125, 0x2fff },
+  { 0x0900, 0x0124, 0x0001 },
+  { 0x0900, 0x0126, 0x0001 },
+  { 0x8500, 0x012b, 0x3fff },
+  { 0x8500, 0x0129, 0x2fff },
+  { 0x0900, 0x0128, 0x0001 },
+  { 0x0900, 0x012a, 0x0001 },
+  { 0x8500, 0x012d, 0x2fff },
+  { 0x0900, 0x012c, 0x0001 },
+  { 0x0900, 0x012e, 0x0001 },
+  { 0x8500, 0x0137, 0x4fff },
+  { 0x8500, 0x0133, 0x3fff },
+  { 0x8500, 0x0131, 0x2f18 },
+  { 0x0900, 0x0130, 0x0f39 },
+  { 0x0900, 0x0132, 0x0001 },
+  { 0x8500, 0x0135, 0x2fff },
+  { 0x0900, 0x0134, 0x0001 },
+  { 0x0900, 0x0136, 0x0001 },
+  { 0x8900, 0x013b, 0x3001 },
+  { 0x8900, 0x0139, 0x2001 },
+  { 0x0500, 0x0138, 0x0000 },
+  { 0x0500, 0x013a, 0x0fff },
+  { 0x8900, 0x013d, 0x2001 },
+  { 0x0500, 0x013c, 0x0fff },
+  { 0x0500, 0x013e, 0x0fff },
+  { 0x8500, 0x015f, 0x6fff },
+  { 0x8500, 0x014f, 0x5fff },
+  { 0x8900, 0x0147, 0x4001 },
+  { 0x8900, 0x0143, 0x3001 },
+  { 0x8900, 0x0141, 0x2001 },
+  { 0x0500, 0x0140, 0x0fff },
+  { 0x0500, 0x0142, 0x0fff },
+  { 0x8900, 0x0145, 0x2001 },
+  { 0x0500, 0x0144, 0x0fff },
+  { 0x0500, 0x0146, 0x0fff },
+  { 0x8500, 0x014b, 0x3fff },
+  { 0x8500, 0x0149, 0x2000 },
+  { 0x0500, 0x0148, 0x0fff },
+  { 0x0900, 0x014a, 0x0001 },
+  { 0x8500, 0x014d, 0x2fff },
+  { 0x0900, 0x014c, 0x0001 },
+  { 0x0900, 0x014e, 0x0001 },
+  { 0x8500, 0x0157, 0x4fff },
+  { 0x8500, 0x0153, 0x3fff },
+  { 0x8500, 0x0151, 0x2fff },
+  { 0x0900, 0x0150, 0x0001 },
+  { 0x0900, 0x0152, 0x0001 },
+  { 0x8500, 0x0155, 0x2fff },
+  { 0x0900, 0x0154, 0x0001 },
+  { 0x0900, 0x0156, 0x0001 },
+  { 0x8500, 0x015b, 0x3fff },
+  { 0x8500, 0x0159, 0x2fff },
+  { 0x0900, 0x0158, 0x0001 },
+  { 0x0900, 0x015a, 0x0001 },
+  { 0x8500, 0x015d, 0x2fff },
+  { 0x0900, 0x015c, 0x0001 },
+  { 0x0900, 0x015e, 0x0001 },
+  { 0x8500, 0x016f, 0x5fff },
+  { 0x8500, 0x0167, 0x4fff },
+  { 0x8500, 0x0163, 0x3fff },
+  { 0x8500, 0x0161, 0x2fff },
+  { 0x0900, 0x0160, 0x0001 },
+  { 0x0900, 0x0162, 0x0001 },
+  { 0x8500, 0x0165, 0x2fff },
+  { 0x0900, 0x0164, 0x0001 },
+  { 0x0900, 0x0166, 0x0001 },
+  { 0x8500, 0x016b, 0x3fff },
+  { 0x8500, 0x0169, 0x2fff },
+  { 0x0900, 0x0168, 0x0001 },
+  { 0x0900, 0x016a, 0x0001 },
+  { 0x8500, 0x016d, 0x2fff },
+  { 0x0900, 0x016c, 0x0001 },
+  { 0x0900, 0x016e, 0x0001 },
+  { 0x8500, 0x0177, 0x4fff },
+  { 0x8500, 0x0173, 0x3fff },
+  { 0x8500, 0x0171, 0x2fff },
+  { 0x0900, 0x0170, 0x0001 },
+  { 0x0900, 0x0172, 0x0001 },
+  { 0x8500, 0x0175, 0x2fff },
+  { 0x0900, 0x0174, 0x0001 },
+  { 0x0900, 0x0176, 0x0001 },
+  { 0x8900, 0x017b, 0x3001 },
+  { 0x8900, 0x0179, 0x2001 },
+  { 0x0900, 0x0178, 0x0f87 },
+  { 0x0500, 0x017a, 0x0fff },
+  { 0x8900, 0x017d, 0x2001 },
+  { 0x0500, 0x017c, 0x0fff },
+  { 0x0500, 0x017e, 0x0fff },
+  { 0x8500, 0x01bf, 0x7038 },
+  { 0x8900, 0x019f, 0x60d6 },
+  { 0x8900, 0x018f, 0x50ca },
+  { 0x8900, 0x0187, 0x4001 },
+  { 0x8500, 0x0183, 0x3fff },
+  { 0x8900, 0x0181, 0x20d2 },
+  { 0x0500, 0x0180, 0x0000 },
+  { 0x0900, 0x0182, 0x0001 },
+  { 0x8500, 0x0185, 0x2fff },
+  { 0x0900, 0x0184, 0x0001 },
+  { 0x0900, 0x0186, 0x00ce },
+  { 0x8900, 0x018b, 0x3001 },
+  { 0x8900, 0x0189, 0x20cd },
+  { 0x0500, 0x0188, 0x0fff },
+  { 0x0900, 0x018a, 0x00cd },
+  { 0x8500, 0x018d, 0x2000 },
+  { 0x0500, 0x018c, 0x0fff },
+  { 0x0900, 0x018e, 0x004f },
+  { 0x8900, 0x0197, 0x40d1 },
+  { 0x8900, 0x0193, 0x30cd },
+  { 0x8900, 0x0191, 0x2001 },
+  { 0x0900, 0x0190, 0x00cb },
+  { 0x0500, 0x0192, 0x0fff },
+  { 0x8500, 0x0195, 0x2061 },
+  { 0x0900, 0x0194, 0x00cf },
+  { 0x0900, 0x0196, 0x00d3 },
+  { 0x8500, 0x019b, 0x3000 },
+  { 0x8500, 0x0199, 0x2fff },
+  { 0x0900, 0x0198, 0x0001 },
+  { 0x0500, 0x019a, 0x0000 },
+  { 0x8900, 0x019d, 0x20d5 },
+  { 0x0900, 0x019c, 0x00d3 },
+  { 0x0500, 0x019e, 0x0082 },
+  { 0x8900, 0x01af, 0x5001 },
+  { 0x8900, 0x01a7, 0x4001 },
+  { 0x8500, 0x01a3, 0x3fff },
+  { 0x8500, 0x01a1, 0x2fff },
+  { 0x0900, 0x01a0, 0x0001 },
+  { 0x0900, 0x01a2, 0x0001 },
+  { 0x8500, 0x01a5, 0x2fff },
+  { 0x0900, 0x01a4, 0x0001 },
+  { 0x0900, 0x01a6, 0x00da },
+  { 0x8500, 0x01ab, 0x3000 },
+  { 0x8900, 0x01a9, 0x20da },
+  { 0x0500, 0x01a8, 0x0fff },
+  { 0x0500, 0x01aa, 0x0000 },
+  { 0x8500, 0x01ad, 0x2fff },
+  { 0x0900, 0x01ac, 0x0001 },
+  { 0x0900, 0x01ae, 0x00da },
+  { 0x8900, 0x01b7, 0x40db },
+  { 0x8900, 0x01b3, 0x3001 },
+  { 0x8900, 0x01b1, 0x20d9 },
+  { 0x0500, 0x01b0, 0x0fff },
+  { 0x0900, 0x01b2, 0x00d9 },
+  { 0x8900, 0x01b5, 0x2001 },
+  { 0x0500, 0x01b4, 0x0fff },
+  { 0x0500, 0x01b6, 0x0fff },
+  { 0x8700, 0x01bb, 0x3000 },
+  { 0x8500, 0x01b9, 0x2fff },
+  { 0x0900, 0x01b8, 0x0001 },
+  { 0x0500, 0x01ba, 0x0000 },
+  { 0x8500, 0x01bd, 0x2fff },
+  { 0x0900, 0x01bc, 0x0001 },
+  { 0x0500, 0x01be, 0x0000 },
+  { 0x8500, 0x01df, 0x6fff },
+  { 0x8900, 0x01cf, 0x5001 },
+  { 0x8900, 0x01c7, 0x4002 },
+  { 0x8700, 0x01c3, 0x3000 },
+  { 0x8700, 0x01c1, 0x2000 },
+  { 0x0700, 0x01c0, 0x0000 },
+  { 0x0700, 0x01c2, 0x0000 },
+  { 0x8800, 0x01c5, 0x2000 },
+  { 0x0900, 0x01c4, 0x0002 },
+  { 0x0500, 0x01c6, 0x0ffe },
+  { 0x8800, 0x01cb, 0x3000 },
+  { 0x8500, 0x01c9, 0x2ffe },
+  { 0x0800, 0x01c8, 0x0000 },
+  { 0x0900, 0x01ca, 0x0002 },
+  { 0x8900, 0x01cd, 0x2001 },
+  { 0x0500, 0x01cc, 0x0ffe },
+  { 0x0500, 0x01ce, 0x0fff },
+  { 0x8900, 0x01d7, 0x4001 },
+  { 0x8900, 0x01d3, 0x3001 },
+  { 0x8900, 0x01d1, 0x2001 },
+  { 0x0500, 0x01d0, 0x0fff },
+  { 0x0500, 0x01d2, 0x0fff },
+  { 0x8900, 0x01d5, 0x2001 },
+  { 0x0500, 0x01d4, 0x0fff },
+  { 0x0500, 0x01d6, 0x0fff },
+  { 0x8900, 0x01db, 0x3001 },
+  { 0x8900, 0x01d9, 0x2001 },
+  { 0x0500, 0x01d8, 0x0fff },
+  { 0x0500, 0x01da, 0x0fff },
+  { 0x8500, 0x01dd, 0x2fb1 },
+  { 0x0500, 0x01dc, 0x0fff },
+  { 0x0900, 0x01de, 0x0001 },
+  { 0x8500, 0x01ef, 0x5fff },
+  { 0x8500, 0x01e7, 0x4fff },
+  { 0x8500, 0x01e3, 0x3fff },
+  { 0x8500, 0x01e1, 0x2fff },
+  { 0x0900, 0x01e0, 0x0001 },
+  { 0x0900, 0x01e2, 0x0001 },
+  { 0x8500, 0x01e5, 0x2fff },
+  { 0x0900, 0x01e4, 0x0001 },
+  { 0x0900, 0x01e6, 0x0001 },
+  { 0x8500, 0x01eb, 0x3fff },
+  { 0x8500, 0x01e9, 0x2fff },
+  { 0x0900, 0x01e8, 0x0001 },
+  { 0x0900, 0x01ea, 0x0001 },
+  { 0x8500, 0x01ed, 0x2fff },
+  { 0x0900, 0x01ec, 0x0001 },
+  { 0x0900, 0x01ee, 0x0001 },
+  { 0x8900, 0x01f7, 0x4fc8 },
+  { 0x8500, 0x01f3, 0x3ffe },
+  { 0x8900, 0x01f1, 0x2002 },
+  { 0x0500, 0x01f0, 0x0000 },
+  { 0x0800, 0x01f2, 0x0000 },
+  { 0x8500, 0x01f5, 0x2fff },
+  { 0x0900, 0x01f4, 0x0001 },
+  { 0x0900, 0x01f6, 0x0f9f },
+  { 0x8500, 0x01fb, 0x3fff },
+  { 0x8500, 0x01f9, 0x2fff },
+  { 0x0900, 0x01f8, 0x0001 },
+  { 0x0900, 0x01fa, 0x0001 },
+  { 0x8500, 0x01fd, 0x2fff },
+  { 0x0900, 0x01fc, 0x0001 },
+  { 0x0900, 0x01fe, 0x0001 },
+  { 0x8c00, 0x0318, 0x9000 },
+  { 0x8500, 0x0298, 0x8000 },
+  { 0x8500, 0x0258, 0x7000 },
+  { 0x8500, 0x021f, 0x6fff },
+  { 0x8500, 0x020f, 0x5fff },
+  { 0x8500, 0x0207, 0x4fff },
+  { 0x8500, 0x0203, 0x3fff },
+  { 0x8500, 0x0201, 0x2fff },
+  { 0x0900, 0x0200, 0x0001 },
+  { 0x0900, 0x0202, 0x0001 },
+  { 0x8500, 0x0205, 0x2fff },
+  { 0x0900, 0x0204, 0x0001 },
+  { 0x0900, 0x0206, 0x0001 },
+  { 0x8500, 0x020b, 0x3fff },
+  { 0x8500, 0x0209, 0x2fff },
+  { 0x0900, 0x0208, 0x0001 },
+  { 0x0900, 0x020a, 0x0001 },
+  { 0x8500, 0x020d, 0x2fff },
+  { 0x0900, 0x020c, 0x0001 },
+  { 0x0900, 0x020e, 0x0001 },
+  { 0x8500, 0x0217, 0x4fff },
+  { 0x8500, 0x0213, 0x3fff },
+  { 0x8500, 0x0211, 0x2fff },
+  { 0x0900, 0x0210, 0x0001 },
+  { 0x0900, 0x0212, 0x0001 },
+  { 0x8500, 0x0215, 0x2fff },
+  { 0x0900, 0x0214, 0x0001 },
+  { 0x0900, 0x0216, 0x0001 },
+  { 0x8500, 0x021b, 0x3fff },
+  { 0x8500, 0x0219, 0x2fff },
+  { 0x0900, 0x0218, 0x0001 },
+  { 0x0900, 0x021a, 0x0001 },
+  { 0x8500, 0x021d, 0x2fff },
+  { 0x0900, 0x021c, 0x0001 },
+  { 0x0900, 0x021e, 0x0001 },
+  { 0x8500, 0x022f, 0x5fff },
+  { 0x8500, 0x0227, 0x4fff },
+  { 0x8500, 0x0223, 0x3fff },
+  { 0x8500, 0x0221, 0x2000 },
+  { 0x0900, 0x0220, 0x0f7e },
+  { 0x0900, 0x0222, 0x0001 },
+  { 0x8500, 0x0225, 0x2fff },
+  { 0x0900, 0x0224, 0x0001 },
+  { 0x0900, 0x0226, 0x0001 },
+  { 0x8500, 0x022b, 0x3fff },
+  { 0x8500, 0x0229, 0x2fff },
+  { 0x0900, 0x0228, 0x0001 },
+  { 0x0900, 0x022a, 0x0001 },
+  { 0x8500, 0x022d, 0x2fff },
+  { 0x0900, 0x022c, 0x0001 },
+  { 0x0900, 0x022e, 0x0001 },
+  { 0x8500, 0x0250, 0x4000 },
+  { 0x8500, 0x0233, 0x3fff },
+  { 0x8500, 0x0231, 0x2fff },
+  { 0x0900, 0x0230, 0x0001 },
+  { 0x0900, 0x0232, 0x0001 },
+  { 0x8500, 0x0235, 0x2000 },
+  { 0x0500, 0x0234, 0x0000 },
+  { 0x0500, 0x0236, 0x0000 },
+  { 0x8500, 0x0254, 0x3f32 },
+  { 0x8500, 0x0252, 0x2000 },
+  { 0x0500, 0x0251, 0x0000 },
+  { 0x0500, 0x0253, 0x0f2e },
+  { 0x8500, 0x0256, 0x2f33 },
+  { 0x0500, 0x0255, 0x0000 },
+  { 0x0500, 0x0257, 0x0f33 },
+  { 0x8500, 0x0278, 0x6000 },
+  { 0x8500, 0x0268, 0x5f2f },
+  { 0x8500, 0x0260, 0x4f33 },
+  { 0x8500, 0x025c, 0x3000 },
+  { 0x8500, 0x025a, 0x2000 },
+  { 0x0500, 0x0259, 0x0f36 },
+  { 0x0500, 0x025b, 0x0f35 },
+  { 0x8500, 0x025e, 0x2000 },
+  { 0x0500, 0x025d, 0x0000 },
+  { 0x0500, 0x025f, 0x0000 },
+  { 0x8500, 0x0264, 0x3000 },
+  { 0x8500, 0x0262, 0x2000 },
+  { 0x0500, 0x0261, 0x0000 },
+  { 0x0500, 0x0263, 0x0f31 },
+  { 0x8500, 0x0266, 0x2000 },
+  { 0x0500, 0x0265, 0x0000 },
+  { 0x0500, 0x0267, 0x0000 },
+  { 0x8500, 0x0270, 0x4000 },
+  { 0x8500, 0x026c, 0x3000 },
+  { 0x8500, 0x026a, 0x2000 },
+  { 0x0500, 0x0269, 0x0f2d },
+  { 0x0500, 0x026b, 0x0000 },
+  { 0x8500, 0x026e, 0x2000 },
+  { 0x0500, 0x026d, 0x0000 },
+  { 0x0500, 0x026f, 0x0f2d },
+  { 0x8500, 0x0274, 0x3000 },
+  { 0x8500, 0x0272, 0x2f2b },
+  { 0x0500, 0x0271, 0x0000 },
+  { 0x0500, 0x0273, 0x0000 },
+  { 0x8500, 0x0276, 0x2000 },
+  { 0x0500, 0x0275, 0x0f2a },
+  { 0x0500, 0x0277, 0x0000 },
+  { 0x8500, 0x0288, 0x5f26 },
+  { 0x8500, 0x0280, 0x4f26 },
+  { 0x8500, 0x027c, 0x3000 },
+  { 0x8500, 0x027a, 0x2000 },
+  { 0x0500, 0x0279, 0x0000 },
+  { 0x0500, 0x027b, 0x0000 },
+  { 0x8500, 0x027e, 0x2000 },
+  { 0x0500, 0x027d, 0x0000 },
+  { 0x0500, 0x027f, 0x0000 },
+  { 0x8500, 0x0284, 0x3000 },
+  { 0x8500, 0x0282, 0x2000 },
+  { 0x0500, 0x0281, 0x0000 },
+  { 0x0500, 0x0283, 0x0f26 },
+  { 0x8500, 0x0286, 0x2000 },
+  { 0x0500, 0x0285, 0x0000 },
+  { 0x0500, 0x0287, 0x0000 },
+  { 0x8500, 0x0290, 0x4000 },
+  { 0x8500, 0x028c, 0x3000 },
+  { 0x8500, 0x028a, 0x2f27 },
+  { 0x0500, 0x0289, 0x0000 },
+  { 0x0500, 0x028b, 0x0f27 },
+  { 0x8500, 0x028e, 0x2000 },
+  { 0x0500, 0x028d, 0x0000 },
+  { 0x0500, 0x028f, 0x0000 },
+  { 0x8500, 0x0294, 0x3000 },
+  { 0x8500, 0x0292, 0x2f25 },
+  { 0x0500, 0x0291, 0x0000 },
+  { 0x0500, 0x0293, 0x0000 },
+  { 0x8500, 0x0296, 0x2000 },
+  { 0x0500, 0x0295, 0x0000 },
+  { 0x0500, 0x0297, 0x0000 },
+  { 0x9800, 0x02d8, 0x7000 },
+  { 0x8600, 0x02b8, 0x6000 },
+  { 0x8500, 0x02a8, 0x5000 },
+  { 0x8500, 0x02a0, 0x4000 },
+  { 0x8500, 0x029c, 0x3000 },
+  { 0x8500, 0x029a, 0x2000 },
+  { 0x0500, 0x0299, 0x0000 },
+  { 0x0500, 0x029b, 0x0000 },
+  { 0x8500, 0x029e, 0x2000 },
+  { 0x0500, 0x029d, 0x0000 },
+  { 0x0500, 0x029f, 0x0000 },
+  { 0x8500, 0x02a4, 0x3000 },
+  { 0x8500, 0x02a2, 0x2000 },
+  { 0x0500, 0x02a1, 0x0000 },
+  { 0x0500, 0x02a3, 0x0000 },
+  { 0x8500, 0x02a6, 0x2000 },
+  { 0x0500, 0x02a5, 0x0000 },
+  { 0x0500, 0x02a7, 0x0000 },
+  { 0x8600, 0x02b0, 0x4000 },
+  { 0x8500, 0x02ac, 0x3000 },
+  { 0x8500, 0x02aa, 0x2000 },
+  { 0x0500, 0x02a9, 0x0000 },
+  { 0x0500, 0x02ab, 0x0000 },
+  { 0x8500, 0x02ae, 0x2000 },
+  { 0x0500, 0x02ad, 0x0000 },
+  { 0x0500, 0x02af, 0x0000 },
+  { 0x8600, 0x02b4, 0x3000 },
+  { 0x8600, 0x02b2, 0x2000 },
+  { 0x0600, 0x02b1, 0x0000 },
+  { 0x0600, 0x02b3, 0x0000 },
+  { 0x8600, 0x02b6, 0x2000 },
+  { 0x0600, 0x02b5, 0x0000 },
+  { 0x0600, 0x02b7, 0x0000 },
+  { 0x8600, 0x02c8, 0x5000 },
+  { 0x8600, 0x02c0, 0x4000 },
+  { 0x8600, 0x02bc, 0x3000 },
+  { 0x8600, 0x02ba, 0x2000 },
+  { 0x0600, 0x02b9, 0x0000 },
+  { 0x0600, 0x02bb, 0x0000 },
+  { 0x8600, 0x02be, 0x2000 },
+  { 0x0600, 0x02bd, 0x0000 },
+  { 0x0600, 0x02bf, 0x0000 },
+  { 0x9800, 0x02c4, 0x3000 },
+  { 0x9800, 0x02c2, 0x2000 },
+  { 0x0600, 0x02c1, 0x0000 },
+  { 0x1800, 0x02c3, 0x0000 },
+  { 0x8600, 0x02c6, 0x2000 },
+  { 0x1800, 0x02c5, 0x0000 },
+  { 0x0600, 0x02c7, 0x0000 },
+  { 0x8600, 0x02d0, 0x4000 },
+  { 0x8600, 0x02cc, 0x3000 },
+  { 0x8600, 0x02ca, 0x2000 },
+  { 0x0600, 0x02c9, 0x0000 },
+  { 0x0600, 0x02cb, 0x0000 },
+  { 0x8600, 0x02ce, 0x2000 },
+  { 0x0600, 0x02cd, 0x0000 },
+  { 0x0600, 0x02cf, 0x0000 },
+  { 0x9800, 0x02d4, 0x3000 },
+  { 0x9800, 0x02d2, 0x2000 },
+  { 0x0600, 0x02d1, 0x0000 },
+  { 0x1800, 0x02d3, 0x0000 },
+  { 0x9800, 0x02d6, 0x2000 },
+  { 0x1800, 0x02d5, 0x0000 },
+  { 0x1800, 0x02d7, 0x0000 },
+  { 0x9800, 0x02f8, 0x6000 },
+  { 0x9800, 0x02e8, 0x5000 },
+  { 0x8600, 0x02e0, 0x4000 },
+  { 0x9800, 0x02dc, 0x3000 },
+  { 0x9800, 0x02da, 0x2000 },
+  { 0x1800, 0x02d9, 0x0000 },
+  { 0x1800, 0x02db, 0x0000 },
+  { 0x9800, 0x02de, 0x2000 },
+  { 0x1800, 0x02dd, 0x0000 },
+  { 0x1800, 0x02df, 0x0000 },
+  { 0x8600, 0x02e4, 0x3000 },
+  { 0x8600, 0x02e2, 0x2000 },
+  { 0x0600, 0x02e1, 0x0000 },
+  { 0x0600, 0x02e3, 0x0000 },
+  { 0x9800, 0x02e6, 0x2000 },
+  { 0x1800, 0x02e5, 0x0000 },
+  { 0x1800, 0x02e7, 0x0000 },
+  { 0x9800, 0x02f0, 0x4000 },
+  { 0x9800, 0x02ec, 0x3000 },
+  { 0x9800, 0x02ea, 0x2000 },
+  { 0x1800, 0x02e9, 0x0000 },
+  { 0x1800, 0x02eb, 0x0000 },
+  { 0x8600, 0x02ee, 0x2000 },
+  { 0x1800, 0x02ed, 0x0000 },
+  { 0x1800, 0x02ef, 0x0000 },
+  { 0x9800, 0x02f4, 0x3000 },
+  { 0x9800, 0x02f2, 0x2000 },
+  { 0x1800, 0x02f1, 0x0000 },
+  { 0x1800, 0x02f3, 0x0000 },
+  { 0x9800, 0x02f6, 0x2000 },
+  { 0x1800, 0x02f5, 0x0000 },
+  { 0x1800, 0x02f7, 0x0000 },
+  { 0x8c00, 0x0308, 0x5000 },
+  { 0x8c00, 0x0300, 0x4000 },
+  { 0x9800, 0x02fc, 0x3000 },
+  { 0x9800, 0x02fa, 0x2000 },
+  { 0x1800, 0x02f9, 0x0000 },
+  { 0x1800, 0x02fb, 0x0000 },
+  { 0x9800, 0x02fe, 0x2000 },
+  { 0x1800, 0x02fd, 0x0000 },
+  { 0x1800, 0x02ff, 0x0000 },
+  { 0x8c00, 0x0304, 0x3000 },
+  { 0x8c00, 0x0302, 0x2000 },
+  { 0x0c00, 0x0301, 0x0000 },
+  { 0x0c00, 0x0303, 0x0000 },
+  { 0x8c00, 0x0306, 0x2000 },
+  { 0x0c00, 0x0305, 0x0000 },
+  { 0x0c00, 0x0307, 0x0000 },
+  { 0x8c00, 0x0310, 0x4000 },
+  { 0x8c00, 0x030c, 0x3000 },
+  { 0x8c00, 0x030a, 0x2000 },
+  { 0x0c00, 0x0309, 0x0000 },
+  { 0x0c00, 0x030b, 0x0000 },
+  { 0x8c00, 0x030e, 0x2000 },
+  { 0x0c00, 0x030d, 0x0000 },
+  { 0x0c00, 0x030f, 0x0000 },
+  { 0x8c00, 0x0314, 0x3000 },
+  { 0x8c00, 0x0312, 0x2000 },
+  { 0x0c00, 0x0311, 0x0000 },
+  { 0x0c00, 0x0313, 0x0000 },
+  { 0x8c00, 0x0316, 0x2000 },
+  { 0x0c00, 0x0315, 0x0000 },
+  { 0x0c00, 0x0317, 0x0000 },
+  { 0x8500, 0x03b0, 0x8000 },
+  { 0x8c00, 0x035d, 0x7000 },
+  { 0x8c00, 0x0338, 0x6000 },
+  { 0x8c00, 0x0328, 0x5000 },
+  { 0x8c00, 0x0320, 0x4000 },
+  { 0x8c00, 0x031c, 0x3000 },
+  { 0x8c00, 0x031a, 0x2000 },
+  { 0x0c00, 0x0319, 0x0000 },
+  { 0x0c00, 0x031b, 0x0000 },
+  { 0x8c00, 0x031e, 0x2000 },
+  { 0x0c00, 0x031d, 0x0000 },
+  { 0x0c00, 0x031f, 0x0000 },
+  { 0x8c00, 0x0324, 0x3000 },
+  { 0x8c00, 0x0322, 0x2000 },
+  { 0x0c00, 0x0321, 0x0000 },
+  { 0x0c00, 0x0323, 0x0000 },
+  { 0x8c00, 0x0326, 0x2000 },
+  { 0x0c00, 0x0325, 0x0000 },
+  { 0x0c00, 0x0327, 0x0000 },
+  { 0x8c00, 0x0330, 0x4000 },
+  { 0x8c00, 0x032c, 0x3000 },
+  { 0x8c00, 0x032a, 0x2000 },
+  { 0x0c00, 0x0329, 0x0000 },
+  { 0x0c00, 0x032b, 0x0000 },
+  { 0x8c00, 0x032e, 0x2000 },
+  { 0x0c00, 0x032d, 0x0000 },
+  { 0x0c00, 0x032f, 0x0000 },
+  { 0x8c00, 0x0334, 0x3000 },
+  { 0x8c00, 0x0332, 0x2000 },
+  { 0x0c00, 0x0331, 0x0000 },
+  { 0x0c00, 0x0333, 0x0000 },
+  { 0x8c00, 0x0336, 0x2000 },
+  { 0x0c00, 0x0335, 0x0000 },
+  { 0x0c00, 0x0337, 0x0000 },
+  { 0x8c00, 0x0348, 0x5000 },
+  { 0x8c00, 0x0340, 0x4000 },
+  { 0x8c00, 0x033c, 0x3000 },
+  { 0x8c00, 0x033a, 0x2000 },
+  { 0x0c00, 0x0339, 0x0000 },
+  { 0x0c00, 0x033b, 0x0000 },
+  { 0x8c00, 0x033e, 0x2000 },
+  { 0x0c00, 0x033d, 0x0000 },
+  { 0x0c00, 0x033f, 0x0000 },
+  { 0x8c00, 0x0344, 0x3000 },
+  { 0x8c00, 0x0342, 0x2000 },
+  { 0x0c00, 0x0341, 0x0000 },
+  { 0x0c00, 0x0343, 0x0000 },
+  { 0x8c00, 0x0346, 0x2000 },
+  { 0x0c00, 0x0345, 0x0000 },
+  { 0x0c00, 0x0347, 0x0000 },
+  { 0x8c00, 0x0350, 0x4000 },
+  { 0x8c00, 0x034c, 0x3000 },
+  { 0x8c00, 0x034a, 0x2000 },
+  { 0x0c00, 0x0349, 0x0000 },
+  { 0x0c00, 0x034b, 0x0000 },
+  { 0x8c00, 0x034e, 0x2000 },
+  { 0x0c00, 0x034d, 0x0000 },
+  { 0x0c00, 0x034f, 0x0000 },
+  { 0x8c00, 0x0354, 0x3000 },
+  { 0x8c00, 0x0352, 0x2000 },
+  { 0x0c00, 0x0351, 0x0000 },
+  { 0x0c00, 0x0353, 0x0000 },
+  { 0x8c00, 0x0356, 0x2000 },
+  { 0x0c00, 0x0355, 0x0000 },
+  { 0x0c00, 0x0357, 0x0000 },
+  { 0x8900, 0x038f, 0x603f },
+  { 0x8c00, 0x036d, 0x5000 },
+  { 0x8c00, 0x0365, 0x4000 },
+  { 0x8c00, 0x0361, 0x3000 },
+  { 0x8c00, 0x035f, 0x2000 },
+  { 0x0c00, 0x035e, 0x0000 },
+  { 0x0c00, 0x0360, 0x0000 },
+  { 0x8c00, 0x0363, 0x2000 },
+  { 0x0c00, 0x0362, 0x0000 },
+  { 0x0c00, 0x0364, 0x0000 },
+  { 0x8c00, 0x0369, 0x3000 },
+  { 0x8c00, 0x0367, 0x2000 },
+  { 0x0c00, 0x0366, 0x0000 },
+  { 0x0c00, 0x0368, 0x0000 },
+  { 0x8c00, 0x036b, 0x2000 },
+  { 0x0c00, 0x036a, 0x0000 },
+  { 0x0c00, 0x036c, 0x0000 },
+  { 0x9800, 0x0385, 0x4000 },
+  { 0x9800, 0x0375, 0x3000 },
+  { 0x8c00, 0x036f, 0x2000 },
+  { 0x0c00, 0x036e, 0x0000 },
+  { 0x1800, 0x0374, 0x0000 },
+  { 0x9500, 0x037e, 0x2000 },
+  { 0x0600, 0x037a, 0x0000 },
+  { 0x1800, 0x0384, 0x0000 },
+  { 0x8900, 0x0389, 0x3025 },
+  { 0x9500, 0x0387, 0x2000 },
+  { 0x0900, 0x0386, 0x0026 },
+  { 0x0900, 0x0388, 0x0025 },
+  { 0x8900, 0x038c, 0x2040 },
+  { 0x0900, 0x038a, 0x0025 },
+  { 0x0900, 0x038e, 0x003f },
+  { 0x8900, 0x039f, 0x5020 },
+  { 0x8900, 0x0397, 0x4020 },
+  { 0x8900, 0x0393, 0x3020 },
+  { 0x8900, 0x0391, 0x2020 },
+  { 0x0500, 0x0390, 0x0000 },
+  { 0x0900, 0x0392, 0x0020 },
+  { 0x8900, 0x0395, 0x2020 },
+  { 0x0900, 0x0394, 0x0020 },
+  { 0x0900, 0x0396, 0x0020 },
+  { 0x8900, 0x039b, 0x3020 },
+  { 0x8900, 0x0399, 0x2020 },
+  { 0x0900, 0x0398, 0x0020 },
+  { 0x0900, 0x039a, 0x0020 },
+  { 0x8900, 0x039d, 0x2020 },
+  { 0x0900, 0x039c, 0x0020 },
+  { 0x0900, 0x039e, 0x0020 },
+  { 0x8900, 0x03a8, 0x4020 },
+  { 0x8900, 0x03a4, 0x3020 },
+  { 0x8900, 0x03a1, 0x2020 },
+  { 0x0900, 0x03a0, 0x0020 },
+  { 0x0900, 0x03a3, 0x0020 },
+  { 0x8900, 0x03a6, 0x2020 },
+  { 0x0900, 0x03a5, 0x0020 },
+  { 0x0900, 0x03a7, 0x0020 },
+  { 0x8500, 0x03ac, 0x3fda },
+  { 0x8900, 0x03aa, 0x2020 },
+  { 0x0900, 0x03a9, 0x0020 },
+  { 0x0900, 0x03ab, 0x0020 },
+  { 0x8500, 0x03ae, 0x2fdb },
+  { 0x0500, 0x03ad, 0x0fdb },
+  { 0x0500, 0x03af, 0x0fdb },
+  { 0x8500, 0x03f1, 0x7fb0 },
+  { 0x8500, 0x03d1, 0x6fc7 },
+  { 0x8500, 0x03c0, 0x5fe0 },
+  { 0x8500, 0x03b8, 0x4fe0 },
+  { 0x8500, 0x03b4, 0x3fe0 },
+  { 0x8500, 0x03b2, 0x2fe0 },
+  { 0x0500, 0x03b1, 0x0fe0 },
+  { 0x0500, 0x03b3, 0x0fe0 },
+  { 0x8500, 0x03b6, 0x2fe0 },
+  { 0x0500, 0x03b5, 0x0fe0 },
+  { 0x0500, 0x03b7, 0x0fe0 },
+  { 0x8500, 0x03bc, 0x3fe0 },
+  { 0x8500, 0x03ba, 0x2fe0 },
+  { 0x0500, 0x03b9, 0x0fe0 },
+  { 0x0500, 0x03bb, 0x0fe0 },
+  { 0x8500, 0x03be, 0x2fe0 },
+  { 0x0500, 0x03bd, 0x0fe0 },
+  { 0x0500, 0x03bf, 0x0fe0 },
+  { 0x8500, 0x03c8, 0x4fe0 },
+  { 0x8500, 0x03c4, 0x3fe0 },
+  { 0x8500, 0x03c2, 0x2fe1 },
+  { 0x0500, 0x03c1, 0x0fe0 },
+  { 0x0500, 0x03c3, 0x0fe0 },
+  { 0x8500, 0x03c6, 0x2fe0 },
+  { 0x0500, 0x03c5, 0x0fe0 },
+  { 0x0500, 0x03c7, 0x0fe0 },
+  { 0x8500, 0x03cc, 0x3fc0 },
+  { 0x8500, 0x03ca, 0x2fe0 },
+  { 0x0500, 0x03c9, 0x0fe0 },
+  { 0x0500, 0x03cb, 0x0fe0 },
+  { 0x8500, 0x03ce, 0x2fc1 },
+  { 0x0500, 0x03cd, 0x0fc1 },
+  { 0x0500, 0x03d0, 0x0fc2 },
+  { 0x8500, 0x03e1, 0x5fff },
+  { 0x8500, 0x03d9, 0x4fff },
+  { 0x8500, 0x03d5, 0x3fd1 },
+  { 0x8900, 0x03d3, 0x2000 },
+  { 0x0900, 0x03d2, 0x0000 },
+  { 0x0900, 0x03d4, 0x0000 },
+  { 0x8500, 0x03d7, 0x2000 },
+  { 0x0500, 0x03d6, 0x0fca },
+  { 0x0900, 0x03d8, 0x0001 },
+  { 0x8500, 0x03dd, 0x3fff },
+  { 0x8500, 0x03db, 0x2fff },
+  { 0x0900, 0x03da, 0x0001 },
+  { 0x0900, 0x03dc, 0x0001 },
+  { 0x8500, 0x03df, 0x2fff },
+  { 0x0900, 0x03de, 0x0001 },
+  { 0x0900, 0x03e0, 0x0001 },
+  { 0x8500, 0x03e9, 0x4fff },
+  { 0x8500, 0x03e5, 0x3fff },
+  { 0x8500, 0x03e3, 0x2fff },
+  { 0x0900, 0x03e2, 0x0001 },
+  { 0x0900, 0x03e4, 0x0001 },
+  { 0x8500, 0x03e7, 0x2fff },
+  { 0x0900, 0x03e6, 0x0001 },
+  { 0x0900, 0x03e8, 0x0001 },
+  { 0x8500, 0x03ed, 0x3fff },
+  { 0x8500, 0x03eb, 0x2fff },
+  { 0x0900, 0x03ea, 0x0001 },
+  { 0x0900, 0x03ec, 0x0001 },
+  { 0x8500, 0x03ef, 0x2fff },
+  { 0x0900, 0x03ee, 0x0001 },
+  { 0x0500, 0x03f0, 0x0faa },
+  { 0x8900, 0x0415, 0x6020 },
+  { 0x8900, 0x0405, 0x5050 },
+  { 0x8900, 0x03f9, 0x4ff9 },
+  { 0x8500, 0x03f5, 0x3fa0 },
+  { 0x8500, 0x03f3, 0x2000 },
+  { 0x0500, 0x03f2, 0x0007 },
+  { 0x0900, 0x03f4, 0x0fc4 },
+  { 0x8900, 0x03f7, 0x2001 },
+  { 0x1900, 0x03f6, 0x0000 },
+  { 0x0500, 0x03f8, 0x0fff },
+  { 0x8900, 0x0401, 0x3050 },
+  { 0x8500, 0x03fb, 0x2fff },
+  { 0x0900, 0x03fa, 0x0001 },
+  { 0x0900, 0x0400, 0x0050 },
+  { 0x8900, 0x0403, 0x2050 },
+  { 0x0900, 0x0402, 0x0050 },
+  { 0x0900, 0x0404, 0x0050 },
+  { 0x8900, 0x040d, 0x4050 },
+  { 0x8900, 0x0409, 0x3050 },
+  { 0x8900, 0x0407, 0x2050 },
+  { 0x0900, 0x0406, 0x0050 },
+  { 0x0900, 0x0408, 0x0050 },
+  { 0x8900, 0x040b, 0x2050 },
+  { 0x0900, 0x040a, 0x0050 },
+  { 0x0900, 0x040c, 0x0050 },
+  { 0x8900, 0x0411, 0x3020 },
+  { 0x8900, 0x040f, 0x2050 },
+  { 0x0900, 0x040e, 0x0050 },
+  { 0x0900, 0x0410, 0x0020 },
+  { 0x8900, 0x0413, 0x2020 },
+  { 0x0900, 0x0412, 0x0020 },
+  { 0x0900, 0x0414, 0x0020 },
+  { 0x8900, 0x0425, 0x5020 },
+  { 0x8900, 0x041d, 0x4020 },
+  { 0x8900, 0x0419, 0x3020 },
+  { 0x8900, 0x0417, 0x2020 },
+  { 0x0900, 0x0416, 0x0020 },
+  { 0x0900, 0x0418, 0x0020 },
+  { 0x8900, 0x041b, 0x2020 },
+  { 0x0900, 0x041a, 0x0020 },
+  { 0x0900, 0x041c, 0x0020 },
+  { 0x8900, 0x0421, 0x3020 },
+  { 0x8900, 0x041f, 0x2020 },
+  { 0x0900, 0x041e, 0x0020 },
+  { 0x0900, 0x0420, 0x0020 },
+  { 0x8900, 0x0423, 0x2020 },
+  { 0x0900, 0x0422, 0x0020 },
+  { 0x0900, 0x0424, 0x0020 },
+  { 0x8900, 0x042d, 0x4020 },
+  { 0x8900, 0x0429, 0x3020 },
+  { 0x8900, 0x0427, 0x2020 },
+  { 0x0900, 0x0426, 0x0020 },
+  { 0x0900, 0x0428, 0x0020 },
+  { 0x8900, 0x042b, 0x2020 },
+  { 0x0900, 0x042a, 0x0020 },
+  { 0x0900, 0x042c, 0x0020 },
+  { 0x8500, 0x0431, 0x3fe0 },
+  { 0x8900, 0x042f, 0x2020 },
+  { 0x0900, 0x042e, 0x0020 },
+  { 0x0500, 0x0430, 0x0fe0 },
+  { 0x8500, 0x0433, 0x2fe0 },
+  { 0x0500, 0x0432, 0x0fe0 },
+  { 0x0500, 0x0434, 0x0fe0 },
+  { 0x8700, 0x06a4, 0xa000 },
+  { 0x8500, 0x0563, 0x9fd0 },
+  { 0x8900, 0x04b6, 0x8001 },
+  { 0x8500, 0x0475, 0x7fff },
+  { 0x8500, 0x0455, 0x6fb0 },
+  { 0x8500, 0x0445, 0x5fe0 },
+  { 0x8500, 0x043d, 0x4fe0 },
+  { 0x8500, 0x0439, 0x3fe0 },
+  { 0x8500, 0x0437, 0x2fe0 },
+  { 0x0500, 0x0436, 0x0fe0 },
+  { 0x0500, 0x0438, 0x0fe0 },
+  { 0x8500, 0x043b, 0x2fe0 },
+  { 0x0500, 0x043a, 0x0fe0 },
+  { 0x0500, 0x043c, 0x0fe0 },
+  { 0x8500, 0x0441, 0x3fe0 },
+  { 0x8500, 0x043f, 0x2fe0 },
+  { 0x0500, 0x043e, 0x0fe0 },
+  { 0x0500, 0x0440, 0x0fe0 },
+  { 0x8500, 0x0443, 0x2fe0 },
+  { 0x0500, 0x0442, 0x0fe0 },
+  { 0x0500, 0x0444, 0x0fe0 },
+  { 0x8500, 0x044d, 0x4fe0 },
+  { 0x8500, 0x0449, 0x3fe0 },
+  { 0x8500, 0x0447, 0x2fe0 },
+  { 0x0500, 0x0446, 0x0fe0 },
+  { 0x0500, 0x0448, 0x0fe0 },
+  { 0x8500, 0x044b, 0x2fe0 },
+  { 0x0500, 0x044a, 0x0fe0 },
+  { 0x0500, 0x044c, 0x0fe0 },
+  { 0x8500, 0x0451, 0x3fb0 },
+  { 0x8500, 0x044f, 0x2fe0 },
+  { 0x0500, 0x044e, 0x0fe0 },
+  { 0x0500, 0x0450, 0x0fb0 },
+  { 0x8500, 0x0453, 0x2fb0 },
+  { 0x0500, 0x0452, 0x0fb0 },
+  { 0x0500, 0x0454, 0x0fb0 },
+  { 0x8500, 0x0465, 0x5fff },
+  { 0x8500, 0x045d, 0x4fb0 },
+  { 0x8500, 0x0459, 0x3fb0 },
+  { 0x8500, 0x0457, 0x2fb0 },
+  { 0x0500, 0x0456, 0x0fb0 },
+  { 0x0500, 0x0458, 0x0fb0 },
+  { 0x8500, 0x045b, 0x2fb0 },
+  { 0x0500, 0x045a, 0x0fb0 },
+  { 0x0500, 0x045c, 0x0fb0 },
+  { 0x8500, 0x0461, 0x3fff },
+  { 0x8500, 0x045f, 0x2fb0 },
+  { 0x0500, 0x045e, 0x0fb0 },
+  { 0x0900, 0x0460, 0x0001 },
+  { 0x8500, 0x0463, 0x2fff },
+  { 0x0900, 0x0462, 0x0001 },
+  { 0x0900, 0x0464, 0x0001 },
+  { 0x8500, 0x046d, 0x4fff },
+  { 0x8500, 0x0469, 0x3fff },
+  { 0x8500, 0x0467, 0x2fff },
+  { 0x0900, 0x0466, 0x0001 },
+  { 0x0900, 0x0468, 0x0001 },
+  { 0x8500, 0x046b, 0x2fff },
+  { 0x0900, 0x046a, 0x0001 },
+  { 0x0900, 0x046c, 0x0001 },
+  { 0x8500, 0x0471, 0x3fff },
+  { 0x8500, 0x046f, 0x2fff },
+  { 0x0900, 0x046e, 0x0001 },
+  { 0x0900, 0x0470, 0x0001 },
+  { 0x8500, 0x0473, 0x2fff },
+  { 0x0900, 0x0472, 0x0001 },
+  { 0x0900, 0x0474, 0x0001 },
+  { 0x8900, 0x0496, 0x6001 },
+  { 0x8c00, 0x0485, 0x5000 },
+  { 0x8500, 0x047d, 0x4fff },
+  { 0x8500, 0x0479, 0x3fff },
+  { 0x8500, 0x0477, 0x2fff },
+  { 0x0900, 0x0476, 0x0001 },
+  { 0x0900, 0x0478, 0x0001 },
+  { 0x8500, 0x047b, 0x2fff },
+  { 0x0900, 0x047a, 0x0001 },
+  { 0x0900, 0x047c, 0x0001 },
+  { 0x8500, 0x0481, 0x3fff },
+  { 0x8500, 0x047f, 0x2fff },
+  { 0x0900, 0x047e, 0x0001 },
+  { 0x0900, 0x0480, 0x0001 },
+  { 0x8c00, 0x0483, 0x2000 },
+  { 0x1a00, 0x0482, 0x0000 },
+  { 0x0c00, 0x0484, 0x0000 },
+  { 0x8900, 0x048e, 0x4001 },
+  { 0x8900, 0x048a, 0x3001 },
+  { 0x8b00, 0x0488, 0x2000 },
+  { 0x0c00, 0x0486, 0x0000 },
+  { 0x0b00, 0x0489, 0x0000 },
+  { 0x8900, 0x048c, 0x2001 },
+  { 0x0500, 0x048b, 0x0fff },
+  { 0x0500, 0x048d, 0x0fff },
+  { 0x8900, 0x0492, 0x3001 },
+  { 0x8900, 0x0490, 0x2001 },
+  { 0x0500, 0x048f, 0x0fff },
+  { 0x0500, 0x0491, 0x0fff },
+  { 0x8900, 0x0494, 0x2001 },
+  { 0x0500, 0x0493, 0x0fff },
+  { 0x0500, 0x0495, 0x0fff },
+  { 0x8900, 0x04a6, 0x5001 },
+  { 0x8900, 0x049e, 0x4001 },
+  { 0x8900, 0x049a, 0x3001 },
+  { 0x8900, 0x0498, 0x2001 },
+  { 0x0500, 0x0497, 0x0fff },
+  { 0x0500, 0x0499, 0x0fff },
+  { 0x8900, 0x049c, 0x2001 },
+  { 0x0500, 0x049b, 0x0fff },
+  { 0x0500, 0x049d, 0x0fff },
+  { 0x8900, 0x04a2, 0x3001 },
+  { 0x8900, 0x04a0, 0x2001 },
+  { 0x0500, 0x049f, 0x0fff },
+  { 0x0500, 0x04a1, 0x0fff },
+  { 0x8900, 0x04a4, 0x2001 },
+  { 0x0500, 0x04a3, 0x0fff },
+  { 0x0500, 0x04a5, 0x0fff },
+  { 0x8900, 0x04ae, 0x4001 },
+  { 0x8900, 0x04aa, 0x3001 },
+  { 0x8900, 0x04a8, 0x2001 },
+  { 0x0500, 0x04a7, 0x0fff },
+  { 0x0500, 0x04a9, 0x0fff },
+  { 0x8900, 0x04ac, 0x2001 },
+  { 0x0500, 0x04ab, 0x0fff },
+  { 0x0500, 0x04ad, 0x0fff },
+  { 0x8900, 0x04b2, 0x3001 },
+  { 0x8900, 0x04b0, 0x2001 },
+  { 0x0500, 0x04af, 0x0fff },
+  { 0x0500, 0x04b1, 0x0fff },
+  { 0x8900, 0x04b4, 0x2001 },
+  { 0x0500, 0x04b3, 0x0fff },
+  { 0x0500, 0x04b5, 0x0fff },
+  { 0x8500, 0x04f9, 0x7fff },
+  { 0x8500, 0x04d7, 0x6fff },
+  { 0x8500, 0x04c6, 0x5fff },
+  { 0x8900, 0x04be, 0x4001 },
+  { 0x8900, 0x04ba, 0x3001 },
+  { 0x8900, 0x04b8, 0x2001 },
+  { 0x0500, 0x04b7, 0x0fff },
+  { 0x0500, 0x04b9, 0x0fff },
+  { 0x8900, 0x04bc, 0x2001 },
+  { 0x0500, 0x04bb, 0x0fff },
+  { 0x0500, 0x04bd, 0x0fff },
+  { 0x8500, 0x04c2, 0x3fff },
+  { 0x8900, 0x04c0, 0x2000 },
+  { 0x0500, 0x04bf, 0x0fff },
+  { 0x0900, 0x04c1, 0x0001 },
+  { 0x8500, 0x04c4, 0x2fff },
+  { 0x0900, 0x04c3, 0x0001 },
+  { 0x0900, 0x04c5, 0x0001 },
+  { 0x8500, 0x04ce, 0x4fff },
+  { 0x8500, 0x04ca, 0x3fff },
+  { 0x8500, 0x04c8, 0x2fff },
+  { 0x0900, 0x04c7, 0x0001 },
+  { 0x0900, 0x04c9, 0x0001 },
+  { 0x8500, 0x04cc, 0x2fff },
+  { 0x0900, 0x04cb, 0x0001 },
+  { 0x0900, 0x04cd, 0x0001 },
+  { 0x8500, 0x04d3, 0x3fff },
+  { 0x8500, 0x04d1, 0x2fff },
+  { 0x0900, 0x04d0, 0x0001 },
+  { 0x0900, 0x04d2, 0x0001 },
+  { 0x8500, 0x04d5, 0x2fff },
+  { 0x0900, 0x04d4, 0x0001 },
+  { 0x0900, 0x04d6, 0x0001 },
+  { 0x8500, 0x04e7, 0x5fff },
+  { 0x8500, 0x04df, 0x4fff },
+  { 0x8500, 0x04db, 0x3fff },
+  { 0x8500, 0x04d9, 0x2fff },
+  { 0x0900, 0x04d8, 0x0001 },
+  { 0x0900, 0x04da, 0x0001 },
+  { 0x8500, 0x04dd, 0x2fff },
+  { 0x0900, 0x04dc, 0x0001 },
+  { 0x0900, 0x04de, 0x0001 },
+  { 0x8500, 0x04e3, 0x3fff },
+  { 0x8500, 0x04e1, 0x2fff },
+  { 0x0900, 0x04e0, 0x0001 },
+  { 0x0900, 0x04e2, 0x0001 },
+  { 0x8500, 0x04e5, 0x2fff },
+  { 0x0900, 0x04e4, 0x0001 },
+  { 0x0900, 0x04e6, 0x0001 },
+  { 0x8500, 0x04ef, 0x4fff },
+  { 0x8500, 0x04eb, 0x3fff },
+  { 0x8500, 0x04e9, 0x2fff },
+  { 0x0900, 0x04e8, 0x0001 },
+  { 0x0900, 0x04ea, 0x0001 },
+  { 0x8500, 0x04ed, 0x2fff },
+  { 0x0900, 0x04ec, 0x0001 },
+  { 0x0900, 0x04ee, 0x0001 },
+  { 0x8500, 0x04f3, 0x3fff },
+  { 0x8500, 0x04f1, 0x2fff },
+  { 0x0900, 0x04f0, 0x0001 },
+  { 0x0900, 0x04f2, 0x0001 },
+  { 0x8500, 0x04f5, 0x2fff },
+  { 0x0900, 0x04f4, 0x0001 },
+  { 0x0900, 0x04f8, 0x0001 },
+  { 0x8900, 0x0540, 0x6030 },
+  { 0x8500, 0x050f, 0x5fff },
+  { 0x8500, 0x0507, 0x4fff },
+  { 0x8500, 0x0503, 0x3fff },
+  { 0x8500, 0x0501, 0x2fff },
+  { 0x0900, 0x0500, 0x0001 },
+  { 0x0900, 0x0502, 0x0001 },
+  { 0x8500, 0x0505, 0x2fff },
+  { 0x0900, 0x0504, 0x0001 },
+  { 0x0900, 0x0506, 0x0001 },
+  { 0x8500, 0x050b, 0x3fff },
+  { 0x8500, 0x0509, 0x2fff },
+  { 0x0900, 0x0508, 0x0001 },
+  { 0x0900, 0x050a, 0x0001 },
+  { 0x8500, 0x050d, 0x2fff },
+  { 0x0900, 0x050c, 0x0001 },
+  { 0x0900, 0x050e, 0x0001 },
+  { 0x8900, 0x0538, 0x4030 },
+  { 0x8900, 0x0534, 0x3030 },
+  { 0x8900, 0x0532, 0x2030 },
+  { 0x0900, 0x0531, 0x0030 },
+  { 0x0900, 0x0533, 0x0030 },
+  { 0x8900, 0x0536, 0x2030 },
+  { 0x0900, 0x0535, 0x0030 },
+  { 0x0900, 0x0537, 0x0030 },
+  { 0x8900, 0x053c, 0x3030 },
+  { 0x8900, 0x053a, 0x2030 },
+  { 0x0900, 0x0539, 0x0030 },
+  { 0x0900, 0x053b, 0x0030 },
+  { 0x8900, 0x053e, 0x2030 },
+  { 0x0900, 0x053d, 0x0030 },
+  { 0x0900, 0x053f, 0x0030 },
+  { 0x8900, 0x0550, 0x5030 },
+  { 0x8900, 0x0548, 0x4030 },
+  { 0x8900, 0x0544, 0x3030 },
+  { 0x8900, 0x0542, 0x2030 },
+  { 0x0900, 0x0541, 0x0030 },
+  { 0x0900, 0x0543, 0x0030 },
+  { 0x8900, 0x0546, 0x2030 },
+  { 0x0900, 0x0545, 0x0030 },
+  { 0x0900, 0x0547, 0x0030 },
+  { 0x8900, 0x054c, 0x3030 },
+  { 0x8900, 0x054a, 0x2030 },
+  { 0x0900, 0x0549, 0x0030 },
+  { 0x0900, 0x054b, 0x0030 },
+  { 0x8900, 0x054e, 0x2030 },
+  { 0x0900, 0x054d, 0x0030 },
+  { 0x0900, 0x054f, 0x0030 },
+  { 0x9500, 0x055a, 0x4000 },
+  { 0x8900, 0x0554, 0x3030 },
+  { 0x8900, 0x0552, 0x2030 },
+  { 0x0900, 0x0551, 0x0030 },
+  { 0x0900, 0x0553, 0x0030 },
+  { 0x8900, 0x0556, 0x2030 },
+  { 0x0900, 0x0555, 0x0030 },
+  { 0x0600, 0x0559, 0x0000 },
+  { 0x9500, 0x055e, 0x3000 },
+  { 0x9500, 0x055c, 0x2000 },
+  { 0x1500, 0x055b, 0x0000 },
+  { 0x1500, 0x055d, 0x0000 },
+  { 0x8500, 0x0561, 0x2fd0 },
+  { 0x1500, 0x055f, 0x0000 },
+  { 0x0500, 0x0562, 0x0fd0 },
+  { 0x9a00, 0x060f, 0x8000 },
+  { 0x8c00, 0x05ab, 0x7000 },
+  { 0x8500, 0x0583, 0x6fd0 },
+  { 0x8500, 0x0573, 0x5fd0 },
+  { 0x8500, 0x056b, 0x4fd0 },
+  { 0x8500, 0x0567, 0x3fd0 },
+  { 0x8500, 0x0565, 0x2fd0 },
+  { 0x0500, 0x0564, 0x0fd0 },
+  { 0x0500, 0x0566, 0x0fd0 },
+  { 0x8500, 0x0569, 0x2fd0 },
+  { 0x0500, 0x0568, 0x0fd0 },
+  { 0x0500, 0x056a, 0x0fd0 },
+  { 0x8500, 0x056f, 0x3fd0 },
+  { 0x8500, 0x056d, 0x2fd0 },
+  { 0x0500, 0x056c, 0x0fd0 },
+  { 0x0500, 0x056e, 0x0fd0 },
+  { 0x8500, 0x0571, 0x2fd0 },
+  { 0x0500, 0x0570, 0x0fd0 },
+  { 0x0500, 0x0572, 0x0fd0 },
+  { 0x8500, 0x057b, 0x4fd0 },
+  { 0x8500, 0x0577, 0x3fd0 },
+  { 0x8500, 0x0575, 0x2fd0 },
+  { 0x0500, 0x0574, 0x0fd0 },
+  { 0x0500, 0x0576, 0x0fd0 },
+  { 0x8500, 0x0579, 0x2fd0 },
+  { 0x0500, 0x0578, 0x0fd0 },
+  { 0x0500, 0x057a, 0x0fd0 },
+  { 0x8500, 0x057f, 0x3fd0 },
+  { 0x8500, 0x057d, 0x2fd0 },
+  { 0x0500, 0x057c, 0x0fd0 },
+  { 0x0500, 0x057e, 0x0fd0 },
+  { 0x8500, 0x0581, 0x2fd0 },
+  { 0x0500, 0x0580, 0x0fd0 },
+  { 0x0500, 0x0582, 0x0fd0 },
+  { 0x8c00, 0x059a, 0x5000 },
+  { 0x8c00, 0x0592, 0x4000 },
+  { 0x8500, 0x0587, 0x3000 },
+  { 0x8500, 0x0585, 0x2fd0 },
+  { 0x0500, 0x0584, 0x0fd0 },
+  { 0x0500, 0x0586, 0x0fd0 },
+  { 0x9100, 0x058a, 0x2000 },
+  { 0x1500, 0x0589, 0x0000 },
+  { 0x0c00, 0x0591, 0x0000 },
+  { 0x8c00, 0x0596, 0x3000 },
+  { 0x8c00, 0x0594, 0x2000 },
+  { 0x0c00, 0x0593, 0x0000 },
+  { 0x0c00, 0x0595, 0x0000 },
+  { 0x8c00, 0x0598, 0x2000 },
+  { 0x0c00, 0x0597, 0x0000 },
+  { 0x0c00, 0x0599, 0x0000 },
+  { 0x8c00, 0x05a3, 0x4000 },
+  { 0x8c00, 0x059e, 0x3000 },
+  { 0x8c00, 0x059c, 0x2000 },
+  { 0x0c00, 0x059b, 0x0000 },
+  { 0x0c00, 0x059d, 0x0000 },
+  { 0x8c00, 0x05a0, 0x2000 },
+  { 0x0c00, 0x059f, 0x0000 },
+  { 0x0c00, 0x05a1, 0x0000 },
+  { 0x8c00, 0x05a7, 0x3000 },
+  { 0x8c00, 0x05a5, 0x2000 },
+  { 0x0c00, 0x05a4, 0x0000 },
+  { 0x0c00, 0x05a6, 0x0000 },
+  { 0x8c00, 0x05a9, 0x2000 },
+  { 0x0c00, 0x05a8, 0x0000 },
+  { 0x0c00, 0x05aa, 0x0000 },
+  { 0x8700, 0x05d7, 0x6000 },
+  { 0x8c00, 0x05bc, 0x5000 },
+  { 0x8c00, 0x05b3, 0x4000 },
+  { 0x8c00, 0x05af, 0x3000 },
+  { 0x8c00, 0x05ad, 0x2000 },
+  { 0x0c00, 0x05ac, 0x0000 },
+  { 0x0c00, 0x05ae, 0x0000 },
+  { 0x8c00, 0x05b1, 0x2000 },
+  { 0x0c00, 0x05b0, 0x0000 },
+  { 0x0c00, 0x05b2, 0x0000 },
+  { 0x8c00, 0x05b7, 0x3000 },
+  { 0x8c00, 0x05b5, 0x2000 },
+  { 0x0c00, 0x05b4, 0x0000 },
+  { 0x0c00, 0x05b6, 0x0000 },
+  { 0x8c00, 0x05b9, 0x2000 },
+  { 0x0c00, 0x05b8, 0x0000 },
+  { 0x0c00, 0x05bb, 0x0000 },
+  { 0x8c00, 0x05c4, 0x4000 },
+  { 0x9500, 0x05c0, 0x3000 },
+  { 0x9500, 0x05be, 0x2000 },
+  { 0x0c00, 0x05bd, 0x0000 },
+  { 0x0c00, 0x05bf, 0x0000 },
+  { 0x8c00, 0x05c2, 0x2000 },
+  { 0x0c00, 0x05c1, 0x0000 },
+  { 0x1500, 0x05c3, 0x0000 },
+  { 0x8700, 0x05d3, 0x3000 },
+  { 0x8700, 0x05d1, 0x2000 },
+  { 0x0700, 0x05d0, 0x0000 },
+  { 0x0700, 0x05d2, 0x0000 },
+  { 0x8700, 0x05d5, 0x2000 },
+  { 0x0700, 0x05d4, 0x0000 },
+  { 0x0700, 0x05d6, 0x0000 },
+  { 0x8700, 0x05e7, 0x5000 },
+  { 0x8700, 0x05df, 0x4000 },
+  { 0x8700, 0x05db, 0x3000 },
+  { 0x8700, 0x05d9, 0x2000 },
+  { 0x0700, 0x05d8, 0x0000 },
+  { 0x0700, 0x05da, 0x0000 },
+  { 0x8700, 0x05dd, 0x2000 },
+  { 0x0700, 0x05dc, 0x0000 },
+  { 0x0700, 0x05de, 0x0000 },
+  { 0x8700, 0x05e3, 0x3000 },
+  { 0x8700, 0x05e1, 0x2000 },
+  { 0x0700, 0x05e0, 0x0000 },
+  { 0x0700, 0x05e2, 0x0000 },
+  { 0x8700, 0x05e5, 0x2000 },
+  { 0x0700, 0x05e4, 0x0000 },
+  { 0x0700, 0x05e6, 0x0000 },
+  { 0x9500, 0x05f4, 0x4000 },
+  { 0x8700, 0x05f0, 0x3000 },
+  { 0x8700, 0x05e9, 0x2000 },
+  { 0x0700, 0x05e8, 0x0000 },
+  { 0x0700, 0x05ea, 0x0000 },
+  { 0x8700, 0x05f2, 0x2000 },
+  { 0x0700, 0x05f1, 0x0000 },
+  { 0x1500, 0x05f3, 0x0000 },
+  { 0x8100, 0x0603, 0x3000 },
+  { 0x8100, 0x0601, 0x2000 },
+  { 0x0100, 0x0600, 0x0000 },
+  { 0x0100, 0x0602, 0x0000 },
+  { 0x9500, 0x060d, 0x2000 },
+  { 0x1500, 0x060c, 0x0000 },
+  { 0x1a00, 0x060e, 0x0000 },
+  { 0x8d00, 0x0664, 0x7000 },
+  { 0x8700, 0x0638, 0x6000 },
+  { 0x8700, 0x0628, 0x5000 },
+  { 0x9500, 0x061f, 0x4000 },
+  { 0x8c00, 0x0613, 0x3000 },
+  { 0x8c00, 0x0611, 0x2000 },
+  { 0x0c00, 0x0610, 0x0000 },
+  { 0x0c00, 0x0612, 0x0000 },
+  { 0x8c00, 0x0615, 0x2000 },
+  { 0x0c00, 0x0614, 0x0000 },
+  { 0x1500, 0x061b, 0x0000 },
+  { 0x8700, 0x0624, 0x3000 },
+  { 0x8700, 0x0622, 0x2000 },
+  { 0x0700, 0x0621, 0x0000 },
+  { 0x0700, 0x0623, 0x0000 },
+  { 0x8700, 0x0626, 0x2000 },
+  { 0x0700, 0x0625, 0x0000 },
+  { 0x0700, 0x0627, 0x0000 },
+  { 0x8700, 0x0630, 0x4000 },
+  { 0x8700, 0x062c, 0x3000 },
+  { 0x8700, 0x062a, 0x2000 },
+  { 0x0700, 0x0629, 0x0000 },
+  { 0x0700, 0x062b, 0x0000 },
+  { 0x8700, 0x062e, 0x2000 },
+  { 0x0700, 0x062d, 0x0000 },
+  { 0x0700, 0x062f, 0x0000 },
+  { 0x8700, 0x0634, 0x3000 },
+  { 0x8700, 0x0632, 0x2000 },
+  { 0x0700, 0x0631, 0x0000 },
+  { 0x0700, 0x0633, 0x0000 },
+  { 0x8700, 0x0636, 0x2000 },
+  { 0x0700, 0x0635, 0x0000 },
+  { 0x0700, 0x0637, 0x0000 },
+  { 0x8c00, 0x064d, 0x5000 },
+  { 0x8700, 0x0645, 0x4000 },
+  { 0x8700, 0x0641, 0x3000 },
+  { 0x8700, 0x063a, 0x2000 },
+  { 0x0700, 0x0639, 0x0000 },
+  { 0x0600, 0x0640, 0x0000 },
+  { 0x8700, 0x0643, 0x2000 },
+  { 0x0700, 0x0642, 0x0000 },
+  { 0x0700, 0x0644, 0x0000 },
+  { 0x8700, 0x0649, 0x3000 },
+  { 0x8700, 0x0647, 0x2000 },
+  { 0x0700, 0x0646, 0x0000 },
+  { 0x0700, 0x0648, 0x0000 },
+  { 0x8c00, 0x064b, 0x2000 },
+  { 0x0700, 0x064a, 0x0000 },
+  { 0x0c00, 0x064c, 0x0000 },
+  { 0x8c00, 0x0655, 0x4000 },
+  { 0x8c00, 0x0651, 0x3000 },
+  { 0x8c00, 0x064f, 0x2000 },
+  { 0x0c00, 0x064e, 0x0000 },
+  { 0x0c00, 0x0650, 0x0000 },
+  { 0x8c00, 0x0653, 0x2000 },
+  { 0x0c00, 0x0652, 0x0000 },
+  { 0x0c00, 0x0654, 0x0000 },
+  { 0x8d00, 0x0660, 0x3000 },
+  { 0x8c00, 0x0657, 0x2000 },
+  { 0x0c00, 0x0656, 0x0000 },
+  { 0x0c00, 0x0658, 0x0000 },
+  { 0x8d00, 0x0662, 0x2000 },
+  { 0x0d00, 0x0661, 0x0000 },
+  { 0x0d00, 0x0663, 0x0000 },
+  { 0x8700, 0x0684, 0x6000 },
+  { 0x8700, 0x0674, 0x5000 },
+  { 0x9500, 0x066c, 0x4000 },
+  { 0x8d00, 0x0668, 0x3000 },
+  { 0x8d00, 0x0666, 0x2000 },
+  { 0x0d00, 0x0665, 0x0000 },
+  { 0x0d00, 0x0667, 0x0000 },
+  { 0x9500, 0x066a, 0x2000 },
+  { 0x0d00, 0x0669, 0x0000 },
+  { 0x1500, 0x066b, 0x0000 },
+  { 0x8c00, 0x0670, 0x3000 },
+  { 0x8700, 0x066e, 0x2000 },
+  { 0x1500, 0x066d, 0x0000 },
+  { 0x0700, 0x066f, 0x0000 },
+  { 0x8700, 0x0672, 0x2000 },
+  { 0x0700, 0x0671, 0x0000 },
+  { 0x0700, 0x0673, 0x0000 },
+  { 0x8700, 0x067c, 0x4000 },
+  { 0x8700, 0x0678, 0x3000 },
+  { 0x8700, 0x0676, 0x2000 },
+  { 0x0700, 0x0675, 0x0000 },
+  { 0x0700, 0x0677, 0x0000 },
+  { 0x8700, 0x067a, 0x2000 },
+  { 0x0700, 0x0679, 0x0000 },
+  { 0x0700, 0x067b, 0x0000 },
+  { 0x8700, 0x0680, 0x3000 },
+  { 0x8700, 0x067e, 0x2000 },
+  { 0x0700, 0x067d, 0x0000 },
+  { 0x0700, 0x067f, 0x0000 },
+  { 0x8700, 0x0682, 0x2000 },
+  { 0x0700, 0x0681, 0x0000 },
+  { 0x0700, 0x0683, 0x0000 },
+  { 0x8700, 0x0694, 0x5000 },
+  { 0x8700, 0x068c, 0x4000 },
+  { 0x8700, 0x0688, 0x3000 },
+  { 0x8700, 0x0686, 0x2000 },
+  { 0x0700, 0x0685, 0x0000 },
+  { 0x0700, 0x0687, 0x0000 },
+  { 0x8700, 0x068a, 0x2000 },
+  { 0x0700, 0x0689, 0x0000 },
+  { 0x0700, 0x068b, 0x0000 },
+  { 0x8700, 0x0690, 0x3000 },
+  { 0x8700, 0x068e, 0x2000 },
+  { 0x0700, 0x068d, 0x0000 },
+  { 0x0700, 0x068f, 0x0000 },
+  { 0x8700, 0x0692, 0x2000 },
+  { 0x0700, 0x0691, 0x0000 },
+  { 0x0700, 0x0693, 0x0000 },
+  { 0x8700, 0x069c, 0x4000 },
+  { 0x8700, 0x0698, 0x3000 },
+  { 0x8700, 0x0696, 0x2000 },
+  { 0x0700, 0x0695, 0x0000 },
+  { 0x0700, 0x0697, 0x0000 },
+  { 0x8700, 0x069a, 0x2000 },
+  { 0x0700, 0x0699, 0x0000 },
+  { 0x0700, 0x069b, 0x0000 },
+  { 0x8700, 0x06a0, 0x3000 },
+  { 0x8700, 0x069e, 0x2000 },
+  { 0x0700, 0x069d, 0x0000 },
+  { 0x0700, 0x069f, 0x0000 },
+  { 0x8700, 0x06a2, 0x2000 },
+  { 0x0700, 0x06a1, 0x0000 },
+  { 0x0700, 0x06a3, 0x0000 },
+  { 0x8700, 0x0926, 0x9000 },
+  { 0x8700, 0x0725, 0x8000 },
+  { 0x8c00, 0x06e4, 0x7000 },
+  { 0x8700, 0x06c4, 0x6000 },
+  { 0x8700, 0x06b4, 0x5000 },
+  { 0x8700, 0x06ac, 0x4000 },
+  { 0x8700, 0x06a8, 0x3000 },
+  { 0x8700, 0x06a6, 0x2000 },
+  { 0x0700, 0x06a5, 0x0000 },
+  { 0x0700, 0x06a7, 0x0000 },
+  { 0x8700, 0x06aa, 0x2000 },
+  { 0x0700, 0x06a9, 0x0000 },
+  { 0x0700, 0x06ab, 0x0000 },
+  { 0x8700, 0x06b0, 0x3000 },
+  { 0x8700, 0x06ae, 0x2000 },
+  { 0x0700, 0x06ad, 0x0000 },
+  { 0x0700, 0x06af, 0x0000 },
+  { 0x8700, 0x06b2, 0x2000 },
+  { 0x0700, 0x06b1, 0x0000 },
+  { 0x0700, 0x06b3, 0x0000 },
+  { 0x8700, 0x06bc, 0x4000 },
+  { 0x8700, 0x06b8, 0x3000 },
+  { 0x8700, 0x06b6, 0x2000 },
+  { 0x0700, 0x06b5, 0x0000 },
+  { 0x0700, 0x06b7, 0x0000 },
+  { 0x8700, 0x06ba, 0x2000 },
+  { 0x0700, 0x06b9, 0x0000 },
+  { 0x0700, 0x06bb, 0x0000 },
+  { 0x8700, 0x06c0, 0x3000 },
+  { 0x8700, 0x06be, 0x2000 },
+  { 0x0700, 0x06bd, 0x0000 },
+  { 0x0700, 0x06bf, 0x0000 },
+  { 0x8700, 0x06c2, 0x2000 },
+  { 0x0700, 0x06c1, 0x0000 },
+  { 0x0700, 0x06c3, 0x0000 },
+  { 0x9500, 0x06d4, 0x5000 },
+  { 0x8700, 0x06cc, 0x4000 },
+  { 0x8700, 0x06c8, 0x3000 },
+  { 0x8700, 0x06c6, 0x2000 },
+  { 0x0700, 0x06c5, 0x0000 },
+  { 0x0700, 0x06c7, 0x0000 },
+  { 0x8700, 0x06ca, 0x2000 },
+  { 0x0700, 0x06c9, 0x0000 },
+  { 0x0700, 0x06cb, 0x0000 },
+  { 0x8700, 0x06d0, 0x3000 },
+  { 0x8700, 0x06ce, 0x2000 },
+  { 0x0700, 0x06cd, 0x0000 },
+  { 0x0700, 0x06cf, 0x0000 },
+  { 0x8700, 0x06d2, 0x2000 },
+  { 0x0700, 0x06d1, 0x0000 },
+  { 0x0700, 0x06d3, 0x0000 },
+  { 0x8c00, 0x06dc, 0x4000 },
+  { 0x8c00, 0x06d8, 0x3000 },
+  { 0x8c00, 0x06d6, 0x2000 },
+  { 0x0700, 0x06d5, 0x0000 },
+  { 0x0c00, 0x06d7, 0x0000 },
+  { 0x8c00, 0x06da, 0x2000 },
+  { 0x0c00, 0x06d9, 0x0000 },
+  { 0x0c00, 0x06db, 0x0000 },
+  { 0x8c00, 0x06e0, 0x3000 },
+  { 0x8b00, 0x06de, 0x2000 },
+  { 0x0100, 0x06dd, 0x0000 },
+  { 0x0c00, 0x06df, 0x0000 },
+  { 0x8c00, 0x06e2, 0x2000 },
+  { 0x0c00, 0x06e1, 0x0000 },
+  { 0x0c00, 0x06e3, 0x0000 },
+  { 0x9500, 0x0704, 0x6000 },
+  { 0x8d00, 0x06f4, 0x5000 },
+  { 0x8c00, 0x06ec, 0x4000 },
+  { 0x8c00, 0x06e8, 0x3000 },
+  { 0x8600, 0x06e6, 0x2000 },
+  { 0x0600, 0x06e5, 0x0000 },
+  { 0x0c00, 0x06e7, 0x0000 },
+  { 0x8c00, 0x06ea, 0x2000 },
+  { 0x1a00, 0x06e9, 0x0000 },
+  { 0x0c00, 0x06eb, 0x0000 },
+  { 0x8d00, 0x06f0, 0x3000 },
+  { 0x8700, 0x06ee, 0x2000 },
+  { 0x0c00, 0x06ed, 0x0000 },
+  { 0x0700, 0x06ef, 0x0000 },
+  { 0x8d00, 0x06f2, 0x2000 },
+  { 0x0d00, 0x06f1, 0x0000 },
+  { 0x0d00, 0x06f3, 0x0000 },
+  { 0x8700, 0x06fc, 0x4000 },
+  { 0x8d00, 0x06f8, 0x3000 },
+  { 0x8d00, 0x06f6, 0x2000 },
+  { 0x0d00, 0x06f5, 0x0000 },
+  { 0x0d00, 0x06f7, 0x0000 },
+  { 0x8700, 0x06fa, 0x2000 },
+  { 0x0d00, 0x06f9, 0x0000 },
+  { 0x0700, 0x06fb, 0x0000 },
+  { 0x9500, 0x0700, 0x3000 },
+  { 0x9a00, 0x06fe, 0x2000 },
+  { 0x1a00, 0x06fd, 0x0000 },
+  { 0x0700, 0x06ff, 0x0000 },
+  { 0x9500, 0x0702, 0x2000 },
+  { 0x1500, 0x0701, 0x0000 },
+  { 0x1500, 0x0703, 0x0000 },
+  { 0x8700, 0x0715, 0x5000 },
+  { 0x9500, 0x070c, 0x4000 },
+  { 0x9500, 0x0708, 0x3000 },
+  { 0x9500, 0x0706, 0x2000 },
+  { 0x1500, 0x0705, 0x0000 },
+  { 0x1500, 0x0707, 0x0000 },
+  { 0x9500, 0x070a, 0x2000 },
+  { 0x1500, 0x0709, 0x0000 },
+  { 0x1500, 0x070b, 0x0000 },
+  { 0x8c00, 0x0711, 0x3000 },
+  { 0x8100, 0x070f, 0x2000 },
+  { 0x1500, 0x070d, 0x0000 },
+  { 0x0700, 0x0710, 0x0000 },
+  { 0x8700, 0x0713, 0x2000 },
+  { 0x0700, 0x0712, 0x0000 },
+  { 0x0700, 0x0714, 0x0000 },
+  { 0x8700, 0x071d, 0x4000 },
+  { 0x8700, 0x0719, 0x3000 },
+  { 0x8700, 0x0717, 0x2000 },
+  { 0x0700, 0x0716, 0x0000 },
+  { 0x0700, 0x0718, 0x0000 },
+  { 0x8700, 0x071b, 0x2000 },
+  { 0x0700, 0x071a, 0x0000 },
+  { 0x0700, 0x071c, 0x0000 },
+  { 0x8700, 0x0721, 0x3000 },
+  { 0x8700, 0x071f, 0x2000 },
+  { 0x0700, 0x071e, 0x0000 },
+  { 0x0700, 0x0720, 0x0000 },
+  { 0x8700, 0x0723, 0x2000 },
+  { 0x0700, 0x0722, 0x0000 },
+  { 0x0700, 0x0724, 0x0000 },
+  { 0x8700, 0x0797, 0x7000 },
+  { 0x8c00, 0x0745, 0x6000 },
+  { 0x8c00, 0x0735, 0x5000 },
+  { 0x8700, 0x072d, 0x4000 },
+  { 0x8700, 0x0729, 0x3000 },
+  { 0x8700, 0x0727, 0x2000 },
+  { 0x0700, 0x0726, 0x0000 },
+  { 0x0700, 0x0728, 0x0000 },
+  { 0x8700, 0x072b, 0x2000 },
+  { 0x0700, 0x072a, 0x0000 },
+  { 0x0700, 0x072c, 0x0000 },
+  { 0x8c00, 0x0731, 0x3000 },
+  { 0x8700, 0x072f, 0x2000 },
+  { 0x0700, 0x072e, 0x0000 },
+  { 0x0c00, 0x0730, 0x0000 },
+  { 0x8c00, 0x0733, 0x2000 },
+  { 0x0c00, 0x0732, 0x0000 },
+  { 0x0c00, 0x0734, 0x0000 },
+  { 0x8c00, 0x073d, 0x4000 },
+  { 0x8c00, 0x0739, 0x3000 },
+  { 0x8c00, 0x0737, 0x2000 },
+  { 0x0c00, 0x0736, 0x0000 },
+  { 0x0c00, 0x0738, 0x0000 },
+  { 0x8c00, 0x073b, 0x2000 },
+  { 0x0c00, 0x073a, 0x0000 },
+  { 0x0c00, 0x073c, 0x0000 },
+  { 0x8c00, 0x0741, 0x3000 },
+  { 0x8c00, 0x073f, 0x2000 },
+  { 0x0c00, 0x073e, 0x0000 },
+  { 0x0c00, 0x0740, 0x0000 },
+  { 0x8c00, 0x0743, 0x2000 },
+  { 0x0c00, 0x0742, 0x0000 },
+  { 0x0c00, 0x0744, 0x0000 },
+  { 0x8700, 0x0787, 0x5000 },
+  { 0x8700, 0x074f, 0x4000 },
+  { 0x8c00, 0x0749, 0x3000 },
+  { 0x8c00, 0x0747, 0x2000 },
+  { 0x0c00, 0x0746, 0x0000 },
+  { 0x0c00, 0x0748, 0x0000 },
+  { 0x8700, 0x074d, 0x2000 },
+  { 0x0c00, 0x074a, 0x0000 },
+  { 0x0700, 0x074e, 0x0000 },
+  { 0x8700, 0x0783, 0x3000 },
+  { 0x8700, 0x0781, 0x2000 },
+  { 0x0700, 0x0780, 0x0000 },
+  { 0x0700, 0x0782, 0x0000 },
+  { 0x8700, 0x0785, 0x2000 },
+  { 0x0700, 0x0784, 0x0000 },
+  { 0x0700, 0x0786, 0x0000 },
+  { 0x8700, 0x078f, 0x4000 },
+  { 0x8700, 0x078b, 0x3000 },
+  { 0x8700, 0x0789, 0x2000 },
+  { 0x0700, 0x0788, 0x0000 },
+  { 0x0700, 0x078a, 0x0000 },
+  { 0x8700, 0x078d, 0x2000 },
+  { 0x0700, 0x078c, 0x0000 },
+  { 0x0700, 0x078e, 0x0000 },
+  { 0x8700, 0x0793, 0x3000 },
+  { 0x8700, 0x0791, 0x2000 },
+  { 0x0700, 0x0790, 0x0000 },
+  { 0x0700, 0x0792, 0x0000 },
+  { 0x8700, 0x0795, 0x2000 },
+  { 0x0700, 0x0794, 0x0000 },
+  { 0x0700, 0x0796, 0x0000 },
+  { 0x8700, 0x0906, 0x6000 },
+  { 0x8c00, 0x07a7, 0x5000 },
+  { 0x8700, 0x079f, 0x4000 },
+  { 0x8700, 0x079b, 0x3000 },
+  { 0x8700, 0x0799, 0x2000 },
+  { 0x0700, 0x0798, 0x0000 },
+  { 0x0700, 0x079a, 0x0000 },
+  { 0x8700, 0x079d, 0x2000 },
+  { 0x0700, 0x079c, 0x0000 },
+  { 0x0700, 0x079e, 0x0000 },
+  { 0x8700, 0x07a3, 0x3000 },
+  { 0x8700, 0x07a1, 0x2000 },
+  { 0x0700, 0x07a0, 0x0000 },
+  { 0x0700, 0x07a2, 0x0000 },
+  { 0x8700, 0x07a5, 0x2000 },
+  { 0x0700, 0x07a4, 0x0000 },
+  { 0x0c00, 0x07a6, 0x0000 },
+  { 0x8c00, 0x07af, 0x4000 },
+  { 0x8c00, 0x07ab, 0x3000 },
+  { 0x8c00, 0x07a9, 0x2000 },
+  { 0x0c00, 0x07a8, 0x0000 },
+  { 0x0c00, 0x07aa, 0x0000 },
+  { 0x8c00, 0x07ad, 0x2000 },
+  { 0x0c00, 0x07ac, 0x0000 },
+  { 0x0c00, 0x07ae, 0x0000 },
+  { 0x8c00, 0x0902, 0x3000 },
+  { 0x8700, 0x07b1, 0x2000 },
+  { 0x0c00, 0x07b0, 0x0000 },
+  { 0x0c00, 0x0901, 0x0000 },
+  { 0x8700, 0x0904, 0x2000 },
+  { 0x0a00, 0x0903, 0x0000 },
+  { 0x0700, 0x0905, 0x0000 },
+  { 0x8700, 0x0916, 0x5000 },
+  { 0x8700, 0x090e, 0x4000 },
+  { 0x8700, 0x090a, 0x3000 },
+  { 0x8700, 0x0908, 0x2000 },
+  { 0x0700, 0x0907, 0x0000 },
+  { 0x0700, 0x0909, 0x0000 },
+  { 0x8700, 0x090c, 0x2000 },
+  { 0x0700, 0x090b, 0x0000 },
+  { 0x0700, 0x090d, 0x0000 },
+  { 0x8700, 0x0912, 0x3000 },
+  { 0x8700, 0x0910, 0x2000 },
+  { 0x0700, 0x090f, 0x0000 },
+  { 0x0700, 0x0911, 0x0000 },
+  { 0x8700, 0x0914, 0x2000 },
+  { 0x0700, 0x0913, 0x0000 },
+  { 0x0700, 0x0915, 0x0000 },
+  { 0x8700, 0x091e, 0x4000 },
+  { 0x8700, 0x091a, 0x3000 },
+  { 0x8700, 0x0918, 0x2000 },
+  { 0x0700, 0x0917, 0x0000 },
+  { 0x0700, 0x0919, 0x0000 },
+  { 0x8700, 0x091c, 0x2000 },
+  { 0x0700, 0x091b, 0x0000 },
+  { 0x0700, 0x091d, 0x0000 },
+  { 0x8700, 0x0922, 0x3000 },
+  { 0x8700, 0x0920, 0x2000 },
+  { 0x0700, 0x091f, 0x0000 },
+  { 0x0700, 0x0921, 0x0000 },
+  { 0x8700, 0x0924, 0x2000 },
+  { 0x0700, 0x0923, 0x0000 },
+  { 0x0700, 0x0925, 0x0000 },
+  { 0x8c00, 0x09cd, 0x8000 },
+  { 0x8d00, 0x096d, 0x7000 },
+  { 0x8c00, 0x0948, 0x6000 },
+  { 0x8700, 0x0936, 0x5000 },
+  { 0x8700, 0x092e, 0x4000 },
+  { 0x8700, 0x092a, 0x3000 },
+  { 0x8700, 0x0928, 0x2000 },
+  { 0x0700, 0x0927, 0x0000 },
+  { 0x0700, 0x0929, 0x0000 },
+  { 0x8700, 0x092c, 0x2000 },
+  { 0x0700, 0x092b, 0x0000 },
+  { 0x0700, 0x092d, 0x0000 },
+  { 0x8700, 0x0932, 0x3000 },
+  { 0x8700, 0x0930, 0x2000 },
+  { 0x0700, 0x092f, 0x0000 },
+  { 0x0700, 0x0931, 0x0000 },
+  { 0x8700, 0x0934, 0x2000 },
+  { 0x0700, 0x0933, 0x0000 },
+  { 0x0700, 0x0935, 0x0000 },
+  { 0x8a00, 0x0940, 0x4000 },
+  { 0x8c00, 0x093c, 0x3000 },
+  { 0x8700, 0x0938, 0x2000 },
+  { 0x0700, 0x0937, 0x0000 },
+  { 0x0700, 0x0939, 0x0000 },
+  { 0x8a00, 0x093e, 0x2000 },
+  { 0x0700, 0x093d, 0x0000 },
+  { 0x0a00, 0x093f, 0x0000 },
+  { 0x8c00, 0x0944, 0x3000 },
+  { 0x8c00, 0x0942, 0x2000 },
+  { 0x0c00, 0x0941, 0x0000 },
+  { 0x0c00, 0x0943, 0x0000 },
+  { 0x8c00, 0x0946, 0x2000 },
+  { 0x0c00, 0x0945, 0x0000 },
+  { 0x0c00, 0x0947, 0x0000 },
+  { 0x8700, 0x095d, 0x5000 },
+  { 0x8c00, 0x0952, 0x4000 },
+  { 0x8a00, 0x094c, 0x3000 },
+  { 0x8a00, 0x094a, 0x2000 },
+  { 0x0a00, 0x0949, 0x0000 },
+  { 0x0a00, 0x094b, 0x0000 },
+  { 0x8700, 0x0950, 0x2000 },
+  { 0x0c00, 0x094d, 0x0000 },
+  { 0x0c00, 0x0951, 0x0000 },
+  { 0x8700, 0x0959, 0x3000 },
+  { 0x8c00, 0x0954, 0x2000 },
+  { 0x0c00, 0x0953, 0x0000 },
+  { 0x0700, 0x0958, 0x0000 },
+  { 0x8700, 0x095b, 0x2000 },
+  { 0x0700, 0x095a, 0x0000 },
+  { 0x0700, 0x095c, 0x0000 },
+  { 0x9500, 0x0965, 0x4000 },
+  { 0x8700, 0x0961, 0x3000 },
+  { 0x8700, 0x095f, 0x2000 },
+  { 0x0700, 0x095e, 0x0000 },
+  { 0x0700, 0x0960, 0x0000 },
+  { 0x8c00, 0x0963, 0x2000 },
+  { 0x0c00, 0x0962, 0x0000 },
+  { 0x1500, 0x0964, 0x0000 },
+  { 0x8d00, 0x0969, 0x3000 },
+  { 0x8d00, 0x0967, 0x2000 },
+  { 0x0d00, 0x0966, 0x0000 },
+  { 0x0d00, 0x0968, 0x0000 },
+  { 0x8d00, 0x096b, 0x2000 },
+  { 0x0d00, 0x096a, 0x0000 },
+  { 0x0d00, 0x096c, 0x0000 },
+  { 0x8700, 0x09a2, 0x6000 },
+  { 0x8700, 0x0990, 0x5000 },
+  { 0x8700, 0x0986, 0x4000 },
+  { 0x8c00, 0x0981, 0x3000 },
+  { 0x8d00, 0x096f, 0x2000 },
+  { 0x0d00, 0x096e, 0x0000 },
+  { 0x1500, 0x0970, 0x0000 },
+  { 0x8a00, 0x0983, 0x2000 },
+  { 0x0a00, 0x0982, 0x0000 },
+  { 0x0700, 0x0985, 0x0000 },
+  { 0x8700, 0x098a, 0x3000 },
+  { 0x8700, 0x0988, 0x2000 },
+  { 0x0700, 0x0987, 0x0000 },
+  { 0x0700, 0x0989, 0x0000 },
+  { 0x8700, 0x098c, 0x2000 },
+  { 0x0700, 0x098b, 0x0000 },
+  { 0x0700, 0x098f, 0x0000 },
+  { 0x8700, 0x099a, 0x4000 },
+  { 0x8700, 0x0996, 0x3000 },
+  { 0x8700, 0x0994, 0x2000 },
+  { 0x0700, 0x0993, 0x0000 },
+  { 0x0700, 0x0995, 0x0000 },
+  { 0x8700, 0x0998, 0x2000 },
+  { 0x0700, 0x0997, 0x0000 },
+  { 0x0700, 0x0999, 0x0000 },
+  { 0x8700, 0x099e, 0x3000 },
+  { 0x8700, 0x099c, 0x2000 },
+  { 0x0700, 0x099b, 0x0000 },
+  { 0x0700, 0x099d, 0x0000 },
+  { 0x8700, 0x09a0, 0x2000 },
+  { 0x0700, 0x099f, 0x0000 },
+  { 0x0700, 0x09a1, 0x0000 },
+  { 0x8700, 0x09b7, 0x5000 },
+  { 0x8700, 0x09ab, 0x4000 },
+  { 0x8700, 0x09a6, 0x3000 },
+  { 0x8700, 0x09a4, 0x2000 },
+  { 0x0700, 0x09a3, 0x0000 },
+  { 0x0700, 0x09a5, 0x0000 },
+  { 0x8700, 0x09a8, 0x2000 },
+  { 0x0700, 0x09a7, 0x0000 },
+  { 0x0700, 0x09aa, 0x0000 },
+  { 0x8700, 0x09af, 0x3000 },
+  { 0x8700, 0x09ad, 0x2000 },
+  { 0x0700, 0x09ac, 0x0000 },
+  { 0x0700, 0x09ae, 0x0000 },
+  { 0x8700, 0x09b2, 0x2000 },
+  { 0x0700, 0x09b0, 0x0000 },
+  { 0x0700, 0x09b6, 0x0000 },
+  { 0x8c00, 0x09c1, 0x4000 },
+  { 0x8700, 0x09bd, 0x3000 },
+  { 0x8700, 0x09b9, 0x2000 },
+  { 0x0700, 0x09b8, 0x0000 },
+  { 0x0c00, 0x09bc, 0x0000 },
+  { 0x8a00, 0x09bf, 0x2000 },
+  { 0x0a00, 0x09be, 0x0000 },
+  { 0x0a00, 0x09c0, 0x0000 },
+  { 0x8a00, 0x09c7, 0x3000 },
+  { 0x8c00, 0x09c3, 0x2000 },
+  { 0x0c00, 0x09c2, 0x0000 },
+  { 0x0c00, 0x09c4, 0x0000 },
+  { 0x8a00, 0x09cb, 0x2000 },
+  { 0x0a00, 0x09c8, 0x0000 },
+  { 0x0a00, 0x09cc, 0x0000 },
+  { 0x8700, 0x0a2b, 0x7000 },
+  { 0x8a00, 0x0a03, 0x6000 },
+  { 0x8d00, 0x09ed, 0x5000 },
+  { 0x8c00, 0x09e3, 0x4000 },
+  { 0x8700, 0x09df, 0x3000 },
+  { 0x8700, 0x09dc, 0x2000 },
+  { 0x0a00, 0x09d7, 0x0000 },
+  { 0x0700, 0x09dd, 0x0000 },
+  { 0x8700, 0x09e1, 0x2000 },
+  { 0x0700, 0x09e0, 0x0000 },
+  { 0x0c00, 0x09e2, 0x0000 },
+  { 0x8d00, 0x09e9, 0x3000 },
+  { 0x8d00, 0x09e7, 0x2000 },
+  { 0x0d00, 0x09e6, 0x0000 },
+  { 0x0d00, 0x09e8, 0x0000 },
+  { 0x8d00, 0x09eb, 0x2000 },
+  { 0x0d00, 0x09ea, 0x0000 },
+  { 0x0d00, 0x09ec, 0x0000 },
+  { 0x8f00, 0x09f5, 0x4000 },
+  { 0x8700, 0x09f1, 0x3000 },
+  { 0x8d00, 0x09ef, 0x2000 },
+  { 0x0d00, 0x09ee, 0x0000 },
+  { 0x0700, 0x09f0, 0x0000 },
+  { 0x9700, 0x09f3, 0x2000 },
+  { 0x1700, 0x09f2, 0x0000 },
+  { 0x0f00, 0x09f4, 0x0000 },
+  { 0x8f00, 0x09f9, 0x3000 },
+  { 0x8f00, 0x09f7, 0x2000 },
+  { 0x0f00, 0x09f6, 0x0000 },
+  { 0x0f00, 0x09f8, 0x0000 },
+  { 0x8c00, 0x0a01, 0x2000 },
+  { 0x1a00, 0x09fa, 0x0000 },
+  { 0x0c00, 0x0a02, 0x0000 },
+  { 0x8700, 0x0a1a, 0x5000 },
+  { 0x8700, 0x0a10, 0x4000 },
+  { 0x8700, 0x0a08, 0x3000 },
+  { 0x8700, 0x0a06, 0x2000 },
+  { 0x0700, 0x0a05, 0x0000 },
+  { 0x0700, 0x0a07, 0x0000 },
+  { 0x8700, 0x0a0a, 0x2000 },
+  { 0x0700, 0x0a09, 0x0000 },
+  { 0x0700, 0x0a0f, 0x0000 },
+  { 0x8700, 0x0a16, 0x3000 },
+  { 0x8700, 0x0a14, 0x2000 },
+  { 0x0700, 0x0a13, 0x0000 },
+  { 0x0700, 0x0a15, 0x0000 },
+  { 0x8700, 0x0a18, 0x2000 },
+  { 0x0700, 0x0a17, 0x0000 },
+  { 0x0700, 0x0a19, 0x0000 },
+  { 0x8700, 0x0a22, 0x4000 },
+  { 0x8700, 0x0a1e, 0x3000 },
+  { 0x8700, 0x0a1c, 0x2000 },
+  { 0x0700, 0x0a1b, 0x0000 },
+  { 0x0700, 0x0a1d, 0x0000 },
+  { 0x8700, 0x0a20, 0x2000 },
+  { 0x0700, 0x0a1f, 0x0000 },
+  { 0x0700, 0x0a21, 0x0000 },
+  { 0x8700, 0x0a26, 0x3000 },
+  { 0x8700, 0x0a24, 0x2000 },
+  { 0x0700, 0x0a23, 0x0000 },
+  { 0x0700, 0x0a25, 0x0000 },
+  { 0x8700, 0x0a28, 0x2000 },
+  { 0x0700, 0x0a27, 0x0000 },
+  { 0x0700, 0x0a2a, 0x0000 },
+  { 0x8d00, 0x0a6a, 0x6000 },
+  { 0x8c00, 0x0a41, 0x5000 },
+  { 0x8700, 0x0a35, 0x4000 },
+  { 0x8700, 0x0a2f, 0x3000 },
+  { 0x8700, 0x0a2d, 0x2000 },
+  { 0x0700, 0x0a2c, 0x0000 },
+  { 0x0700, 0x0a2e, 0x0000 },
+  { 0x8700, 0x0a32, 0x2000 },
+  { 0x0700, 0x0a30, 0x0000 },
+  { 0x0700, 0x0a33, 0x0000 },
+  { 0x8c00, 0x0a3c, 0x3000 },
+  { 0x8700, 0x0a38, 0x2000 },
+  { 0x0700, 0x0a36, 0x0000 },
+  { 0x0700, 0x0a39, 0x0000 },
+  { 0x8a00, 0x0a3f, 0x2000 },
+  { 0x0a00, 0x0a3e, 0x0000 },
+  { 0x0a00, 0x0a40, 0x0000 },
+  { 0x8700, 0x0a5a, 0x4000 },
+  { 0x8c00, 0x0a4b, 0x3000 },
+  { 0x8c00, 0x0a47, 0x2000 },
+  { 0x0c00, 0x0a42, 0x0000 },
+  { 0x0c00, 0x0a48, 0x0000 },
+  { 0x8c00, 0x0a4d, 0x2000 },
+  { 0x0c00, 0x0a4c, 0x0000 },
+  { 0x0700, 0x0a59, 0x0000 },
+  { 0x8d00, 0x0a66, 0x3000 },
+  { 0x8700, 0x0a5c, 0x2000 },
+  { 0x0700, 0x0a5b, 0x0000 },
+  { 0x0700, 0x0a5e, 0x0000 },
+  { 0x8d00, 0x0a68, 0x2000 },
+  { 0x0d00, 0x0a67, 0x0000 },
+  { 0x0d00, 0x0a69, 0x0000 },
+  { 0x8700, 0x0a87, 0x5000 },
+  { 0x8700, 0x0a72, 0x4000 },
+  { 0x8d00, 0x0a6e, 0x3000 },
+  { 0x8d00, 0x0a6c, 0x2000 },
+  { 0x0d00, 0x0a6b, 0x0000 },
+  { 0x0d00, 0x0a6d, 0x0000 },
+  { 0x8c00, 0x0a70, 0x2000 },
+  { 0x0d00, 0x0a6f, 0x0000 },
+  { 0x0c00, 0x0a71, 0x0000 },
+  { 0x8c00, 0x0a82, 0x3000 },
+  { 0x8700, 0x0a74, 0x2000 },
+  { 0x0700, 0x0a73, 0x0000 },
+  { 0x0c00, 0x0a81, 0x0000 },
+  { 0x8700, 0x0a85, 0x2000 },
+  { 0x0a00, 0x0a83, 0x0000 },
+  { 0x0700, 0x0a86, 0x0000 },
+  { 0x8700, 0x0a90, 0x4000 },
+  { 0x8700, 0x0a8b, 0x3000 },
+  { 0x8700, 0x0a89, 0x2000 },
+  { 0x0700, 0x0a88, 0x0000 },
+  { 0x0700, 0x0a8a, 0x0000 },
+  { 0x8700, 0x0a8d, 0x2000 },
+  { 0x0700, 0x0a8c, 0x0000 },
+  { 0x0700, 0x0a8f, 0x0000 },
+  { 0x8700, 0x0a95, 0x3000 },
+  { 0x8700, 0x0a93, 0x2000 },
+  { 0x0700, 0x0a91, 0x0000 },
+  { 0x0700, 0x0a94, 0x0000 },
+  { 0x8700, 0x0a97, 0x2000 },
+  { 0x0700, 0x0a96, 0x0000 },
+  { 0x0700, 0x0a98, 0x0000 },
+  { 0x8700, 0x10ef, 0xb000 },
+  { 0x8700, 0x0dc6, 0xa000 },
+  { 0x8700, 0x0c31, 0x9000 },
+  { 0x8700, 0x0b5f, 0x8000 },
+  { 0x8a00, 0x0b03, 0x7000 },
+  { 0x8a00, 0x0abe, 0x6000 },
+  { 0x8700, 0x0aaa, 0x5000 },
+  { 0x8700, 0x0aa1, 0x4000 },
+  { 0x8700, 0x0a9d, 0x3000 },
+  { 0x8700, 0x0a9b, 0x2000 },
+  { 0x0700, 0x0a9a, 0x0000 },
+  { 0x0700, 0x0a9c, 0x0000 },
+  { 0x8700, 0x0a9f, 0x2000 },
+  { 0x0700, 0x0a9e, 0x0000 },
+  { 0x0700, 0x0aa0, 0x0000 },
+  { 0x8700, 0x0aa5, 0x3000 },
+  { 0x8700, 0x0aa3, 0x2000 },
+  { 0x0700, 0x0aa2, 0x0000 },
+  { 0x0700, 0x0aa4, 0x0000 },
+  { 0x8700, 0x0aa7, 0x2000 },
+  { 0x0700, 0x0aa6, 0x0000 },
+  { 0x0700, 0x0aa8, 0x0000 },
+  { 0x8700, 0x0ab3, 0x4000 },
+  { 0x8700, 0x0aae, 0x3000 },
+  { 0x8700, 0x0aac, 0x2000 },
+  { 0x0700, 0x0aab, 0x0000 },
+  { 0x0700, 0x0aad, 0x0000 },
+  { 0x8700, 0x0ab0, 0x2000 },
+  { 0x0700, 0x0aaf, 0x0000 },
+  { 0x0700, 0x0ab2, 0x0000 },
+  { 0x8700, 0x0ab8, 0x3000 },
+  { 0x8700, 0x0ab6, 0x2000 },
+  { 0x0700, 0x0ab5, 0x0000 },
+  { 0x0700, 0x0ab7, 0x0000 },
+  { 0x8c00, 0x0abc, 0x2000 },
+  { 0x0700, 0x0ab9, 0x0000 },
+  { 0x0700, 0x0abd, 0x0000 },
+  { 0x8700, 0x0ae1, 0x5000 },
+  { 0x8c00, 0x0ac7, 0x4000 },
+  { 0x8c00, 0x0ac2, 0x3000 },
+  { 0x8a00, 0x0ac0, 0x2000 },
+  { 0x0a00, 0x0abf, 0x0000 },
+  { 0x0c00, 0x0ac1, 0x0000 },
+  { 0x8c00, 0x0ac4, 0x2000 },
+  { 0x0c00, 0x0ac3, 0x0000 },
+  { 0x0c00, 0x0ac5, 0x0000 },
+  { 0x8a00, 0x0acc, 0x3000 },
+  { 0x8a00, 0x0ac9, 0x2000 },
+  { 0x0c00, 0x0ac8, 0x0000 },
+  { 0x0a00, 0x0acb, 0x0000 },
+  { 0x8700, 0x0ad0, 0x2000 },
+  { 0x0c00, 0x0acd, 0x0000 },
+  { 0x0700, 0x0ae0, 0x0000 },
+  { 0x8d00, 0x0aeb, 0x4000 },
+  { 0x8d00, 0x0ae7, 0x3000 },
+  { 0x8c00, 0x0ae3, 0x2000 },
+  { 0x0c00, 0x0ae2, 0x0000 },
+  { 0x0d00, 0x0ae6, 0x0000 },
+  { 0x8d00, 0x0ae9, 0x2000 },
+  { 0x0d00, 0x0ae8, 0x0000 },
+  { 0x0d00, 0x0aea, 0x0000 },
+  { 0x8d00, 0x0aef, 0x3000 },
+  { 0x8d00, 0x0aed, 0x2000 },
+  { 0x0d00, 0x0aec, 0x0000 },
+  { 0x0d00, 0x0aee, 0x0000 },
+  { 0x8c00, 0x0b01, 0x2000 },
+  { 0x1700, 0x0af1, 0x0000 },
+  { 0x0a00, 0x0b02, 0x0000 },
+  { 0x8700, 0x0b28, 0x6000 },
+  { 0x8700, 0x0b18, 0x5000 },
+  { 0x8700, 0x0b0c, 0x4000 },
+  { 0x8700, 0x0b08, 0x3000 },
+  { 0x8700, 0x0b06, 0x2000 },
+  { 0x0700, 0x0b05, 0x0000 },
+  { 0x0700, 0x0b07, 0x0000 },
+  { 0x8700, 0x0b0a, 0x2000 },
+  { 0x0700, 0x0b09, 0x0000 },
+  { 0x0700, 0x0b0b, 0x0000 },
+  { 0x8700, 0x0b14, 0x3000 },
+  { 0x8700, 0x0b10, 0x2000 },
+  { 0x0700, 0x0b0f, 0x0000 },
+  { 0x0700, 0x0b13, 0x0000 },
+  { 0x8700, 0x0b16, 0x2000 },
+  { 0x0700, 0x0b15, 0x0000 },
+  { 0x0700, 0x0b17, 0x0000 },
+  { 0x8700, 0x0b20, 0x4000 },
+  { 0x8700, 0x0b1c, 0x3000 },
+  { 0x8700, 0x0b1a, 0x2000 },
+  { 0x0700, 0x0b19, 0x0000 },
+  { 0x0700, 0x0b1b, 0x0000 },
+  { 0x8700, 0x0b1e, 0x2000 },
+  { 0x0700, 0x0b1d, 0x0000 },
+  { 0x0700, 0x0b1f, 0x0000 },
+  { 0x8700, 0x0b24, 0x3000 },
+  { 0x8700, 0x0b22, 0x2000 },
+  { 0x0700, 0x0b21, 0x0000 },
+  { 0x0700, 0x0b23, 0x0000 },
+  { 0x8700, 0x0b26, 0x2000 },
+  { 0x0700, 0x0b25, 0x0000 },
+  { 0x0700, 0x0b27, 0x0000 },
+  { 0x8700, 0x0b3d, 0x5000 },
+  { 0x8700, 0x0b32, 0x4000 },
+  { 0x8700, 0x0b2d, 0x3000 },
+  { 0x8700, 0x0b2b, 0x2000 },
+  { 0x0700, 0x0b2a, 0x0000 },
+  { 0x0700, 0x0b2c, 0x0000 },
+  { 0x8700, 0x0b2f, 0x2000 },
+  { 0x0700, 0x0b2e, 0x0000 },
+  { 0x0700, 0x0b30, 0x0000 },
+  { 0x8700, 0x0b37, 0x3000 },
+  { 0x8700, 0x0b35, 0x2000 },
+  { 0x0700, 0x0b33, 0x0000 },
+  { 0x0700, 0x0b36, 0x0000 },
+  { 0x8700, 0x0b39, 0x2000 },
+  { 0x0700, 0x0b38, 0x0000 },
+  { 0x0c00, 0x0b3c, 0x0000 },
+  { 0x8a00, 0x0b48, 0x4000 },
+  { 0x8c00, 0x0b41, 0x3000 },
+  { 0x8c00, 0x0b3f, 0x2000 },
+  { 0x0a00, 0x0b3e, 0x0000 },
+  { 0x0a00, 0x0b40, 0x0000 },
+  { 0x8c00, 0x0b43, 0x2000 },
+  { 0x0c00, 0x0b42, 0x0000 },
+  { 0x0a00, 0x0b47, 0x0000 },
+  { 0x8c00, 0x0b56, 0x3000 },
+  { 0x8a00, 0x0b4c, 0x2000 },
+  { 0x0a00, 0x0b4b, 0x0000 },
+  { 0x0c00, 0x0b4d, 0x0000 },
+  { 0x8700, 0x0b5c, 0x2000 },
+  { 0x0a00, 0x0b57, 0x0000 },
+  { 0x0700, 0x0b5d, 0x0000 },
+  { 0x8d00, 0x0be7, 0x7000 },
+  { 0x8700, 0x0b9c, 0x6000 },
+  { 0x8700, 0x0b83, 0x5000 },
+  { 0x8d00, 0x0b6b, 0x4000 },
+  { 0x8d00, 0x0b67, 0x3000 },
+  { 0x8700, 0x0b61, 0x2000 },
+  { 0x0700, 0x0b60, 0x0000 },
+  { 0x0d00, 0x0b66, 0x0000 },
+  { 0x8d00, 0x0b69, 0x2000 },
+  { 0x0d00, 0x0b68, 0x0000 },
+  { 0x0d00, 0x0b6a, 0x0000 },
+  { 0x8d00, 0x0b6f, 0x3000 },
+  { 0x8d00, 0x0b6d, 0x2000 },
+  { 0x0d00, 0x0b6c, 0x0000 },
+  { 0x0d00, 0x0b6e, 0x0000 },
+  { 0x8700, 0x0b71, 0x2000 },
+  { 0x1a00, 0x0b70, 0x0000 },
+  { 0x0c00, 0x0b82, 0x0000 },
+  { 0x8700, 0x0b8f, 0x4000 },
+  { 0x8700, 0x0b88, 0x3000 },
+  { 0x8700, 0x0b86, 0x2000 },
+  { 0x0700, 0x0b85, 0x0000 },
+  { 0x0700, 0x0b87, 0x0000 },
+  { 0x8700, 0x0b8a, 0x2000 },
+  { 0x0700, 0x0b89, 0x0000 },
+  { 0x0700, 0x0b8e, 0x0000 },
+  { 0x8700, 0x0b94, 0x3000 },
+  { 0x8700, 0x0b92, 0x2000 },
+  { 0x0700, 0x0b90, 0x0000 },
+  { 0x0700, 0x0b93, 0x0000 },
+  { 0x8700, 0x0b99, 0x2000 },
+  { 0x0700, 0x0b95, 0x0000 },
+  { 0x0700, 0x0b9a, 0x0000 },
+  { 0x8700, 0x0bb7, 0x5000 },
+  { 0x8700, 0x0bae, 0x4000 },
+  { 0x8700, 0x0ba4, 0x3000 },
+  { 0x8700, 0x0b9f, 0x2000 },
+  { 0x0700, 0x0b9e, 0x0000 },
+  { 0x0700, 0x0ba3, 0x0000 },
+  { 0x8700, 0x0ba9, 0x2000 },
+  { 0x0700, 0x0ba8, 0x0000 },
+  { 0x0700, 0x0baa, 0x0000 },
+  { 0x8700, 0x0bb2, 0x3000 },
+  { 0x8700, 0x0bb0, 0x2000 },
+  { 0x0700, 0x0baf, 0x0000 },
+  { 0x0700, 0x0bb1, 0x0000 },
+  { 0x8700, 0x0bb4, 0x2000 },
+  { 0x0700, 0x0bb3, 0x0000 },
+  { 0x0700, 0x0bb5, 0x0000 },
+  { 0x8a00, 0x0bc6, 0x4000 },
+  { 0x8a00, 0x0bbf, 0x3000 },
+  { 0x8700, 0x0bb9, 0x2000 },
+  { 0x0700, 0x0bb8, 0x0000 },
+  { 0x0a00, 0x0bbe, 0x0000 },
+  { 0x8a00, 0x0bc1, 0x2000 },
+  { 0x0c00, 0x0bc0, 0x0000 },
+  { 0x0a00, 0x0bc2, 0x0000 },
+  { 0x8a00, 0x0bcb, 0x3000 },
+  { 0x8a00, 0x0bc8, 0x2000 },
+  { 0x0a00, 0x0bc7, 0x0000 },
+  { 0x0a00, 0x0bca, 0x0000 },
+  { 0x8c00, 0x0bcd, 0x2000 },
+  { 0x0a00, 0x0bcc, 0x0000 },
+  { 0x0a00, 0x0bd7, 0x0000 },
+  { 0x8700, 0x0c0f, 0x6000 },
+  { 0x9a00, 0x0bf7, 0x5000 },
+  { 0x8d00, 0x0bef, 0x4000 },
+  { 0x8d00, 0x0beb, 0x3000 },
+  { 0x8d00, 0x0be9, 0x2000 },
+  { 0x0d00, 0x0be8, 0x0000 },
+  { 0x0d00, 0x0bea, 0x0000 },
+  { 0x8d00, 0x0bed, 0x2000 },
+  { 0x0d00, 0x0bec, 0x0000 },
+  { 0x0d00, 0x0bee, 0x0000 },
+  { 0x9a00, 0x0bf3, 0x3000 },
+  { 0x8f00, 0x0bf1, 0x2000 },
+  { 0x0f00, 0x0bf0, 0x0000 },
+  { 0x0f00, 0x0bf2, 0x0000 },
+  { 0x9a00, 0x0bf5, 0x2000 },
+  { 0x1a00, 0x0bf4, 0x0000 },
+  { 0x1a00, 0x0bf6, 0x0000 },
+  { 0x8700, 0x0c06, 0x4000 },
+  { 0x8a00, 0x0c01, 0x3000 },
+  { 0x9700, 0x0bf9, 0x2000 },
+  { 0x1a00, 0x0bf8, 0x0000 },
+  { 0x1a00, 0x0bfa, 0x0000 },
+  { 0x8a00, 0x0c03, 0x2000 },
+  { 0x0a00, 0x0c02, 0x0000 },
+  { 0x0700, 0x0c05, 0x0000 },
+  { 0x8700, 0x0c0a, 0x3000 },
+  { 0x8700, 0x0c08, 0x2000 },
+  { 0x0700, 0x0c07, 0x0000 },
+  { 0x0700, 0x0c09, 0x0000 },
+  { 0x8700, 0x0c0c, 0x2000 },
+  { 0x0700, 0x0c0b, 0x0000 },
+  { 0x0700, 0x0c0e, 0x0000 },
+  { 0x8700, 0x0c20, 0x5000 },
+  { 0x8700, 0x0c18, 0x4000 },
+  { 0x8700, 0x0c14, 0x3000 },
+  { 0x8700, 0x0c12, 0x2000 },
+  { 0x0700, 0x0c10, 0x0000 },
+  { 0x0700, 0x0c13, 0x0000 },
+  { 0x8700, 0x0c16, 0x2000 },
+  { 0x0700, 0x0c15, 0x0000 },
+  { 0x0700, 0x0c17, 0x0000 },
+  { 0x8700, 0x0c1c, 0x3000 },
+  { 0x8700, 0x0c1a, 0x2000 },
+  { 0x0700, 0x0c19, 0x0000 },
+  { 0x0700, 0x0c1b, 0x0000 },
+  { 0x8700, 0x0c1e, 0x2000 },
+  { 0x0700, 0x0c1d, 0x0000 },
+  { 0x0700, 0x0c1f, 0x0000 },
+  { 0x8700, 0x0c28, 0x4000 },
+  { 0x8700, 0x0c24, 0x3000 },
+  { 0x8700, 0x0c22, 0x2000 },
+  { 0x0700, 0x0c21, 0x0000 },
+  { 0x0700, 0x0c23, 0x0000 },
+  { 0x8700, 0x0c26, 0x2000 },
+  { 0x0700, 0x0c25, 0x0000 },
+  { 0x0700, 0x0c27, 0x0000 },
+  { 0x8700, 0x0c2d, 0x3000 },
+  { 0x8700, 0x0c2b, 0x2000 },
+  { 0x0700, 0x0c2a, 0x0000 },
+  { 0x0700, 0x0c2c, 0x0000 },
+  { 0x8700, 0x0c2f, 0x2000 },
+  { 0x0700, 0x0c2e, 0x0000 },
+  { 0x0700, 0x0c30, 0x0000 },
+  { 0x8700, 0x0d0e, 0x8000 },
+  { 0x8700, 0x0ca1, 0x7000 },
+  { 0x8d00, 0x0c6c, 0x6000 },
+  { 0x8c00, 0x0c47, 0x5000 },
+  { 0x8c00, 0x0c3e, 0x4000 },
+  { 0x8700, 0x0c36, 0x3000 },
+  { 0x8700, 0x0c33, 0x2000 },
+  { 0x0700, 0x0c32, 0x0000 },
+  { 0x0700, 0x0c35, 0x0000 },
+  { 0x8700, 0x0c38, 0x2000 },
+  { 0x0700, 0x0c37, 0x0000 },
+  { 0x0700, 0x0c39, 0x0000 },
+  { 0x8a00, 0x0c42, 0x3000 },
+  { 0x8c00, 0x0c40, 0x2000 },
+  { 0x0c00, 0x0c3f, 0x0000 },
+  { 0x0a00, 0x0c41, 0x0000 },
+  { 0x8a00, 0x0c44, 0x2000 },
+  { 0x0a00, 0x0c43, 0x0000 },
+  { 0x0c00, 0x0c46, 0x0000 },
+  { 0x8700, 0x0c60, 0x4000 },
+  { 0x8c00, 0x0c4c, 0x3000 },
+  { 0x8c00, 0x0c4a, 0x2000 },
+  { 0x0c00, 0x0c48, 0x0000 },
+  { 0x0c00, 0x0c4b, 0x0000 },
+  { 0x8c00, 0x0c55, 0x2000 },
+  { 0x0c00, 0x0c4d, 0x0000 },
+  { 0x0c00, 0x0c56, 0x0000 },
+  { 0x8d00, 0x0c68, 0x3000 },
+  { 0x8d00, 0x0c66, 0x2000 },
+  { 0x0700, 0x0c61, 0x0000 },
+  { 0x0d00, 0x0c67, 0x0000 },
+  { 0x8d00, 0x0c6a, 0x2000 },
+  { 0x0d00, 0x0c69, 0x0000 },
+  { 0x0d00, 0x0c6b, 0x0000 },
+  { 0x8700, 0x0c90, 0x5000 },
+  { 0x8700, 0x0c87, 0x4000 },
+  { 0x8a00, 0x0c82, 0x3000 },
+  { 0x8d00, 0x0c6e, 0x2000 },
+  { 0x0d00, 0x0c6d, 0x0000 },
+  { 0x0d00, 0x0c6f, 0x0000 },
+  { 0x8700, 0x0c85, 0x2000 },
+  { 0x0a00, 0x0c83, 0x0000 },
+  { 0x0700, 0x0c86, 0x0000 },
+  { 0x8700, 0x0c8b, 0x3000 },
+  { 0x8700, 0x0c89, 0x2000 },
+  { 0x0700, 0x0c88, 0x0000 },
+  { 0x0700, 0x0c8a, 0x0000 },
+  { 0x8700, 0x0c8e, 0x2000 },
+  { 0x0700, 0x0c8c, 0x0000 },
+  { 0x0700, 0x0c8f, 0x0000 },
+  { 0x8700, 0x0c99, 0x4000 },
+  { 0x8700, 0x0c95, 0x3000 },
+  { 0x8700, 0x0c93, 0x2000 },
+  { 0x0700, 0x0c92, 0x0000 },
+  { 0x0700, 0x0c94, 0x0000 },
+  { 0x8700, 0x0c97, 0x2000 },
+  { 0x0700, 0x0c96, 0x0000 },
+  { 0x0700, 0x0c98, 0x0000 },
+  { 0x8700, 0x0c9d, 0x3000 },
+  { 0x8700, 0x0c9b, 0x2000 },
+  { 0x0700, 0x0c9a, 0x0000 },
+  { 0x0700, 0x0c9c, 0x0000 },
+  { 0x8700, 0x0c9f, 0x2000 },
+  { 0x0700, 0x0c9e, 0x0000 },
+  { 0x0700, 0x0ca0, 0x0000 },
+  { 0x8c00, 0x0cc6, 0x6000 },
+  { 0x8700, 0x0cb2, 0x5000 },
+  { 0x8700, 0x0caa, 0x4000 },
+  { 0x8700, 0x0ca5, 0x3000 },
+  { 0x8700, 0x0ca3, 0x2000 },
+  { 0x0700, 0x0ca2, 0x0000 },
+  { 0x0700, 0x0ca4, 0x0000 },
+  { 0x8700, 0x0ca7, 0x2000 },
+  { 0x0700, 0x0ca6, 0x0000 },
+  { 0x0700, 0x0ca8, 0x0000 },
+  { 0x8700, 0x0cae, 0x3000 },
+  { 0x8700, 0x0cac, 0x2000 },
+  { 0x0700, 0x0cab, 0x0000 },
+  { 0x0700, 0x0cad, 0x0000 },
+  { 0x8700, 0x0cb0, 0x2000 },
+  { 0x0700, 0x0caf, 0x0000 },
+  { 0x0700, 0x0cb1, 0x0000 },
+  { 0x8700, 0x0cbd, 0x4000 },
+  { 0x8700, 0x0cb7, 0x3000 },
+  { 0x8700, 0x0cb5, 0x2000 },
+  { 0x0700, 0x0cb3, 0x0000 },
+  { 0x0700, 0x0cb6, 0x0000 },
+  { 0x8700, 0x0cb9, 0x2000 },
+  { 0x0700, 0x0cb8, 0x0000 },
+  { 0x0c00, 0x0cbc, 0x0000 },
+  { 0x8a00, 0x0cc1, 0x3000 },
+  { 0x8c00, 0x0cbf, 0x2000 },
+  { 0x0a00, 0x0cbe, 0x0000 },
+  { 0x0a00, 0x0cc0, 0x0000 },
+  { 0x8a00, 0x0cc3, 0x2000 },
+  { 0x0a00, 0x0cc2, 0x0000 },
+  { 0x0a00, 0x0cc4, 0x0000 },
+  { 0x8d00, 0x0cea, 0x5000 },
+  { 0x8a00, 0x0cd6, 0x4000 },
+  { 0x8a00, 0x0ccb, 0x3000 },
+  { 0x8a00, 0x0cc8, 0x2000 },
+  { 0x0a00, 0x0cc7, 0x0000 },
+  { 0x0a00, 0x0cca, 0x0000 },
+  { 0x8c00, 0x0ccd, 0x2000 },
+  { 0x0c00, 0x0ccc, 0x0000 },
+  { 0x0a00, 0x0cd5, 0x0000 },
+  { 0x8d00, 0x0ce6, 0x3000 },
+  { 0x8700, 0x0ce0, 0x2000 },
+  { 0x0700, 0x0cde, 0x0000 },
+  { 0x0700, 0x0ce1, 0x0000 },
+  { 0x8d00, 0x0ce8, 0x2000 },
+  { 0x0d00, 0x0ce7, 0x0000 },
+  { 0x0d00, 0x0ce9, 0x0000 },
+  { 0x8700, 0x0d05, 0x4000 },
+  { 0x8d00, 0x0cee, 0x3000 },
+  { 0x8d00, 0x0cec, 0x2000 },
+  { 0x0d00, 0x0ceb, 0x0000 },
+  { 0x0d00, 0x0ced, 0x0000 },
+  { 0x8a00, 0x0d02, 0x2000 },
+  { 0x0d00, 0x0cef, 0x0000 },
+  { 0x0a00, 0x0d03, 0x0000 },
+  { 0x8700, 0x0d09, 0x3000 },
+  { 0x8700, 0x0d07, 0x2000 },
+  { 0x0700, 0x0d06, 0x0000 },
+  { 0x0700, 0x0d08, 0x0000 },
+  { 0x8700, 0x0d0b, 0x2000 },
+  { 0x0700, 0x0d0a, 0x0000 },
+  { 0x0700, 0x0d0c, 0x0000 },
+  { 0x8d00, 0x0d6c, 0x7000 },
+  { 0x8700, 0x0d30, 0x6000 },
+  { 0x8700, 0x0d1f, 0x5000 },
+  { 0x8700, 0x0d17, 0x4000 },
+  { 0x8700, 0x0d13, 0x3000 },
+  { 0x8700, 0x0d10, 0x2000 },
+  { 0x0700, 0x0d0f, 0x0000 },
+  { 0x0700, 0x0d12, 0x0000 },
+  { 0x8700, 0x0d15, 0x2000 },
+  { 0x0700, 0x0d14, 0x0000 },
+  { 0x0700, 0x0d16, 0x0000 },
+  { 0x8700, 0x0d1b, 0x3000 },
+  { 0x8700, 0x0d19, 0x2000 },
+  { 0x0700, 0x0d18, 0x0000 },
+  { 0x0700, 0x0d1a, 0x0000 },
+  { 0x8700, 0x0d1d, 0x2000 },
+  { 0x0700, 0x0d1c, 0x0000 },
+  { 0x0700, 0x0d1e, 0x0000 },
+  { 0x8700, 0x0d27, 0x4000 },
+  { 0x8700, 0x0d23, 0x3000 },
+  { 0x8700, 0x0d21, 0x2000 },
+  { 0x0700, 0x0d20, 0x0000 },
+  { 0x0700, 0x0d22, 0x0000 },
+  { 0x8700, 0x0d25, 0x2000 },
+  { 0x0700, 0x0d24, 0x0000 },
+  { 0x0700, 0x0d26, 0x0000 },
+  { 0x8700, 0x0d2c, 0x3000 },
+  { 0x8700, 0x0d2a, 0x2000 },
+  { 0x0700, 0x0d28, 0x0000 },
+  { 0x0700, 0x0d2b, 0x0000 },
+  { 0x8700, 0x0d2e, 0x2000 },
+  { 0x0700, 0x0d2d, 0x0000 },
+  { 0x0700, 0x0d2f, 0x0000 },
+  { 0x8a00, 0x0d46, 0x5000 },
+  { 0x8700, 0x0d38, 0x4000 },
+  { 0x8700, 0x0d34, 0x3000 },
+  { 0x8700, 0x0d32, 0x2000 },
+  { 0x0700, 0x0d31, 0x0000 },
+  { 0x0700, 0x0d33, 0x0000 },
+  { 0x8700, 0x0d36, 0x2000 },
+  { 0x0700, 0x0d35, 0x0000 },
+  { 0x0700, 0x0d37, 0x0000 },
+  { 0x8a00, 0x0d40, 0x3000 },
+  { 0x8a00, 0x0d3e, 0x2000 },
+  { 0x0700, 0x0d39, 0x0000 },
+  { 0x0a00, 0x0d3f, 0x0000 },
+  { 0x8c00, 0x0d42, 0x2000 },
+  { 0x0c00, 0x0d41, 0x0000 },
+  { 0x0c00, 0x0d43, 0x0000 },
+  { 0x8700, 0x0d60, 0x4000 },
+  { 0x8a00, 0x0d4b, 0x3000 },
+  { 0x8a00, 0x0d48, 0x2000 },
+  { 0x0a00, 0x0d47, 0x0000 },
+  { 0x0a00, 0x0d4a, 0x0000 },
+  { 0x8c00, 0x0d4d, 0x2000 },
+  { 0x0a00, 0x0d4c, 0x0000 },
+  { 0x0a00, 0x0d57, 0x0000 },
+  { 0x8d00, 0x0d68, 0x3000 },
+  { 0x8d00, 0x0d66, 0x2000 },
+  { 0x0700, 0x0d61, 0x0000 },
+  { 0x0d00, 0x0d67, 0x0000 },
+  { 0x8d00, 0x0d6a, 0x2000 },
+  { 0x0d00, 0x0d69, 0x0000 },
+  { 0x0d00, 0x0d6b, 0x0000 },
+  { 0x8700, 0x0da2, 0x6000 },
+  { 0x8700, 0x0d8f, 0x5000 },
+  { 0x8700, 0x0d87, 0x4000 },
+  { 0x8a00, 0x0d82, 0x3000 },
+  { 0x8d00, 0x0d6e, 0x2000 },
+  { 0x0d00, 0x0d6d, 0x0000 },
+  { 0x0d00, 0x0d6f, 0x0000 },
+  { 0x8700, 0x0d85, 0x2000 },
+  { 0x0a00, 0x0d83, 0x0000 },
+  { 0x0700, 0x0d86, 0x0000 },
+  { 0x8700, 0x0d8b, 0x3000 },
+  { 0x8700, 0x0d89, 0x2000 },
+  { 0x0700, 0x0d88, 0x0000 },
+  { 0x0700, 0x0d8a, 0x0000 },
+  { 0x8700, 0x0d8d, 0x2000 },
+  { 0x0700, 0x0d8c, 0x0000 },
+  { 0x0700, 0x0d8e, 0x0000 },
+  { 0x8700, 0x0d9a, 0x4000 },
+  { 0x8700, 0x0d93, 0x3000 },
+  { 0x8700, 0x0d91, 0x2000 },
+  { 0x0700, 0x0d90, 0x0000 },
+  { 0x0700, 0x0d92, 0x0000 },
+  { 0x8700, 0x0d95, 0x2000 },
+  { 0x0700, 0x0d94, 0x0000 },
+  { 0x0700, 0x0d96, 0x0000 },
+  { 0x8700, 0x0d9e, 0x3000 },
+  { 0x8700, 0x0d9c, 0x2000 },
+  { 0x0700, 0x0d9b, 0x0000 },
+  { 0x0700, 0x0d9d, 0x0000 },
+  { 0x8700, 0x0da0, 0x2000 },
+  { 0x0700, 0x0d9f, 0x0000 },
+  { 0x0700, 0x0da1, 0x0000 },
+  { 0x8700, 0x0db3, 0x5000 },
+  { 0x8700, 0x0daa, 0x4000 },
+  { 0x8700, 0x0da6, 0x3000 },
+  { 0x8700, 0x0da4, 0x2000 },
+  { 0x0700, 0x0da3, 0x0000 },
+  { 0x0700, 0x0da5, 0x0000 },
+  { 0x8700, 0x0da8, 0x2000 },
+  { 0x0700, 0x0da7, 0x0000 },
+  { 0x0700, 0x0da9, 0x0000 },
+  { 0x8700, 0x0dae, 0x3000 },
+  { 0x8700, 0x0dac, 0x2000 },
+  { 0x0700, 0x0dab, 0x0000 },
+  { 0x0700, 0x0dad, 0x0000 },
+  { 0x8700, 0x0db0, 0x2000 },
+  { 0x0700, 0x0daf, 0x0000 },
+  { 0x0700, 0x0db1, 0x0000 },
+  { 0x8700, 0x0dbb, 0x4000 },
+  { 0x8700, 0x0db7, 0x3000 },
+  { 0x8700, 0x0db5, 0x2000 },
+  { 0x0700, 0x0db4, 0x0000 },
+  { 0x0700, 0x0db6, 0x0000 },
+  { 0x8700, 0x0db9, 0x2000 },
+  { 0x0700, 0x0db8, 0x0000 },
+  { 0x0700, 0x0dba, 0x0000 },
+  { 0x8700, 0x0dc2, 0x3000 },
+  { 0x8700, 0x0dc0, 0x2000 },
+  { 0x0700, 0x0dbd, 0x0000 },
+  { 0x0700, 0x0dc1, 0x0000 },
+  { 0x8700, 0x0dc4, 0x2000 },
+  { 0x0700, 0x0dc3, 0x0000 },
+  { 0x0700, 0x0dc5, 0x0000 },
+  { 0x8700, 0x0f55, 0x9000 },
+  { 0x8700, 0x0ea5, 0x8000 },
+  { 0x8700, 0x0e2d, 0x7000 },
+  { 0x8700, 0x0e0d, 0x6000 },
+  { 0x8a00, 0x0ddf, 0x5000 },
+  { 0x8c00, 0x0dd6, 0x4000 },
+  { 0x8a00, 0x0dd1, 0x3000 },
+  { 0x8a00, 0x0dcf, 0x2000 },
+  { 0x0c00, 0x0dca, 0x0000 },
+  { 0x0a00, 0x0dd0, 0x0000 },
+  { 0x8c00, 0x0dd3, 0x2000 },
+  { 0x0c00, 0x0dd2, 0x0000 },
+  { 0x0c00, 0x0dd4, 0x0000 },
+  { 0x8a00, 0x0ddb, 0x3000 },
+  { 0x8a00, 0x0dd9, 0x2000 },
+  { 0x0a00, 0x0dd8, 0x0000 },
+  { 0x0a00, 0x0dda, 0x0000 },
+  { 0x8a00, 0x0ddd, 0x2000 },
+  { 0x0a00, 0x0ddc, 0x0000 },
+  { 0x0a00, 0x0dde, 0x0000 },
+  { 0x8700, 0x0e05, 0x4000 },
+  { 0x8700, 0x0e01, 0x3000 },
+  { 0x8a00, 0x0df3, 0x2000 },
+  { 0x0a00, 0x0df2, 0x0000 },
+  { 0x1500, 0x0df4, 0x0000 },
+  { 0x8700, 0x0e03, 0x2000 },
+  { 0x0700, 0x0e02, 0x0000 },
+  { 0x0700, 0x0e04, 0x0000 },
+  { 0x8700, 0x0e09, 0x3000 },
+  { 0x8700, 0x0e07, 0x2000 },
+  { 0x0700, 0x0e06, 0x0000 },
+  { 0x0700, 0x0e08, 0x0000 },
+  { 0x8700, 0x0e0b, 0x2000 },
+  { 0x0700, 0x0e0a, 0x0000 },
+  { 0x0700, 0x0e0c, 0x0000 },
+  { 0x8700, 0x0e1d, 0x5000 },
+  { 0x8700, 0x0e15, 0x4000 },
+  { 0x8700, 0x0e11, 0x3000 },
+  { 0x8700, 0x0e0f, 0x2000 },
+  { 0x0700, 0x0e0e, 0x0000 },
+  { 0x0700, 0x0e10, 0x0000 },
+  { 0x8700, 0x0e13, 0x2000 },
+  { 0x0700, 0x0e12, 0x0000 },
+  { 0x0700, 0x0e14, 0x0000 },
+  { 0x8700, 0x0e19, 0x3000 },
+  { 0x8700, 0x0e17, 0x2000 },
+  { 0x0700, 0x0e16, 0x0000 },
+  { 0x0700, 0x0e18, 0x0000 },
+  { 0x8700, 0x0e1b, 0x2000 },
+  { 0x0700, 0x0e1a, 0x0000 },
+  { 0x0700, 0x0e1c, 0x0000 },
+  { 0x8700, 0x0e25, 0x4000 },
+  { 0x8700, 0x0e21, 0x3000 },
+  { 0x8700, 0x0e1f, 0x2000 },
+  { 0x0700, 0x0e1e, 0x0000 },
+  { 0x0700, 0x0e20, 0x0000 },
+  { 0x8700, 0x0e23, 0x2000 },
+  { 0x0700, 0x0e22, 0x0000 },
+  { 0x0700, 0x0e24, 0x0000 },
+  { 0x8700, 0x0e29, 0x3000 },
+  { 0x8700, 0x0e27, 0x2000 },
+  { 0x0700, 0x0e26, 0x0000 },
+  { 0x0700, 0x0e28, 0x0000 },
+  { 0x8700, 0x0e2b, 0x2000 },
+  { 0x0700, 0x0e2a, 0x0000 },
+  { 0x0700, 0x0e2c, 0x0000 },
+  { 0x8d00, 0x0e51, 0x6000 },
+  { 0x8700, 0x0e41, 0x5000 },
+  { 0x8c00, 0x0e35, 0x4000 },
+  { 0x8c00, 0x0e31, 0x3000 },
+  { 0x8700, 0x0e2f, 0x2000 },
+  { 0x0700, 0x0e2e, 0x0000 },
+  { 0x0700, 0x0e30, 0x0000 },
+  { 0x8700, 0x0e33, 0x2000 },
+  { 0x0700, 0x0e32, 0x0000 },
+  { 0x0c00, 0x0e34, 0x0000 },
+  { 0x8c00, 0x0e39, 0x3000 },
+  { 0x8c00, 0x0e37, 0x2000 },
+  { 0x0c00, 0x0e36, 0x0000 },
+  { 0x0c00, 0x0e38, 0x0000 },
+  { 0x9700, 0x0e3f, 0x2000 },
+  { 0x0c00, 0x0e3a, 0x0000 },
+  { 0x0700, 0x0e40, 0x0000 },
+  { 0x8c00, 0x0e49, 0x4000 },
+  { 0x8700, 0x0e45, 0x3000 },
+  { 0x8700, 0x0e43, 0x2000 },
+  { 0x0700, 0x0e42, 0x0000 },
+  { 0x0700, 0x0e44, 0x0000 },
+  { 0x8c00, 0x0e47, 0x2000 },
+  { 0x0600, 0x0e46, 0x0000 },
+  { 0x0c00, 0x0e48, 0x0000 },
+  { 0x8c00, 0x0e4d, 0x3000 },
+  { 0x8c00, 0x0e4b, 0x2000 },
+  { 0x0c00, 0x0e4a, 0x0000 },
+  { 0x0c00, 0x0e4c, 0x0000 },
+  { 0x9500, 0x0e4f, 0x2000 },
+  { 0x0c00, 0x0e4e, 0x0000 },
+  { 0x0d00, 0x0e50, 0x0000 },
+  { 0x8700, 0x0e8a, 0x5000 },
+  { 0x8d00, 0x0e59, 0x4000 },
+  { 0x8d00, 0x0e55, 0x3000 },
+  { 0x8d00, 0x0e53, 0x2000 },
+  { 0x0d00, 0x0e52, 0x0000 },
+  { 0x0d00, 0x0e54, 0x0000 },
+  { 0x8d00, 0x0e57, 0x2000 },
+  { 0x0d00, 0x0e56, 0x0000 },
+  { 0x0d00, 0x0e58, 0x0000 },
+  { 0x8700, 0x0e82, 0x3000 },
+  { 0x9500, 0x0e5b, 0x2000 },
+  { 0x1500, 0x0e5a, 0x0000 },
+  { 0x0700, 0x0e81, 0x0000 },
+  { 0x8700, 0x0e87, 0x2000 },
+  { 0x0700, 0x0e84, 0x0000 },
+  { 0x0700, 0x0e88, 0x0000 },
+  { 0x8700, 0x0e9b, 0x4000 },
+  { 0x8700, 0x0e96, 0x3000 },
+  { 0x8700, 0x0e94, 0x2000 },
+  { 0x0700, 0x0e8d, 0x0000 },
+  { 0x0700, 0x0e95, 0x0000 },
+  { 0x8700, 0x0e99, 0x2000 },
+  { 0x0700, 0x0e97, 0x0000 },
+  { 0x0700, 0x0e9a, 0x0000 },
+  { 0x8700, 0x0e9f, 0x3000 },
+  { 0x8700, 0x0e9d, 0x2000 },
+  { 0x0700, 0x0e9c, 0x0000 },
+  { 0x0700, 0x0e9e, 0x0000 },
+  { 0x8700, 0x0ea2, 0x2000 },
+  { 0x0700, 0x0ea1, 0x0000 },
+  { 0x0700, 0x0ea3, 0x0000 },
+  { 0x9a00, 0x0f14, 0x7000 },
+  { 0x8d00, 0x0ed0, 0x6000 },
+  { 0x8c00, 0x0eb9, 0x5000 },
+  { 0x8c00, 0x0eb1, 0x4000 },
+  { 0x8700, 0x0ead, 0x3000 },
+  { 0x8700, 0x0eaa, 0x2000 },
+  { 0x0700, 0x0ea7, 0x0000 },
+  { 0x0700, 0x0eab, 0x0000 },
+  { 0x8700, 0x0eaf, 0x2000 },
+  { 0x0700, 0x0eae, 0x0000 },
+  { 0x0700, 0x0eb0, 0x0000 },
+  { 0x8c00, 0x0eb5, 0x3000 },
+  { 0x8700, 0x0eb3, 0x2000 },
+  { 0x0700, 0x0eb2, 0x0000 },
+  { 0x0c00, 0x0eb4, 0x0000 },
+  { 0x8c00, 0x0eb7, 0x2000 },
+  { 0x0c00, 0x0eb6, 0x0000 },
+  { 0x0c00, 0x0eb8, 0x0000 },
+  { 0x8700, 0x0ec4, 0x4000 },
+  { 0x8700, 0x0ec0, 0x3000 },
+  { 0x8c00, 0x0ebc, 0x2000 },
+  { 0x0c00, 0x0ebb, 0x0000 },
+  { 0x0700, 0x0ebd, 0x0000 },
+  { 0x8700, 0x0ec2, 0x2000 },
+  { 0x0700, 0x0ec1, 0x0000 },
+  { 0x0700, 0x0ec3, 0x0000 },
+  { 0x8c00, 0x0eca, 0x3000 },
+  { 0x8c00, 0x0ec8, 0x2000 },
+  { 0x0600, 0x0ec6, 0x0000 },
+  { 0x0c00, 0x0ec9, 0x0000 },
+  { 0x8c00, 0x0ecc, 0x2000 },
+  { 0x0c00, 0x0ecb, 0x0000 },
+  { 0x0c00, 0x0ecd, 0x0000 },
+  { 0x9500, 0x0f04, 0x5000 },
+  { 0x8d00, 0x0ed8, 0x4000 },
+  { 0x8d00, 0x0ed4, 0x3000 },
+  { 0x8d00, 0x0ed2, 0x2000 },
+  { 0x0d00, 0x0ed1, 0x0000 },
+  { 0x0d00, 0x0ed3, 0x0000 },
+  { 0x8d00, 0x0ed6, 0x2000 },
+  { 0x0d00, 0x0ed5, 0x0000 },
+  { 0x0d00, 0x0ed7, 0x0000 },
+  { 0x8700, 0x0f00, 0x3000 },
+  { 0x8700, 0x0edc, 0x2000 },
+  { 0x0d00, 0x0ed9, 0x0000 },
+  { 0x0700, 0x0edd, 0x0000 },
+  { 0x9a00, 0x0f02, 0x2000 },
+  { 0x1a00, 0x0f01, 0x0000 },
+  { 0x1a00, 0x0f03, 0x0000 },
+  { 0x9500, 0x0f0c, 0x4000 },
+  { 0x9500, 0x0f08, 0x3000 },
+  { 0x9500, 0x0f06, 0x2000 },
+  { 0x1500, 0x0f05, 0x0000 },
+  { 0x1500, 0x0f07, 0x0000 },
+  { 0x9500, 0x0f0a, 0x2000 },
+  { 0x1500, 0x0f09, 0x0000 },
+  { 0x1500, 0x0f0b, 0x0000 },
+  { 0x9500, 0x0f10, 0x3000 },
+  { 0x9500, 0x0f0e, 0x2000 },
+  { 0x1500, 0x0f0d, 0x0000 },
+  { 0x1500, 0x0f0f, 0x0000 },
+  { 0x9500, 0x0f12, 0x2000 },
+  { 0x1500, 0x0f11, 0x0000 },
+  { 0x1a00, 0x0f13, 0x0000 },
+  { 0x9a00, 0x0f34, 0x6000 },
+  { 0x8d00, 0x0f24, 0x5000 },
+  { 0x9a00, 0x0f1c, 0x4000 },
+  { 0x8c00, 0x0f18, 0x3000 },
+  { 0x9a00, 0x0f16, 0x2000 },
+  { 0x1a00, 0x0f15, 0x0000 },
+  { 0x1a00, 0x0f17, 0x0000 },
+  { 0x9a00, 0x0f1a, 0x2000 },
+  { 0x0c00, 0x0f19, 0x0000 },
+  { 0x1a00, 0x0f1b, 0x0000 },
+  { 0x8d00, 0x0f20, 0x3000 },
+  { 0x9a00, 0x0f1e, 0x2000 },
+  { 0x1a00, 0x0f1d, 0x0000 },
+  { 0x1a00, 0x0f1f, 0x0000 },
+  { 0x8d00, 0x0f22, 0x2000 },
+  { 0x0d00, 0x0f21, 0x0000 },
+  { 0x0d00, 0x0f23, 0x0000 },
+  { 0x8f00, 0x0f2c, 0x4000 },
+  { 0x8d00, 0x0f28, 0x3000 },
+  { 0x8d00, 0x0f26, 0x2000 },
+  { 0x0d00, 0x0f25, 0x0000 },
+  { 0x0d00, 0x0f27, 0x0000 },
+  { 0x8f00, 0x0f2a, 0x2000 },
+  { 0x0d00, 0x0f29, 0x0000 },
+  { 0x0f00, 0x0f2b, 0x0000 },
+  { 0x8f00, 0x0f30, 0x3000 },
+  { 0x8f00, 0x0f2e, 0x2000 },
+  { 0x0f00, 0x0f2d, 0x0000 },
+  { 0x0f00, 0x0f2f, 0x0000 },
+  { 0x8f00, 0x0f32, 0x2000 },
+  { 0x0f00, 0x0f31, 0x0000 },
+  { 0x0f00, 0x0f33, 0x0000 },
+  { 0x8700, 0x0f44, 0x5000 },
+  { 0x9600, 0x0f3c, 0x4000 },
+  { 0x9a00, 0x0f38, 0x3000 },
+  { 0x9a00, 0x0f36, 0x2000 },
+  { 0x0c00, 0x0f35, 0x0000 },
+  { 0x0c00, 0x0f37, 0x0000 },
+  { 0x9600, 0x0f3a, 0x2000 },
+  { 0x0c00, 0x0f39, 0x0000 },
+  { 0x1200, 0x0f3b, 0x0000 },
+  { 0x8700, 0x0f40, 0x3000 },
+  { 0x8a00, 0x0f3e, 0x2000 },
+  { 0x1200, 0x0f3d, 0x0000 },
+  { 0x0a00, 0x0f3f, 0x0000 },
+  { 0x8700, 0x0f42, 0x2000 },
+  { 0x0700, 0x0f41, 0x0000 },
+  { 0x0700, 0x0f43, 0x0000 },
+  { 0x8700, 0x0f4d, 0x4000 },
+  { 0x8700, 0x0f49, 0x3000 },
+  { 0x8700, 0x0f46, 0x2000 },
+  { 0x0700, 0x0f45, 0x0000 },
+  { 0x0700, 0x0f47, 0x0000 },
+  { 0x8700, 0x0f4b, 0x2000 },
+  { 0x0700, 0x0f4a, 0x0000 },
+  { 0x0700, 0x0f4c, 0x0000 },
+  { 0x8700, 0x0f51, 0x3000 },
+  { 0x8700, 0x0f4f, 0x2000 },
+  { 0x0700, 0x0f4e, 0x0000 },
+  { 0x0700, 0x0f50, 0x0000 },
+  { 0x8700, 0x0f53, 0x2000 },
+  { 0x0700, 0x0f52, 0x0000 },
+  { 0x0700, 0x0f54, 0x0000 },
+  { 0x8700, 0x1013, 0x8000 },
+  { 0x8c00, 0x0fa0, 0x7000 },
+  { 0x8c00, 0x0f7b, 0x6000 },
+  { 0x8700, 0x0f65, 0x5000 },
+  { 0x8700, 0x0f5d, 0x4000 },
+  { 0x8700, 0x0f59, 0x3000 },
+  { 0x8700, 0x0f57, 0x2000 },
+  { 0x0700, 0x0f56, 0x0000 },
+  { 0x0700, 0x0f58, 0x0000 },
+  { 0x8700, 0x0f5b, 0x2000 },
+  { 0x0700, 0x0f5a, 0x0000 },
+  { 0x0700, 0x0f5c, 0x0000 },
+  { 0x8700, 0x0f61, 0x3000 },
+  { 0x8700, 0x0f5f, 0x2000 },
+  { 0x0700, 0x0f5e, 0x0000 },
+  { 0x0700, 0x0f60, 0x0000 },
+  { 0x8700, 0x0f63, 0x2000 },
+  { 0x0700, 0x0f62, 0x0000 },
+  { 0x0700, 0x0f64, 0x0000 },
+  { 0x8c00, 0x0f73, 0x4000 },
+  { 0x8700, 0x0f69, 0x3000 },
+  { 0x8700, 0x0f67, 0x2000 },
+  { 0x0700, 0x0f66, 0x0000 },
+  { 0x0700, 0x0f68, 0x0000 },
+  { 0x8c00, 0x0f71, 0x2000 },
+  { 0x0700, 0x0f6a, 0x0000 },
+  { 0x0c00, 0x0f72, 0x0000 },
+  { 0x8c00, 0x0f77, 0x3000 },
+  { 0x8c00, 0x0f75, 0x2000 },
+  { 0x0c00, 0x0f74, 0x0000 },
+  { 0x0c00, 0x0f76, 0x0000 },
+  { 0x8c00, 0x0f79, 0x2000 },
+  { 0x0c00, 0x0f78, 0x0000 },
+  { 0x0c00, 0x0f7a, 0x0000 },
+  { 0x8700, 0x0f8b, 0x5000 },
+  { 0x8c00, 0x0f83, 0x4000 },
+  { 0x8a00, 0x0f7f, 0x3000 },
+  { 0x8c00, 0x0f7d, 0x2000 },
+  { 0x0c00, 0x0f7c, 0x0000 },
+  { 0x0c00, 0x0f7e, 0x0000 },
+  { 0x8c00, 0x0f81, 0x2000 },
+  { 0x0c00, 0x0f80, 0x0000 },
+  { 0x0c00, 0x0f82, 0x0000 },
+  { 0x8c00, 0x0f87, 0x3000 },
+  { 0x9500, 0x0f85, 0x2000 },
+  { 0x0c00, 0x0f84, 0x0000 },
+  { 0x0c00, 0x0f86, 0x0000 },
+  { 0x8700, 0x0f89, 0x2000 },
+  { 0x0700, 0x0f88, 0x0000 },
+  { 0x0700, 0x0f8a, 0x0000 },
+  { 0x8c00, 0x0f97, 0x4000 },
+  { 0x8c00, 0x0f93, 0x3000 },
+  { 0x8c00, 0x0f91, 0x2000 },
+  { 0x0c00, 0x0f90, 0x0000 },
+  { 0x0c00, 0x0f92, 0x0000 },
+  { 0x8c00, 0x0f95, 0x2000 },
+  { 0x0c00, 0x0f94, 0x0000 },
+  { 0x0c00, 0x0f96, 0x0000 },
+  { 0x8c00, 0x0f9c, 0x3000 },
+  { 0x8c00, 0x0f9a, 0x2000 },
+  { 0x0c00, 0x0f99, 0x0000 },
+  { 0x0c00, 0x0f9b, 0x0000 },
+  { 0x8c00, 0x0f9e, 0x2000 },
+  { 0x0c00, 0x0f9d, 0x0000 },
+  { 0x0c00, 0x0f9f, 0x0000 },
+  { 0x9a00, 0x0fc1, 0x6000 },
+  { 0x8c00, 0x0fb0, 0x5000 },
+  { 0x8c00, 0x0fa8, 0x4000 },
+  { 0x8c00, 0x0fa4, 0x3000 },
+  { 0x8c00, 0x0fa2, 0x2000 },
+  { 0x0c00, 0x0fa1, 0x0000 },
+  { 0x0c00, 0x0fa3, 0x0000 },
+  { 0x8c00, 0x0fa6, 0x2000 },
+  { 0x0c00, 0x0fa5, 0x0000 },
+  { 0x0c00, 0x0fa7, 0x0000 },
+  { 0x8c00, 0x0fac, 0x3000 },
+  { 0x8c00, 0x0faa, 0x2000 },
+  { 0x0c00, 0x0fa9, 0x0000 },
+  { 0x0c00, 0x0fab, 0x0000 },
+  { 0x8c00, 0x0fae, 0x2000 },
+  { 0x0c00, 0x0fad, 0x0000 },
+  { 0x0c00, 0x0faf, 0x0000 },
+  { 0x8c00, 0x0fb8, 0x4000 },
+  { 0x8c00, 0x0fb4, 0x3000 },
+  { 0x8c00, 0x0fb2, 0x2000 },
+  { 0x0c00, 0x0fb1, 0x0000 },
+  { 0x0c00, 0x0fb3, 0x0000 },
+  { 0x8c00, 0x0fb6, 0x2000 },
+  { 0x0c00, 0x0fb5, 0x0000 },
+  { 0x0c00, 0x0fb7, 0x0000 },
+  { 0x8c00, 0x0fbc, 0x3000 },
+  { 0x8c00, 0x0fba, 0x2000 },
+  { 0x0c00, 0x0fb9, 0x0000 },
+  { 0x0c00, 0x0fbb, 0x0000 },
+  { 0x9a00, 0x0fbf, 0x2000 },
+  { 0x1a00, 0x0fbe, 0x0000 },
+  { 0x1a00, 0x0fc0, 0x0000 },
+  { 0x8700, 0x1003, 0x5000 },
+  { 0x9a00, 0x0fc9, 0x4000 },
+  { 0x9a00, 0x0fc5, 0x3000 },
+  { 0x9a00, 0x0fc3, 0x2000 },
+  { 0x1a00, 0x0fc2, 0x0000 },
+  { 0x1a00, 0x0fc4, 0x0000 },
+  { 0x9a00, 0x0fc7, 0x2000 },
+  { 0x0c00, 0x0fc6, 0x0000 },
+  { 0x1a00, 0x0fc8, 0x0000 },
+  { 0x9a00, 0x0fcf, 0x3000 },
+  { 0x9a00, 0x0fcb, 0x2000 },
+  { 0x1a00, 0x0fca, 0x0000 },
+  { 0x1a00, 0x0fcc, 0x0000 },
+  { 0x8700, 0x1001, 0x2000 },
+  { 0x0700, 0x1000, 0x0000 },
+  { 0x0700, 0x1002, 0x0000 },
+  { 0x8700, 0x100b, 0x4000 },
+  { 0x8700, 0x1007, 0x3000 },
+  { 0x8700, 0x1005, 0x2000 },
+  { 0x0700, 0x1004, 0x0000 },
+  { 0x0700, 0x1006, 0x0000 },
+  { 0x8700, 0x1009, 0x2000 },
+  { 0x0700, 0x1008, 0x0000 },
+  { 0x0700, 0x100a, 0x0000 },
+  { 0x8700, 0x100f, 0x3000 },
+  { 0x8700, 0x100d, 0x2000 },
+  { 0x0700, 0x100c, 0x0000 },
+  { 0x0700, 0x100e, 0x0000 },
+  { 0x8700, 0x1011, 0x2000 },
+  { 0x0700, 0x1010, 0x0000 },
+  { 0x0700, 0x1012, 0x0000 },
+  { 0x8900, 0x10a5, 0x7000 },
+  { 0x8c00, 0x1039, 0x6000 },
+  { 0x8700, 0x1024, 0x5000 },
+  { 0x8700, 0x101b, 0x4000 },
+  { 0x8700, 0x1017, 0x3000 },
+  { 0x8700, 0x1015, 0x2000 },
+  { 0x0700, 0x1014, 0x0000 },
+  { 0x0700, 0x1016, 0x0000 },
+  { 0x8700, 0x1019, 0x2000 },
+  { 0x0700, 0x1018, 0x0000 },
+  { 0x0700, 0x101a, 0x0000 },
+  { 0x8700, 0x101f, 0x3000 },
+  { 0x8700, 0x101d, 0x2000 },
+  { 0x0700, 0x101c, 0x0000 },
+  { 0x0700, 0x101e, 0x0000 },
+  { 0x8700, 0x1021, 0x2000 },
+  { 0x0700, 0x1020, 0x0000 },
+  { 0x0700, 0x1023, 0x0000 },
+  { 0x8c00, 0x102e, 0x4000 },
+  { 0x8700, 0x1029, 0x3000 },
+  { 0x8700, 0x1026, 0x2000 },
+  { 0x0700, 0x1025, 0x0000 },
+  { 0x0700, 0x1027, 0x0000 },
+  { 0x8a00, 0x102c, 0x2000 },
+  { 0x0700, 0x102a, 0x0000 },
+  { 0x0c00, 0x102d, 0x0000 },
+  { 0x8c00, 0x1032, 0x3000 },
+  { 0x8c00, 0x1030, 0x2000 },
+  { 0x0c00, 0x102f, 0x0000 },
+  { 0x0a00, 0x1031, 0x0000 },
+  { 0x8c00, 0x1037, 0x2000 },
+  { 0x0c00, 0x1036, 0x0000 },
+  { 0x0a00, 0x1038, 0x0000 },
+  { 0x9500, 0x104f, 0x5000 },
+  { 0x8d00, 0x1047, 0x4000 },
+  { 0x8d00, 0x1043, 0x3000 },
+  { 0x8d00, 0x1041, 0x2000 },
+  { 0x0d00, 0x1040, 0x0000 },
+  { 0x0d00, 0x1042, 0x0000 },
+  { 0x8d00, 0x1045, 0x2000 },
+  { 0x0d00, 0x1044, 0x0000 },
+  { 0x0d00, 0x1046, 0x0000 },
+  { 0x9500, 0x104b, 0x3000 },
+  { 0x8d00, 0x1049, 0x2000 },
+  { 0x0d00, 0x1048, 0x0000 },
+  { 0x1500, 0x104a, 0x0000 },
+  { 0x9500, 0x104d, 0x2000 },
+  { 0x1500, 0x104c, 0x0000 },
+  { 0x1500, 0x104e, 0x0000 },
+  { 0x8a00, 0x1057, 0x4000 },
+  { 0x8700, 0x1053, 0x3000 },
+  { 0x8700, 0x1051, 0x2000 },
+  { 0x0700, 0x1050, 0x0000 },
+  { 0x0700, 0x1052, 0x0000 },
+  { 0x8700, 0x1055, 0x2000 },
+  { 0x0700, 0x1054, 0x0000 },
+  { 0x0a00, 0x1056, 0x0000 },
+  { 0x8900, 0x10a1, 0x3000 },
+  { 0x8c00, 0x1059, 0x2000 },
+  { 0x0c00, 0x1058, 0x0000 },
+  { 0x0900, 0x10a0, 0x0000 },
+  { 0x8900, 0x10a3, 0x2000 },
+  { 0x0900, 0x10a2, 0x0000 },
+  { 0x0900, 0x10a4, 0x0000 },
+  { 0x8900, 0x10c5, 0x6000 },
+  { 0x8900, 0x10b5, 0x5000 },
+  { 0x8900, 0x10ad, 0x4000 },
+  { 0x8900, 0x10a9, 0x3000 },
+  { 0x8900, 0x10a7, 0x2000 },
+  { 0x0900, 0x10a6, 0x0000 },
+  { 0x0900, 0x10a8, 0x0000 },
+  { 0x8900, 0x10ab, 0x2000 },
+  { 0x0900, 0x10aa, 0x0000 },
+  { 0x0900, 0x10ac, 0x0000 },
+  { 0x8900, 0x10b1, 0x3000 },
+  { 0x8900, 0x10af, 0x2000 },
+  { 0x0900, 0x10ae, 0x0000 },
+  { 0x0900, 0x10b0, 0x0000 },
+  { 0x8900, 0x10b3, 0x2000 },
+  { 0x0900, 0x10b2, 0x0000 },
+  { 0x0900, 0x10b4, 0x0000 },
+  { 0x8900, 0x10bd, 0x4000 },
+  { 0x8900, 0x10b9, 0x3000 },
+  { 0x8900, 0x10b7, 0x2000 },
+  { 0x0900, 0x10b6, 0x0000 },
+  { 0x0900, 0x10b8, 0x0000 },
+  { 0x8900, 0x10bb, 0x2000 },
+  { 0x0900, 0x10ba, 0x0000 },
+  { 0x0900, 0x10bc, 0x0000 },
+  { 0x8900, 0x10c1, 0x3000 },
+  { 0x8900, 0x10bf, 0x2000 },
+  { 0x0900, 0x10be, 0x0000 },
+  { 0x0900, 0x10c0, 0x0000 },
+  { 0x8900, 0x10c3, 0x2000 },
+  { 0x0900, 0x10c2, 0x0000 },
+  { 0x0900, 0x10c4, 0x0000 },
+  { 0x8700, 0x10df, 0x5000 },
+  { 0x8700, 0x10d7, 0x4000 },
+  { 0x8700, 0x10d3, 0x3000 },
+  { 0x8700, 0x10d1, 0x2000 },
+  { 0x0700, 0x10d0, 0x0000 },
+  { 0x0700, 0x10d2, 0x0000 },
+  { 0x8700, 0x10d5, 0x2000 },
+  { 0x0700, 0x10d4, 0x0000 },
+  { 0x0700, 0x10d6, 0x0000 },
+  { 0x8700, 0x10db, 0x3000 },
+  { 0x8700, 0x10d9, 0x2000 },
+  { 0x0700, 0x10d8, 0x0000 },
+  { 0x0700, 0x10da, 0x0000 },
+  { 0x8700, 0x10dd, 0x2000 },
+  { 0x0700, 0x10dc, 0x0000 },
+  { 0x0700, 0x10de, 0x0000 },
+  { 0x8700, 0x10e7, 0x4000 },
+  { 0x8700, 0x10e3, 0x3000 },
+  { 0x8700, 0x10e1, 0x2000 },
+  { 0x0700, 0x10e0, 0x0000 },
+  { 0x0700, 0x10e2, 0x0000 },
+  { 0x8700, 0x10e5, 0x2000 },
+  { 0x0700, 0x10e4, 0x0000 },
+  { 0x0700, 0x10e6, 0x0000 },
+  { 0x8700, 0x10eb, 0x3000 },
+  { 0x8700, 0x10e9, 0x2000 },
+  { 0x0700, 0x10e8, 0x0000 },
+  { 0x0700, 0x10ea, 0x0000 },
+  { 0x8700, 0x10ed, 0x2000 },
+  { 0x0700, 0x10ec, 0x0000 },
+  { 0x0700, 0x10ee, 0x0000 },
+  { 0x8700, 0x1322, 0xa000 },
+  { 0x8700, 0x1205, 0x9000 },
+  { 0x8700, 0x117a, 0x8000 },
+  { 0x8700, 0x1135, 0x7000 },
+  { 0x8700, 0x1115, 0x6000 },
+  { 0x8700, 0x1105, 0x5000 },
+  { 0x8700, 0x10f7, 0x4000 },
+  { 0x8700, 0x10f3, 0x3000 },
+  { 0x8700, 0x10f1, 0x2000 },
+  { 0x0700, 0x10f0, 0x0000 },
+  { 0x0700, 0x10f2, 0x0000 },
+  { 0x8700, 0x10f5, 0x2000 },
+  { 0x0700, 0x10f4, 0x0000 },
+  { 0x0700, 0x10f6, 0x0000 },
+  { 0x8700, 0x1101, 0x3000 },
+  { 0x9500, 0x10fb, 0x2000 },
+  { 0x0700, 0x10f8, 0x0000 },
+  { 0x0700, 0x1100, 0x0000 },
+  { 0x8700, 0x1103, 0x2000 },
+  { 0x0700, 0x1102, 0x0000 },
+  { 0x0700, 0x1104, 0x0000 },
+  { 0x8700, 0x110d, 0x4000 },
+  { 0x8700, 0x1109, 0x3000 },
+  { 0x8700, 0x1107, 0x2000 },
+  { 0x0700, 0x1106, 0x0000 },
+  { 0x0700, 0x1108, 0x0000 },
+  { 0x8700, 0x110b, 0x2000 },
+  { 0x0700, 0x110a, 0x0000 },
+  { 0x0700, 0x110c, 0x0000 },
+  { 0x8700, 0x1111, 0x3000 },
+  { 0x8700, 0x110f, 0x2000 },
+  { 0x0700, 0x110e, 0x0000 },
+  { 0x0700, 0x1110, 0x0000 },
+  { 0x8700, 0x1113, 0x2000 },
+  { 0x0700, 0x1112, 0x0000 },
+  { 0x0700, 0x1114, 0x0000 },
+  { 0x8700, 0x1125, 0x5000 },
+  { 0x8700, 0x111d, 0x4000 },
+  { 0x8700, 0x1119, 0x3000 },
+  { 0x8700, 0x1117, 0x2000 },
+  { 0x0700, 0x1116, 0x0000 },
+  { 0x0700, 0x1118, 0x0000 },
+  { 0x8700, 0x111b, 0x2000 },
+  { 0x0700, 0x111a, 0x0000 },
+  { 0x0700, 0x111c, 0x0000 },
+  { 0x8700, 0x1121, 0x3000 },
+  { 0x8700, 0x111f, 0x2000 },
+  { 0x0700, 0x111e, 0x0000 },
+  { 0x0700, 0x1120, 0x0000 },
+  { 0x8700, 0x1123, 0x2000 },
+  { 0x0700, 0x1122, 0x0000 },
+  { 0x0700, 0x1124, 0x0000 },
+  { 0x8700, 0x112d, 0x4000 },
+  { 0x8700, 0x1129, 0x3000 },
+  { 0x8700, 0x1127, 0x2000 },
+  { 0x0700, 0x1126, 0x0000 },
+  { 0x0700, 0x1128, 0x0000 },
+  { 0x8700, 0x112b, 0x2000 },
+  { 0x0700, 0x112a, 0x0000 },
+  { 0x0700, 0x112c, 0x0000 },
+  { 0x8700, 0x1131, 0x3000 },
+  { 0x8700, 0x112f, 0x2000 },
+  { 0x0700, 0x112e, 0x0000 },
+  { 0x0700, 0x1130, 0x0000 },
+  { 0x8700, 0x1133, 0x2000 },
+  { 0x0700, 0x1132, 0x0000 },
+  { 0x0700, 0x1134, 0x0000 },
+  { 0x8700, 0x1155, 0x6000 },
+  { 0x8700, 0x1145, 0x5000 },
+  { 0x8700, 0x113d, 0x4000 },
+  { 0x8700, 0x1139, 0x3000 },
+  { 0x8700, 0x1137, 0x2000 },
+  { 0x0700, 0x1136, 0x0000 },
+  { 0x0700, 0x1138, 0x0000 },
+  { 0x8700, 0x113b, 0x2000 },
+  { 0x0700, 0x113a, 0x0000 },
+  { 0x0700, 0x113c, 0x0000 },
+  { 0x8700, 0x1141, 0x3000 },
+  { 0x8700, 0x113f, 0x2000 },
+  { 0x0700, 0x113e, 0x0000 },
+  { 0x0700, 0x1140, 0x0000 },
+  { 0x8700, 0x1143, 0x2000 },
+  { 0x0700, 0x1142, 0x0000 },
+  { 0x0700, 0x1144, 0x0000 },
+  { 0x8700, 0x114d, 0x4000 },
+  { 0x8700, 0x1149, 0x3000 },
+  { 0x8700, 0x1147, 0x2000 },
+  { 0x0700, 0x1146, 0x0000 },
+  { 0x0700, 0x1148, 0x0000 },
+  { 0x8700, 0x114b, 0x2000 },
+  { 0x0700, 0x114a, 0x0000 },
+  { 0x0700, 0x114c, 0x0000 },
+  { 0x8700, 0x1151, 0x3000 },
+  { 0x8700, 0x114f, 0x2000 },
+  { 0x0700, 0x114e, 0x0000 },
+  { 0x0700, 0x1150, 0x0000 },
+  { 0x8700, 0x1153, 0x2000 },
+  { 0x0700, 0x1152, 0x0000 },
+  { 0x0700, 0x1154, 0x0000 },
+  { 0x8700, 0x116a, 0x5000 },
+  { 0x8700, 0x1162, 0x4000 },
+  { 0x8700, 0x1159, 0x3000 },
+  { 0x8700, 0x1157, 0x2000 },
+  { 0x0700, 0x1156, 0x0000 },
+  { 0x0700, 0x1158, 0x0000 },
+  { 0x8700, 0x1160, 0x2000 },
+  { 0x0700, 0x115f, 0x0000 },
+  { 0x0700, 0x1161, 0x0000 },
+  { 0x8700, 0x1166, 0x3000 },
+  { 0x8700, 0x1164, 0x2000 },
+  { 0x0700, 0x1163, 0x0000 },
+  { 0x0700, 0x1165, 0x0000 },
+  { 0x8700, 0x1168, 0x2000 },
+  { 0x0700, 0x1167, 0x0000 },
+  { 0x0700, 0x1169, 0x0000 },
+  { 0x8700, 0x1172, 0x4000 },
+  { 0x8700, 0x116e, 0x3000 },
+  { 0x8700, 0x116c, 0x2000 },
+  { 0x0700, 0x116b, 0x0000 },
+  { 0x0700, 0x116d, 0x0000 },
+  { 0x8700, 0x1170, 0x2000 },
+  { 0x0700, 0x116f, 0x0000 },
+  { 0x0700, 0x1171, 0x0000 },
+  { 0x8700, 0x1176, 0x3000 },
+  { 0x8700, 0x1174, 0x2000 },
+  { 0x0700, 0x1173, 0x0000 },
+  { 0x0700, 0x1175, 0x0000 },
+  { 0x8700, 0x1178, 0x2000 },
+  { 0x0700, 0x1177, 0x0000 },
+  { 0x0700, 0x1179, 0x0000 },
+  { 0x8700, 0x11bf, 0x7000 },
+  { 0x8700, 0x119a, 0x6000 },
+  { 0x8700, 0x118a, 0x5000 },
+  { 0x8700, 0x1182, 0x4000 },
+  { 0x8700, 0x117e, 0x3000 },
+  { 0x8700, 0x117c, 0x2000 },
+  { 0x0700, 0x117b, 0x0000 },
+  { 0x0700, 0x117d, 0x0000 },
+  { 0x8700, 0x1180, 0x2000 },
+  { 0x0700, 0x117f, 0x0000 },
+  { 0x0700, 0x1181, 0x0000 },
+  { 0x8700, 0x1186, 0x3000 },
+  { 0x8700, 0x1184, 0x2000 },
+  { 0x0700, 0x1183, 0x0000 },
+  { 0x0700, 0x1185, 0x0000 },
+  { 0x8700, 0x1188, 0x2000 },
+  { 0x0700, 0x1187, 0x0000 },
+  { 0x0700, 0x1189, 0x0000 },
+  { 0x8700, 0x1192, 0x4000 },
+  { 0x8700, 0x118e, 0x3000 },
+  { 0x8700, 0x118c, 0x2000 },
+  { 0x0700, 0x118b, 0x0000 },
+  { 0x0700, 0x118d, 0x0000 },
+  { 0x8700, 0x1190, 0x2000 },
+  { 0x0700, 0x118f, 0x0000 },
+  { 0x0700, 0x1191, 0x0000 },
+  { 0x8700, 0x1196, 0x3000 },
+  { 0x8700, 0x1194, 0x2000 },
+  { 0x0700, 0x1193, 0x0000 },
+  { 0x0700, 0x1195, 0x0000 },
+  { 0x8700, 0x1198, 0x2000 },
+  { 0x0700, 0x1197, 0x0000 },
+  { 0x0700, 0x1199, 0x0000 },
+  { 0x8700, 0x11af, 0x5000 },
+  { 0x8700, 0x11a2, 0x4000 },
+  { 0x8700, 0x119e, 0x3000 },
+  { 0x8700, 0x119c, 0x2000 },
+  { 0x0700, 0x119b, 0x0000 },
+  { 0x0700, 0x119d, 0x0000 },
+  { 0x8700, 0x11a0, 0x2000 },
+  { 0x0700, 0x119f, 0x0000 },
+  { 0x0700, 0x11a1, 0x0000 },
+  { 0x8700, 0x11ab, 0x3000 },
+  { 0x8700, 0x11a9, 0x2000 },
+  { 0x0700, 0x11a8, 0x0000 },
+  { 0x0700, 0x11aa, 0x0000 },
+  { 0x8700, 0x11ad, 0x2000 },
+  { 0x0700, 0x11ac, 0x0000 },
+  { 0x0700, 0x11ae, 0x0000 },
+  { 0x8700, 0x11b7, 0x4000 },
+  { 0x8700, 0x11b3, 0x3000 },
+  { 0x8700, 0x11b1, 0x2000 },
+  { 0x0700, 0x11b0, 0x0000 },
+  { 0x0700, 0x11b2, 0x0000 },
+  { 0x8700, 0x11b5, 0x2000 },
+  { 0x0700, 0x11b4, 0x0000 },
+  { 0x0700, 0x11b6, 0x0000 },
+  { 0x8700, 0x11bb, 0x3000 },
+  { 0x8700, 0x11b9, 0x2000 },
+  { 0x0700, 0x11b8, 0x0000 },
+  { 0x0700, 0x11ba, 0x0000 },
+  { 0x8700, 0x11bd, 0x2000 },
+  { 0x0700, 0x11bc, 0x0000 },
+  { 0x0700, 0x11be, 0x0000 },
+  { 0x8700, 0x11df, 0x6000 },
+  { 0x8700, 0x11cf, 0x5000 },
+  { 0x8700, 0x11c7, 0x4000 },
+  { 0x8700, 0x11c3, 0x3000 },
+  { 0x8700, 0x11c1, 0x2000 },
+  { 0x0700, 0x11c0, 0x0000 },
+  { 0x0700, 0x11c2, 0x0000 },
+  { 0x8700, 0x11c5, 0x2000 },
+  { 0x0700, 0x11c4, 0x0000 },
+  { 0x0700, 0x11c6, 0x0000 },
+  { 0x8700, 0x11cb, 0x3000 },
+  { 0x8700, 0x11c9, 0x2000 },
+  { 0x0700, 0x11c8, 0x0000 },
+  { 0x0700, 0x11ca, 0x0000 },
+  { 0x8700, 0x11cd, 0x2000 },
+  { 0x0700, 0x11cc, 0x0000 },
+  { 0x0700, 0x11ce, 0x0000 },
+  { 0x8700, 0x11d7, 0x4000 },
+  { 0x8700, 0x11d3, 0x3000 },
+  { 0x8700, 0x11d1, 0x2000 },
+  { 0x0700, 0x11d0, 0x0000 },
+  { 0x0700, 0x11d2, 0x0000 },
+  { 0x8700, 0x11d5, 0x2000 },
+  { 0x0700, 0x11d4, 0x0000 },
+  { 0x0700, 0x11d6, 0x0000 },
+  { 0x8700, 0x11db, 0x3000 },
+  { 0x8700, 0x11d9, 0x2000 },
+  { 0x0700, 0x11d8, 0x0000 },
+  { 0x0700, 0x11da, 0x0000 },
+  { 0x8700, 0x11dd, 0x2000 },
+  { 0x0700, 0x11dc, 0x0000 },
+  { 0x0700, 0x11de, 0x0000 },
+  { 0x8700, 0x11ef, 0x5000 },
+  { 0x8700, 0x11e7, 0x4000 },
+  { 0x8700, 0x11e3, 0x3000 },
+  { 0x8700, 0x11e1, 0x2000 },
+  { 0x0700, 0x11e0, 0x0000 },
+  { 0x0700, 0x11e2, 0x0000 },
+  { 0x8700, 0x11e5, 0x2000 },
+  { 0x0700, 0x11e4, 0x0000 },
+  { 0x0700, 0x11e6, 0x0000 },
+  { 0x8700, 0x11eb, 0x3000 },
+  { 0x8700, 0x11e9, 0x2000 },
+  { 0x0700, 0x11e8, 0x0000 },
+  { 0x0700, 0x11ea, 0x0000 },
+  { 0x8700, 0x11ed, 0x2000 },
+  { 0x0700, 0x11ec, 0x0000 },
+  { 0x0700, 0x11ee, 0x0000 },
+  { 0x8700, 0x11f7, 0x4000 },
+  { 0x8700, 0x11f3, 0x3000 },
+  { 0x8700, 0x11f1, 0x2000 },
+  { 0x0700, 0x11f0, 0x0000 },
+  { 0x0700, 0x11f2, 0x0000 },
+  { 0x8700, 0x11f5, 0x2000 },
+  { 0x0700, 0x11f4, 0x0000 },
+  { 0x0700, 0x11f6, 0x0000 },
+  { 0x8700, 0x1201, 0x3000 },
+  { 0x8700, 0x11f9, 0x2000 },
+  { 0x0700, 0x11f8, 0x0000 },
+  { 0x0700, 0x1200, 0x0000 },
+  { 0x8700, 0x1203, 0x2000 },
+  { 0x0700, 0x1202, 0x0000 },
+  { 0x0700, 0x1204, 0x0000 },
+  { 0x8700, 0x1292, 0x8000 },
+  { 0x8700, 0x1246, 0x7000 },
+  { 0x8700, 0x1226, 0x6000 },
+  { 0x8700, 0x1216, 0x5000 },
+  { 0x8700, 0x120e, 0x4000 },
+  { 0x8700, 0x120a, 0x3000 },
+  { 0x8700, 0x1208, 0x2000 },
+  { 0x0700, 0x1206, 0x0000 },
+  { 0x0700, 0x1209, 0x0000 },
+  { 0x8700, 0x120c, 0x2000 },
+  { 0x0700, 0x120b, 0x0000 },
+  { 0x0700, 0x120d, 0x0000 },
+  { 0x8700, 0x1212, 0x3000 },
+  { 0x8700, 0x1210, 0x2000 },
+  { 0x0700, 0x120f, 0x0000 },
+  { 0x0700, 0x1211, 0x0000 },
+  { 0x8700, 0x1214, 0x2000 },
+  { 0x0700, 0x1213, 0x0000 },
+  { 0x0700, 0x1215, 0x0000 },
+  { 0x8700, 0x121e, 0x4000 },
+  { 0x8700, 0x121a, 0x3000 },
+  { 0x8700, 0x1218, 0x2000 },
+  { 0x0700, 0x1217, 0x0000 },
+  { 0x0700, 0x1219, 0x0000 },
+  { 0x8700, 0x121c, 0x2000 },
+  { 0x0700, 0x121b, 0x0000 },
+  { 0x0700, 0x121d, 0x0000 },
+  { 0x8700, 0x1222, 0x3000 },
+  { 0x8700, 0x1220, 0x2000 },
+  { 0x0700, 0x121f, 0x0000 },
+  { 0x0700, 0x1221, 0x0000 },
+  { 0x8700, 0x1224, 0x2000 },
+  { 0x0700, 0x1223, 0x0000 },
+  { 0x0700, 0x1225, 0x0000 },
+  { 0x8700, 0x1236, 0x5000 },
+  { 0x8700, 0x122e, 0x4000 },
+  { 0x8700, 0x122a, 0x3000 },
+  { 0x8700, 0x1228, 0x2000 },
+  { 0x0700, 0x1227, 0x0000 },
+  { 0x0700, 0x1229, 0x0000 },
+  { 0x8700, 0x122c, 0x2000 },
+  { 0x0700, 0x122b, 0x0000 },
+  { 0x0700, 0x122d, 0x0000 },
+  { 0x8700, 0x1232, 0x3000 },
+  { 0x8700, 0x1230, 0x2000 },
+  { 0x0700, 0x122f, 0x0000 },
+  { 0x0700, 0x1231, 0x0000 },
+  { 0x8700, 0x1234, 0x2000 },
+  { 0x0700, 0x1233, 0x0000 },
+  { 0x0700, 0x1235, 0x0000 },
+  { 0x8700, 0x123e, 0x4000 },
+  { 0x8700, 0x123a, 0x3000 },
+  { 0x8700, 0x1238, 0x2000 },
+  { 0x0700, 0x1237, 0x0000 },
+  { 0x0700, 0x1239, 0x0000 },
+  { 0x8700, 0x123c, 0x2000 },
+  { 0x0700, 0x123b, 0x0000 },
+  { 0x0700, 0x123d, 0x0000 },
+  { 0x8700, 0x1242, 0x3000 },
+  { 0x8700, 0x1240, 0x2000 },
+  { 0x0700, 0x123f, 0x0000 },
+  { 0x0700, 0x1241, 0x0000 },
+  { 0x8700, 0x1244, 0x2000 },
+  { 0x0700, 0x1243, 0x0000 },
+  { 0x0700, 0x1245, 0x0000 },
+  { 0x8700, 0x126e, 0x6000 },
+  { 0x8700, 0x125c, 0x5000 },
+  { 0x8700, 0x1252, 0x4000 },
+  { 0x8700, 0x124c, 0x3000 },
+  { 0x8700, 0x124a, 0x2000 },
+  { 0x0700, 0x1248, 0x0000 },
+  { 0x0700, 0x124b, 0x0000 },
+  { 0x8700, 0x1250, 0x2000 },
+  { 0x0700, 0x124d, 0x0000 },
+  { 0x0700, 0x1251, 0x0000 },
+  { 0x8700, 0x1256, 0x3000 },
+  { 0x8700, 0x1254, 0x2000 },
+  { 0x0700, 0x1253, 0x0000 },
+  { 0x0700, 0x1255, 0x0000 },
+  { 0x8700, 0x125a, 0x2000 },
+  { 0x0700, 0x1258, 0x0000 },
+  { 0x0700, 0x125b, 0x0000 },
+  { 0x8700, 0x1266, 0x4000 },
+  { 0x8700, 0x1262, 0x3000 },
+  { 0x8700, 0x1260, 0x2000 },
+  { 0x0700, 0x125d, 0x0000 },
+  { 0x0700, 0x1261, 0x0000 },
+  { 0x8700, 0x1264, 0x2000 },
+  { 0x0700, 0x1263, 0x0000 },
+  { 0x0700, 0x1265, 0x0000 },
+  { 0x8700, 0x126a, 0x3000 },
+  { 0x8700, 0x1268, 0x2000 },
+  { 0x0700, 0x1267, 0x0000 },
+  { 0x0700, 0x1269, 0x0000 },
+  { 0x8700, 0x126c, 0x2000 },
+  { 0x0700, 0x126b, 0x0000 },
+  { 0x0700, 0x126d, 0x0000 },
+  { 0x8700, 0x127e, 0x5000 },
+  { 0x8700, 0x1276, 0x4000 },
+  { 0x8700, 0x1272, 0x3000 },
+  { 0x8700, 0x1270, 0x2000 },
+  { 0x0700, 0x126f, 0x0000 },
+  { 0x0700, 0x1271, 0x0000 },
+  { 0x8700, 0x1274, 0x2000 },
+  { 0x0700, 0x1273, 0x0000 },
+  { 0x0700, 0x1275, 0x0000 },
+  { 0x8700, 0x127a, 0x3000 },
+  { 0x8700, 0x1278, 0x2000 },
+  { 0x0700, 0x1277, 0x0000 },
+  { 0x0700, 0x1279, 0x0000 },
+  { 0x8700, 0x127c, 0x2000 },
+  { 0x0700, 0x127b, 0x0000 },
+  { 0x0700, 0x127d, 0x0000 },
+  { 0x8700, 0x1286, 0x4000 },
+  { 0x8700, 0x1282, 0x3000 },
+  { 0x8700, 0x1280, 0x2000 },
+  { 0x0700, 0x127f, 0x0000 },
+  { 0x0700, 0x1281, 0x0000 },
+  { 0x8700, 0x1284, 0x2000 },
+  { 0x0700, 0x1283, 0x0000 },
+  { 0x0700, 0x1285, 0x0000 },
+  { 0x8700, 0x128c, 0x3000 },
+  { 0x8700, 0x128a, 0x2000 },
+  { 0x0700, 0x1288, 0x0000 },
+  { 0x0700, 0x128b, 0x0000 },
+  { 0x8700, 0x1290, 0x2000 },
+  { 0x0700, 0x128d, 0x0000 },
+  { 0x0700, 0x1291, 0x0000 },
+  { 0x8700, 0x12dc, 0x7000 },
+  { 0x8700, 0x12b4, 0x6000 },
+  { 0x8700, 0x12a2, 0x5000 },
+  { 0x8700, 0x129a, 0x4000 },
+  { 0x8700, 0x1296, 0x3000 },
+  { 0x8700, 0x1294, 0x2000 },
+  { 0x0700, 0x1293, 0x0000 },
+  { 0x0700, 0x1295, 0x0000 },
+  { 0x8700, 0x1298, 0x2000 },
+  { 0x0700, 0x1297, 0x0000 },
+  { 0x0700, 0x1299, 0x0000 },
+  { 0x8700, 0x129e, 0x3000 },
+  { 0x8700, 0x129c, 0x2000 },
+  { 0x0700, 0x129b, 0x0000 },
+  { 0x0700, 0x129d, 0x0000 },
+  { 0x8700, 0x12a0, 0x2000 },
+  { 0x0700, 0x129f, 0x0000 },
+  { 0x0700, 0x12a1, 0x0000 },
+  { 0x8700, 0x12aa, 0x4000 },
+  { 0x8700, 0x12a6, 0x3000 },
+  { 0x8700, 0x12a4, 0x2000 },
+  { 0x0700, 0x12a3, 0x0000 },
+  { 0x0700, 0x12a5, 0x0000 },
+  { 0x8700, 0x12a8, 0x2000 },
+  { 0x0700, 0x12a7, 0x0000 },
+  { 0x0700, 0x12a9, 0x0000 },
+  { 0x8700, 0x12ae, 0x3000 },
+  { 0x8700, 0x12ac, 0x2000 },
+  { 0x0700, 0x12ab, 0x0000 },
+  { 0x0700, 0x12ad, 0x0000 },
+  { 0x8700, 0x12b2, 0x2000 },
+  { 0x0700, 0x12b0, 0x0000 },
+  { 0x0700, 0x12b3, 0x0000 },
+  { 0x8700, 0x12ca, 0x5000 },
+  { 0x8700, 0x12be, 0x4000 },
+  { 0x8700, 0x12ba, 0x3000 },
+  { 0x8700, 0x12b8, 0x2000 },
+  { 0x0700, 0x12b5, 0x0000 },
+  { 0x0700, 0x12b9, 0x0000 },
+  { 0x8700, 0x12bc, 0x2000 },
+  { 0x0700, 0x12bb, 0x0000 },
+  { 0x0700, 0x12bd, 0x0000 },
+  { 0x8700, 0x12c4, 0x3000 },
+  { 0x8700, 0x12c2, 0x2000 },
+  { 0x0700, 0x12c0, 0x0000 },
+  { 0x0700, 0x12c3, 0x0000 },
+  { 0x8700, 0x12c8, 0x2000 },
+  { 0x0700, 0x12c5, 0x0000 },
+  { 0x0700, 0x12c9, 0x0000 },
+  { 0x8700, 0x12d3, 0x4000 },
+  { 0x8700, 0x12ce, 0x3000 },
+  { 0x8700, 0x12cc, 0x2000 },
+  { 0x0700, 0x12cb, 0x0000 },
+  { 0x0700, 0x12cd, 0x0000 },
+  { 0x8700, 0x12d1, 0x2000 },
+  { 0x0700, 0x12d0, 0x0000 },
+  { 0x0700, 0x12d2, 0x0000 },
+  { 0x8700, 0x12d8, 0x3000 },
+  { 0x8700, 0x12d5, 0x2000 },
+  { 0x0700, 0x12d4, 0x0000 },
+  { 0x0700, 0x12d6, 0x0000 },
+  { 0x8700, 0x12da, 0x2000 },
+  { 0x0700, 0x12d9, 0x0000 },
+  { 0x0700, 0x12db, 0x0000 },
+  { 0x8700, 0x12fd, 0x6000 },
+  { 0x8700, 0x12ec, 0x5000 },
+  { 0x8700, 0x12e4, 0x4000 },
+  { 0x8700, 0x12e0, 0x3000 },
+  { 0x8700, 0x12de, 0x2000 },
+  { 0x0700, 0x12dd, 0x0000 },
+  { 0x0700, 0x12df, 0x0000 },
+  { 0x8700, 0x12e2, 0x2000 },
+  { 0x0700, 0x12e1, 0x0000 },
+  { 0x0700, 0x12e3, 0x0000 },
+  { 0x8700, 0x12e8, 0x3000 },
+  { 0x8700, 0x12e6, 0x2000 },
+  { 0x0700, 0x12e5, 0x0000 },
+  { 0x0700, 0x12e7, 0x0000 },
+  { 0x8700, 0x12ea, 0x2000 },
+  { 0x0700, 0x12e9, 0x0000 },
+  { 0x0700, 0x12eb, 0x0000 },
+  { 0x8700, 0x12f5, 0x4000 },
+  { 0x8700, 0x12f1, 0x3000 },
+  { 0x8700, 0x12ee, 0x2000 },
+  { 0x0700, 0x12ed, 0x0000 },
+  { 0x0700, 0x12f0, 0x0000 },
+  { 0x8700, 0x12f3, 0x2000 },
+  { 0x0700, 0x12f2, 0x0000 },
+  { 0x0700, 0x12f4, 0x0000 },
+  { 0x8700, 0x12f9, 0x3000 },
+  { 0x8700, 0x12f7, 0x2000 },
+  { 0x0700, 0x12f6, 0x0000 },
+  { 0x0700, 0x12f8, 0x0000 },
+  { 0x8700, 0x12fb, 0x2000 },
+  { 0x0700, 0x12fa, 0x0000 },
+  { 0x0700, 0x12fc, 0x0000 },
+  { 0x8700, 0x130d, 0x5000 },
+  { 0x8700, 0x1305, 0x4000 },
+  { 0x8700, 0x1301, 0x3000 },
+  { 0x8700, 0x12ff, 0x2000 },
+  { 0x0700, 0x12fe, 0x0000 },
+  { 0x0700, 0x1300, 0x0000 },
+  { 0x8700, 0x1303, 0x2000 },
+  { 0x0700, 0x1302, 0x0000 },
+  { 0x0700, 0x1304, 0x0000 },
+  { 0x8700, 0x1309, 0x3000 },
+  { 0x8700, 0x1307, 0x2000 },
+  { 0x0700, 0x1306, 0x0000 },
+  { 0x0700, 0x1308, 0x0000 },
+  { 0x8700, 0x130b, 0x2000 },
+  { 0x0700, 0x130a, 0x0000 },
+  { 0x0700, 0x130c, 0x0000 },
+  { 0x8700, 0x1319, 0x4000 },
+  { 0x8700, 0x1313, 0x3000 },
+  { 0x8700, 0x1310, 0x2000 },
+  { 0x0700, 0x130e, 0x0000 },
+  { 0x0700, 0x1312, 0x0000 },
+  { 0x8700, 0x1315, 0x2000 },
+  { 0x0700, 0x1314, 0x0000 },
+  { 0x0700, 0x1318, 0x0000 },
+  { 0x8700, 0x131d, 0x3000 },
+  { 0x8700, 0x131b, 0x2000 },
+  { 0x0700, 0x131a, 0x0000 },
+  { 0x0700, 0x131c, 0x0000 },
+  { 0x8700, 0x1320, 0x2000 },
+  { 0x0700, 0x131e, 0x0000 },
+  { 0x0700, 0x1321, 0x0000 },
+  { 0x8700, 0x1458, 0x9000 },
+  { 0x8700, 0x13cc, 0x8000 },
+  { 0x8d00, 0x1369, 0x7000 },
+  { 0x8700, 0x1342, 0x6000 },
+  { 0x8700, 0x1332, 0x5000 },
+  { 0x8700, 0x132a, 0x4000 },
+  { 0x8700, 0x1326, 0x3000 },
+  { 0x8700, 0x1324, 0x2000 },
+  { 0x0700, 0x1323, 0x0000 },
+  { 0x0700, 0x1325, 0x0000 },
+  { 0x8700, 0x1328, 0x2000 },
+  { 0x0700, 0x1327, 0x0000 },
+  { 0x0700, 0x1329, 0x0000 },
+  { 0x8700, 0x132e, 0x3000 },
+  { 0x8700, 0x132c, 0x2000 },
+  { 0x0700, 0x132b, 0x0000 },
+  { 0x0700, 0x132d, 0x0000 },
+  { 0x8700, 0x1330, 0x2000 },
+  { 0x0700, 0x132f, 0x0000 },
+  { 0x0700, 0x1331, 0x0000 },
+  { 0x8700, 0x133a, 0x4000 },
+  { 0x8700, 0x1336, 0x3000 },
+  { 0x8700, 0x1334, 0x2000 },
+  { 0x0700, 0x1333, 0x0000 },
+  { 0x0700, 0x1335, 0x0000 },
+  { 0x8700, 0x1338, 0x2000 },
+  { 0x0700, 0x1337, 0x0000 },
+  { 0x0700, 0x1339, 0x0000 },
+  { 0x8700, 0x133e, 0x3000 },
+  { 0x8700, 0x133c, 0x2000 },
+  { 0x0700, 0x133b, 0x0000 },
+  { 0x0700, 0x133d, 0x0000 },
+  { 0x8700, 0x1340, 0x2000 },
+  { 0x0700, 0x133f, 0x0000 },
+  { 0x0700, 0x1341, 0x0000 },
+  { 0x8700, 0x1353, 0x5000 },
+  { 0x8700, 0x134b, 0x4000 },
+  { 0x8700, 0x1346, 0x3000 },
+  { 0x8700, 0x1344, 0x2000 },
+  { 0x0700, 0x1343, 0x0000 },
+  { 0x0700, 0x1345, 0x0000 },
+  { 0x8700, 0x1349, 0x2000 },
+  { 0x0700, 0x1348, 0x0000 },
+  { 0x0700, 0x134a, 0x0000 },
+  { 0x8700, 0x134f, 0x3000 },
+  { 0x8700, 0x134d, 0x2000 },
+  { 0x0700, 0x134c, 0x0000 },
+  { 0x0700, 0x134e, 0x0000 },
+  { 0x8700, 0x1351, 0x2000 },
+  { 0x0700, 0x1350, 0x0000 },
+  { 0x0700, 0x1352, 0x0000 },
+  { 0x9500, 0x1361, 0x4000 },
+  { 0x8700, 0x1357, 0x3000 },
+  { 0x8700, 0x1355, 0x2000 },
+  { 0x0700, 0x1354, 0x0000 },
+  { 0x0700, 0x1356, 0x0000 },
+  { 0x8700, 0x1359, 0x2000 },
+  { 0x0700, 0x1358, 0x0000 },
+  { 0x0700, 0x135a, 0x0000 },
+  { 0x9500, 0x1365, 0x3000 },
+  { 0x9500, 0x1363, 0x2000 },
+  { 0x1500, 0x1362, 0x0000 },
+  { 0x1500, 0x1364, 0x0000 },
+  { 0x9500, 0x1367, 0x2000 },
+  { 0x1500, 0x1366, 0x0000 },
+  { 0x1500, 0x1368, 0x0000 },
+  { 0x8700, 0x13ac, 0x6000 },
+  { 0x8f00, 0x1379, 0x5000 },
+  { 0x8d00, 0x1371, 0x4000 },
+  { 0x8d00, 0x136d, 0x3000 },
+  { 0x8d00, 0x136b, 0x2000 },
+  { 0x0d00, 0x136a, 0x0000 },
+  { 0x0d00, 0x136c, 0x0000 },
+  { 0x8d00, 0x136f, 0x2000 },
+  { 0x0d00, 0x136e, 0x0000 },
+  { 0x0d00, 0x1370, 0x0000 },
+  { 0x8f00, 0x1375, 0x3000 },
+  { 0x8f00, 0x1373, 0x2000 },
+  { 0x0f00, 0x1372, 0x0000 },
+  { 0x0f00, 0x1374, 0x0000 },
+  { 0x8f00, 0x1377, 0x2000 },
+  { 0x0f00, 0x1376, 0x0000 },
+  { 0x0f00, 0x1378, 0x0000 },
+  { 0x8700, 0x13a4, 0x4000 },
+  { 0x8700, 0x13a0, 0x3000 },
+  { 0x8f00, 0x137b, 0x2000 },
+  { 0x0f00, 0x137a, 0x0000 },
+  { 0x0f00, 0x137c, 0x0000 },
+  { 0x8700, 0x13a2, 0x2000 },
+  { 0x0700, 0x13a1, 0x0000 },
+  { 0x0700, 0x13a3, 0x0000 },
+  { 0x8700, 0x13a8, 0x3000 },
+  { 0x8700, 0x13a6, 0x2000 },
+  { 0x0700, 0x13a5, 0x0000 },
+  { 0x0700, 0x13a7, 0x0000 },
+  { 0x8700, 0x13aa, 0x2000 },
+  { 0x0700, 0x13a9, 0x0000 },
+  { 0x0700, 0x13ab, 0x0000 },
+  { 0x8700, 0x13bc, 0x5000 },
+  { 0x8700, 0x13b4, 0x4000 },
+  { 0x8700, 0x13b0, 0x3000 },
+  { 0x8700, 0x13ae, 0x2000 },
+  { 0x0700, 0x13ad, 0x0000 },
+  { 0x0700, 0x13af, 0x0000 },
+  { 0x8700, 0x13b2, 0x2000 },
+  { 0x0700, 0x13b1, 0x0000 },
+  { 0x0700, 0x13b3, 0x0000 },
+  { 0x8700, 0x13b8, 0x3000 },
+  { 0x8700, 0x13b6, 0x2000 },
+  { 0x0700, 0x13b5, 0x0000 },
+  { 0x0700, 0x13b7, 0x0000 },
+  { 0x8700, 0x13ba, 0x2000 },
+  { 0x0700, 0x13b9, 0x0000 },
+  { 0x0700, 0x13bb, 0x0000 },
+  { 0x8700, 0x13c4, 0x4000 },
+  { 0x8700, 0x13c0, 0x3000 },
+  { 0x8700, 0x13be, 0x2000 },
+  { 0x0700, 0x13bd, 0x0000 },
+  { 0x0700, 0x13bf, 0x0000 },
+  { 0x8700, 0x13c2, 0x2000 },
+  { 0x0700, 0x13c1, 0x0000 },
+  { 0x0700, 0x13c3, 0x0000 },
+  { 0x8700, 0x13c8, 0x3000 },
+  { 0x8700, 0x13c6, 0x2000 },
+  { 0x0700, 0x13c5, 0x0000 },
+  { 0x0700, 0x13c7, 0x0000 },
+  { 0x8700, 0x13ca, 0x2000 },
+  { 0x0700, 0x13c9, 0x0000 },
+  { 0x0700, 0x13cb, 0x0000 },
+  { 0x8700, 0x1418, 0x7000 },
+  { 0x8700, 0x13ec, 0x6000 },
+  { 0x8700, 0x13dc, 0x5000 },
+  { 0x8700, 0x13d4, 0x4000 },
+  { 0x8700, 0x13d0, 0x3000 },
+  { 0x8700, 0x13ce, 0x2000 },
+  { 0x0700, 0x13cd, 0x0000 },
+  { 0x0700, 0x13cf, 0x0000 },
+  { 0x8700, 0x13d2, 0x2000 },
+  { 0x0700, 0x13d1, 0x0000 },
+  { 0x0700, 0x13d3, 0x0000 },
+  { 0x8700, 0x13d8, 0x3000 },
+  { 0x8700, 0x13d6, 0x2000 },
+  { 0x0700, 0x13d5, 0x0000 },
+  { 0x0700, 0x13d7, 0x0000 },
+  { 0x8700, 0x13da, 0x2000 },
+  { 0x0700, 0x13d9, 0x0000 },
+  { 0x0700, 0x13db, 0x0000 },
+  { 0x8700, 0x13e4, 0x4000 },
+  { 0x8700, 0x13e0, 0x3000 },
+  { 0x8700, 0x13de, 0x2000 },
+  { 0x0700, 0x13dd, 0x0000 },
+  { 0x0700, 0x13df, 0x0000 },
+  { 0x8700, 0x13e2, 0x2000 },
+  { 0x0700, 0x13e1, 0x0000 },
+  { 0x0700, 0x13e3, 0x0000 },
+  { 0x8700, 0x13e8, 0x3000 },
+  { 0x8700, 0x13e6, 0x2000 },
+  { 0x0700, 0x13e5, 0x0000 },
+  { 0x0700, 0x13e7, 0x0000 },
+  { 0x8700, 0x13ea, 0x2000 },
+  { 0x0700, 0x13e9, 0x0000 },
+  { 0x0700, 0x13eb, 0x0000 },
+  { 0x8700, 0x1408, 0x5000 },
+  { 0x8700, 0x13f4, 0x4000 },
+  { 0x8700, 0x13f0, 0x3000 },
+  { 0x8700, 0x13ee, 0x2000 },
+  { 0x0700, 0x13ed, 0x0000 },
+  { 0x0700, 0x13ef, 0x0000 },
+  { 0x8700, 0x13f2, 0x2000 },
+  { 0x0700, 0x13f1, 0x0000 },
+  { 0x0700, 0x13f3, 0x0000 },
+  { 0x8700, 0x1404, 0x3000 },
+  { 0x8700, 0x1402, 0x2000 },
+  { 0x0700, 0x1401, 0x0000 },
+  { 0x0700, 0x1403, 0x0000 },
+  { 0x8700, 0x1406, 0x2000 },
+  { 0x0700, 0x1405, 0x0000 },
+  { 0x0700, 0x1407, 0x0000 },
+  { 0x8700, 0x1410, 0x4000 },
+  { 0x8700, 0x140c, 0x3000 },
+  { 0x8700, 0x140a, 0x2000 },
+  { 0x0700, 0x1409, 0x0000 },
+  { 0x0700, 0x140b, 0x0000 },
+  { 0x8700, 0x140e, 0x2000 },
+  { 0x0700, 0x140d, 0x0000 },
+  { 0x0700, 0x140f, 0x0000 },
+  { 0x8700, 0x1414, 0x3000 },
+  { 0x8700, 0x1412, 0x2000 },
+  { 0x0700, 0x1411, 0x0000 },
+  { 0x0700, 0x1413, 0x0000 },
+  { 0x8700, 0x1416, 0x2000 },
+  { 0x0700, 0x1415, 0x0000 },
+  { 0x0700, 0x1417, 0x0000 },
+  { 0x8700, 0x1438, 0x6000 },
+  { 0x8700, 0x1428, 0x5000 },
+  { 0x8700, 0x1420, 0x4000 },
+  { 0x8700, 0x141c, 0x3000 },
+  { 0x8700, 0x141a, 0x2000 },
+  { 0x0700, 0x1419, 0x0000 },
+  { 0x0700, 0x141b, 0x0000 },
+  { 0x8700, 0x141e, 0x2000 },
+  { 0x0700, 0x141d, 0x0000 },
+  { 0x0700, 0x141f, 0x0000 },
+  { 0x8700, 0x1424, 0x3000 },
+  { 0x8700, 0x1422, 0x2000 },
+  { 0x0700, 0x1421, 0x0000 },
+  { 0x0700, 0x1423, 0x0000 },
+  { 0x8700, 0x1426, 0x2000 },
+  { 0x0700, 0x1425, 0x0000 },
+  { 0x0700, 0x1427, 0x0000 },
+  { 0x8700, 0x1430, 0x4000 },
+  { 0x8700, 0x142c, 0x3000 },
+  { 0x8700, 0x142a, 0x2000 },
+  { 0x0700, 0x1429, 0x0000 },
+  { 0x0700, 0x142b, 0x0000 },
+  { 0x8700, 0x142e, 0x2000 },
+  { 0x0700, 0x142d, 0x0000 },
+  { 0x0700, 0x142f, 0x0000 },
+  { 0x8700, 0x1434, 0x3000 },
+  { 0x8700, 0x1432, 0x2000 },
+  { 0x0700, 0x1431, 0x0000 },
+  { 0x0700, 0x1433, 0x0000 },
+  { 0x8700, 0x1436, 0x2000 },
+  { 0x0700, 0x1435, 0x0000 },
+  { 0x0700, 0x1437, 0x0000 },
+  { 0x8700, 0x1448, 0x5000 },
+  { 0x8700, 0x1440, 0x4000 },
+  { 0x8700, 0x143c, 0x3000 },
+  { 0x8700, 0x143a, 0x2000 },
+  { 0x0700, 0x1439, 0x0000 },
+  { 0x0700, 0x143b, 0x0000 },
+  { 0x8700, 0x143e, 0x2000 },
+  { 0x0700, 0x143d, 0x0000 },
+  { 0x0700, 0x143f, 0x0000 },
+  { 0x8700, 0x1444, 0x3000 },
+  { 0x8700, 0x1442, 0x2000 },
+  { 0x0700, 0x1441, 0x0000 },
+  { 0x0700, 0x1443, 0x0000 },
+  { 0x8700, 0x1446, 0x2000 },
+  { 0x0700, 0x1445, 0x0000 },
+  { 0x0700, 0x1447, 0x0000 },
+  { 0x8700, 0x1450, 0x4000 },
+  { 0x8700, 0x144c, 0x3000 },
+  { 0x8700, 0x144a, 0x2000 },
+  { 0x0700, 0x1449, 0x0000 },
+  { 0x0700, 0x144b, 0x0000 },
+  { 0x8700, 0x144e, 0x2000 },
+  { 0x0700, 0x144d, 0x0000 },
+  { 0x0700, 0x144f, 0x0000 },
+  { 0x8700, 0x1454, 0x3000 },
+  { 0x8700, 0x1452, 0x2000 },
+  { 0x0700, 0x1451, 0x0000 },
+  { 0x0700, 0x1453, 0x0000 },
+  { 0x8700, 0x1456, 0x2000 },
+  { 0x0700, 0x1455, 0x0000 },
+  { 0x0700, 0x1457, 0x0000 },
+  { 0x8700, 0x14d8, 0x8000 },
+  { 0x8700, 0x1498, 0x7000 },
+  { 0x8700, 0x1478, 0x6000 },
+  { 0x8700, 0x1468, 0x5000 },
+  { 0x8700, 0x1460, 0x4000 },
+  { 0x8700, 0x145c, 0x3000 },
+  { 0x8700, 0x145a, 0x2000 },
+  { 0x0700, 0x1459, 0x0000 },
+  { 0x0700, 0x145b, 0x0000 },
+  { 0x8700, 0x145e, 0x2000 },
+  { 0x0700, 0x145d, 0x0000 },
+  { 0x0700, 0x145f, 0x0000 },
+  { 0x8700, 0x1464, 0x3000 },
+  { 0x8700, 0x1462, 0x2000 },
+  { 0x0700, 0x1461, 0x0000 },
+  { 0x0700, 0x1463, 0x0000 },
+  { 0x8700, 0x1466, 0x2000 },
+  { 0x0700, 0x1465, 0x0000 },
+  { 0x0700, 0x1467, 0x0000 },
+  { 0x8700, 0x1470, 0x4000 },
+  { 0x8700, 0x146c, 0x3000 },
+  { 0x8700, 0x146a, 0x2000 },
+  { 0x0700, 0x1469, 0x0000 },
+  { 0x0700, 0x146b, 0x0000 },
+  { 0x8700, 0x146e, 0x2000 },
+  { 0x0700, 0x146d, 0x0000 },
+  { 0x0700, 0x146f, 0x0000 },
+  { 0x8700, 0x1474, 0x3000 },
+  { 0x8700, 0x1472, 0x2000 },
+  { 0x0700, 0x1471, 0x0000 },
+  { 0x0700, 0x1473, 0x0000 },
+  { 0x8700, 0x1476, 0x2000 },
+  { 0x0700, 0x1475, 0x0000 },
+  { 0x0700, 0x1477, 0x0000 },
+  { 0x8700, 0x1488, 0x5000 },
+  { 0x8700, 0x1480, 0x4000 },
+  { 0x8700, 0x147c, 0x3000 },
+  { 0x8700, 0x147a, 0x2000 },
+  { 0x0700, 0x1479, 0x0000 },
+  { 0x0700, 0x147b, 0x0000 },
+  { 0x8700, 0x147e, 0x2000 },
+  { 0x0700, 0x147d, 0x0000 },
+  { 0x0700, 0x147f, 0x0000 },
+  { 0x8700, 0x1484, 0x3000 },
+  { 0x8700, 0x1482, 0x2000 },
+  { 0x0700, 0x1481, 0x0000 },
+  { 0x0700, 0x1483, 0x0000 },
+  { 0x8700, 0x1486, 0x2000 },
+  { 0x0700, 0x1485, 0x0000 },
+  { 0x0700, 0x1487, 0x0000 },
+  { 0x8700, 0x1490, 0x4000 },
+  { 0x8700, 0x148c, 0x3000 },
+  { 0x8700, 0x148a, 0x2000 },
+  { 0x0700, 0x1489, 0x0000 },
+  { 0x0700, 0x148b, 0x0000 },
+  { 0x8700, 0x148e, 0x2000 },
+  { 0x0700, 0x148d, 0x0000 },
+  { 0x0700, 0x148f, 0x0000 },
+  { 0x8700, 0x1494, 0x3000 },
+  { 0x8700, 0x1492, 0x2000 },
+  { 0x0700, 0x1491, 0x0000 },
+  { 0x0700, 0x1493, 0x0000 },
+  { 0x8700, 0x1496, 0x2000 },
+  { 0x0700, 0x1495, 0x0000 },
+  { 0x0700, 0x1497, 0x0000 },
+  { 0x8700, 0x14b8, 0x6000 },
+  { 0x8700, 0x14a8, 0x5000 },
+  { 0x8700, 0x14a0, 0x4000 },
+  { 0x8700, 0x149c, 0x3000 },
+  { 0x8700, 0x149a, 0x2000 },
+  { 0x0700, 0x1499, 0x0000 },
+  { 0x0700, 0x149b, 0x0000 },
+  { 0x8700, 0x149e, 0x2000 },
+  { 0x0700, 0x149d, 0x0000 },
+  { 0x0700, 0x149f, 0x0000 },
+  { 0x8700, 0x14a4, 0x3000 },
+  { 0x8700, 0x14a2, 0x2000 },
+  { 0x0700, 0x14a1, 0x0000 },
+  { 0x0700, 0x14a3, 0x0000 },
+  { 0x8700, 0x14a6, 0x2000 },
+  { 0x0700, 0x14a5, 0x0000 },
+  { 0x0700, 0x14a7, 0x0000 },
+  { 0x8700, 0x14b0, 0x4000 },
+  { 0x8700, 0x14ac, 0x3000 },
+  { 0x8700, 0x14aa, 0x2000 },
+  { 0x0700, 0x14a9, 0x0000 },
+  { 0x0700, 0x14ab, 0x0000 },
+  { 0x8700, 0x14ae, 0x2000 },
+  { 0x0700, 0x14ad, 0x0000 },
+  { 0x0700, 0x14af, 0x0000 },
+  { 0x8700, 0x14b4, 0x3000 },
+  { 0x8700, 0x14b2, 0x2000 },
+  { 0x0700, 0x14b1, 0x0000 },
+  { 0x0700, 0x14b3, 0x0000 },
+  { 0x8700, 0x14b6, 0x2000 },
+  { 0x0700, 0x14b5, 0x0000 },
+  { 0x0700, 0x14b7, 0x0000 },
+  { 0x8700, 0x14c8, 0x5000 },
+  { 0x8700, 0x14c0, 0x4000 },
+  { 0x8700, 0x14bc, 0x3000 },
+  { 0x8700, 0x14ba, 0x2000 },
+  { 0x0700, 0x14b9, 0x0000 },
+  { 0x0700, 0x14bb, 0x0000 },
+  { 0x8700, 0x14be, 0x2000 },
+  { 0x0700, 0x14bd, 0x0000 },
+  { 0x0700, 0x14bf, 0x0000 },
+  { 0x8700, 0x14c4, 0x3000 },
+  { 0x8700, 0x14c2, 0x2000 },
+  { 0x0700, 0x14c1, 0x0000 },
+  { 0x0700, 0x14c3, 0x0000 },
+  { 0x8700, 0x14c6, 0x2000 },
+  { 0x0700, 0x14c5, 0x0000 },
+  { 0x0700, 0x14c7, 0x0000 },
+  { 0x8700, 0x14d0, 0x4000 },
+  { 0x8700, 0x14cc, 0x3000 },
+  { 0x8700, 0x14ca, 0x2000 },
+  { 0x0700, 0x14c9, 0x0000 },
+  { 0x0700, 0x14cb, 0x0000 },
+  { 0x8700, 0x14ce, 0x2000 },
+  { 0x0700, 0x14cd, 0x0000 },
+  { 0x0700, 0x14cf, 0x0000 },
+  { 0x8700, 0x14d4, 0x3000 },
+  { 0x8700, 0x14d2, 0x2000 },
+  { 0x0700, 0x14d1, 0x0000 },
+  { 0x0700, 0x14d3, 0x0000 },
+  { 0x8700, 0x14d6, 0x2000 },
+  { 0x0700, 0x14d5, 0x0000 },
+  { 0x0700, 0x14d7, 0x0000 },
+  { 0x8700, 0x1518, 0x7000 },
+  { 0x8700, 0x14f8, 0x6000 },
+  { 0x8700, 0x14e8, 0x5000 },
+  { 0x8700, 0x14e0, 0x4000 },
+  { 0x8700, 0x14dc, 0x3000 },
+  { 0x8700, 0x14da, 0x2000 },
+  { 0x0700, 0x14d9, 0x0000 },
+  { 0x0700, 0x14db, 0x0000 },
+  { 0x8700, 0x14de, 0x2000 },
+  { 0x0700, 0x14dd, 0x0000 },
+  { 0x0700, 0x14df, 0x0000 },
+  { 0x8700, 0x14e4, 0x3000 },
+  { 0x8700, 0x14e2, 0x2000 },
+  { 0x0700, 0x14e1, 0x0000 },
+  { 0x0700, 0x14e3, 0x0000 },
+  { 0x8700, 0x14e6, 0x2000 },
+  { 0x0700, 0x14e5, 0x0000 },
+  { 0x0700, 0x14e7, 0x0000 },
+  { 0x8700, 0x14f0, 0x4000 },
+  { 0x8700, 0x14ec, 0x3000 },
+  { 0x8700, 0x14ea, 0x2000 },
+  { 0x0700, 0x14e9, 0x0000 },
+  { 0x0700, 0x14eb, 0x0000 },
+  { 0x8700, 0x14ee, 0x2000 },
+  { 0x0700, 0x14ed, 0x0000 },
+  { 0x0700, 0x14ef, 0x0000 },
+  { 0x8700, 0x14f4, 0x3000 },
+  { 0x8700, 0x14f2, 0x2000 },
+  { 0x0700, 0x14f1, 0x0000 },
+  { 0x0700, 0x14f3, 0x0000 },
+  { 0x8700, 0x14f6, 0x2000 },
+  { 0x0700, 0x14f5, 0x0000 },
+  { 0x0700, 0x14f7, 0x0000 },
+  { 0x8700, 0x1508, 0x5000 },
+  { 0x8700, 0x1500, 0x4000 },
+  { 0x8700, 0x14fc, 0x3000 },
+  { 0x8700, 0x14fa, 0x2000 },
+  { 0x0700, 0x14f9, 0x0000 },
+  { 0x0700, 0x14fb, 0x0000 },
+  { 0x8700, 0x14fe, 0x2000 },
+  { 0x0700, 0x14fd, 0x0000 },
+  { 0x0700, 0x14ff, 0x0000 },
+  { 0x8700, 0x1504, 0x3000 },
+  { 0x8700, 0x1502, 0x2000 },
+  { 0x0700, 0x1501, 0x0000 },
+  { 0x0700, 0x1503, 0x0000 },
+  { 0x8700, 0x1506, 0x2000 },
+  { 0x0700, 0x1505, 0x0000 },
+  { 0x0700, 0x1507, 0x0000 },
+  { 0x8700, 0x1510, 0x4000 },
+  { 0x8700, 0x150c, 0x3000 },
+  { 0x8700, 0x150a, 0x2000 },
+  { 0x0700, 0x1509, 0x0000 },
+  { 0x0700, 0x150b, 0x0000 },
+  { 0x8700, 0x150e, 0x2000 },
+  { 0x0700, 0x150d, 0x0000 },
+  { 0x0700, 0x150f, 0x0000 },
+  { 0x8700, 0x1514, 0x3000 },
+  { 0x8700, 0x1512, 0x2000 },
+  { 0x0700, 0x1511, 0x0000 },
+  { 0x0700, 0x1513, 0x0000 },
+  { 0x8700, 0x1516, 0x2000 },
+  { 0x0700, 0x1515, 0x0000 },
+  { 0x0700, 0x1517, 0x0000 },
+  { 0x8700, 0x1538, 0x6000 },
+  { 0x8700, 0x1528, 0x5000 },
+  { 0x8700, 0x1520, 0x4000 },
+  { 0x8700, 0x151c, 0x3000 },
+  { 0x8700, 0x151a, 0x2000 },
+  { 0x0700, 0x1519, 0x0000 },
+  { 0x0700, 0x151b, 0x0000 },
+  { 0x8700, 0x151e, 0x2000 },
+  { 0x0700, 0x151d, 0x0000 },
+  { 0x0700, 0x151f, 0x0000 },
+  { 0x8700, 0x1524, 0x3000 },
+  { 0x8700, 0x1522, 0x2000 },
+  { 0x0700, 0x1521, 0x0000 },
+  { 0x0700, 0x1523, 0x0000 },
+  { 0x8700, 0x1526, 0x2000 },
+  { 0x0700, 0x1525, 0x0000 },
+  { 0x0700, 0x1527, 0x0000 },
+  { 0x8700, 0x1530, 0x4000 },
+  { 0x8700, 0x152c, 0x3000 },
+  { 0x8700, 0x152a, 0x2000 },
+  { 0x0700, 0x1529, 0x0000 },
+  { 0x0700, 0x152b, 0x0000 },
+  { 0x8700, 0x152e, 0x2000 },
+  { 0x0700, 0x152d, 0x0000 },
+  { 0x0700, 0x152f, 0x0000 },
+  { 0x8700, 0x1534, 0x3000 },
+  { 0x8700, 0x1532, 0x2000 },
+  { 0x0700, 0x1531, 0x0000 },
+  { 0x0700, 0x1533, 0x0000 },
+  { 0x8700, 0x1536, 0x2000 },
+  { 0x0700, 0x1535, 0x0000 },
+  { 0x0700, 0x1537, 0x0000 },
+  { 0x8700, 0x1548, 0x5000 },
+  { 0x8700, 0x1540, 0x4000 },
+  { 0x8700, 0x153c, 0x3000 },
+  { 0x8700, 0x153a, 0x2000 },
+  { 0x0700, 0x1539, 0x0000 },
+  { 0x0700, 0x153b, 0x0000 },
+  { 0x8700, 0x153e, 0x2000 },
+  { 0x0700, 0x153d, 0x0000 },
+  { 0x0700, 0x153f, 0x0000 },
+  { 0x8700, 0x1544, 0x3000 },
+  { 0x8700, 0x1542, 0x2000 },
+  { 0x0700, 0x1541, 0x0000 },
+  { 0x0700, 0x1543, 0x0000 },
+  { 0x8700, 0x1546, 0x2000 },
+  { 0x0700, 0x1545, 0x0000 },
+  { 0x0700, 0x1547, 0x0000 },
+  { 0x8700, 0x1550, 0x4000 },
+  { 0x8700, 0x154c, 0x3000 },
+  { 0x8700, 0x154a, 0x2000 },
+  { 0x0700, 0x1549, 0x0000 },
+  { 0x0700, 0x154b, 0x0000 },
+  { 0x8700, 0x154e, 0x2000 },
+  { 0x0700, 0x154d, 0x0000 },
+  { 0x0700, 0x154f, 0x0000 },
+  { 0x8700, 0x1554, 0x3000 },
+  { 0x8700, 0x1552, 0x2000 },
+  { 0x0700, 0x1551, 0x0000 },
+  { 0x0700, 0x1553, 0x0000 },
+  { 0x8700, 0x1556, 0x2000 },
+  { 0x0700, 0x1555, 0x0000 },
+  { 0x0700, 0x1557, 0x0000 },
+  { 0x9900, 0x22ae, 0xc000 },
+  { 0x8900, 0x1e24, 0xb001 },
+  { 0x8700, 0x17a2, 0xa000 },
+  { 0x8700, 0x1658, 0x9000 },
+  { 0x8700, 0x15d8, 0x8000 },
+  { 0x8700, 0x1598, 0x7000 },
+  { 0x8700, 0x1578, 0x6000 },
+  { 0x8700, 0x1568, 0x5000 },
+  { 0x8700, 0x1560, 0x4000 },
+  { 0x8700, 0x155c, 0x3000 },
+  { 0x8700, 0x155a, 0x2000 },
+  { 0x0700, 0x1559, 0x0000 },
+  { 0x0700, 0x155b, 0x0000 },
+  { 0x8700, 0x155e, 0x2000 },
+  { 0x0700, 0x155d, 0x0000 },
+  { 0x0700, 0x155f, 0x0000 },
+  { 0x8700, 0x1564, 0x3000 },
+  { 0x8700, 0x1562, 0x2000 },
+  { 0x0700, 0x1561, 0x0000 },
+  { 0x0700, 0x1563, 0x0000 },
+  { 0x8700, 0x1566, 0x2000 },
+  { 0x0700, 0x1565, 0x0000 },
+  { 0x0700, 0x1567, 0x0000 },
+  { 0x8700, 0x1570, 0x4000 },
+  { 0x8700, 0x156c, 0x3000 },
+  { 0x8700, 0x156a, 0x2000 },
+  { 0x0700, 0x1569, 0x0000 },
+  { 0x0700, 0x156b, 0x0000 },
+  { 0x8700, 0x156e, 0x2000 },
+  { 0x0700, 0x156d, 0x0000 },
+  { 0x0700, 0x156f, 0x0000 },
+  { 0x8700, 0x1574, 0x3000 },
+  { 0x8700, 0x1572, 0x2000 },
+  { 0x0700, 0x1571, 0x0000 },
+  { 0x0700, 0x1573, 0x0000 },
+  { 0x8700, 0x1576, 0x2000 },
+  { 0x0700, 0x1575, 0x0000 },
+  { 0x0700, 0x1577, 0x0000 },
+  { 0x8700, 0x1588, 0x5000 },
+  { 0x8700, 0x1580, 0x4000 },
+  { 0x8700, 0x157c, 0x3000 },
+  { 0x8700, 0x157a, 0x2000 },
+  { 0x0700, 0x1579, 0x0000 },
+  { 0x0700, 0x157b, 0x0000 },
+  { 0x8700, 0x157e, 0x2000 },
+  { 0x0700, 0x157d, 0x0000 },
+  { 0x0700, 0x157f, 0x0000 },
+  { 0x8700, 0x1584, 0x3000 },
+  { 0x8700, 0x1582, 0x2000 },
+  { 0x0700, 0x1581, 0x0000 },
+  { 0x0700, 0x1583, 0x0000 },
+  { 0x8700, 0x1586, 0x2000 },
+  { 0x0700, 0x1585, 0x0000 },
+  { 0x0700, 0x1587, 0x0000 },
+  { 0x8700, 0x1590, 0x4000 },
+  { 0x8700, 0x158c, 0x3000 },
+  { 0x8700, 0x158a, 0x2000 },
+  { 0x0700, 0x1589, 0x0000 },
+  { 0x0700, 0x158b, 0x0000 },
+  { 0x8700, 0x158e, 0x2000 },
+  { 0x0700, 0x158d, 0x0000 },
+  { 0x0700, 0x158f, 0x0000 },
+  { 0x8700, 0x1594, 0x3000 },
+  { 0x8700, 0x1592, 0x2000 },
+  { 0x0700, 0x1591, 0x0000 },
+  { 0x0700, 0x1593, 0x0000 },
+  { 0x8700, 0x1596, 0x2000 },
+  { 0x0700, 0x1595, 0x0000 },
+  { 0x0700, 0x1597, 0x0000 },
+  { 0x8700, 0x15b8, 0x6000 },
+  { 0x8700, 0x15a8, 0x5000 },
+  { 0x8700, 0x15a0, 0x4000 },
+  { 0x8700, 0x159c, 0x3000 },
+  { 0x8700, 0x159a, 0x2000 },
+  { 0x0700, 0x1599, 0x0000 },
+  { 0x0700, 0x159b, 0x0000 },
+  { 0x8700, 0x159e, 0x2000 },
+  { 0x0700, 0x159d, 0x0000 },
+  { 0x0700, 0x159f, 0x0000 },
+  { 0x8700, 0x15a4, 0x3000 },
+  { 0x8700, 0x15a2, 0x2000 },
+  { 0x0700, 0x15a1, 0x0000 },
+  { 0x0700, 0x15a3, 0x0000 },
+  { 0x8700, 0x15a6, 0x2000 },
+  { 0x0700, 0x15a5, 0x0000 },
+  { 0x0700, 0x15a7, 0x0000 },
+  { 0x8700, 0x15b0, 0x4000 },
+  { 0x8700, 0x15ac, 0x3000 },
+  { 0x8700, 0x15aa, 0x2000 },
+  { 0x0700, 0x15a9, 0x0000 },
+  { 0x0700, 0x15ab, 0x0000 },
+  { 0x8700, 0x15ae, 0x2000 },
+  { 0x0700, 0x15ad, 0x0000 },
+  { 0x0700, 0x15af, 0x0000 },
+  { 0x8700, 0x15b4, 0x3000 },
+  { 0x8700, 0x15b2, 0x2000 },
+  { 0x0700, 0x15b1, 0x0000 },
+  { 0x0700, 0x15b3, 0x0000 },
+  { 0x8700, 0x15b6, 0x2000 },
+  { 0x0700, 0x15b5, 0x0000 },
+  { 0x0700, 0x15b7, 0x0000 },
+  { 0x8700, 0x15c8, 0x5000 },
+  { 0x8700, 0x15c0, 0x4000 },
+  { 0x8700, 0x15bc, 0x3000 },
+  { 0x8700, 0x15ba, 0x2000 },
+  { 0x0700, 0x15b9, 0x0000 },
+  { 0x0700, 0x15bb, 0x0000 },
+  { 0x8700, 0x15be, 0x2000 },
+  { 0x0700, 0x15bd, 0x0000 },
+  { 0x0700, 0x15bf, 0x0000 },
+  { 0x8700, 0x15c4, 0x3000 },
+  { 0x8700, 0x15c2, 0x2000 },
+  { 0x0700, 0x15c1, 0x0000 },
+  { 0x0700, 0x15c3, 0x0000 },
+  { 0x8700, 0x15c6, 0x2000 },
+  { 0x0700, 0x15c5, 0x0000 },
+  { 0x0700, 0x15c7, 0x0000 },
+  { 0x8700, 0x15d0, 0x4000 },
+  { 0x8700, 0x15cc, 0x3000 },
+  { 0x8700, 0x15ca, 0x2000 },
+  { 0x0700, 0x15c9, 0x0000 },
+  { 0x0700, 0x15cb, 0x0000 },
+  { 0x8700, 0x15ce, 0x2000 },
+  { 0x0700, 0x15cd, 0x0000 },
+  { 0x0700, 0x15cf, 0x0000 },
+  { 0x8700, 0x15d4, 0x3000 },
+  { 0x8700, 0x15d2, 0x2000 },
+  { 0x0700, 0x15d1, 0x0000 },
+  { 0x0700, 0x15d3, 0x0000 },
+  { 0x8700, 0x15d6, 0x2000 },
+  { 0x0700, 0x15d5, 0x0000 },
+  { 0x0700, 0x15d7, 0x0000 },
+  { 0x8700, 0x1618, 0x7000 },
+  { 0x8700, 0x15f8, 0x6000 },
+  { 0x8700, 0x15e8, 0x5000 },
+  { 0x8700, 0x15e0, 0x4000 },
+  { 0x8700, 0x15dc, 0x3000 },
+  { 0x8700, 0x15da, 0x2000 },
+  { 0x0700, 0x15d9, 0x0000 },
+  { 0x0700, 0x15db, 0x0000 },
+  { 0x8700, 0x15de, 0x2000 },
+  { 0x0700, 0x15dd, 0x0000 },
+  { 0x0700, 0x15df, 0x0000 },
+  { 0x8700, 0x15e4, 0x3000 },
+  { 0x8700, 0x15e2, 0x2000 },
+  { 0x0700, 0x15e1, 0x0000 },
+  { 0x0700, 0x15e3, 0x0000 },
+  { 0x8700, 0x15e6, 0x2000 },
+  { 0x0700, 0x15e5, 0x0000 },
+  { 0x0700, 0x15e7, 0x0000 },
+  { 0x8700, 0x15f0, 0x4000 },
+  { 0x8700, 0x15ec, 0x3000 },
+  { 0x8700, 0x15ea, 0x2000 },
+  { 0x0700, 0x15e9, 0x0000 },
+  { 0x0700, 0x15eb, 0x0000 },
+  { 0x8700, 0x15ee, 0x2000 },
+  { 0x0700, 0x15ed, 0x0000 },
+  { 0x0700, 0x15ef, 0x0000 },
+  { 0x8700, 0x15f4, 0x3000 },
+  { 0x8700, 0x15f2, 0x2000 },
+  { 0x0700, 0x15f1, 0x0000 },
+  { 0x0700, 0x15f3, 0x0000 },
+  { 0x8700, 0x15f6, 0x2000 },
+  { 0x0700, 0x15f5, 0x0000 },
+  { 0x0700, 0x15f7, 0x0000 },
+  { 0x8700, 0x1608, 0x5000 },
+  { 0x8700, 0x1600, 0x4000 },
+  { 0x8700, 0x15fc, 0x3000 },
+  { 0x8700, 0x15fa, 0x2000 },
+  { 0x0700, 0x15f9, 0x0000 },
+  { 0x0700, 0x15fb, 0x0000 },
+  { 0x8700, 0x15fe, 0x2000 },
+  { 0x0700, 0x15fd, 0x0000 },
+  { 0x0700, 0x15ff, 0x0000 },
+  { 0x8700, 0x1604, 0x3000 },
+  { 0x8700, 0x1602, 0x2000 },
+  { 0x0700, 0x1601, 0x0000 },
+  { 0x0700, 0x1603, 0x0000 },
+  { 0x8700, 0x1606, 0x2000 },
+  { 0x0700, 0x1605, 0x0000 },
+  { 0x0700, 0x1607, 0x0000 },
+  { 0x8700, 0x1610, 0x4000 },
+  { 0x8700, 0x160c, 0x3000 },
+  { 0x8700, 0x160a, 0x2000 },
+  { 0x0700, 0x1609, 0x0000 },
+  { 0x0700, 0x160b, 0x0000 },
+  { 0x8700, 0x160e, 0x2000 },
+  { 0x0700, 0x160d, 0x0000 },
+  { 0x0700, 0x160f, 0x0000 },
+  { 0x8700, 0x1614, 0x3000 },
+  { 0x8700, 0x1612, 0x2000 },
+  { 0x0700, 0x1611, 0x0000 },
+  { 0x0700, 0x1613, 0x0000 },
+  { 0x8700, 0x1616, 0x2000 },
+  { 0x0700, 0x1615, 0x0000 },
+  { 0x0700, 0x1617, 0x0000 },
+  { 0x8700, 0x1638, 0x6000 },
+  { 0x8700, 0x1628, 0x5000 },
+  { 0x8700, 0x1620, 0x4000 },
+  { 0x8700, 0x161c, 0x3000 },
+  { 0x8700, 0x161a, 0x2000 },
+  { 0x0700, 0x1619, 0x0000 },
+  { 0x0700, 0x161b, 0x0000 },
+  { 0x8700, 0x161e, 0x2000 },
+  { 0x0700, 0x161d, 0x0000 },
+  { 0x0700, 0x161f, 0x0000 },
+  { 0x8700, 0x1624, 0x3000 },
+  { 0x8700, 0x1622, 0x2000 },
+  { 0x0700, 0x1621, 0x0000 },
+  { 0x0700, 0x1623, 0x0000 },
+  { 0x8700, 0x1626, 0x2000 },
+  { 0x0700, 0x1625, 0x0000 },
+  { 0x0700, 0x1627, 0x0000 },
+  { 0x8700, 0x1630, 0x4000 },
+  { 0x8700, 0x162c, 0x3000 },
+  { 0x8700, 0x162a, 0x2000 },
+  { 0x0700, 0x1629, 0x0000 },
+  { 0x0700, 0x162b, 0x0000 },
+  { 0x8700, 0x162e, 0x2000 },
+  { 0x0700, 0x162d, 0x0000 },
+  { 0x0700, 0x162f, 0x0000 },
+  { 0x8700, 0x1634, 0x3000 },
+  { 0x8700, 0x1632, 0x2000 },
+  { 0x0700, 0x1631, 0x0000 },
+  { 0x0700, 0x1633, 0x0000 },
+  { 0x8700, 0x1636, 0x2000 },
+  { 0x0700, 0x1635, 0x0000 },
+  { 0x0700, 0x1637, 0x0000 },
+  { 0x8700, 0x1648, 0x5000 },
+  { 0x8700, 0x1640, 0x4000 },
+  { 0x8700, 0x163c, 0x3000 },
+  { 0x8700, 0x163a, 0x2000 },
+  { 0x0700, 0x1639, 0x0000 },
+  { 0x0700, 0x163b, 0x0000 },
+  { 0x8700, 0x163e, 0x2000 },
+  { 0x0700, 0x163d, 0x0000 },
+  { 0x0700, 0x163f, 0x0000 },
+  { 0x8700, 0x1644, 0x3000 },
+  { 0x8700, 0x1642, 0x2000 },
+  { 0x0700, 0x1641, 0x0000 },
+  { 0x0700, 0x1643, 0x0000 },
+  { 0x8700, 0x1646, 0x2000 },
+  { 0x0700, 0x1645, 0x0000 },
+  { 0x0700, 0x1647, 0x0000 },
+  { 0x8700, 0x1650, 0x4000 },
+  { 0x8700, 0x164c, 0x3000 },
+  { 0x8700, 0x164a, 0x2000 },
+  { 0x0700, 0x1649, 0x0000 },
+  { 0x0700, 0x164b, 0x0000 },
+  { 0x8700, 0x164e, 0x2000 },
+  { 0x0700, 0x164d, 0x0000 },
+  { 0x0700, 0x164f, 0x0000 },
+  { 0x8700, 0x1654, 0x3000 },
+  { 0x8700, 0x1652, 0x2000 },
+  { 0x0700, 0x1651, 0x0000 },
+  { 0x0700, 0x1653, 0x0000 },
+  { 0x8700, 0x1656, 0x2000 },
+  { 0x0700, 0x1655, 0x0000 },
+  { 0x0700, 0x1657, 0x0000 },
+  { 0x8700, 0x16e4, 0x8000 },
+  { 0x8700, 0x16a4, 0x7000 },
+  { 0x8700, 0x1681, 0x6000 },
+  { 0x8700, 0x1668, 0x5000 },
+  { 0x8700, 0x1660, 0x4000 },
+  { 0x8700, 0x165c, 0x3000 },
+  { 0x8700, 0x165a, 0x2000 },
+  { 0x0700, 0x1659, 0x0000 },
+  { 0x0700, 0x165b, 0x0000 },
+  { 0x8700, 0x165e, 0x2000 },
+  { 0x0700, 0x165d, 0x0000 },
+  { 0x0700, 0x165f, 0x0000 },
+  { 0x8700, 0x1664, 0x3000 },
+  { 0x8700, 0x1662, 0x2000 },
+  { 0x0700, 0x1661, 0x0000 },
+  { 0x0700, 0x1663, 0x0000 },
+  { 0x8700, 0x1666, 0x2000 },
+  { 0x0700, 0x1665, 0x0000 },
+  { 0x0700, 0x1667, 0x0000 },
+  { 0x8700, 0x1670, 0x4000 },
+  { 0x8700, 0x166c, 0x3000 },
+  { 0x8700, 0x166a, 0x2000 },
+  { 0x0700, 0x1669, 0x0000 },
+  { 0x0700, 0x166b, 0x0000 },
+  { 0x9500, 0x166e, 0x2000 },
+  { 0x1500, 0x166d, 0x0000 },
+  { 0x0700, 0x166f, 0x0000 },
+  { 0x8700, 0x1674, 0x3000 },
+  { 0x8700, 0x1672, 0x2000 },
+  { 0x0700, 0x1671, 0x0000 },
+  { 0x0700, 0x1673, 0x0000 },
+  { 0x8700, 0x1676, 0x2000 },
+  { 0x0700, 0x1675, 0x0000 },
+  { 0x1d00, 0x1680, 0x0000 },
+  { 0x8700, 0x1691, 0x5000 },
+  { 0x8700, 0x1689, 0x4000 },
+  { 0x8700, 0x1685, 0x3000 },
+  { 0x8700, 0x1683, 0x2000 },
+  { 0x0700, 0x1682, 0x0000 },
+  { 0x0700, 0x1684, 0x0000 },
+  { 0x8700, 0x1687, 0x2000 },
+  { 0x0700, 0x1686, 0x0000 },
+  { 0x0700, 0x1688, 0x0000 },
+  { 0x8700, 0x168d, 0x3000 },
+  { 0x8700, 0x168b, 0x2000 },
+  { 0x0700, 0x168a, 0x0000 },
+  { 0x0700, 0x168c, 0x0000 },
+  { 0x8700, 0x168f, 0x2000 },
+  { 0x0700, 0x168e, 0x0000 },
+  { 0x0700, 0x1690, 0x0000 },
+  { 0x8700, 0x1699, 0x4000 },
+  { 0x8700, 0x1695, 0x3000 },
+  { 0x8700, 0x1693, 0x2000 },
+  { 0x0700, 0x1692, 0x0000 },
+  { 0x0700, 0x1694, 0x0000 },
+  { 0x8700, 0x1697, 0x2000 },
+  { 0x0700, 0x1696, 0x0000 },
+  { 0x0700, 0x1698, 0x0000 },
+  { 0x8700, 0x16a0, 0x3000 },
+  { 0x9600, 0x169b, 0x2000 },
+  { 0x0700, 0x169a, 0x0000 },
+  { 0x1200, 0x169c, 0x0000 },
+  { 0x8700, 0x16a2, 0x2000 },
+  { 0x0700, 0x16a1, 0x0000 },
+  { 0x0700, 0x16a3, 0x0000 },
+  { 0x8700, 0x16c4, 0x6000 },
+  { 0x8700, 0x16b4, 0x5000 },
+  { 0x8700, 0x16ac, 0x4000 },
+  { 0x8700, 0x16a8, 0x3000 },
+  { 0x8700, 0x16a6, 0x2000 },
+  { 0x0700, 0x16a5, 0x0000 },
+  { 0x0700, 0x16a7, 0x0000 },
+  { 0x8700, 0x16aa, 0x2000 },
+  { 0x0700, 0x16a9, 0x0000 },
+  { 0x0700, 0x16ab, 0x0000 },
+  { 0x8700, 0x16b0, 0x3000 },
+  { 0x8700, 0x16ae, 0x2000 },
+  { 0x0700, 0x16ad, 0x0000 },
+  { 0x0700, 0x16af, 0x0000 },
+  { 0x8700, 0x16b2, 0x2000 },
+  { 0x0700, 0x16b1, 0x0000 },
+  { 0x0700, 0x16b3, 0x0000 },
+  { 0x8700, 0x16bc, 0x4000 },
+  { 0x8700, 0x16b8, 0x3000 },
+  { 0x8700, 0x16b6, 0x2000 },
+  { 0x0700, 0x16b5, 0x0000 },
+  { 0x0700, 0x16b7, 0x0000 },
+  { 0x8700, 0x16ba, 0x2000 },
+  { 0x0700, 0x16b9, 0x0000 },
+  { 0x0700, 0x16bb, 0x0000 },
+  { 0x8700, 0x16c0, 0x3000 },
+  { 0x8700, 0x16be, 0x2000 },
+  { 0x0700, 0x16bd, 0x0000 },
+  { 0x0700, 0x16bf, 0x0000 },
+  { 0x8700, 0x16c2, 0x2000 },
+  { 0x0700, 0x16c1, 0x0000 },
+  { 0x0700, 0x16c3, 0x0000 },
+  { 0x8700, 0x16d4, 0x5000 },
+  { 0x8700, 0x16cc, 0x4000 },
+  { 0x8700, 0x16c8, 0x3000 },
+  { 0x8700, 0x16c6, 0x2000 },
+  { 0x0700, 0x16c5, 0x0000 },
+  { 0x0700, 0x16c7, 0x0000 },
+  { 0x8700, 0x16ca, 0x2000 },
+  { 0x0700, 0x16c9, 0x0000 },
+  { 0x0700, 0x16cb, 0x0000 },
+  { 0x8700, 0x16d0, 0x3000 },
+  { 0x8700, 0x16ce, 0x2000 },
+  { 0x0700, 0x16cd, 0x0000 },
+  { 0x0700, 0x16cf, 0x0000 },
+  { 0x8700, 0x16d2, 0x2000 },
+  { 0x0700, 0x16d1, 0x0000 },
+  { 0x0700, 0x16d3, 0x0000 },
+  { 0x8700, 0x16dc, 0x4000 },
+  { 0x8700, 0x16d8, 0x3000 },
+  { 0x8700, 0x16d6, 0x2000 },
+  { 0x0700, 0x16d5, 0x0000 },
+  { 0x0700, 0x16d7, 0x0000 },
+  { 0x8700, 0x16da, 0x2000 },
+  { 0x0700, 0x16d9, 0x0000 },
+  { 0x0700, 0x16db, 0x0000 },
+  { 0x8700, 0x16e0, 0x3000 },
+  { 0x8700, 0x16de, 0x2000 },
+  { 0x0700, 0x16dd, 0x0000 },
+  { 0x0700, 0x16df, 0x0000 },
+  { 0x8700, 0x16e2, 0x2000 },
+  { 0x0700, 0x16e1, 0x0000 },
+  { 0x0700, 0x16e3, 0x0000 },
+  { 0x8700, 0x1748, 0x7000 },
+  { 0x8c00, 0x1714, 0x6000 },
+  { 0x8700, 0x1703, 0x5000 },
+  { 0x9500, 0x16ec, 0x4000 },
+  { 0x8700, 0x16e8, 0x3000 },
+  { 0x8700, 0x16e6, 0x2000 },
+  { 0x0700, 0x16e5, 0x0000 },
+  { 0x0700, 0x16e7, 0x0000 },
+  { 0x8700, 0x16ea, 0x2000 },
+  { 0x0700, 0x16e9, 0x0000 },
+  { 0x1500, 0x16eb, 0x0000 },
+  { 0x8e00, 0x16f0, 0x3000 },
+  { 0x8e00, 0x16ee, 0x2000 },
+  { 0x1500, 0x16ed, 0x0000 },
+  { 0x0e00, 0x16ef, 0x0000 },
+  { 0x8700, 0x1701, 0x2000 },
+  { 0x0700, 0x1700, 0x0000 },
+  { 0x0700, 0x1702, 0x0000 },
+  { 0x8700, 0x170b, 0x4000 },
+  { 0x8700, 0x1707, 0x3000 },
+  { 0x8700, 0x1705, 0x2000 },
+  { 0x0700, 0x1704, 0x0000 },
+  { 0x0700, 0x1706, 0x0000 },
+  { 0x8700, 0x1709, 0x2000 },
+  { 0x0700, 0x1708, 0x0000 },
+  { 0x0700, 0x170a, 0x0000 },
+  { 0x8700, 0x1710, 0x3000 },
+  { 0x8700, 0x170e, 0x2000 },
+  { 0x0700, 0x170c, 0x0000 },
+  { 0x0700, 0x170f, 0x0000 },
+  { 0x8c00, 0x1712, 0x2000 },
+  { 0x0700, 0x1711, 0x0000 },
+  { 0x0c00, 0x1713, 0x0000 },
+  { 0x8700, 0x172f, 0x5000 },
+  { 0x8700, 0x1727, 0x4000 },
+  { 0x8700, 0x1723, 0x3000 },
+  { 0x8700, 0x1721, 0x2000 },
+  { 0x0700, 0x1720, 0x0000 },
+  { 0x0700, 0x1722, 0x0000 },
+  { 0x8700, 0x1725, 0x2000 },
+  { 0x0700, 0x1724, 0x0000 },
+  { 0x0700, 0x1726, 0x0000 },
+  { 0x8700, 0x172b, 0x3000 },
+  { 0x8700, 0x1729, 0x2000 },
+  { 0x0700, 0x1728, 0x0000 },
+  { 0x0700, 0x172a, 0x0000 },
+  { 0x8700, 0x172d, 0x2000 },
+  { 0x0700, 0x172c, 0x0000 },
+  { 0x0700, 0x172e, 0x0000 },
+  { 0x8700, 0x1740, 0x4000 },
+  { 0x8c00, 0x1733, 0x3000 },
+  { 0x8700, 0x1731, 0x2000 },
+  { 0x0700, 0x1730, 0x0000 },
+  { 0x0c00, 0x1732, 0x0000 },
+  { 0x9500, 0x1735, 0x2000 },
+  { 0x0c00, 0x1734, 0x0000 },
+  { 0x1500, 0x1736, 0x0000 },
+  { 0x8700, 0x1744, 0x3000 },
+  { 0x8700, 0x1742, 0x2000 },
+  { 0x0700, 0x1741, 0x0000 },
+  { 0x0700, 0x1743, 0x0000 },
+  { 0x8700, 0x1746, 0x2000 },
+  { 0x0700, 0x1745, 0x0000 },
+  { 0x0700, 0x1747, 0x0000 },
+  { 0x8700, 0x1782, 0x6000 },
+  { 0x8700, 0x1764, 0x5000 },
+  { 0x8700, 0x1750, 0x4000 },
+  { 0x8700, 0x174c, 0x3000 },
+  { 0x8700, 0x174a, 0x2000 },
+  { 0x0700, 0x1749, 0x0000 },
+  { 0x0700, 0x174b, 0x0000 },
+  { 0x8700, 0x174e, 0x2000 },
+  { 0x0700, 0x174d, 0x0000 },
+  { 0x0700, 0x174f, 0x0000 },
+  { 0x8700, 0x1760, 0x3000 },
+  { 0x8c00, 0x1752, 0x2000 },
+  { 0x0700, 0x1751, 0x0000 },
+  { 0x0c00, 0x1753, 0x0000 },
+  { 0x8700, 0x1762, 0x2000 },
+  { 0x0700, 0x1761, 0x0000 },
+  { 0x0700, 0x1763, 0x0000 },
+  { 0x8700, 0x176c, 0x4000 },
+  { 0x8700, 0x1768, 0x3000 },
+  { 0x8700, 0x1766, 0x2000 },
+  { 0x0700, 0x1765, 0x0000 },
+  { 0x0700, 0x1767, 0x0000 },
+  { 0x8700, 0x176a, 0x2000 },
+  { 0x0700, 0x1769, 0x0000 },
+  { 0x0700, 0x176b, 0x0000 },
+  { 0x8c00, 0x1772, 0x3000 },
+  { 0x8700, 0x176f, 0x2000 },
+  { 0x0700, 0x176e, 0x0000 },
+  { 0x0700, 0x1770, 0x0000 },
+  { 0x8700, 0x1780, 0x2000 },
+  { 0x0c00, 0x1773, 0x0000 },
+  { 0x0700, 0x1781, 0x0000 },
+  { 0x8700, 0x1792, 0x5000 },
+  { 0x8700, 0x178a, 0x4000 },
+  { 0x8700, 0x1786, 0x3000 },
+  { 0x8700, 0x1784, 0x2000 },
+  { 0x0700, 0x1783, 0x0000 },
+  { 0x0700, 0x1785, 0x0000 },
+  { 0x8700, 0x1788, 0x2000 },
+  { 0x0700, 0x1787, 0x0000 },
+  { 0x0700, 0x1789, 0x0000 },
+  { 0x8700, 0x178e, 0x3000 },
+  { 0x8700, 0x178c, 0x2000 },
+  { 0x0700, 0x178b, 0x0000 },
+  { 0x0700, 0x178d, 0x0000 },
+  { 0x8700, 0x1790, 0x2000 },
+  { 0x0700, 0x178f, 0x0000 },
+  { 0x0700, 0x1791, 0x0000 },
+  { 0x8700, 0x179a, 0x4000 },
+  { 0x8700, 0x1796, 0x3000 },
+  { 0x8700, 0x1794, 0x2000 },
+  { 0x0700, 0x1793, 0x0000 },
+  { 0x0700, 0x1795, 0x0000 },
+  { 0x8700, 0x1798, 0x2000 },
+  { 0x0700, 0x1797, 0x0000 },
+  { 0x0700, 0x1799, 0x0000 },
+  { 0x8700, 0x179e, 0x3000 },
+  { 0x8700, 0x179c, 0x2000 },
+  { 0x0700, 0x179b, 0x0000 },
+  { 0x0700, 0x179d, 0x0000 },
+  { 0x8700, 0x17a0, 0x2000 },
+  { 0x0700, 0x179f, 0x0000 },
+  { 0x0700, 0x17a1, 0x0000 },
+  { 0x8700, 0x1915, 0x9000 },
+  { 0x8700, 0x1837, 0x8000 },
+  { 0x8d00, 0x17e4, 0x7000 },
+  { 0x8a00, 0x17c2, 0x6000 },
+  { 0x8700, 0x17b2, 0x5000 },
+  { 0x8700, 0x17aa, 0x4000 },
+  { 0x8700, 0x17a6, 0x3000 },
+  { 0x8700, 0x17a4, 0x2000 },
+  { 0x0700, 0x17a3, 0x0000 },
+  { 0x0700, 0x17a5, 0x0000 },
+  { 0x8700, 0x17a8, 0x2000 },
+  { 0x0700, 0x17a7, 0x0000 },
+  { 0x0700, 0x17a9, 0x0000 },
+  { 0x8700, 0x17ae, 0x3000 },
+  { 0x8700, 0x17ac, 0x2000 },
+  { 0x0700, 0x17ab, 0x0000 },
+  { 0x0700, 0x17ad, 0x0000 },
+  { 0x8700, 0x17b0, 0x2000 },
+  { 0x0700, 0x17af, 0x0000 },
+  { 0x0700, 0x17b1, 0x0000 },
+  { 0x8c00, 0x17ba, 0x4000 },
+  { 0x8a00, 0x17b6, 0x3000 },
+  { 0x8100, 0x17b4, 0x2000 },
+  { 0x0700, 0x17b3, 0x0000 },
+  { 0x0100, 0x17b5, 0x0000 },
+  { 0x8c00, 0x17b8, 0x2000 },
+  { 0x0c00, 0x17b7, 0x0000 },
+  { 0x0c00, 0x17b9, 0x0000 },
+  { 0x8a00, 0x17be, 0x3000 },
+  { 0x8c00, 0x17bc, 0x2000 },
+  { 0x0c00, 0x17bb, 0x0000 },
+  { 0x0c00, 0x17bd, 0x0000 },
+  { 0x8a00, 0x17c0, 0x2000 },
+  { 0x0a00, 0x17bf, 0x0000 },
+  { 0x0a00, 0x17c1, 0x0000 },
+  { 0x8c00, 0x17d2, 0x5000 },
+  { 0x8c00, 0x17ca, 0x4000 },
+  { 0x8c00, 0x17c6, 0x3000 },
+  { 0x8a00, 0x17c4, 0x2000 },
+  { 0x0a00, 0x17c3, 0x0000 },
+  { 0x0a00, 0x17c5, 0x0000 },
+  { 0x8a00, 0x17c8, 0x2000 },
+  { 0x0a00, 0x17c7, 0x0000 },
+  { 0x0c00, 0x17c9, 0x0000 },
+  { 0x8c00, 0x17ce, 0x3000 },
+  { 0x8c00, 0x17cc, 0x2000 },
+  { 0x0c00, 0x17cb, 0x0000 },
+  { 0x0c00, 0x17cd, 0x0000 },
+  { 0x8c00, 0x17d0, 0x2000 },
+  { 0x0c00, 0x17cf, 0x0000 },
+  { 0x0c00, 0x17d1, 0x0000 },
+  { 0x9500, 0x17da, 0x4000 },
+  { 0x9500, 0x17d6, 0x3000 },
+  { 0x9500, 0x17d4, 0x2000 },
+  { 0x0c00, 0x17d3, 0x0000 },
+  { 0x1500, 0x17d5, 0x0000 },
+  { 0x9500, 0x17d8, 0x2000 },
+  { 0x0600, 0x17d7, 0x0000 },
+  { 0x1500, 0x17d9, 0x0000 },
+  { 0x8d00, 0x17e0, 0x3000 },
+  { 0x8700, 0x17dc, 0x2000 },
+  { 0x1700, 0x17db, 0x0000 },
+  { 0x0c00, 0x17dd, 0x0000 },
+  { 0x8d00, 0x17e2, 0x2000 },
+  { 0x0d00, 0x17e1, 0x0000 },
+  { 0x0d00, 0x17e3, 0x0000 },
+  { 0x8d00, 0x1811, 0x6000 },
+  { 0x9500, 0x1800, 0x5000 },
+  { 0x8f00, 0x17f2, 0x4000 },
+  { 0x8d00, 0x17e8, 0x3000 },
+  { 0x8d00, 0x17e6, 0x2000 },
+  { 0x0d00, 0x17e5, 0x0000 },
+  { 0x0d00, 0x17e7, 0x0000 },
+  { 0x8f00, 0x17f0, 0x2000 },
+  { 0x0d00, 0x17e9, 0x0000 },
+  { 0x0f00, 0x17f1, 0x0000 },
+  { 0x8f00, 0x17f6, 0x3000 },
+  { 0x8f00, 0x17f4, 0x2000 },
+  { 0x0f00, 0x17f3, 0x0000 },
+  { 0x0f00, 0x17f5, 0x0000 },
+  { 0x8f00, 0x17f8, 0x2000 },
+  { 0x0f00, 0x17f7, 0x0000 },
+  { 0x0f00, 0x17f9, 0x0000 },
+  { 0x9500, 0x1808, 0x4000 },
+  { 0x9500, 0x1804, 0x3000 },
+  { 0x9500, 0x1802, 0x2000 },
+  { 0x1500, 0x1801, 0x0000 },
+  { 0x1500, 0x1803, 0x0000 },
+  { 0x9100, 0x1806, 0x2000 },
+  { 0x1500, 0x1805, 0x0000 },
+  { 0x1500, 0x1807, 0x0000 },
+  { 0x8c00, 0x180c, 0x3000 },
+  { 0x9500, 0x180a, 0x2000 },
+  { 0x1500, 0x1809, 0x0000 },
+  { 0x0c00, 0x180b, 0x0000 },
+  { 0x9d00, 0x180e, 0x2000 },
+  { 0x0c00, 0x180d, 0x0000 },
+  { 0x0d00, 0x1810, 0x0000 },
+  { 0x8700, 0x1827, 0x5000 },
+  { 0x8d00, 0x1819, 0x4000 },
+  { 0x8d00, 0x1815, 0x3000 },
+  { 0x8d00, 0x1813, 0x2000 },
+  { 0x0d00, 0x1812, 0x0000 },
+  { 0x0d00, 0x1814, 0x0000 },
+  { 0x8d00, 0x1817, 0x2000 },
+  { 0x0d00, 0x1816, 0x0000 },
+  { 0x0d00, 0x1818, 0x0000 },
+  { 0x8700, 0x1823, 0x3000 },
+  { 0x8700, 0x1821, 0x2000 },
+  { 0x0700, 0x1820, 0x0000 },
+  { 0x0700, 0x1822, 0x0000 },
+  { 0x8700, 0x1825, 0x2000 },
+  { 0x0700, 0x1824, 0x0000 },
+  { 0x0700, 0x1826, 0x0000 },
+  { 0x8700, 0x182f, 0x4000 },
+  { 0x8700, 0x182b, 0x3000 },
+  { 0x8700, 0x1829, 0x2000 },
+  { 0x0700, 0x1828, 0x0000 },
+  { 0x0700, 0x182a, 0x0000 },
+  { 0x8700, 0x182d, 0x2000 },
+  { 0x0700, 0x182c, 0x0000 },
+  { 0x0700, 0x182e, 0x0000 },
+  { 0x8700, 0x1833, 0x3000 },
+  { 0x8700, 0x1831, 0x2000 },
+  { 0x0700, 0x1830, 0x0000 },
+  { 0x0700, 0x1832, 0x0000 },
+  { 0x8700, 0x1835, 0x2000 },
+  { 0x0700, 0x1834, 0x0000 },
+  { 0x0700, 0x1836, 0x0000 },
+  { 0x8700, 0x1877, 0x7000 },
+  { 0x8700, 0x1857, 0x6000 },
+  { 0x8700, 0x1847, 0x5000 },
+  { 0x8700, 0x183f, 0x4000 },
+  { 0x8700, 0x183b, 0x3000 },
+  { 0x8700, 0x1839, 0x2000 },
+  { 0x0700, 0x1838, 0x0000 },
+  { 0x0700, 0x183a, 0x0000 },
+  { 0x8700, 0x183d, 0x2000 },
+  { 0x0700, 0x183c, 0x0000 },
+  { 0x0700, 0x183e, 0x0000 },
+  { 0x8600, 0x1843, 0x3000 },
+  { 0x8700, 0x1841, 0x2000 },
+  { 0x0700, 0x1840, 0x0000 },
+  { 0x0700, 0x1842, 0x0000 },
+  { 0x8700, 0x1845, 0x2000 },
+  { 0x0700, 0x1844, 0x0000 },
+  { 0x0700, 0x1846, 0x0000 },
+  { 0x8700, 0x184f, 0x4000 },
+  { 0x8700, 0x184b, 0x3000 },
+  { 0x8700, 0x1849, 0x2000 },
+  { 0x0700, 0x1848, 0x0000 },
+  { 0x0700, 0x184a, 0x0000 },
+  { 0x8700, 0x184d, 0x2000 },
+  { 0x0700, 0x184c, 0x0000 },
+  { 0x0700, 0x184e, 0x0000 },
+  { 0x8700, 0x1853, 0x3000 },
+  { 0x8700, 0x1851, 0x2000 },
+  { 0x0700, 0x1850, 0x0000 },
+  { 0x0700, 0x1852, 0x0000 },
+  { 0x8700, 0x1855, 0x2000 },
+  { 0x0700, 0x1854, 0x0000 },
+  { 0x0700, 0x1856, 0x0000 },
+  { 0x8700, 0x1867, 0x5000 },
+  { 0x8700, 0x185f, 0x4000 },
+  { 0x8700, 0x185b, 0x3000 },
+  { 0x8700, 0x1859, 0x2000 },
+  { 0x0700, 0x1858, 0x0000 },
+  { 0x0700, 0x185a, 0x0000 },
+  { 0x8700, 0x185d, 0x2000 },
+  { 0x0700, 0x185c, 0x0000 },
+  { 0x0700, 0x185e, 0x0000 },
+  { 0x8700, 0x1863, 0x3000 },
+  { 0x8700, 0x1861, 0x2000 },
+  { 0x0700, 0x1860, 0x0000 },
+  { 0x0700, 0x1862, 0x0000 },
+  { 0x8700, 0x1865, 0x2000 },
+  { 0x0700, 0x1864, 0x0000 },
+  { 0x0700, 0x1866, 0x0000 },
+  { 0x8700, 0x186f, 0x4000 },
+  { 0x8700, 0x186b, 0x3000 },
+  { 0x8700, 0x1869, 0x2000 },
+  { 0x0700, 0x1868, 0x0000 },
+  { 0x0700, 0x186a, 0x0000 },
+  { 0x8700, 0x186d, 0x2000 },
+  { 0x0700, 0x186c, 0x0000 },
+  { 0x0700, 0x186e, 0x0000 },
+  { 0x8700, 0x1873, 0x3000 },
+  { 0x8700, 0x1871, 0x2000 },
+  { 0x0700, 0x1870, 0x0000 },
+  { 0x0700, 0x1872, 0x0000 },
+  { 0x8700, 0x1875, 0x2000 },
+  { 0x0700, 0x1874, 0x0000 },
+  { 0x0700, 0x1876, 0x0000 },
+  { 0x8700, 0x189f, 0x6000 },
+  { 0x8700, 0x188f, 0x5000 },
+  { 0x8700, 0x1887, 0x4000 },
+  { 0x8700, 0x1883, 0x3000 },
+  { 0x8700, 0x1881, 0x2000 },
+  { 0x0700, 0x1880, 0x0000 },
+  { 0x0700, 0x1882, 0x0000 },
+  { 0x8700, 0x1885, 0x2000 },
+  { 0x0700, 0x1884, 0x0000 },
+  { 0x0700, 0x1886, 0x0000 },
+  { 0x8700, 0x188b, 0x3000 },
+  { 0x8700, 0x1889, 0x2000 },
+  { 0x0700, 0x1888, 0x0000 },
+  { 0x0700, 0x188a, 0x0000 },
+  { 0x8700, 0x188d, 0x2000 },
+  { 0x0700, 0x188c, 0x0000 },
+  { 0x0700, 0x188e, 0x0000 },
+  { 0x8700, 0x1897, 0x4000 },
+  { 0x8700, 0x1893, 0x3000 },
+  { 0x8700, 0x1891, 0x2000 },
+  { 0x0700, 0x1890, 0x0000 },
+  { 0x0700, 0x1892, 0x0000 },
+  { 0x8700, 0x1895, 0x2000 },
+  { 0x0700, 0x1894, 0x0000 },
+  { 0x0700, 0x1896, 0x0000 },
+  { 0x8700, 0x189b, 0x3000 },
+  { 0x8700, 0x1899, 0x2000 },
+  { 0x0700, 0x1898, 0x0000 },
+  { 0x0700, 0x189a, 0x0000 },
+  { 0x8700, 0x189d, 0x2000 },
+  { 0x0700, 0x189c, 0x0000 },
+  { 0x0700, 0x189e, 0x0000 },
+  { 0x8700, 0x1905, 0x5000 },
+  { 0x8700, 0x18a7, 0x4000 },
+  { 0x8700, 0x18a3, 0x3000 },
+  { 0x8700, 0x18a1, 0x2000 },
+  { 0x0700, 0x18a0, 0x0000 },
+  { 0x0700, 0x18a2, 0x0000 },
+  { 0x8700, 0x18a5, 0x2000 },
+  { 0x0700, 0x18a4, 0x0000 },
+  { 0x0700, 0x18a6, 0x0000 },
+  { 0x8700, 0x1901, 0x3000 },
+  { 0x8c00, 0x18a9, 0x2000 },
+  { 0x0700, 0x18a8, 0x0000 },
+  { 0x0700, 0x1900, 0x0000 },
+  { 0x8700, 0x1903, 0x2000 },
+  { 0x0700, 0x1902, 0x0000 },
+  { 0x0700, 0x1904, 0x0000 },
+  { 0x8700, 0x190d, 0x4000 },
+  { 0x8700, 0x1909, 0x3000 },
+  { 0x8700, 0x1907, 0x2000 },
+  { 0x0700, 0x1906, 0x0000 },
+  { 0x0700, 0x1908, 0x0000 },
+  { 0x8700, 0x190b, 0x2000 },
+  { 0x0700, 0x190a, 0x0000 },
+  { 0x0700, 0x190c, 0x0000 },
+  { 0x8700, 0x1911, 0x3000 },
+  { 0x8700, 0x190f, 0x2000 },
+  { 0x0700, 0x190e, 0x0000 },
+  { 0x0700, 0x1910, 0x0000 },
+  { 0x8700, 0x1913, 0x2000 },
+  { 0x0700, 0x1912, 0x0000 },
+  { 0x0700, 0x1914, 0x0000 },
+  { 0x8500, 0x1d10, 0x8000 },
+  { 0x8700, 0x1963, 0x7000 },
+  { 0x9a00, 0x1940, 0x6000 },
+  { 0x8c00, 0x1928, 0x5000 },
+  { 0x8c00, 0x1920, 0x4000 },
+  { 0x8700, 0x1919, 0x3000 },
+  { 0x8700, 0x1917, 0x2000 },
+  { 0x0700, 0x1916, 0x0000 },
+  { 0x0700, 0x1918, 0x0000 },
+  { 0x8700, 0x191b, 0x2000 },
+  { 0x0700, 0x191a, 0x0000 },
+  { 0x0700, 0x191c, 0x0000 },
+  { 0x8a00, 0x1924, 0x3000 },
+  { 0x8c00, 0x1922, 0x2000 },
+  { 0x0c00, 0x1921, 0x0000 },
+  { 0x0a00, 0x1923, 0x0000 },
+  { 0x8a00, 0x1926, 0x2000 },
+  { 0x0a00, 0x1925, 0x0000 },
+  { 0x0c00, 0x1927, 0x0000 },
+  { 0x8a00, 0x1934, 0x4000 },
+  { 0x8a00, 0x1930, 0x3000 },
+  { 0x8a00, 0x192a, 0x2000 },
+  { 0x0a00, 0x1929, 0x0000 },
+  { 0x0a00, 0x192b, 0x0000 },
+  { 0x8c00, 0x1932, 0x2000 },
+  { 0x0a00, 0x1931, 0x0000 },
+  { 0x0a00, 0x1933, 0x0000 },
+  { 0x8a00, 0x1938, 0x3000 },
+  { 0x8a00, 0x1936, 0x2000 },
+  { 0x0a00, 0x1935, 0x0000 },
+  { 0x0a00, 0x1937, 0x0000 },
+  { 0x8c00, 0x193a, 0x2000 },
+  { 0x0c00, 0x1939, 0x0000 },
+  { 0x0c00, 0x193b, 0x0000 },
+  { 0x8700, 0x1953, 0x5000 },
+  { 0x8d00, 0x194b, 0x4000 },
+  { 0x8d00, 0x1947, 0x3000 },
+  { 0x9500, 0x1945, 0x2000 },
+  { 0x1500, 0x1944, 0x0000 },
+  { 0x0d00, 0x1946, 0x0000 },
+  { 0x8d00, 0x1949, 0x2000 },
+  { 0x0d00, 0x1948, 0x0000 },
+  { 0x0d00, 0x194a, 0x0000 },
+  { 0x8d00, 0x194f, 0x3000 },
+  { 0x8d00, 0x194d, 0x2000 },
+  { 0x0d00, 0x194c, 0x0000 },
+  { 0x0d00, 0x194e, 0x0000 },
+  { 0x8700, 0x1951, 0x2000 },
+  { 0x0700, 0x1950, 0x0000 },
+  { 0x0700, 0x1952, 0x0000 },
+  { 0x8700, 0x195b, 0x4000 },
+  { 0x8700, 0x1957, 0x3000 },
+  { 0x8700, 0x1955, 0x2000 },
+  { 0x0700, 0x1954, 0x0000 },
+  { 0x0700, 0x1956, 0x0000 },
+  { 0x8700, 0x1959, 0x2000 },
+  { 0x0700, 0x1958, 0x0000 },
+  { 0x0700, 0x195a, 0x0000 },
+  { 0x8700, 0x195f, 0x3000 },
+  { 0x8700, 0x195d, 0x2000 },
+  { 0x0700, 0x195c, 0x0000 },
+  { 0x0700, 0x195e, 0x0000 },
+  { 0x8700, 0x1961, 0x2000 },
+  { 0x0700, 0x1960, 0x0000 },
+  { 0x0700, 0x1962, 0x0000 },
+  { 0x9a00, 0x19f0, 0x6000 },
+  { 0x9a00, 0x19e0, 0x5000 },
+  { 0x8700, 0x196b, 0x4000 },
+  { 0x8700, 0x1967, 0x3000 },
+  { 0x8700, 0x1965, 0x2000 },
+  { 0x0700, 0x1964, 0x0000 },
+  { 0x0700, 0x1966, 0x0000 },
+  { 0x8700, 0x1969, 0x2000 },
+  { 0x0700, 0x1968, 0x0000 },
+  { 0x0700, 0x196a, 0x0000 },
+  { 0x8700, 0x1971, 0x3000 },
+  { 0x8700, 0x196d, 0x2000 },
+  { 0x0700, 0x196c, 0x0000 },
+  { 0x0700, 0x1970, 0x0000 },
+  { 0x8700, 0x1973, 0x2000 },
+  { 0x0700, 0x1972, 0x0000 },
+  { 0x0700, 0x1974, 0x0000 },
+  { 0x9a00, 0x19e8, 0x4000 },
+  { 0x9a00, 0x19e4, 0x3000 },
+  { 0x9a00, 0x19e2, 0x2000 },
+  { 0x1a00, 0x19e1, 0x0000 },
+  { 0x1a00, 0x19e3, 0x0000 },
+  { 0x9a00, 0x19e6, 0x2000 },
+  { 0x1a00, 0x19e5, 0x0000 },
+  { 0x1a00, 0x19e7, 0x0000 },
+  { 0x9a00, 0x19ec, 0x3000 },
+  { 0x9a00, 0x19ea, 0x2000 },
+  { 0x1a00, 0x19e9, 0x0000 },
+  { 0x1a00, 0x19eb, 0x0000 },
+  { 0x9a00, 0x19ee, 0x2000 },
+  { 0x1a00, 0x19ed, 0x0000 },
+  { 0x1a00, 0x19ef, 0x0000 },
+  { 0x8500, 0x1d00, 0x5000 },
+  { 0x9a00, 0x19f8, 0x4000 },
+  { 0x9a00, 0x19f4, 0x3000 },
+  { 0x9a00, 0x19f2, 0x2000 },
+  { 0x1a00, 0x19f1, 0x0000 },
+  { 0x1a00, 0x19f3, 0x0000 },
+  { 0x9a00, 0x19f6, 0x2000 },
+  { 0x1a00, 0x19f5, 0x0000 },
+  { 0x1a00, 0x19f7, 0x0000 },
+  { 0x9a00, 0x19fc, 0x3000 },
+  { 0x9a00, 0x19fa, 0x2000 },
+  { 0x1a00, 0x19f9, 0x0000 },
+  { 0x1a00, 0x19fb, 0x0000 },
+  { 0x9a00, 0x19fe, 0x2000 },
+  { 0x1a00, 0x19fd, 0x0000 },
+  { 0x1a00, 0x19ff, 0x0000 },
+  { 0x8500, 0x1d08, 0x4000 },
+  { 0x8500, 0x1d04, 0x3000 },
+  { 0x8500, 0x1d02, 0x2000 },
+  { 0x0500, 0x1d01, 0x0000 },
+  { 0x0500, 0x1d03, 0x0000 },
+  { 0x8500, 0x1d06, 0x2000 },
+  { 0x0500, 0x1d05, 0x0000 },
+  { 0x0500, 0x1d07, 0x0000 },
+  { 0x8500, 0x1d0c, 0x3000 },
+  { 0x8500, 0x1d0a, 0x2000 },
+  { 0x0500, 0x1d09, 0x0000 },
+  { 0x0500, 0x1d0b, 0x0000 },
+  { 0x8500, 0x1d0e, 0x2000 },
+  { 0x0500, 0x1d0d, 0x0000 },
+  { 0x0500, 0x1d0f, 0x0000 },
+  { 0x8600, 0x1d50, 0x7000 },
+  { 0x8600, 0x1d30, 0x6000 },
+  { 0x8500, 0x1d20, 0x5000 },
+  { 0x8500, 0x1d18, 0x4000 },
+  { 0x8500, 0x1d14, 0x3000 },
+  { 0x8500, 0x1d12, 0x2000 },
+  { 0x0500, 0x1d11, 0x0000 },
+  { 0x0500, 0x1d13, 0x0000 },
+  { 0x8500, 0x1d16, 0x2000 },
+  { 0x0500, 0x1d15, 0x0000 },
+  { 0x0500, 0x1d17, 0x0000 },
+  { 0x8500, 0x1d1c, 0x3000 },
+  { 0x8500, 0x1d1a, 0x2000 },
+  { 0x0500, 0x1d19, 0x0000 },
+  { 0x0500, 0x1d1b, 0x0000 },
+  { 0x8500, 0x1d1e, 0x2000 },
+  { 0x0500, 0x1d1d, 0x0000 },
+  { 0x0500, 0x1d1f, 0x0000 },
+  { 0x8500, 0x1d28, 0x4000 },
+  { 0x8500, 0x1d24, 0x3000 },
+  { 0x8500, 0x1d22, 0x2000 },
+  { 0x0500, 0x1d21, 0x0000 },
+  { 0x0500, 0x1d23, 0x0000 },
+  { 0x8500, 0x1d26, 0x2000 },
+  { 0x0500, 0x1d25, 0x0000 },
+  { 0x0500, 0x1d27, 0x0000 },
+  { 0x8600, 0x1d2c, 0x3000 },
+  { 0x8500, 0x1d2a, 0x2000 },
+  { 0x0500, 0x1d29, 0x0000 },
+  { 0x0500, 0x1d2b, 0x0000 },
+  { 0x8600, 0x1d2e, 0x2000 },
+  { 0x0600, 0x1d2d, 0x0000 },
+  { 0x0600, 0x1d2f, 0x0000 },
+  { 0x8600, 0x1d40, 0x5000 },
+  { 0x8600, 0x1d38, 0x4000 },
+  { 0x8600, 0x1d34, 0x3000 },
+  { 0x8600, 0x1d32, 0x2000 },
+  { 0x0600, 0x1d31, 0x0000 },
+  { 0x0600, 0x1d33, 0x0000 },
+  { 0x8600, 0x1d36, 0x2000 },
+  { 0x0600, 0x1d35, 0x0000 },
+  { 0x0600, 0x1d37, 0x0000 },
+  { 0x8600, 0x1d3c, 0x3000 },
+  { 0x8600, 0x1d3a, 0x2000 },
+  { 0x0600, 0x1d39, 0x0000 },
+  { 0x0600, 0x1d3b, 0x0000 },
+  { 0x8600, 0x1d3e, 0x2000 },
+  { 0x0600, 0x1d3d, 0x0000 },
+  { 0x0600, 0x1d3f, 0x0000 },
+  { 0x8600, 0x1d48, 0x4000 },
+  { 0x8600, 0x1d44, 0x3000 },
+  { 0x8600, 0x1d42, 0x2000 },
+  { 0x0600, 0x1d41, 0x0000 },
+  { 0x0600, 0x1d43, 0x0000 },
+  { 0x8600, 0x1d46, 0x2000 },
+  { 0x0600, 0x1d45, 0x0000 },
+  { 0x0600, 0x1d47, 0x0000 },
+  { 0x8600, 0x1d4c, 0x3000 },
+  { 0x8600, 0x1d4a, 0x2000 },
+  { 0x0600, 0x1d49, 0x0000 },
+  { 0x0600, 0x1d4b, 0x0000 },
+  { 0x8600, 0x1d4e, 0x2000 },
+  { 0x0600, 0x1d4d, 0x0000 },
+  { 0x0600, 0x1d4f, 0x0000 },
+  { 0x8900, 0x1e04, 0x6001 },
+  { 0x8600, 0x1d60, 0x5000 },
+  { 0x8600, 0x1d58, 0x4000 },
+  { 0x8600, 0x1d54, 0x3000 },
+  { 0x8600, 0x1d52, 0x2000 },
+  { 0x0600, 0x1d51, 0x0000 },
+  { 0x0600, 0x1d53, 0x0000 },
+  { 0x8600, 0x1d56, 0x2000 },
+  { 0x0600, 0x1d55, 0x0000 },
+  { 0x0600, 0x1d57, 0x0000 },
+  { 0x8600, 0x1d5c, 0x3000 },
+  { 0x8600, 0x1d5a, 0x2000 },
+  { 0x0600, 0x1d59, 0x0000 },
+  { 0x0600, 0x1d5b, 0x0000 },
+  { 0x8600, 0x1d5e, 0x2000 },
+  { 0x0600, 0x1d5d, 0x0000 },
+  { 0x0600, 0x1d5f, 0x0000 },
+  { 0x8500, 0x1d68, 0x4000 },
+  { 0x8500, 0x1d64, 0x3000 },
+  { 0x8500, 0x1d62, 0x2000 },
+  { 0x0600, 0x1d61, 0x0000 },
+  { 0x0500, 0x1d63, 0x0000 },
+  { 0x8500, 0x1d66, 0x2000 },
+  { 0x0500, 0x1d65, 0x0000 },
+  { 0x0500, 0x1d67, 0x0000 },
+  { 0x8900, 0x1e00, 0x3001 },
+  { 0x8500, 0x1d6a, 0x2000 },
+  { 0x0500, 0x1d69, 0x0000 },
+  { 0x0500, 0x1d6b, 0x0000 },
+  { 0x8900, 0x1e02, 0x2001 },
+  { 0x0500, 0x1e01, 0x0fff },
+  { 0x0500, 0x1e03, 0x0fff },
+  { 0x8900, 0x1e14, 0x5001 },
+  { 0x8900, 0x1e0c, 0x4001 },
+  { 0x8900, 0x1e08, 0x3001 },
+  { 0x8900, 0x1e06, 0x2001 },
+  { 0x0500, 0x1e05, 0x0fff },
+  { 0x0500, 0x1e07, 0x0fff },
+  { 0x8900, 0x1e0a, 0x2001 },
+  { 0x0500, 0x1e09, 0x0fff },
+  { 0x0500, 0x1e0b, 0x0fff },
+  { 0x8900, 0x1e10, 0x3001 },
+  { 0x8900, 0x1e0e, 0x2001 },
+  { 0x0500, 0x1e0d, 0x0fff },
+  { 0x0500, 0x1e0f, 0x0fff },
+  { 0x8900, 0x1e12, 0x2001 },
+  { 0x0500, 0x1e11, 0x0fff },
+  { 0x0500, 0x1e13, 0x0fff },
+  { 0x8900, 0x1e1c, 0x4001 },
+  { 0x8900, 0x1e18, 0x3001 },
+  { 0x8900, 0x1e16, 0x2001 },
+  { 0x0500, 0x1e15, 0x0fff },
+  { 0x0500, 0x1e17, 0x0fff },
+  { 0x8900, 0x1e1a, 0x2001 },
+  { 0x0500, 0x1e19, 0x0fff },
+  { 0x0500, 0x1e1b, 0x0fff },
+  { 0x8900, 0x1e20, 0x3001 },
+  { 0x8900, 0x1e1e, 0x2001 },
+  { 0x0500, 0x1e1d, 0x0fff },
+  { 0x0500, 0x1e1f, 0x0fff },
+  { 0x8900, 0x1e22, 0x2001 },
+  { 0x0500, 0x1e21, 0x0fff },
+  { 0x0500, 0x1e23, 0x0fff },
+  { 0x9600, 0x2045, 0xa000 },
+  { 0x8500, 0x1f32, 0x9008 },
+  { 0x8900, 0x1ea8, 0x8001 },
+  { 0x8900, 0x1e64, 0x7001 },
+  { 0x8900, 0x1e44, 0x6001 },
+  { 0x8900, 0x1e34, 0x5001 },
+  { 0x8900, 0x1e2c, 0x4001 },
+  { 0x8900, 0x1e28, 0x3001 },
+  { 0x8900, 0x1e26, 0x2001 },
+  { 0x0500, 0x1e25, 0x0fff },
+  { 0x0500, 0x1e27, 0x0fff },
+  { 0x8900, 0x1e2a, 0x2001 },
+  { 0x0500, 0x1e29, 0x0fff },
+  { 0x0500, 0x1e2b, 0x0fff },
+  { 0x8900, 0x1e30, 0x3001 },
+  { 0x8900, 0x1e2e, 0x2001 },
+  { 0x0500, 0x1e2d, 0x0fff },
+  { 0x0500, 0x1e2f, 0x0fff },
+  { 0x8900, 0x1e32, 0x2001 },
+  { 0x0500, 0x1e31, 0x0fff },
+  { 0x0500, 0x1e33, 0x0fff },
+  { 0x8900, 0x1e3c, 0x4001 },
+  { 0x8900, 0x1e38, 0x3001 },
+  { 0x8900, 0x1e36, 0x2001 },
+  { 0x0500, 0x1e35, 0x0fff },
+  { 0x0500, 0x1e37, 0x0fff },
+  { 0x8900, 0x1e3a, 0x2001 },
+  { 0x0500, 0x1e39, 0x0fff },
+  { 0x0500, 0x1e3b, 0x0fff },
+  { 0x8900, 0x1e40, 0x3001 },
+  { 0x8900, 0x1e3e, 0x2001 },
+  { 0x0500, 0x1e3d, 0x0fff },
+  { 0x0500, 0x1e3f, 0x0fff },
+  { 0x8900, 0x1e42, 0x2001 },
+  { 0x0500, 0x1e41, 0x0fff },
+  { 0x0500, 0x1e43, 0x0fff },
+  { 0x8900, 0x1e54, 0x5001 },
+  { 0x8900, 0x1e4c, 0x4001 },
+  { 0x8900, 0x1e48, 0x3001 },
+  { 0x8900, 0x1e46, 0x2001 },
+  { 0x0500, 0x1e45, 0x0fff },
+  { 0x0500, 0x1e47, 0x0fff },
+  { 0x8900, 0x1e4a, 0x2001 },
+  { 0x0500, 0x1e49, 0x0fff },
+  { 0x0500, 0x1e4b, 0x0fff },
+  { 0x8900, 0x1e50, 0x3001 },
+  { 0x8900, 0x1e4e, 0x2001 },
+  { 0x0500, 0x1e4d, 0x0fff },
+  { 0x0500, 0x1e4f, 0x0fff },
+  { 0x8900, 0x1e52, 0x2001 },
+  { 0x0500, 0x1e51, 0x0fff },
+  { 0x0500, 0x1e53, 0x0fff },
+  { 0x8900, 0x1e5c, 0x4001 },
+  { 0x8900, 0x1e58, 0x3001 },
+  { 0x8900, 0x1e56, 0x2001 },
+  { 0x0500, 0x1e55, 0x0fff },
+  { 0x0500, 0x1e57, 0x0fff },
+  { 0x8900, 0x1e5a, 0x2001 },
+  { 0x0500, 0x1e59, 0x0fff },
+  { 0x0500, 0x1e5b, 0x0fff },
+  { 0x8900, 0x1e60, 0x3001 },
+  { 0x8900, 0x1e5e, 0x2001 },
+  { 0x0500, 0x1e5d, 0x0fff },
+  { 0x0500, 0x1e5f, 0x0fff },
+  { 0x8900, 0x1e62, 0x2001 },
+  { 0x0500, 0x1e61, 0x0fff },
+  { 0x0500, 0x1e63, 0x0fff },
+  { 0x8900, 0x1e84, 0x6001 },
+  { 0x8900, 0x1e74, 0x5001 },
+  { 0x8900, 0x1e6c, 0x4001 },
+  { 0x8900, 0x1e68, 0x3001 },
+  { 0x8900, 0x1e66, 0x2001 },
+  { 0x0500, 0x1e65, 0x0fff },
+  { 0x0500, 0x1e67, 0x0fff },
+  { 0x8900, 0x1e6a, 0x2001 },
+  { 0x0500, 0x1e69, 0x0fff },
+  { 0x0500, 0x1e6b, 0x0fff },
+  { 0x8900, 0x1e70, 0x3001 },
+  { 0x8900, 0x1e6e, 0x2001 },
+  { 0x0500, 0x1e6d, 0x0fff },
+  { 0x0500, 0x1e6f, 0x0fff },
+  { 0x8900, 0x1e72, 0x2001 },
+  { 0x0500, 0x1e71, 0x0fff },
+  { 0x0500, 0x1e73, 0x0fff },
+  { 0x8900, 0x1e7c, 0x4001 },
+  { 0x8900, 0x1e78, 0x3001 },
+  { 0x8900, 0x1e76, 0x2001 },
+  { 0x0500, 0x1e75, 0x0fff },
+  { 0x0500, 0x1e77, 0x0fff },
+  { 0x8900, 0x1e7a, 0x2001 },
+  { 0x0500, 0x1e79, 0x0fff },
+  { 0x0500, 0x1e7b, 0x0fff },
+  { 0x8900, 0x1e80, 0x3001 },
+  { 0x8900, 0x1e7e, 0x2001 },
+  { 0x0500, 0x1e7d, 0x0fff },
+  { 0x0500, 0x1e7f, 0x0fff },
+  { 0x8900, 0x1e82, 0x2001 },
+  { 0x0500, 0x1e81, 0x0fff },
+  { 0x0500, 0x1e83, 0x0fff },
+  { 0x8900, 0x1e94, 0x5001 },
+  { 0x8900, 0x1e8c, 0x4001 },
+  { 0x8900, 0x1e88, 0x3001 },
+  { 0x8900, 0x1e86, 0x2001 },
+  { 0x0500, 0x1e85, 0x0fff },
+  { 0x0500, 0x1e87, 0x0fff },
+  { 0x8900, 0x1e8a, 0x2001 },
+  { 0x0500, 0x1e89, 0x0fff },
+  { 0x0500, 0x1e8b, 0x0fff },
+  { 0x8900, 0x1e90, 0x3001 },
+  { 0x8900, 0x1e8e, 0x2001 },
+  { 0x0500, 0x1e8d, 0x0fff },
+  { 0x0500, 0x1e8f, 0x0fff },
+  { 0x8900, 0x1e92, 0x2001 },
+  { 0x0500, 0x1e91, 0x0fff },
+  { 0x0500, 0x1e93, 0x0fff },
+  { 0x8900, 0x1ea0, 0x4001 },
+  { 0x8500, 0x1e98, 0x3000 },
+  { 0x8500, 0x1e96, 0x2000 },
+  { 0x0500, 0x1e95, 0x0fff },
+  { 0x0500, 0x1e97, 0x0000 },
+  { 0x8500, 0x1e9a, 0x2000 },
+  { 0x0500, 0x1e99, 0x0000 },
+  { 0x0500, 0x1e9b, 0x0fc5 },
+  { 0x8900, 0x1ea4, 0x3001 },
+  { 0x8900, 0x1ea2, 0x2001 },
+  { 0x0500, 0x1ea1, 0x0fff },
+  { 0x0500, 0x1ea3, 0x0fff },
+  { 0x8900, 0x1ea6, 0x2001 },
+  { 0x0500, 0x1ea5, 0x0fff },
+  { 0x0500, 0x1ea7, 0x0fff },
+  { 0x8900, 0x1ee8, 0x7001 },
+  { 0x8900, 0x1ec8, 0x6001 },
+  { 0x8900, 0x1eb8, 0x5001 },
+  { 0x8900, 0x1eb0, 0x4001 },
+  { 0x8900, 0x1eac, 0x3001 },
+  { 0x8900, 0x1eaa, 0x2001 },
+  { 0x0500, 0x1ea9, 0x0fff },
+  { 0x0500, 0x1eab, 0x0fff },
+  { 0x8900, 0x1eae, 0x2001 },
+  { 0x0500, 0x1ead, 0x0fff },
+  { 0x0500, 0x1eaf, 0x0fff },
+  { 0x8900, 0x1eb4, 0x3001 },
+  { 0x8900, 0x1eb2, 0x2001 },
+  { 0x0500, 0x1eb1, 0x0fff },
+  { 0x0500, 0x1eb3, 0x0fff },
+  { 0x8900, 0x1eb6, 0x2001 },
+  { 0x0500, 0x1eb5, 0x0fff },
+  { 0x0500, 0x1eb7, 0x0fff },
+  { 0x8900, 0x1ec0, 0x4001 },
+  { 0x8900, 0x1ebc, 0x3001 },
+  { 0x8900, 0x1eba, 0x2001 },
+  { 0x0500, 0x1eb9, 0x0fff },
+  { 0x0500, 0x1ebb, 0x0fff },
+  { 0x8900, 0x1ebe, 0x2001 },
+  { 0x0500, 0x1ebd, 0x0fff },
+  { 0x0500, 0x1ebf, 0x0fff },
+  { 0x8900, 0x1ec4, 0x3001 },
+  { 0x8900, 0x1ec2, 0x2001 },
+  { 0x0500, 0x1ec1, 0x0fff },
+  { 0x0500, 0x1ec3, 0x0fff },
+  { 0x8900, 0x1ec6, 0x2001 },
+  { 0x0500, 0x1ec5, 0x0fff },
+  { 0x0500, 0x1ec7, 0x0fff },
+  { 0x8900, 0x1ed8, 0x5001 },
+  { 0x8900, 0x1ed0, 0x4001 },
+  { 0x8900, 0x1ecc, 0x3001 },
+  { 0x8900, 0x1eca, 0x2001 },
+  { 0x0500, 0x1ec9, 0x0fff },
+  { 0x0500, 0x1ecb, 0x0fff },
+  { 0x8900, 0x1ece, 0x2001 },
+  { 0x0500, 0x1ecd, 0x0fff },
+  { 0x0500, 0x1ecf, 0x0fff },
+  { 0x8900, 0x1ed4, 0x3001 },
+  { 0x8900, 0x1ed2, 0x2001 },
+  { 0x0500, 0x1ed1, 0x0fff },
+  { 0x0500, 0x1ed3, 0x0fff },
+  { 0x8900, 0x1ed6, 0x2001 },
+  { 0x0500, 0x1ed5, 0x0fff },
+  { 0x0500, 0x1ed7, 0x0fff },
+  { 0x8900, 0x1ee0, 0x4001 },
+  { 0x8900, 0x1edc, 0x3001 },
+  { 0x8900, 0x1eda, 0x2001 },
+  { 0x0500, 0x1ed9, 0x0fff },
+  { 0x0500, 0x1edb, 0x0fff },
+  { 0x8900, 0x1ede, 0x2001 },
+  { 0x0500, 0x1edd, 0x0fff },
+  { 0x0500, 0x1edf, 0x0fff },
+  { 0x8900, 0x1ee4, 0x3001 },
+  { 0x8900, 0x1ee2, 0x2001 },
+  { 0x0500, 0x1ee1, 0x0fff },
+  { 0x0500, 0x1ee3, 0x0fff },
+  { 0x8900, 0x1ee6, 0x2001 },
+  { 0x0500, 0x1ee5, 0x0fff },
+  { 0x0500, 0x1ee7, 0x0fff },
+  { 0x8900, 0x1f0e, 0x6ff8 },
+  { 0x8900, 0x1ef8, 0x5001 },
+  { 0x8900, 0x1ef0, 0x4001 },
+  { 0x8900, 0x1eec, 0x3001 },
+  { 0x8900, 0x1eea, 0x2001 },
+  { 0x0500, 0x1ee9, 0x0fff },
+  { 0x0500, 0x1eeb, 0x0fff },
+  { 0x8900, 0x1eee, 0x2001 },
+  { 0x0500, 0x1eed, 0x0fff },
+  { 0x0500, 0x1eef, 0x0fff },
+  { 0x8900, 0x1ef4, 0x3001 },
+  { 0x8900, 0x1ef2, 0x2001 },
+  { 0x0500, 0x1ef1, 0x0fff },
+  { 0x0500, 0x1ef3, 0x0fff },
+  { 0x8900, 0x1ef6, 0x2001 },
+  { 0x0500, 0x1ef5, 0x0fff },
+  { 0x0500, 0x1ef7, 0x0fff },
+  { 0x8500, 0x1f06, 0x4008 },
+  { 0x8500, 0x1f02, 0x3008 },
+  { 0x8500, 0x1f00, 0x2008 },
+  { 0x0500, 0x1ef9, 0x0fff },
+  { 0x0500, 0x1f01, 0x0008 },
+  { 0x8500, 0x1f04, 0x2008 },
+  { 0x0500, 0x1f03, 0x0008 },
+  { 0x0500, 0x1f05, 0x0008 },
+  { 0x8900, 0x1f0a, 0x3ff8 },
+  { 0x8900, 0x1f08, 0x2ff8 },
+  { 0x0500, 0x1f07, 0x0008 },
+  { 0x0900, 0x1f09, 0x0ff8 },
+  { 0x8900, 0x1f0c, 0x2ff8 },
+  { 0x0900, 0x1f0b, 0x0ff8 },
+  { 0x0900, 0x1f0d, 0x0ff8 },
+  { 0x8500, 0x1f22, 0x5008 },
+  { 0x8900, 0x1f18, 0x4ff8 },
+  { 0x8500, 0x1f12, 0x3008 },
+  { 0x8500, 0x1f10, 0x2008 },
+  { 0x0900, 0x1f0f, 0x0ff8 },
+  { 0x0500, 0x1f11, 0x0008 },
+  { 0x8500, 0x1f14, 0x2008 },
+  { 0x0500, 0x1f13, 0x0008 },
+  { 0x0500, 0x1f15, 0x0008 },
+  { 0x8900, 0x1f1c, 0x3ff8 },
+  { 0x8900, 0x1f1a, 0x2ff8 },
+  { 0x0900, 0x1f19, 0x0ff8 },
+  { 0x0900, 0x1f1b, 0x0ff8 },
+  { 0x8500, 0x1f20, 0x2008 },
+  { 0x0900, 0x1f1d, 0x0ff8 },
+  { 0x0500, 0x1f21, 0x0008 },
+  { 0x8900, 0x1f2a, 0x4ff8 },
+  { 0x8500, 0x1f26, 0x3008 },
+  { 0x8500, 0x1f24, 0x2008 },
+  { 0x0500, 0x1f23, 0x0008 },
+  { 0x0500, 0x1f25, 0x0008 },
+  { 0x8900, 0x1f28, 0x2ff8 },
+  { 0x0500, 0x1f27, 0x0008 },
+  { 0x0900, 0x1f29, 0x0ff8 },
+  { 0x8900, 0x1f2e, 0x3ff8 },
+  { 0x8900, 0x1f2c, 0x2ff8 },
+  { 0x0900, 0x1f2b, 0x0ff8 },
+  { 0x0900, 0x1f2d, 0x0ff8 },
+  { 0x8500, 0x1f30, 0x2008 },
+  { 0x0900, 0x1f2f, 0x0ff8 },
+  { 0x0500, 0x1f31, 0x0008 },
+  { 0x9800, 0x1fbd, 0x8000 },
+  { 0x8500, 0x1f7a, 0x7070 },
+  { 0x8500, 0x1f56, 0x6000 },
+  { 0x8500, 0x1f42, 0x5008 },
+  { 0x8900, 0x1f3a, 0x4ff8 },
+  { 0x8500, 0x1f36, 0x3008 },
+  { 0x8500, 0x1f34, 0x2008 },
+  { 0x0500, 0x1f33, 0x0008 },
+  { 0x0500, 0x1f35, 0x0008 },
+  { 0x8900, 0x1f38, 0x2ff8 },
+  { 0x0500, 0x1f37, 0x0008 },
+  { 0x0900, 0x1f39, 0x0ff8 },
+  { 0x8900, 0x1f3e, 0x3ff8 },
+  { 0x8900, 0x1f3c, 0x2ff8 },
+  { 0x0900, 0x1f3b, 0x0ff8 },
+  { 0x0900, 0x1f3d, 0x0ff8 },
+  { 0x8500, 0x1f40, 0x2008 },
+  { 0x0900, 0x1f3f, 0x0ff8 },
+  { 0x0500, 0x1f41, 0x0008 },
+  { 0x8900, 0x1f4c, 0x4ff8 },
+  { 0x8900, 0x1f48, 0x3ff8 },
+  { 0x8500, 0x1f44, 0x2008 },
+  { 0x0500, 0x1f43, 0x0008 },
+  { 0x0500, 0x1f45, 0x0008 },
+  { 0x8900, 0x1f4a, 0x2ff8 },
+  { 0x0900, 0x1f49, 0x0ff8 },
+  { 0x0900, 0x1f4b, 0x0ff8 },
+  { 0x8500, 0x1f52, 0x3000 },
+  { 0x8500, 0x1f50, 0x2000 },
+  { 0x0900, 0x1f4d, 0x0ff8 },
+  { 0x0500, 0x1f51, 0x0008 },
+  { 0x8500, 0x1f54, 0x2000 },
+  { 0x0500, 0x1f53, 0x0008 },
+  { 0x0500, 0x1f55, 0x0008 },
+  { 0x8900, 0x1f6a, 0x5ff8 },
+  { 0x8500, 0x1f62, 0x4008 },
+  { 0x8900, 0x1f5d, 0x3ff8 },
+  { 0x8900, 0x1f59, 0x2ff8 },
+  { 0x0500, 0x1f57, 0x0008 },
+  { 0x0900, 0x1f5b, 0x0ff8 },
+  { 0x8500, 0x1f60, 0x2008 },
+  { 0x0900, 0x1f5f, 0x0ff8 },
+  { 0x0500, 0x1f61, 0x0008 },
+  { 0x8500, 0x1f66, 0x3008 },
+  { 0x8500, 0x1f64, 0x2008 },
+  { 0x0500, 0x1f63, 0x0008 },
+  { 0x0500, 0x1f65, 0x0008 },
+  { 0x8900, 0x1f68, 0x2ff8 },
+  { 0x0500, 0x1f67, 0x0008 },
+  { 0x0900, 0x1f69, 0x0ff8 },
+  { 0x8500, 0x1f72, 0x4056 },
+  { 0x8900, 0x1f6e, 0x3ff8 },
+  { 0x8900, 0x1f6c, 0x2ff8 },
+  { 0x0900, 0x1f6b, 0x0ff8 },
+  { 0x0900, 0x1f6d, 0x0ff8 },
+  { 0x8500, 0x1f70, 0x204a },
+  { 0x0900, 0x1f6f, 0x0ff8 },
+  { 0x0500, 0x1f71, 0x004a },
+  { 0x8500, 0x1f76, 0x3064 },
+  { 0x8500, 0x1f74, 0x2056 },
+  { 0x0500, 0x1f73, 0x0056 },
+  { 0x0500, 0x1f75, 0x0056 },
+  { 0x8500, 0x1f78, 0x2080 },
+  { 0x0500, 0x1f77, 0x0064 },
+  { 0x0500, 0x1f79, 0x0080 },
+  { 0x8800, 0x1f9c, 0x6000 },
+  { 0x8800, 0x1f8c, 0x5000 },
+  { 0x8500, 0x1f84, 0x4008 },
+  { 0x8500, 0x1f80, 0x3008 },
+  { 0x8500, 0x1f7c, 0x207e },
+  { 0x0500, 0x1f7b, 0x0070 },
+  { 0x0500, 0x1f7d, 0x007e },
+  { 0x8500, 0x1f82, 0x2008 },
+  { 0x0500, 0x1f81, 0x0008 },
+  { 0x0500, 0x1f83, 0x0008 },
+  { 0x8800, 0x1f88, 0x3000 },
+  { 0x8500, 0x1f86, 0x2008 },
+  { 0x0500, 0x1f85, 0x0008 },
+  { 0x0500, 0x1f87, 0x0008 },
+  { 0x8800, 0x1f8a, 0x2000 },
+  { 0x0800, 0x1f89, 0x0000 },
+  { 0x0800, 0x1f8b, 0x0000 },
+  { 0x8500, 0x1f94, 0x4008 },
+  { 0x8500, 0x1f90, 0x3008 },
+  { 0x8800, 0x1f8e, 0x2000 },
+  { 0x0800, 0x1f8d, 0x0000 },
+  { 0x0800, 0x1f8f, 0x0000 },
+  { 0x8500, 0x1f92, 0x2008 },
+  { 0x0500, 0x1f91, 0x0008 },
+  { 0x0500, 0x1f93, 0x0008 },
+  { 0x8800, 0x1f98, 0x3000 },
+  { 0x8500, 0x1f96, 0x2008 },
+  { 0x0500, 0x1f95, 0x0008 },
+  { 0x0500, 0x1f97, 0x0008 },
+  { 0x8800, 0x1f9a, 0x2000 },
+  { 0x0800, 0x1f99, 0x0000 },
+  { 0x0800, 0x1f9b, 0x0000 },
+  { 0x8800, 0x1fac, 0x5000 },
+  { 0x8500, 0x1fa4, 0x4008 },
+  { 0x8500, 0x1fa0, 0x3008 },
+  { 0x8800, 0x1f9e, 0x2000 },
+  { 0x0800, 0x1f9d, 0x0000 },
+  { 0x0800, 0x1f9f, 0x0000 },
+  { 0x8500, 0x1fa2, 0x2008 },
+  { 0x0500, 0x1fa1, 0x0008 },
+  { 0x0500, 0x1fa3, 0x0008 },
+  { 0x8800, 0x1fa8, 0x3000 },
+  { 0x8500, 0x1fa6, 0x2008 },
+  { 0x0500, 0x1fa5, 0x0008 },
+  { 0x0500, 0x1fa7, 0x0008 },
+  { 0x8800, 0x1faa, 0x2000 },
+  { 0x0800, 0x1fa9, 0x0000 },
+  { 0x0800, 0x1fab, 0x0000 },
+  { 0x8500, 0x1fb4, 0x4000 },
+  { 0x8500, 0x1fb0, 0x3008 },
+  { 0x8800, 0x1fae, 0x2000 },
+  { 0x0800, 0x1fad, 0x0000 },
+  { 0x0800, 0x1faf, 0x0000 },
+  { 0x8500, 0x1fb2, 0x2000 },
+  { 0x0500, 0x1fb1, 0x0008 },
+  { 0x0500, 0x1fb3, 0x0009 },
+  { 0x8900, 0x1fb9, 0x3ff8 },
+  { 0x8500, 0x1fb7, 0x2000 },
+  { 0x0500, 0x1fb6, 0x0000 },
+  { 0x0900, 0x1fb8, 0x0ff8 },
+  { 0x8900, 0x1fbb, 0x2fb6 },
+  { 0x0900, 0x1fba, 0x0fb6 },
+  { 0x0800, 0x1fbc, 0x0000 },
+  { 0x9d00, 0x2005, 0x7000 },
+  { 0x8500, 0x1fe1, 0x6008 },
+  { 0x9800, 0x1fce, 0x5000 },
+  { 0x8500, 0x1fc6, 0x4000 },
+  { 0x9800, 0x1fc1, 0x3000 },
+  { 0x9800, 0x1fbf, 0x2000 },
+  { 0x0500, 0x1fbe, 0x0000 },
+  { 0x1800, 0x1fc0, 0x0000 },
+  { 0x8500, 0x1fc3, 0x2009 },
+  { 0x0500, 0x1fc2, 0x0000 },
+  { 0x0500, 0x1fc4, 0x0000 },
+  { 0x8900, 0x1fca, 0x3faa },
+  { 0x8900, 0x1fc8, 0x2faa },
+  { 0x0500, 0x1fc7, 0x0000 },
+  { 0x0900, 0x1fc9, 0x0faa },
+  { 0x8800, 0x1fcc, 0x2000 },
+  { 0x0900, 0x1fcb, 0x0faa },
+  { 0x1800, 0x1fcd, 0x0000 },
+  { 0x8900, 0x1fd8, 0x4ff8 },
+  { 0x8500, 0x1fd2, 0x3000 },
+  { 0x8500, 0x1fd0, 0x2008 },
+  { 0x1800, 0x1fcf, 0x0000 },
+  { 0x0500, 0x1fd1, 0x0008 },
+  { 0x8500, 0x1fd6, 0x2000 },
+  { 0x0500, 0x1fd3, 0x0000 },
+  { 0x0500, 0x1fd7, 0x0000 },
+  { 0x9800, 0x1fdd, 0x3000 },
+  { 0x8900, 0x1fda, 0x2f9c },
+  { 0x0900, 0x1fd9, 0x0ff8 },
+  { 0x0900, 0x1fdb, 0x0f9c },
+  { 0x9800, 0x1fdf, 0x2000 },
+  { 0x1800, 0x1fde, 0x0000 },
+  { 0x0500, 0x1fe0, 0x0008 },
+  { 0x8500, 0x1ff3, 0x5009 },
+  { 0x8900, 0x1fe9, 0x4ff8 },
+  { 0x8500, 0x1fe5, 0x3007 },
+  { 0x8500, 0x1fe3, 0x2000 },
+  { 0x0500, 0x1fe2, 0x0000 },
+  { 0x0500, 0x1fe4, 0x0000 },
+  { 0x8500, 0x1fe7, 0x2000 },
+  { 0x0500, 0x1fe6, 0x0000 },
+  { 0x0900, 0x1fe8, 0x0ff8 },
+  { 0x9800, 0x1fed, 0x3000 },
+  { 0x8900, 0x1feb, 0x2f90 },
+  { 0x0900, 0x1fea, 0x0f90 },
+  { 0x0900, 0x1fec, 0x0ff9 },
+  { 0x9800, 0x1fef, 0x2000 },
+  { 0x1800, 0x1fee, 0x0000 },
+  { 0x0500, 0x1ff2, 0x0000 },
+  { 0x8800, 0x1ffc, 0x4000 },
+  { 0x8900, 0x1ff8, 0x3f80 },
+  { 0x8500, 0x1ff6, 0x2000 },
+  { 0x0500, 0x1ff4, 0x0000 },
+  { 0x0500, 0x1ff7, 0x0000 },
+  { 0x8900, 0x1ffa, 0x2f82 },
+  { 0x0900, 0x1ff9, 0x0f80 },
+  { 0x0900, 0x1ffb, 0x0f82 },
+  { 0x9d00, 0x2001, 0x3000 },
+  { 0x9800, 0x1ffe, 0x2000 },
+  { 0x1800, 0x1ffd, 0x0000 },
+  { 0x1d00, 0x2000, 0x0000 },
+  { 0x9d00, 0x2003, 0x2000 },
+  { 0x1d00, 0x2002, 0x0000 },
+  { 0x1d00, 0x2004, 0x0000 },
+  { 0x9500, 0x2025, 0x6000 },
+  { 0x9100, 0x2015, 0x5000 },
+  { 0x8100, 0x200d, 0x4000 },
+  { 0x9d00, 0x2009, 0x3000 },
+  { 0x9d00, 0x2007, 0x2000 },
+  { 0x1d00, 0x2006, 0x0000 },
+  { 0x1d00, 0x2008, 0x0000 },
+  { 0x9d00, 0x200b, 0x2000 },
+  { 0x1d00, 0x200a, 0x0000 },
+  { 0x0100, 0x200c, 0x0000 },
+  { 0x9100, 0x2011, 0x3000 },
+  { 0x8100, 0x200f, 0x2000 },
+  { 0x0100, 0x200e, 0x0000 },
+  { 0x1100, 0x2010, 0x0000 },
+  { 0x9100, 0x2013, 0x2000 },
+  { 0x1100, 0x2012, 0x0000 },
+  { 0x1100, 0x2014, 0x0000 },
+  { 0x9300, 0x201d, 0x4000 },
+  { 0x9300, 0x2019, 0x3000 },
+  { 0x9500, 0x2017, 0x2000 },
+  { 0x1500, 0x2016, 0x0000 },
+  { 0x1400, 0x2018, 0x0000 },
+  { 0x9400, 0x201b, 0x2000 },
+  { 0x1600, 0x201a, 0x0000 },
+  { 0x1400, 0x201c, 0x0000 },
+  { 0x9500, 0x2021, 0x3000 },
+  { 0x9400, 0x201f, 0x2000 },
+  { 0x1600, 0x201e, 0x0000 },
+  { 0x1500, 0x2020, 0x0000 },
+  { 0x9500, 0x2023, 0x2000 },
+  { 0x1500, 0x2022, 0x0000 },
+  { 0x1500, 0x2024, 0x0000 },
+  { 0x9500, 0x2035, 0x5000 },
+  { 0x8100, 0x202d, 0x4000 },
+  { 0x9c00, 0x2029, 0x3000 },
+  { 0x9500, 0x2027, 0x2000 },
+  { 0x1500, 0x2026, 0x0000 },
+  { 0x1b00, 0x2028, 0x0000 },
+  { 0x8100, 0x202b, 0x2000 },
+  { 0x0100, 0x202a, 0x0000 },
+  { 0x0100, 0x202c, 0x0000 },
+  { 0x9500, 0x2031, 0x3000 },
+  { 0x9d00, 0x202f, 0x2000 },
+  { 0x0100, 0x202e, 0x0000 },
+  { 0x1500, 0x2030, 0x0000 },
+  { 0x9500, 0x2033, 0x2000 },
+  { 0x1500, 0x2032, 0x0000 },
+  { 0x1500, 0x2034, 0x0000 },
+  { 0x9500, 0x203d, 0x4000 },
+  { 0x9400, 0x2039, 0x3000 },
+  { 0x9500, 0x2037, 0x2000 },
+  { 0x1500, 0x2036, 0x0000 },
+  { 0x1500, 0x2038, 0x0000 },
+  { 0x9500, 0x203b, 0x2000 },
+  { 0x1300, 0x203a, 0x0000 },
+  { 0x1500, 0x203c, 0x0000 },
+  { 0x9500, 0x2041, 0x3000 },
+  { 0x9000, 0x203f, 0x2000 },
+  { 0x1500, 0x203e, 0x0000 },
+  { 0x1000, 0x2040, 0x0000 },
+  { 0x9500, 0x2043, 0x2000 },
+  { 0x1500, 0x2042, 0x0000 },
+  { 0x1900, 0x2044, 0x0000 },
+  { 0x9900, 0x21ae, 0x9000 },
+  { 0x8900, 0x211a, 0x8000 },
+  { 0x9700, 0x20a7, 0x7000 },
+  { 0x8f00, 0x2076, 0x6000 },
+  { 0x9500, 0x2057, 0x5000 },
+  { 0x9500, 0x204d, 0x4000 },
+  { 0x9500, 0x2049, 0x3000 },
+  { 0x9500, 0x2047, 0x2000 },
+  { 0x1200, 0x2046, 0x0000 },
+  { 0x1500, 0x2048, 0x0000 },
+  { 0x9500, 0x204b, 0x2000 },
+  { 0x1500, 0x204a, 0x0000 },
+  { 0x1500, 0x204c, 0x0000 },
+  { 0x9500, 0x2051, 0x3000 },
+  { 0x9500, 0x204f, 0x2000 },
+  { 0x1500, 0x204e, 0x0000 },
+  { 0x1500, 0x2050, 0x0000 },
+  { 0x9500, 0x2053, 0x2000 },
+  { 0x1900, 0x2052, 0x0000 },
+  { 0x1000, 0x2054, 0x0000 },
+  { 0x8100, 0x206c, 0x4000 },
+  { 0x8100, 0x2062, 0x3000 },
+  { 0x8100, 0x2060, 0x2000 },
+  { 0x1d00, 0x205f, 0x0000 },
+  { 0x0100, 0x2061, 0x0000 },
+  { 0x8100, 0x206a, 0x2000 },
+  { 0x0100, 0x2063, 0x0000 },
+  { 0x0100, 0x206b, 0x0000 },
+  { 0x8f00, 0x2070, 0x3000 },
+  { 0x8100, 0x206e, 0x2000 },
+  { 0x0100, 0x206d, 0x0000 },
+  { 0x0100, 0x206f, 0x0000 },
+  { 0x8f00, 0x2074, 0x2000 },
+  { 0x0500, 0x2071, 0x0000 },
+  { 0x0f00, 0x2075, 0x0000 },
+  { 0x8f00, 0x2086, 0x5000 },
+  { 0x9200, 0x207e, 0x4000 },
+  { 0x9900, 0x207a, 0x3000 },
+  { 0x8f00, 0x2078, 0x2000 },
+  { 0x0f00, 0x2077, 0x0000 },
+  { 0x0f00, 0x2079, 0x0000 },
+  { 0x9900, 0x207c, 0x2000 },
+  { 0x1900, 0x207b, 0x0000 },
+  { 0x1600, 0x207d, 0x0000 },
+  { 0x8f00, 0x2082, 0x3000 },
+  { 0x8f00, 0x2080, 0x2000 },
+  { 0x0500, 0x207f, 0x0000 },
+  { 0x0f00, 0x2081, 0x0000 },
+  { 0x8f00, 0x2084, 0x2000 },
+  { 0x0f00, 0x2083, 0x0000 },
+  { 0x0f00, 0x2085, 0x0000 },
+  { 0x9200, 0x208e, 0x4000 },
+  { 0x9900, 0x208a, 0x3000 },
+  { 0x8f00, 0x2088, 0x2000 },
+  { 0x0f00, 0x2087, 0x0000 },
+  { 0x0f00, 0x2089, 0x0000 },
+  { 0x9900, 0x208c, 0x2000 },
+  { 0x1900, 0x208b, 0x0000 },
+  { 0x1600, 0x208d, 0x0000 },
+  { 0x9700, 0x20a3, 0x3000 },
+  { 0x9700, 0x20a1, 0x2000 },
+  { 0x1700, 0x20a0, 0x0000 },
+  { 0x1700, 0x20a2, 0x0000 },
+  { 0x9700, 0x20a5, 0x2000 },
+  { 0x1700, 0x20a4, 0x0000 },
+  { 0x1700, 0x20a6, 0x0000 },
+  { 0x8c00, 0x20e5, 0x6000 },
+  { 0x8c00, 0x20d5, 0x5000 },
+  { 0x9700, 0x20af, 0x4000 },
+  { 0x9700, 0x20ab, 0x3000 },
+  { 0x9700, 0x20a9, 0x2000 },
+  { 0x1700, 0x20a8, 0x0000 },
+  { 0x1700, 0x20aa, 0x0000 },
+  { 0x9700, 0x20ad, 0x2000 },
+  { 0x1700, 0x20ac, 0x0000 },
+  { 0x1700, 0x20ae, 0x0000 },
+  { 0x8c00, 0x20d1, 0x3000 },
+  { 0x9700, 0x20b1, 0x2000 },
+  { 0x1700, 0x20b0, 0x0000 },
+  { 0x0c00, 0x20d0, 0x0000 },
+  { 0x8c00, 0x20d3, 0x2000 },
+  { 0x0c00, 0x20d2, 0x0000 },
+  { 0x0c00, 0x20d4, 0x0000 },
+  { 0x8b00, 0x20dd, 0x4000 },
+  { 0x8c00, 0x20d9, 0x3000 },
+  { 0x8c00, 0x20d7, 0x2000 },
+  { 0x0c00, 0x20d6, 0x0000 },
+  { 0x0c00, 0x20d8, 0x0000 },
+  { 0x8c00, 0x20db, 0x2000 },
+  { 0x0c00, 0x20da, 0x0000 },
+  { 0x0c00, 0x20dc, 0x0000 },
+  { 0x8c00, 0x20e1, 0x3000 },
+  { 0x8b00, 0x20df, 0x2000 },
+  { 0x0b00, 0x20de, 0x0000 },
+  { 0x0b00, 0x20e0, 0x0000 },
+  { 0x8b00, 0x20e3, 0x2000 },
+  { 0x0b00, 0x20e2, 0x0000 },
+  { 0x0b00, 0x20e4, 0x0000 },
+  { 0x8500, 0x210a, 0x5000 },
+  { 0x8900, 0x2102, 0x4000 },
+  { 0x8c00, 0x20e9, 0x3000 },
+  { 0x8c00, 0x20e7, 0x2000 },
+  { 0x0c00, 0x20e6, 0x0000 },
+  { 0x0c00, 0x20e8, 0x0000 },
+  { 0x9a00, 0x2100, 0x2000 },
+  { 0x0c00, 0x20ea, 0x0000 },
+  { 0x1a00, 0x2101, 0x0000 },
+  { 0x9a00, 0x2106, 0x3000 },
+  { 0x9a00, 0x2104, 0x2000 },
+  { 0x1a00, 0x2103, 0x0000 },
+  { 0x1a00, 0x2105, 0x0000 },
+  { 0x9a00, 0x2108, 0x2000 },
+  { 0x0900, 0x2107, 0x0000 },
+  { 0x1a00, 0x2109, 0x0000 },
+  { 0x8900, 0x2112, 0x4000 },
+  { 0x8500, 0x210e, 0x3000 },
+  { 0x8900, 0x210c, 0x2000 },
+  { 0x0900, 0x210b, 0x0000 },
+  { 0x0900, 0x210d, 0x0000 },
+  { 0x8900, 0x2110, 0x2000 },
+  { 0x0500, 0x210f, 0x0000 },
+  { 0x0900, 0x2111, 0x0000 },
+  { 0x9a00, 0x2116, 0x3000 },
+  { 0x9a00, 0x2114, 0x2000 },
+  { 0x0500, 0x2113, 0x0000 },
+  { 0x0900, 0x2115, 0x0000 },
+  { 0x9a00, 0x2118, 0x2000 },
+  { 0x1a00, 0x2117, 0x0000 },
+  { 0x0900, 0x2119, 0x0000 },
+  { 0x8e00, 0x2162, 0x7000 },
+  { 0x9a00, 0x213a, 0x6000 },
+  { 0x8900, 0x212a, 0x5000 },
+  { 0x9a00, 0x2122, 0x4000 },
+  { 0x9a00, 0x211e, 0x3000 },
+  { 0x8900, 0x211c, 0x2000 },
+  { 0x0900, 0x211b, 0x0000 },
+  { 0x0900, 0x211d, 0x0000 },
+  { 0x9a00, 0x2120, 0x2000 },
+  { 0x1a00, 0x211f, 0x0000 },
+  { 0x1a00, 0x2121, 0x0000 },
+  { 0x8900, 0x2126, 0x3000 },
+  { 0x8900, 0x2124, 0x2000 },
+  { 0x1a00, 0x2123, 0x0000 },
+  { 0x1a00, 0x2125, 0x0000 },
+  { 0x8900, 0x2128, 0x2000 },
+  { 0x1a00, 0x2127, 0x0000 },
+  { 0x1a00, 0x2129, 0x0000 },
+  { 0x9a00, 0x2132, 0x4000 },
+  { 0x9a00, 0x212e, 0x3000 },
+  { 0x8900, 0x212c, 0x2000 },
+  { 0x0900, 0x212b, 0x0000 },
+  { 0x0900, 0x212d, 0x0000 },
+  { 0x8900, 0x2130, 0x2000 },
+  { 0x0500, 0x212f, 0x0000 },
+  { 0x0900, 0x2131, 0x0000 },
+  { 0x8700, 0x2136, 0x3000 },
+  { 0x8500, 0x2134, 0x2000 },
+  { 0x0900, 0x2133, 0x0000 },
+  { 0x0700, 0x2135, 0x0000 },
+  { 0x8700, 0x2138, 0x2000 },
+  { 0x0700, 0x2137, 0x0000 },
+  { 0x0500, 0x2139, 0x0000 },
+  { 0x9900, 0x214b, 0x5000 },
+  { 0x9900, 0x2143, 0x4000 },
+  { 0x8900, 0x213f, 0x3000 },
+  { 0x8500, 0x213d, 0x2000 },
+  { 0x1a00, 0x213b, 0x0000 },
+  { 0x0900, 0x213e, 0x0000 },
+  { 0x9900, 0x2141, 0x2000 },
+  { 0x1900, 0x2140, 0x0000 },
+  { 0x1900, 0x2142, 0x0000 },
+  { 0x8500, 0x2147, 0x3000 },
+  { 0x8900, 0x2145, 0x2000 },
+  { 0x1900, 0x2144, 0x0000 },
+  { 0x0500, 0x2146, 0x0000 },
+  { 0x8500, 0x2149, 0x2000 },
+  { 0x0500, 0x2148, 0x0000 },
+  { 0x1a00, 0x214a, 0x0000 },
+  { 0x8f00, 0x215a, 0x4000 },
+  { 0x8f00, 0x2156, 0x3000 },
+  { 0x8f00, 0x2154, 0x2000 },
+  { 0x0f00, 0x2153, 0x0000 },
+  { 0x0f00, 0x2155, 0x0000 },
+  { 0x8f00, 0x2158, 0x2000 },
+  { 0x0f00, 0x2157, 0x0000 },
+  { 0x0f00, 0x2159, 0x0000 },
+  { 0x8f00, 0x215e, 0x3000 },
+  { 0x8f00, 0x215c, 0x2000 },
+  { 0x0f00, 0x215b, 0x0000 },
+  { 0x0f00, 0x215d, 0x0000 },
+  { 0x8e00, 0x2160, 0x2000 },
+  { 0x0f00, 0x215f, 0x0000 },
+  { 0x0e00, 0x2161, 0x0000 },
+  { 0x8e00, 0x2182, 0x6000 },
+  { 0x8e00, 0x2172, 0x5000 },
+  { 0x8e00, 0x216a, 0x4000 },
+  { 0x8e00, 0x2166, 0x3000 },
+  { 0x8e00, 0x2164, 0x2000 },
+  { 0x0e00, 0x2163, 0x0000 },
+  { 0x0e00, 0x2165, 0x0000 },
+  { 0x8e00, 0x2168, 0x2000 },
+  { 0x0e00, 0x2167, 0x0000 },
+  { 0x0e00, 0x2169, 0x0000 },
+  { 0x8e00, 0x216e, 0x3000 },
+  { 0x8e00, 0x216c, 0x2000 },
+  { 0x0e00, 0x216b, 0x0000 },
+  { 0x0e00, 0x216d, 0x0000 },
+  { 0x8e00, 0x2170, 0x2000 },
+  { 0x0e00, 0x216f, 0x0000 },
+  { 0x0e00, 0x2171, 0x0000 },
+  { 0x8e00, 0x217a, 0x4000 },
+  { 0x8e00, 0x2176, 0x3000 },
+  { 0x8e00, 0x2174, 0x2000 },
+  { 0x0e00, 0x2173, 0x0000 },
+  { 0x0e00, 0x2175, 0x0000 },
+  { 0x8e00, 0x2178, 0x2000 },
+  { 0x0e00, 0x2177, 0x0000 },
+  { 0x0e00, 0x2179, 0x0000 },
+  { 0x8e00, 0x217e, 0x3000 },
+  { 0x8e00, 0x217c, 0x2000 },
+  { 0x0e00, 0x217b, 0x0000 },
+  { 0x0e00, 0x217d, 0x0000 },
+  { 0x8e00, 0x2180, 0x2000 },
+  { 0x0e00, 0x217f, 0x0000 },
+  { 0x0e00, 0x2181, 0x0000 },
+  { 0x9a00, 0x219e, 0x5000 },
+  { 0x9a00, 0x2196, 0x4000 },
+  { 0x9900, 0x2192, 0x3000 },
+  { 0x9900, 0x2190, 0x2000 },
+  { 0x0e00, 0x2183, 0x0000 },
+  { 0x1900, 0x2191, 0x0000 },
+  { 0x9900, 0x2194, 0x2000 },
+  { 0x1900, 0x2193, 0x0000 },
+  { 0x1a00, 0x2195, 0x0000 },
+  { 0x9900, 0x219a, 0x3000 },
+  { 0x9a00, 0x2198, 0x2000 },
+  { 0x1a00, 0x2197, 0x0000 },
+  { 0x1a00, 0x2199, 0x0000 },
+  { 0x9a00, 0x219c, 0x2000 },
+  { 0x1900, 0x219b, 0x0000 },
+  { 0x1a00, 0x219d, 0x0000 },
+  { 0x9900, 0x21a6, 0x4000 },
+  { 0x9a00, 0x21a2, 0x3000 },
+  { 0x9900, 0x21a0, 0x2000 },
+  { 0x1a00, 0x219f, 0x0000 },
+  { 0x1a00, 0x21a1, 0x0000 },
+  { 0x9a00, 0x21a4, 0x2000 },
+  { 0x1900, 0x21a3, 0x0000 },
+  { 0x1a00, 0x21a5, 0x0000 },
+  { 0x9a00, 0x21aa, 0x3000 },
+  { 0x9a00, 0x21a8, 0x2000 },
+  { 0x1a00, 0x21a7, 0x0000 },
+  { 0x1a00, 0x21a9, 0x0000 },
+  { 0x9a00, 0x21ac, 0x2000 },
+  { 0x1a00, 0x21ab, 0x0000 },
+  { 0x1a00, 0x21ad, 0x0000 },
+  { 0x9900, 0x222e, 0x8000 },
+  { 0x9a00, 0x21ee, 0x7000 },
+  { 0x9900, 0x21ce, 0x6000 },
+  { 0x9a00, 0x21be, 0x5000 },
+  { 0x9a00, 0x21b6, 0x4000 },
+  { 0x9a00, 0x21b2, 0x3000 },
+  { 0x9a00, 0x21b0, 0x2000 },
+  { 0x1a00, 0x21af, 0x0000 },
+  { 0x1a00, 0x21b1, 0x0000 },
+  { 0x9a00, 0x21b4, 0x2000 },
+  { 0x1a00, 0x21b3, 0x0000 },
+  { 0x1a00, 0x21b5, 0x0000 },
+  { 0x9a00, 0x21ba, 0x3000 },
+  { 0x9a00, 0x21b8, 0x2000 },
+  { 0x1a00, 0x21b7, 0x0000 },
+  { 0x1a00, 0x21b9, 0x0000 },
+  { 0x9a00, 0x21bc, 0x2000 },
+  { 0x1a00, 0x21bb, 0x0000 },
+  { 0x1a00, 0x21bd, 0x0000 },
+  { 0x9a00, 0x21c6, 0x4000 },
+  { 0x9a00, 0x21c2, 0x3000 },
+  { 0x9a00, 0x21c0, 0x2000 },
+  { 0x1a00, 0x21bf, 0x0000 },
+  { 0x1a00, 0x21c1, 0x0000 },
+  { 0x9a00, 0x21c4, 0x2000 },
+  { 0x1a00, 0x21c3, 0x0000 },
+  { 0x1a00, 0x21c5, 0x0000 },
+  { 0x9a00, 0x21ca, 0x3000 },
+  { 0x9a00, 0x21c8, 0x2000 },
+  { 0x1a00, 0x21c7, 0x0000 },
+  { 0x1a00, 0x21c9, 0x0000 },
+  { 0x9a00, 0x21cc, 0x2000 },
+  { 0x1a00, 0x21cb, 0x0000 },
+  { 0x1a00, 0x21cd, 0x0000 },
+  { 0x9a00, 0x21de, 0x5000 },
+  { 0x9a00, 0x21d6, 0x4000 },
+  { 0x9900, 0x21d2, 0x3000 },
+  { 0x9a00, 0x21d0, 0x2000 },
+  { 0x1900, 0x21cf, 0x0000 },
+  { 0x1a00, 0x21d1, 0x0000 },
+  { 0x9900, 0x21d4, 0x2000 },
+  { 0x1a00, 0x21d3, 0x0000 },
+  { 0x1a00, 0x21d5, 0x0000 },
+  { 0x9a00, 0x21da, 0x3000 },
+  { 0x9a00, 0x21d8, 0x2000 },
+  { 0x1a00, 0x21d7, 0x0000 },
+  { 0x1a00, 0x21d9, 0x0000 },
+  { 0x9a00, 0x21dc, 0x2000 },
+  { 0x1a00, 0x21db, 0x0000 },
+  { 0x1a00, 0x21dd, 0x0000 },
+  { 0x9a00, 0x21e6, 0x4000 },
+  { 0x9a00, 0x21e2, 0x3000 },
+  { 0x9a00, 0x21e0, 0x2000 },
+  { 0x1a00, 0x21df, 0x0000 },
+  { 0x1a00, 0x21e1, 0x0000 },
+  { 0x9a00, 0x21e4, 0x2000 },
+  { 0x1a00, 0x21e3, 0x0000 },
+  { 0x1a00, 0x21e5, 0x0000 },
+  { 0x9a00, 0x21ea, 0x3000 },
+  { 0x9a00, 0x21e8, 0x2000 },
+  { 0x1a00, 0x21e7, 0x0000 },
+  { 0x1a00, 0x21e9, 0x0000 },
+  { 0x9a00, 0x21ec, 0x2000 },
+  { 0x1a00, 0x21eb, 0x0000 },
+  { 0x1a00, 0x21ed, 0x0000 },
+  { 0x9900, 0x220e, 0x6000 },
+  { 0x9900, 0x21fe, 0x5000 },
+  { 0x9900, 0x21f6, 0x4000 },
+  { 0x9a00, 0x21f2, 0x3000 },
+  { 0x9a00, 0x21f0, 0x2000 },
+  { 0x1a00, 0x21ef, 0x0000 },
+  { 0x1a00, 0x21f1, 0x0000 },
+  { 0x9900, 0x21f4, 0x2000 },
+  { 0x1a00, 0x21f3, 0x0000 },
+  { 0x1900, 0x21f5, 0x0000 },
+  { 0x9900, 0x21fa, 0x3000 },
+  { 0x9900, 0x21f8, 0x2000 },
+  { 0x1900, 0x21f7, 0x0000 },
+  { 0x1900, 0x21f9, 0x0000 },
+  { 0x9900, 0x21fc, 0x2000 },
+  { 0x1900, 0x21fb, 0x0000 },
+  { 0x1900, 0x21fd, 0x0000 },
+  { 0x9900, 0x2206, 0x4000 },
+  { 0x9900, 0x2202, 0x3000 },
+  { 0x9900, 0x2200, 0x2000 },
+  { 0x1900, 0x21ff, 0x0000 },
+  { 0x1900, 0x2201, 0x0000 },
+  { 0x9900, 0x2204, 0x2000 },
+  { 0x1900, 0x2203, 0x0000 },
+  { 0x1900, 0x2205, 0x0000 },
+  { 0x9900, 0x220a, 0x3000 },
+  { 0x9900, 0x2208, 0x2000 },
+  { 0x1900, 0x2207, 0x0000 },
+  { 0x1900, 0x2209, 0x0000 },
+  { 0x9900, 0x220c, 0x2000 },
+  { 0x1900, 0x220b, 0x0000 },
+  { 0x1900, 0x220d, 0x0000 },
+  { 0x9900, 0x221e, 0x5000 },
+  { 0x9900, 0x2216, 0x4000 },
+  { 0x9900, 0x2212, 0x3000 },
+  { 0x9900, 0x2210, 0x2000 },
+  { 0x1900, 0x220f, 0x0000 },
+  { 0x1900, 0x2211, 0x0000 },
+  { 0x9900, 0x2214, 0x2000 },
+  { 0x1900, 0x2213, 0x0000 },
+  { 0x1900, 0x2215, 0x0000 },
+  { 0x9900, 0x221a, 0x3000 },
+  { 0x9900, 0x2218, 0x2000 },
+  { 0x1900, 0x2217, 0x0000 },
+  { 0x1900, 0x2219, 0x0000 },
+  { 0x9900, 0x221c, 0x2000 },
+  { 0x1900, 0x221b, 0x0000 },
+  { 0x1900, 0x221d, 0x0000 },
+  { 0x9900, 0x2226, 0x4000 },
+  { 0x9900, 0x2222, 0x3000 },
+  { 0x9900, 0x2220, 0x2000 },
+  { 0x1900, 0x221f, 0x0000 },
+  { 0x1900, 0x2221, 0x0000 },
+  { 0x9900, 0x2224, 0x2000 },
+  { 0x1900, 0x2223, 0x0000 },
+  { 0x1900, 0x2225, 0x0000 },
+  { 0x9900, 0x222a, 0x3000 },
+  { 0x9900, 0x2228, 0x2000 },
+  { 0x1900, 0x2227, 0x0000 },
+  { 0x1900, 0x2229, 0x0000 },
+  { 0x9900, 0x222c, 0x2000 },
+  { 0x1900, 0x222b, 0x0000 },
+  { 0x1900, 0x222d, 0x0000 },
+  { 0x9900, 0x226e, 0x7000 },
+  { 0x9900, 0x224e, 0x6000 },
+  { 0x9900, 0x223e, 0x5000 },
+  { 0x9900, 0x2236, 0x4000 },
+  { 0x9900, 0x2232, 0x3000 },
+  { 0x9900, 0x2230, 0x2000 },
+  { 0x1900, 0x222f, 0x0000 },
+  { 0x1900, 0x2231, 0x0000 },
+  { 0x9900, 0x2234, 0x2000 },
+  { 0x1900, 0x2233, 0x0000 },
+  { 0x1900, 0x2235, 0x0000 },
+  { 0x9900, 0x223a, 0x3000 },
+  { 0x9900, 0x2238, 0x2000 },
+  { 0x1900, 0x2237, 0x0000 },
+  { 0x1900, 0x2239, 0x0000 },
+  { 0x9900, 0x223c, 0x2000 },
+  { 0x1900, 0x223b, 0x0000 },
+  { 0x1900, 0x223d, 0x0000 },
+  { 0x9900, 0x2246, 0x4000 },
+  { 0x9900, 0x2242, 0x3000 },
+  { 0x9900, 0x2240, 0x2000 },
+  { 0x1900, 0x223f, 0x0000 },
+  { 0x1900, 0x2241, 0x0000 },
+  { 0x9900, 0x2244, 0x2000 },
+  { 0x1900, 0x2243, 0x0000 },
+  { 0x1900, 0x2245, 0x0000 },
+  { 0x9900, 0x224a, 0x3000 },
+  { 0x9900, 0x2248, 0x2000 },
+  { 0x1900, 0x2247, 0x0000 },
+  { 0x1900, 0x2249, 0x0000 },
+  { 0x9900, 0x224c, 0x2000 },
+  { 0x1900, 0x224b, 0x0000 },
+  { 0x1900, 0x224d, 0x0000 },
+  { 0x9900, 0x225e, 0x5000 },
+  { 0x9900, 0x2256, 0x4000 },
+  { 0x9900, 0x2252, 0x3000 },
+  { 0x9900, 0x2250, 0x2000 },
+  { 0x1900, 0x224f, 0x0000 },
+  { 0x1900, 0x2251, 0x0000 },
+  { 0x9900, 0x2254, 0x2000 },
+  { 0x1900, 0x2253, 0x0000 },
+  { 0x1900, 0x2255, 0x0000 },
+  { 0x9900, 0x225a, 0x3000 },
+  { 0x9900, 0x2258, 0x2000 },
+  { 0x1900, 0x2257, 0x0000 },
+  { 0x1900, 0x2259, 0x0000 },
+  { 0x9900, 0x225c, 0x2000 },
+  { 0x1900, 0x225b, 0x0000 },
+  { 0x1900, 0x225d, 0x0000 },
+  { 0x9900, 0x2266, 0x4000 },
+  { 0x9900, 0x2262, 0x3000 },
+  { 0x9900, 0x2260, 0x2000 },
+  { 0x1900, 0x225f, 0x0000 },
+  { 0x1900, 0x2261, 0x0000 },
+  { 0x9900, 0x2264, 0x2000 },
+  { 0x1900, 0x2263, 0x0000 },
+  { 0x1900, 0x2265, 0x0000 },
+  { 0x9900, 0x226a, 0x3000 },
+  { 0x9900, 0x2268, 0x2000 },
+  { 0x1900, 0x2267, 0x0000 },
+  { 0x1900, 0x2269, 0x0000 },
+  { 0x9900, 0x226c, 0x2000 },
+  { 0x1900, 0x226b, 0x0000 },
+  { 0x1900, 0x226d, 0x0000 },
+  { 0x9900, 0x228e, 0x6000 },
+  { 0x9900, 0x227e, 0x5000 },
+  { 0x9900, 0x2276, 0x4000 },
+  { 0x9900, 0x2272, 0x3000 },
+  { 0x9900, 0x2270, 0x2000 },
+  { 0x1900, 0x226f, 0x0000 },
+  { 0x1900, 0x2271, 0x0000 },
+  { 0x9900, 0x2274, 0x2000 },
+  { 0x1900, 0x2273, 0x0000 },
+  { 0x1900, 0x2275, 0x0000 },
+  { 0x9900, 0x227a, 0x3000 },
+  { 0x9900, 0x2278, 0x2000 },
+  { 0x1900, 0x2277, 0x0000 },
+  { 0x1900, 0x2279, 0x0000 },
+  { 0x9900, 0x227c, 0x2000 },
+  { 0x1900, 0x227b, 0x0000 },
+  { 0x1900, 0x227d, 0x0000 },
+  { 0x9900, 0x2286, 0x4000 },
+  { 0x9900, 0x2282, 0x3000 },
+  { 0x9900, 0x2280, 0x2000 },
+  { 0x1900, 0x227f, 0x0000 },
+  { 0x1900, 0x2281, 0x0000 },
+  { 0x9900, 0x2284, 0x2000 },
+  { 0x1900, 0x2283, 0x0000 },
+  { 0x1900, 0x2285, 0x0000 },
+  { 0x9900, 0x228a, 0x3000 },
+  { 0x9900, 0x2288, 0x2000 },
+  { 0x1900, 0x2287, 0x0000 },
+  { 0x1900, 0x2289, 0x0000 },
+  { 0x9900, 0x228c, 0x2000 },
+  { 0x1900, 0x228b, 0x0000 },
+  { 0x1900, 0x228d, 0x0000 },
+  { 0x9900, 0x229e, 0x5000 },
+  { 0x9900, 0x2296, 0x4000 },
+  { 0x9900, 0x2292, 0x3000 },
+  { 0x9900, 0x2290, 0x2000 },
+  { 0x1900, 0x228f, 0x0000 },
+  { 0x1900, 0x2291, 0x0000 },
+  { 0x9900, 0x2294, 0x2000 },
+  { 0x1900, 0x2293, 0x0000 },
+  { 0x1900, 0x2295, 0x0000 },
+  { 0x9900, 0x229a, 0x3000 },
+  { 0x9900, 0x2298, 0x2000 },
+  { 0x1900, 0x2297, 0x0000 },
+  { 0x1900, 0x2299, 0x0000 },
+  { 0x9900, 0x229c, 0x2000 },
+  { 0x1900, 0x229b, 0x0000 },
+  { 0x1900, 0x229d, 0x0000 },
+  { 0x9900, 0x22a6, 0x4000 },
+  { 0x9900, 0x22a2, 0x3000 },
+  { 0x9900, 0x22a0, 0x2000 },
+  { 0x1900, 0x229f, 0x0000 },
+  { 0x1900, 0x22a1, 0x0000 },
+  { 0x9900, 0x22a4, 0x2000 },
+  { 0x1900, 0x22a3, 0x0000 },
+  { 0x1900, 0x22a5, 0x0000 },
+  { 0x9900, 0x22aa, 0x3000 },
+  { 0x9900, 0x22a8, 0x2000 },
+  { 0x1900, 0x22a7, 0x0000 },
+  { 0x1900, 0x22a9, 0x0000 },
+  { 0x9900, 0x22ac, 0x2000 },
+  { 0x1900, 0x22ab, 0x0000 },
+  { 0x1900, 0x22ad, 0x0000 },
+  { 0x8f00, 0x2787, 0xb000 },
+  { 0x9a00, 0x250b, 0xa000 },
+  { 0x9900, 0x23ae, 0x9000 },
+  { 0x9a00, 0x232e, 0x8000 },
+  { 0x9900, 0x22ee, 0x7000 },
+  { 0x9900, 0x22ce, 0x6000 },
+  { 0x9900, 0x22be, 0x5000 },
+  { 0x9900, 0x22b6, 0x4000 },
+  { 0x9900, 0x22b2, 0x3000 },
+  { 0x9900, 0x22b0, 0x2000 },
+  { 0x1900, 0x22af, 0x0000 },
+  { 0x1900, 0x22b1, 0x0000 },
+  { 0x9900, 0x22b4, 0x2000 },
+  { 0x1900, 0x22b3, 0x0000 },
+  { 0x1900, 0x22b5, 0x0000 },
+  { 0x9900, 0x22ba, 0x3000 },
+  { 0x9900, 0x22b8, 0x2000 },
+  { 0x1900, 0x22b7, 0x0000 },
+  { 0x1900, 0x22b9, 0x0000 },
+  { 0x9900, 0x22bc, 0x2000 },
+  { 0x1900, 0x22bb, 0x0000 },
+  { 0x1900, 0x22bd, 0x0000 },
+  { 0x9900, 0x22c6, 0x4000 },
+  { 0x9900, 0x22c2, 0x3000 },
+  { 0x9900, 0x22c0, 0x2000 },
+  { 0x1900, 0x22bf, 0x0000 },
+  { 0x1900, 0x22c1, 0x0000 },
+  { 0x9900, 0x22c4, 0x2000 },
+  { 0x1900, 0x22c3, 0x0000 },
+  { 0x1900, 0x22c5, 0x0000 },
+  { 0x9900, 0x22ca, 0x3000 },
+  { 0x9900, 0x22c8, 0x2000 },
+  { 0x1900, 0x22c7, 0x0000 },
+  { 0x1900, 0x22c9, 0x0000 },
+  { 0x9900, 0x22cc, 0x2000 },
+  { 0x1900, 0x22cb, 0x0000 },
+  { 0x1900, 0x22cd, 0x0000 },
+  { 0x9900, 0x22de, 0x5000 },
+  { 0x9900, 0x22d6, 0x4000 },
+  { 0x9900, 0x22d2, 0x3000 },
+  { 0x9900, 0x22d0, 0x2000 },
+  { 0x1900, 0x22cf, 0x0000 },
+  { 0x1900, 0x22d1, 0x0000 },
+  { 0x9900, 0x22d4, 0x2000 },
+  { 0x1900, 0x22d3, 0x0000 },
+  { 0x1900, 0x22d5, 0x0000 },
+  { 0x9900, 0x22da, 0x3000 },
+  { 0x9900, 0x22d8, 0x2000 },
+  { 0x1900, 0x22d7, 0x0000 },
+  { 0x1900, 0x22d9, 0x0000 },
+  { 0x9900, 0x22dc, 0x2000 },
+  { 0x1900, 0x22db, 0x0000 },
+  { 0x1900, 0x22dd, 0x0000 },
+  { 0x9900, 0x22e6, 0x4000 },
+  { 0x9900, 0x22e2, 0x3000 },
+  { 0x9900, 0x22e0, 0x2000 },
+  { 0x1900, 0x22df, 0x0000 },
+  { 0x1900, 0x22e1, 0x0000 },
+  { 0x9900, 0x22e4, 0x2000 },
+  { 0x1900, 0x22e3, 0x0000 },
+  { 0x1900, 0x22e5, 0x0000 },
+  { 0x9900, 0x22ea, 0x3000 },
+  { 0x9900, 0x22e8, 0x2000 },
+  { 0x1900, 0x22e7, 0x0000 },
+  { 0x1900, 0x22e9, 0x0000 },
+  { 0x9900, 0x22ec, 0x2000 },
+  { 0x1900, 0x22eb, 0x0000 },
+  { 0x1900, 0x22ed, 0x0000 },
+  { 0x9a00, 0x230e, 0x6000 },
+  { 0x9900, 0x22fe, 0x5000 },
+  { 0x9900, 0x22f6, 0x4000 },
+  { 0x9900, 0x22f2, 0x3000 },
+  { 0x9900, 0x22f0, 0x2000 },
+  { 0x1900, 0x22ef, 0x0000 },
+  { 0x1900, 0x22f1, 0x0000 },
+  { 0x9900, 0x22f4, 0x2000 },
+  { 0x1900, 0x22f3, 0x0000 },
+  { 0x1900, 0x22f5, 0x0000 },
+  { 0x9900, 0x22fa, 0x3000 },
+  { 0x9900, 0x22f8, 0x2000 },
+  { 0x1900, 0x22f7, 0x0000 },
+  { 0x1900, 0x22f9, 0x0000 },
+  { 0x9900, 0x22fc, 0x2000 },
+  { 0x1900, 0x22fb, 0x0000 },
+  { 0x1900, 0x22fd, 0x0000 },
+  { 0x9a00, 0x2306, 0x4000 },
+  { 0x9a00, 0x2302, 0x3000 },
+  { 0x9a00, 0x2300, 0x2000 },
+  { 0x1900, 0x22ff, 0x0000 },
+  { 0x1a00, 0x2301, 0x0000 },
+  { 0x9a00, 0x2304, 0x2000 },
+  { 0x1a00, 0x2303, 0x0000 },
+  { 0x1a00, 0x2305, 0x0000 },
+  { 0x9900, 0x230a, 0x3000 },
+  { 0x9900, 0x2308, 0x2000 },
+  { 0x1a00, 0x2307, 0x0000 },
+  { 0x1900, 0x2309, 0x0000 },
+  { 0x9a00, 0x230c, 0x2000 },
+  { 0x1900, 0x230b, 0x0000 },
+  { 0x1a00, 0x230d, 0x0000 },
+  { 0x9a00, 0x231e, 0x5000 },
+  { 0x9a00, 0x2316, 0x4000 },
+  { 0x9a00, 0x2312, 0x3000 },
+  { 0x9a00, 0x2310, 0x2000 },
+  { 0x1a00, 0x230f, 0x0000 },
+  { 0x1a00, 0x2311, 0x0000 },
+  { 0x9a00, 0x2314, 0x2000 },
+  { 0x1a00, 0x2313, 0x0000 },
+  { 0x1a00, 0x2315, 0x0000 },
+  { 0x9a00, 0x231a, 0x3000 },
+  { 0x9a00, 0x2318, 0x2000 },
+  { 0x1a00, 0x2317, 0x0000 },
+  { 0x1a00, 0x2319, 0x0000 },
+  { 0x9a00, 0x231c, 0x2000 },
+  { 0x1a00, 0x231b, 0x0000 },
+  { 0x1a00, 0x231d, 0x0000 },
+  { 0x9a00, 0x2326, 0x4000 },
+  { 0x9a00, 0x2322, 0x3000 },
+  { 0x9900, 0x2320, 0x2000 },
+  { 0x1a00, 0x231f, 0x0000 },
+  { 0x1900, 0x2321, 0x0000 },
+  { 0x9a00, 0x2324, 0x2000 },
+  { 0x1a00, 0x2323, 0x0000 },
+  { 0x1a00, 0x2325, 0x0000 },
+  { 0x9200, 0x232a, 0x3000 },
+  { 0x9a00, 0x2328, 0x2000 },
+  { 0x1a00, 0x2327, 0x0000 },
+  { 0x1600, 0x2329, 0x0000 },
+  { 0x9a00, 0x232c, 0x2000 },
+  { 0x1a00, 0x232b, 0x0000 },
+  { 0x1a00, 0x232d, 0x0000 },
+  { 0x9a00, 0x236e, 0x7000 },
+  { 0x9a00, 0x234e, 0x6000 },
+  { 0x9a00, 0x233e, 0x5000 },
+  { 0x9a00, 0x2336, 0x4000 },
+  { 0x9a00, 0x2332, 0x3000 },
+  { 0x9a00, 0x2330, 0x2000 },
+  { 0x1a00, 0x232f, 0x0000 },
+  { 0x1a00, 0x2331, 0x0000 },
+  { 0x9a00, 0x2334, 0x2000 },
+  { 0x1a00, 0x2333, 0x0000 },
+  { 0x1a00, 0x2335, 0x0000 },
+  { 0x9a00, 0x233a, 0x3000 },
+  { 0x9a00, 0x2338, 0x2000 },
+  { 0x1a00, 0x2337, 0x0000 },
+  { 0x1a00, 0x2339, 0x0000 },
+  { 0x9a00, 0x233c, 0x2000 },
+  { 0x1a00, 0x233b, 0x0000 },
+  { 0x1a00, 0x233d, 0x0000 },
+  { 0x9a00, 0x2346, 0x4000 },
+  { 0x9a00, 0x2342, 0x3000 },
+  { 0x9a00, 0x2340, 0x2000 },
+  { 0x1a00, 0x233f, 0x0000 },
+  { 0x1a00, 0x2341, 0x0000 },
+  { 0x9a00, 0x2344, 0x2000 },
+  { 0x1a00, 0x2343, 0x0000 },
+  { 0x1a00, 0x2345, 0x0000 },
+  { 0x9a00, 0x234a, 0x3000 },
+  { 0x9a00, 0x2348, 0x2000 },
+  { 0x1a00, 0x2347, 0x0000 },
+  { 0x1a00, 0x2349, 0x0000 },
+  { 0x9a00, 0x234c, 0x2000 },
+  { 0x1a00, 0x234b, 0x0000 },
+  { 0x1a00, 0x234d, 0x0000 },
+  { 0x9a00, 0x235e, 0x5000 },
+  { 0x9a00, 0x2356, 0x4000 },
+  { 0x9a00, 0x2352, 0x3000 },
+  { 0x9a00, 0x2350, 0x2000 },
+  { 0x1a00, 0x234f, 0x0000 },
+  { 0x1a00, 0x2351, 0x0000 },
+  { 0x9a00, 0x2354, 0x2000 },
+  { 0x1a00, 0x2353, 0x0000 },
+  { 0x1a00, 0x2355, 0x0000 },
+  { 0x9a00, 0x235a, 0x3000 },
+  { 0x9a00, 0x2358, 0x2000 },
+  { 0x1a00, 0x2357, 0x0000 },
+  { 0x1a00, 0x2359, 0x0000 },
+  { 0x9a00, 0x235c, 0x2000 },
+  { 0x1a00, 0x235b, 0x0000 },
+  { 0x1a00, 0x235d, 0x0000 },
+  { 0x9a00, 0x2366, 0x4000 },
+  { 0x9a00, 0x2362, 0x3000 },
+  { 0x9a00, 0x2360, 0x2000 },
+  { 0x1a00, 0x235f, 0x0000 },
+  { 0x1a00, 0x2361, 0x0000 },
+  { 0x9a00, 0x2364, 0x2000 },
+  { 0x1a00, 0x2363, 0x0000 },
+  { 0x1a00, 0x2365, 0x0000 },
+  { 0x9a00, 0x236a, 0x3000 },
+  { 0x9a00, 0x2368, 0x2000 },
+  { 0x1a00, 0x2367, 0x0000 },
+  { 0x1a00, 0x2369, 0x0000 },
+  { 0x9a00, 0x236c, 0x2000 },
+  { 0x1a00, 0x236b, 0x0000 },
+  { 0x1a00, 0x236d, 0x0000 },
+  { 0x9a00, 0x238e, 0x6000 },
+  { 0x9a00, 0x237e, 0x5000 },
+  { 0x9a00, 0x2376, 0x4000 },
+  { 0x9a00, 0x2372, 0x3000 },
+  { 0x9a00, 0x2370, 0x2000 },
+  { 0x1a00, 0x236f, 0x0000 },
+  { 0x1a00, 0x2371, 0x0000 },
+  { 0x9a00, 0x2374, 0x2000 },
+  { 0x1a00, 0x2373, 0x0000 },
+  { 0x1a00, 0x2375, 0x0000 },
+  { 0x9a00, 0x237a, 0x3000 },
+  { 0x9a00, 0x2378, 0x2000 },
+  { 0x1a00, 0x2377, 0x0000 },
+  { 0x1a00, 0x2379, 0x0000 },
+  { 0x9900, 0x237c, 0x2000 },
+  { 0x1a00, 0x237b, 0x0000 },
+  { 0x1a00, 0x237d, 0x0000 },
+  { 0x9a00, 0x2386, 0x4000 },
+  { 0x9a00, 0x2382, 0x3000 },
+  { 0x9a00, 0x2380, 0x2000 },
+  { 0x1a00, 0x237f, 0x0000 },
+  { 0x1a00, 0x2381, 0x0000 },
+  { 0x9a00, 0x2384, 0x2000 },
+  { 0x1a00, 0x2383, 0x0000 },
+  { 0x1a00, 0x2385, 0x0000 },
+  { 0x9a00, 0x238a, 0x3000 },
+  { 0x9a00, 0x2388, 0x2000 },
+  { 0x1a00, 0x2387, 0x0000 },
+  { 0x1a00, 0x2389, 0x0000 },
+  { 0x9a00, 0x238c, 0x2000 },
+  { 0x1a00, 0x238b, 0x0000 },
+  { 0x1a00, 0x238d, 0x0000 },
+  { 0x9900, 0x239e, 0x5000 },
+  { 0x9a00, 0x2396, 0x4000 },
+  { 0x9a00, 0x2392, 0x3000 },
+  { 0x9a00, 0x2390, 0x2000 },
+  { 0x1a00, 0x238f, 0x0000 },
+  { 0x1a00, 0x2391, 0x0000 },
+  { 0x9a00, 0x2394, 0x2000 },
+  { 0x1a00, 0x2393, 0x0000 },
+  { 0x1a00, 0x2395, 0x0000 },
+  { 0x9a00, 0x239a, 0x3000 },
+  { 0x9a00, 0x2398, 0x2000 },
+  { 0x1a00, 0x2397, 0x0000 },
+  { 0x1a00, 0x2399, 0x0000 },
+  { 0x9900, 0x239c, 0x2000 },
+  { 0x1900, 0x239b, 0x0000 },
+  { 0x1900, 0x239d, 0x0000 },
+  { 0x9900, 0x23a6, 0x4000 },
+  { 0x9900, 0x23a2, 0x3000 },
+  { 0x9900, 0x23a0, 0x2000 },
+  { 0x1900, 0x239f, 0x0000 },
+  { 0x1900, 0x23a1, 0x0000 },
+  { 0x9900, 0x23a4, 0x2000 },
+  { 0x1900, 0x23a3, 0x0000 },
+  { 0x1900, 0x23a5, 0x0000 },
+  { 0x9900, 0x23aa, 0x3000 },
+  { 0x9900, 0x23a8, 0x2000 },
+  { 0x1900, 0x23a7, 0x0000 },
+  { 0x1900, 0x23a9, 0x0000 },
+  { 0x9900, 0x23ac, 0x2000 },
+  { 0x1900, 0x23ab, 0x0000 },
+  { 0x1900, 0x23ad, 0x0000 },
+  { 0x8f00, 0x248b, 0x8000 },
+  { 0x9a00, 0x241d, 0x7000 },
+  { 0x9a00, 0x23ce, 0x6000 },
+  { 0x9a00, 0x23be, 0x5000 },
+  { 0x9500, 0x23b6, 0x4000 },
+  { 0x9900, 0x23b2, 0x3000 },
+  { 0x9900, 0x23b0, 0x2000 },
+  { 0x1900, 0x23af, 0x0000 },
+  { 0x1900, 0x23b1, 0x0000 },
+  { 0x9600, 0x23b4, 0x2000 },
+  { 0x1900, 0x23b3, 0x0000 },
+  { 0x1200, 0x23b5, 0x0000 },
+  { 0x9a00, 0x23ba, 0x3000 },
+  { 0x9a00, 0x23b8, 0x2000 },
+  { 0x1a00, 0x23b7, 0x0000 },
+  { 0x1a00, 0x23b9, 0x0000 },
+  { 0x9a00, 0x23bc, 0x2000 },
+  { 0x1a00, 0x23bb, 0x0000 },
+  { 0x1a00, 0x23bd, 0x0000 },
+  { 0x9a00, 0x23c6, 0x4000 },
+  { 0x9a00, 0x23c2, 0x3000 },
+  { 0x9a00, 0x23c0, 0x2000 },
+  { 0x1a00, 0x23bf, 0x0000 },
+  { 0x1a00, 0x23c1, 0x0000 },
+  { 0x9a00, 0x23c4, 0x2000 },
+  { 0x1a00, 0x23c3, 0x0000 },
+  { 0x1a00, 0x23c5, 0x0000 },
+  { 0x9a00, 0x23ca, 0x3000 },
+  { 0x9a00, 0x23c8, 0x2000 },
+  { 0x1a00, 0x23c7, 0x0000 },
+  { 0x1a00, 0x23c9, 0x0000 },
+  { 0x9a00, 0x23cc, 0x2000 },
+  { 0x1a00, 0x23cb, 0x0000 },
+  { 0x1a00, 0x23cd, 0x0000 },
+  { 0x9a00, 0x240d, 0x5000 },
+  { 0x9a00, 0x2405, 0x4000 },
+  { 0x9a00, 0x2401, 0x3000 },
+  { 0x9a00, 0x23d0, 0x2000 },
+  { 0x1a00, 0x23cf, 0x0000 },
+  { 0x1a00, 0x2400, 0x0000 },
+  { 0x9a00, 0x2403, 0x2000 },
+  { 0x1a00, 0x2402, 0x0000 },
+  { 0x1a00, 0x2404, 0x0000 },
+  { 0x9a00, 0x2409, 0x3000 },
+  { 0x9a00, 0x2407, 0x2000 },
+  { 0x1a00, 0x2406, 0x0000 },
+  { 0x1a00, 0x2408, 0x0000 },
+  { 0x9a00, 0x240b, 0x2000 },
+  { 0x1a00, 0x240a, 0x0000 },
+  { 0x1a00, 0x240c, 0x0000 },
+  { 0x9a00, 0x2415, 0x4000 },
+  { 0x9a00, 0x2411, 0x3000 },
+  { 0x9a00, 0x240f, 0x2000 },
+  { 0x1a00, 0x240e, 0x0000 },
+  { 0x1a00, 0x2410, 0x0000 },
+  { 0x9a00, 0x2413, 0x2000 },
+  { 0x1a00, 0x2412, 0x0000 },
+  { 0x1a00, 0x2414, 0x0000 },
+  { 0x9a00, 0x2419, 0x3000 },
+  { 0x9a00, 0x2417, 0x2000 },
+  { 0x1a00, 0x2416, 0x0000 },
+  { 0x1a00, 0x2418, 0x0000 },
+  { 0x9a00, 0x241b, 0x2000 },
+  { 0x1a00, 0x241a, 0x0000 },
+  { 0x1a00, 0x241c, 0x0000 },
+  { 0x8f00, 0x246b, 0x6000 },
+  { 0x9a00, 0x2446, 0x5000 },
+  { 0x9a00, 0x2425, 0x4000 },
+  { 0x9a00, 0x2421, 0x3000 },
+  { 0x9a00, 0x241f, 0x2000 },
+  { 0x1a00, 0x241e, 0x0000 },
+  { 0x1a00, 0x2420, 0x0000 },
+  { 0x9a00, 0x2423, 0x2000 },
+  { 0x1a00, 0x2422, 0x0000 },
+  { 0x1a00, 0x2424, 0x0000 },
+  { 0x9a00, 0x2442, 0x3000 },
+  { 0x9a00, 0x2440, 0x2000 },
+  { 0x1a00, 0x2426, 0x0000 },
+  { 0x1a00, 0x2441, 0x0000 },
+  { 0x9a00, 0x2444, 0x2000 },
+  { 0x1a00, 0x2443, 0x0000 },
+  { 0x1a00, 0x2445, 0x0000 },
+  { 0x8f00, 0x2463, 0x4000 },
+  { 0x9a00, 0x244a, 0x3000 },
+  { 0x9a00, 0x2448, 0x2000 },
+  { 0x1a00, 0x2447, 0x0000 },
+  { 0x1a00, 0x2449, 0x0000 },
+  { 0x8f00, 0x2461, 0x2000 },
+  { 0x0f00, 0x2460, 0x0000 },
+  { 0x0f00, 0x2462, 0x0000 },
+  { 0x8f00, 0x2467, 0x3000 },
+  { 0x8f00, 0x2465, 0x2000 },
+  { 0x0f00, 0x2464, 0x0000 },
+  { 0x0f00, 0x2466, 0x0000 },
+  { 0x8f00, 0x2469, 0x2000 },
+  { 0x0f00, 0x2468, 0x0000 },
+  { 0x0f00, 0x246a, 0x0000 },
+  { 0x8f00, 0x247b, 0x5000 },
+  { 0x8f00, 0x2473, 0x4000 },
+  { 0x8f00, 0x246f, 0x3000 },
+  { 0x8f00, 0x246d, 0x2000 },
+  { 0x0f00, 0x246c, 0x0000 },
+  { 0x0f00, 0x246e, 0x0000 },
+  { 0x8f00, 0x2471, 0x2000 },
+  { 0x0f00, 0x2470, 0x0000 },
+  { 0x0f00, 0x2472, 0x0000 },
+  { 0x8f00, 0x2477, 0x3000 },
+  { 0x8f00, 0x2475, 0x2000 },
+  { 0x0f00, 0x2474, 0x0000 },
+  { 0x0f00, 0x2476, 0x0000 },
+  { 0x8f00, 0x2479, 0x2000 },
+  { 0x0f00, 0x2478, 0x0000 },
+  { 0x0f00, 0x247a, 0x0000 },
+  { 0x8f00, 0x2483, 0x4000 },
+  { 0x8f00, 0x247f, 0x3000 },
+  { 0x8f00, 0x247d, 0x2000 },
+  { 0x0f00, 0x247c, 0x0000 },
+  { 0x0f00, 0x247e, 0x0000 },
+  { 0x8f00, 0x2481, 0x2000 },
+  { 0x0f00, 0x2480, 0x0000 },
+  { 0x0f00, 0x2482, 0x0000 },
+  { 0x8f00, 0x2487, 0x3000 },
+  { 0x8f00, 0x2485, 0x2000 },
+  { 0x0f00, 0x2484, 0x0000 },
+  { 0x0f00, 0x2486, 0x0000 },
+  { 0x8f00, 0x2489, 0x2000 },
+  { 0x0f00, 0x2488, 0x0000 },
+  { 0x0f00, 0x248a, 0x0000 },
+  { 0x9a00, 0x24cb, 0x7000 },
+  { 0x9a00, 0x24ab, 0x6000 },
+  { 0x8f00, 0x249b, 0x5000 },
+  { 0x8f00, 0x2493, 0x4000 },
+  { 0x8f00, 0x248f, 0x3000 },
+  { 0x8f00, 0x248d, 0x2000 },
+  { 0x0f00, 0x248c, 0x0000 },
+  { 0x0f00, 0x248e, 0x0000 },
+  { 0x8f00, 0x2491, 0x2000 },
+  { 0x0f00, 0x2490, 0x0000 },
+  { 0x0f00, 0x2492, 0x0000 },
+  { 0x8f00, 0x2497, 0x3000 },
+  { 0x8f00, 0x2495, 0x2000 },
+  { 0x0f00, 0x2494, 0x0000 },
+  { 0x0f00, 0x2496, 0x0000 },
+  { 0x8f00, 0x2499, 0x2000 },
+  { 0x0f00, 0x2498, 0x0000 },
+  { 0x0f00, 0x249a, 0x0000 },
+  { 0x9a00, 0x24a3, 0x4000 },
+  { 0x9a00, 0x249f, 0x3000 },
+  { 0x9a00, 0x249d, 0x2000 },
+  { 0x1a00, 0x249c, 0x0000 },
+  { 0x1a00, 0x249e, 0x0000 },
+  { 0x9a00, 0x24a1, 0x2000 },
+  { 0x1a00, 0x24a0, 0x0000 },
+  { 0x1a00, 0x24a2, 0x0000 },
+  { 0x9a00, 0x24a7, 0x3000 },
+  { 0x9a00, 0x24a5, 0x2000 },
+  { 0x1a00, 0x24a4, 0x0000 },
+  { 0x1a00, 0x24a6, 0x0000 },
+  { 0x9a00, 0x24a9, 0x2000 },
+  { 0x1a00, 0x24a8, 0x0000 },
+  { 0x1a00, 0x24aa, 0x0000 },
+  { 0x9a00, 0x24bb, 0x5000 },
+  { 0x9a00, 0x24b3, 0x4000 },
+  { 0x9a00, 0x24af, 0x3000 },
+  { 0x9a00, 0x24ad, 0x2000 },
+  { 0x1a00, 0x24ac, 0x0000 },
+  { 0x1a00, 0x24ae, 0x0000 },
+  { 0x9a00, 0x24b1, 0x2000 },
+  { 0x1a00, 0x24b0, 0x0000 },
+  { 0x1a00, 0x24b2, 0x0000 },
+  { 0x9a00, 0x24b7, 0x3000 },
+  { 0x9a00, 0x24b5, 0x2000 },
+  { 0x1a00, 0x24b4, 0x0000 },
+  { 0x1a00, 0x24b6, 0x0000 },
+  { 0x9a00, 0x24b9, 0x2000 },
+  { 0x1a00, 0x24b8, 0x0000 },
+  { 0x1a00, 0x24ba, 0x0000 },
+  { 0x9a00, 0x24c3, 0x4000 },
+  { 0x9a00, 0x24bf, 0x3000 },
+  { 0x9a00, 0x24bd, 0x2000 },
+  { 0x1a00, 0x24bc, 0x0000 },
+  { 0x1a00, 0x24be, 0x0000 },
+  { 0x9a00, 0x24c1, 0x2000 },
+  { 0x1a00, 0x24c0, 0x0000 },
+  { 0x1a00, 0x24c2, 0x0000 },
+  { 0x9a00, 0x24c7, 0x3000 },
+  { 0x9a00, 0x24c5, 0x2000 },
+  { 0x1a00, 0x24c4, 0x0000 },
+  { 0x1a00, 0x24c6, 0x0000 },
+  { 0x9a00, 0x24c9, 0x2000 },
+  { 0x1a00, 0x24c8, 0x0000 },
+  { 0x1a00, 0x24ca, 0x0000 },
+  { 0x8f00, 0x24eb, 0x6000 },
+  { 0x9a00, 0x24db, 0x5000 },
+  { 0x9a00, 0x24d3, 0x4000 },
+  { 0x9a00, 0x24cf, 0x3000 },
+  { 0x9a00, 0x24cd, 0x2000 },
+  { 0x1a00, 0x24cc, 0x0000 },
+  { 0x1a00, 0x24ce, 0x0000 },
+  { 0x9a00, 0x24d1, 0x2000 },
+  { 0x1a00, 0x24d0, 0x0000 },
+  { 0x1a00, 0x24d2, 0x0000 },
+  { 0x9a00, 0x24d7, 0x3000 },
+  { 0x9a00, 0x24d5, 0x2000 },
+  { 0x1a00, 0x24d4, 0x0000 },
+  { 0x1a00, 0x24d6, 0x0000 },
+  { 0x9a00, 0x24d9, 0x2000 },
+  { 0x1a00, 0x24d8, 0x0000 },
+  { 0x1a00, 0x24da, 0x0000 },
+  { 0x9a00, 0x24e3, 0x4000 },
+  { 0x9a00, 0x24df, 0x3000 },
+  { 0x9a00, 0x24dd, 0x2000 },
+  { 0x1a00, 0x24dc, 0x0000 },
+  { 0x1a00, 0x24de, 0x0000 },
+  { 0x9a00, 0x24e1, 0x2000 },
+  { 0x1a00, 0x24e0, 0x0000 },
+  { 0x1a00, 0x24e2, 0x0000 },
+  { 0x9a00, 0x24e7, 0x3000 },
+  { 0x9a00, 0x24e5, 0x2000 },
+  { 0x1a00, 0x24e4, 0x0000 },
+  { 0x1a00, 0x24e6, 0x0000 },
+  { 0x9a00, 0x24e9, 0x2000 },
+  { 0x1a00, 0x24e8, 0x0000 },
+  { 0x0f00, 0x24ea, 0x0000 },
+  { 0x8f00, 0x24fb, 0x5000 },
+  { 0x8f00, 0x24f3, 0x4000 },
+  { 0x8f00, 0x24ef, 0x3000 },
+  { 0x8f00, 0x24ed, 0x2000 },
+  { 0x0f00, 0x24ec, 0x0000 },
+  { 0x0f00, 0x24ee, 0x0000 },
+  { 0x8f00, 0x24f1, 0x2000 },
+  { 0x0f00, 0x24f0, 0x0000 },
+  { 0x0f00, 0x24f2, 0x0000 },
+  { 0x8f00, 0x24f7, 0x3000 },
+  { 0x8f00, 0x24f5, 0x2000 },
+  { 0x0f00, 0x24f4, 0x0000 },
+  { 0x0f00, 0x24f6, 0x0000 },
+  { 0x8f00, 0x24f9, 0x2000 },
+  { 0x0f00, 0x24f8, 0x0000 },
+  { 0x0f00, 0x24fa, 0x0000 },
+  { 0x9a00, 0x2503, 0x4000 },
+  { 0x8f00, 0x24ff, 0x3000 },
+  { 0x8f00, 0x24fd, 0x2000 },
+  { 0x0f00, 0x24fc, 0x0000 },
+  { 0x0f00, 0x24fe, 0x0000 },
+  { 0x9a00, 0x2501, 0x2000 },
+  { 0x1a00, 0x2500, 0x0000 },
+  { 0x1a00, 0x2502, 0x0000 },
+  { 0x9a00, 0x2507, 0x3000 },
+  { 0x9a00, 0x2505, 0x2000 },
+  { 0x1a00, 0x2504, 0x0000 },
+  { 0x1a00, 0x2506, 0x0000 },
+  { 0x9a00, 0x2509, 0x2000 },
+  { 0x1a00, 0x2508, 0x0000 },
+  { 0x1a00, 0x250a, 0x0000 },
+  { 0x9a00, 0x260b, 0x9000 },
+  { 0x9a00, 0x258b, 0x8000 },
+  { 0x9a00, 0x254b, 0x7000 },
+  { 0x9a00, 0x252b, 0x6000 },
+  { 0x9a00, 0x251b, 0x5000 },
+  { 0x9a00, 0x2513, 0x4000 },
+  { 0x9a00, 0x250f, 0x3000 },
+  { 0x9a00, 0x250d, 0x2000 },
+  { 0x1a00, 0x250c, 0x0000 },
+  { 0x1a00, 0x250e, 0x0000 },
+  { 0x9a00, 0x2511, 0x2000 },
+  { 0x1a00, 0x2510, 0x0000 },
+  { 0x1a00, 0x2512, 0x0000 },
+  { 0x9a00, 0x2517, 0x3000 },
+  { 0x9a00, 0x2515, 0x2000 },
+  { 0x1a00, 0x2514, 0x0000 },
+  { 0x1a00, 0x2516, 0x0000 },
+  { 0x9a00, 0x2519, 0x2000 },
+  { 0x1a00, 0x2518, 0x0000 },
+  { 0x1a00, 0x251a, 0x0000 },
+  { 0x9a00, 0x2523, 0x4000 },
+  { 0x9a00, 0x251f, 0x3000 },
+  { 0x9a00, 0x251d, 0x2000 },
+  { 0x1a00, 0x251c, 0x0000 },
+  { 0x1a00, 0x251e, 0x0000 },
+  { 0x9a00, 0x2521, 0x2000 },
+  { 0x1a00, 0x2520, 0x0000 },
+  { 0x1a00, 0x2522, 0x0000 },
+  { 0x9a00, 0x2527, 0x3000 },
+  { 0x9a00, 0x2525, 0x2000 },
+  { 0x1a00, 0x2524, 0x0000 },
+  { 0x1a00, 0x2526, 0x0000 },
+  { 0x9a00, 0x2529, 0x2000 },
+  { 0x1a00, 0x2528, 0x0000 },
+  { 0x1a00, 0x252a, 0x0000 },
+  { 0x9a00, 0x253b, 0x5000 },
+  { 0x9a00, 0x2533, 0x4000 },
+  { 0x9a00, 0x252f, 0x3000 },
+  { 0x9a00, 0x252d, 0x2000 },
+  { 0x1a00, 0x252c, 0x0000 },
+  { 0x1a00, 0x252e, 0x0000 },
+  { 0x9a00, 0x2531, 0x2000 },
+  { 0x1a00, 0x2530, 0x0000 },
+  { 0x1a00, 0x2532, 0x0000 },
+  { 0x9a00, 0x2537, 0x3000 },
+  { 0x9a00, 0x2535, 0x2000 },
+  { 0x1a00, 0x2534, 0x0000 },
+  { 0x1a00, 0x2536, 0x0000 },
+  { 0x9a00, 0x2539, 0x2000 },
+  { 0x1a00, 0x2538, 0x0000 },
+  { 0x1a00, 0x253a, 0x0000 },
+  { 0x9a00, 0x2543, 0x4000 },
+  { 0x9a00, 0x253f, 0x3000 },
+  { 0x9a00, 0x253d, 0x2000 },
+  { 0x1a00, 0x253c, 0x0000 },
+  { 0x1a00, 0x253e, 0x0000 },
+  { 0x9a00, 0x2541, 0x2000 },
+  { 0x1a00, 0x2540, 0x0000 },
+  { 0x1a00, 0x2542, 0x0000 },
+  { 0x9a00, 0x2547, 0x3000 },
+  { 0x9a00, 0x2545, 0x2000 },
+  { 0x1a00, 0x2544, 0x0000 },
+  { 0x1a00, 0x2546, 0x0000 },
+  { 0x9a00, 0x2549, 0x2000 },
+  { 0x1a00, 0x2548, 0x0000 },
+  { 0x1a00, 0x254a, 0x0000 },
+  { 0x9a00, 0x256b, 0x6000 },
+  { 0x9a00, 0x255b, 0x5000 },
+  { 0x9a00, 0x2553, 0x4000 },
+  { 0x9a00, 0x254f, 0x3000 },
+  { 0x9a00, 0x254d, 0x2000 },
+  { 0x1a00, 0x254c, 0x0000 },
+  { 0x1a00, 0x254e, 0x0000 },
+  { 0x9a00, 0x2551, 0x2000 },
+  { 0x1a00, 0x2550, 0x0000 },
+  { 0x1a00, 0x2552, 0x0000 },
+  { 0x9a00, 0x2557, 0x3000 },
+  { 0x9a00, 0x2555, 0x2000 },
+  { 0x1a00, 0x2554, 0x0000 },
+  { 0x1a00, 0x2556, 0x0000 },
+  { 0x9a00, 0x2559, 0x2000 },
+  { 0x1a00, 0x2558, 0x0000 },
+  { 0x1a00, 0x255a, 0x0000 },
+  { 0x9a00, 0x2563, 0x4000 },
+  { 0x9a00, 0x255f, 0x3000 },
+  { 0x9a00, 0x255d, 0x2000 },
+  { 0x1a00, 0x255c, 0x0000 },
+  { 0x1a00, 0x255e, 0x0000 },
+  { 0x9a00, 0x2561, 0x2000 },
+  { 0x1a00, 0x2560, 0x0000 },
+  { 0x1a00, 0x2562, 0x0000 },
+  { 0x9a00, 0x2567, 0x3000 },
+  { 0x9a00, 0x2565, 0x2000 },
+  { 0x1a00, 0x2564, 0x0000 },
+  { 0x1a00, 0x2566, 0x0000 },
+  { 0x9a00, 0x2569, 0x2000 },
+  { 0x1a00, 0x2568, 0x0000 },
+  { 0x1a00, 0x256a, 0x0000 },
+  { 0x9a00, 0x257b, 0x5000 },
+  { 0x9a00, 0x2573, 0x4000 },
+  { 0x9a00, 0x256f, 0x3000 },
+  { 0x9a00, 0x256d, 0x2000 },
+  { 0x1a00, 0x256c, 0x0000 },
+  { 0x1a00, 0x256e, 0x0000 },
+  { 0x9a00, 0x2571, 0x2000 },
+  { 0x1a00, 0x2570, 0x0000 },
+  { 0x1a00, 0x2572, 0x0000 },
+  { 0x9a00, 0x2577, 0x3000 },
+  { 0x9a00, 0x2575, 0x2000 },
+  { 0x1a00, 0x2574, 0x0000 },
+  { 0x1a00, 0x2576, 0x0000 },
+  { 0x9a00, 0x2579, 0x2000 },
+  { 0x1a00, 0x2578, 0x0000 },
+  { 0x1a00, 0x257a, 0x0000 },
+  { 0x9a00, 0x2583, 0x4000 },
+  { 0x9a00, 0x257f, 0x3000 },
+  { 0x9a00, 0x257d, 0x2000 },
+  { 0x1a00, 0x257c, 0x0000 },
+  { 0x1a00, 0x257e, 0x0000 },
+  { 0x9a00, 0x2581, 0x2000 },
+  { 0x1a00, 0x2580, 0x0000 },
+  { 0x1a00, 0x2582, 0x0000 },
+  { 0x9a00, 0x2587, 0x3000 },
+  { 0x9a00, 0x2585, 0x2000 },
+  { 0x1a00, 0x2584, 0x0000 },
+  { 0x1a00, 0x2586, 0x0000 },
+  { 0x9a00, 0x2589, 0x2000 },
+  { 0x1a00, 0x2588, 0x0000 },
+  { 0x1a00, 0x258a, 0x0000 },
+  { 0x9a00, 0x25cb, 0x7000 },
+  { 0x9a00, 0x25ab, 0x6000 },
+  { 0x9a00, 0x259b, 0x5000 },
+  { 0x9a00, 0x2593, 0x4000 },
+  { 0x9a00, 0x258f, 0x3000 },
+  { 0x9a00, 0x258d, 0x2000 },
+  { 0x1a00, 0x258c, 0x0000 },
+  { 0x1a00, 0x258e, 0x0000 },
+  { 0x9a00, 0x2591, 0x2000 },
+  { 0x1a00, 0x2590, 0x0000 },
+  { 0x1a00, 0x2592, 0x0000 },
+  { 0x9a00, 0x2597, 0x3000 },
+  { 0x9a00, 0x2595, 0x2000 },
+  { 0x1a00, 0x2594, 0x0000 },
+  { 0x1a00, 0x2596, 0x0000 },
+  { 0x9a00, 0x2599, 0x2000 },
+  { 0x1a00, 0x2598, 0x0000 },
+  { 0x1a00, 0x259a, 0x0000 },
+  { 0x9a00, 0x25a3, 0x4000 },
+  { 0x9a00, 0x259f, 0x3000 },
+  { 0x9a00, 0x259d, 0x2000 },
+  { 0x1a00, 0x259c, 0x0000 },
+  { 0x1a00, 0x259e, 0x0000 },
+  { 0x9a00, 0x25a1, 0x2000 },
+  { 0x1a00, 0x25a0, 0x0000 },
+  { 0x1a00, 0x25a2, 0x0000 },
+  { 0x9a00, 0x25a7, 0x3000 },
+  { 0x9a00, 0x25a5, 0x2000 },
+  { 0x1a00, 0x25a4, 0x0000 },
+  { 0x1a00, 0x25a6, 0x0000 },
+  { 0x9a00, 0x25a9, 0x2000 },
+  { 0x1a00, 0x25a8, 0x0000 },
+  { 0x1a00, 0x25aa, 0x0000 },
+  { 0x9a00, 0x25bb, 0x5000 },
+  { 0x9a00, 0x25b3, 0x4000 },
+  { 0x9a00, 0x25af, 0x3000 },
+  { 0x9a00, 0x25ad, 0x2000 },
+  { 0x1a00, 0x25ac, 0x0000 },
+  { 0x1a00, 0x25ae, 0x0000 },
+  { 0x9a00, 0x25b1, 0x2000 },
+  { 0x1a00, 0x25b0, 0x0000 },
+  { 0x1a00, 0x25b2, 0x0000 },
+  { 0x9900, 0x25b7, 0x3000 },
+  { 0x9a00, 0x25b5, 0x2000 },
+  { 0x1a00, 0x25b4, 0x0000 },
+  { 0x1a00, 0x25b6, 0x0000 },
+  { 0x9a00, 0x25b9, 0x2000 },
+  { 0x1a00, 0x25b8, 0x0000 },
+  { 0x1a00, 0x25ba, 0x0000 },
+  { 0x9a00, 0x25c3, 0x4000 },
+  { 0x9a00, 0x25bf, 0x3000 },
+  { 0x9a00, 0x25bd, 0x2000 },
+  { 0x1a00, 0x25bc, 0x0000 },
+  { 0x1a00, 0x25be, 0x0000 },
+  { 0x9900, 0x25c1, 0x2000 },
+  { 0x1a00, 0x25c0, 0x0000 },
+  { 0x1a00, 0x25c2, 0x0000 },
+  { 0x9a00, 0x25c7, 0x3000 },
+  { 0x9a00, 0x25c5, 0x2000 },
+  { 0x1a00, 0x25c4, 0x0000 },
+  { 0x1a00, 0x25c6, 0x0000 },
+  { 0x9a00, 0x25c9, 0x2000 },
+  { 0x1a00, 0x25c8, 0x0000 },
+  { 0x1a00, 0x25ca, 0x0000 },
+  { 0x9a00, 0x25eb, 0x6000 },
+  { 0x9a00, 0x25db, 0x5000 },
+  { 0x9a00, 0x25d3, 0x4000 },
+  { 0x9a00, 0x25cf, 0x3000 },
+  { 0x9a00, 0x25cd, 0x2000 },
+  { 0x1a00, 0x25cc, 0x0000 },
+  { 0x1a00, 0x25ce, 0x0000 },
+  { 0x9a00, 0x25d1, 0x2000 },
+  { 0x1a00, 0x25d0, 0x0000 },
+  { 0x1a00, 0x25d2, 0x0000 },
+  { 0x9a00, 0x25d7, 0x3000 },
+  { 0x9a00, 0x25d5, 0x2000 },
+  { 0x1a00, 0x25d4, 0x0000 },
+  { 0x1a00, 0x25d6, 0x0000 },
+  { 0x9a00, 0x25d9, 0x2000 },
+  { 0x1a00, 0x25d8, 0x0000 },
+  { 0x1a00, 0x25da, 0x0000 },
+  { 0x9a00, 0x25e3, 0x4000 },
+  { 0x9a00, 0x25df, 0x3000 },
+  { 0x9a00, 0x25dd, 0x2000 },
+  { 0x1a00, 0x25dc, 0x0000 },
+  { 0x1a00, 0x25de, 0x0000 },
+  { 0x9a00, 0x25e1, 0x2000 },
+  { 0x1a00, 0x25e0, 0x0000 },
+  { 0x1a00, 0x25e2, 0x0000 },
+  { 0x9a00, 0x25e7, 0x3000 },
+  { 0x9a00, 0x25e5, 0x2000 },
+  { 0x1a00, 0x25e4, 0x0000 },
+  { 0x1a00, 0x25e6, 0x0000 },
+  { 0x9a00, 0x25e9, 0x2000 },
+  { 0x1a00, 0x25e8, 0x0000 },
+  { 0x1a00, 0x25ea, 0x0000 },
+  { 0x9900, 0x25fb, 0x5000 },
+  { 0x9a00, 0x25f3, 0x4000 },
+  { 0x9a00, 0x25ef, 0x3000 },
+  { 0x9a00, 0x25ed, 0x2000 },
+  { 0x1a00, 0x25ec, 0x0000 },
+  { 0x1a00, 0x25ee, 0x0000 },
+  { 0x9a00, 0x25f1, 0x2000 },
+  { 0x1a00, 0x25f0, 0x0000 },
+  { 0x1a00, 0x25f2, 0x0000 },
+  { 0x9a00, 0x25f7, 0x3000 },
+  { 0x9a00, 0x25f5, 0x2000 },
+  { 0x1a00, 0x25f4, 0x0000 },
+  { 0x1a00, 0x25f6, 0x0000 },
+  { 0x9900, 0x25f9, 0x2000 },
+  { 0x1900, 0x25f8, 0x0000 },
+  { 0x1900, 0x25fa, 0x0000 },
+  { 0x9a00, 0x2603, 0x4000 },
+  { 0x9900, 0x25ff, 0x3000 },
+  { 0x9900, 0x25fd, 0x2000 },
+  { 0x1900, 0x25fc, 0x0000 },
+  { 0x1900, 0x25fe, 0x0000 },
+  { 0x9a00, 0x2601, 0x2000 },
+  { 0x1a00, 0x2600, 0x0000 },
+  { 0x1a00, 0x2602, 0x0000 },
+  { 0x9a00, 0x2607, 0x3000 },
+  { 0x9a00, 0x2605, 0x2000 },
+  { 0x1a00, 0x2604, 0x0000 },
+  { 0x1a00, 0x2606, 0x0000 },
+  { 0x9a00, 0x2609, 0x2000 },
+  { 0x1a00, 0x2608, 0x0000 },
+  { 0x1a00, 0x260a, 0x0000 },
+  { 0x9a00, 0x268e, 0x8000 },
+  { 0x9a00, 0x264c, 0x7000 },
+  { 0x9a00, 0x262c, 0x6000 },
+  { 0x9a00, 0x261c, 0x5000 },
+  { 0x9a00, 0x2613, 0x4000 },
+  { 0x9a00, 0x260f, 0x3000 },
+  { 0x9a00, 0x260d, 0x2000 },
+  { 0x1a00, 0x260c, 0x0000 },
+  { 0x1a00, 0x260e, 0x0000 },
+  { 0x9a00, 0x2611, 0x2000 },
+  { 0x1a00, 0x2610, 0x0000 },
+  { 0x1a00, 0x2612, 0x0000 },
+  { 0x9a00, 0x2617, 0x3000 },
+  { 0x9a00, 0x2615, 0x2000 },
+  { 0x1a00, 0x2614, 0x0000 },
+  { 0x1a00, 0x2616, 0x0000 },
+  { 0x9a00, 0x261a, 0x2000 },
+  { 0x1a00, 0x2619, 0x0000 },
+  { 0x1a00, 0x261b, 0x0000 },
+  { 0x9a00, 0x2624, 0x4000 },
+  { 0x9a00, 0x2620, 0x3000 },
+  { 0x9a00, 0x261e, 0x2000 },
+  { 0x1a00, 0x261d, 0x0000 },
+  { 0x1a00, 0x261f, 0x0000 },
+  { 0x9a00, 0x2622, 0x2000 },
+  { 0x1a00, 0x2621, 0x0000 },
+  { 0x1a00, 0x2623, 0x0000 },
+  { 0x9a00, 0x2628, 0x3000 },
+  { 0x9a00, 0x2626, 0x2000 },
+  { 0x1a00, 0x2625, 0x0000 },
+  { 0x1a00, 0x2627, 0x0000 },
+  { 0x9a00, 0x262a, 0x2000 },
+  { 0x1a00, 0x2629, 0x0000 },
+  { 0x1a00, 0x262b, 0x0000 },
+  { 0x9a00, 0x263c, 0x5000 },
+  { 0x9a00, 0x2634, 0x4000 },
+  { 0x9a00, 0x2630, 0x3000 },
+  { 0x9a00, 0x262e, 0x2000 },
+  { 0x1a00, 0x262d, 0x0000 },
+  { 0x1a00, 0x262f, 0x0000 },
+  { 0x9a00, 0x2632, 0x2000 },
+  { 0x1a00, 0x2631, 0x0000 },
+  { 0x1a00, 0x2633, 0x0000 },
+  { 0x9a00, 0x2638, 0x3000 },
+  { 0x9a00, 0x2636, 0x2000 },
+  { 0x1a00, 0x2635, 0x0000 },
+  { 0x1a00, 0x2637, 0x0000 },
+  { 0x9a00, 0x263a, 0x2000 },
+  { 0x1a00, 0x2639, 0x0000 },
+  { 0x1a00, 0x263b, 0x0000 },
+  { 0x9a00, 0x2644, 0x4000 },
+  { 0x9a00, 0x2640, 0x3000 },
+  { 0x9a00, 0x263e, 0x2000 },
+  { 0x1a00, 0x263d, 0x0000 },
+  { 0x1a00, 0x263f, 0x0000 },
+  { 0x9a00, 0x2642, 0x2000 },
+  { 0x1a00, 0x2641, 0x0000 },
+  { 0x1a00, 0x2643, 0x0000 },
+  { 0x9a00, 0x2648, 0x3000 },
+  { 0x9a00, 0x2646, 0x2000 },
+  { 0x1a00, 0x2645, 0x0000 },
+  { 0x1a00, 0x2647, 0x0000 },
+  { 0x9a00, 0x264a, 0x2000 },
+  { 0x1a00, 0x2649, 0x0000 },
+  { 0x1a00, 0x264b, 0x0000 },
+  { 0x9a00, 0x266c, 0x6000 },
+  { 0x9a00, 0x265c, 0x5000 },
+  { 0x9a00, 0x2654, 0x4000 },
+  { 0x9a00, 0x2650, 0x3000 },
+  { 0x9a00, 0x264e, 0x2000 },
+  { 0x1a00, 0x264d, 0x0000 },
+  { 0x1a00, 0x264f, 0x0000 },
+  { 0x9a00, 0x2652, 0x2000 },
+  { 0x1a00, 0x2651, 0x0000 },
+  { 0x1a00, 0x2653, 0x0000 },
+  { 0x9a00, 0x2658, 0x3000 },
+  { 0x9a00, 0x2656, 0x2000 },
+  { 0x1a00, 0x2655, 0x0000 },
+  { 0x1a00, 0x2657, 0x0000 },
+  { 0x9a00, 0x265a, 0x2000 },
+  { 0x1a00, 0x2659, 0x0000 },
+  { 0x1a00, 0x265b, 0x0000 },
+  { 0x9a00, 0x2664, 0x4000 },
+  { 0x9a00, 0x2660, 0x3000 },
+  { 0x9a00, 0x265e, 0x2000 },
+  { 0x1a00, 0x265d, 0x0000 },
+  { 0x1a00, 0x265f, 0x0000 },
+  { 0x9a00, 0x2662, 0x2000 },
+  { 0x1a00, 0x2661, 0x0000 },
+  { 0x1a00, 0x2663, 0x0000 },
+  { 0x9a00, 0x2668, 0x3000 },
+  { 0x9a00, 0x2666, 0x2000 },
+  { 0x1a00, 0x2665, 0x0000 },
+  { 0x1a00, 0x2667, 0x0000 },
+  { 0x9a00, 0x266a, 0x2000 },
+  { 0x1a00, 0x2669, 0x0000 },
+  { 0x1a00, 0x266b, 0x0000 },
+  { 0x9a00, 0x267c, 0x5000 },
+  { 0x9a00, 0x2674, 0x4000 },
+  { 0x9a00, 0x2670, 0x3000 },
+  { 0x9a00, 0x266e, 0x2000 },
+  { 0x1a00, 0x266d, 0x0000 },
+  { 0x1900, 0x266f, 0x0000 },
+  { 0x9a00, 0x2672, 0x2000 },
+  { 0x1a00, 0x2671, 0x0000 },
+  { 0x1a00, 0x2673, 0x0000 },
+  { 0x9a00, 0x2678, 0x3000 },
+  { 0x9a00, 0x2676, 0x2000 },
+  { 0x1a00, 0x2675, 0x0000 },
+  { 0x1a00, 0x2677, 0x0000 },
+  { 0x9a00, 0x267a, 0x2000 },
+  { 0x1a00, 0x2679, 0x0000 },
+  { 0x1a00, 0x267b, 0x0000 },
+  { 0x9a00, 0x2686, 0x4000 },
+  { 0x9a00, 0x2682, 0x3000 },
+  { 0x9a00, 0x2680, 0x2000 },
+  { 0x1a00, 0x267d, 0x0000 },
+  { 0x1a00, 0x2681, 0x0000 },
+  { 0x9a00, 0x2684, 0x2000 },
+  { 0x1a00, 0x2683, 0x0000 },
+  { 0x1a00, 0x2685, 0x0000 },
+  { 0x9a00, 0x268a, 0x3000 },
+  { 0x9a00, 0x2688, 0x2000 },
+  { 0x1a00, 0x2687, 0x0000 },
+  { 0x1a00, 0x2689, 0x0000 },
+  { 0x9a00, 0x268c, 0x2000 },
+  { 0x1a00, 0x268b, 0x0000 },
+  { 0x1a00, 0x268d, 0x0000 },
+  { 0x9a00, 0x273f, 0x7000 },
+  { 0x9a00, 0x271e, 0x6000 },
+  { 0x9a00, 0x270e, 0x5000 },
+  { 0x9a00, 0x2703, 0x4000 },
+  { 0x9a00, 0x26a0, 0x3000 },
+  { 0x9a00, 0x2690, 0x2000 },
+  { 0x1a00, 0x268f, 0x0000 },
+  { 0x1a00, 0x2691, 0x0000 },
+  { 0x9a00, 0x2701, 0x2000 },
+  { 0x1a00, 0x26a1, 0x0000 },
+  { 0x1a00, 0x2702, 0x0000 },
+  { 0x9a00, 0x2708, 0x3000 },
+  { 0x9a00, 0x2706, 0x2000 },
+  { 0x1a00, 0x2704, 0x0000 },
+  { 0x1a00, 0x2707, 0x0000 },
+  { 0x9a00, 0x270c, 0x2000 },
+  { 0x1a00, 0x2709, 0x0000 },
+  { 0x1a00, 0x270d, 0x0000 },
+  { 0x9a00, 0x2716, 0x4000 },
+  { 0x9a00, 0x2712, 0x3000 },
+  { 0x9a00, 0x2710, 0x2000 },
+  { 0x1a00, 0x270f, 0x0000 },
+  { 0x1a00, 0x2711, 0x0000 },
+  { 0x9a00, 0x2714, 0x2000 },
+  { 0x1a00, 0x2713, 0x0000 },
+  { 0x1a00, 0x2715, 0x0000 },
+  { 0x9a00, 0x271a, 0x3000 },
+  { 0x9a00, 0x2718, 0x2000 },
+  { 0x1a00, 0x2717, 0x0000 },
+  { 0x1a00, 0x2719, 0x0000 },
+  { 0x9a00, 0x271c, 0x2000 },
+  { 0x1a00, 0x271b, 0x0000 },
+  { 0x1a00, 0x271d, 0x0000 },
+  { 0x9a00, 0x272f, 0x5000 },
+  { 0x9a00, 0x2726, 0x4000 },
+  { 0x9a00, 0x2722, 0x3000 },
+  { 0x9a00, 0x2720, 0x2000 },
+  { 0x1a00, 0x271f, 0x0000 },
+  { 0x1a00, 0x2721, 0x0000 },
+  { 0x9a00, 0x2724, 0x2000 },
+  { 0x1a00, 0x2723, 0x0000 },
+  { 0x1a00, 0x2725, 0x0000 },
+  { 0x9a00, 0x272b, 0x3000 },
+  { 0x9a00, 0x2729, 0x2000 },
+  { 0x1a00, 0x2727, 0x0000 },
+  { 0x1a00, 0x272a, 0x0000 },
+  { 0x9a00, 0x272d, 0x2000 },
+  { 0x1a00, 0x272c, 0x0000 },
+  { 0x1a00, 0x272e, 0x0000 },
+  { 0x9a00, 0x2737, 0x4000 },
+  { 0x9a00, 0x2733, 0x3000 },
+  { 0x9a00, 0x2731, 0x2000 },
+  { 0x1a00, 0x2730, 0x0000 },
+  { 0x1a00, 0x2732, 0x0000 },
+  { 0x9a00, 0x2735, 0x2000 },
+  { 0x1a00, 0x2734, 0x0000 },
+  { 0x1a00, 0x2736, 0x0000 },
+  { 0x9a00, 0x273b, 0x3000 },
+  { 0x9a00, 0x2739, 0x2000 },
+  { 0x1a00, 0x2738, 0x0000 },
+  { 0x1a00, 0x273a, 0x0000 },
+  { 0x9a00, 0x273d, 0x2000 },
+  { 0x1a00, 0x273c, 0x0000 },
+  { 0x1a00, 0x273e, 0x0000 },
+  { 0x9a00, 0x2767, 0x6000 },
+  { 0x9a00, 0x2751, 0x5000 },
+  { 0x9a00, 0x2747, 0x4000 },
+  { 0x9a00, 0x2743, 0x3000 },
+  { 0x9a00, 0x2741, 0x2000 },
+  { 0x1a00, 0x2740, 0x0000 },
+  { 0x1a00, 0x2742, 0x0000 },
+  { 0x9a00, 0x2745, 0x2000 },
+  { 0x1a00, 0x2744, 0x0000 },
+  { 0x1a00, 0x2746, 0x0000 },
+  { 0x9a00, 0x274b, 0x3000 },
+  { 0x9a00, 0x2749, 0x2000 },
+  { 0x1a00, 0x2748, 0x0000 },
+  { 0x1a00, 0x274a, 0x0000 },
+  { 0x9a00, 0x274f, 0x2000 },
+  { 0x1a00, 0x274d, 0x0000 },
+  { 0x1a00, 0x2750, 0x0000 },
+  { 0x9a00, 0x275d, 0x4000 },
+  { 0x9a00, 0x2759, 0x3000 },
+  { 0x9a00, 0x2756, 0x2000 },
+  { 0x1a00, 0x2752, 0x0000 },
+  { 0x1a00, 0x2758, 0x0000 },
+  { 0x9a00, 0x275b, 0x2000 },
+  { 0x1a00, 0x275a, 0x0000 },
+  { 0x1a00, 0x275c, 0x0000 },
+  { 0x9a00, 0x2763, 0x3000 },
+  { 0x9a00, 0x2761, 0x2000 },
+  { 0x1a00, 0x275e, 0x0000 },
+  { 0x1a00, 0x2762, 0x0000 },
+  { 0x9a00, 0x2765, 0x2000 },
+  { 0x1a00, 0x2764, 0x0000 },
+  { 0x1a00, 0x2766, 0x0000 },
+  { 0x8f00, 0x2777, 0x5000 },
+  { 0x9200, 0x276f, 0x4000 },
+  { 0x9200, 0x276b, 0x3000 },
+  { 0x9200, 0x2769, 0x2000 },
+  { 0x1600, 0x2768, 0x0000 },
+  { 0x1600, 0x276a, 0x0000 },
+  { 0x9200, 0x276d, 0x2000 },
+  { 0x1600, 0x276c, 0x0000 },
+  { 0x1600, 0x276e, 0x0000 },
+  { 0x9200, 0x2773, 0x3000 },
+  { 0x9200, 0x2771, 0x2000 },
+  { 0x1600, 0x2770, 0x0000 },
+  { 0x1600, 0x2772, 0x0000 },
+  { 0x9200, 0x2775, 0x2000 },
+  { 0x1600, 0x2774, 0x0000 },
+  { 0x0f00, 0x2776, 0x0000 },
+  { 0x8f00, 0x277f, 0x4000 },
+  { 0x8f00, 0x277b, 0x3000 },
+  { 0x8f00, 0x2779, 0x2000 },
+  { 0x0f00, 0x2778, 0x0000 },
+  { 0x0f00, 0x277a, 0x0000 },
+  { 0x8f00, 0x277d, 0x2000 },
+  { 0x0f00, 0x277c, 0x0000 },
+  { 0x0f00, 0x277e, 0x0000 },
+  { 0x8f00, 0x2783, 0x3000 },
+  { 0x8f00, 0x2781, 0x2000 },
+  { 0x0f00, 0x2780, 0x0000 },
+  { 0x0f00, 0x2782, 0x0000 },
+  { 0x8f00, 0x2785, 0x2000 },
+  { 0x0f00, 0x2784, 0x0000 },
+  { 0x0f00, 0x2786, 0x0000 },
+  { 0x9900, 0x29a0, 0xa000 },
+  { 0x9a00, 0x28a0, 0x9000 },
+  { 0x9a00, 0x2820, 0x8000 },
+  { 0x9900, 0x27dc, 0x7000 },
+  { 0x9a00, 0x27aa, 0x6000 },
+  { 0x9a00, 0x279a, 0x5000 },
+  { 0x8f00, 0x278f, 0x4000 },
+  { 0x8f00, 0x278b, 0x3000 },
+  { 0x8f00, 0x2789, 0x2000 },
+  { 0x0f00, 0x2788, 0x0000 },
+  { 0x0f00, 0x278a, 0x0000 },
+  { 0x8f00, 0x278d, 0x2000 },
+  { 0x0f00, 0x278c, 0x0000 },
+  { 0x0f00, 0x278e, 0x0000 },
+  { 0x8f00, 0x2793, 0x3000 },
+  { 0x8f00, 0x2791, 0x2000 },
+  { 0x0f00, 0x2790, 0x0000 },
+  { 0x0f00, 0x2792, 0x0000 },
+  { 0x9a00, 0x2798, 0x2000 },
+  { 0x1a00, 0x2794, 0x0000 },
+  { 0x1a00, 0x2799, 0x0000 },
+  { 0x9a00, 0x27a2, 0x4000 },
+  { 0x9a00, 0x279e, 0x3000 },
+  { 0x9a00, 0x279c, 0x2000 },
+  { 0x1a00, 0x279b, 0x0000 },
+  { 0x1a00, 0x279d, 0x0000 },
+  { 0x9a00, 0x27a0, 0x2000 },
+  { 0x1a00, 0x279f, 0x0000 },
+  { 0x1a00, 0x27a1, 0x0000 },
+  { 0x9a00, 0x27a6, 0x3000 },
+  { 0x9a00, 0x27a4, 0x2000 },
+  { 0x1a00, 0x27a3, 0x0000 },
+  { 0x1a00, 0x27a5, 0x0000 },
+  { 0x9a00, 0x27a8, 0x2000 },
+  { 0x1a00, 0x27a7, 0x0000 },
+  { 0x1a00, 0x27a9, 0x0000 },
+  { 0x9a00, 0x27bb, 0x5000 },
+  { 0x9a00, 0x27b3, 0x4000 },
+  { 0x9a00, 0x27ae, 0x3000 },
+  { 0x9a00, 0x27ac, 0x2000 },
+  { 0x1a00, 0x27ab, 0x0000 },
+  { 0x1a00, 0x27ad, 0x0000 },
+  { 0x9a00, 0x27b1, 0x2000 },
+  { 0x1a00, 0x27af, 0x0000 },
+  { 0x1a00, 0x27b2, 0x0000 },
+  { 0x9a00, 0x27b7, 0x3000 },
+  { 0x9a00, 0x27b5, 0x2000 },
+  { 0x1a00, 0x27b4, 0x0000 },
+  { 0x1a00, 0x27b6, 0x0000 },
+  { 0x9a00, 0x27b9, 0x2000 },
+  { 0x1a00, 0x27b8, 0x0000 },
+  { 0x1a00, 0x27ba, 0x0000 },
+  { 0x9900, 0x27d4, 0x4000 },
+  { 0x9900, 0x27d0, 0x3000 },
+  { 0x9a00, 0x27bd, 0x2000 },
+  { 0x1a00, 0x27bc, 0x0000 },
+  { 0x1a00, 0x27be, 0x0000 },
+  { 0x9900, 0x27d2, 0x2000 },
+  { 0x1900, 0x27d1, 0x0000 },
+  { 0x1900, 0x27d3, 0x0000 },
+  { 0x9900, 0x27d8, 0x3000 },
+  { 0x9900, 0x27d6, 0x2000 },
+  { 0x1900, 0x27d5, 0x0000 },
+  { 0x1900, 0x27d7, 0x0000 },
+  { 0x9900, 0x27da, 0x2000 },
+  { 0x1900, 0x27d9, 0x0000 },
+  { 0x1900, 0x27db, 0x0000 },
+  { 0x9a00, 0x2800, 0x6000 },
+  { 0x9900, 0x27f0, 0x5000 },
+  { 0x9900, 0x27e4, 0x4000 },
+  { 0x9900, 0x27e0, 0x3000 },
+  { 0x9900, 0x27de, 0x2000 },
+  { 0x1900, 0x27dd, 0x0000 },
+  { 0x1900, 0x27df, 0x0000 },
+  { 0x9900, 0x27e2, 0x2000 },
+  { 0x1900, 0x27e1, 0x0000 },
+  { 0x1900, 0x27e3, 0x0000 },
+  { 0x9600, 0x27e8, 0x3000 },
+  { 0x9600, 0x27e6, 0x2000 },
+  { 0x1900, 0x27e5, 0x0000 },
+  { 0x1200, 0x27e7, 0x0000 },
+  { 0x9600, 0x27ea, 0x2000 },
+  { 0x1200, 0x27e9, 0x0000 },
+  { 0x1200, 0x27eb, 0x0000 },
+  { 0x9900, 0x27f8, 0x4000 },
+  { 0x9900, 0x27f4, 0x3000 },
+  { 0x9900, 0x27f2, 0x2000 },
+  { 0x1900, 0x27f1, 0x0000 },
+  { 0x1900, 0x27f3, 0x0000 },
+  { 0x9900, 0x27f6, 0x2000 },
+  { 0x1900, 0x27f5, 0x0000 },
+  { 0x1900, 0x27f7, 0x0000 },
+  { 0x9900, 0x27fc, 0x3000 },
+  { 0x9900, 0x27fa, 0x2000 },
+  { 0x1900, 0x27f9, 0x0000 },
+  { 0x1900, 0x27fb, 0x0000 },
+  { 0x9900, 0x27fe, 0x2000 },
+  { 0x1900, 0x27fd, 0x0000 },
+  { 0x1900, 0x27ff, 0x0000 },
+  { 0x9a00, 0x2810, 0x5000 },
+  { 0x9a00, 0x2808, 0x4000 },
+  { 0x9a00, 0x2804, 0x3000 },
+  { 0x9a00, 0x2802, 0x2000 },
+  { 0x1a00, 0x2801, 0x0000 },
+  { 0x1a00, 0x2803, 0x0000 },
+  { 0x9a00, 0x2806, 0x2000 },
+  { 0x1a00, 0x2805, 0x0000 },
+  { 0x1a00, 0x2807, 0x0000 },
+  { 0x9a00, 0x280c, 0x3000 },
+  { 0x9a00, 0x280a, 0x2000 },
+  { 0x1a00, 0x2809, 0x0000 },
+  { 0x1a00, 0x280b, 0x0000 },
+  { 0x9a00, 0x280e, 0x2000 },
+  { 0x1a00, 0x280d, 0x0000 },
+  { 0x1a00, 0x280f, 0x0000 },
+  { 0x9a00, 0x2818, 0x4000 },
+  { 0x9a00, 0x2814, 0x3000 },
+  { 0x9a00, 0x2812, 0x2000 },
+  { 0x1a00, 0x2811, 0x0000 },
+  { 0x1a00, 0x2813, 0x0000 },
+  { 0x9a00, 0x2816, 0x2000 },
+  { 0x1a00, 0x2815, 0x0000 },
+  { 0x1a00, 0x2817, 0x0000 },
+  { 0x9a00, 0x281c, 0x3000 },
+  { 0x9a00, 0x281a, 0x2000 },
+  { 0x1a00, 0x2819, 0x0000 },
+  { 0x1a00, 0x281b, 0x0000 },
+  { 0x9a00, 0x281e, 0x2000 },
+  { 0x1a00, 0x281d, 0x0000 },
+  { 0x1a00, 0x281f, 0x0000 },
+  { 0x9a00, 0x2860, 0x7000 },
+  { 0x9a00, 0x2840, 0x6000 },
+  { 0x9a00, 0x2830, 0x5000 },
+  { 0x9a00, 0x2828, 0x4000 },
+  { 0x9a00, 0x2824, 0x3000 },
+  { 0x9a00, 0x2822, 0x2000 },
+  { 0x1a00, 0x2821, 0x0000 },
+  { 0x1a00, 0x2823, 0x0000 },
+  { 0x9a00, 0x2826, 0x2000 },
+  { 0x1a00, 0x2825, 0x0000 },
+  { 0x1a00, 0x2827, 0x0000 },
+  { 0x9a00, 0x282c, 0x3000 },
+  { 0x9a00, 0x282a, 0x2000 },
+  { 0x1a00, 0x2829, 0x0000 },
+  { 0x1a00, 0x282b, 0x0000 },
+  { 0x9a00, 0x282e, 0x2000 },
+  { 0x1a00, 0x282d, 0x0000 },
+  { 0x1a00, 0x282f, 0x0000 },
+  { 0x9a00, 0x2838, 0x4000 },
+  { 0x9a00, 0x2834, 0x3000 },
+  { 0x9a00, 0x2832, 0x2000 },
+  { 0x1a00, 0x2831, 0x0000 },
+  { 0x1a00, 0x2833, 0x0000 },
+  { 0x9a00, 0x2836, 0x2000 },
+  { 0x1a00, 0x2835, 0x0000 },
+  { 0x1a00, 0x2837, 0x0000 },
+  { 0x9a00, 0x283c, 0x3000 },
+  { 0x9a00, 0x283a, 0x2000 },
+  { 0x1a00, 0x2839, 0x0000 },
+  { 0x1a00, 0x283b, 0x0000 },
+  { 0x9a00, 0x283e, 0x2000 },
+  { 0x1a00, 0x283d, 0x0000 },
+  { 0x1a00, 0x283f, 0x0000 },
+  { 0x9a00, 0x2850, 0x5000 },
+  { 0x9a00, 0x2848, 0x4000 },
+  { 0x9a00, 0x2844, 0x3000 },
+  { 0x9a00, 0x2842, 0x2000 },
+  { 0x1a00, 0x2841, 0x0000 },
+  { 0x1a00, 0x2843, 0x0000 },
+  { 0x9a00, 0x2846, 0x2000 },
+  { 0x1a00, 0x2845, 0x0000 },
+  { 0x1a00, 0x2847, 0x0000 },
+  { 0x9a00, 0x284c, 0x3000 },
+  { 0x9a00, 0x284a, 0x2000 },
+  { 0x1a00, 0x2849, 0x0000 },
+  { 0x1a00, 0x284b, 0x0000 },
+  { 0x9a00, 0x284e, 0x2000 },
+  { 0x1a00, 0x284d, 0x0000 },
+  { 0x1a00, 0x284f, 0x0000 },
+  { 0x9a00, 0x2858, 0x4000 },
+  { 0x9a00, 0x2854, 0x3000 },
+  { 0x9a00, 0x2852, 0x2000 },
+  { 0x1a00, 0x2851, 0x0000 },
+  { 0x1a00, 0x2853, 0x0000 },
+  { 0x9a00, 0x2856, 0x2000 },
+  { 0x1a00, 0x2855, 0x0000 },
+  { 0x1a00, 0x2857, 0x0000 },
+  { 0x9a00, 0x285c, 0x3000 },
+  { 0x9a00, 0x285a, 0x2000 },
+  { 0x1a00, 0x2859, 0x0000 },
+  { 0x1a00, 0x285b, 0x0000 },
+  { 0x9a00, 0x285e, 0x2000 },
+  { 0x1a00, 0x285d, 0x0000 },
+  { 0x1a00, 0x285f, 0x0000 },
+  { 0x9a00, 0x2880, 0x6000 },
+  { 0x9a00, 0x2870, 0x5000 },
+  { 0x9a00, 0x2868, 0x4000 },
+  { 0x9a00, 0x2864, 0x3000 },
+  { 0x9a00, 0x2862, 0x2000 },
+  { 0x1a00, 0x2861, 0x0000 },
+  { 0x1a00, 0x2863, 0x0000 },
+  { 0x9a00, 0x2866, 0x2000 },
+  { 0x1a00, 0x2865, 0x0000 },
+  { 0x1a00, 0x2867, 0x0000 },
+  { 0x9a00, 0x286c, 0x3000 },
+  { 0x9a00, 0x286a, 0x2000 },
+  { 0x1a00, 0x2869, 0x0000 },
+  { 0x1a00, 0x286b, 0x0000 },
+  { 0x9a00, 0x286e, 0x2000 },
+  { 0x1a00, 0x286d, 0x0000 },
+  { 0x1a00, 0x286f, 0x0000 },
+  { 0x9a00, 0x2878, 0x4000 },
+  { 0x9a00, 0x2874, 0x3000 },
+  { 0x9a00, 0x2872, 0x2000 },
+  { 0x1a00, 0x2871, 0x0000 },
+  { 0x1a00, 0x2873, 0x0000 },
+  { 0x9a00, 0x2876, 0x2000 },
+  { 0x1a00, 0x2875, 0x0000 },
+  { 0x1a00, 0x2877, 0x0000 },
+  { 0x9a00, 0x287c, 0x3000 },
+  { 0x9a00, 0x287a, 0x2000 },
+  { 0x1a00, 0x2879, 0x0000 },
+  { 0x1a00, 0x287b, 0x0000 },
+  { 0x9a00, 0x287e, 0x2000 },
+  { 0x1a00, 0x287d, 0x0000 },
+  { 0x1a00, 0x287f, 0x0000 },
+  { 0x9a00, 0x2890, 0x5000 },
+  { 0x9a00, 0x2888, 0x4000 },
+  { 0x9a00, 0x2884, 0x3000 },
+  { 0x9a00, 0x2882, 0x2000 },
+  { 0x1a00, 0x2881, 0x0000 },
+  { 0x1a00, 0x2883, 0x0000 },
+  { 0x9a00, 0x2886, 0x2000 },
+  { 0x1a00, 0x2885, 0x0000 },
+  { 0x1a00, 0x2887, 0x0000 },
+  { 0x9a00, 0x288c, 0x3000 },
+  { 0x9a00, 0x288a, 0x2000 },
+  { 0x1a00, 0x2889, 0x0000 },
+  { 0x1a00, 0x288b, 0x0000 },
+  { 0x9a00, 0x288e, 0x2000 },
+  { 0x1a00, 0x288d, 0x0000 },
+  { 0x1a00, 0x288f, 0x0000 },
+  { 0x9a00, 0x2898, 0x4000 },
+  { 0x9a00, 0x2894, 0x3000 },
+  { 0x9a00, 0x2892, 0x2000 },
+  { 0x1a00, 0x2891, 0x0000 },
+  { 0x1a00, 0x2893, 0x0000 },
+  { 0x9a00, 0x2896, 0x2000 },
+  { 0x1a00, 0x2895, 0x0000 },
+  { 0x1a00, 0x2897, 0x0000 },
+  { 0x9a00, 0x289c, 0x3000 },
+  { 0x9a00, 0x289a, 0x2000 },
+  { 0x1a00, 0x2899, 0x0000 },
+  { 0x1a00, 0x289b, 0x0000 },
+  { 0x9a00, 0x289e, 0x2000 },
+  { 0x1a00, 0x289d, 0x0000 },
+  { 0x1a00, 0x289f, 0x0000 },
+  { 0x9900, 0x2920, 0x8000 },
+  { 0x9a00, 0x28e0, 0x7000 },
+  { 0x9a00, 0x28c0, 0x6000 },
+  { 0x9a00, 0x28b0, 0x5000 },
+  { 0x9a00, 0x28a8, 0x4000 },
+  { 0x9a00, 0x28a4, 0x3000 },
+  { 0x9a00, 0x28a2, 0x2000 },
+  { 0x1a00, 0x28a1, 0x0000 },
+  { 0x1a00, 0x28a3, 0x0000 },
+  { 0x9a00, 0x28a6, 0x2000 },
+  { 0x1a00, 0x28a5, 0x0000 },
+  { 0x1a00, 0x28a7, 0x0000 },
+  { 0x9a00, 0x28ac, 0x3000 },
+  { 0x9a00, 0x28aa, 0x2000 },
+  { 0x1a00, 0x28a9, 0x0000 },
+  { 0x1a00, 0x28ab, 0x0000 },
+  { 0x9a00, 0x28ae, 0x2000 },
+  { 0x1a00, 0x28ad, 0x0000 },
+  { 0x1a00, 0x28af, 0x0000 },
+  { 0x9a00, 0x28b8, 0x4000 },
+  { 0x9a00, 0x28b4, 0x3000 },
+  { 0x9a00, 0x28b2, 0x2000 },
+  { 0x1a00, 0x28b1, 0x0000 },
+  { 0x1a00, 0x28b3, 0x0000 },
+  { 0x9a00, 0x28b6, 0x2000 },
+  { 0x1a00, 0x28b5, 0x0000 },
+  { 0x1a00, 0x28b7, 0x0000 },
+  { 0x9a00, 0x28bc, 0x3000 },
+  { 0x9a00, 0x28ba, 0x2000 },
+  { 0x1a00, 0x28b9, 0x0000 },
+  { 0x1a00, 0x28bb, 0x0000 },
+  { 0x9a00, 0x28be, 0x2000 },
+  { 0x1a00, 0x28bd, 0x0000 },
+  { 0x1a00, 0x28bf, 0x0000 },
+  { 0x9a00, 0x28d0, 0x5000 },
+  { 0x9a00, 0x28c8, 0x4000 },
+  { 0x9a00, 0x28c4, 0x3000 },
+  { 0x9a00, 0x28c2, 0x2000 },
+  { 0x1a00, 0x28c1, 0x0000 },
+  { 0x1a00, 0x28c3, 0x0000 },
+  { 0x9a00, 0x28c6, 0x2000 },
+  { 0x1a00, 0x28c5, 0x0000 },
+  { 0x1a00, 0x28c7, 0x0000 },
+  { 0x9a00, 0x28cc, 0x3000 },
+  { 0x9a00, 0x28ca, 0x2000 },
+  { 0x1a00, 0x28c9, 0x0000 },
+  { 0x1a00, 0x28cb, 0x0000 },
+  { 0x9a00, 0x28ce, 0x2000 },
+  { 0x1a00, 0x28cd, 0x0000 },
+  { 0x1a00, 0x28cf, 0x0000 },
+  { 0x9a00, 0x28d8, 0x4000 },
+  { 0x9a00, 0x28d4, 0x3000 },
+  { 0x9a00, 0x28d2, 0x2000 },
+  { 0x1a00, 0x28d1, 0x0000 },
+  { 0x1a00, 0x28d3, 0x0000 },
+  { 0x9a00, 0x28d6, 0x2000 },
+  { 0x1a00, 0x28d5, 0x0000 },
+  { 0x1a00, 0x28d7, 0x0000 },
+  { 0x9a00, 0x28dc, 0x3000 },
+  { 0x9a00, 0x28da, 0x2000 },
+  { 0x1a00, 0x28d9, 0x0000 },
+  { 0x1a00, 0x28db, 0x0000 },
+  { 0x9a00, 0x28de, 0x2000 },
+  { 0x1a00, 0x28dd, 0x0000 },
+  { 0x1a00, 0x28df, 0x0000 },
+  { 0x9900, 0x2900, 0x6000 },
+  { 0x9a00, 0x28f0, 0x5000 },
+  { 0x9a00, 0x28e8, 0x4000 },
+  { 0x9a00, 0x28e4, 0x3000 },
+  { 0x9a00, 0x28e2, 0x2000 },
+  { 0x1a00, 0x28e1, 0x0000 },
+  { 0x1a00, 0x28e3, 0x0000 },
+  { 0x9a00, 0x28e6, 0x2000 },
+  { 0x1a00, 0x28e5, 0x0000 },
+  { 0x1a00, 0x28e7, 0x0000 },
+  { 0x9a00, 0x28ec, 0x3000 },
+  { 0x9a00, 0x28ea, 0x2000 },
+  { 0x1a00, 0x28e9, 0x0000 },
+  { 0x1a00, 0x28eb, 0x0000 },
+  { 0x9a00, 0x28ee, 0x2000 },
+  { 0x1a00, 0x28ed, 0x0000 },
+  { 0x1a00, 0x28ef, 0x0000 },
+  { 0x9a00, 0x28f8, 0x4000 },
+  { 0x9a00, 0x28f4, 0x3000 },
+  { 0x9a00, 0x28f2, 0x2000 },
+  { 0x1a00, 0x28f1, 0x0000 },
+  { 0x1a00, 0x28f3, 0x0000 },
+  { 0x9a00, 0x28f6, 0x2000 },
+  { 0x1a00, 0x28f5, 0x0000 },
+  { 0x1a00, 0x28f7, 0x0000 },
+  { 0x9a00, 0x28fc, 0x3000 },
+  { 0x9a00, 0x28fa, 0x2000 },
+  { 0x1a00, 0x28f9, 0x0000 },
+  { 0x1a00, 0x28fb, 0x0000 },
+  { 0x9a00, 0x28fe, 0x2000 },
+  { 0x1a00, 0x28fd, 0x0000 },
+  { 0x1a00, 0x28ff, 0x0000 },
+  { 0x9900, 0x2910, 0x5000 },
+  { 0x9900, 0x2908, 0x4000 },
+  { 0x9900, 0x2904, 0x3000 },
+  { 0x9900, 0x2902, 0x2000 },
+  { 0x1900, 0x2901, 0x0000 },
+  { 0x1900, 0x2903, 0x0000 },
+  { 0x9900, 0x2906, 0x2000 },
+  { 0x1900, 0x2905, 0x0000 },
+  { 0x1900, 0x2907, 0x0000 },
+  { 0x9900, 0x290c, 0x3000 },
+  { 0x9900, 0x290a, 0x2000 },
+  { 0x1900, 0x2909, 0x0000 },
+  { 0x1900, 0x290b, 0x0000 },
+  { 0x9900, 0x290e, 0x2000 },
+  { 0x1900, 0x290d, 0x0000 },
+  { 0x1900, 0x290f, 0x0000 },
+  { 0x9900, 0x2918, 0x4000 },
+  { 0x9900, 0x2914, 0x3000 },
+  { 0x9900, 0x2912, 0x2000 },
+  { 0x1900, 0x2911, 0x0000 },
+  { 0x1900, 0x2913, 0x0000 },
+  { 0x9900, 0x2916, 0x2000 },
+  { 0x1900, 0x2915, 0x0000 },
+  { 0x1900, 0x2917, 0x0000 },
+  { 0x9900, 0x291c, 0x3000 },
+  { 0x9900, 0x291a, 0x2000 },
+  { 0x1900, 0x2919, 0x0000 },
+  { 0x1900, 0x291b, 0x0000 },
+  { 0x9900, 0x291e, 0x2000 },
+  { 0x1900, 0x291d, 0x0000 },
+  { 0x1900, 0x291f, 0x0000 },
+  { 0x9900, 0x2960, 0x7000 },
+  { 0x9900, 0x2940, 0x6000 },
+  { 0x9900, 0x2930, 0x5000 },
+  { 0x9900, 0x2928, 0x4000 },
+  { 0x9900, 0x2924, 0x3000 },
+  { 0x9900, 0x2922, 0x2000 },
+  { 0x1900, 0x2921, 0x0000 },
+  { 0x1900, 0x2923, 0x0000 },
+  { 0x9900, 0x2926, 0x2000 },
+  { 0x1900, 0x2925, 0x0000 },
+  { 0x1900, 0x2927, 0x0000 },
+  { 0x9900, 0x292c, 0x3000 },
+  { 0x9900, 0x292a, 0x2000 },
+  { 0x1900, 0x2929, 0x0000 },
+  { 0x1900, 0x292b, 0x0000 },
+  { 0x9900, 0x292e, 0x2000 },
+  { 0x1900, 0x292d, 0x0000 },
+  { 0x1900, 0x292f, 0x0000 },
+  { 0x9900, 0x2938, 0x4000 },
+  { 0x9900, 0x2934, 0x3000 },
+  { 0x9900, 0x2932, 0x2000 },
+  { 0x1900, 0x2931, 0x0000 },
+  { 0x1900, 0x2933, 0x0000 },
+  { 0x9900, 0x2936, 0x2000 },
+  { 0x1900, 0x2935, 0x0000 },
+  { 0x1900, 0x2937, 0x0000 },
+  { 0x9900, 0x293c, 0x3000 },
+  { 0x9900, 0x293a, 0x2000 },
+  { 0x1900, 0x2939, 0x0000 },
+  { 0x1900, 0x293b, 0x0000 },
+  { 0x9900, 0x293e, 0x2000 },
+  { 0x1900, 0x293d, 0x0000 },
+  { 0x1900, 0x293f, 0x0000 },
+  { 0x9900, 0x2950, 0x5000 },
+  { 0x9900, 0x2948, 0x4000 },
+  { 0x9900, 0x2944, 0x3000 },
+  { 0x9900, 0x2942, 0x2000 },
+  { 0x1900, 0x2941, 0x0000 },
+  { 0x1900, 0x2943, 0x0000 },
+  { 0x9900, 0x2946, 0x2000 },
+  { 0x1900, 0x2945, 0x0000 },
+  { 0x1900, 0x2947, 0x0000 },
+  { 0x9900, 0x294c, 0x3000 },
+  { 0x9900, 0x294a, 0x2000 },
+  { 0x1900, 0x2949, 0x0000 },
+  { 0x1900, 0x294b, 0x0000 },
+  { 0x9900, 0x294e, 0x2000 },
+  { 0x1900, 0x294d, 0x0000 },
+  { 0x1900, 0x294f, 0x0000 },
+  { 0x9900, 0x2958, 0x4000 },
+  { 0x9900, 0x2954, 0x3000 },
+  { 0x9900, 0x2952, 0x2000 },
+  { 0x1900, 0x2951, 0x0000 },
+  { 0x1900, 0x2953, 0x0000 },
+  { 0x9900, 0x2956, 0x2000 },
+  { 0x1900, 0x2955, 0x0000 },
+  { 0x1900, 0x2957, 0x0000 },
+  { 0x9900, 0x295c, 0x3000 },
+  { 0x9900, 0x295a, 0x2000 },
+  { 0x1900, 0x2959, 0x0000 },
+  { 0x1900, 0x295b, 0x0000 },
+  { 0x9900, 0x295e, 0x2000 },
+  { 0x1900, 0x295d, 0x0000 },
+  { 0x1900, 0x295f, 0x0000 },
+  { 0x9900, 0x2980, 0x6000 },
+  { 0x9900, 0x2970, 0x5000 },
+  { 0x9900, 0x2968, 0x4000 },
+  { 0x9900, 0x2964, 0x3000 },
+  { 0x9900, 0x2962, 0x2000 },
+  { 0x1900, 0x2961, 0x0000 },
+  { 0x1900, 0x2963, 0x0000 },
+  { 0x9900, 0x2966, 0x2000 },
+  { 0x1900, 0x2965, 0x0000 },
+  { 0x1900, 0x2967, 0x0000 },
+  { 0x9900, 0x296c, 0x3000 },
+  { 0x9900, 0x296a, 0x2000 },
+  { 0x1900, 0x2969, 0x0000 },
+  { 0x1900, 0x296b, 0x0000 },
+  { 0x9900, 0x296e, 0x2000 },
+  { 0x1900, 0x296d, 0x0000 },
+  { 0x1900, 0x296f, 0x0000 },
+  { 0x9900, 0x2978, 0x4000 },
+  { 0x9900, 0x2974, 0x3000 },
+  { 0x9900, 0x2972, 0x2000 },
+  { 0x1900, 0x2971, 0x0000 },
+  { 0x1900, 0x2973, 0x0000 },
+  { 0x9900, 0x2976, 0x2000 },
+  { 0x1900, 0x2975, 0x0000 },
+  { 0x1900, 0x2977, 0x0000 },
+  { 0x9900, 0x297c, 0x3000 },
+  { 0x9900, 0x297a, 0x2000 },
+  { 0x1900, 0x2979, 0x0000 },
+  { 0x1900, 0x297b, 0x0000 },
+  { 0x9900, 0x297e, 0x2000 },
+  { 0x1900, 0x297d, 0x0000 },
+  { 0x1900, 0x297f, 0x0000 },
+  { 0x9200, 0x2990, 0x5000 },
+  { 0x9200, 0x2988, 0x4000 },
+  { 0x9200, 0x2984, 0x3000 },
+  { 0x9900, 0x2982, 0x2000 },
+  { 0x1900, 0x2981, 0x0000 },
+  { 0x1600, 0x2983, 0x0000 },
+  { 0x9200, 0x2986, 0x2000 },
+  { 0x1600, 0x2985, 0x0000 },
+  { 0x1600, 0x2987, 0x0000 },
+  { 0x9200, 0x298c, 0x3000 },
+  { 0x9200, 0x298a, 0x2000 },
+  { 0x1600, 0x2989, 0x0000 },
+  { 0x1600, 0x298b, 0x0000 },
+  { 0x9200, 0x298e, 0x2000 },
+  { 0x1600, 0x298d, 0x0000 },
+  { 0x1600, 0x298f, 0x0000 },
+  { 0x9200, 0x2998, 0x4000 },
+  { 0x9200, 0x2994, 0x3000 },
+  { 0x9200, 0x2992, 0x2000 },
+  { 0x1600, 0x2991, 0x0000 },
+  { 0x1600, 0x2993, 0x0000 },
+  { 0x9200, 0x2996, 0x2000 },
+  { 0x1600, 0x2995, 0x0000 },
+  { 0x1600, 0x2997, 0x0000 },
+  { 0x9900, 0x299c, 0x3000 },
+  { 0x9900, 0x299a, 0x2000 },
+  { 0x1900, 0x2999, 0x0000 },
+  { 0x1900, 0x299b, 0x0000 },
+  { 0x9900, 0x299e, 0x2000 },
+  { 0x1900, 0x299d, 0x0000 },
+  { 0x1900, 0x299f, 0x0000 },
+  { 0x9900, 0x2aa0, 0x9000 },
+  { 0x9900, 0x2a20, 0x8000 },
+  { 0x9900, 0x29e0, 0x7000 },
+  { 0x9900, 0x29c0, 0x6000 },
+  { 0x9900, 0x29b0, 0x5000 },
+  { 0x9900, 0x29a8, 0x4000 },
+  { 0x9900, 0x29a4, 0x3000 },
+  { 0x9900, 0x29a2, 0x2000 },
+  { 0x1900, 0x29a1, 0x0000 },
+  { 0x1900, 0x29a3, 0x0000 },
+  { 0x9900, 0x29a6, 0x2000 },
+  { 0x1900, 0x29a5, 0x0000 },
+  { 0x1900, 0x29a7, 0x0000 },
+  { 0x9900, 0x29ac, 0x3000 },
+  { 0x9900, 0x29aa, 0x2000 },
+  { 0x1900, 0x29a9, 0x0000 },
+  { 0x1900, 0x29ab, 0x0000 },
+  { 0x9900, 0x29ae, 0x2000 },
+  { 0x1900, 0x29ad, 0x0000 },
+  { 0x1900, 0x29af, 0x0000 },
+  { 0x9900, 0x29b8, 0x4000 },
+  { 0x9900, 0x29b4, 0x3000 },
+  { 0x9900, 0x29b2, 0x2000 },
+  { 0x1900, 0x29b1, 0x0000 },
+  { 0x1900, 0x29b3, 0x0000 },
+  { 0x9900, 0x29b6, 0x2000 },
+  { 0x1900, 0x29b5, 0x0000 },
+  { 0x1900, 0x29b7, 0x0000 },
+  { 0x9900, 0x29bc, 0x3000 },
+  { 0x9900, 0x29ba, 0x2000 },
+  { 0x1900, 0x29b9, 0x0000 },
+  { 0x1900, 0x29bb, 0x0000 },
+  { 0x9900, 0x29be, 0x2000 },
+  { 0x1900, 0x29bd, 0x0000 },
+  { 0x1900, 0x29bf, 0x0000 },
+  { 0x9900, 0x29d0, 0x5000 },
+  { 0x9900, 0x29c8, 0x4000 },
+  { 0x9900, 0x29c4, 0x3000 },
+  { 0x9900, 0x29c2, 0x2000 },
+  { 0x1900, 0x29c1, 0x0000 },
+  { 0x1900, 0x29c3, 0x0000 },
+  { 0x9900, 0x29c6, 0x2000 },
+  { 0x1900, 0x29c5, 0x0000 },
+  { 0x1900, 0x29c7, 0x0000 },
+  { 0x9900, 0x29cc, 0x3000 },
+  { 0x9900, 0x29ca, 0x2000 },
+  { 0x1900, 0x29c9, 0x0000 },
+  { 0x1900, 0x29cb, 0x0000 },
+  { 0x9900, 0x29ce, 0x2000 },
+  { 0x1900, 0x29cd, 0x0000 },
+  { 0x1900, 0x29cf, 0x0000 },
+  { 0x9600, 0x29d8, 0x4000 },
+  { 0x9900, 0x29d4, 0x3000 },
+  { 0x9900, 0x29d2, 0x2000 },
+  { 0x1900, 0x29d1, 0x0000 },
+  { 0x1900, 0x29d3, 0x0000 },
+  { 0x9900, 0x29d6, 0x2000 },
+  { 0x1900, 0x29d5, 0x0000 },
+  { 0x1900, 0x29d7, 0x0000 },
+  { 0x9900, 0x29dc, 0x3000 },
+  { 0x9600, 0x29da, 0x2000 },
+  { 0x1200, 0x29d9, 0x0000 },
+  { 0x1200, 0x29db, 0x0000 },
+  { 0x9900, 0x29de, 0x2000 },
+  { 0x1900, 0x29dd, 0x0000 },
+  { 0x1900, 0x29df, 0x0000 },
+  { 0x9900, 0x2a00, 0x6000 },
+  { 0x9900, 0x29f0, 0x5000 },
+  { 0x9900, 0x29e8, 0x4000 },
+  { 0x9900, 0x29e4, 0x3000 },
+  { 0x9900, 0x29e2, 0x2000 },
+  { 0x1900, 0x29e1, 0x0000 },
+  { 0x1900, 0x29e3, 0x0000 },
+  { 0x9900, 0x29e6, 0x2000 },
+  { 0x1900, 0x29e5, 0x0000 },
+  { 0x1900, 0x29e7, 0x0000 },
+  { 0x9900, 0x29ec, 0x3000 },
+  { 0x9900, 0x29ea, 0x2000 },
+  { 0x1900, 0x29e9, 0x0000 },
+  { 0x1900, 0x29eb, 0x0000 },
+  { 0x9900, 0x29ee, 0x2000 },
+  { 0x1900, 0x29ed, 0x0000 },
+  { 0x1900, 0x29ef, 0x0000 },
+  { 0x9900, 0x29f8, 0x4000 },
+  { 0x9900, 0x29f4, 0x3000 },
+  { 0x9900, 0x29f2, 0x2000 },
+  { 0x1900, 0x29f1, 0x0000 },
+  { 0x1900, 0x29f3, 0x0000 },
+  { 0x9900, 0x29f6, 0x2000 },
+  { 0x1900, 0x29f5, 0x0000 },
+  { 0x1900, 0x29f7, 0x0000 },
+  { 0x9600, 0x29fc, 0x3000 },
+  { 0x9900, 0x29fa, 0x2000 },
+  { 0x1900, 0x29f9, 0x0000 },
+  { 0x1900, 0x29fb, 0x0000 },
+  { 0x9900, 0x29fe, 0x2000 },
+  { 0x1200, 0x29fd, 0x0000 },
+  { 0x1900, 0x29ff, 0x0000 },
+  { 0x9900, 0x2a10, 0x5000 },
+  { 0x9900, 0x2a08, 0x4000 },
+  { 0x9900, 0x2a04, 0x3000 },
+  { 0x9900, 0x2a02, 0x2000 },
+  { 0x1900, 0x2a01, 0x0000 },
+  { 0x1900, 0x2a03, 0x0000 },
+  { 0x9900, 0x2a06, 0x2000 },
+  { 0x1900, 0x2a05, 0x0000 },
+  { 0x1900, 0x2a07, 0x0000 },
+  { 0x9900, 0x2a0c, 0x3000 },
+  { 0x9900, 0x2a0a, 0x2000 },
+  { 0x1900, 0x2a09, 0x0000 },
+  { 0x1900, 0x2a0b, 0x0000 },
+  { 0x9900, 0x2a0e, 0x2000 },
+  { 0x1900, 0x2a0d, 0x0000 },
+  { 0x1900, 0x2a0f, 0x0000 },
+  { 0x9900, 0x2a18, 0x4000 },
+  { 0x9900, 0x2a14, 0x3000 },
+  { 0x9900, 0x2a12, 0x2000 },
+  { 0x1900, 0x2a11, 0x0000 },
+  { 0x1900, 0x2a13, 0x0000 },
+  { 0x9900, 0x2a16, 0x2000 },
+  { 0x1900, 0x2a15, 0x0000 },
+  { 0x1900, 0x2a17, 0x0000 },
+  { 0x9900, 0x2a1c, 0x3000 },
+  { 0x9900, 0x2a1a, 0x2000 },
+  { 0x1900, 0x2a19, 0x0000 },
+  { 0x1900, 0x2a1b, 0x0000 },
+  { 0x9900, 0x2a1e, 0x2000 },
+  { 0x1900, 0x2a1d, 0x0000 },
+  { 0x1900, 0x2a1f, 0x0000 },
+  { 0x9900, 0x2a60, 0x7000 },
+  { 0x9900, 0x2a40, 0x6000 },
+  { 0x9900, 0x2a30, 0x5000 },
+  { 0x9900, 0x2a28, 0x4000 },
+  { 0x9900, 0x2a24, 0x3000 },
+  { 0x9900, 0x2a22, 0x2000 },
+  { 0x1900, 0x2a21, 0x0000 },
+  { 0x1900, 0x2a23, 0x0000 },
+  { 0x9900, 0x2a26, 0x2000 },
+  { 0x1900, 0x2a25, 0x0000 },
+  { 0x1900, 0x2a27, 0x0000 },
+  { 0x9900, 0x2a2c, 0x3000 },
+  { 0x9900, 0x2a2a, 0x2000 },
+  { 0x1900, 0x2a29, 0x0000 },
+  { 0x1900, 0x2a2b, 0x0000 },
+  { 0x9900, 0x2a2e, 0x2000 },
+  { 0x1900, 0x2a2d, 0x0000 },
+  { 0x1900, 0x2a2f, 0x0000 },
+  { 0x9900, 0x2a38, 0x4000 },
+  { 0x9900, 0x2a34, 0x3000 },
+  { 0x9900, 0x2a32, 0x2000 },
+  { 0x1900, 0x2a31, 0x0000 },
+  { 0x1900, 0x2a33, 0x0000 },
+  { 0x9900, 0x2a36, 0x2000 },
+  { 0x1900, 0x2a35, 0x0000 },
+  { 0x1900, 0x2a37, 0x0000 },
+  { 0x9900, 0x2a3c, 0x3000 },
+  { 0x9900, 0x2a3a, 0x2000 },
+  { 0x1900, 0x2a39, 0x0000 },
+  { 0x1900, 0x2a3b, 0x0000 },
+  { 0x9900, 0x2a3e, 0x2000 },
+  { 0x1900, 0x2a3d, 0x0000 },
+  { 0x1900, 0x2a3f, 0x0000 },
+  { 0x9900, 0x2a50, 0x5000 },
+  { 0x9900, 0x2a48, 0x4000 },
+  { 0x9900, 0x2a44, 0x3000 },
+  { 0x9900, 0x2a42, 0x2000 },
+  { 0x1900, 0x2a41, 0x0000 },
+  { 0x1900, 0x2a43, 0x0000 },
+  { 0x9900, 0x2a46, 0x2000 },
+  { 0x1900, 0x2a45, 0x0000 },
+  { 0x1900, 0x2a47, 0x0000 },
+  { 0x9900, 0x2a4c, 0x3000 },
+  { 0x9900, 0x2a4a, 0x2000 },
+  { 0x1900, 0x2a49, 0x0000 },
+  { 0x1900, 0x2a4b, 0x0000 },
+  { 0x9900, 0x2a4e, 0x2000 },
+  { 0x1900, 0x2a4d, 0x0000 },
+  { 0x1900, 0x2a4f, 0x0000 },
+  { 0x9900, 0x2a58, 0x4000 },
+  { 0x9900, 0x2a54, 0x3000 },
+  { 0x9900, 0x2a52, 0x2000 },
+  { 0x1900, 0x2a51, 0x0000 },
+  { 0x1900, 0x2a53, 0x0000 },
+  { 0x9900, 0x2a56, 0x2000 },
+  { 0x1900, 0x2a55, 0x0000 },
+  { 0x1900, 0x2a57, 0x0000 },
+  { 0x9900, 0x2a5c, 0x3000 },
+  { 0x9900, 0x2a5a, 0x2000 },
+  { 0x1900, 0x2a59, 0x0000 },
+  { 0x1900, 0x2a5b, 0x0000 },
+  { 0x9900, 0x2a5e, 0x2000 },
+  { 0x1900, 0x2a5d, 0x0000 },
+  { 0x1900, 0x2a5f, 0x0000 },
+  { 0x9900, 0x2a80, 0x6000 },
+  { 0x9900, 0x2a70, 0x5000 },
+  { 0x9900, 0x2a68, 0x4000 },
+  { 0x9900, 0x2a64, 0x3000 },
+  { 0x9900, 0x2a62, 0x2000 },
+  { 0x1900, 0x2a61, 0x0000 },
+  { 0x1900, 0x2a63, 0x0000 },
+  { 0x9900, 0x2a66, 0x2000 },
+  { 0x1900, 0x2a65, 0x0000 },
+  { 0x1900, 0x2a67, 0x0000 },
+  { 0x9900, 0x2a6c, 0x3000 },
+  { 0x9900, 0x2a6a, 0x2000 },
+  { 0x1900, 0x2a69, 0x0000 },
+  { 0x1900, 0x2a6b, 0x0000 },
+  { 0x9900, 0x2a6e, 0x2000 },
+  { 0x1900, 0x2a6d, 0x0000 },
+  { 0x1900, 0x2a6f, 0x0000 },
+  { 0x9900, 0x2a78, 0x4000 },
+  { 0x9900, 0x2a74, 0x3000 },
+  { 0x9900, 0x2a72, 0x2000 },
+  { 0x1900, 0x2a71, 0x0000 },
+  { 0x1900, 0x2a73, 0x0000 },
+  { 0x9900, 0x2a76, 0x2000 },
+  { 0x1900, 0x2a75, 0x0000 },
+  { 0x1900, 0x2a77, 0x0000 },
+  { 0x9900, 0x2a7c, 0x3000 },
+  { 0x9900, 0x2a7a, 0x2000 },
+  { 0x1900, 0x2a79, 0x0000 },
+  { 0x1900, 0x2a7b, 0x0000 },
+  { 0x9900, 0x2a7e, 0x2000 },
+  { 0x1900, 0x2a7d, 0x0000 },
+  { 0x1900, 0x2a7f, 0x0000 },
+  { 0x9900, 0x2a90, 0x5000 },
+  { 0x9900, 0x2a88, 0x4000 },
+  { 0x9900, 0x2a84, 0x3000 },
+  { 0x9900, 0x2a82, 0x2000 },
+  { 0x1900, 0x2a81, 0x0000 },
+  { 0x1900, 0x2a83, 0x0000 },
+  { 0x9900, 0x2a86, 0x2000 },
+  { 0x1900, 0x2a85, 0x0000 },
+  { 0x1900, 0x2a87, 0x0000 },
+  { 0x9900, 0x2a8c, 0x3000 },
+  { 0x9900, 0x2a8a, 0x2000 },
+  { 0x1900, 0x2a89, 0x0000 },
+  { 0x1900, 0x2a8b, 0x0000 },
+  { 0x9900, 0x2a8e, 0x2000 },
+  { 0x1900, 0x2a8d, 0x0000 },
+  { 0x1900, 0x2a8f, 0x0000 },
+  { 0x9900, 0x2a98, 0x4000 },
+  { 0x9900, 0x2a94, 0x3000 },
+  { 0x9900, 0x2a92, 0x2000 },
+  { 0x1900, 0x2a91, 0x0000 },
+  { 0x1900, 0x2a93, 0x0000 },
+  { 0x9900, 0x2a96, 0x2000 },
+  { 0x1900, 0x2a95, 0x0000 },
+  { 0x1900, 0x2a97, 0x0000 },
+  { 0x9900, 0x2a9c, 0x3000 },
+  { 0x9900, 0x2a9a, 0x2000 },
+  { 0x1900, 0x2a99, 0x0000 },
+  { 0x1900, 0x2a9b, 0x0000 },
+  { 0x9900, 0x2a9e, 0x2000 },
+  { 0x1900, 0x2a9d, 0x0000 },
+  { 0x1900, 0x2a9f, 0x0000 },
+  { 0x9a00, 0x2e92, 0x8000 },
+  { 0x9900, 0x2ae0, 0x7000 },
+  { 0x9900, 0x2ac0, 0x6000 },
+  { 0x9900, 0x2ab0, 0x5000 },
+  { 0x9900, 0x2aa8, 0x4000 },
+  { 0x9900, 0x2aa4, 0x3000 },
+  { 0x9900, 0x2aa2, 0x2000 },
+  { 0x1900, 0x2aa1, 0x0000 },
+  { 0x1900, 0x2aa3, 0x0000 },
+  { 0x9900, 0x2aa6, 0x2000 },
+  { 0x1900, 0x2aa5, 0x0000 },
+  { 0x1900, 0x2aa7, 0x0000 },
+  { 0x9900, 0x2aac, 0x3000 },
+  { 0x9900, 0x2aaa, 0x2000 },
+  { 0x1900, 0x2aa9, 0x0000 },
+  { 0x1900, 0x2aab, 0x0000 },
+  { 0x9900, 0x2aae, 0x2000 },
+  { 0x1900, 0x2aad, 0x0000 },
+  { 0x1900, 0x2aaf, 0x0000 },
+  { 0x9900, 0x2ab8, 0x4000 },
+  { 0x9900, 0x2ab4, 0x3000 },
+  { 0x9900, 0x2ab2, 0x2000 },
+  { 0x1900, 0x2ab1, 0x0000 },
+  { 0x1900, 0x2ab3, 0x0000 },
+  { 0x9900, 0x2ab6, 0x2000 },
+  { 0x1900, 0x2ab5, 0x0000 },
+  { 0x1900, 0x2ab7, 0x0000 },
+  { 0x9900, 0x2abc, 0x3000 },
+  { 0x9900, 0x2aba, 0x2000 },
+  { 0x1900, 0x2ab9, 0x0000 },
+  { 0x1900, 0x2abb, 0x0000 },
+  { 0x9900, 0x2abe, 0x2000 },
+  { 0x1900, 0x2abd, 0x0000 },
+  { 0x1900, 0x2abf, 0x0000 },
+  { 0x9900, 0x2ad0, 0x5000 },
+  { 0x9900, 0x2ac8, 0x4000 },
+  { 0x9900, 0x2ac4, 0x3000 },
+  { 0x9900, 0x2ac2, 0x2000 },
+  { 0x1900, 0x2ac1, 0x0000 },
+  { 0x1900, 0x2ac3, 0x0000 },
+  { 0x9900, 0x2ac6, 0x2000 },
+  { 0x1900, 0x2ac5, 0x0000 },
+  { 0x1900, 0x2ac7, 0x0000 },
+  { 0x9900, 0x2acc, 0x3000 },
+  { 0x9900, 0x2aca, 0x2000 },
+  { 0x1900, 0x2ac9, 0x0000 },
+  { 0x1900, 0x2acb, 0x0000 },
+  { 0x9900, 0x2ace, 0x2000 },
+  { 0x1900, 0x2acd, 0x0000 },
+  { 0x1900, 0x2acf, 0x0000 },
+  { 0x9900, 0x2ad8, 0x4000 },
+  { 0x9900, 0x2ad4, 0x3000 },
+  { 0x9900, 0x2ad2, 0x2000 },
+  { 0x1900, 0x2ad1, 0x0000 },
+  { 0x1900, 0x2ad3, 0x0000 },
+  { 0x9900, 0x2ad6, 0x2000 },
+  { 0x1900, 0x2ad5, 0x0000 },
+  { 0x1900, 0x2ad7, 0x0000 },
+  { 0x9900, 0x2adc, 0x3000 },
+  { 0x9900, 0x2ada, 0x2000 },
+  { 0x1900, 0x2ad9, 0x0000 },
+  { 0x1900, 0x2adb, 0x0000 },
+  { 0x9900, 0x2ade, 0x2000 },
+  { 0x1900, 0x2add, 0x0000 },
+  { 0x1900, 0x2adf, 0x0000 },
+  { 0x9a00, 0x2b00, 0x6000 },
+  { 0x9900, 0x2af0, 0x5000 },
+  { 0x9900, 0x2ae8, 0x4000 },
+  { 0x9900, 0x2ae4, 0x3000 },
+  { 0x9900, 0x2ae2, 0x2000 },
+  { 0x1900, 0x2ae1, 0x0000 },
+  { 0x1900, 0x2ae3, 0x0000 },
+  { 0x9900, 0x2ae6, 0x2000 },
+  { 0x1900, 0x2ae5, 0x0000 },
+  { 0x1900, 0x2ae7, 0x0000 },
+  { 0x9900, 0x2aec, 0x3000 },
+  { 0x9900, 0x2aea, 0x2000 },
+  { 0x1900, 0x2ae9, 0x0000 },
+  { 0x1900, 0x2aeb, 0x0000 },
+  { 0x9900, 0x2aee, 0x2000 },
+  { 0x1900, 0x2aed, 0x0000 },
+  { 0x1900, 0x2aef, 0x0000 },
+  { 0x9900, 0x2af8, 0x4000 },
+  { 0x9900, 0x2af4, 0x3000 },
+  { 0x9900, 0x2af2, 0x2000 },
+  { 0x1900, 0x2af1, 0x0000 },
+  { 0x1900, 0x2af3, 0x0000 },
+  { 0x9900, 0x2af6, 0x2000 },
+  { 0x1900, 0x2af5, 0x0000 },
+  { 0x1900, 0x2af7, 0x0000 },
+  { 0x9900, 0x2afc, 0x3000 },
+  { 0x9900, 0x2afa, 0x2000 },
+  { 0x1900, 0x2af9, 0x0000 },
+  { 0x1900, 0x2afb, 0x0000 },
+  { 0x9900, 0x2afe, 0x2000 },
+  { 0x1900, 0x2afd, 0x0000 },
+  { 0x1900, 0x2aff, 0x0000 },
+  { 0x9a00, 0x2e82, 0x5000 },
+  { 0x9a00, 0x2b08, 0x4000 },
+  { 0x9a00, 0x2b04, 0x3000 },
+  { 0x9a00, 0x2b02, 0x2000 },
+  { 0x1a00, 0x2b01, 0x0000 },
+  { 0x1a00, 0x2b03, 0x0000 },
+  { 0x9a00, 0x2b06, 0x2000 },
+  { 0x1a00, 0x2b05, 0x0000 },
+  { 0x1a00, 0x2b07, 0x0000 },
+  { 0x9a00, 0x2b0c, 0x3000 },
+  { 0x9a00, 0x2b0a, 0x2000 },
+  { 0x1a00, 0x2b09, 0x0000 },
+  { 0x1a00, 0x2b0b, 0x0000 },
+  { 0x9a00, 0x2e80, 0x2000 },
+  { 0x1a00, 0x2b0d, 0x0000 },
+  { 0x1a00, 0x2e81, 0x0000 },
+  { 0x9a00, 0x2e8a, 0x4000 },
+  { 0x9a00, 0x2e86, 0x3000 },
+  { 0x9a00, 0x2e84, 0x2000 },
+  { 0x1a00, 0x2e83, 0x0000 },
+  { 0x1a00, 0x2e85, 0x0000 },
+  { 0x9a00, 0x2e88, 0x2000 },
+  { 0x1a00, 0x2e87, 0x0000 },
+  { 0x1a00, 0x2e89, 0x0000 },
+  { 0x9a00, 0x2e8e, 0x3000 },
+  { 0x9a00, 0x2e8c, 0x2000 },
+  { 0x1a00, 0x2e8b, 0x0000 },
+  { 0x1a00, 0x2e8d, 0x0000 },
+  { 0x9a00, 0x2e90, 0x2000 },
+  { 0x1a00, 0x2e8f, 0x0000 },
+  { 0x1a00, 0x2e91, 0x0000 },
+  { 0x9a00, 0x2ed3, 0x7000 },
+  { 0x9a00, 0x2eb3, 0x6000 },
+  { 0x9a00, 0x2ea3, 0x5000 },
+  { 0x9a00, 0x2e9b, 0x4000 },
+  { 0x9a00, 0x2e96, 0x3000 },
+  { 0x9a00, 0x2e94, 0x2000 },
+  { 0x1a00, 0x2e93, 0x0000 },
+  { 0x1a00, 0x2e95, 0x0000 },
+  { 0x9a00, 0x2e98, 0x2000 },
+  { 0x1a00, 0x2e97, 0x0000 },
+  { 0x1a00, 0x2e99, 0x0000 },
+  { 0x9a00, 0x2e9f, 0x3000 },
+  { 0x9a00, 0x2e9d, 0x2000 },
+  { 0x1a00, 0x2e9c, 0x0000 },
+  { 0x1a00, 0x2e9e, 0x0000 },
+  { 0x9a00, 0x2ea1, 0x2000 },
+  { 0x1a00, 0x2ea0, 0x0000 },
+  { 0x1a00, 0x2ea2, 0x0000 },
+  { 0x9a00, 0x2eab, 0x4000 },
+  { 0x9a00, 0x2ea7, 0x3000 },
+  { 0x9a00, 0x2ea5, 0x2000 },
+  { 0x1a00, 0x2ea4, 0x0000 },
+  { 0x1a00, 0x2ea6, 0x0000 },
+  { 0x9a00, 0x2ea9, 0x2000 },
+  { 0x1a00, 0x2ea8, 0x0000 },
+  { 0x1a00, 0x2eaa, 0x0000 },
+  { 0x9a00, 0x2eaf, 0x3000 },
+  { 0x9a00, 0x2ead, 0x2000 },
+  { 0x1a00, 0x2eac, 0x0000 },
+  { 0x1a00, 0x2eae, 0x0000 },
+  { 0x9a00, 0x2eb1, 0x2000 },
+  { 0x1a00, 0x2eb0, 0x0000 },
+  { 0x1a00, 0x2eb2, 0x0000 },
+  { 0x9a00, 0x2ec3, 0x5000 },
+  { 0x9a00, 0x2ebb, 0x4000 },
+  { 0x9a00, 0x2eb7, 0x3000 },
+  { 0x9a00, 0x2eb5, 0x2000 },
+  { 0x1a00, 0x2eb4, 0x0000 },
+  { 0x1a00, 0x2eb6, 0x0000 },
+  { 0x9a00, 0x2eb9, 0x2000 },
+  { 0x1a00, 0x2eb8, 0x0000 },
+  { 0x1a00, 0x2eba, 0x0000 },
+  { 0x9a00, 0x2ebf, 0x3000 },
+  { 0x9a00, 0x2ebd, 0x2000 },
+  { 0x1a00, 0x2ebc, 0x0000 },
+  { 0x1a00, 0x2ebe, 0x0000 },
+  { 0x9a00, 0x2ec1, 0x2000 },
+  { 0x1a00, 0x2ec0, 0x0000 },
+  { 0x1a00, 0x2ec2, 0x0000 },
+  { 0x9a00, 0x2ecb, 0x4000 },
+  { 0x9a00, 0x2ec7, 0x3000 },
+  { 0x9a00, 0x2ec5, 0x2000 },
+  { 0x1a00, 0x2ec4, 0x0000 },
+  { 0x1a00, 0x2ec6, 0x0000 },
+  { 0x9a00, 0x2ec9, 0x2000 },
+  { 0x1a00, 0x2ec8, 0x0000 },
+  { 0x1a00, 0x2eca, 0x0000 },
+  { 0x9a00, 0x2ecf, 0x3000 },
+  { 0x9a00, 0x2ecd, 0x2000 },
+  { 0x1a00, 0x2ecc, 0x0000 },
+  { 0x1a00, 0x2ece, 0x0000 },
+  { 0x9a00, 0x2ed1, 0x2000 },
+  { 0x1a00, 0x2ed0, 0x0000 },
+  { 0x1a00, 0x2ed2, 0x0000 },
+  { 0x9a00, 0x2ef3, 0x6000 },
+  { 0x9a00, 0x2ee3, 0x5000 },
+  { 0x9a00, 0x2edb, 0x4000 },
+  { 0x9a00, 0x2ed7, 0x3000 },
+  { 0x9a00, 0x2ed5, 0x2000 },
+  { 0x1a00, 0x2ed4, 0x0000 },
+  { 0x1a00, 0x2ed6, 0x0000 },
+  { 0x9a00, 0x2ed9, 0x2000 },
+  { 0x1a00, 0x2ed8, 0x0000 },
+  { 0x1a00, 0x2eda, 0x0000 },
+  { 0x9a00, 0x2edf, 0x3000 },
+  { 0x9a00, 0x2edd, 0x2000 },
+  { 0x1a00, 0x2edc, 0x0000 },
+  { 0x1a00, 0x2ede, 0x0000 },
+  { 0x9a00, 0x2ee1, 0x2000 },
+  { 0x1a00, 0x2ee0, 0x0000 },
+  { 0x1a00, 0x2ee2, 0x0000 },
+  { 0x9a00, 0x2eeb, 0x4000 },
+  { 0x9a00, 0x2ee7, 0x3000 },
+  { 0x9a00, 0x2ee5, 0x2000 },
+  { 0x1a00, 0x2ee4, 0x0000 },
+  { 0x1a00, 0x2ee6, 0x0000 },
+  { 0x9a00, 0x2ee9, 0x2000 },
+  { 0x1a00, 0x2ee8, 0x0000 },
+  { 0x1a00, 0x2eea, 0x0000 },
+  { 0x9a00, 0x2eef, 0x3000 },
+  { 0x9a00, 0x2eed, 0x2000 },
+  { 0x1a00, 0x2eec, 0x0000 },
+  { 0x1a00, 0x2eee, 0x0000 },
+  { 0x9a00, 0x2ef1, 0x2000 },
+  { 0x1a00, 0x2ef0, 0x0000 },
+  { 0x1a00, 0x2ef2, 0x0000 },
+  { 0x9a00, 0x2f0f, 0x5000 },
+  { 0x9a00, 0x2f07, 0x4000 },
+  { 0x9a00, 0x2f03, 0x3000 },
+  { 0x9a00, 0x2f01, 0x2000 },
+  { 0x1a00, 0x2f00, 0x0000 },
+  { 0x1a00, 0x2f02, 0x0000 },
+  { 0x9a00, 0x2f05, 0x2000 },
+  { 0x1a00, 0x2f04, 0x0000 },
+  { 0x1a00, 0x2f06, 0x0000 },
+  { 0x9a00, 0x2f0b, 0x3000 },
+  { 0x9a00, 0x2f09, 0x2000 },
+  { 0x1a00, 0x2f08, 0x0000 },
+  { 0x1a00, 0x2f0a, 0x0000 },
+  { 0x9a00, 0x2f0d, 0x2000 },
+  { 0x1a00, 0x2f0c, 0x0000 },
+  { 0x1a00, 0x2f0e, 0x0000 },
+  { 0x9a00, 0x2f17, 0x4000 },
+  { 0x9a00, 0x2f13, 0x3000 },
+  { 0x9a00, 0x2f11, 0x2000 },
+  { 0x1a00, 0x2f10, 0x0000 },
+  { 0x1a00, 0x2f12, 0x0000 },
+  { 0x9a00, 0x2f15, 0x2000 },
+  { 0x1a00, 0x2f14, 0x0000 },
+  { 0x1a00, 0x2f16, 0x0000 },
+  { 0x9a00, 0x2f1b, 0x3000 },
+  { 0x9a00, 0x2f19, 0x2000 },
+  { 0x1a00, 0x2f18, 0x0000 },
+  { 0x1a00, 0x2f1a, 0x0000 },
+  { 0x9a00, 0x2f1d, 0x2000 },
+  { 0x1a00, 0x2f1c, 0x0000 },
+  { 0x1a00, 0x2f1e, 0x0000 },
+  { 0x8701, 0x00f0, 0xd000 },
+  { 0x8700, 0xa34d, 0xc000 },
+  { 0x9a00, 0x3391, 0xb000 },
+  { 0x8700, 0x3149, 0xa000 },
+  { 0x9500, 0x303d, 0x9000 },
+  { 0x9a00, 0x2f9f, 0x8000 },
+  { 0x9a00, 0x2f5f, 0x7000 },
+  { 0x9a00, 0x2f3f, 0x6000 },
+  { 0x9a00, 0x2f2f, 0x5000 },
+  { 0x9a00, 0x2f27, 0x4000 },
+  { 0x9a00, 0x2f23, 0x3000 },
+  { 0x9a00, 0x2f21, 0x2000 },
+  { 0x1a00, 0x2f20, 0x0000 },
+  { 0x1a00, 0x2f22, 0x0000 },
+  { 0x9a00, 0x2f25, 0x2000 },
+  { 0x1a00, 0x2f24, 0x0000 },
+  { 0x1a00, 0x2f26, 0x0000 },
+  { 0x9a00, 0x2f2b, 0x3000 },
+  { 0x9a00, 0x2f29, 0x2000 },
+  { 0x1a00, 0x2f28, 0x0000 },
+  { 0x1a00, 0x2f2a, 0x0000 },
+  { 0x9a00, 0x2f2d, 0x2000 },
+  { 0x1a00, 0x2f2c, 0x0000 },
+  { 0x1a00, 0x2f2e, 0x0000 },
+  { 0x9a00, 0x2f37, 0x4000 },
+  { 0x9a00, 0x2f33, 0x3000 },
+  { 0x9a00, 0x2f31, 0x2000 },
+  { 0x1a00, 0x2f30, 0x0000 },
+  { 0x1a00, 0x2f32, 0x0000 },
+  { 0x9a00, 0x2f35, 0x2000 },
+  { 0x1a00, 0x2f34, 0x0000 },
+  { 0x1a00, 0x2f36, 0x0000 },
+  { 0x9a00, 0x2f3b, 0x3000 },
+  { 0x9a00, 0x2f39, 0x2000 },
+  { 0x1a00, 0x2f38, 0x0000 },
+  { 0x1a00, 0x2f3a, 0x0000 },
+  { 0x9a00, 0x2f3d, 0x2000 },
+  { 0x1a00, 0x2f3c, 0x0000 },
+  { 0x1a00, 0x2f3e, 0x0000 },
+  { 0x9a00, 0x2f4f, 0x5000 },
+  { 0x9a00, 0x2f47, 0x4000 },
+  { 0x9a00, 0x2f43, 0x3000 },
+  { 0x9a00, 0x2f41, 0x2000 },
+  { 0x1a00, 0x2f40, 0x0000 },
+  { 0x1a00, 0x2f42, 0x0000 },
+  { 0x9a00, 0x2f45, 0x2000 },
+  { 0x1a00, 0x2f44, 0x0000 },
+  { 0x1a00, 0x2f46, 0x0000 },
+  { 0x9a00, 0x2f4b, 0x3000 },
+  { 0x9a00, 0x2f49, 0x2000 },
+  { 0x1a00, 0x2f48, 0x0000 },
+  { 0x1a00, 0x2f4a, 0x0000 },
+  { 0x9a00, 0x2f4d, 0x2000 },
+  { 0x1a00, 0x2f4c, 0x0000 },
+  { 0x1a00, 0x2f4e, 0x0000 },
+  { 0x9a00, 0x2f57, 0x4000 },
+  { 0x9a00, 0x2f53, 0x3000 },
+  { 0x9a00, 0x2f51, 0x2000 },
+  { 0x1a00, 0x2f50, 0x0000 },
+  { 0x1a00, 0x2f52, 0x0000 },
+  { 0x9a00, 0x2f55, 0x2000 },
+  { 0x1a00, 0x2f54, 0x0000 },
+  { 0x1a00, 0x2f56, 0x0000 },
+  { 0x9a00, 0x2f5b, 0x3000 },
+  { 0x9a00, 0x2f59, 0x2000 },
+  { 0x1a00, 0x2f58, 0x0000 },
+  { 0x1a00, 0x2f5a, 0x0000 },
+  { 0x9a00, 0x2f5d, 0x2000 },
+  { 0x1a00, 0x2f5c, 0x0000 },
+  { 0x1a00, 0x2f5e, 0x0000 },
+  { 0x9a00, 0x2f7f, 0x6000 },
+  { 0x9a00, 0x2f6f, 0x5000 },
+  { 0x9a00, 0x2f67, 0x4000 },
+  { 0x9a00, 0x2f63, 0x3000 },
+  { 0x9a00, 0x2f61, 0x2000 },
+  { 0x1a00, 0x2f60, 0x0000 },
+  { 0x1a00, 0x2f62, 0x0000 },
+  { 0x9a00, 0x2f65, 0x2000 },
+  { 0x1a00, 0x2f64, 0x0000 },
+  { 0x1a00, 0x2f66, 0x0000 },
+  { 0x9a00, 0x2f6b, 0x3000 },
+  { 0x9a00, 0x2f69, 0x2000 },
+  { 0x1a00, 0x2f68, 0x0000 },
+  { 0x1a00, 0x2f6a, 0x0000 },
+  { 0x9a00, 0x2f6d, 0x2000 },
+  { 0x1a00, 0x2f6c, 0x0000 },
+  { 0x1a00, 0x2f6e, 0x0000 },
+  { 0x9a00, 0x2f77, 0x4000 },
+  { 0x9a00, 0x2f73, 0x3000 },
+  { 0x9a00, 0x2f71, 0x2000 },
+  { 0x1a00, 0x2f70, 0x0000 },
+  { 0x1a00, 0x2f72, 0x0000 },
+  { 0x9a00, 0x2f75, 0x2000 },
+  { 0x1a00, 0x2f74, 0x0000 },
+  { 0x1a00, 0x2f76, 0x0000 },
+  { 0x9a00, 0x2f7b, 0x3000 },
+  { 0x9a00, 0x2f79, 0x2000 },
+  { 0x1a00, 0x2f78, 0x0000 },
+  { 0x1a00, 0x2f7a, 0x0000 },
+  { 0x9a00, 0x2f7d, 0x2000 },
+  { 0x1a00, 0x2f7c, 0x0000 },
+  { 0x1a00, 0x2f7e, 0x0000 },
+  { 0x9a00, 0x2f8f, 0x5000 },
+  { 0x9a00, 0x2f87, 0x4000 },
+  { 0x9a00, 0x2f83, 0x3000 },
+  { 0x9a00, 0x2f81, 0x2000 },
+  { 0x1a00, 0x2f80, 0x0000 },
+  { 0x1a00, 0x2f82, 0x0000 },
+  { 0x9a00, 0x2f85, 0x2000 },
+  { 0x1a00, 0x2f84, 0x0000 },
+  { 0x1a00, 0x2f86, 0x0000 },
+  { 0x9a00, 0x2f8b, 0x3000 },
+  { 0x9a00, 0x2f89, 0x2000 },
+  { 0x1a00, 0x2f88, 0x0000 },
+  { 0x1a00, 0x2f8a, 0x0000 },
+  { 0x9a00, 0x2f8d, 0x2000 },
+  { 0x1a00, 0x2f8c, 0x0000 },
+  { 0x1a00, 0x2f8e, 0x0000 },
+  { 0x9a00, 0x2f97, 0x4000 },
+  { 0x9a00, 0x2f93, 0x3000 },
+  { 0x9a00, 0x2f91, 0x2000 },
+  { 0x1a00, 0x2f90, 0x0000 },
+  { 0x1a00, 0x2f92, 0x0000 },
+  { 0x9a00, 0x2f95, 0x2000 },
+  { 0x1a00, 0x2f94, 0x0000 },
+  { 0x1a00, 0x2f96, 0x0000 },
+  { 0x9a00, 0x2f9b, 0x3000 },
+  { 0x9a00, 0x2f99, 0x2000 },
+  { 0x1a00, 0x2f98, 0x0000 },
+  { 0x1a00, 0x2f9a, 0x0000 },
+  { 0x9a00, 0x2f9d, 0x2000 },
+  { 0x1a00, 0x2f9c, 0x0000 },
+  { 0x1a00, 0x2f9e, 0x0000 },
+  { 0x9a00, 0x2ff9, 0x7000 },
+  { 0x9a00, 0x2fbf, 0x6000 },
+  { 0x9a00, 0x2faf, 0x5000 },
+  { 0x9a00, 0x2fa7, 0x4000 },
+  { 0x9a00, 0x2fa3, 0x3000 },
+  { 0x9a00, 0x2fa1, 0x2000 },
+  { 0x1a00, 0x2fa0, 0x0000 },
+  { 0x1a00, 0x2fa2, 0x0000 },
+  { 0x9a00, 0x2fa5, 0x2000 },
+  { 0x1a00, 0x2fa4, 0x0000 },
+  { 0x1a00, 0x2fa6, 0x0000 },
+  { 0x9a00, 0x2fab, 0x3000 },
+  { 0x9a00, 0x2fa9, 0x2000 },
+  { 0x1a00, 0x2fa8, 0x0000 },
+  { 0x1a00, 0x2faa, 0x0000 },
+  { 0x9a00, 0x2fad, 0x2000 },
+  { 0x1a00, 0x2fac, 0x0000 },
+  { 0x1a00, 0x2fae, 0x0000 },
+  { 0x9a00, 0x2fb7, 0x4000 },
+  { 0x9a00, 0x2fb3, 0x3000 },
+  { 0x9a00, 0x2fb1, 0x2000 },
+  { 0x1a00, 0x2fb0, 0x0000 },
+  { 0x1a00, 0x2fb2, 0x0000 },
+  { 0x9a00, 0x2fb5, 0x2000 },
+  { 0x1a00, 0x2fb4, 0x0000 },
+  { 0x1a00, 0x2fb6, 0x0000 },
+  { 0x9a00, 0x2fbb, 0x3000 },
+  { 0x9a00, 0x2fb9, 0x2000 },
+  { 0x1a00, 0x2fb8, 0x0000 },
+  { 0x1a00, 0x2fba, 0x0000 },
+  { 0x9a00, 0x2fbd, 0x2000 },
+  { 0x1a00, 0x2fbc, 0x0000 },
+  { 0x1a00, 0x2fbe, 0x0000 },
+  { 0x9a00, 0x2fcf, 0x5000 },
+  { 0x9a00, 0x2fc7, 0x4000 },
+  { 0x9a00, 0x2fc3, 0x3000 },
+  { 0x9a00, 0x2fc1, 0x2000 },
+  { 0x1a00, 0x2fc0, 0x0000 },
+  { 0x1a00, 0x2fc2, 0x0000 },
+  { 0x9a00, 0x2fc5, 0x2000 },
+  { 0x1a00, 0x2fc4, 0x0000 },
+  { 0x1a00, 0x2fc6, 0x0000 },
+  { 0x9a00, 0x2fcb, 0x3000 },
+  { 0x9a00, 0x2fc9, 0x2000 },
+  { 0x1a00, 0x2fc8, 0x0000 },
+  { 0x1a00, 0x2fca, 0x0000 },
+  { 0x9a00, 0x2fcd, 0x2000 },
+  { 0x1a00, 0x2fcc, 0x0000 },
+  { 0x1a00, 0x2fce, 0x0000 },
+  { 0x9a00, 0x2ff1, 0x4000 },
+  { 0x9a00, 0x2fd3, 0x3000 },
+  { 0x9a00, 0x2fd1, 0x2000 },
+  { 0x1a00, 0x2fd0, 0x0000 },
+  { 0x1a00, 0x2fd2, 0x0000 },
+  { 0x9a00, 0x2fd5, 0x2000 },
+  { 0x1a00, 0x2fd4, 0x0000 },
+  { 0x1a00, 0x2ff0, 0x0000 },
+  { 0x9a00, 0x2ff5, 0x3000 },
+  { 0x9a00, 0x2ff3, 0x2000 },
+  { 0x1a00, 0x2ff2, 0x0000 },
+  { 0x1a00, 0x2ff4, 0x0000 },
+  { 0x9a00, 0x2ff7, 0x2000 },
+  { 0x1a00, 0x2ff6, 0x0000 },
+  { 0x1a00, 0x2ff8, 0x0000 },
+  { 0x9600, 0x301d, 0x6000 },
+  { 0x9200, 0x300d, 0x5000 },
+  { 0x8600, 0x3005, 0x4000 },
+  { 0x9500, 0x3001, 0x3000 },
+  { 0x9a00, 0x2ffb, 0x2000 },
+  { 0x1a00, 0x2ffa, 0x0000 },
+  { 0x1d00, 0x3000, 0x0000 },
+  { 0x9500, 0x3003, 0x2000 },
+  { 0x1500, 0x3002, 0x0000 },
+  { 0x1a00, 0x3004, 0x0000 },
+  { 0x9200, 0x3009, 0x3000 },
+  { 0x8e00, 0x3007, 0x2000 },
+  { 0x0700, 0x3006, 0x0000 },
+  { 0x1600, 0x3008, 0x0000 },
+  { 0x9200, 0x300b, 0x2000 },
+  { 0x1600, 0x300a, 0x0000 },
+  { 0x1600, 0x300c, 0x0000 },
+  { 0x9200, 0x3015, 0x4000 },
+  { 0x9200, 0x3011, 0x3000 },
+  { 0x9200, 0x300f, 0x2000 },
+  { 0x1600, 0x300e, 0x0000 },
+  { 0x1600, 0x3010, 0x0000 },
+  { 0x9a00, 0x3013, 0x2000 },
+  { 0x1a00, 0x3012, 0x0000 },
+  { 0x1600, 0x3014, 0x0000 },
+  { 0x9200, 0x3019, 0x3000 },
+  { 0x9200, 0x3017, 0x2000 },
+  { 0x1600, 0x3016, 0x0000 },
+  { 0x1600, 0x3018, 0x0000 },
+  { 0x9200, 0x301b, 0x2000 },
+  { 0x1600, 0x301a, 0x0000 },
+  { 0x1100, 0x301c, 0x0000 },
+  { 0x8c00, 0x302d, 0x5000 },
+  { 0x8e00, 0x3025, 0x4000 },
+  { 0x8e00, 0x3021, 0x3000 },
+  { 0x9200, 0x301f, 0x2000 },
+  { 0x1200, 0x301e, 0x0000 },
+  { 0x1a00, 0x3020, 0x0000 },
+  { 0x8e00, 0x3023, 0x2000 },
+  { 0x0e00, 0x3022, 0x0000 },
+  { 0x0e00, 0x3024, 0x0000 },
+  { 0x8e00, 0x3029, 0x3000 },
+  { 0x8e00, 0x3027, 0x2000 },
+  { 0x0e00, 0x3026, 0x0000 },
+  { 0x0e00, 0x3028, 0x0000 },
+  { 0x8c00, 0x302b, 0x2000 },
+  { 0x0c00, 0x302a, 0x0000 },
+  { 0x0c00, 0x302c, 0x0000 },
+  { 0x8600, 0x3035, 0x4000 },
+  { 0x8600, 0x3031, 0x3000 },
+  { 0x8c00, 0x302f, 0x2000 },
+  { 0x0c00, 0x302e, 0x0000 },
+  { 0x1100, 0x3030, 0x0000 },
+  { 0x8600, 0x3033, 0x2000 },
+  { 0x0600, 0x3032, 0x0000 },
+  { 0x0600, 0x3034, 0x0000 },
+  { 0x8e00, 0x3039, 0x3000 },
+  { 0x9a00, 0x3037, 0x2000 },
+  { 0x1a00, 0x3036, 0x0000 },
+  { 0x0e00, 0x3038, 0x0000 },
+  { 0x8600, 0x303b, 0x2000 },
+  { 0x0e00, 0x303a, 0x0000 },
+  { 0x0700, 0x303c, 0x0000 },
+  { 0x8700, 0x30c0, 0x8000 },
+  { 0x8700, 0x307e, 0x7000 },
+  { 0x8700, 0x305e, 0x6000 },
+  { 0x8700, 0x304e, 0x5000 },
+  { 0x8700, 0x3046, 0x4000 },
+  { 0x8700, 0x3042, 0x3000 },
+  { 0x9a00, 0x303f, 0x2000 },
+  { 0x1a00, 0x303e, 0x0000 },
+  { 0x0700, 0x3041, 0x0000 },
+  { 0x8700, 0x3044, 0x2000 },
+  { 0x0700, 0x3043, 0x0000 },
+  { 0x0700, 0x3045, 0x0000 },
+  { 0x8700, 0x304a, 0x3000 },
+  { 0x8700, 0x3048, 0x2000 },
+  { 0x0700, 0x3047, 0x0000 },
+  { 0x0700, 0x3049, 0x0000 },
+  { 0x8700, 0x304c, 0x2000 },
+  { 0x0700, 0x304b, 0x0000 },
+  { 0x0700, 0x304d, 0x0000 },
+  { 0x8700, 0x3056, 0x4000 },
+  { 0x8700, 0x3052, 0x3000 },
+  { 0x8700, 0x3050, 0x2000 },
+  { 0x0700, 0x304f, 0x0000 },
+  { 0x0700, 0x3051, 0x0000 },
+  { 0x8700, 0x3054, 0x2000 },
+  { 0x0700, 0x3053, 0x0000 },
+  { 0x0700, 0x3055, 0x0000 },
+  { 0x8700, 0x305a, 0x3000 },
+  { 0x8700, 0x3058, 0x2000 },
+  { 0x0700, 0x3057, 0x0000 },
+  { 0x0700, 0x3059, 0x0000 },
+  { 0x8700, 0x305c, 0x2000 },
+  { 0x0700, 0x305b, 0x0000 },
+  { 0x0700, 0x305d, 0x0000 },
+  { 0x8700, 0x306e, 0x5000 },
+  { 0x8700, 0x3066, 0x4000 },
+  { 0x8700, 0x3062, 0x3000 },
+  { 0x8700, 0x3060, 0x2000 },
+  { 0x0700, 0x305f, 0x0000 },
+  { 0x0700, 0x3061, 0x0000 },
+  { 0x8700, 0x3064, 0x2000 },
+  { 0x0700, 0x3063, 0x0000 },
+  { 0x0700, 0x3065, 0x0000 },
+  { 0x8700, 0x306a, 0x3000 },
+  { 0x8700, 0x3068, 0x2000 },
+  { 0x0700, 0x3067, 0x0000 },
+  { 0x0700, 0x3069, 0x0000 },
+  { 0x8700, 0x306c, 0x2000 },
+  { 0x0700, 0x306b, 0x0000 },
+  { 0x0700, 0x306d, 0x0000 },
+  { 0x8700, 0x3076, 0x4000 },
+  { 0x8700, 0x3072, 0x3000 },
+  { 0x8700, 0x3070, 0x2000 },
+  { 0x0700, 0x306f, 0x0000 },
+  { 0x0700, 0x3071, 0x0000 },
+  { 0x8700, 0x3074, 0x2000 },
+  { 0x0700, 0x3073, 0x0000 },
+  { 0x0700, 0x3075, 0x0000 },
+  { 0x8700, 0x307a, 0x3000 },
+  { 0x8700, 0x3078, 0x2000 },
+  { 0x0700, 0x3077, 0x0000 },
+  { 0x0700, 0x3079, 0x0000 },
+  { 0x8700, 0x307c, 0x2000 },
+  { 0x0700, 0x307b, 0x0000 },
+  { 0x0700, 0x307d, 0x0000 },
+  { 0x9100, 0x30a0, 0x6000 },
+  { 0x8700, 0x308e, 0x5000 },
+  { 0x8700, 0x3086, 0x4000 },
+  { 0x8700, 0x3082, 0x3000 },
+  { 0x8700, 0x3080, 0x2000 },
+  { 0x0700, 0x307f, 0x0000 },
+  { 0x0700, 0x3081, 0x0000 },
+  { 0x8700, 0x3084, 0x2000 },
+  { 0x0700, 0x3083, 0x0000 },
+  { 0x0700, 0x3085, 0x0000 },
+  { 0x8700, 0x308a, 0x3000 },
+  { 0x8700, 0x3088, 0x2000 },
+  { 0x0700, 0x3087, 0x0000 },
+  { 0x0700, 0x3089, 0x0000 },
+  { 0x8700, 0x308c, 0x2000 },
+  { 0x0700, 0x308b, 0x0000 },
+  { 0x0700, 0x308d, 0x0000 },
+  { 0x8700, 0x3096, 0x4000 },
+  { 0x8700, 0x3092, 0x3000 },
+  { 0x8700, 0x3090, 0x2000 },
+  { 0x0700, 0x308f, 0x0000 },
+  { 0x0700, 0x3091, 0x0000 },
+  { 0x8700, 0x3094, 0x2000 },
+  { 0x0700, 0x3093, 0x0000 },
+  { 0x0700, 0x3095, 0x0000 },
+  { 0x9800, 0x309c, 0x3000 },
+  { 0x8c00, 0x309a, 0x2000 },
+  { 0x0c00, 0x3099, 0x0000 },
+  { 0x1800, 0x309b, 0x0000 },
+  { 0x8600, 0x309e, 0x2000 },
+  { 0x0600, 0x309d, 0x0000 },
+  { 0x0700, 0x309f, 0x0000 },
+  { 0x8700, 0x30b0, 0x5000 },
+  { 0x8700, 0x30a8, 0x4000 },
+  { 0x8700, 0x30a4, 0x3000 },
+  { 0x8700, 0x30a2, 0x2000 },
+  { 0x0700, 0x30a1, 0x0000 },
+  { 0x0700, 0x30a3, 0x0000 },
+  { 0x8700, 0x30a6, 0x2000 },
+  { 0x0700, 0x30a5, 0x0000 },
+  { 0x0700, 0x30a7, 0x0000 },
+  { 0x8700, 0x30ac, 0x3000 },
+  { 0x8700, 0x30aa, 0x2000 },
+  { 0x0700, 0x30a9, 0x0000 },
+  { 0x0700, 0x30ab, 0x0000 },
+  { 0x8700, 0x30ae, 0x2000 },
+  { 0x0700, 0x30ad, 0x0000 },
+  { 0x0700, 0x30af, 0x0000 },
+  { 0x8700, 0x30b8, 0x4000 },
+  { 0x8700, 0x30b4, 0x3000 },
+  { 0x8700, 0x30b2, 0x2000 },
+  { 0x0700, 0x30b1, 0x0000 },
+  { 0x0700, 0x30b3, 0x0000 },
+  { 0x8700, 0x30b6, 0x2000 },
+  { 0x0700, 0x30b5, 0x0000 },
+  { 0x0700, 0x30b7, 0x0000 },
+  { 0x8700, 0x30bc, 0x3000 },
+  { 0x8700, 0x30ba, 0x2000 },
+  { 0x0700, 0x30b9, 0x0000 },
+  { 0x0700, 0x30bb, 0x0000 },
+  { 0x8700, 0x30be, 0x2000 },
+  { 0x0700, 0x30bd, 0x0000 },
+  { 0x0700, 0x30bf, 0x0000 },
+  { 0x8700, 0x3105, 0x7000 },
+  { 0x8700, 0x30e0, 0x6000 },
+  { 0x8700, 0x30d0, 0x5000 },
+  { 0x8700, 0x30c8, 0x4000 },
+  { 0x8700, 0x30c4, 0x3000 },
+  { 0x8700, 0x30c2, 0x2000 },
+  { 0x0700, 0x30c1, 0x0000 },
+  { 0x0700, 0x30c3, 0x0000 },
+  { 0x8700, 0x30c6, 0x2000 },
+  { 0x0700, 0x30c5, 0x0000 },
+  { 0x0700, 0x30c7, 0x0000 },
+  { 0x8700, 0x30cc, 0x3000 },
+  { 0x8700, 0x30ca, 0x2000 },
+  { 0x0700, 0x30c9, 0x0000 },
+  { 0x0700, 0x30cb, 0x0000 },
+  { 0x8700, 0x30ce, 0x2000 },
+  { 0x0700, 0x30cd, 0x0000 },
+  { 0x0700, 0x30cf, 0x0000 },
+  { 0x8700, 0x30d8, 0x4000 },
+  { 0x8700, 0x30d4, 0x3000 },
+  { 0x8700, 0x30d2, 0x2000 },
+  { 0x0700, 0x30d1, 0x0000 },
+  { 0x0700, 0x30d3, 0x0000 },
+  { 0x8700, 0x30d6, 0x2000 },
+  { 0x0700, 0x30d5, 0x0000 },
+  { 0x0700, 0x30d7, 0x0000 },
+  { 0x8700, 0x30dc, 0x3000 },
+  { 0x8700, 0x30da, 0x2000 },
+  { 0x0700, 0x30d9, 0x0000 },
+  { 0x0700, 0x30db, 0x0000 },
+  { 0x8700, 0x30de, 0x2000 },
+  { 0x0700, 0x30dd, 0x0000 },
+  { 0x0700, 0x30df, 0x0000 },
+  { 0x8700, 0x30f0, 0x5000 },
+  { 0x8700, 0x30e8, 0x4000 },
+  { 0x8700, 0x30e4, 0x3000 },
+  { 0x8700, 0x30e2, 0x2000 },
+  { 0x0700, 0x30e1, 0x0000 },
+  { 0x0700, 0x30e3, 0x0000 },
+  { 0x8700, 0x30e6, 0x2000 },
+  { 0x0700, 0x30e5, 0x0000 },
+  { 0x0700, 0x30e7, 0x0000 },
+  { 0x8700, 0x30ec, 0x3000 },
+  { 0x8700, 0x30ea, 0x2000 },
+  { 0x0700, 0x30e9, 0x0000 },
+  { 0x0700, 0x30eb, 0x0000 },
+  { 0x8700, 0x30ee, 0x2000 },
+  { 0x0700, 0x30ed, 0x0000 },
+  { 0x0700, 0x30ef, 0x0000 },
+  { 0x8700, 0x30f8, 0x4000 },
+  { 0x8700, 0x30f4, 0x3000 },
+  { 0x8700, 0x30f2, 0x2000 },
+  { 0x0700, 0x30f1, 0x0000 },
+  { 0x0700, 0x30f3, 0x0000 },
+  { 0x8700, 0x30f6, 0x2000 },
+  { 0x0700, 0x30f5, 0x0000 },
+  { 0x0700, 0x30f7, 0x0000 },
+  { 0x8600, 0x30fc, 0x3000 },
+  { 0x8700, 0x30fa, 0x2000 },
+  { 0x0700, 0x30f9, 0x0000 },
+  { 0x1000, 0x30fb, 0x0000 },
+  { 0x8600, 0x30fe, 0x2000 },
+  { 0x0600, 0x30fd, 0x0000 },
+  { 0x0700, 0x30ff, 0x0000 },
+  { 0x8700, 0x3125, 0x6000 },
+  { 0x8700, 0x3115, 0x5000 },
+  { 0x8700, 0x310d, 0x4000 },
+  { 0x8700, 0x3109, 0x3000 },
+  { 0x8700, 0x3107, 0x2000 },
+  { 0x0700, 0x3106, 0x0000 },
+  { 0x0700, 0x3108, 0x0000 },
+  { 0x8700, 0x310b, 0x2000 },
+  { 0x0700, 0x310a, 0x0000 },
+  { 0x0700, 0x310c, 0x0000 },
+  { 0x8700, 0x3111, 0x3000 },
+  { 0x8700, 0x310f, 0x2000 },
+  { 0x0700, 0x310e, 0x0000 },
+  { 0x0700, 0x3110, 0x0000 },
+  { 0x8700, 0x3113, 0x2000 },
+  { 0x0700, 0x3112, 0x0000 },
+  { 0x0700, 0x3114, 0x0000 },
+  { 0x8700, 0x311d, 0x4000 },
+  { 0x8700, 0x3119, 0x3000 },
+  { 0x8700, 0x3117, 0x2000 },
+  { 0x0700, 0x3116, 0x0000 },
+  { 0x0700, 0x3118, 0x0000 },
+  { 0x8700, 0x311b, 0x2000 },
+  { 0x0700, 0x311a, 0x0000 },
+  { 0x0700, 0x311c, 0x0000 },
+  { 0x8700, 0x3121, 0x3000 },
+  { 0x8700, 0x311f, 0x2000 },
+  { 0x0700, 0x311e, 0x0000 },
+  { 0x0700, 0x3120, 0x0000 },
+  { 0x8700, 0x3123, 0x2000 },
+  { 0x0700, 0x3122, 0x0000 },
+  { 0x0700, 0x3124, 0x0000 },
+  { 0x8700, 0x3139, 0x5000 },
+  { 0x8700, 0x3131, 0x4000 },
+  { 0x8700, 0x3129, 0x3000 },
+  { 0x8700, 0x3127, 0x2000 },
+  { 0x0700, 0x3126, 0x0000 },
+  { 0x0700, 0x3128, 0x0000 },
+  { 0x8700, 0x312b, 0x2000 },
+  { 0x0700, 0x312a, 0x0000 },
+  { 0x0700, 0x312c, 0x0000 },
+  { 0x8700, 0x3135, 0x3000 },
+  { 0x8700, 0x3133, 0x2000 },
+  { 0x0700, 0x3132, 0x0000 },
+  { 0x0700, 0x3134, 0x0000 },
+  { 0x8700, 0x3137, 0x2000 },
+  { 0x0700, 0x3136, 0x0000 },
+  { 0x0700, 0x3138, 0x0000 },
+  { 0x8700, 0x3141, 0x4000 },
+  { 0x8700, 0x313d, 0x3000 },
+  { 0x8700, 0x313b, 0x2000 },
+  { 0x0700, 0x313a, 0x0000 },
+  { 0x0700, 0x313c, 0x0000 },
+  { 0x8700, 0x313f, 0x2000 },
+  { 0x0700, 0x313e, 0x0000 },
+  { 0x0700, 0x3140, 0x0000 },
+  { 0x8700, 0x3145, 0x3000 },
+  { 0x8700, 0x3143, 0x2000 },
+  { 0x0700, 0x3142, 0x0000 },
+  { 0x0700, 0x3144, 0x0000 },
+  { 0x8700, 0x3147, 0x2000 },
+  { 0x0700, 0x3146, 0x0000 },
+  { 0x0700, 0x3148, 0x0000 },
+  { 0x9a00, 0x3290, 0x9000 },
+  { 0x9a00, 0x3202, 0x8000 },
+  { 0x8700, 0x3189, 0x7000 },
+  { 0x8700, 0x3169, 0x6000 },
+  { 0x8700, 0x3159, 0x5000 },
+  { 0x8700, 0x3151, 0x4000 },
+  { 0x8700, 0x314d, 0x3000 },
+  { 0x8700, 0x314b, 0x2000 },
+  { 0x0700, 0x314a, 0x0000 },
+  { 0x0700, 0x314c, 0x0000 },
+  { 0x8700, 0x314f, 0x2000 },
+  { 0x0700, 0x314e, 0x0000 },
+  { 0x0700, 0x3150, 0x0000 },
+  { 0x8700, 0x3155, 0x3000 },
+  { 0x8700, 0x3153, 0x2000 },
+  { 0x0700, 0x3152, 0x0000 },
+  { 0x0700, 0x3154, 0x0000 },
+  { 0x8700, 0x3157, 0x2000 },
+  { 0x0700, 0x3156, 0x0000 },
+  { 0x0700, 0x3158, 0x0000 },
+  { 0x8700, 0x3161, 0x4000 },
+  { 0x8700, 0x315d, 0x3000 },
+  { 0x8700, 0x315b, 0x2000 },
+  { 0x0700, 0x315a, 0x0000 },
+  { 0x0700, 0x315c, 0x0000 },
+  { 0x8700, 0x315f, 0x2000 },
+  { 0x0700, 0x315e, 0x0000 },
+  { 0x0700, 0x3160, 0x0000 },
+  { 0x8700, 0x3165, 0x3000 },
+  { 0x8700, 0x3163, 0x2000 },
+  { 0x0700, 0x3162, 0x0000 },
+  { 0x0700, 0x3164, 0x0000 },
+  { 0x8700, 0x3167, 0x2000 },
+  { 0x0700, 0x3166, 0x0000 },
+  { 0x0700, 0x3168, 0x0000 },
+  { 0x8700, 0x3179, 0x5000 },
+  { 0x8700, 0x3171, 0x4000 },
+  { 0x8700, 0x316d, 0x3000 },
+  { 0x8700, 0x316b, 0x2000 },
+  { 0x0700, 0x316a, 0x0000 },
+  { 0x0700, 0x316c, 0x0000 },
+  { 0x8700, 0x316f, 0x2000 },
+  { 0x0700, 0x316e, 0x0000 },
+  { 0x0700, 0x3170, 0x0000 },
+  { 0x8700, 0x3175, 0x3000 },
+  { 0x8700, 0x3173, 0x2000 },
+  { 0x0700, 0x3172, 0x0000 },
+  { 0x0700, 0x3174, 0x0000 },
+  { 0x8700, 0x3177, 0x2000 },
+  { 0x0700, 0x3176, 0x0000 },
+  { 0x0700, 0x3178, 0x0000 },
+  { 0x8700, 0x3181, 0x4000 },
+  { 0x8700, 0x317d, 0x3000 },
+  { 0x8700, 0x317b, 0x2000 },
+  { 0x0700, 0x317a, 0x0000 },
+  { 0x0700, 0x317c, 0x0000 },
+  { 0x8700, 0x317f, 0x2000 },
+  { 0x0700, 0x317e, 0x0000 },
+  { 0x0700, 0x3180, 0x0000 },
+  { 0x8700, 0x3185, 0x3000 },
+  { 0x8700, 0x3183, 0x2000 },
+  { 0x0700, 0x3182, 0x0000 },
+  { 0x0700, 0x3184, 0x0000 },
+  { 0x8700, 0x3187, 0x2000 },
+  { 0x0700, 0x3186, 0x0000 },
+  { 0x0700, 0x3188, 0x0000 },
+  { 0x8700, 0x31aa, 0x6000 },
+  { 0x9a00, 0x319a, 0x5000 },
+  { 0x8f00, 0x3192, 0x4000 },
+  { 0x8700, 0x318d, 0x3000 },
+  { 0x8700, 0x318b, 0x2000 },
+  { 0x0700, 0x318a, 0x0000 },
+  { 0x0700, 0x318c, 0x0000 },
+  { 0x9a00, 0x3190, 0x2000 },
+  { 0x0700, 0x318e, 0x0000 },
+  { 0x1a00, 0x3191, 0x0000 },
+  { 0x9a00, 0x3196, 0x3000 },
+  { 0x8f00, 0x3194, 0x2000 },
+  { 0x0f00, 0x3193, 0x0000 },
+  { 0x0f00, 0x3195, 0x0000 },
+  { 0x9a00, 0x3198, 0x2000 },
+  { 0x1a00, 0x3197, 0x0000 },
+  { 0x1a00, 0x3199, 0x0000 },
+  { 0x8700, 0x31a2, 0x4000 },
+  { 0x9a00, 0x319e, 0x3000 },
+  { 0x9a00, 0x319c, 0x2000 },
+  { 0x1a00, 0x319b, 0x0000 },
+  { 0x1a00, 0x319d, 0x0000 },
+  { 0x8700, 0x31a0, 0x2000 },
+  { 0x1a00, 0x319f, 0x0000 },
+  { 0x0700, 0x31a1, 0x0000 },
+  { 0x8700, 0x31a6, 0x3000 },
+  { 0x8700, 0x31a4, 0x2000 },
+  { 0x0700, 0x31a3, 0x0000 },
+  { 0x0700, 0x31a5, 0x0000 },
+  { 0x8700, 0x31a8, 0x2000 },
+  { 0x0700, 0x31a7, 0x0000 },
+  { 0x0700, 0x31a9, 0x0000 },
+  { 0x8700, 0x31f2, 0x5000 },
+  { 0x8700, 0x31b2, 0x4000 },
+  { 0x8700, 0x31ae, 0x3000 },
+  { 0x8700, 0x31ac, 0x2000 },
+  { 0x0700, 0x31ab, 0x0000 },
+  { 0x0700, 0x31ad, 0x0000 },
+  { 0x8700, 0x31b0, 0x2000 },
+  { 0x0700, 0x31af, 0x0000 },
+  { 0x0700, 0x31b1, 0x0000 },
+  { 0x8700, 0x31b6, 0x3000 },
+  { 0x8700, 0x31b4, 0x2000 },
+  { 0x0700, 0x31b3, 0x0000 },
+  { 0x0700, 0x31b5, 0x0000 },
+  { 0x8700, 0x31f0, 0x2000 },
+  { 0x0700, 0x31b7, 0x0000 },
+  { 0x0700, 0x31f1, 0x0000 },
+  { 0x8700, 0x31fa, 0x4000 },
+  { 0x8700, 0x31f6, 0x3000 },
+  { 0x8700, 0x31f4, 0x2000 },
+  { 0x0700, 0x31f3, 0x0000 },
+  { 0x0700, 0x31f5, 0x0000 },
+  { 0x8700, 0x31f8, 0x2000 },
+  { 0x0700, 0x31f7, 0x0000 },
+  { 0x0700, 0x31f9, 0x0000 },
+  { 0x8700, 0x31fe, 0x3000 },
+  { 0x8700, 0x31fc, 0x2000 },
+  { 0x0700, 0x31fb, 0x0000 },
+  { 0x0700, 0x31fd, 0x0000 },
+  { 0x9a00, 0x3200, 0x2000 },
+  { 0x0700, 0x31ff, 0x0000 },
+  { 0x1a00, 0x3201, 0x0000 },
+  { 0x9a00, 0x3243, 0x7000 },
+  { 0x8f00, 0x3223, 0x6000 },
+  { 0x9a00, 0x3212, 0x5000 },
+  { 0x9a00, 0x320a, 0x4000 },
+  { 0x9a00, 0x3206, 0x3000 },
+  { 0x9a00, 0x3204, 0x2000 },
+  { 0x1a00, 0x3203, 0x0000 },
+  { 0x1a00, 0x3205, 0x0000 },
+  { 0x9a00, 0x3208, 0x2000 },
+  { 0x1a00, 0x3207, 0x0000 },
+  { 0x1a00, 0x3209, 0x0000 },
+  { 0x9a00, 0x320e, 0x3000 },
+  { 0x9a00, 0x320c, 0x2000 },
+  { 0x1a00, 0x320b, 0x0000 },
+  { 0x1a00, 0x320d, 0x0000 },
+  { 0x9a00, 0x3210, 0x2000 },
+  { 0x1a00, 0x320f, 0x0000 },
+  { 0x1a00, 0x3211, 0x0000 },
+  { 0x9a00, 0x321a, 0x4000 },
+  { 0x9a00, 0x3216, 0x3000 },
+  { 0x9a00, 0x3214, 0x2000 },
+  { 0x1a00, 0x3213, 0x0000 },
+  { 0x1a00, 0x3215, 0x0000 },
+  { 0x9a00, 0x3218, 0x2000 },
+  { 0x1a00, 0x3217, 0x0000 },
+  { 0x1a00, 0x3219, 0x0000 },
+  { 0x9a00, 0x321e, 0x3000 },
+  { 0x9a00, 0x321c, 0x2000 },
+  { 0x1a00, 0x321b, 0x0000 },
+  { 0x1a00, 0x321d, 0x0000 },
+  { 0x8f00, 0x3221, 0x2000 },
+  { 0x0f00, 0x3220, 0x0000 },
+  { 0x0f00, 0x3222, 0x0000 },
+  { 0x9a00, 0x3233, 0x5000 },
+  { 0x9a00, 0x322b, 0x4000 },
+  { 0x8f00, 0x3227, 0x3000 },
+  { 0x8f00, 0x3225, 0x2000 },
+  { 0x0f00, 0x3224, 0x0000 },
+  { 0x0f00, 0x3226, 0x0000 },
+  { 0x8f00, 0x3229, 0x2000 },
+  { 0x0f00, 0x3228, 0x0000 },
+  { 0x1a00, 0x322a, 0x0000 },
+  { 0x9a00, 0x322f, 0x3000 },
+  { 0x9a00, 0x322d, 0x2000 },
+  { 0x1a00, 0x322c, 0x0000 },
+  { 0x1a00, 0x322e, 0x0000 },
+  { 0x9a00, 0x3231, 0x2000 },
+  { 0x1a00, 0x3230, 0x0000 },
+  { 0x1a00, 0x3232, 0x0000 },
+  { 0x9a00, 0x323b, 0x4000 },
+  { 0x9a00, 0x3237, 0x3000 },
+  { 0x9a00, 0x3235, 0x2000 },
+  { 0x1a00, 0x3234, 0x0000 },
+  { 0x1a00, 0x3236, 0x0000 },
+  { 0x9a00, 0x3239, 0x2000 },
+  { 0x1a00, 0x3238, 0x0000 },
+  { 0x1a00, 0x323a, 0x0000 },
+  { 0x9a00, 0x323f, 0x3000 },
+  { 0x9a00, 0x323d, 0x2000 },
+  { 0x1a00, 0x323c, 0x0000 },
+  { 0x1a00, 0x323e, 0x0000 },
+  { 0x9a00, 0x3241, 0x2000 },
+  { 0x1a00, 0x3240, 0x0000 },
+  { 0x1a00, 0x3242, 0x0000 },
+  { 0x9a00, 0x326f, 0x6000 },
+  { 0x8f00, 0x325f, 0x5000 },
+  { 0x8f00, 0x3257, 0x4000 },
+  { 0x8f00, 0x3253, 0x3000 },
+  { 0x8f00, 0x3251, 0x2000 },
+  { 0x1a00, 0x3250, 0x0000 },
+  { 0x0f00, 0x3252, 0x0000 },
+  { 0x8f00, 0x3255, 0x2000 },
+  { 0x0f00, 0x3254, 0x0000 },
+  { 0x0f00, 0x3256, 0x0000 },
+  { 0x8f00, 0x325b, 0x3000 },
+  { 0x8f00, 0x3259, 0x2000 },
+  { 0x0f00, 0x3258, 0x0000 },
+  { 0x0f00, 0x325a, 0x0000 },
+  { 0x8f00, 0x325d, 0x2000 },
+  { 0x0f00, 0x325c, 0x0000 },
+  { 0x0f00, 0x325e, 0x0000 },
+  { 0x9a00, 0x3267, 0x4000 },
+  { 0x9a00, 0x3263, 0x3000 },
+  { 0x9a00, 0x3261, 0x2000 },
+  { 0x1a00, 0x3260, 0x0000 },
+  { 0x1a00, 0x3262, 0x0000 },
+  { 0x9a00, 0x3265, 0x2000 },
+  { 0x1a00, 0x3264, 0x0000 },
+  { 0x1a00, 0x3266, 0x0000 },
+  { 0x9a00, 0x326b, 0x3000 },
+  { 0x9a00, 0x3269, 0x2000 },
+  { 0x1a00, 0x3268, 0x0000 },
+  { 0x1a00, 0x326a, 0x0000 },
+  { 0x9a00, 0x326d, 0x2000 },
+  { 0x1a00, 0x326c, 0x0000 },
+  { 0x1a00, 0x326e, 0x0000 },
+  { 0x8f00, 0x3280, 0x5000 },
+  { 0x9a00, 0x3277, 0x4000 },
+  { 0x9a00, 0x3273, 0x3000 },
+  { 0x9a00, 0x3271, 0x2000 },
+  { 0x1a00, 0x3270, 0x0000 },
+  { 0x1a00, 0x3272, 0x0000 },
+  { 0x9a00, 0x3275, 0x2000 },
+  { 0x1a00, 0x3274, 0x0000 },
+  { 0x1a00, 0x3276, 0x0000 },
+  { 0x9a00, 0x327b, 0x3000 },
+  { 0x9a00, 0x3279, 0x2000 },
+  { 0x1a00, 0x3278, 0x0000 },
+  { 0x1a00, 0x327a, 0x0000 },
+  { 0x9a00, 0x327d, 0x2000 },
+  { 0x1a00, 0x327c, 0x0000 },
+  { 0x1a00, 0x327f, 0x0000 },
+  { 0x8f00, 0x3288, 0x4000 },
+  { 0x8f00, 0x3284, 0x3000 },
+  { 0x8f00, 0x3282, 0x2000 },
+  { 0x0f00, 0x3281, 0x0000 },
+  { 0x0f00, 0x3283, 0x0000 },
+  { 0x8f00, 0x3286, 0x2000 },
+  { 0x0f00, 0x3285, 0x0000 },
+  { 0x0f00, 0x3287, 0x0000 },
+  { 0x9a00, 0x328c, 0x3000 },
+  { 0x9a00, 0x328a, 0x2000 },
+  { 0x0f00, 0x3289, 0x0000 },
+  { 0x1a00, 0x328b, 0x0000 },
+  { 0x9a00, 0x328e, 0x2000 },
+  { 0x1a00, 0x328d, 0x0000 },
+  { 0x1a00, 0x328f, 0x0000 },
+  { 0x9a00, 0x3311, 0x8000 },
+  { 0x9a00, 0x32d0, 0x7000 },
+  { 0x9a00, 0x32b0, 0x6000 },
+  { 0x9a00, 0x32a0, 0x5000 },
+  { 0x9a00, 0x3298, 0x4000 },
+  { 0x9a00, 0x3294, 0x3000 },
+  { 0x9a00, 0x3292, 0x2000 },
+  { 0x1a00, 0x3291, 0x0000 },
+  { 0x1a00, 0x3293, 0x0000 },
+  { 0x9a00, 0x3296, 0x2000 },
+  { 0x1a00, 0x3295, 0x0000 },
+  { 0x1a00, 0x3297, 0x0000 },
+  { 0x9a00, 0x329c, 0x3000 },
+  { 0x9a00, 0x329a, 0x2000 },
+  { 0x1a00, 0x3299, 0x0000 },
+  { 0x1a00, 0x329b, 0x0000 },
+  { 0x9a00, 0x329e, 0x2000 },
+  { 0x1a00, 0x329d, 0x0000 },
+  { 0x1a00, 0x329f, 0x0000 },
+  { 0x9a00, 0x32a8, 0x4000 },
+  { 0x9a00, 0x32a4, 0x3000 },
+  { 0x9a00, 0x32a2, 0x2000 },
+  { 0x1a00, 0x32a1, 0x0000 },
+  { 0x1a00, 0x32a3, 0x0000 },
+  { 0x9a00, 0x32a6, 0x2000 },
+  { 0x1a00, 0x32a5, 0x0000 },
+  { 0x1a00, 0x32a7, 0x0000 },
+  { 0x9a00, 0x32ac, 0x3000 },
+  { 0x9a00, 0x32aa, 0x2000 },
+  { 0x1a00, 0x32a9, 0x0000 },
+  { 0x1a00, 0x32ab, 0x0000 },
+  { 0x9a00, 0x32ae, 0x2000 },
+  { 0x1a00, 0x32ad, 0x0000 },
+  { 0x1a00, 0x32af, 0x0000 },
+  { 0x9a00, 0x32c0, 0x5000 },
+  { 0x8f00, 0x32b8, 0x4000 },
+  { 0x8f00, 0x32b4, 0x3000 },
+  { 0x8f00, 0x32b2, 0x2000 },
+  { 0x0f00, 0x32b1, 0x0000 },
+  { 0x0f00, 0x32b3, 0x0000 },
+  { 0x8f00, 0x32b6, 0x2000 },
+  { 0x0f00, 0x32b5, 0x0000 },
+  { 0x0f00, 0x32b7, 0x0000 },
+  { 0x8f00, 0x32bc, 0x3000 },
+  { 0x8f00, 0x32ba, 0x2000 },
+  { 0x0f00, 0x32b9, 0x0000 },
+  { 0x0f00, 0x32bb, 0x0000 },
+  { 0x8f00, 0x32be, 0x2000 },
+  { 0x0f00, 0x32bd, 0x0000 },
+  { 0x0f00, 0x32bf, 0x0000 },
+  { 0x9a00, 0x32c8, 0x4000 },
+  { 0x9a00, 0x32c4, 0x3000 },
+  { 0x9a00, 0x32c2, 0x2000 },
+  { 0x1a00, 0x32c1, 0x0000 },
+  { 0x1a00, 0x32c3, 0x0000 },
+  { 0x9a00, 0x32c6, 0x2000 },
+  { 0x1a00, 0x32c5, 0x0000 },
+  { 0x1a00, 0x32c7, 0x0000 },
+  { 0x9a00, 0x32cc, 0x3000 },
+  { 0x9a00, 0x32ca, 0x2000 },
+  { 0x1a00, 0x32c9, 0x0000 },
+  { 0x1a00, 0x32cb, 0x0000 },
+  { 0x9a00, 0x32ce, 0x2000 },
+  { 0x1a00, 0x32cd, 0x0000 },
+  { 0x1a00, 0x32cf, 0x0000 },
+  { 0x9a00, 0x32f0, 0x6000 },
+  { 0x9a00, 0x32e0, 0x5000 },
+  { 0x9a00, 0x32d8, 0x4000 },
+  { 0x9a00, 0x32d4, 0x3000 },
+  { 0x9a00, 0x32d2, 0x2000 },
+  { 0x1a00, 0x32d1, 0x0000 },
+  { 0x1a00, 0x32d3, 0x0000 },
+  { 0x9a00, 0x32d6, 0x2000 },
+  { 0x1a00, 0x32d5, 0x0000 },
+  { 0x1a00, 0x32d7, 0x0000 },
+  { 0x9a00, 0x32dc, 0x3000 },
+  { 0x9a00, 0x32da, 0x2000 },
+  { 0x1a00, 0x32d9, 0x0000 },
+  { 0x1a00, 0x32db, 0x0000 },
+  { 0x9a00, 0x32de, 0x2000 },
+  { 0x1a00, 0x32dd, 0x0000 },
+  { 0x1a00, 0x32df, 0x0000 },
+  { 0x9a00, 0x32e8, 0x4000 },
+  { 0x9a00, 0x32e4, 0x3000 },
+  { 0x9a00, 0x32e2, 0x2000 },
+  { 0x1a00, 0x32e1, 0x0000 },
+  { 0x1a00, 0x32e3, 0x0000 },
+  { 0x9a00, 0x32e6, 0x2000 },
+  { 0x1a00, 0x32e5, 0x0000 },
+  { 0x1a00, 0x32e7, 0x0000 },
+  { 0x9a00, 0x32ec, 0x3000 },
+  { 0x9a00, 0x32ea, 0x2000 },
+  { 0x1a00, 0x32e9, 0x0000 },
+  { 0x1a00, 0x32eb, 0x0000 },
+  { 0x9a00, 0x32ee, 0x2000 },
+  { 0x1a00, 0x32ed, 0x0000 },
+  { 0x1a00, 0x32ef, 0x0000 },
+  { 0x9a00, 0x3301, 0x5000 },
+  { 0x9a00, 0x32f8, 0x4000 },
+  { 0x9a00, 0x32f4, 0x3000 },
+  { 0x9a00, 0x32f2, 0x2000 },
+  { 0x1a00, 0x32f1, 0x0000 },
+  { 0x1a00, 0x32f3, 0x0000 },
+  { 0x9a00, 0x32f6, 0x2000 },
+  { 0x1a00, 0x32f5, 0x0000 },
+  { 0x1a00, 0x32f7, 0x0000 },
+  { 0x9a00, 0x32fc, 0x3000 },
+  { 0x9a00, 0x32fa, 0x2000 },
+  { 0x1a00, 0x32f9, 0x0000 },
+  { 0x1a00, 0x32fb, 0x0000 },
+  { 0x9a00, 0x32fe, 0x2000 },
+  { 0x1a00, 0x32fd, 0x0000 },
+  { 0x1a00, 0x3300, 0x0000 },
+  { 0x9a00, 0x3309, 0x4000 },
+  { 0x9a00, 0x3305, 0x3000 },
+  { 0x9a00, 0x3303, 0x2000 },
+  { 0x1a00, 0x3302, 0x0000 },
+  { 0x1a00, 0x3304, 0x0000 },
+  { 0x9a00, 0x3307, 0x2000 },
+  { 0x1a00, 0x3306, 0x0000 },
+  { 0x1a00, 0x3308, 0x0000 },
+  { 0x9a00, 0x330d, 0x3000 },
+  { 0x9a00, 0x330b, 0x2000 },
+  { 0x1a00, 0x330a, 0x0000 },
+  { 0x1a00, 0x330c, 0x0000 },
+  { 0x9a00, 0x330f, 0x2000 },
+  { 0x1a00, 0x330e, 0x0000 },
+  { 0x1a00, 0x3310, 0x0000 },
+  { 0x9a00, 0x3351, 0x7000 },
+  { 0x9a00, 0x3331, 0x6000 },
+  { 0x9a00, 0x3321, 0x5000 },
+  { 0x9a00, 0x3319, 0x4000 },
+  { 0x9a00, 0x3315, 0x3000 },
+  { 0x9a00, 0x3313, 0x2000 },
+  { 0x1a00, 0x3312, 0x0000 },
+  { 0x1a00, 0x3314, 0x0000 },
+  { 0x9a00, 0x3317, 0x2000 },
+  { 0x1a00, 0x3316, 0x0000 },
+  { 0x1a00, 0x3318, 0x0000 },
+  { 0x9a00, 0x331d, 0x3000 },
+  { 0x9a00, 0x331b, 0x2000 },
+  { 0x1a00, 0x331a, 0x0000 },
+  { 0x1a00, 0x331c, 0x0000 },
+  { 0x9a00, 0x331f, 0x2000 },
+  { 0x1a00, 0x331e, 0x0000 },
+  { 0x1a00, 0x3320, 0x0000 },
+  { 0x9a00, 0x3329, 0x4000 },
+  { 0x9a00, 0x3325, 0x3000 },
+  { 0x9a00, 0x3323, 0x2000 },
+  { 0x1a00, 0x3322, 0x0000 },
+  { 0x1a00, 0x3324, 0x0000 },
+  { 0x9a00, 0x3327, 0x2000 },
+  { 0x1a00, 0x3326, 0x0000 },
+  { 0x1a00, 0x3328, 0x0000 },
+  { 0x9a00, 0x332d, 0x3000 },
+  { 0x9a00, 0x332b, 0x2000 },
+  { 0x1a00, 0x332a, 0x0000 },
+  { 0x1a00, 0x332c, 0x0000 },
+  { 0x9a00, 0x332f, 0x2000 },
+  { 0x1a00, 0x332e, 0x0000 },
+  { 0x1a00, 0x3330, 0x0000 },
+  { 0x9a00, 0x3341, 0x5000 },
+  { 0x9a00, 0x3339, 0x4000 },
+  { 0x9a00, 0x3335, 0x3000 },
+  { 0x9a00, 0x3333, 0x2000 },
+  { 0x1a00, 0x3332, 0x0000 },
+  { 0x1a00, 0x3334, 0x0000 },
+  { 0x9a00, 0x3337, 0x2000 },
+  { 0x1a00, 0x3336, 0x0000 },
+  { 0x1a00, 0x3338, 0x0000 },
+  { 0x9a00, 0x333d, 0x3000 },
+  { 0x9a00, 0x333b, 0x2000 },
+  { 0x1a00, 0x333a, 0x0000 },
+  { 0x1a00, 0x333c, 0x0000 },
+  { 0x9a00, 0x333f, 0x2000 },
+  { 0x1a00, 0x333e, 0x0000 },
+  { 0x1a00, 0x3340, 0x0000 },
+  { 0x9a00, 0x3349, 0x4000 },
+  { 0x9a00, 0x3345, 0x3000 },
+  { 0x9a00, 0x3343, 0x2000 },
+  { 0x1a00, 0x3342, 0x0000 },
+  { 0x1a00, 0x3344, 0x0000 },
+  { 0x9a00, 0x3347, 0x2000 },
+  { 0x1a00, 0x3346, 0x0000 },
+  { 0x1a00, 0x3348, 0x0000 },
+  { 0x9a00, 0x334d, 0x3000 },
+  { 0x9a00, 0x334b, 0x2000 },
+  { 0x1a00, 0x334a, 0x0000 },
+  { 0x1a00, 0x334c, 0x0000 },
+  { 0x9a00, 0x334f, 0x2000 },
+  { 0x1a00, 0x334e, 0x0000 },
+  { 0x1a00, 0x3350, 0x0000 },
+  { 0x9a00, 0x3371, 0x6000 },
+  { 0x9a00, 0x3361, 0x5000 },
+  { 0x9a00, 0x3359, 0x4000 },
+  { 0x9a00, 0x3355, 0x3000 },
+  { 0x9a00, 0x3353, 0x2000 },
+  { 0x1a00, 0x3352, 0x0000 },
+  { 0x1a00, 0x3354, 0x0000 },
+  { 0x9a00, 0x3357, 0x2000 },
+  { 0x1a00, 0x3356, 0x0000 },
+  { 0x1a00, 0x3358, 0x0000 },
+  { 0x9a00, 0x335d, 0x3000 },
+  { 0x9a00, 0x335b, 0x2000 },
+  { 0x1a00, 0x335a, 0x0000 },
+  { 0x1a00, 0x335c, 0x0000 },
+  { 0x9a00, 0x335f, 0x2000 },
+  { 0x1a00, 0x335e, 0x0000 },
+  { 0x1a00, 0x3360, 0x0000 },
+  { 0x9a00, 0x3369, 0x4000 },
+  { 0x9a00, 0x3365, 0x3000 },
+  { 0x9a00, 0x3363, 0x2000 },
+  { 0x1a00, 0x3362, 0x0000 },
+  { 0x1a00, 0x3364, 0x0000 },
+  { 0x9a00, 0x3367, 0x2000 },
+  { 0x1a00, 0x3366, 0x0000 },
+  { 0x1a00, 0x3368, 0x0000 },
+  { 0x9a00, 0x336d, 0x3000 },
+  { 0x9a00, 0x336b, 0x2000 },
+  { 0x1a00, 0x336a, 0x0000 },
+  { 0x1a00, 0x336c, 0x0000 },
+  { 0x9a00, 0x336f, 0x2000 },
+  { 0x1a00, 0x336e, 0x0000 },
+  { 0x1a00, 0x3370, 0x0000 },
+  { 0x9a00, 0x3381, 0x5000 },
+  { 0x9a00, 0x3379, 0x4000 },
+  { 0x9a00, 0x3375, 0x3000 },
+  { 0x9a00, 0x3373, 0x2000 },
+  { 0x1a00, 0x3372, 0x0000 },
+  { 0x1a00, 0x3374, 0x0000 },
+  { 0x9a00, 0x3377, 0x2000 },
+  { 0x1a00, 0x3376, 0x0000 },
+  { 0x1a00, 0x3378, 0x0000 },
+  { 0x9a00, 0x337d, 0x3000 },
+  { 0x9a00, 0x337b, 0x2000 },
+  { 0x1a00, 0x337a, 0x0000 },
+  { 0x1a00, 0x337c, 0x0000 },
+  { 0x9a00, 0x337f, 0x2000 },
+  { 0x1a00, 0x337e, 0x0000 },
+  { 0x1a00, 0x3380, 0x0000 },
+  { 0x9a00, 0x3389, 0x4000 },
+  { 0x9a00, 0x3385, 0x3000 },
+  { 0x9a00, 0x3383, 0x2000 },
+  { 0x1a00, 0x3382, 0x0000 },
+  { 0x1a00, 0x3384, 0x0000 },
+  { 0x9a00, 0x3387, 0x2000 },
+  { 0x1a00, 0x3386, 0x0000 },
+  { 0x1a00, 0x3388, 0x0000 },
+  { 0x9a00, 0x338d, 0x3000 },
+  { 0x9a00, 0x338b, 0x2000 },
+  { 0x1a00, 0x338a, 0x0000 },
+  { 0x1a00, 0x338c, 0x0000 },
+  { 0x9a00, 0x338f, 0x2000 },
+  { 0x1a00, 0x338e, 0x0000 },
+  { 0x1a00, 0x3390, 0x0000 },
+  { 0x8700, 0xa14d, 0xa000 },
+  { 0x8700, 0xa04d, 0x9000 },
+  { 0x9a00, 0x4dcf, 0x8000 },
+  { 0x9a00, 0x33d1, 0x7000 },
+  { 0x9a00, 0x33b1, 0x6000 },
+  { 0x9a00, 0x33a1, 0x5000 },
+  { 0x9a00, 0x3399, 0x4000 },
+  { 0x9a00, 0x3395, 0x3000 },
+  { 0x9a00, 0x3393, 0x2000 },
+  { 0x1a00, 0x3392, 0x0000 },
+  { 0x1a00, 0x3394, 0x0000 },
+  { 0x9a00, 0x3397, 0x2000 },
+  { 0x1a00, 0x3396, 0x0000 },
+  { 0x1a00, 0x3398, 0x0000 },
+  { 0x9a00, 0x339d, 0x3000 },
+  { 0x9a00, 0x339b, 0x2000 },
+  { 0x1a00, 0x339a, 0x0000 },
+  { 0x1a00, 0x339c, 0x0000 },
+  { 0x9a00, 0x339f, 0x2000 },
+  { 0x1a00, 0x339e, 0x0000 },
+  { 0x1a00, 0x33a0, 0x0000 },
+  { 0x9a00, 0x33a9, 0x4000 },
+  { 0x9a00, 0x33a5, 0x3000 },
+  { 0x9a00, 0x33a3, 0x2000 },
+  { 0x1a00, 0x33a2, 0x0000 },
+  { 0x1a00, 0x33a4, 0x0000 },
+  { 0x9a00, 0x33a7, 0x2000 },
+  { 0x1a00, 0x33a6, 0x0000 },
+  { 0x1a00, 0x33a8, 0x0000 },
+  { 0x9a00, 0x33ad, 0x3000 },
+  { 0x9a00, 0x33ab, 0x2000 },
+  { 0x1a00, 0x33aa, 0x0000 },
+  { 0x1a00, 0x33ac, 0x0000 },
+  { 0x9a00, 0x33af, 0x2000 },
+  { 0x1a00, 0x33ae, 0x0000 },
+  { 0x1a00, 0x33b0, 0x0000 },
+  { 0x9a00, 0x33c1, 0x5000 },
+  { 0x9a00, 0x33b9, 0x4000 },
+  { 0x9a00, 0x33b5, 0x3000 },
+  { 0x9a00, 0x33b3, 0x2000 },
+  { 0x1a00, 0x33b2, 0x0000 },
+  { 0x1a00, 0x33b4, 0x0000 },
+  { 0x9a00, 0x33b7, 0x2000 },
+  { 0x1a00, 0x33b6, 0x0000 },
+  { 0x1a00, 0x33b8, 0x0000 },
+  { 0x9a00, 0x33bd, 0x3000 },
+  { 0x9a00, 0x33bb, 0x2000 },
+  { 0x1a00, 0x33ba, 0x0000 },
+  { 0x1a00, 0x33bc, 0x0000 },
+  { 0x9a00, 0x33bf, 0x2000 },
+  { 0x1a00, 0x33be, 0x0000 },
+  { 0x1a00, 0x33c0, 0x0000 },
+  { 0x9a00, 0x33c9, 0x4000 },
+  { 0x9a00, 0x33c5, 0x3000 },
+  { 0x9a00, 0x33c3, 0x2000 },
+  { 0x1a00, 0x33c2, 0x0000 },
+  { 0x1a00, 0x33c4, 0x0000 },
+  { 0x9a00, 0x33c7, 0x2000 },
+  { 0x1a00, 0x33c6, 0x0000 },
+  { 0x1a00, 0x33c8, 0x0000 },
+  { 0x9a00, 0x33cd, 0x3000 },
+  { 0x9a00, 0x33cb, 0x2000 },
+  { 0x1a00, 0x33ca, 0x0000 },
+  { 0x1a00, 0x33cc, 0x0000 },
+  { 0x9a00, 0x33cf, 0x2000 },
+  { 0x1a00, 0x33ce, 0x0000 },
+  { 0x1a00, 0x33d0, 0x0000 },
+  { 0x9a00, 0x33f1, 0x6000 },
+  { 0x9a00, 0x33e1, 0x5000 },
+  { 0x9a00, 0x33d9, 0x4000 },
+  { 0x9a00, 0x33d5, 0x3000 },
+  { 0x9a00, 0x33d3, 0x2000 },
+  { 0x1a00, 0x33d2, 0x0000 },
+  { 0x1a00, 0x33d4, 0x0000 },
+  { 0x9a00, 0x33d7, 0x2000 },
+  { 0x1a00, 0x33d6, 0x0000 },
+  { 0x1a00, 0x33d8, 0x0000 },
+  { 0x9a00, 0x33dd, 0x3000 },
+  { 0x9a00, 0x33db, 0x2000 },
+  { 0x1a00, 0x33da, 0x0000 },
+  { 0x1a00, 0x33dc, 0x0000 },
+  { 0x9a00, 0x33df, 0x2000 },
+  { 0x1a00, 0x33de, 0x0000 },
+  { 0x1a00, 0x33e0, 0x0000 },
+  { 0x9a00, 0x33e9, 0x4000 },
+  { 0x9a00, 0x33e5, 0x3000 },
+  { 0x9a00, 0x33e3, 0x2000 },
+  { 0x1a00, 0x33e2, 0x0000 },
+  { 0x1a00, 0x33e4, 0x0000 },
+  { 0x9a00, 0x33e7, 0x2000 },
+  { 0x1a00, 0x33e6, 0x0000 },
+  { 0x1a00, 0x33e8, 0x0000 },
+  { 0x9a00, 0x33ed, 0x3000 },
+  { 0x9a00, 0x33eb, 0x2000 },
+  { 0x1a00, 0x33ea, 0x0000 },
+  { 0x1a00, 0x33ec, 0x0000 },
+  { 0x9a00, 0x33ef, 0x2000 },
+  { 0x1a00, 0x33ee, 0x0000 },
+  { 0x1a00, 0x33f0, 0x0000 },
+  { 0x8700, 0x4db5, 0x5000 },
+  { 0x9a00, 0x33f9, 0x4000 },
+  { 0x9a00, 0x33f5, 0x3000 },
+  { 0x9a00, 0x33f3, 0x2000 },
+  { 0x1a00, 0x33f2, 0x0000 },
+  { 0x1a00, 0x33f4, 0x0000 },
+  { 0x9a00, 0x33f7, 0x2000 },
+  { 0x1a00, 0x33f6, 0x0000 },
+  { 0x1a00, 0x33f8, 0x0000 },
+  { 0x9a00, 0x33fd, 0x3000 },
+  { 0x9a00, 0x33fb, 0x2000 },
+  { 0x1a00, 0x33fa, 0x0000 },
+  { 0x1a00, 0x33fc, 0x0000 },
+  { 0x9a00, 0x33ff, 0x2000 },
+  { 0x1a00, 0x33fe, 0x0000 },
+  { 0x0700, 0x3400, 0x0000 },
+  { 0x9a00, 0x4dc7, 0x4000 },
+  { 0x9a00, 0x4dc3, 0x3000 },
+  { 0x9a00, 0x4dc1, 0x2000 },
+  { 0x1a00, 0x4dc0, 0x0000 },
+  { 0x1a00, 0x4dc2, 0x0000 },
+  { 0x9a00, 0x4dc5, 0x2000 },
+  { 0x1a00, 0x4dc4, 0x0000 },
+  { 0x1a00, 0x4dc6, 0x0000 },
+  { 0x9a00, 0x4dcb, 0x3000 },
+  { 0x9a00, 0x4dc9, 0x2000 },
+  { 0x1a00, 0x4dc8, 0x0000 },
+  { 0x1a00, 0x4dca, 0x0000 },
+  { 0x9a00, 0x4dcd, 0x2000 },
+  { 0x1a00, 0x4dcc, 0x0000 },
+  { 0x1a00, 0x4dce, 0x0000 },
+  { 0x8700, 0xa00d, 0x7000 },
+  { 0x9a00, 0x4def, 0x6000 },
+  { 0x9a00, 0x4ddf, 0x5000 },
+  { 0x9a00, 0x4dd7, 0x4000 },
+  { 0x9a00, 0x4dd3, 0x3000 },
+  { 0x9a00, 0x4dd1, 0x2000 },
+  { 0x1a00, 0x4dd0, 0x0000 },
+  { 0x1a00, 0x4dd2, 0x0000 },
+  { 0x9a00, 0x4dd5, 0x2000 },
+  { 0x1a00, 0x4dd4, 0x0000 },
+  { 0x1a00, 0x4dd6, 0x0000 },
+  { 0x9a00, 0x4ddb, 0x3000 },
+  { 0x9a00, 0x4dd9, 0x2000 },
+  { 0x1a00, 0x4dd8, 0x0000 },
+  { 0x1a00, 0x4dda, 0x0000 },
+  { 0x9a00, 0x4ddd, 0x2000 },
+  { 0x1a00, 0x4ddc, 0x0000 },
+  { 0x1a00, 0x4dde, 0x0000 },
+  { 0x9a00, 0x4de7, 0x4000 },
+  { 0x9a00, 0x4de3, 0x3000 },
+  { 0x9a00, 0x4de1, 0x2000 },
+  { 0x1a00, 0x4de0, 0x0000 },
+  { 0x1a00, 0x4de2, 0x0000 },
+  { 0x9a00, 0x4de5, 0x2000 },
+  { 0x1a00, 0x4de4, 0x0000 },
+  { 0x1a00, 0x4de6, 0x0000 },
+  { 0x9a00, 0x4deb, 0x3000 },
+  { 0x9a00, 0x4de9, 0x2000 },
+  { 0x1a00, 0x4de8, 0x0000 },
+  { 0x1a00, 0x4dea, 0x0000 },
+  { 0x9a00, 0x4ded, 0x2000 },
+  { 0x1a00, 0x4dec, 0x0000 },
+  { 0x1a00, 0x4dee, 0x0000 },
+  { 0x9a00, 0x4dff, 0x5000 },
+  { 0x9a00, 0x4df7, 0x4000 },
+  { 0x9a00, 0x4df3, 0x3000 },
+  { 0x9a00, 0x4df1, 0x2000 },
+  { 0x1a00, 0x4df0, 0x0000 },
+  { 0x1a00, 0x4df2, 0x0000 },
+  { 0x9a00, 0x4df5, 0x2000 },
+  { 0x1a00, 0x4df4, 0x0000 },
+  { 0x1a00, 0x4df6, 0x0000 },
+  { 0x9a00, 0x4dfb, 0x3000 },
+  { 0x9a00, 0x4df9, 0x2000 },
+  { 0x1a00, 0x4df8, 0x0000 },
+  { 0x1a00, 0x4dfa, 0x0000 },
+  { 0x9a00, 0x4dfd, 0x2000 },
+  { 0x1a00, 0x4dfc, 0x0000 },
+  { 0x1a00, 0x4dfe, 0x0000 },
+  { 0x8700, 0xa005, 0x4000 },
+  { 0x8700, 0xa001, 0x3000 },
+  { 0x8700, 0x9fa5, 0x2000 },
+  { 0x0700, 0x4e00, 0x0000 },
+  { 0x0700, 0xa000, 0x0000 },
+  { 0x8700, 0xa003, 0x2000 },
+  { 0x0700, 0xa002, 0x0000 },
+  { 0x0700, 0xa004, 0x0000 },
+  { 0x8700, 0xa009, 0x3000 },
+  { 0x8700, 0xa007, 0x2000 },
+  { 0x0700, 0xa006, 0x0000 },
+  { 0x0700, 0xa008, 0x0000 },
+  { 0x8700, 0xa00b, 0x2000 },
+  { 0x0700, 0xa00a, 0x0000 },
+  { 0x0700, 0xa00c, 0x0000 },
+  { 0x8700, 0xa02d, 0x6000 },
+  { 0x8700, 0xa01d, 0x5000 },
+  { 0x8700, 0xa015, 0x4000 },
+  { 0x8700, 0xa011, 0x3000 },
+  { 0x8700, 0xa00f, 0x2000 },
+  { 0x0700, 0xa00e, 0x0000 },
+  { 0x0700, 0xa010, 0x0000 },
+  { 0x8700, 0xa013, 0x2000 },
+  { 0x0700, 0xa012, 0x0000 },
+  { 0x0700, 0xa014, 0x0000 },
+  { 0x8700, 0xa019, 0x3000 },
+  { 0x8700, 0xa017, 0x2000 },
+  { 0x0700, 0xa016, 0x0000 },
+  { 0x0700, 0xa018, 0x0000 },
+  { 0x8700, 0xa01b, 0x2000 },
+  { 0x0700, 0xa01a, 0x0000 },
+  { 0x0700, 0xa01c, 0x0000 },
+  { 0x8700, 0xa025, 0x4000 },
+  { 0x8700, 0xa021, 0x3000 },
+  { 0x8700, 0xa01f, 0x2000 },
+  { 0x0700, 0xa01e, 0x0000 },
+  { 0x0700, 0xa020, 0x0000 },
+  { 0x8700, 0xa023, 0x2000 },
+  { 0x0700, 0xa022, 0x0000 },
+  { 0x0700, 0xa024, 0x0000 },
+  { 0x8700, 0xa029, 0x3000 },
+  { 0x8700, 0xa027, 0x2000 },
+  { 0x0700, 0xa026, 0x0000 },
+  { 0x0700, 0xa028, 0x0000 },
+  { 0x8700, 0xa02b, 0x2000 },
+  { 0x0700, 0xa02a, 0x0000 },
+  { 0x0700, 0xa02c, 0x0000 },
+  { 0x8700, 0xa03d, 0x5000 },
+  { 0x8700, 0xa035, 0x4000 },
+  { 0x8700, 0xa031, 0x3000 },
+  { 0x8700, 0xa02f, 0x2000 },
+  { 0x0700, 0xa02e, 0x0000 },
+  { 0x0700, 0xa030, 0x0000 },
+  { 0x8700, 0xa033, 0x2000 },
+  { 0x0700, 0xa032, 0x0000 },
+  { 0x0700, 0xa034, 0x0000 },
+  { 0x8700, 0xa039, 0x3000 },
+  { 0x8700, 0xa037, 0x2000 },
+  { 0x0700, 0xa036, 0x0000 },
+  { 0x0700, 0xa038, 0x0000 },
+  { 0x8700, 0xa03b, 0x2000 },
+  { 0x0700, 0xa03a, 0x0000 },
+  { 0x0700, 0xa03c, 0x0000 },
+  { 0x8700, 0xa045, 0x4000 },
+  { 0x8700, 0xa041, 0x3000 },
+  { 0x8700, 0xa03f, 0x2000 },
+  { 0x0700, 0xa03e, 0x0000 },
+  { 0x0700, 0xa040, 0x0000 },
+  { 0x8700, 0xa043, 0x2000 },
+  { 0x0700, 0xa042, 0x0000 },
+  { 0x0700, 0xa044, 0x0000 },
+  { 0x8700, 0xa049, 0x3000 },
+  { 0x8700, 0xa047, 0x2000 },
+  { 0x0700, 0xa046, 0x0000 },
+  { 0x0700, 0xa048, 0x0000 },
+  { 0x8700, 0xa04b, 0x2000 },
+  { 0x0700, 0xa04a, 0x0000 },
+  { 0x0700, 0xa04c, 0x0000 },
+  { 0x8700, 0xa0cd, 0x8000 },
+  { 0x8700, 0xa08d, 0x7000 },
+  { 0x8700, 0xa06d, 0x6000 },
+  { 0x8700, 0xa05d, 0x5000 },
+  { 0x8700, 0xa055, 0x4000 },
+  { 0x8700, 0xa051, 0x3000 },
+  { 0x8700, 0xa04f, 0x2000 },
+  { 0x0700, 0xa04e, 0x0000 },
+  { 0x0700, 0xa050, 0x0000 },
+  { 0x8700, 0xa053, 0x2000 },
+  { 0x0700, 0xa052, 0x0000 },
+  { 0x0700, 0xa054, 0x0000 },
+  { 0x8700, 0xa059, 0x3000 },
+  { 0x8700, 0xa057, 0x2000 },
+  { 0x0700, 0xa056, 0x0000 },
+  { 0x0700, 0xa058, 0x0000 },
+  { 0x8700, 0xa05b, 0x2000 },
+  { 0x0700, 0xa05a, 0x0000 },
+  { 0x0700, 0xa05c, 0x0000 },
+  { 0x8700, 0xa065, 0x4000 },
+  { 0x8700, 0xa061, 0x3000 },
+  { 0x8700, 0xa05f, 0x2000 },
+  { 0x0700, 0xa05e, 0x0000 },
+  { 0x0700, 0xa060, 0x0000 },
+  { 0x8700, 0xa063, 0x2000 },
+  { 0x0700, 0xa062, 0x0000 },
+  { 0x0700, 0xa064, 0x0000 },
+  { 0x8700, 0xa069, 0x3000 },
+  { 0x8700, 0xa067, 0x2000 },
+  { 0x0700, 0xa066, 0x0000 },
+  { 0x0700, 0xa068, 0x0000 },
+  { 0x8700, 0xa06b, 0x2000 },
+  { 0x0700, 0xa06a, 0x0000 },
+  { 0x0700, 0xa06c, 0x0000 },
+  { 0x8700, 0xa07d, 0x5000 },
+  { 0x8700, 0xa075, 0x4000 },
+  { 0x8700, 0xa071, 0x3000 },
+  { 0x8700, 0xa06f, 0x2000 },
+  { 0x0700, 0xa06e, 0x0000 },
+  { 0x0700, 0xa070, 0x0000 },
+  { 0x8700, 0xa073, 0x2000 },
+  { 0x0700, 0xa072, 0x0000 },
+  { 0x0700, 0xa074, 0x0000 },
+  { 0x8700, 0xa079, 0x3000 },
+  { 0x8700, 0xa077, 0x2000 },
+  { 0x0700, 0xa076, 0x0000 },
+  { 0x0700, 0xa078, 0x0000 },
+  { 0x8700, 0xa07b, 0x2000 },
+  { 0x0700, 0xa07a, 0x0000 },
+  { 0x0700, 0xa07c, 0x0000 },
+  { 0x8700, 0xa085, 0x4000 },
+  { 0x8700, 0xa081, 0x3000 },
+  { 0x8700, 0xa07f, 0x2000 },
+  { 0x0700, 0xa07e, 0x0000 },
+  { 0x0700, 0xa080, 0x0000 },
+  { 0x8700, 0xa083, 0x2000 },
+  { 0x0700, 0xa082, 0x0000 },
+  { 0x0700, 0xa084, 0x0000 },
+  { 0x8700, 0xa089, 0x3000 },
+  { 0x8700, 0xa087, 0x2000 },
+  { 0x0700, 0xa086, 0x0000 },
+  { 0x0700, 0xa088, 0x0000 },
+  { 0x8700, 0xa08b, 0x2000 },
+  { 0x0700, 0xa08a, 0x0000 },
+  { 0x0700, 0xa08c, 0x0000 },
+  { 0x8700, 0xa0ad, 0x6000 },
+  { 0x8700, 0xa09d, 0x5000 },
+  { 0x8700, 0xa095, 0x4000 },
+  { 0x8700, 0xa091, 0x3000 },
+  { 0x8700, 0xa08f, 0x2000 },
+  { 0x0700, 0xa08e, 0x0000 },
+  { 0x0700, 0xa090, 0x0000 },
+  { 0x8700, 0xa093, 0x2000 },
+  { 0x0700, 0xa092, 0x0000 },
+  { 0x0700, 0xa094, 0x0000 },
+  { 0x8700, 0xa099, 0x3000 },
+  { 0x8700, 0xa097, 0x2000 },
+  { 0x0700, 0xa096, 0x0000 },
+  { 0x0700, 0xa098, 0x0000 },
+  { 0x8700, 0xa09b, 0x2000 },
+  { 0x0700, 0xa09a, 0x0000 },
+  { 0x0700, 0xa09c, 0x0000 },
+  { 0x8700, 0xa0a5, 0x4000 },
+  { 0x8700, 0xa0a1, 0x3000 },
+  { 0x8700, 0xa09f, 0x2000 },
+  { 0x0700, 0xa09e, 0x0000 },
+  { 0x0700, 0xa0a0, 0x0000 },
+  { 0x8700, 0xa0a3, 0x2000 },
+  { 0x0700, 0xa0a2, 0x0000 },
+  { 0x0700, 0xa0a4, 0x0000 },
+  { 0x8700, 0xa0a9, 0x3000 },
+  { 0x8700, 0xa0a7, 0x2000 },
+  { 0x0700, 0xa0a6, 0x0000 },
+  { 0x0700, 0xa0a8, 0x0000 },
+  { 0x8700, 0xa0ab, 0x2000 },
+  { 0x0700, 0xa0aa, 0x0000 },
+  { 0x0700, 0xa0ac, 0x0000 },
+  { 0x8700, 0xa0bd, 0x5000 },
+  { 0x8700, 0xa0b5, 0x4000 },
+  { 0x8700, 0xa0b1, 0x3000 },
+  { 0x8700, 0xa0af, 0x2000 },
+  { 0x0700, 0xa0ae, 0x0000 },
+  { 0x0700, 0xa0b0, 0x0000 },
+  { 0x8700, 0xa0b3, 0x2000 },
+  { 0x0700, 0xa0b2, 0x0000 },
+  { 0x0700, 0xa0b4, 0x0000 },
+  { 0x8700, 0xa0b9, 0x3000 },
+  { 0x8700, 0xa0b7, 0x2000 },
+  { 0x0700, 0xa0b6, 0x0000 },
+  { 0x0700, 0xa0b8, 0x0000 },
+  { 0x8700, 0xa0bb, 0x2000 },
+  { 0x0700, 0xa0ba, 0x0000 },
+  { 0x0700, 0xa0bc, 0x0000 },
+  { 0x8700, 0xa0c5, 0x4000 },
+  { 0x8700, 0xa0c1, 0x3000 },
+  { 0x8700, 0xa0bf, 0x2000 },
+  { 0x0700, 0xa0be, 0x0000 },
+  { 0x0700, 0xa0c0, 0x0000 },
+  { 0x8700, 0xa0c3, 0x2000 },
+  { 0x0700, 0xa0c2, 0x0000 },
+  { 0x0700, 0xa0c4, 0x0000 },
+  { 0x8700, 0xa0c9, 0x3000 },
+  { 0x8700, 0xa0c7, 0x2000 },
+  { 0x0700, 0xa0c6, 0x0000 },
+  { 0x0700, 0xa0c8, 0x0000 },
+  { 0x8700, 0xa0cb, 0x2000 },
+  { 0x0700, 0xa0ca, 0x0000 },
+  { 0x0700, 0xa0cc, 0x0000 },
+  { 0x8700, 0xa10d, 0x7000 },
+  { 0x8700, 0xa0ed, 0x6000 },
+  { 0x8700, 0xa0dd, 0x5000 },
+  { 0x8700, 0xa0d5, 0x4000 },
+  { 0x8700, 0xa0d1, 0x3000 },
+  { 0x8700, 0xa0cf, 0x2000 },
+  { 0x0700, 0xa0ce, 0x0000 },
+  { 0x0700, 0xa0d0, 0x0000 },
+  { 0x8700, 0xa0d3, 0x2000 },
+  { 0x0700, 0xa0d2, 0x0000 },
+  { 0x0700, 0xa0d4, 0x0000 },
+  { 0x8700, 0xa0d9, 0x3000 },
+  { 0x8700, 0xa0d7, 0x2000 },
+  { 0x0700, 0xa0d6, 0x0000 },
+  { 0x0700, 0xa0d8, 0x0000 },
+  { 0x8700, 0xa0db, 0x2000 },
+  { 0x0700, 0xa0da, 0x0000 },
+  { 0x0700, 0xa0dc, 0x0000 },
+  { 0x8700, 0xa0e5, 0x4000 },
+  { 0x8700, 0xa0e1, 0x3000 },
+  { 0x8700, 0xa0df, 0x2000 },
+  { 0x0700, 0xa0de, 0x0000 },
+  { 0x0700, 0xa0e0, 0x0000 },
+  { 0x8700, 0xa0e3, 0x2000 },
+  { 0x0700, 0xa0e2, 0x0000 },
+  { 0x0700, 0xa0e4, 0x0000 },
+  { 0x8700, 0xa0e9, 0x3000 },
+  { 0x8700, 0xa0e7, 0x2000 },
+  { 0x0700, 0xa0e6, 0x0000 },
+  { 0x0700, 0xa0e8, 0x0000 },
+  { 0x8700, 0xa0eb, 0x2000 },
+  { 0x0700, 0xa0ea, 0x0000 },
+  { 0x0700, 0xa0ec, 0x0000 },
+  { 0x8700, 0xa0fd, 0x5000 },
+  { 0x8700, 0xa0f5, 0x4000 },
+  { 0x8700, 0xa0f1, 0x3000 },
+  { 0x8700, 0xa0ef, 0x2000 },
+  { 0x0700, 0xa0ee, 0x0000 },
+  { 0x0700, 0xa0f0, 0x0000 },
+  { 0x8700, 0xa0f3, 0x2000 },
+  { 0x0700, 0xa0f2, 0x0000 },
+  { 0x0700, 0xa0f4, 0x0000 },
+  { 0x8700, 0xa0f9, 0x3000 },
+  { 0x8700, 0xa0f7, 0x2000 },
+  { 0x0700, 0xa0f6, 0x0000 },
+  { 0x0700, 0xa0f8, 0x0000 },
+  { 0x8700, 0xa0fb, 0x2000 },
+  { 0x0700, 0xa0fa, 0x0000 },
+  { 0x0700, 0xa0fc, 0x0000 },
+  { 0x8700, 0xa105, 0x4000 },
+  { 0x8700, 0xa101, 0x3000 },
+  { 0x8700, 0xa0ff, 0x2000 },
+  { 0x0700, 0xa0fe, 0x0000 },
+  { 0x0700, 0xa100, 0x0000 },
+  { 0x8700, 0xa103, 0x2000 },
+  { 0x0700, 0xa102, 0x0000 },
+  { 0x0700, 0xa104, 0x0000 },
+  { 0x8700, 0xa109, 0x3000 },
+  { 0x8700, 0xa107, 0x2000 },
+  { 0x0700, 0xa106, 0x0000 },
+  { 0x0700, 0xa108, 0x0000 },
+  { 0x8700, 0xa10b, 0x2000 },
+  { 0x0700, 0xa10a, 0x0000 },
+  { 0x0700, 0xa10c, 0x0000 },
+  { 0x8700, 0xa12d, 0x6000 },
+  { 0x8700, 0xa11d, 0x5000 },
+  { 0x8700, 0xa115, 0x4000 },
+  { 0x8700, 0xa111, 0x3000 },
+  { 0x8700, 0xa10f, 0x2000 },
+  { 0x0700, 0xa10e, 0x0000 },
+  { 0x0700, 0xa110, 0x0000 },
+  { 0x8700, 0xa113, 0x2000 },
+  { 0x0700, 0xa112, 0x0000 },
+  { 0x0700, 0xa114, 0x0000 },
+  { 0x8700, 0xa119, 0x3000 },
+  { 0x8700, 0xa117, 0x2000 },
+  { 0x0700, 0xa116, 0x0000 },
+  { 0x0700, 0xa118, 0x0000 },
+  { 0x8700, 0xa11b, 0x2000 },
+  { 0x0700, 0xa11a, 0x0000 },
+  { 0x0700, 0xa11c, 0x0000 },
+  { 0x8700, 0xa125, 0x4000 },
+  { 0x8700, 0xa121, 0x3000 },
+  { 0x8700, 0xa11f, 0x2000 },
+  { 0x0700, 0xa11e, 0x0000 },
+  { 0x0700, 0xa120, 0x0000 },
+  { 0x8700, 0xa123, 0x2000 },
+  { 0x0700, 0xa122, 0x0000 },
+  { 0x0700, 0xa124, 0x0000 },
+  { 0x8700, 0xa129, 0x3000 },
+  { 0x8700, 0xa127, 0x2000 },
+  { 0x0700, 0xa126, 0x0000 },
+  { 0x0700, 0xa128, 0x0000 },
+  { 0x8700, 0xa12b, 0x2000 },
+  { 0x0700, 0xa12a, 0x0000 },
+  { 0x0700, 0xa12c, 0x0000 },
+  { 0x8700, 0xa13d, 0x5000 },
+  { 0x8700, 0xa135, 0x4000 },
+  { 0x8700, 0xa131, 0x3000 },
+  { 0x8700, 0xa12f, 0x2000 },
+  { 0x0700, 0xa12e, 0x0000 },
+  { 0x0700, 0xa130, 0x0000 },
+  { 0x8700, 0xa133, 0x2000 },
+  { 0x0700, 0xa132, 0x0000 },
+  { 0x0700, 0xa134, 0x0000 },
+  { 0x8700, 0xa139, 0x3000 },
+  { 0x8700, 0xa137, 0x2000 },
+  { 0x0700, 0xa136, 0x0000 },
+  { 0x0700, 0xa138, 0x0000 },
+  { 0x8700, 0xa13b, 0x2000 },
+  { 0x0700, 0xa13a, 0x0000 },
+  { 0x0700, 0xa13c, 0x0000 },
+  { 0x8700, 0xa145, 0x4000 },
+  { 0x8700, 0xa141, 0x3000 },
+  { 0x8700, 0xa13f, 0x2000 },
+  { 0x0700, 0xa13e, 0x0000 },
+  { 0x0700, 0xa140, 0x0000 },
+  { 0x8700, 0xa143, 0x2000 },
+  { 0x0700, 0xa142, 0x0000 },
+  { 0x0700, 0xa144, 0x0000 },
+  { 0x8700, 0xa149, 0x3000 },
+  { 0x8700, 0xa147, 0x2000 },
+  { 0x0700, 0xa146, 0x0000 },
+  { 0x0700, 0xa148, 0x0000 },
+  { 0x8700, 0xa14b, 0x2000 },
+  { 0x0700, 0xa14a, 0x0000 },
+  { 0x0700, 0xa14c, 0x0000 },
+  { 0x8700, 0xa24d, 0x9000 },
+  { 0x8700, 0xa1cd, 0x8000 },
+  { 0x8700, 0xa18d, 0x7000 },
+  { 0x8700, 0xa16d, 0x6000 },
+  { 0x8700, 0xa15d, 0x5000 },
+  { 0x8700, 0xa155, 0x4000 },
+  { 0x8700, 0xa151, 0x3000 },
+  { 0x8700, 0xa14f, 0x2000 },
+  { 0x0700, 0xa14e, 0x0000 },
+  { 0x0700, 0xa150, 0x0000 },
+  { 0x8700, 0xa153, 0x2000 },
+  { 0x0700, 0xa152, 0x0000 },
+  { 0x0700, 0xa154, 0x0000 },
+  { 0x8700, 0xa159, 0x3000 },
+  { 0x8700, 0xa157, 0x2000 },
+  { 0x0700, 0xa156, 0x0000 },
+  { 0x0700, 0xa158, 0x0000 },
+  { 0x8700, 0xa15b, 0x2000 },
+  { 0x0700, 0xa15a, 0x0000 },
+  { 0x0700, 0xa15c, 0x0000 },
+  { 0x8700, 0xa165, 0x4000 },
+  { 0x8700, 0xa161, 0x3000 },
+  { 0x8700, 0xa15f, 0x2000 },
+  { 0x0700, 0xa15e, 0x0000 },
+  { 0x0700, 0xa160, 0x0000 },
+  { 0x8700, 0xa163, 0x2000 },
+  { 0x0700, 0xa162, 0x0000 },
+  { 0x0700, 0xa164, 0x0000 },
+  { 0x8700, 0xa169, 0x3000 },
+  { 0x8700, 0xa167, 0x2000 },
+  { 0x0700, 0xa166, 0x0000 },
+  { 0x0700, 0xa168, 0x0000 },
+  { 0x8700, 0xa16b, 0x2000 },
+  { 0x0700, 0xa16a, 0x0000 },
+  { 0x0700, 0xa16c, 0x0000 },
+  { 0x8700, 0xa17d, 0x5000 },
+  { 0x8700, 0xa175, 0x4000 },
+  { 0x8700, 0xa171, 0x3000 },
+  { 0x8700, 0xa16f, 0x2000 },
+  { 0x0700, 0xa16e, 0x0000 },
+  { 0x0700, 0xa170, 0x0000 },
+  { 0x8700, 0xa173, 0x2000 },
+  { 0x0700, 0xa172, 0x0000 },
+  { 0x0700, 0xa174, 0x0000 },
+  { 0x8700, 0xa179, 0x3000 },
+  { 0x8700, 0xa177, 0x2000 },
+  { 0x0700, 0xa176, 0x0000 },
+  { 0x0700, 0xa178, 0x0000 },
+  { 0x8700, 0xa17b, 0x2000 },
+  { 0x0700, 0xa17a, 0x0000 },
+  { 0x0700, 0xa17c, 0x0000 },
+  { 0x8700, 0xa185, 0x4000 },
+  { 0x8700, 0xa181, 0x3000 },
+  { 0x8700, 0xa17f, 0x2000 },
+  { 0x0700, 0xa17e, 0x0000 },
+  { 0x0700, 0xa180, 0x0000 },
+  { 0x8700, 0xa183, 0x2000 },
+  { 0x0700, 0xa182, 0x0000 },
+  { 0x0700, 0xa184, 0x0000 },
+  { 0x8700, 0xa189, 0x3000 },
+  { 0x8700, 0xa187, 0x2000 },
+  { 0x0700, 0xa186, 0x0000 },
+  { 0x0700, 0xa188, 0x0000 },
+  { 0x8700, 0xa18b, 0x2000 },
+  { 0x0700, 0xa18a, 0x0000 },
+  { 0x0700, 0xa18c, 0x0000 },
+  { 0x8700, 0xa1ad, 0x6000 },
+  { 0x8700, 0xa19d, 0x5000 },
+  { 0x8700, 0xa195, 0x4000 },
+  { 0x8700, 0xa191, 0x3000 },
+  { 0x8700, 0xa18f, 0x2000 },
+  { 0x0700, 0xa18e, 0x0000 },
+  { 0x0700, 0xa190, 0x0000 },
+  { 0x8700, 0xa193, 0x2000 },
+  { 0x0700, 0xa192, 0x0000 },
+  { 0x0700, 0xa194, 0x0000 },
+  { 0x8700, 0xa199, 0x3000 },
+  { 0x8700, 0xa197, 0x2000 },
+  { 0x0700, 0xa196, 0x0000 },
+  { 0x0700, 0xa198, 0x0000 },
+  { 0x8700, 0xa19b, 0x2000 },
+  { 0x0700, 0xa19a, 0x0000 },
+  { 0x0700, 0xa19c, 0x0000 },
+  { 0x8700, 0xa1a5, 0x4000 },
+  { 0x8700, 0xa1a1, 0x3000 },
+  { 0x8700, 0xa19f, 0x2000 },
+  { 0x0700, 0xa19e, 0x0000 },
+  { 0x0700, 0xa1a0, 0x0000 },
+  { 0x8700, 0xa1a3, 0x2000 },
+  { 0x0700, 0xa1a2, 0x0000 },
+  { 0x0700, 0xa1a4, 0x0000 },
+  { 0x8700, 0xa1a9, 0x3000 },
+  { 0x8700, 0xa1a7, 0x2000 },
+  { 0x0700, 0xa1a6, 0x0000 },
+  { 0x0700, 0xa1a8, 0x0000 },
+  { 0x8700, 0xa1ab, 0x2000 },
+  { 0x0700, 0xa1aa, 0x0000 },
+  { 0x0700, 0xa1ac, 0x0000 },
+  { 0x8700, 0xa1bd, 0x5000 },
+  { 0x8700, 0xa1b5, 0x4000 },
+  { 0x8700, 0xa1b1, 0x3000 },
+  { 0x8700, 0xa1af, 0x2000 },
+  { 0x0700, 0xa1ae, 0x0000 },
+  { 0x0700, 0xa1b0, 0x0000 },
+  { 0x8700, 0xa1b3, 0x2000 },
+  { 0x0700, 0xa1b2, 0x0000 },
+  { 0x0700, 0xa1b4, 0x0000 },
+  { 0x8700, 0xa1b9, 0x3000 },
+  { 0x8700, 0xa1b7, 0x2000 },
+  { 0x0700, 0xa1b6, 0x0000 },
+  { 0x0700, 0xa1b8, 0x0000 },
+  { 0x8700, 0xa1bb, 0x2000 },
+  { 0x0700, 0xa1ba, 0x0000 },
+  { 0x0700, 0xa1bc, 0x0000 },
+  { 0x8700, 0xa1c5, 0x4000 },
+  { 0x8700, 0xa1c1, 0x3000 },
+  { 0x8700, 0xa1bf, 0x2000 },
+  { 0x0700, 0xa1be, 0x0000 },
+  { 0x0700, 0xa1c0, 0x0000 },
+  { 0x8700, 0xa1c3, 0x2000 },
+  { 0x0700, 0xa1c2, 0x0000 },
+  { 0x0700, 0xa1c4, 0x0000 },
+  { 0x8700, 0xa1c9, 0x3000 },
+  { 0x8700, 0xa1c7, 0x2000 },
+  { 0x0700, 0xa1c6, 0x0000 },
+  { 0x0700, 0xa1c8, 0x0000 },
+  { 0x8700, 0xa1cb, 0x2000 },
+  { 0x0700, 0xa1ca, 0x0000 },
+  { 0x0700, 0xa1cc, 0x0000 },
+  { 0x8700, 0xa20d, 0x7000 },
+  { 0x8700, 0xa1ed, 0x6000 },
+  { 0x8700, 0xa1dd, 0x5000 },
+  { 0x8700, 0xa1d5, 0x4000 },
+  { 0x8700, 0xa1d1, 0x3000 },
+  { 0x8700, 0xa1cf, 0x2000 },
+  { 0x0700, 0xa1ce, 0x0000 },
+  { 0x0700, 0xa1d0, 0x0000 },
+  { 0x8700, 0xa1d3, 0x2000 },
+  { 0x0700, 0xa1d2, 0x0000 },
+  { 0x0700, 0xa1d4, 0x0000 },
+  { 0x8700, 0xa1d9, 0x3000 },
+  { 0x8700, 0xa1d7, 0x2000 },
+  { 0x0700, 0xa1d6, 0x0000 },
+  { 0x0700, 0xa1d8, 0x0000 },
+  { 0x8700, 0xa1db, 0x2000 },
+  { 0x0700, 0xa1da, 0x0000 },
+  { 0x0700, 0xa1dc, 0x0000 },
+  { 0x8700, 0xa1e5, 0x4000 },
+  { 0x8700, 0xa1e1, 0x3000 },
+  { 0x8700, 0xa1df, 0x2000 },
+  { 0x0700, 0xa1de, 0x0000 },
+  { 0x0700, 0xa1e0, 0x0000 },
+  { 0x8700, 0xa1e3, 0x2000 },
+  { 0x0700, 0xa1e2, 0x0000 },
+  { 0x0700, 0xa1e4, 0x0000 },
+  { 0x8700, 0xa1e9, 0x3000 },
+  { 0x8700, 0xa1e7, 0x2000 },
+  { 0x0700, 0xa1e6, 0x0000 },
+  { 0x0700, 0xa1e8, 0x0000 },
+  { 0x8700, 0xa1eb, 0x2000 },
+  { 0x0700, 0xa1ea, 0x0000 },
+  { 0x0700, 0xa1ec, 0x0000 },
+  { 0x8700, 0xa1fd, 0x5000 },
+  { 0x8700, 0xa1f5, 0x4000 },
+  { 0x8700, 0xa1f1, 0x3000 },
+  { 0x8700, 0xa1ef, 0x2000 },
+  { 0x0700, 0xa1ee, 0x0000 },
+  { 0x0700, 0xa1f0, 0x0000 },
+  { 0x8700, 0xa1f3, 0x2000 },
+  { 0x0700, 0xa1f2, 0x0000 },
+  { 0x0700, 0xa1f4, 0x0000 },
+  { 0x8700, 0xa1f9, 0x3000 },
+  { 0x8700, 0xa1f7, 0x2000 },
+  { 0x0700, 0xa1f6, 0x0000 },
+  { 0x0700, 0xa1f8, 0x0000 },
+  { 0x8700, 0xa1fb, 0x2000 },
+  { 0x0700, 0xa1fa, 0x0000 },
+  { 0x0700, 0xa1fc, 0x0000 },
+  { 0x8700, 0xa205, 0x4000 },
+  { 0x8700, 0xa201, 0x3000 },
+  { 0x8700, 0xa1ff, 0x2000 },
+  { 0x0700, 0xa1fe, 0x0000 },
+  { 0x0700, 0xa200, 0x0000 },
+  { 0x8700, 0xa203, 0x2000 },
+  { 0x0700, 0xa202, 0x0000 },
+  { 0x0700, 0xa204, 0x0000 },
+  { 0x8700, 0xa209, 0x3000 },
+  { 0x8700, 0xa207, 0x2000 },
+  { 0x0700, 0xa206, 0x0000 },
+  { 0x0700, 0xa208, 0x0000 },
+  { 0x8700, 0xa20b, 0x2000 },
+  { 0x0700, 0xa20a, 0x0000 },
+  { 0x0700, 0xa20c, 0x0000 },
+  { 0x8700, 0xa22d, 0x6000 },
+  { 0x8700, 0xa21d, 0x5000 },
+  { 0x8700, 0xa215, 0x4000 },
+  { 0x8700, 0xa211, 0x3000 },
+  { 0x8700, 0xa20f, 0x2000 },
+  { 0x0700, 0xa20e, 0x0000 },
+  { 0x0700, 0xa210, 0x0000 },
+  { 0x8700, 0xa213, 0x2000 },
+  { 0x0700, 0xa212, 0x0000 },
+  { 0x0700, 0xa214, 0x0000 },
+  { 0x8700, 0xa219, 0x3000 },
+  { 0x8700, 0xa217, 0x2000 },
+  { 0x0700, 0xa216, 0x0000 },
+  { 0x0700, 0xa218, 0x0000 },
+  { 0x8700, 0xa21b, 0x2000 },
+  { 0x0700, 0xa21a, 0x0000 },
+  { 0x0700, 0xa21c, 0x0000 },
+  { 0x8700, 0xa225, 0x4000 },
+  { 0x8700, 0xa221, 0x3000 },
+  { 0x8700, 0xa21f, 0x2000 },
+  { 0x0700, 0xa21e, 0x0000 },
+  { 0x0700, 0xa220, 0x0000 },
+  { 0x8700, 0xa223, 0x2000 },
+  { 0x0700, 0xa222, 0x0000 },
+  { 0x0700, 0xa224, 0x0000 },
+  { 0x8700, 0xa229, 0x3000 },
+  { 0x8700, 0xa227, 0x2000 },
+  { 0x0700, 0xa226, 0x0000 },
+  { 0x0700, 0xa228, 0x0000 },
+  { 0x8700, 0xa22b, 0x2000 },
+  { 0x0700, 0xa22a, 0x0000 },
+  { 0x0700, 0xa22c, 0x0000 },
+  { 0x8700, 0xa23d, 0x5000 },
+  { 0x8700, 0xa235, 0x4000 },
+  { 0x8700, 0xa231, 0x3000 },
+  { 0x8700, 0xa22f, 0x2000 },
+  { 0x0700, 0xa22e, 0x0000 },
+  { 0x0700, 0xa230, 0x0000 },
+  { 0x8700, 0xa233, 0x2000 },
+  { 0x0700, 0xa232, 0x0000 },
+  { 0x0700, 0xa234, 0x0000 },
+  { 0x8700, 0xa239, 0x3000 },
+  { 0x8700, 0xa237, 0x2000 },
+  { 0x0700, 0xa236, 0x0000 },
+  { 0x0700, 0xa238, 0x0000 },
+  { 0x8700, 0xa23b, 0x2000 },
+  { 0x0700, 0xa23a, 0x0000 },
+  { 0x0700, 0xa23c, 0x0000 },
+  { 0x8700, 0xa245, 0x4000 },
+  { 0x8700, 0xa241, 0x3000 },
+  { 0x8700, 0xa23f, 0x2000 },
+  { 0x0700, 0xa23e, 0x0000 },
+  { 0x0700, 0xa240, 0x0000 },
+  { 0x8700, 0xa243, 0x2000 },
+  { 0x0700, 0xa242, 0x0000 },
+  { 0x0700, 0xa244, 0x0000 },
+  { 0x8700, 0xa249, 0x3000 },
+  { 0x8700, 0xa247, 0x2000 },
+  { 0x0700, 0xa246, 0x0000 },
+  { 0x0700, 0xa248, 0x0000 },
+  { 0x8700, 0xa24b, 0x2000 },
+  { 0x0700, 0xa24a, 0x0000 },
+  { 0x0700, 0xa24c, 0x0000 },
+  { 0x8700, 0xa2cd, 0x8000 },
+  { 0x8700, 0xa28d, 0x7000 },
+  { 0x8700, 0xa26d, 0x6000 },
+  { 0x8700, 0xa25d, 0x5000 },
+  { 0x8700, 0xa255, 0x4000 },
+  { 0x8700, 0xa251, 0x3000 },
+  { 0x8700, 0xa24f, 0x2000 },
+  { 0x0700, 0xa24e, 0x0000 },
+  { 0x0700, 0xa250, 0x0000 },
+  { 0x8700, 0xa253, 0x2000 },
+  { 0x0700, 0xa252, 0x0000 },
+  { 0x0700, 0xa254, 0x0000 },
+  { 0x8700, 0xa259, 0x3000 },
+  { 0x8700, 0xa257, 0x2000 },
+  { 0x0700, 0xa256, 0x0000 },
+  { 0x0700, 0xa258, 0x0000 },
+  { 0x8700, 0xa25b, 0x2000 },
+  { 0x0700, 0xa25a, 0x0000 },
+  { 0x0700, 0xa25c, 0x0000 },
+  { 0x8700, 0xa265, 0x4000 },
+  { 0x8700, 0xa261, 0x3000 },
+  { 0x8700, 0xa25f, 0x2000 },
+  { 0x0700, 0xa25e, 0x0000 },
+  { 0x0700, 0xa260, 0x0000 },
+  { 0x8700, 0xa263, 0x2000 },
+  { 0x0700, 0xa262, 0x0000 },
+  { 0x0700, 0xa264, 0x0000 },
+  { 0x8700, 0xa269, 0x3000 },
+  { 0x8700, 0xa267, 0x2000 },
+  { 0x0700, 0xa266, 0x0000 },
+  { 0x0700, 0xa268, 0x0000 },
+  { 0x8700, 0xa26b, 0x2000 },
+  { 0x0700, 0xa26a, 0x0000 },
+  { 0x0700, 0xa26c, 0x0000 },
+  { 0x8700, 0xa27d, 0x5000 },
+  { 0x8700, 0xa275, 0x4000 },
+  { 0x8700, 0xa271, 0x3000 },
+  { 0x8700, 0xa26f, 0x2000 },
+  { 0x0700, 0xa26e, 0x0000 },
+  { 0x0700, 0xa270, 0x0000 },
+  { 0x8700, 0xa273, 0x2000 },
+  { 0x0700, 0xa272, 0x0000 },
+  { 0x0700, 0xa274, 0x0000 },
+  { 0x8700, 0xa279, 0x3000 },
+  { 0x8700, 0xa277, 0x2000 },
+  { 0x0700, 0xa276, 0x0000 },
+  { 0x0700, 0xa278, 0x0000 },
+  { 0x8700, 0xa27b, 0x2000 },
+  { 0x0700, 0xa27a, 0x0000 },
+  { 0x0700, 0xa27c, 0x0000 },
+  { 0x8700, 0xa285, 0x4000 },
+  { 0x8700, 0xa281, 0x3000 },
+  { 0x8700, 0xa27f, 0x2000 },
+  { 0x0700, 0xa27e, 0x0000 },
+  { 0x0700, 0xa280, 0x0000 },
+  { 0x8700, 0xa283, 0x2000 },
+  { 0x0700, 0xa282, 0x0000 },
+  { 0x0700, 0xa284, 0x0000 },
+  { 0x8700, 0xa289, 0x3000 },
+  { 0x8700, 0xa287, 0x2000 },
+  { 0x0700, 0xa286, 0x0000 },
+  { 0x0700, 0xa288, 0x0000 },
+  { 0x8700, 0xa28b, 0x2000 },
+  { 0x0700, 0xa28a, 0x0000 },
+  { 0x0700, 0xa28c, 0x0000 },
+  { 0x8700, 0xa2ad, 0x6000 },
+  { 0x8700, 0xa29d, 0x5000 },
+  { 0x8700, 0xa295, 0x4000 },
+  { 0x8700, 0xa291, 0x3000 },
+  { 0x8700, 0xa28f, 0x2000 },
+  { 0x0700, 0xa28e, 0x0000 },
+  { 0x0700, 0xa290, 0x0000 },
+  { 0x8700, 0xa293, 0x2000 },
+  { 0x0700, 0xa292, 0x0000 },
+  { 0x0700, 0xa294, 0x0000 },
+  { 0x8700, 0xa299, 0x3000 },
+  { 0x8700, 0xa297, 0x2000 },
+  { 0x0700, 0xa296, 0x0000 },
+  { 0x0700, 0xa298, 0x0000 },
+  { 0x8700, 0xa29b, 0x2000 },
+  { 0x0700, 0xa29a, 0x0000 },
+  { 0x0700, 0xa29c, 0x0000 },
+  { 0x8700, 0xa2a5, 0x4000 },
+  { 0x8700, 0xa2a1, 0x3000 },
+  { 0x8700, 0xa29f, 0x2000 },
+  { 0x0700, 0xa29e, 0x0000 },
+  { 0x0700, 0xa2a0, 0x0000 },
+  { 0x8700, 0xa2a3, 0x2000 },
+  { 0x0700, 0xa2a2, 0x0000 },
+  { 0x0700, 0xa2a4, 0x0000 },
+  { 0x8700, 0xa2a9, 0x3000 },
+  { 0x8700, 0xa2a7, 0x2000 },
+  { 0x0700, 0xa2a6, 0x0000 },
+  { 0x0700, 0xa2a8, 0x0000 },
+  { 0x8700, 0xa2ab, 0x2000 },
+  { 0x0700, 0xa2aa, 0x0000 },
+  { 0x0700, 0xa2ac, 0x0000 },
+  { 0x8700, 0xa2bd, 0x5000 },
+  { 0x8700, 0xa2b5, 0x4000 },
+  { 0x8700, 0xa2b1, 0x3000 },
+  { 0x8700, 0xa2af, 0x2000 },
+  { 0x0700, 0xa2ae, 0x0000 },
+  { 0x0700, 0xa2b0, 0x0000 },
+  { 0x8700, 0xa2b3, 0x2000 },
+  { 0x0700, 0xa2b2, 0x0000 },
+  { 0x0700, 0xa2b4, 0x0000 },
+  { 0x8700, 0xa2b9, 0x3000 },
+  { 0x8700, 0xa2b7, 0x2000 },
+  { 0x0700, 0xa2b6, 0x0000 },
+  { 0x0700, 0xa2b8, 0x0000 },
+  { 0x8700, 0xa2bb, 0x2000 },
+  { 0x0700, 0xa2ba, 0x0000 },
+  { 0x0700, 0xa2bc, 0x0000 },
+  { 0x8700, 0xa2c5, 0x4000 },
+  { 0x8700, 0xa2c1, 0x3000 },
+  { 0x8700, 0xa2bf, 0x2000 },
+  { 0x0700, 0xa2be, 0x0000 },
+  { 0x0700, 0xa2c0, 0x0000 },
+  { 0x8700, 0xa2c3, 0x2000 },
+  { 0x0700, 0xa2c2, 0x0000 },
+  { 0x0700, 0xa2c4, 0x0000 },
+  { 0x8700, 0xa2c9, 0x3000 },
+  { 0x8700, 0xa2c7, 0x2000 },
+  { 0x0700, 0xa2c6, 0x0000 },
+  { 0x0700, 0xa2c8, 0x0000 },
+  { 0x8700, 0xa2cb, 0x2000 },
+  { 0x0700, 0xa2ca, 0x0000 },
+  { 0x0700, 0xa2cc, 0x0000 },
+  { 0x8700, 0xa30d, 0x7000 },
+  { 0x8700, 0xa2ed, 0x6000 },
+  { 0x8700, 0xa2dd, 0x5000 },
+  { 0x8700, 0xa2d5, 0x4000 },
+  { 0x8700, 0xa2d1, 0x3000 },
+  { 0x8700, 0xa2cf, 0x2000 },
+  { 0x0700, 0xa2ce, 0x0000 },
+  { 0x0700, 0xa2d0, 0x0000 },
+  { 0x8700, 0xa2d3, 0x2000 },
+  { 0x0700, 0xa2d2, 0x0000 },
+  { 0x0700, 0xa2d4, 0x0000 },
+  { 0x8700, 0xa2d9, 0x3000 },
+  { 0x8700, 0xa2d7, 0x2000 },
+  { 0x0700, 0xa2d6, 0x0000 },
+  { 0x0700, 0xa2d8, 0x0000 },
+  { 0x8700, 0xa2db, 0x2000 },
+  { 0x0700, 0xa2da, 0x0000 },
+  { 0x0700, 0xa2dc, 0x0000 },
+  { 0x8700, 0xa2e5, 0x4000 },
+  { 0x8700, 0xa2e1, 0x3000 },
+  { 0x8700, 0xa2df, 0x2000 },
+  { 0x0700, 0xa2de, 0x0000 },
+  { 0x0700, 0xa2e0, 0x0000 },
+  { 0x8700, 0xa2e3, 0x2000 },
+  { 0x0700, 0xa2e2, 0x0000 },
+  { 0x0700, 0xa2e4, 0x0000 },
+  { 0x8700, 0xa2e9, 0x3000 },
+  { 0x8700, 0xa2e7, 0x2000 },
+  { 0x0700, 0xa2e6, 0x0000 },
+  { 0x0700, 0xa2e8, 0x0000 },
+  { 0x8700, 0xa2eb, 0x2000 },
+  { 0x0700, 0xa2ea, 0x0000 },
+  { 0x0700, 0xa2ec, 0x0000 },
+  { 0x8700, 0xa2fd, 0x5000 },
+  { 0x8700, 0xa2f5, 0x4000 },
+  { 0x8700, 0xa2f1, 0x3000 },
+  { 0x8700, 0xa2ef, 0x2000 },
+  { 0x0700, 0xa2ee, 0x0000 },
+  { 0x0700, 0xa2f0, 0x0000 },
+  { 0x8700, 0xa2f3, 0x2000 },
+  { 0x0700, 0xa2f2, 0x0000 },
+  { 0x0700, 0xa2f4, 0x0000 },
+  { 0x8700, 0xa2f9, 0x3000 },
+  { 0x8700, 0xa2f7, 0x2000 },
+  { 0x0700, 0xa2f6, 0x0000 },
+  { 0x0700, 0xa2f8, 0x0000 },
+  { 0x8700, 0xa2fb, 0x2000 },
+  { 0x0700, 0xa2fa, 0x0000 },
+  { 0x0700, 0xa2fc, 0x0000 },
+  { 0x8700, 0xa305, 0x4000 },
+  { 0x8700, 0xa301, 0x3000 },
+  { 0x8700, 0xa2ff, 0x2000 },
+  { 0x0700, 0xa2fe, 0x0000 },
+  { 0x0700, 0xa300, 0x0000 },
+  { 0x8700, 0xa303, 0x2000 },
+  { 0x0700, 0xa302, 0x0000 },
+  { 0x0700, 0xa304, 0x0000 },
+  { 0x8700, 0xa309, 0x3000 },
+  { 0x8700, 0xa307, 0x2000 },
+  { 0x0700, 0xa306, 0x0000 },
+  { 0x0700, 0xa308, 0x0000 },
+  { 0x8700, 0xa30b, 0x2000 },
+  { 0x0700, 0xa30a, 0x0000 },
+  { 0x0700, 0xa30c, 0x0000 },
+  { 0x8700, 0xa32d, 0x6000 },
+  { 0x8700, 0xa31d, 0x5000 },
+  { 0x8700, 0xa315, 0x4000 },
+  { 0x8700, 0xa311, 0x3000 },
+  { 0x8700, 0xa30f, 0x2000 },
+  { 0x0700, 0xa30e, 0x0000 },
+  { 0x0700, 0xa310, 0x0000 },
+  { 0x8700, 0xa313, 0x2000 },
+  { 0x0700, 0xa312, 0x0000 },
+  { 0x0700, 0xa314, 0x0000 },
+  { 0x8700, 0xa319, 0x3000 },
+  { 0x8700, 0xa317, 0x2000 },
+  { 0x0700, 0xa316, 0x0000 },
+  { 0x0700, 0xa318, 0x0000 },
+  { 0x8700, 0xa31b, 0x2000 },
+  { 0x0700, 0xa31a, 0x0000 },
+  { 0x0700, 0xa31c, 0x0000 },
+  { 0x8700, 0xa325, 0x4000 },
+  { 0x8700, 0xa321, 0x3000 },
+  { 0x8700, 0xa31f, 0x2000 },
+  { 0x0700, 0xa31e, 0x0000 },
+  { 0x0700, 0xa320, 0x0000 },
+  { 0x8700, 0xa323, 0x2000 },
+  { 0x0700, 0xa322, 0x0000 },
+  { 0x0700, 0xa324, 0x0000 },
+  { 0x8700, 0xa329, 0x3000 },
+  { 0x8700, 0xa327, 0x2000 },
+  { 0x0700, 0xa326, 0x0000 },
+  { 0x0700, 0xa328, 0x0000 },
+  { 0x8700, 0xa32b, 0x2000 },
+  { 0x0700, 0xa32a, 0x0000 },
+  { 0x0700, 0xa32c, 0x0000 },
+  { 0x8700, 0xa33d, 0x5000 },
+  { 0x8700, 0xa335, 0x4000 },
+  { 0x8700, 0xa331, 0x3000 },
+  { 0x8700, 0xa32f, 0x2000 },
+  { 0x0700, 0xa32e, 0x0000 },
+  { 0x0700, 0xa330, 0x0000 },
+  { 0x8700, 0xa333, 0x2000 },
+  { 0x0700, 0xa332, 0x0000 },
+  { 0x0700, 0xa334, 0x0000 },
+  { 0x8700, 0xa339, 0x3000 },
+  { 0x8700, 0xa337, 0x2000 },
+  { 0x0700, 0xa336, 0x0000 },
+  { 0x0700, 0xa338, 0x0000 },
+  { 0x8700, 0xa33b, 0x2000 },
+  { 0x0700, 0xa33a, 0x0000 },
+  { 0x0700, 0xa33c, 0x0000 },
+  { 0x8700, 0xa345, 0x4000 },
+  { 0x8700, 0xa341, 0x3000 },
+  { 0x8700, 0xa33f, 0x2000 },
+  { 0x0700, 0xa33e, 0x0000 },
+  { 0x0700, 0xa340, 0x0000 },
+  { 0x8700, 0xa343, 0x2000 },
+  { 0x0700, 0xa342, 0x0000 },
+  { 0x0700, 0xa344, 0x0000 },
+  { 0x8700, 0xa349, 0x3000 },
+  { 0x8700, 0xa347, 0x2000 },
+  { 0x0700, 0xa346, 0x0000 },
+  { 0x0700, 0xa348, 0x0000 },
+  { 0x8700, 0xa34b, 0x2000 },
+  { 0x0700, 0xa34a, 0x0000 },
+  { 0x0700, 0xa34c, 0x0000 },
+  { 0x8700, 0xfc4d, 0xb000 },
+  { 0x8700, 0xf97f, 0xa000 },
+  { 0x8700, 0xa44d, 0x9000 },
+  { 0x8700, 0xa3cd, 0x8000 },
+  { 0x8700, 0xa38d, 0x7000 },
+  { 0x8700, 0xa36d, 0x6000 },
+  { 0x8700, 0xa35d, 0x5000 },
+  { 0x8700, 0xa355, 0x4000 },
+  { 0x8700, 0xa351, 0x3000 },
+  { 0x8700, 0xa34f, 0x2000 },
+  { 0x0700, 0xa34e, 0x0000 },
+  { 0x0700, 0xa350, 0x0000 },
+  { 0x8700, 0xa353, 0x2000 },
+  { 0x0700, 0xa352, 0x0000 },
+  { 0x0700, 0xa354, 0x0000 },
+  { 0x8700, 0xa359, 0x3000 },
+  { 0x8700, 0xa357, 0x2000 },
+  { 0x0700, 0xa356, 0x0000 },
+  { 0x0700, 0xa358, 0x0000 },
+  { 0x8700, 0xa35b, 0x2000 },
+  { 0x0700, 0xa35a, 0x0000 },
+  { 0x0700, 0xa35c, 0x0000 },
+  { 0x8700, 0xa365, 0x4000 },
+  { 0x8700, 0xa361, 0x3000 },
+  { 0x8700, 0xa35f, 0x2000 },
+  { 0x0700, 0xa35e, 0x0000 },
+  { 0x0700, 0xa360, 0x0000 },
+  { 0x8700, 0xa363, 0x2000 },
+  { 0x0700, 0xa362, 0x0000 },
+  { 0x0700, 0xa364, 0x0000 },
+  { 0x8700, 0xa369, 0x3000 },
+  { 0x8700, 0xa367, 0x2000 },
+  { 0x0700, 0xa366, 0x0000 },
+  { 0x0700, 0xa368, 0x0000 },
+  { 0x8700, 0xa36b, 0x2000 },
+  { 0x0700, 0xa36a, 0x0000 },
+  { 0x0700, 0xa36c, 0x0000 },
+  { 0x8700, 0xa37d, 0x5000 },
+  { 0x8700, 0xa375, 0x4000 },
+  { 0x8700, 0xa371, 0x3000 },
+  { 0x8700, 0xa36f, 0x2000 },
+  { 0x0700, 0xa36e, 0x0000 },
+  { 0x0700, 0xa370, 0x0000 },
+  { 0x8700, 0xa373, 0x2000 },
+  { 0x0700, 0xa372, 0x0000 },
+  { 0x0700, 0xa374, 0x0000 },
+  { 0x8700, 0xa379, 0x3000 },
+  { 0x8700, 0xa377, 0x2000 },
+  { 0x0700, 0xa376, 0x0000 },
+  { 0x0700, 0xa378, 0x0000 },
+  { 0x8700, 0xa37b, 0x2000 },
+  { 0x0700, 0xa37a, 0x0000 },
+  { 0x0700, 0xa37c, 0x0000 },
+  { 0x8700, 0xa385, 0x4000 },
+  { 0x8700, 0xa381, 0x3000 },
+  { 0x8700, 0xa37f, 0x2000 },
+  { 0x0700, 0xa37e, 0x0000 },
+  { 0x0700, 0xa380, 0x0000 },
+  { 0x8700, 0xa383, 0x2000 },
+  { 0x0700, 0xa382, 0x0000 },
+  { 0x0700, 0xa384, 0x0000 },
+  { 0x8700, 0xa389, 0x3000 },
+  { 0x8700, 0xa387, 0x2000 },
+  { 0x0700, 0xa386, 0x0000 },
+  { 0x0700, 0xa388, 0x0000 },
+  { 0x8700, 0xa38b, 0x2000 },
+  { 0x0700, 0xa38a, 0x0000 },
+  { 0x0700, 0xa38c, 0x0000 },
+  { 0x8700, 0xa3ad, 0x6000 },
+  { 0x8700, 0xa39d, 0x5000 },
+  { 0x8700, 0xa395, 0x4000 },
+  { 0x8700, 0xa391, 0x3000 },
+  { 0x8700, 0xa38f, 0x2000 },
+  { 0x0700, 0xa38e, 0x0000 },
+  { 0x0700, 0xa390, 0x0000 },
+  { 0x8700, 0xa393, 0x2000 },
+  { 0x0700, 0xa392, 0x0000 },
+  { 0x0700, 0xa394, 0x0000 },
+  { 0x8700, 0xa399, 0x3000 },
+  { 0x8700, 0xa397, 0x2000 },
+  { 0x0700, 0xa396, 0x0000 },
+  { 0x0700, 0xa398, 0x0000 },
+  { 0x8700, 0xa39b, 0x2000 },
+  { 0x0700, 0xa39a, 0x0000 },
+  { 0x0700, 0xa39c, 0x0000 },
+  { 0x8700, 0xa3a5, 0x4000 },
+  { 0x8700, 0xa3a1, 0x3000 },
+  { 0x8700, 0xa39f, 0x2000 },
+  { 0x0700, 0xa39e, 0x0000 },
+  { 0x0700, 0xa3a0, 0x0000 },
+  { 0x8700, 0xa3a3, 0x2000 },
+  { 0x0700, 0xa3a2, 0x0000 },
+  { 0x0700, 0xa3a4, 0x0000 },
+  { 0x8700, 0xa3a9, 0x3000 },
+  { 0x8700, 0xa3a7, 0x2000 },
+  { 0x0700, 0xa3a6, 0x0000 },
+  { 0x0700, 0xa3a8, 0x0000 },
+  { 0x8700, 0xa3ab, 0x2000 },
+  { 0x0700, 0xa3aa, 0x0000 },
+  { 0x0700, 0xa3ac, 0x0000 },
+  { 0x8700, 0xa3bd, 0x5000 },
+  { 0x8700, 0xa3b5, 0x4000 },
+  { 0x8700, 0xa3b1, 0x3000 },
+  { 0x8700, 0xa3af, 0x2000 },
+  { 0x0700, 0xa3ae, 0x0000 },
+  { 0x0700, 0xa3b0, 0x0000 },
+  { 0x8700, 0xa3b3, 0x2000 },
+  { 0x0700, 0xa3b2, 0x0000 },
+  { 0x0700, 0xa3b4, 0x0000 },
+  { 0x8700, 0xa3b9, 0x3000 },
+  { 0x8700, 0xa3b7, 0x2000 },
+  { 0x0700, 0xa3b6, 0x0000 },
+  { 0x0700, 0xa3b8, 0x0000 },
+  { 0x8700, 0xa3bb, 0x2000 },
+  { 0x0700, 0xa3ba, 0x0000 },
+  { 0x0700, 0xa3bc, 0x0000 },
+  { 0x8700, 0xa3c5, 0x4000 },
+  { 0x8700, 0xa3c1, 0x3000 },
+  { 0x8700, 0xa3bf, 0x2000 },
+  { 0x0700, 0xa3be, 0x0000 },
+  { 0x0700, 0xa3c0, 0x0000 },
+  { 0x8700, 0xa3c3, 0x2000 },
+  { 0x0700, 0xa3c2, 0x0000 },
+  { 0x0700, 0xa3c4, 0x0000 },
+  { 0x8700, 0xa3c9, 0x3000 },
+  { 0x8700, 0xa3c7, 0x2000 },
+  { 0x0700, 0xa3c6, 0x0000 },
+  { 0x0700, 0xa3c8, 0x0000 },
+  { 0x8700, 0xa3cb, 0x2000 },
+  { 0x0700, 0xa3ca, 0x0000 },
+  { 0x0700, 0xa3cc, 0x0000 },
+  { 0x8700, 0xa40d, 0x7000 },
+  { 0x8700, 0xa3ed, 0x6000 },
+  { 0x8700, 0xa3dd, 0x5000 },
+  { 0x8700, 0xa3d5, 0x4000 },
+  { 0x8700, 0xa3d1, 0x3000 },
+  { 0x8700, 0xa3cf, 0x2000 },
+  { 0x0700, 0xa3ce, 0x0000 },
+  { 0x0700, 0xa3d0, 0x0000 },
+  { 0x8700, 0xa3d3, 0x2000 },
+  { 0x0700, 0xa3d2, 0x0000 },
+  { 0x0700, 0xa3d4, 0x0000 },
+  { 0x8700, 0xa3d9, 0x3000 },
+  { 0x8700, 0xa3d7, 0x2000 },
+  { 0x0700, 0xa3d6, 0x0000 },
+  { 0x0700, 0xa3d8, 0x0000 },
+  { 0x8700, 0xa3db, 0x2000 },
+  { 0x0700, 0xa3da, 0x0000 },
+  { 0x0700, 0xa3dc, 0x0000 },
+  { 0x8700, 0xa3e5, 0x4000 },
+  { 0x8700, 0xa3e1, 0x3000 },
+  { 0x8700, 0xa3df, 0x2000 },
+  { 0x0700, 0xa3de, 0x0000 },
+  { 0x0700, 0xa3e0, 0x0000 },
+  { 0x8700, 0xa3e3, 0x2000 },
+  { 0x0700, 0xa3e2, 0x0000 },
+  { 0x0700, 0xa3e4, 0x0000 },
+  { 0x8700, 0xa3e9, 0x3000 },
+  { 0x8700, 0xa3e7, 0x2000 },
+  { 0x0700, 0xa3e6, 0x0000 },
+  { 0x0700, 0xa3e8, 0x0000 },
+  { 0x8700, 0xa3eb, 0x2000 },
+  { 0x0700, 0xa3ea, 0x0000 },
+  { 0x0700, 0xa3ec, 0x0000 },
+  { 0x8700, 0xa3fd, 0x5000 },
+  { 0x8700, 0xa3f5, 0x4000 },
+  { 0x8700, 0xa3f1, 0x3000 },
+  { 0x8700, 0xa3ef, 0x2000 },
+  { 0x0700, 0xa3ee, 0x0000 },
+  { 0x0700, 0xa3f0, 0x0000 },
+  { 0x8700, 0xa3f3, 0x2000 },
+  { 0x0700, 0xa3f2, 0x0000 },
+  { 0x0700, 0xa3f4, 0x0000 },
+  { 0x8700, 0xa3f9, 0x3000 },
+  { 0x8700, 0xa3f7, 0x2000 },
+  { 0x0700, 0xa3f6, 0x0000 },
+  { 0x0700, 0xa3f8, 0x0000 },
+  { 0x8700, 0xa3fb, 0x2000 },
+  { 0x0700, 0xa3fa, 0x0000 },
+  { 0x0700, 0xa3fc, 0x0000 },
+  { 0x8700, 0xa405, 0x4000 },
+  { 0x8700, 0xa401, 0x3000 },
+  { 0x8700, 0xa3ff, 0x2000 },
+  { 0x0700, 0xa3fe, 0x0000 },
+  { 0x0700, 0xa400, 0x0000 },
+  { 0x8700, 0xa403, 0x2000 },
+  { 0x0700, 0xa402, 0x0000 },
+  { 0x0700, 0xa404, 0x0000 },
+  { 0x8700, 0xa409, 0x3000 },
+  { 0x8700, 0xa407, 0x2000 },
+  { 0x0700, 0xa406, 0x0000 },
+  { 0x0700, 0xa408, 0x0000 },
+  { 0x8700, 0xa40b, 0x2000 },
+  { 0x0700, 0xa40a, 0x0000 },
+  { 0x0700, 0xa40c, 0x0000 },
+  { 0x8700, 0xa42d, 0x6000 },
+  { 0x8700, 0xa41d, 0x5000 },
+  { 0x8700, 0xa415, 0x4000 },
+  { 0x8700, 0xa411, 0x3000 },
+  { 0x8700, 0xa40f, 0x2000 },
+  { 0x0700, 0xa40e, 0x0000 },
+  { 0x0700, 0xa410, 0x0000 },
+  { 0x8700, 0xa413, 0x2000 },
+  { 0x0700, 0xa412, 0x0000 },
+  { 0x0700, 0xa414, 0x0000 },
+  { 0x8700, 0xa419, 0x3000 },
+  { 0x8700, 0xa417, 0x2000 },
+  { 0x0700, 0xa416, 0x0000 },
+  { 0x0700, 0xa418, 0x0000 },
+  { 0x8700, 0xa41b, 0x2000 },
+  { 0x0700, 0xa41a, 0x0000 },
+  { 0x0700, 0xa41c, 0x0000 },
+  { 0x8700, 0xa425, 0x4000 },
+  { 0x8700, 0xa421, 0x3000 },
+  { 0x8700, 0xa41f, 0x2000 },
+  { 0x0700, 0xa41e, 0x0000 },
+  { 0x0700, 0xa420, 0x0000 },
+  { 0x8700, 0xa423, 0x2000 },
+  { 0x0700, 0xa422, 0x0000 },
+  { 0x0700, 0xa424, 0x0000 },
+  { 0x8700, 0xa429, 0x3000 },
+  { 0x8700, 0xa427, 0x2000 },
+  { 0x0700, 0xa426, 0x0000 },
+  { 0x0700, 0xa428, 0x0000 },
+  { 0x8700, 0xa42b, 0x2000 },
+  { 0x0700, 0xa42a, 0x0000 },
+  { 0x0700, 0xa42c, 0x0000 },
+  { 0x8700, 0xa43d, 0x5000 },
+  { 0x8700, 0xa435, 0x4000 },
+  { 0x8700, 0xa431, 0x3000 },
+  { 0x8700, 0xa42f, 0x2000 },
+  { 0x0700, 0xa42e, 0x0000 },
+  { 0x0700, 0xa430, 0x0000 },
+  { 0x8700, 0xa433, 0x2000 },
+  { 0x0700, 0xa432, 0x0000 },
+  { 0x0700, 0xa434, 0x0000 },
+  { 0x8700, 0xa439, 0x3000 },
+  { 0x8700, 0xa437, 0x2000 },
+  { 0x0700, 0xa436, 0x0000 },
+  { 0x0700, 0xa438, 0x0000 },
+  { 0x8700, 0xa43b, 0x2000 },
+  { 0x0700, 0xa43a, 0x0000 },
+  { 0x0700, 0xa43c, 0x0000 },
+  { 0x8700, 0xa445, 0x4000 },
+  { 0x8700, 0xa441, 0x3000 },
+  { 0x8700, 0xa43f, 0x2000 },
+  { 0x0700, 0xa43e, 0x0000 },
+  { 0x0700, 0xa440, 0x0000 },
+  { 0x8700, 0xa443, 0x2000 },
+  { 0x0700, 0xa442, 0x0000 },
+  { 0x0700, 0xa444, 0x0000 },
+  { 0x8700, 0xa449, 0x3000 },
+  { 0x8700, 0xa447, 0x2000 },
+  { 0x0700, 0xa446, 0x0000 },
+  { 0x0700, 0xa448, 0x0000 },
+  { 0x8700, 0xa44b, 0x2000 },
+  { 0x0700, 0xa44a, 0x0000 },
+  { 0x0700, 0xa44c, 0x0000 },
+  { 0x8300, 0xf8ff, 0x8000 },
+  { 0x9a00, 0xa490, 0x7000 },
+  { 0x8700, 0xa46d, 0x6000 },
+  { 0x8700, 0xa45d, 0x5000 },
+  { 0x8700, 0xa455, 0x4000 },
+  { 0x8700, 0xa451, 0x3000 },
+  { 0x8700, 0xa44f, 0x2000 },
+  { 0x0700, 0xa44e, 0x0000 },
+  { 0x0700, 0xa450, 0x0000 },
+  { 0x8700, 0xa453, 0x2000 },
+  { 0x0700, 0xa452, 0x0000 },
+  { 0x0700, 0xa454, 0x0000 },
+  { 0x8700, 0xa459, 0x3000 },
+  { 0x8700, 0xa457, 0x2000 },
+  { 0x0700, 0xa456, 0x0000 },
+  { 0x0700, 0xa458, 0x0000 },
+  { 0x8700, 0xa45b, 0x2000 },
+  { 0x0700, 0xa45a, 0x0000 },
+  { 0x0700, 0xa45c, 0x0000 },
+  { 0x8700, 0xa465, 0x4000 },
+  { 0x8700, 0xa461, 0x3000 },
+  { 0x8700, 0xa45f, 0x2000 },
+  { 0x0700, 0xa45e, 0x0000 },
+  { 0x0700, 0xa460, 0x0000 },
+  { 0x8700, 0xa463, 0x2000 },
+  { 0x0700, 0xa462, 0x0000 },
+  { 0x0700, 0xa464, 0x0000 },
+  { 0x8700, 0xa469, 0x3000 },
+  { 0x8700, 0xa467, 0x2000 },
+  { 0x0700, 0xa466, 0x0000 },
+  { 0x0700, 0xa468, 0x0000 },
+  { 0x8700, 0xa46b, 0x2000 },
+  { 0x0700, 0xa46a, 0x0000 },
+  { 0x0700, 0xa46c, 0x0000 },
+  { 0x8700, 0xa47d, 0x5000 },
+  { 0x8700, 0xa475, 0x4000 },
+  { 0x8700, 0xa471, 0x3000 },
+  { 0x8700, 0xa46f, 0x2000 },
+  { 0x0700, 0xa46e, 0x0000 },
+  { 0x0700, 0xa470, 0x0000 },
+  { 0x8700, 0xa473, 0x2000 },
+  { 0x0700, 0xa472, 0x0000 },
+  { 0x0700, 0xa474, 0x0000 },
+  { 0x8700, 0xa479, 0x3000 },
+  { 0x8700, 0xa477, 0x2000 },
+  { 0x0700, 0xa476, 0x0000 },
+  { 0x0700, 0xa478, 0x0000 },
+  { 0x8700, 0xa47b, 0x2000 },
+  { 0x0700, 0xa47a, 0x0000 },
+  { 0x0700, 0xa47c, 0x0000 },
+  { 0x8700, 0xa485, 0x4000 },
+  { 0x8700, 0xa481, 0x3000 },
+  { 0x8700, 0xa47f, 0x2000 },
+  { 0x0700, 0xa47e, 0x0000 },
+  { 0x0700, 0xa480, 0x0000 },
+  { 0x8700, 0xa483, 0x2000 },
+  { 0x0700, 0xa482, 0x0000 },
+  { 0x0700, 0xa484, 0x0000 },
+  { 0x8700, 0xa489, 0x3000 },
+  { 0x8700, 0xa487, 0x2000 },
+  { 0x0700, 0xa486, 0x0000 },
+  { 0x0700, 0xa488, 0x0000 },
+  { 0x8700, 0xa48b, 0x2000 },
+  { 0x0700, 0xa48a, 0x0000 },
+  { 0x0700, 0xa48c, 0x0000 },
+  { 0x9a00, 0xa4b0, 0x6000 },
+  { 0x9a00, 0xa4a0, 0x5000 },
+  { 0x9a00, 0xa498, 0x4000 },
+  { 0x9a00, 0xa494, 0x3000 },
+  { 0x9a00, 0xa492, 0x2000 },
+  { 0x1a00, 0xa491, 0x0000 },
+  { 0x1a00, 0xa493, 0x0000 },
+  { 0x9a00, 0xa496, 0x2000 },
+  { 0x1a00, 0xa495, 0x0000 },
+  { 0x1a00, 0xa497, 0x0000 },
+  { 0x9a00, 0xa49c, 0x3000 },
+  { 0x9a00, 0xa49a, 0x2000 },
+  { 0x1a00, 0xa499, 0x0000 },
+  { 0x1a00, 0xa49b, 0x0000 },
+  { 0x9a00, 0xa49e, 0x2000 },
+  { 0x1a00, 0xa49d, 0x0000 },
+  { 0x1a00, 0xa49f, 0x0000 },
+  { 0x9a00, 0xa4a8, 0x4000 },
+  { 0x9a00, 0xa4a4, 0x3000 },
+  { 0x9a00, 0xa4a2, 0x2000 },
+  { 0x1a00, 0xa4a1, 0x0000 },
+  { 0x1a00, 0xa4a3, 0x0000 },
+  { 0x9a00, 0xa4a6, 0x2000 },
+  { 0x1a00, 0xa4a5, 0x0000 },
+  { 0x1a00, 0xa4a7, 0x0000 },
+  { 0x9a00, 0xa4ac, 0x3000 },
+  { 0x9a00, 0xa4aa, 0x2000 },
+  { 0x1a00, 0xa4a9, 0x0000 },
+  { 0x1a00, 0xa4ab, 0x0000 },
+  { 0x9a00, 0xa4ae, 0x2000 },
+  { 0x1a00, 0xa4ad, 0x0000 },
+  { 0x1a00, 0xa4af, 0x0000 },
+  { 0x9a00, 0xa4c0, 0x5000 },
+  { 0x9a00, 0xa4b8, 0x4000 },
+  { 0x9a00, 0xa4b4, 0x3000 },
+  { 0x9a00, 0xa4b2, 0x2000 },
+  { 0x1a00, 0xa4b1, 0x0000 },
+  { 0x1a00, 0xa4b3, 0x0000 },
+  { 0x9a00, 0xa4b6, 0x2000 },
+  { 0x1a00, 0xa4b5, 0x0000 },
+  { 0x1a00, 0xa4b7, 0x0000 },
+  { 0x9a00, 0xa4bc, 0x3000 },
+  { 0x9a00, 0xa4ba, 0x2000 },
+  { 0x1a00, 0xa4b9, 0x0000 },
+  { 0x1a00, 0xa4bb, 0x0000 },
+  { 0x9a00, 0xa4be, 0x2000 },
+  { 0x1a00, 0xa4bd, 0x0000 },
+  { 0x1a00, 0xa4bf, 0x0000 },
+  { 0x8700, 0xd7a3, 0x4000 },
+  { 0x9a00, 0xa4c4, 0x3000 },
+  { 0x9a00, 0xa4c2, 0x2000 },
+  { 0x1a00, 0xa4c1, 0x0000 },
+  { 0x1a00, 0xa4c3, 0x0000 },
+  { 0x9a00, 0xa4c6, 0x2000 },
+  { 0x1a00, 0xa4c5, 0x0000 },
+  { 0x0700, 0xac00, 0x0000 },
+  { 0x8400, 0xdbff, 0x3000 },
+  { 0x8400, 0xdb7f, 0x2000 },
+  { 0x0400, 0xd800, 0x0000 },
+  { 0x0400, 0xdb80, 0x0000 },
+  { 0x8400, 0xdfff, 0x2000 },
+  { 0x0400, 0xdc00, 0x0000 },
+  { 0x0300, 0xe000, 0x0000 },
+  { 0x8700, 0xf93f, 0x7000 },
+  { 0x8700, 0xf91f, 0x6000 },
+  { 0x8700, 0xf90f, 0x5000 },
+  { 0x8700, 0xf907, 0x4000 },
+  { 0x8700, 0xf903, 0x3000 },
+  { 0x8700, 0xf901, 0x2000 },
+  { 0x0700, 0xf900, 0x0000 },
+  { 0x0700, 0xf902, 0x0000 },
+  { 0x8700, 0xf905, 0x2000 },
+  { 0x0700, 0xf904, 0x0000 },
+  { 0x0700, 0xf906, 0x0000 },
+  { 0x8700, 0xf90b, 0x3000 },
+  { 0x8700, 0xf909, 0x2000 },
+  { 0x0700, 0xf908, 0x0000 },
+  { 0x0700, 0xf90a, 0x0000 },
+  { 0x8700, 0xf90d, 0x2000 },
+  { 0x0700, 0xf90c, 0x0000 },
+  { 0x0700, 0xf90e, 0x0000 },
+  { 0x8700, 0xf917, 0x4000 },
+  { 0x8700, 0xf913, 0x3000 },
+  { 0x8700, 0xf911, 0x2000 },
+  { 0x0700, 0xf910, 0x0000 },
+  { 0x0700, 0xf912, 0x0000 },
+  { 0x8700, 0xf915, 0x2000 },
+  { 0x0700, 0xf914, 0x0000 },
+  { 0x0700, 0xf916, 0x0000 },
+  { 0x8700, 0xf91b, 0x3000 },
+  { 0x8700, 0xf919, 0x2000 },
+  { 0x0700, 0xf918, 0x0000 },
+  { 0x0700, 0xf91a, 0x0000 },
+  { 0x8700, 0xf91d, 0x2000 },
+  { 0x0700, 0xf91c, 0x0000 },
+  { 0x0700, 0xf91e, 0x0000 },
+  { 0x8700, 0xf92f, 0x5000 },
+  { 0x8700, 0xf927, 0x4000 },
+  { 0x8700, 0xf923, 0x3000 },
+  { 0x8700, 0xf921, 0x2000 },
+  { 0x0700, 0xf920, 0x0000 },
+  { 0x0700, 0xf922, 0x0000 },
+  { 0x8700, 0xf925, 0x2000 },
+  { 0x0700, 0xf924, 0x0000 },
+  { 0x0700, 0xf926, 0x0000 },
+  { 0x8700, 0xf92b, 0x3000 },
+  { 0x8700, 0xf929, 0x2000 },
+  { 0x0700, 0xf928, 0x0000 },
+  { 0x0700, 0xf92a, 0x0000 },
+  { 0x8700, 0xf92d, 0x2000 },
+  { 0x0700, 0xf92c, 0x0000 },
+  { 0x0700, 0xf92e, 0x0000 },
+  { 0x8700, 0xf937, 0x4000 },
+  { 0x8700, 0xf933, 0x3000 },
+  { 0x8700, 0xf931, 0x2000 },
+  { 0x0700, 0xf930, 0x0000 },
+  { 0x0700, 0xf932, 0x0000 },
+  { 0x8700, 0xf935, 0x2000 },
+  { 0x0700, 0xf934, 0x0000 },
+  { 0x0700, 0xf936, 0x0000 },
+  { 0x8700, 0xf93b, 0x3000 },
+  { 0x8700, 0xf939, 0x2000 },
+  { 0x0700, 0xf938, 0x0000 },
+  { 0x0700, 0xf93a, 0x0000 },
+  { 0x8700, 0xf93d, 0x2000 },
+  { 0x0700, 0xf93c, 0x0000 },
+  { 0x0700, 0xf93e, 0x0000 },
+  { 0x8700, 0xf95f, 0x6000 },
+  { 0x8700, 0xf94f, 0x5000 },
+  { 0x8700, 0xf947, 0x4000 },
+  { 0x8700, 0xf943, 0x3000 },
+  { 0x8700, 0xf941, 0x2000 },
+  { 0x0700, 0xf940, 0x0000 },
+  { 0x0700, 0xf942, 0x0000 },
+  { 0x8700, 0xf945, 0x2000 },
+  { 0x0700, 0xf944, 0x0000 },
+  { 0x0700, 0xf946, 0x0000 },
+  { 0x8700, 0xf94b, 0x3000 },
+  { 0x8700, 0xf949, 0x2000 },
+  { 0x0700, 0xf948, 0x0000 },
+  { 0x0700, 0xf94a, 0x0000 },
+  { 0x8700, 0xf94d, 0x2000 },
+  { 0x0700, 0xf94c, 0x0000 },
+  { 0x0700, 0xf94e, 0x0000 },
+  { 0x8700, 0xf957, 0x4000 },
+  { 0x8700, 0xf953, 0x3000 },
+  { 0x8700, 0xf951, 0x2000 },
+  { 0x0700, 0xf950, 0x0000 },
+  { 0x0700, 0xf952, 0x0000 },
+  { 0x8700, 0xf955, 0x2000 },
+  { 0x0700, 0xf954, 0x0000 },
+  { 0x0700, 0xf956, 0x0000 },
+  { 0x8700, 0xf95b, 0x3000 },
+  { 0x8700, 0xf959, 0x2000 },
+  { 0x0700, 0xf958, 0x0000 },
+  { 0x0700, 0xf95a, 0x0000 },
+  { 0x8700, 0xf95d, 0x2000 },
+  { 0x0700, 0xf95c, 0x0000 },
+  { 0x0700, 0xf95e, 0x0000 },
+  { 0x8700, 0xf96f, 0x5000 },
+  { 0x8700, 0xf967, 0x4000 },
+  { 0x8700, 0xf963, 0x3000 },
+  { 0x8700, 0xf961, 0x2000 },
+  { 0x0700, 0xf960, 0x0000 },
+  { 0x0700, 0xf962, 0x0000 },
+  { 0x8700, 0xf965, 0x2000 },
+  { 0x0700, 0xf964, 0x0000 },
+  { 0x0700, 0xf966, 0x0000 },
+  { 0x8700, 0xf96b, 0x3000 },
+  { 0x8700, 0xf969, 0x2000 },
+  { 0x0700, 0xf968, 0x0000 },
+  { 0x0700, 0xf96a, 0x0000 },
+  { 0x8700, 0xf96d, 0x2000 },
+  { 0x0700, 0xf96c, 0x0000 },
+  { 0x0700, 0xf96e, 0x0000 },
+  { 0x8700, 0xf977, 0x4000 },
+  { 0x8700, 0xf973, 0x3000 },
+  { 0x8700, 0xf971, 0x2000 },
+  { 0x0700, 0xf970, 0x0000 },
+  { 0x0700, 0xf972, 0x0000 },
+  { 0x8700, 0xf975, 0x2000 },
+  { 0x0700, 0xf974, 0x0000 },
+  { 0x0700, 0xf976, 0x0000 },
+  { 0x8700, 0xf97b, 0x3000 },
+  { 0x8700, 0xf979, 0x2000 },
+  { 0x0700, 0xf978, 0x0000 },
+  { 0x0700, 0xf97a, 0x0000 },
+  { 0x8700, 0xf97d, 0x2000 },
+  { 0x0700, 0xf97c, 0x0000 },
+  { 0x0700, 0xf97e, 0x0000 },
+  { 0x8700, 0xfb27, 0x9000 },
+  { 0x8700, 0xf9ff, 0x8000 },
+  { 0x8700, 0xf9bf, 0x7000 },
+  { 0x8700, 0xf99f, 0x6000 },
+  { 0x8700, 0xf98f, 0x5000 },
+  { 0x8700, 0xf987, 0x4000 },
+  { 0x8700, 0xf983, 0x3000 },
+  { 0x8700, 0xf981, 0x2000 },
+  { 0x0700, 0xf980, 0x0000 },
+  { 0x0700, 0xf982, 0x0000 },
+  { 0x8700, 0xf985, 0x2000 },
+  { 0x0700, 0xf984, 0x0000 },
+  { 0x0700, 0xf986, 0x0000 },
+  { 0x8700, 0xf98b, 0x3000 },
+  { 0x8700, 0xf989, 0x2000 },
+  { 0x0700, 0xf988, 0x0000 },
+  { 0x0700, 0xf98a, 0x0000 },
+  { 0x8700, 0xf98d, 0x2000 },
+  { 0x0700, 0xf98c, 0x0000 },
+  { 0x0700, 0xf98e, 0x0000 },
+  { 0x8700, 0xf997, 0x4000 },
+  { 0x8700, 0xf993, 0x3000 },
+  { 0x8700, 0xf991, 0x2000 },
+  { 0x0700, 0xf990, 0x0000 },
+  { 0x0700, 0xf992, 0x0000 },
+  { 0x8700, 0xf995, 0x2000 },
+  { 0x0700, 0xf994, 0x0000 },
+  { 0x0700, 0xf996, 0x0000 },
+  { 0x8700, 0xf99b, 0x3000 },
+  { 0x8700, 0xf999, 0x2000 },
+  { 0x0700, 0xf998, 0x0000 },
+  { 0x0700, 0xf99a, 0x0000 },
+  { 0x8700, 0xf99d, 0x2000 },
+  { 0x0700, 0xf99c, 0x0000 },
+  { 0x0700, 0xf99e, 0x0000 },
+  { 0x8700, 0xf9af, 0x5000 },
+  { 0x8700, 0xf9a7, 0x4000 },
+  { 0x8700, 0xf9a3, 0x3000 },
+  { 0x8700, 0xf9a1, 0x2000 },
+  { 0x0700, 0xf9a0, 0x0000 },
+  { 0x0700, 0xf9a2, 0x0000 },
+  { 0x8700, 0xf9a5, 0x2000 },
+  { 0x0700, 0xf9a4, 0x0000 },
+  { 0x0700, 0xf9a6, 0x0000 },
+  { 0x8700, 0xf9ab, 0x3000 },
+  { 0x8700, 0xf9a9, 0x2000 },
+  { 0x0700, 0xf9a8, 0x0000 },
+  { 0x0700, 0xf9aa, 0x0000 },
+  { 0x8700, 0xf9ad, 0x2000 },
+  { 0x0700, 0xf9ac, 0x0000 },
+  { 0x0700, 0xf9ae, 0x0000 },
+  { 0x8700, 0xf9b7, 0x4000 },
+  { 0x8700, 0xf9b3, 0x3000 },
+  { 0x8700, 0xf9b1, 0x2000 },
+  { 0x0700, 0xf9b0, 0x0000 },
+  { 0x0700, 0xf9b2, 0x0000 },
+  { 0x8700, 0xf9b5, 0x2000 },
+  { 0x0700, 0xf9b4, 0x0000 },
+  { 0x0700, 0xf9b6, 0x0000 },
+  { 0x8700, 0xf9bb, 0x3000 },
+  { 0x8700, 0xf9b9, 0x2000 },
+  { 0x0700, 0xf9b8, 0x0000 },
+  { 0x0700, 0xf9ba, 0x0000 },
+  { 0x8700, 0xf9bd, 0x2000 },
+  { 0x0700, 0xf9bc, 0x0000 },
+  { 0x0700, 0xf9be, 0x0000 },
+  { 0x8700, 0xf9df, 0x6000 },
+  { 0x8700, 0xf9cf, 0x5000 },
+  { 0x8700, 0xf9c7, 0x4000 },
+  { 0x8700, 0xf9c3, 0x3000 },
+  { 0x8700, 0xf9c1, 0x2000 },
+  { 0x0700, 0xf9c0, 0x0000 },
+  { 0x0700, 0xf9c2, 0x0000 },
+  { 0x8700, 0xf9c5, 0x2000 },
+  { 0x0700, 0xf9c4, 0x0000 },
+  { 0x0700, 0xf9c6, 0x0000 },
+  { 0x8700, 0xf9cb, 0x3000 },
+  { 0x8700, 0xf9c9, 0x2000 },
+  { 0x0700, 0xf9c8, 0x0000 },
+  { 0x0700, 0xf9ca, 0x0000 },
+  { 0x8700, 0xf9cd, 0x2000 },
+  { 0x0700, 0xf9cc, 0x0000 },
+  { 0x0700, 0xf9ce, 0x0000 },
+  { 0x8700, 0xf9d7, 0x4000 },
+  { 0x8700, 0xf9d3, 0x3000 },
+  { 0x8700, 0xf9d1, 0x2000 },
+  { 0x0700, 0xf9d0, 0x0000 },
+  { 0x0700, 0xf9d2, 0x0000 },
+  { 0x8700, 0xf9d5, 0x2000 },
+  { 0x0700, 0xf9d4, 0x0000 },
+  { 0x0700, 0xf9d6, 0x0000 },
+  { 0x8700, 0xf9db, 0x3000 },
+  { 0x8700, 0xf9d9, 0x2000 },
+  { 0x0700, 0xf9d8, 0x0000 },
+  { 0x0700, 0xf9da, 0x0000 },
+  { 0x8700, 0xf9dd, 0x2000 },
+  { 0x0700, 0xf9dc, 0x0000 },
+  { 0x0700, 0xf9de, 0x0000 },
+  { 0x8700, 0xf9ef, 0x5000 },
+  { 0x8700, 0xf9e7, 0x4000 },
+  { 0x8700, 0xf9e3, 0x3000 },
+  { 0x8700, 0xf9e1, 0x2000 },
+  { 0x0700, 0xf9e0, 0x0000 },
+  { 0x0700, 0xf9e2, 0x0000 },
+  { 0x8700, 0xf9e5, 0x2000 },
+  { 0x0700, 0xf9e4, 0x0000 },
+  { 0x0700, 0xf9e6, 0x0000 },
+  { 0x8700, 0xf9eb, 0x3000 },
+  { 0x8700, 0xf9e9, 0x2000 },
+  { 0x0700, 0xf9e8, 0x0000 },
+  { 0x0700, 0xf9ea, 0x0000 },
+  { 0x8700, 0xf9ed, 0x2000 },
+  { 0x0700, 0xf9ec, 0x0000 },
+  { 0x0700, 0xf9ee, 0x0000 },
+  { 0x8700, 0xf9f7, 0x4000 },
+  { 0x8700, 0xf9f3, 0x3000 },
+  { 0x8700, 0xf9f1, 0x2000 },
+  { 0x0700, 0xf9f0, 0x0000 },
+  { 0x0700, 0xf9f2, 0x0000 },
+  { 0x8700, 0xf9f5, 0x2000 },
+  { 0x0700, 0xf9f4, 0x0000 },
+  { 0x0700, 0xf9f6, 0x0000 },
+  { 0x8700, 0xf9fb, 0x3000 },
+  { 0x8700, 0xf9f9, 0x2000 },
+  { 0x0700, 0xf9f8, 0x0000 },
+  { 0x0700, 0xf9fa, 0x0000 },
+  { 0x8700, 0xf9fd, 0x2000 },
+  { 0x0700, 0xf9fc, 0x0000 },
+  { 0x0700, 0xf9fe, 0x0000 },
+  { 0x8700, 0xfa41, 0x7000 },
+  { 0x8700, 0xfa1f, 0x6000 },
+  { 0x8700, 0xfa0f, 0x5000 },
+  { 0x8700, 0xfa07, 0x4000 },
+  { 0x8700, 0xfa03, 0x3000 },
+  { 0x8700, 0xfa01, 0x2000 },
+  { 0x0700, 0xfa00, 0x0000 },
+  { 0x0700, 0xfa02, 0x0000 },
+  { 0x8700, 0xfa05, 0x2000 },
+  { 0x0700, 0xfa04, 0x0000 },
+  { 0x0700, 0xfa06, 0x0000 },
+  { 0x8700, 0xfa0b, 0x3000 },
+  { 0x8700, 0xfa09, 0x2000 },
+  { 0x0700, 0xfa08, 0x0000 },
+  { 0x0700, 0xfa0a, 0x0000 },
+  { 0x8700, 0xfa0d, 0x2000 },
+  { 0x0700, 0xfa0c, 0x0000 },
+  { 0x0700, 0xfa0e, 0x0000 },
+  { 0x8700, 0xfa17, 0x4000 },
+  { 0x8700, 0xfa13, 0x3000 },
+  { 0x8700, 0xfa11, 0x2000 },
+  { 0x0700, 0xfa10, 0x0000 },
+  { 0x0700, 0xfa12, 0x0000 },
+  { 0x8700, 0xfa15, 0x2000 },
+  { 0x0700, 0xfa14, 0x0000 },
+  { 0x0700, 0xfa16, 0x0000 },
+  { 0x8700, 0xfa1b, 0x3000 },
+  { 0x8700, 0xfa19, 0x2000 },
+  { 0x0700, 0xfa18, 0x0000 },
+  { 0x0700, 0xfa1a, 0x0000 },
+  { 0x8700, 0xfa1d, 0x2000 },
+  { 0x0700, 0xfa1c, 0x0000 },
+  { 0x0700, 0xfa1e, 0x0000 },
+  { 0x8700, 0xfa31, 0x5000 },
+  { 0x8700, 0xfa27, 0x4000 },
+  { 0x8700, 0xfa23, 0x3000 },
+  { 0x8700, 0xfa21, 0x2000 },
+  { 0x0700, 0xfa20, 0x0000 },
+  { 0x0700, 0xfa22, 0x0000 },
+  { 0x8700, 0xfa25, 0x2000 },
+  { 0x0700, 0xfa24, 0x0000 },
+  { 0x0700, 0xfa26, 0x0000 },
+  { 0x8700, 0xfa2b, 0x3000 },
+  { 0x8700, 0xfa29, 0x2000 },
+  { 0x0700, 0xfa28, 0x0000 },
+  { 0x0700, 0xfa2a, 0x0000 },
+  { 0x8700, 0xfa2d, 0x2000 },
+  { 0x0700, 0xfa2c, 0x0000 },
+  { 0x0700, 0xfa30, 0x0000 },
+  { 0x8700, 0xfa39, 0x4000 },
+  { 0x8700, 0xfa35, 0x3000 },
+  { 0x8700, 0xfa33, 0x2000 },
+  { 0x0700, 0xfa32, 0x0000 },
+  { 0x0700, 0xfa34, 0x0000 },
+  { 0x8700, 0xfa37, 0x2000 },
+  { 0x0700, 0xfa36, 0x0000 },
+  { 0x0700, 0xfa38, 0x0000 },
+  { 0x8700, 0xfa3d, 0x3000 },
+  { 0x8700, 0xfa3b, 0x2000 },
+  { 0x0700, 0xfa3a, 0x0000 },
+  { 0x0700, 0xfa3c, 0x0000 },
+  { 0x8700, 0xfa3f, 0x2000 },
+  { 0x0700, 0xfa3e, 0x0000 },
+  { 0x0700, 0xfa40, 0x0000 },
+  { 0x8700, 0xfa61, 0x6000 },
+  { 0x8700, 0xfa51, 0x5000 },
+  { 0x8700, 0xfa49, 0x4000 },
+  { 0x8700, 0xfa45, 0x3000 },
+  { 0x8700, 0xfa43, 0x2000 },
+  { 0x0700, 0xfa42, 0x0000 },
+  { 0x0700, 0xfa44, 0x0000 },
+  { 0x8700, 0xfa47, 0x2000 },
+  { 0x0700, 0xfa46, 0x0000 },
+  { 0x0700, 0xfa48, 0x0000 },
+  { 0x8700, 0xfa4d, 0x3000 },
+  { 0x8700, 0xfa4b, 0x2000 },
+  { 0x0700, 0xfa4a, 0x0000 },
+  { 0x0700, 0xfa4c, 0x0000 },
+  { 0x8700, 0xfa4f, 0x2000 },
+  { 0x0700, 0xfa4e, 0x0000 },
+  { 0x0700, 0xfa50, 0x0000 },
+  { 0x8700, 0xfa59, 0x4000 },
+  { 0x8700, 0xfa55, 0x3000 },
+  { 0x8700, 0xfa53, 0x2000 },
+  { 0x0700, 0xfa52, 0x0000 },
+  { 0x0700, 0xfa54, 0x0000 },
+  { 0x8700, 0xfa57, 0x2000 },
+  { 0x0700, 0xfa56, 0x0000 },
+  { 0x0700, 0xfa58, 0x0000 },
+  { 0x8700, 0xfa5d, 0x3000 },
+  { 0x8700, 0xfa5b, 0x2000 },
+  { 0x0700, 0xfa5a, 0x0000 },
+  { 0x0700, 0xfa5c, 0x0000 },
+  { 0x8700, 0xfa5f, 0x2000 },
+  { 0x0700, 0xfa5e, 0x0000 },
+  { 0x0700, 0xfa60, 0x0000 },
+  { 0x8500, 0xfb06, 0x5000 },
+  { 0x8700, 0xfa69, 0x4000 },
+  { 0x8700, 0xfa65, 0x3000 },
+  { 0x8700, 0xfa63, 0x2000 },
+  { 0x0700, 0xfa62, 0x0000 },
+  { 0x0700, 0xfa64, 0x0000 },
+  { 0x8700, 0xfa67, 0x2000 },
+  { 0x0700, 0xfa66, 0x0000 },
+  { 0x0700, 0xfa68, 0x0000 },
+  { 0x8500, 0xfb02, 0x3000 },
+  { 0x8500, 0xfb00, 0x2000 },
+  { 0x0700, 0xfa6a, 0x0000 },
+  { 0x0500, 0xfb01, 0x0000 },
+  { 0x8500, 0xfb04, 0x2000 },
+  { 0x0500, 0xfb03, 0x0000 },
+  { 0x0500, 0xfb05, 0x0000 },
+  { 0x8700, 0xfb1f, 0x4000 },
+  { 0x8500, 0xfb16, 0x3000 },
+  { 0x8500, 0xfb14, 0x2000 },
+  { 0x0500, 0xfb13, 0x0000 },
+  { 0x0500, 0xfb15, 0x0000 },
+  { 0x8700, 0xfb1d, 0x2000 },
+  { 0x0500, 0xfb17, 0x0000 },
+  { 0x0c00, 0xfb1e, 0x0000 },
+  { 0x8700, 0xfb23, 0x3000 },
+  { 0x8700, 0xfb21, 0x2000 },
+  { 0x0700, 0xfb20, 0x0000 },
+  { 0x0700, 0xfb22, 0x0000 },
+  { 0x8700, 0xfb25, 0x2000 },
+  { 0x0700, 0xfb24, 0x0000 },
+  { 0x0700, 0xfb26, 0x0000 },
+  { 0x8700, 0xfbac, 0x8000 },
+  { 0x8700, 0xfb6c, 0x7000 },
+  { 0x8700, 0xfb4c, 0x6000 },
+  { 0x8700, 0xfb38, 0x5000 },
+  { 0x8700, 0xfb2f, 0x4000 },
+  { 0x8700, 0xfb2b, 0x3000 },
+  { 0x9900, 0xfb29, 0x2000 },
+  { 0x0700, 0xfb28, 0x0000 },
+  { 0x0700, 0xfb2a, 0x0000 },
+  { 0x8700, 0xfb2d, 0x2000 },
+  { 0x0700, 0xfb2c, 0x0000 },
+  { 0x0700, 0xfb2e, 0x0000 },
+  { 0x8700, 0xfb33, 0x3000 },
+  { 0x8700, 0xfb31, 0x2000 },
+  { 0x0700, 0xfb30, 0x0000 },
+  { 0x0700, 0xfb32, 0x0000 },
+  { 0x8700, 0xfb35, 0x2000 },
+  { 0x0700, 0xfb34, 0x0000 },
+  { 0x0700, 0xfb36, 0x0000 },
+  { 0x8700, 0xfb43, 0x4000 },
+  { 0x8700, 0xfb3c, 0x3000 },
+  { 0x8700, 0xfb3a, 0x2000 },
+  { 0x0700, 0xfb39, 0x0000 },
+  { 0x0700, 0xfb3b, 0x0000 },
+  { 0x8700, 0xfb40, 0x2000 },
+  { 0x0700, 0xfb3e, 0x0000 },
+  { 0x0700, 0xfb41, 0x0000 },
+  { 0x8700, 0xfb48, 0x3000 },
+  { 0x8700, 0xfb46, 0x2000 },
+  { 0x0700, 0xfb44, 0x0000 },
+  { 0x0700, 0xfb47, 0x0000 },
+  { 0x8700, 0xfb4a, 0x2000 },
+  { 0x0700, 0xfb49, 0x0000 },
+  { 0x0700, 0xfb4b, 0x0000 },
+  { 0x8700, 0xfb5c, 0x5000 },
+  { 0x8700, 0xfb54, 0x4000 },
+  { 0x8700, 0xfb50, 0x3000 },
+  { 0x8700, 0xfb4e, 0x2000 },
+  { 0x0700, 0xfb4d, 0x0000 },
+  { 0x0700, 0xfb4f, 0x0000 },
+  { 0x8700, 0xfb52, 0x2000 },
+  { 0x0700, 0xfb51, 0x0000 },
+  { 0x0700, 0xfb53, 0x0000 },
+  { 0x8700, 0xfb58, 0x3000 },
+  { 0x8700, 0xfb56, 0x2000 },
+  { 0x0700, 0xfb55, 0x0000 },
+  { 0x0700, 0xfb57, 0x0000 },
+  { 0x8700, 0xfb5a, 0x2000 },
+  { 0x0700, 0xfb59, 0x0000 },
+  { 0x0700, 0xfb5b, 0x0000 },
+  { 0x8700, 0xfb64, 0x4000 },
+  { 0x8700, 0xfb60, 0x3000 },
+  { 0x8700, 0xfb5e, 0x2000 },
+  { 0x0700, 0xfb5d, 0x0000 },
+  { 0x0700, 0xfb5f, 0x0000 },
+  { 0x8700, 0xfb62, 0x2000 },
+  { 0x0700, 0xfb61, 0x0000 },
+  { 0x0700, 0xfb63, 0x0000 },
+  { 0x8700, 0xfb68, 0x3000 },
+  { 0x8700, 0xfb66, 0x2000 },
+  { 0x0700, 0xfb65, 0x0000 },
+  { 0x0700, 0xfb67, 0x0000 },
+  { 0x8700, 0xfb6a, 0x2000 },
+  { 0x0700, 0xfb69, 0x0000 },
+  { 0x0700, 0xfb6b, 0x0000 },
+  { 0x8700, 0xfb8c, 0x6000 },
+  { 0x8700, 0xfb7c, 0x5000 },
+  { 0x8700, 0xfb74, 0x4000 },
+  { 0x8700, 0xfb70, 0x3000 },
+  { 0x8700, 0xfb6e, 0x2000 },
+  { 0x0700, 0xfb6d, 0x0000 },
+  { 0x0700, 0xfb6f, 0x0000 },
+  { 0x8700, 0xfb72, 0x2000 },
+  { 0x0700, 0xfb71, 0x0000 },
+  { 0x0700, 0xfb73, 0x0000 },
+  { 0x8700, 0xfb78, 0x3000 },
+  { 0x8700, 0xfb76, 0x2000 },
+  { 0x0700, 0xfb75, 0x0000 },
+  { 0x0700, 0xfb77, 0x0000 },
+  { 0x8700, 0xfb7a, 0x2000 },
+  { 0x0700, 0xfb79, 0x0000 },
+  { 0x0700, 0xfb7b, 0x0000 },
+  { 0x8700, 0xfb84, 0x4000 },
+  { 0x8700, 0xfb80, 0x3000 },
+  { 0x8700, 0xfb7e, 0x2000 },
+  { 0x0700, 0xfb7d, 0x0000 },
+  { 0x0700, 0xfb7f, 0x0000 },
+  { 0x8700, 0xfb82, 0x2000 },
+  { 0x0700, 0xfb81, 0x0000 },
+  { 0x0700, 0xfb83, 0x0000 },
+  { 0x8700, 0xfb88, 0x3000 },
+  { 0x8700, 0xfb86, 0x2000 },
+  { 0x0700, 0xfb85, 0x0000 },
+  { 0x0700, 0xfb87, 0x0000 },
+  { 0x8700, 0xfb8a, 0x2000 },
+  { 0x0700, 0xfb89, 0x0000 },
+  { 0x0700, 0xfb8b, 0x0000 },
+  { 0x8700, 0xfb9c, 0x5000 },
+  { 0x8700, 0xfb94, 0x4000 },
+  { 0x8700, 0xfb90, 0x3000 },
+  { 0x8700, 0xfb8e, 0x2000 },
+  { 0x0700, 0xfb8d, 0x0000 },
+  { 0x0700, 0xfb8f, 0x0000 },
+  { 0x8700, 0xfb92, 0x2000 },
+  { 0x0700, 0xfb91, 0x0000 },
+  { 0x0700, 0xfb93, 0x0000 },
+  { 0x8700, 0xfb98, 0x3000 },
+  { 0x8700, 0xfb96, 0x2000 },
+  { 0x0700, 0xfb95, 0x0000 },
+  { 0x0700, 0xfb97, 0x0000 },
+  { 0x8700, 0xfb9a, 0x2000 },
+  { 0x0700, 0xfb99, 0x0000 },
+  { 0x0700, 0xfb9b, 0x0000 },
+  { 0x8700, 0xfba4, 0x4000 },
+  { 0x8700, 0xfba0, 0x3000 },
+  { 0x8700, 0xfb9e, 0x2000 },
+  { 0x0700, 0xfb9d, 0x0000 },
+  { 0x0700, 0xfb9f, 0x0000 },
+  { 0x8700, 0xfba2, 0x2000 },
+  { 0x0700, 0xfba1, 0x0000 },
+  { 0x0700, 0xfba3, 0x0000 },
+  { 0x8700, 0xfba8, 0x3000 },
+  { 0x8700, 0xfba6, 0x2000 },
+  { 0x0700, 0xfba5, 0x0000 },
+  { 0x0700, 0xfba7, 0x0000 },
+  { 0x8700, 0xfbaa, 0x2000 },
+  { 0x0700, 0xfba9, 0x0000 },
+  { 0x0700, 0xfbab, 0x0000 },
+  { 0x8700, 0xfc0d, 0x7000 },
+  { 0x8700, 0xfbed, 0x6000 },
+  { 0x8700, 0xfbdd, 0x5000 },
+  { 0x8700, 0xfbd5, 0x4000 },
+  { 0x8700, 0xfbb0, 0x3000 },
+  { 0x8700, 0xfbae, 0x2000 },
+  { 0x0700, 0xfbad, 0x0000 },
+  { 0x0700, 0xfbaf, 0x0000 },
+  { 0x8700, 0xfbd3, 0x2000 },
+  { 0x0700, 0xfbb1, 0x0000 },
+  { 0x0700, 0xfbd4, 0x0000 },
+  { 0x8700, 0xfbd9, 0x3000 },
+  { 0x8700, 0xfbd7, 0x2000 },
+  { 0x0700, 0xfbd6, 0x0000 },
+  { 0x0700, 0xfbd8, 0x0000 },
+  { 0x8700, 0xfbdb, 0x2000 },
+  { 0x0700, 0xfbda, 0x0000 },
+  { 0x0700, 0xfbdc, 0x0000 },
+  { 0x8700, 0xfbe5, 0x4000 },
+  { 0x8700, 0xfbe1, 0x3000 },
+  { 0x8700, 0xfbdf, 0x2000 },
+  { 0x0700, 0xfbde, 0x0000 },
+  { 0x0700, 0xfbe0, 0x0000 },
+  { 0x8700, 0xfbe3, 0x2000 },
+  { 0x0700, 0xfbe2, 0x0000 },
+  { 0x0700, 0xfbe4, 0x0000 },
+  { 0x8700, 0xfbe9, 0x3000 },
+  { 0x8700, 0xfbe7, 0x2000 },
+  { 0x0700, 0xfbe6, 0x0000 },
+  { 0x0700, 0xfbe8, 0x0000 },
+  { 0x8700, 0xfbeb, 0x2000 },
+  { 0x0700, 0xfbea, 0x0000 },
+  { 0x0700, 0xfbec, 0x0000 },
+  { 0x8700, 0xfbfd, 0x5000 },
+  { 0x8700, 0xfbf5, 0x4000 },
+  { 0x8700, 0xfbf1, 0x3000 },
+  { 0x8700, 0xfbef, 0x2000 },
+  { 0x0700, 0xfbee, 0x0000 },
+  { 0x0700, 0xfbf0, 0x0000 },
+  { 0x8700, 0xfbf3, 0x2000 },
+  { 0x0700, 0xfbf2, 0x0000 },
+  { 0x0700, 0xfbf4, 0x0000 },
+  { 0x8700, 0xfbf9, 0x3000 },
+  { 0x8700, 0xfbf7, 0x2000 },
+  { 0x0700, 0xfbf6, 0x0000 },
+  { 0x0700, 0xfbf8, 0x0000 },
+  { 0x8700, 0xfbfb, 0x2000 },
+  { 0x0700, 0xfbfa, 0x0000 },
+  { 0x0700, 0xfbfc, 0x0000 },
+  { 0x8700, 0xfc05, 0x4000 },
+  { 0x8700, 0xfc01, 0x3000 },
+  { 0x8700, 0xfbff, 0x2000 },
+  { 0x0700, 0xfbfe, 0x0000 },
+  { 0x0700, 0xfc00, 0x0000 },
+  { 0x8700, 0xfc03, 0x2000 },
+  { 0x0700, 0xfc02, 0x0000 },
+  { 0x0700, 0xfc04, 0x0000 },
+  { 0x8700, 0xfc09, 0x3000 },
+  { 0x8700, 0xfc07, 0x2000 },
+  { 0x0700, 0xfc06, 0x0000 },
+  { 0x0700, 0xfc08, 0x0000 },
+  { 0x8700, 0xfc0b, 0x2000 },
+  { 0x0700, 0xfc0a, 0x0000 },
+  { 0x0700, 0xfc0c, 0x0000 },
+  { 0x8700, 0xfc2d, 0x6000 },
+  { 0x8700, 0xfc1d, 0x5000 },
+  { 0x8700, 0xfc15, 0x4000 },
+  { 0x8700, 0xfc11, 0x3000 },
+  { 0x8700, 0xfc0f, 0x2000 },
+  { 0x0700, 0xfc0e, 0x0000 },
+  { 0x0700, 0xfc10, 0x0000 },
+  { 0x8700, 0xfc13, 0x2000 },
+  { 0x0700, 0xfc12, 0x0000 },
+  { 0x0700, 0xfc14, 0x0000 },
+  { 0x8700, 0xfc19, 0x3000 },
+  { 0x8700, 0xfc17, 0x2000 },
+  { 0x0700, 0xfc16, 0x0000 },
+  { 0x0700, 0xfc18, 0x0000 },
+  { 0x8700, 0xfc1b, 0x2000 },
+  { 0x0700, 0xfc1a, 0x0000 },
+  { 0x0700, 0xfc1c, 0x0000 },
+  { 0x8700, 0xfc25, 0x4000 },
+  { 0x8700, 0xfc21, 0x3000 },
+  { 0x8700, 0xfc1f, 0x2000 },
+  { 0x0700, 0xfc1e, 0x0000 },
+  { 0x0700, 0xfc20, 0x0000 },
+  { 0x8700, 0xfc23, 0x2000 },
+  { 0x0700, 0xfc22, 0x0000 },
+  { 0x0700, 0xfc24, 0x0000 },
+  { 0x8700, 0xfc29, 0x3000 },
+  { 0x8700, 0xfc27, 0x2000 },
+  { 0x0700, 0xfc26, 0x0000 },
+  { 0x0700, 0xfc28, 0x0000 },
+  { 0x8700, 0xfc2b, 0x2000 },
+  { 0x0700, 0xfc2a, 0x0000 },
+  { 0x0700, 0xfc2c, 0x0000 },
+  { 0x8700, 0xfc3d, 0x5000 },
+  { 0x8700, 0xfc35, 0x4000 },
+  { 0x8700, 0xfc31, 0x3000 },
+  { 0x8700, 0xfc2f, 0x2000 },
+  { 0x0700, 0xfc2e, 0x0000 },
+  { 0x0700, 0xfc30, 0x0000 },
+  { 0x8700, 0xfc33, 0x2000 },
+  { 0x0700, 0xfc32, 0x0000 },
+  { 0x0700, 0xfc34, 0x0000 },
+  { 0x8700, 0xfc39, 0x3000 },
+  { 0x8700, 0xfc37, 0x2000 },
+  { 0x0700, 0xfc36, 0x0000 },
+  { 0x0700, 0xfc38, 0x0000 },
+  { 0x8700, 0xfc3b, 0x2000 },
+  { 0x0700, 0xfc3a, 0x0000 },
+  { 0x0700, 0xfc3c, 0x0000 },
+  { 0x8700, 0xfc45, 0x4000 },
+  { 0x8700, 0xfc41, 0x3000 },
+  { 0x8700, 0xfc3f, 0x2000 },
+  { 0x0700, 0xfc3e, 0x0000 },
+  { 0x0700, 0xfc40, 0x0000 },
+  { 0x8700, 0xfc43, 0x2000 },
+  { 0x0700, 0xfc42, 0x0000 },
+  { 0x0700, 0xfc44, 0x0000 },
+  { 0x8700, 0xfc49, 0x3000 },
+  { 0x8700, 0xfc47, 0x2000 },
+  { 0x0700, 0xfc46, 0x0000 },
+  { 0x0700, 0xfc48, 0x0000 },
+  { 0x8700, 0xfc4b, 0x2000 },
+  { 0x0700, 0xfc4a, 0x0000 },
+  { 0x0700, 0xfc4c, 0x0000 },
+  { 0x8700, 0xfeac, 0xa000 },
+  { 0x8700, 0xfd5d, 0x9000 },
+  { 0x8700, 0xfccd, 0x8000 },
+  { 0x8700, 0xfc8d, 0x7000 },
+  { 0x8700, 0xfc6d, 0x6000 },
+  { 0x8700, 0xfc5d, 0x5000 },
+  { 0x8700, 0xfc55, 0x4000 },
+  { 0x8700, 0xfc51, 0x3000 },
+  { 0x8700, 0xfc4f, 0x2000 },
+  { 0x0700, 0xfc4e, 0x0000 },
+  { 0x0700, 0xfc50, 0x0000 },
+  { 0x8700, 0xfc53, 0x2000 },
+  { 0x0700, 0xfc52, 0x0000 },
+  { 0x0700, 0xfc54, 0x0000 },
+  { 0x8700, 0xfc59, 0x3000 },
+  { 0x8700, 0xfc57, 0x2000 },
+  { 0x0700, 0xfc56, 0x0000 },
+  { 0x0700, 0xfc58, 0x0000 },
+  { 0x8700, 0xfc5b, 0x2000 },
+  { 0x0700, 0xfc5a, 0x0000 },
+  { 0x0700, 0xfc5c, 0x0000 },
+  { 0x8700, 0xfc65, 0x4000 },
+  { 0x8700, 0xfc61, 0x3000 },
+  { 0x8700, 0xfc5f, 0x2000 },
+  { 0x0700, 0xfc5e, 0x0000 },
+  { 0x0700, 0xfc60, 0x0000 },
+  { 0x8700, 0xfc63, 0x2000 },
+  { 0x0700, 0xfc62, 0x0000 },
+  { 0x0700, 0xfc64, 0x0000 },
+  { 0x8700, 0xfc69, 0x3000 },
+  { 0x8700, 0xfc67, 0x2000 },
+  { 0x0700, 0xfc66, 0x0000 },
+  { 0x0700, 0xfc68, 0x0000 },
+  { 0x8700, 0xfc6b, 0x2000 },
+  { 0x0700, 0xfc6a, 0x0000 },
+  { 0x0700, 0xfc6c, 0x0000 },
+  { 0x8700, 0xfc7d, 0x5000 },
+  { 0x8700, 0xfc75, 0x4000 },
+  { 0x8700, 0xfc71, 0x3000 },
+  { 0x8700, 0xfc6f, 0x2000 },
+  { 0x0700, 0xfc6e, 0x0000 },
+  { 0x0700, 0xfc70, 0x0000 },
+  { 0x8700, 0xfc73, 0x2000 },
+  { 0x0700, 0xfc72, 0x0000 },
+  { 0x0700, 0xfc74, 0x0000 },
+  { 0x8700, 0xfc79, 0x3000 },
+  { 0x8700, 0xfc77, 0x2000 },
+  { 0x0700, 0xfc76, 0x0000 },
+  { 0x0700, 0xfc78, 0x0000 },
+  { 0x8700, 0xfc7b, 0x2000 },
+  { 0x0700, 0xfc7a, 0x0000 },
+  { 0x0700, 0xfc7c, 0x0000 },
+  { 0x8700, 0xfc85, 0x4000 },
+  { 0x8700, 0xfc81, 0x3000 },
+  { 0x8700, 0xfc7f, 0x2000 },
+  { 0x0700, 0xfc7e, 0x0000 },
+  { 0x0700, 0xfc80, 0x0000 },
+  { 0x8700, 0xfc83, 0x2000 },
+  { 0x0700, 0xfc82, 0x0000 },
+  { 0x0700, 0xfc84, 0x0000 },
+  { 0x8700, 0xfc89, 0x3000 },
+  { 0x8700, 0xfc87, 0x2000 },
+  { 0x0700, 0xfc86, 0x0000 },
+  { 0x0700, 0xfc88, 0x0000 },
+  { 0x8700, 0xfc8b, 0x2000 },
+  { 0x0700, 0xfc8a, 0x0000 },
+  { 0x0700, 0xfc8c, 0x0000 },
+  { 0x8700, 0xfcad, 0x6000 },
+  { 0x8700, 0xfc9d, 0x5000 },
+  { 0x8700, 0xfc95, 0x4000 },
+  { 0x8700, 0xfc91, 0x3000 },
+  { 0x8700, 0xfc8f, 0x2000 },
+  { 0x0700, 0xfc8e, 0x0000 },
+  { 0x0700, 0xfc90, 0x0000 },
+  { 0x8700, 0xfc93, 0x2000 },
+  { 0x0700, 0xfc92, 0x0000 },
+  { 0x0700, 0xfc94, 0x0000 },
+  { 0x8700, 0xfc99, 0x3000 },
+  { 0x8700, 0xfc97, 0x2000 },
+  { 0x0700, 0xfc96, 0x0000 },
+  { 0x0700, 0xfc98, 0x0000 },
+  { 0x8700, 0xfc9b, 0x2000 },
+  { 0x0700, 0xfc9a, 0x0000 },
+  { 0x0700, 0xfc9c, 0x0000 },
+  { 0x8700, 0xfca5, 0x4000 },
+  { 0x8700, 0xfca1, 0x3000 },
+  { 0x8700, 0xfc9f, 0x2000 },
+  { 0x0700, 0xfc9e, 0x0000 },
+  { 0x0700, 0xfca0, 0x0000 },
+  { 0x8700, 0xfca3, 0x2000 },
+  { 0x0700, 0xfca2, 0x0000 },
+  { 0x0700, 0xfca4, 0x0000 },
+  { 0x8700, 0xfca9, 0x3000 },
+  { 0x8700, 0xfca7, 0x2000 },
+  { 0x0700, 0xfca6, 0x0000 },
+  { 0x0700, 0xfca8, 0x0000 },
+  { 0x8700, 0xfcab, 0x2000 },
+  { 0x0700, 0xfcaa, 0x0000 },
+  { 0x0700, 0xfcac, 0x0000 },
+  { 0x8700, 0xfcbd, 0x5000 },
+  { 0x8700, 0xfcb5, 0x4000 },
+  { 0x8700, 0xfcb1, 0x3000 },
+  { 0x8700, 0xfcaf, 0x2000 },
+  { 0x0700, 0xfcae, 0x0000 },
+  { 0x0700, 0xfcb0, 0x0000 },
+  { 0x8700, 0xfcb3, 0x2000 },
+  { 0x0700, 0xfcb2, 0x0000 },
+  { 0x0700, 0xfcb4, 0x0000 },
+  { 0x8700, 0xfcb9, 0x3000 },
+  { 0x8700, 0xfcb7, 0x2000 },
+  { 0x0700, 0xfcb6, 0x0000 },
+  { 0x0700, 0xfcb8, 0x0000 },
+  { 0x8700, 0xfcbb, 0x2000 },
+  { 0x0700, 0xfcba, 0x0000 },
+  { 0x0700, 0xfcbc, 0x0000 },
+  { 0x8700, 0xfcc5, 0x4000 },
+  { 0x8700, 0xfcc1, 0x3000 },
+  { 0x8700, 0xfcbf, 0x2000 },
+  { 0x0700, 0xfcbe, 0x0000 },
+  { 0x0700, 0xfcc0, 0x0000 },
+  { 0x8700, 0xfcc3, 0x2000 },
+  { 0x0700, 0xfcc2, 0x0000 },
+  { 0x0700, 0xfcc4, 0x0000 },
+  { 0x8700, 0xfcc9, 0x3000 },
+  { 0x8700, 0xfcc7, 0x2000 },
+  { 0x0700, 0xfcc6, 0x0000 },
+  { 0x0700, 0xfcc8, 0x0000 },
+  { 0x8700, 0xfccb, 0x2000 },
+  { 0x0700, 0xfcca, 0x0000 },
+  { 0x0700, 0xfccc, 0x0000 },
+  { 0x8700, 0xfd0d, 0x7000 },
+  { 0x8700, 0xfced, 0x6000 },
+  { 0x8700, 0xfcdd, 0x5000 },
+  { 0x8700, 0xfcd5, 0x4000 },
+  { 0x8700, 0xfcd1, 0x3000 },
+  { 0x8700, 0xfccf, 0x2000 },
+  { 0x0700, 0xfcce, 0x0000 },
+  { 0x0700, 0xfcd0, 0x0000 },
+  { 0x8700, 0xfcd3, 0x2000 },
+  { 0x0700, 0xfcd2, 0x0000 },
+  { 0x0700, 0xfcd4, 0x0000 },
+  { 0x8700, 0xfcd9, 0x3000 },
+  { 0x8700, 0xfcd7, 0x2000 },
+  { 0x0700, 0xfcd6, 0x0000 },
+  { 0x0700, 0xfcd8, 0x0000 },
+  { 0x8700, 0xfcdb, 0x2000 },
+  { 0x0700, 0xfcda, 0x0000 },
+  { 0x0700, 0xfcdc, 0x0000 },
+  { 0x8700, 0xfce5, 0x4000 },
+  { 0x8700, 0xfce1, 0x3000 },
+  { 0x8700, 0xfcdf, 0x2000 },
+  { 0x0700, 0xfcde, 0x0000 },
+  { 0x0700, 0xfce0, 0x0000 },
+  { 0x8700, 0xfce3, 0x2000 },
+  { 0x0700, 0xfce2, 0x0000 },
+  { 0x0700, 0xfce4, 0x0000 },
+  { 0x8700, 0xfce9, 0x3000 },
+  { 0x8700, 0xfce7, 0x2000 },
+  { 0x0700, 0xfce6, 0x0000 },
+  { 0x0700, 0xfce8, 0x0000 },
+  { 0x8700, 0xfceb, 0x2000 },
+  { 0x0700, 0xfcea, 0x0000 },
+  { 0x0700, 0xfcec, 0x0000 },
+  { 0x8700, 0xfcfd, 0x5000 },
+  { 0x8700, 0xfcf5, 0x4000 },
+  { 0x8700, 0xfcf1, 0x3000 },
+  { 0x8700, 0xfcef, 0x2000 },
+  { 0x0700, 0xfcee, 0x0000 },
+  { 0x0700, 0xfcf0, 0x0000 },
+  { 0x8700, 0xfcf3, 0x2000 },
+  { 0x0700, 0xfcf2, 0x0000 },
+  { 0x0700, 0xfcf4, 0x0000 },
+  { 0x8700, 0xfcf9, 0x3000 },
+  { 0x8700, 0xfcf7, 0x2000 },
+  { 0x0700, 0xfcf6, 0x0000 },
+  { 0x0700, 0xfcf8, 0x0000 },
+  { 0x8700, 0xfcfb, 0x2000 },
+  { 0x0700, 0xfcfa, 0x0000 },
+  { 0x0700, 0xfcfc, 0x0000 },
+  { 0x8700, 0xfd05, 0x4000 },
+  { 0x8700, 0xfd01, 0x3000 },
+  { 0x8700, 0xfcff, 0x2000 },
+  { 0x0700, 0xfcfe, 0x0000 },
+  { 0x0700, 0xfd00, 0x0000 },
+  { 0x8700, 0xfd03, 0x2000 },
+  { 0x0700, 0xfd02, 0x0000 },
+  { 0x0700, 0xfd04, 0x0000 },
+  { 0x8700, 0xfd09, 0x3000 },
+  { 0x8700, 0xfd07, 0x2000 },
+  { 0x0700, 0xfd06, 0x0000 },
+  { 0x0700, 0xfd08, 0x0000 },
+  { 0x8700, 0xfd0b, 0x2000 },
+  { 0x0700, 0xfd0a, 0x0000 },
+  { 0x0700, 0xfd0c, 0x0000 },
+  { 0x8700, 0xfd2d, 0x6000 },
+  { 0x8700, 0xfd1d, 0x5000 },
+  { 0x8700, 0xfd15, 0x4000 },
+  { 0x8700, 0xfd11, 0x3000 },
+  { 0x8700, 0xfd0f, 0x2000 },
+  { 0x0700, 0xfd0e, 0x0000 },
+  { 0x0700, 0xfd10, 0x0000 },
+  { 0x8700, 0xfd13, 0x2000 },
+  { 0x0700, 0xfd12, 0x0000 },
+  { 0x0700, 0xfd14, 0x0000 },
+  { 0x8700, 0xfd19, 0x3000 },
+  { 0x8700, 0xfd17, 0x2000 },
+  { 0x0700, 0xfd16, 0x0000 },
+  { 0x0700, 0xfd18, 0x0000 },
+  { 0x8700, 0xfd1b, 0x2000 },
+  { 0x0700, 0xfd1a, 0x0000 },
+  { 0x0700, 0xfd1c, 0x0000 },
+  { 0x8700, 0xfd25, 0x4000 },
+  { 0x8700, 0xfd21, 0x3000 },
+  { 0x8700, 0xfd1f, 0x2000 },
+  { 0x0700, 0xfd1e, 0x0000 },
+  { 0x0700, 0xfd20, 0x0000 },
+  { 0x8700, 0xfd23, 0x2000 },
+  { 0x0700, 0xfd22, 0x0000 },
+  { 0x0700, 0xfd24, 0x0000 },
+  { 0x8700, 0xfd29, 0x3000 },
+  { 0x8700, 0xfd27, 0x2000 },
+  { 0x0700, 0xfd26, 0x0000 },
+  { 0x0700, 0xfd28, 0x0000 },
+  { 0x8700, 0xfd2b, 0x2000 },
+  { 0x0700, 0xfd2a, 0x0000 },
+  { 0x0700, 0xfd2c, 0x0000 },
+  { 0x8700, 0xfd3d, 0x5000 },
+  { 0x8700, 0xfd35, 0x4000 },
+  { 0x8700, 0xfd31, 0x3000 },
+  { 0x8700, 0xfd2f, 0x2000 },
+  { 0x0700, 0xfd2e, 0x0000 },
+  { 0x0700, 0xfd30, 0x0000 },
+  { 0x8700, 0xfd33, 0x2000 },
+  { 0x0700, 0xfd32, 0x0000 },
+  { 0x0700, 0xfd34, 0x0000 },
+  { 0x8700, 0xfd39, 0x3000 },
+  { 0x8700, 0xfd37, 0x2000 },
+  { 0x0700, 0xfd36, 0x0000 },
+  { 0x0700, 0xfd38, 0x0000 },
+  { 0x8700, 0xfd3b, 0x2000 },
+  { 0x0700, 0xfd3a, 0x0000 },
+  { 0x0700, 0xfd3c, 0x0000 },
+  { 0x8700, 0xfd55, 0x4000 },
+  { 0x8700, 0xfd51, 0x3000 },
+  { 0x9200, 0xfd3f, 0x2000 },
+  { 0x1600, 0xfd3e, 0x0000 },
+  { 0x0700, 0xfd50, 0x0000 },
+  { 0x8700, 0xfd53, 0x2000 },
+  { 0x0700, 0xfd52, 0x0000 },
+  { 0x0700, 0xfd54, 0x0000 },
+  { 0x8700, 0xfd59, 0x3000 },
+  { 0x8700, 0xfd57, 0x2000 },
+  { 0x0700, 0xfd56, 0x0000 },
+  { 0x0700, 0xfd58, 0x0000 },
+  { 0x8700, 0xfd5b, 0x2000 },
+  { 0x0700, 0xfd5a, 0x0000 },
+  { 0x0700, 0xfd5c, 0x0000 },
+  { 0x8c00, 0xfe09, 0x8000 },
+  { 0x8700, 0xfd9f, 0x7000 },
+  { 0x8700, 0xfd7d, 0x6000 },
+  { 0x8700, 0xfd6d, 0x5000 },
+  { 0x8700, 0xfd65, 0x4000 },
+  { 0x8700, 0xfd61, 0x3000 },
+  { 0x8700, 0xfd5f, 0x2000 },
+  { 0x0700, 0xfd5e, 0x0000 },
+  { 0x0700, 0xfd60, 0x0000 },
+  { 0x8700, 0xfd63, 0x2000 },
+  { 0x0700, 0xfd62, 0x0000 },
+  { 0x0700, 0xfd64, 0x0000 },
+  { 0x8700, 0xfd69, 0x3000 },
+  { 0x8700, 0xfd67, 0x2000 },
+  { 0x0700, 0xfd66, 0x0000 },
+  { 0x0700, 0xfd68, 0x0000 },
+  { 0x8700, 0xfd6b, 0x2000 },
+  { 0x0700, 0xfd6a, 0x0000 },
+  { 0x0700, 0xfd6c, 0x0000 },
+  { 0x8700, 0xfd75, 0x4000 },
+  { 0x8700, 0xfd71, 0x3000 },
+  { 0x8700, 0xfd6f, 0x2000 },
+  { 0x0700, 0xfd6e, 0x0000 },
+  { 0x0700, 0xfd70, 0x0000 },
+  { 0x8700, 0xfd73, 0x2000 },
+  { 0x0700, 0xfd72, 0x0000 },
+  { 0x0700, 0xfd74, 0x0000 },
+  { 0x8700, 0xfd79, 0x3000 },
+  { 0x8700, 0xfd77, 0x2000 },
+  { 0x0700, 0xfd76, 0x0000 },
+  { 0x0700, 0xfd78, 0x0000 },
+  { 0x8700, 0xfd7b, 0x2000 },
+  { 0x0700, 0xfd7a, 0x0000 },
+  { 0x0700, 0xfd7c, 0x0000 },
+  { 0x8700, 0xfd8d, 0x5000 },
+  { 0x8700, 0xfd85, 0x4000 },
+  { 0x8700, 0xfd81, 0x3000 },
+  { 0x8700, 0xfd7f, 0x2000 },
+  { 0x0700, 0xfd7e, 0x0000 },
+  { 0x0700, 0xfd80, 0x0000 },
+  { 0x8700, 0xfd83, 0x2000 },
+  { 0x0700, 0xfd82, 0x0000 },
+  { 0x0700, 0xfd84, 0x0000 },
+  { 0x8700, 0xfd89, 0x3000 },
+  { 0x8700, 0xfd87, 0x2000 },
+  { 0x0700, 0xfd86, 0x0000 },
+  { 0x0700, 0xfd88, 0x0000 },
+  { 0x8700, 0xfd8b, 0x2000 },
+  { 0x0700, 0xfd8a, 0x0000 },
+  { 0x0700, 0xfd8c, 0x0000 },
+  { 0x8700, 0xfd97, 0x4000 },
+  { 0x8700, 0xfd93, 0x3000 },
+  { 0x8700, 0xfd8f, 0x2000 },
+  { 0x0700, 0xfd8e, 0x0000 },
+  { 0x0700, 0xfd92, 0x0000 },
+  { 0x8700, 0xfd95, 0x2000 },
+  { 0x0700, 0xfd94, 0x0000 },
+  { 0x0700, 0xfd96, 0x0000 },
+  { 0x8700, 0xfd9b, 0x3000 },
+  { 0x8700, 0xfd99, 0x2000 },
+  { 0x0700, 0xfd98, 0x0000 },
+  { 0x0700, 0xfd9a, 0x0000 },
+  { 0x8700, 0xfd9d, 0x2000 },
+  { 0x0700, 0xfd9c, 0x0000 },
+  { 0x0700, 0xfd9e, 0x0000 },
+  { 0x8700, 0xfdbf, 0x6000 },
+  { 0x8700, 0xfdaf, 0x5000 },
+  { 0x8700, 0xfda7, 0x4000 },
+  { 0x8700, 0xfda3, 0x3000 },
+  { 0x8700, 0xfda1, 0x2000 },
+  { 0x0700, 0xfda0, 0x0000 },
+  { 0x0700, 0xfda2, 0x0000 },
+  { 0x8700, 0xfda5, 0x2000 },
+  { 0x0700, 0xfda4, 0x0000 },
+  { 0x0700, 0xfda6, 0x0000 },
+  { 0x8700, 0xfdab, 0x3000 },
+  { 0x8700, 0xfda9, 0x2000 },
+  { 0x0700, 0xfda8, 0x0000 },
+  { 0x0700, 0xfdaa, 0x0000 },
+  { 0x8700, 0xfdad, 0x2000 },
+  { 0x0700, 0xfdac, 0x0000 },
+  { 0x0700, 0xfdae, 0x0000 },
+  { 0x8700, 0xfdb7, 0x4000 },
+  { 0x8700, 0xfdb3, 0x3000 },
+  { 0x8700, 0xfdb1, 0x2000 },
+  { 0x0700, 0xfdb0, 0x0000 },
+  { 0x0700, 0xfdb2, 0x0000 },
+  { 0x8700, 0xfdb5, 0x2000 },
+  { 0x0700, 0xfdb4, 0x0000 },
+  { 0x0700, 0xfdb6, 0x0000 },
+  { 0x8700, 0xfdbb, 0x3000 },
+  { 0x8700, 0xfdb9, 0x2000 },
+  { 0x0700, 0xfdb8, 0x0000 },
+  { 0x0700, 0xfdba, 0x0000 },
+  { 0x8700, 0xfdbd, 0x2000 },
+  { 0x0700, 0xfdbc, 0x0000 },
+  { 0x0700, 0xfdbe, 0x0000 },
+  { 0x8700, 0xfdf7, 0x5000 },
+  { 0x8700, 0xfdc7, 0x4000 },
+  { 0x8700, 0xfdc3, 0x3000 },
+  { 0x8700, 0xfdc1, 0x2000 },
+  { 0x0700, 0xfdc0, 0x0000 },
+  { 0x0700, 0xfdc2, 0x0000 },
+  { 0x8700, 0xfdc5, 0x2000 },
+  { 0x0700, 0xfdc4, 0x0000 },
+  { 0x0700, 0xfdc6, 0x0000 },
+  { 0x8700, 0xfdf3, 0x3000 },
+  { 0x8700, 0xfdf1, 0x2000 },
+  { 0x0700, 0xfdf0, 0x0000 },
+  { 0x0700, 0xfdf2, 0x0000 },
+  { 0x8700, 0xfdf5, 0x2000 },
+  { 0x0700, 0xfdf4, 0x0000 },
+  { 0x0700, 0xfdf6, 0x0000 },
+  { 0x8c00, 0xfe01, 0x4000 },
+  { 0x8700, 0xfdfb, 0x3000 },
+  { 0x8700, 0xfdf9, 0x2000 },
+  { 0x0700, 0xfdf8, 0x0000 },
+  { 0x0700, 0xfdfa, 0x0000 },
+  { 0x9a00, 0xfdfd, 0x2000 },
+  { 0x1700, 0xfdfc, 0x0000 },
+  { 0x0c00, 0xfe00, 0x0000 },
+  { 0x8c00, 0xfe05, 0x3000 },
+  { 0x8c00, 0xfe03, 0x2000 },
+  { 0x0c00, 0xfe02, 0x0000 },
+  { 0x0c00, 0xfe04, 0x0000 },
+  { 0x8c00, 0xfe07, 0x2000 },
+  { 0x0c00, 0xfe06, 0x0000 },
+  { 0x0c00, 0xfe08, 0x0000 },
+  { 0x9900, 0xfe66, 0x7000 },
+  { 0x9500, 0xfe45, 0x6000 },
+  { 0x9600, 0xfe35, 0x5000 },
+  { 0x8c00, 0xfe21, 0x4000 },
+  { 0x8c00, 0xfe0d, 0x3000 },
+  { 0x8c00, 0xfe0b, 0x2000 },
+  { 0x0c00, 0xfe0a, 0x0000 },
+  { 0x0c00, 0xfe0c, 0x0000 },
+  { 0x8c00, 0xfe0f, 0x2000 },
+  { 0x0c00, 0xfe0e, 0x0000 },
+  { 0x0c00, 0xfe20, 0x0000 },
+  { 0x9100, 0xfe31, 0x3000 },
+  { 0x8c00, 0xfe23, 0x2000 },
+  { 0x0c00, 0xfe22, 0x0000 },
+  { 0x1500, 0xfe30, 0x0000 },
+  { 0x9000, 0xfe33, 0x2000 },
+  { 0x1100, 0xfe32, 0x0000 },
+  { 0x1000, 0xfe34, 0x0000 },
+  { 0x9600, 0xfe3d, 0x4000 },
+  { 0x9600, 0xfe39, 0x3000 },
+  { 0x9600, 0xfe37, 0x2000 },
+  { 0x1200, 0xfe36, 0x0000 },
+  { 0x1200, 0xfe38, 0x0000 },
+  { 0x9600, 0xfe3b, 0x2000 },
+  { 0x1200, 0xfe3a, 0x0000 },
+  { 0x1200, 0xfe3c, 0x0000 },
+  { 0x9600, 0xfe41, 0x3000 },
+  { 0x9600, 0xfe3f, 0x2000 },
+  { 0x1200, 0xfe3e, 0x0000 },
+  { 0x1200, 0xfe40, 0x0000 },
+  { 0x9600, 0xfe43, 0x2000 },
+  { 0x1200, 0xfe42, 0x0000 },
+  { 0x1200, 0xfe44, 0x0000 },
+  { 0x9500, 0xfe56, 0x5000 },
+  { 0x9000, 0xfe4d, 0x4000 },
+  { 0x9500, 0xfe49, 0x3000 },
+  { 0x9600, 0xfe47, 0x2000 },
+  { 0x1500, 0xfe46, 0x0000 },
+  { 0x1200, 0xfe48, 0x0000 },
+  { 0x9500, 0xfe4b, 0x2000 },
+  { 0x1500, 0xfe4a, 0x0000 },
+  { 0x1500, 0xfe4c, 0x0000 },
+  { 0x9500, 0xfe51, 0x3000 },
+  { 0x9000, 0xfe4f, 0x2000 },
+  { 0x1000, 0xfe4e, 0x0000 },
+  { 0x1500, 0xfe50, 0x0000 },
+  { 0x9500, 0xfe54, 0x2000 },
+  { 0x1500, 0xfe52, 0x0000 },
+  { 0x1500, 0xfe55, 0x0000 },
+  { 0x9200, 0xfe5e, 0x4000 },
+  { 0x9200, 0xfe5a, 0x3000 },
+  { 0x9100, 0xfe58, 0x2000 },
+  { 0x1500, 0xfe57, 0x0000 },
+  { 0x1600, 0xfe59, 0x0000 },
+  { 0x9200, 0xfe5c, 0x2000 },
+  { 0x1600, 0xfe5b, 0x0000 },
+  { 0x1600, 0xfe5d, 0x0000 },
+  { 0x9900, 0xfe62, 0x3000 },
+  { 0x9500, 0xfe60, 0x2000 },
+  { 0x1500, 0xfe5f, 0x0000 },
+  { 0x1500, 0xfe61, 0x0000 },
+  { 0x9900, 0xfe64, 0x2000 },
+  { 0x1100, 0xfe63, 0x0000 },
+  { 0x1900, 0xfe65, 0x0000 },
+  { 0x8700, 0xfe8c, 0x6000 },
+  { 0x8700, 0xfe7c, 0x5000 },
+  { 0x8700, 0xfe73, 0x4000 },
+  { 0x9500, 0xfe6b, 0x3000 },
+  { 0x9700, 0xfe69, 0x2000 },
+  { 0x1500, 0xfe68, 0x0000 },
+  { 0x1500, 0xfe6a, 0x0000 },
+  { 0x8700, 0xfe71, 0x2000 },
+  { 0x0700, 0xfe70, 0x0000 },
+  { 0x0700, 0xfe72, 0x0000 },
+  { 0x8700, 0xfe78, 0x3000 },
+  { 0x8700, 0xfe76, 0x2000 },
+  { 0x0700, 0xfe74, 0x0000 },
+  { 0x0700, 0xfe77, 0x0000 },
+  { 0x8700, 0xfe7a, 0x2000 },
+  { 0x0700, 0xfe79, 0x0000 },
+  { 0x0700, 0xfe7b, 0x0000 },
+  { 0x8700, 0xfe84, 0x4000 },
+  { 0x8700, 0xfe80, 0x3000 },
+  { 0x8700, 0xfe7e, 0x2000 },
+  { 0x0700, 0xfe7d, 0x0000 },
+  { 0x0700, 0xfe7f, 0x0000 },
+  { 0x8700, 0xfe82, 0x2000 },
+  { 0x0700, 0xfe81, 0x0000 },
+  { 0x0700, 0xfe83, 0x0000 },
+  { 0x8700, 0xfe88, 0x3000 },
+  { 0x8700, 0xfe86, 0x2000 },
+  { 0x0700, 0xfe85, 0x0000 },
+  { 0x0700, 0xfe87, 0x0000 },
+  { 0x8700, 0xfe8a, 0x2000 },
+  { 0x0700, 0xfe89, 0x0000 },
+  { 0x0700, 0xfe8b, 0x0000 },
+  { 0x8700, 0xfe9c, 0x5000 },
+  { 0x8700, 0xfe94, 0x4000 },
+  { 0x8700, 0xfe90, 0x3000 },
+  { 0x8700, 0xfe8e, 0x2000 },
+  { 0x0700, 0xfe8d, 0x0000 },
+  { 0x0700, 0xfe8f, 0x0000 },
+  { 0x8700, 0xfe92, 0x2000 },
+  { 0x0700, 0xfe91, 0x0000 },
+  { 0x0700, 0xfe93, 0x0000 },
+  { 0x8700, 0xfe98, 0x3000 },
+  { 0x8700, 0xfe96, 0x2000 },
+  { 0x0700, 0xfe95, 0x0000 },
+  { 0x0700, 0xfe97, 0x0000 },
+  { 0x8700, 0xfe9a, 0x2000 },
+  { 0x0700, 0xfe99, 0x0000 },
+  { 0x0700, 0xfe9b, 0x0000 },
+  { 0x8700, 0xfea4, 0x4000 },
+  { 0x8700, 0xfea0, 0x3000 },
+  { 0x8700, 0xfe9e, 0x2000 },
+  { 0x0700, 0xfe9d, 0x0000 },
+  { 0x0700, 0xfe9f, 0x0000 },
+  { 0x8700, 0xfea2, 0x2000 },
+  { 0x0700, 0xfea1, 0x0000 },
+  { 0x0700, 0xfea3, 0x0000 },
+  { 0x8700, 0xfea8, 0x3000 },
+  { 0x8700, 0xfea6, 0x2000 },
+  { 0x0700, 0xfea5, 0x0000 },
+  { 0x0700, 0xfea7, 0x0000 },
+  { 0x8700, 0xfeaa, 0x2000 },
+  { 0x0700, 0xfea9, 0x0000 },
+  { 0x0700, 0xfeab, 0x0000 },
+  { 0x8700, 0xffaf, 0x9000 },
+  { 0x8900, 0xff2f, 0x8020 },
+  { 0x8700, 0xfeec, 0x7000 },
+  { 0x8700, 0xfecc, 0x6000 },
+  { 0x8700, 0xfebc, 0x5000 },
+  { 0x8700, 0xfeb4, 0x4000 },
+  { 0x8700, 0xfeb0, 0x3000 },
+  { 0x8700, 0xfeae, 0x2000 },
+  { 0x0700, 0xfead, 0x0000 },
+  { 0x0700, 0xfeaf, 0x0000 },
+  { 0x8700, 0xfeb2, 0x2000 },
+  { 0x0700, 0xfeb1, 0x0000 },
+  { 0x0700, 0xfeb3, 0x0000 },
+  { 0x8700, 0xfeb8, 0x3000 },
+  { 0x8700, 0xfeb6, 0x2000 },
+  { 0x0700, 0xfeb5, 0x0000 },
+  { 0x0700, 0xfeb7, 0x0000 },
+  { 0x8700, 0xfeba, 0x2000 },
+  { 0x0700, 0xfeb9, 0x0000 },
+  { 0x0700, 0xfebb, 0x0000 },
+  { 0x8700, 0xfec4, 0x4000 },
+  { 0x8700, 0xfec0, 0x3000 },
+  { 0x8700, 0xfebe, 0x2000 },
+  { 0x0700, 0xfebd, 0x0000 },
+  { 0x0700, 0xfebf, 0x0000 },
+  { 0x8700, 0xfec2, 0x2000 },
+  { 0x0700, 0xfec1, 0x0000 },
+  { 0x0700, 0xfec3, 0x0000 },
+  { 0x8700, 0xfec8, 0x3000 },
+  { 0x8700, 0xfec6, 0x2000 },
+  { 0x0700, 0xfec5, 0x0000 },
+  { 0x0700, 0xfec7, 0x0000 },
+  { 0x8700, 0xfeca, 0x2000 },
+  { 0x0700, 0xfec9, 0x0000 },
+  { 0x0700, 0xfecb, 0x0000 },
+  { 0x8700, 0xfedc, 0x5000 },
+  { 0x8700, 0xfed4, 0x4000 },
+  { 0x8700, 0xfed0, 0x3000 },
+  { 0x8700, 0xfece, 0x2000 },
+  { 0x0700, 0xfecd, 0x0000 },
+  { 0x0700, 0xfecf, 0x0000 },
+  { 0x8700, 0xfed2, 0x2000 },
+  { 0x0700, 0xfed1, 0x0000 },
+  { 0x0700, 0xfed3, 0x0000 },
+  { 0x8700, 0xfed8, 0x3000 },
+  { 0x8700, 0xfed6, 0x2000 },
+  { 0x0700, 0xfed5, 0x0000 },
+  { 0x0700, 0xfed7, 0x0000 },
+  { 0x8700, 0xfeda, 0x2000 },
+  { 0x0700, 0xfed9, 0x0000 },
+  { 0x0700, 0xfedb, 0x0000 },
+  { 0x8700, 0xfee4, 0x4000 },
+  { 0x8700, 0xfee0, 0x3000 },
+  { 0x8700, 0xfede, 0x2000 },
+  { 0x0700, 0xfedd, 0x0000 },
+  { 0x0700, 0xfedf, 0x0000 },
+  { 0x8700, 0xfee2, 0x2000 },
+  { 0x0700, 0xfee1, 0x0000 },
+  { 0x0700, 0xfee3, 0x0000 },
+  { 0x8700, 0xfee8, 0x3000 },
+  { 0x8700, 0xfee6, 0x2000 },
+  { 0x0700, 0xfee5, 0x0000 },
+  { 0x0700, 0xfee7, 0x0000 },
+  { 0x8700, 0xfeea, 0x2000 },
+  { 0x0700, 0xfee9, 0x0000 },
+  { 0x0700, 0xfeeb, 0x0000 },
+  { 0x9500, 0xff0f, 0x6000 },
+  { 0x8700, 0xfefc, 0x5000 },
+  { 0x8700, 0xfef4, 0x4000 },
+  { 0x8700, 0xfef0, 0x3000 },
+  { 0x8700, 0xfeee, 0x2000 },
+  { 0x0700, 0xfeed, 0x0000 },
+  { 0x0700, 0xfeef, 0x0000 },
+  { 0x8700, 0xfef2, 0x2000 },
+  { 0x0700, 0xfef1, 0x0000 },
+  { 0x0700, 0xfef3, 0x0000 },
+  { 0x8700, 0xfef8, 0x3000 },
+  { 0x8700, 0xfef6, 0x2000 },
+  { 0x0700, 0xfef5, 0x0000 },
+  { 0x0700, 0xfef7, 0x0000 },
+  { 0x8700, 0xfefa, 0x2000 },
+  { 0x0700, 0xfef9, 0x0000 },
+  { 0x0700, 0xfefb, 0x0000 },
+  { 0x9500, 0xff07, 0x4000 },
+  { 0x9500, 0xff03, 0x3000 },
+  { 0x9500, 0xff01, 0x2000 },
+  { 0x0100, 0xfeff, 0x0000 },
+  { 0x1500, 0xff02, 0x0000 },
+  { 0x9500, 0xff05, 0x2000 },
+  { 0x1700, 0xff04, 0x0000 },
+  { 0x1500, 0xff06, 0x0000 },
+  { 0x9900, 0xff0b, 0x3000 },
+  { 0x9200, 0xff09, 0x2000 },
+  { 0x1600, 0xff08, 0x0000 },
+  { 0x1500, 0xff0a, 0x0000 },
+  { 0x9100, 0xff0d, 0x2000 },
+  { 0x1500, 0xff0c, 0x0000 },
+  { 0x1500, 0xff0e, 0x0000 },
+  { 0x9500, 0xff1f, 0x5000 },
+  { 0x8d00, 0xff17, 0x4000 },
+  { 0x8d00, 0xff13, 0x3000 },
+  { 0x8d00, 0xff11, 0x2000 },
+  { 0x0d00, 0xff10, 0x0000 },
+  { 0x0d00, 0xff12, 0x0000 },
+  { 0x8d00, 0xff15, 0x2000 },
+  { 0x0d00, 0xff14, 0x0000 },
+  { 0x0d00, 0xff16, 0x0000 },
+  { 0x9500, 0xff1b, 0x3000 },
+  { 0x8d00, 0xff19, 0x2000 },
+  { 0x0d00, 0xff18, 0x0000 },
+  { 0x1500, 0xff1a, 0x0000 },
+  { 0x9900, 0xff1d, 0x2000 },
+  { 0x1900, 0xff1c, 0x0000 },
+  { 0x1900, 0xff1e, 0x0000 },
+  { 0x8900, 0xff27, 0x4020 },
+  { 0x8900, 0xff23, 0x3020 },
+  { 0x8900, 0xff21, 0x2020 },
+  { 0x1500, 0xff20, 0x0000 },
+  { 0x0900, 0xff22, 0x0020 },
+  { 0x8900, 0xff25, 0x2020 },
+  { 0x0900, 0xff24, 0x0020 },
+  { 0x0900, 0xff26, 0x0020 },
+  { 0x8900, 0xff2b, 0x3020 },
+  { 0x8900, 0xff29, 0x2020 },
+  { 0x0900, 0xff28, 0x0020 },
+  { 0x0900, 0xff2a, 0x0020 },
+  { 0x8900, 0xff2d, 0x2020 },
+  { 0x0900, 0xff2c, 0x0020 },
+  { 0x0900, 0xff2e, 0x0020 },
+  { 0x8700, 0xff6f, 0x7000 },
+  { 0x8500, 0xff4f, 0x6fe0 },
+  { 0x9000, 0xff3f, 0x5000 },
+  { 0x8900, 0xff37, 0x4020 },
+  { 0x8900, 0xff33, 0x3020 },
+  { 0x8900, 0xff31, 0x2020 },
+  { 0x0900, 0xff30, 0x0020 },
+  { 0x0900, 0xff32, 0x0020 },
+  { 0x8900, 0xff35, 0x2020 },
+  { 0x0900, 0xff34, 0x0020 },
+  { 0x0900, 0xff36, 0x0020 },
+  { 0x9600, 0xff3b, 0x3000 },
+  { 0x8900, 0xff39, 0x2020 },
+  { 0x0900, 0xff38, 0x0020 },
+  { 0x0900, 0xff3a, 0x0020 },
+  { 0x9200, 0xff3d, 0x2000 },
+  { 0x1500, 0xff3c, 0x0000 },
+  { 0x1800, 0xff3e, 0x0000 },
+  { 0x8500, 0xff47, 0x4fe0 },
+  { 0x8500, 0xff43, 0x3fe0 },
+  { 0x8500, 0xff41, 0x2fe0 },
+  { 0x1800, 0xff40, 0x0000 },
+  { 0x0500, 0xff42, 0x0fe0 },
+  { 0x8500, 0xff45, 0x2fe0 },
+  { 0x0500, 0xff44, 0x0fe0 },
+  { 0x0500, 0xff46, 0x0fe0 },
+  { 0x8500, 0xff4b, 0x3fe0 },
+  { 0x8500, 0xff49, 0x2fe0 },
+  { 0x0500, 0xff48, 0x0fe0 },
+  { 0x0500, 0xff4a, 0x0fe0 },
+  { 0x8500, 0xff4d, 0x2fe0 },
+  { 0x0500, 0xff4c, 0x0fe0 },
+  { 0x0500, 0xff4e, 0x0fe0 },
+  { 0x9600, 0xff5f, 0x5000 },
+  { 0x8500, 0xff57, 0x4fe0 },
+  { 0x8500, 0xff53, 0x3fe0 },
+  { 0x8500, 0xff51, 0x2fe0 },
+  { 0x0500, 0xff50, 0x0fe0 },
+  { 0x0500, 0xff52, 0x0fe0 },
+  { 0x8500, 0xff55, 0x2fe0 },
+  { 0x0500, 0xff54, 0x0fe0 },
+  { 0x0500, 0xff56, 0x0fe0 },
+  { 0x9600, 0xff5b, 0x3000 },
+  { 0x8500, 0xff59, 0x2fe0 },
+  { 0x0500, 0xff58, 0x0fe0 },
+  { 0x0500, 0xff5a, 0x0fe0 },
+  { 0x9200, 0xff5d, 0x2000 },
+  { 0x1900, 0xff5c, 0x0000 },
+  { 0x1900, 0xff5e, 0x0000 },
+  { 0x8700, 0xff67, 0x4000 },
+  { 0x9200, 0xff63, 0x3000 },
+  { 0x9500, 0xff61, 0x2000 },
+  { 0x1200, 0xff60, 0x0000 },
+  { 0x1600, 0xff62, 0x0000 },
+  { 0x9000, 0xff65, 0x2000 },
+  { 0x1500, 0xff64, 0x0000 },
+  { 0x0700, 0xff66, 0x0000 },
+  { 0x8700, 0xff6b, 0x3000 },
+  { 0x8700, 0xff69, 0x2000 },
+  { 0x0700, 0xff68, 0x0000 },
+  { 0x0700, 0xff6a, 0x0000 },
+  { 0x8700, 0xff6d, 0x2000 },
+  { 0x0700, 0xff6c, 0x0000 },
+  { 0x0700, 0xff6e, 0x0000 },
+  { 0x8700, 0xff8f, 0x6000 },
+  { 0x8700, 0xff7f, 0x5000 },
+  { 0x8700, 0xff77, 0x4000 },
+  { 0x8700, 0xff73, 0x3000 },
+  { 0x8700, 0xff71, 0x2000 },
+  { 0x0600, 0xff70, 0x0000 },
+  { 0x0700, 0xff72, 0x0000 },
+  { 0x8700, 0xff75, 0x2000 },
+  { 0x0700, 0xff74, 0x0000 },
+  { 0x0700, 0xff76, 0x0000 },
+  { 0x8700, 0xff7b, 0x3000 },
+  { 0x8700, 0xff79, 0x2000 },
+  { 0x0700, 0xff78, 0x0000 },
+  { 0x0700, 0xff7a, 0x0000 },
+  { 0x8700, 0xff7d, 0x2000 },
+  { 0x0700, 0xff7c, 0x0000 },
+  { 0x0700, 0xff7e, 0x0000 },
+  { 0x8700, 0xff87, 0x4000 },
+  { 0x8700, 0xff83, 0x3000 },
+  { 0x8700, 0xff81, 0x2000 },
+  { 0x0700, 0xff80, 0x0000 },
+  { 0x0700, 0xff82, 0x0000 },
+  { 0x8700, 0xff85, 0x2000 },
+  { 0x0700, 0xff84, 0x0000 },
+  { 0x0700, 0xff86, 0x0000 },
+  { 0x8700, 0xff8b, 0x3000 },
+  { 0x8700, 0xff89, 0x2000 },
+  { 0x0700, 0xff88, 0x0000 },
+  { 0x0700, 0xff8a, 0x0000 },
+  { 0x8700, 0xff8d, 0x2000 },
+  { 0x0700, 0xff8c, 0x0000 },
+  { 0x0700, 0xff8e, 0x0000 },
+  { 0x8600, 0xff9f, 0x5000 },
+  { 0x8700, 0xff97, 0x4000 },
+  { 0x8700, 0xff93, 0x3000 },
+  { 0x8700, 0xff91, 0x2000 },
+  { 0x0700, 0xff90, 0x0000 },
+  { 0x0700, 0xff92, 0x0000 },
+  { 0x8700, 0xff95, 0x2000 },
+  { 0x0700, 0xff94, 0x0000 },
+  { 0x0700, 0xff96, 0x0000 },
+  { 0x8700, 0xff9b, 0x3000 },
+  { 0x8700, 0xff99, 0x2000 },
+  { 0x0700, 0xff98, 0x0000 },
+  { 0x0700, 0xff9a, 0x0000 },
+  { 0x8700, 0xff9d, 0x2000 },
+  { 0x0700, 0xff9c, 0x0000 },
+  { 0x0600, 0xff9e, 0x0000 },
+  { 0x8700, 0xffa7, 0x4000 },
+  { 0x8700, 0xffa3, 0x3000 },
+  { 0x8700, 0xffa1, 0x2000 },
+  { 0x0700, 0xffa0, 0x0000 },
+  { 0x0700, 0xffa2, 0x0000 },
+  { 0x8700, 0xffa5, 0x2000 },
+  { 0x0700, 0xffa4, 0x0000 },
+  { 0x0700, 0xffa6, 0x0000 },
+  { 0x8700, 0xffab, 0x3000 },
+  { 0x8700, 0xffa9, 0x2000 },
+  { 0x0700, 0xffa8, 0x0000 },
+  { 0x0700, 0xffaa, 0x0000 },
+  { 0x8700, 0xffad, 0x2000 },
+  { 0x0700, 0xffac, 0x0000 },
+  { 0x0700, 0xffae, 0x0000 },
+  { 0x8701, 0x004c, 0x8000 },
+  { 0x8701, 0x0008, 0x7000 },
+  { 0x8700, 0xffd6, 0x6000 },
+  { 0x8700, 0xffc2, 0x5000 },
+  { 0x8700, 0xffb7, 0x4000 },
+  { 0x8700, 0xffb3, 0x3000 },
+  { 0x8700, 0xffb1, 0x2000 },
+  { 0x0700, 0xffb0, 0x0000 },
+  { 0x0700, 0xffb2, 0x0000 },
+  { 0x8700, 0xffb5, 0x2000 },
+  { 0x0700, 0xffb4, 0x0000 },
+  { 0x0700, 0xffb6, 0x0000 },
+  { 0x8700, 0xffbb, 0x3000 },
+  { 0x8700, 0xffb9, 0x2000 },
+  { 0x0700, 0xffb8, 0x0000 },
+  { 0x0700, 0xffba, 0x0000 },
+  { 0x8700, 0xffbd, 0x2000 },
+  { 0x0700, 0xffbc, 0x0000 },
+  { 0x0700, 0xffbe, 0x0000 },
+  { 0x8700, 0xffcc, 0x4000 },
+  { 0x8700, 0xffc6, 0x3000 },
+  { 0x8700, 0xffc4, 0x2000 },
+  { 0x0700, 0xffc3, 0x0000 },
+  { 0x0700, 0xffc5, 0x0000 },
+  { 0x8700, 0xffca, 0x2000 },
+  { 0x0700, 0xffc7, 0x0000 },
+  { 0x0700, 0xffcb, 0x0000 },
+  { 0x8700, 0xffd2, 0x3000 },
+  { 0x8700, 0xffce, 0x2000 },
+  { 0x0700, 0xffcd, 0x0000 },
+  { 0x0700, 0xffcf, 0x0000 },
+  { 0x8700, 0xffd4, 0x2000 },
+  { 0x0700, 0xffd3, 0x0000 },
+  { 0x0700, 0xffd5, 0x0000 },
+  { 0x9900, 0xffec, 0x5000 },
+  { 0x9800, 0xffe3, 0x4000 },
+  { 0x8700, 0xffdc, 0x3000 },
+  { 0x8700, 0xffda, 0x2000 },
+  { 0x0700, 0xffd7, 0x0000 },
+  { 0x0700, 0xffdb, 0x0000 },
+  { 0x9700, 0xffe1, 0x2000 },
+  { 0x1700, 0xffe0, 0x0000 },
+  { 0x1900, 0xffe2, 0x0000 },
+  { 0x9a00, 0xffe8, 0x3000 },
+  { 0x9700, 0xffe5, 0x2000 },
+  { 0x1a00, 0xffe4, 0x0000 },
+  { 0x1700, 0xffe6, 0x0000 },
+  { 0x9900, 0xffea, 0x2000 },
+  { 0x1900, 0xffe9, 0x0000 },
+  { 0x1900, 0xffeb, 0x0000 },
+  { 0x8701, 0x0000, 0x4000 },
+  { 0x8100, 0xfffa, 0x3000 },
+  { 0x9a00, 0xffee, 0x2000 },
+  { 0x1a00, 0xffed, 0x0000 },
+  { 0x0100, 0xfff9, 0x0000 },
+  { 0x9a00, 0xfffc, 0x2000 },
+  { 0x0100, 0xfffb, 0x0000 },
+  { 0x1a00, 0xfffd, 0x0000 },
+  { 0x8701, 0x0004, 0x3000 },
+  { 0x8701, 0x0002, 0x2000 },
+  { 0x0701, 0x0001, 0x0000 },
+  { 0x0701, 0x0003, 0x0000 },
+  { 0x8701, 0x0006, 0x2000 },
+  { 0x0701, 0x0005, 0x0000 },
+  { 0x0701, 0x0007, 0x0000 },
+  { 0x8701, 0x002a, 0x6000 },
+  { 0x8701, 0x0019, 0x5000 },
+  { 0x8701, 0x0011, 0x4000 },
+  { 0x8701, 0x000d, 0x3000 },
+  { 0x8701, 0x000a, 0x2000 },
+  { 0x0701, 0x0009, 0x0000 },
+  { 0x0701, 0x000b, 0x0000 },
+  { 0x8701, 0x000f, 0x2000 },
+  { 0x0701, 0x000e, 0x0000 },
+  { 0x0701, 0x0010, 0x0000 },
+  { 0x8701, 0x0015, 0x3000 },
+  { 0x8701, 0x0013, 0x2000 },
+  { 0x0701, 0x0012, 0x0000 },
+  { 0x0701, 0x0014, 0x0000 },
+  { 0x8701, 0x0017, 0x2000 },
+  { 0x0701, 0x0016, 0x0000 },
+  { 0x0701, 0x0018, 0x0000 },
+  { 0x8701, 0x0021, 0x4000 },
+  { 0x8701, 0x001d, 0x3000 },
+  { 0x8701, 0x001b, 0x2000 },
+  { 0x0701, 0x001a, 0x0000 },
+  { 0x0701, 0x001c, 0x0000 },
+  { 0x8701, 0x001f, 0x2000 },
+  { 0x0701, 0x001e, 0x0000 },
+  { 0x0701, 0x0020, 0x0000 },
+  { 0x8701, 0x0025, 0x3000 },
+  { 0x8701, 0x0023, 0x2000 },
+  { 0x0701, 0x0022, 0x0000 },
+  { 0x0701, 0x0024, 0x0000 },
+  { 0x8701, 0x0028, 0x2000 },
+  { 0x0701, 0x0026, 0x0000 },
+  { 0x0701, 0x0029, 0x0000 },
+  { 0x8701, 0x003a, 0x5000 },
+  { 0x8701, 0x0032, 0x4000 },
+  { 0x8701, 0x002e, 0x3000 },
+  { 0x8701, 0x002c, 0x2000 },
+  { 0x0701, 0x002b, 0x0000 },
+  { 0x0701, 0x002d, 0x0000 },
+  { 0x8701, 0x0030, 0x2000 },
+  { 0x0701, 0x002f, 0x0000 },
+  { 0x0701, 0x0031, 0x0000 },
+  { 0x8701, 0x0036, 0x3000 },
+  { 0x8701, 0x0034, 0x2000 },
+  { 0x0701, 0x0033, 0x0000 },
+  { 0x0701, 0x0035, 0x0000 },
+  { 0x8701, 0x0038, 0x2000 },
+  { 0x0701, 0x0037, 0x0000 },
+  { 0x0701, 0x0039, 0x0000 },
+  { 0x8701, 0x0044, 0x4000 },
+  { 0x8701, 0x0040, 0x3000 },
+  { 0x8701, 0x003d, 0x2000 },
+  { 0x0701, 0x003c, 0x0000 },
+  { 0x0701, 0x003f, 0x0000 },
+  { 0x8701, 0x0042, 0x2000 },
+  { 0x0701, 0x0041, 0x0000 },
+  { 0x0701, 0x0043, 0x0000 },
+  { 0x8701, 0x0048, 0x3000 },
+  { 0x8701, 0x0046, 0x2000 },
+  { 0x0701, 0x0045, 0x0000 },
+  { 0x0701, 0x0047, 0x0000 },
+  { 0x8701, 0x004a, 0x2000 },
+  { 0x0701, 0x0049, 0x0000 },
+  { 0x0701, 0x004b, 0x0000 },
+  { 0x8701, 0x00b0, 0x7000 },
+  { 0x8701, 0x0090, 0x6000 },
+  { 0x8701, 0x0080, 0x5000 },
+  { 0x8701, 0x0056, 0x4000 },
+  { 0x8701, 0x0052, 0x3000 },
+  { 0x8701, 0x0050, 0x2000 },
+  { 0x0701, 0x004d, 0x0000 },
+  { 0x0701, 0x0051, 0x0000 },
+  { 0x8701, 0x0054, 0x2000 },
+  { 0x0701, 0x0053, 0x0000 },
+  { 0x0701, 0x0055, 0x0000 },
+  { 0x8701, 0x005a, 0x3000 },
+  { 0x8701, 0x0058, 0x2000 },
+  { 0x0701, 0x0057, 0x0000 },
+  { 0x0701, 0x0059, 0x0000 },
+  { 0x8701, 0x005c, 0x2000 },
+  { 0x0701, 0x005b, 0x0000 },
+  { 0x0701, 0x005d, 0x0000 },
+  { 0x8701, 0x0088, 0x4000 },
+  { 0x8701, 0x0084, 0x3000 },
+  { 0x8701, 0x0082, 0x2000 },
+  { 0x0701, 0x0081, 0x0000 },
+  { 0x0701, 0x0083, 0x0000 },
+  { 0x8701, 0x0086, 0x2000 },
+  { 0x0701, 0x0085, 0x0000 },
+  { 0x0701, 0x0087, 0x0000 },
+  { 0x8701, 0x008c, 0x3000 },
+  { 0x8701, 0x008a, 0x2000 },
+  { 0x0701, 0x0089, 0x0000 },
+  { 0x0701, 0x008b, 0x0000 },
+  { 0x8701, 0x008e, 0x2000 },
+  { 0x0701, 0x008d, 0x0000 },
+  { 0x0701, 0x008f, 0x0000 },
+  { 0x8701, 0x00a0, 0x5000 },
+  { 0x8701, 0x0098, 0x4000 },
+  { 0x8701, 0x0094, 0x3000 },
+  { 0x8701, 0x0092, 0x2000 },
+  { 0x0701, 0x0091, 0x0000 },
+  { 0x0701, 0x0093, 0x0000 },
+  { 0x8701, 0x0096, 0x2000 },
+  { 0x0701, 0x0095, 0x0000 },
+  { 0x0701, 0x0097, 0x0000 },
+  { 0x8701, 0x009c, 0x3000 },
+  { 0x8701, 0x009a, 0x2000 },
+  { 0x0701, 0x0099, 0x0000 },
+  { 0x0701, 0x009b, 0x0000 },
+  { 0x8701, 0x009e, 0x2000 },
+  { 0x0701, 0x009d, 0x0000 },
+  { 0x0701, 0x009f, 0x0000 },
+  { 0x8701, 0x00a8, 0x4000 },
+  { 0x8701, 0x00a4, 0x3000 },
+  { 0x8701, 0x00a2, 0x2000 },
+  { 0x0701, 0x00a1, 0x0000 },
+  { 0x0701, 0x00a3, 0x0000 },
+  { 0x8701, 0x00a6, 0x2000 },
+  { 0x0701, 0x00a5, 0x0000 },
+  { 0x0701, 0x00a7, 0x0000 },
+  { 0x8701, 0x00ac, 0x3000 },
+  { 0x8701, 0x00aa, 0x2000 },
+  { 0x0701, 0x00a9, 0x0000 },
+  { 0x0701, 0x00ab, 0x0000 },
+  { 0x8701, 0x00ae, 0x2000 },
+  { 0x0701, 0x00ad, 0x0000 },
+  { 0x0701, 0x00af, 0x0000 },
+  { 0x8701, 0x00d0, 0x6000 },
+  { 0x8701, 0x00c0, 0x5000 },
+  { 0x8701, 0x00b8, 0x4000 },
+  { 0x8701, 0x00b4, 0x3000 },
+  { 0x8701, 0x00b2, 0x2000 },
+  { 0x0701, 0x00b1, 0x0000 },
+  { 0x0701, 0x00b3, 0x0000 },
+  { 0x8701, 0x00b6, 0x2000 },
+  { 0x0701, 0x00b5, 0x0000 },
+  { 0x0701, 0x00b7, 0x0000 },
+  { 0x8701, 0x00bc, 0x3000 },
+  { 0x8701, 0x00ba, 0x2000 },
+  { 0x0701, 0x00b9, 0x0000 },
+  { 0x0701, 0x00bb, 0x0000 },
+  { 0x8701, 0x00be, 0x2000 },
+  { 0x0701, 0x00bd, 0x0000 },
+  { 0x0701, 0x00bf, 0x0000 },
+  { 0x8701, 0x00c8, 0x4000 },
+  { 0x8701, 0x00c4, 0x3000 },
+  { 0x8701, 0x00c2, 0x2000 },
+  { 0x0701, 0x00c1, 0x0000 },
+  { 0x0701, 0x00c3, 0x0000 },
+  { 0x8701, 0x00c6, 0x2000 },
+  { 0x0701, 0x00c5, 0x0000 },
+  { 0x0701, 0x00c7, 0x0000 },
+  { 0x8701, 0x00cc, 0x3000 },
+  { 0x8701, 0x00ca, 0x2000 },
+  { 0x0701, 0x00c9, 0x0000 },
+  { 0x0701, 0x00cb, 0x0000 },
+  { 0x8701, 0x00ce, 0x2000 },
+  { 0x0701, 0x00cd, 0x0000 },
+  { 0x0701, 0x00cf, 0x0000 },
+  { 0x8701, 0x00e0, 0x5000 },
+  { 0x8701, 0x00d8, 0x4000 },
+  { 0x8701, 0x00d4, 0x3000 },
+  { 0x8701, 0x00d2, 0x2000 },
+  { 0x0701, 0x00d1, 0x0000 },
+  { 0x0701, 0x00d3, 0x0000 },
+  { 0x8701, 0x00d6, 0x2000 },
+  { 0x0701, 0x00d5, 0x0000 },
+  { 0x0701, 0x00d7, 0x0000 },
+  { 0x8701, 0x00dc, 0x3000 },
+  { 0x8701, 0x00da, 0x2000 },
+  { 0x0701, 0x00d9, 0x0000 },
+  { 0x0701, 0x00db, 0x0000 },
+  { 0x8701, 0x00de, 0x2000 },
+  { 0x0701, 0x00dd, 0x0000 },
+  { 0x0701, 0x00df, 0x0000 },
+  { 0x8701, 0x00e8, 0x4000 },
+  { 0x8701, 0x00e4, 0x3000 },
+  { 0x8701, 0x00e2, 0x2000 },
+  { 0x0701, 0x00e1, 0x0000 },
+  { 0x0701, 0x00e3, 0x0000 },
+  { 0x8701, 0x00e6, 0x2000 },
+  { 0x0701, 0x00e5, 0x0000 },
+  { 0x0701, 0x00e7, 0x0000 },
+  { 0x8701, 0x00ec, 0x3000 },
+  { 0x8701, 0x00ea, 0x2000 },
+  { 0x0701, 0x00e9, 0x0000 },
+  { 0x0701, 0x00eb, 0x0000 },
+  { 0x8701, 0x00ee, 0x2000 },
+  { 0x0701, 0x00ed, 0x0000 },
+  { 0x0701, 0x00ef, 0x0000 },
+  { 0x8501, 0xd459, 0xb000 },
+  { 0x9a01, 0xd080, 0xa000 },
+  { 0x8701, 0x045f, 0x9000 },
+  { 0x8701, 0x0349, 0x8000 },
+  { 0x9a01, 0x013c, 0x7000 },
+  { 0x8f01, 0x0119, 0x6000 },
+  { 0x8f01, 0x0109, 0x5000 },
+  { 0x8701, 0x00f8, 0x4000 },
+  { 0x8701, 0x00f4, 0x3000 },
+  { 0x8701, 0x00f2, 0x2000 },
+  { 0x0701, 0x00f1, 0x0000 },
+  { 0x0701, 0x00f3, 0x0000 },
+  { 0x8701, 0x00f6, 0x2000 },
+  { 0x0701, 0x00f5, 0x0000 },
+  { 0x0701, 0x00f7, 0x0000 },
+  { 0x9501, 0x0101, 0x3000 },
+  { 0x8701, 0x00fa, 0x2000 },
+  { 0x0701, 0x00f9, 0x0000 },
+  { 0x1501, 0x0100, 0x0000 },
+  { 0x8f01, 0x0107, 0x2000 },
+  { 0x1a01, 0x0102, 0x0000 },
+  { 0x0f01, 0x0108, 0x0000 },
+  { 0x8f01, 0x0111, 0x4000 },
+  { 0x8f01, 0x010d, 0x3000 },
+  { 0x8f01, 0x010b, 0x2000 },
+  { 0x0f01, 0x010a, 0x0000 },
+  { 0x0f01, 0x010c, 0x0000 },
+  { 0x8f01, 0x010f, 0x2000 },
+  { 0x0f01, 0x010e, 0x0000 },
+  { 0x0f01, 0x0110, 0x0000 },
+  { 0x8f01, 0x0115, 0x3000 },
+  { 0x8f01, 0x0113, 0x2000 },
+  { 0x0f01, 0x0112, 0x0000 },
+  { 0x0f01, 0x0114, 0x0000 },
+  { 0x8f01, 0x0117, 0x2000 },
+  { 0x0f01, 0x0116, 0x0000 },
+  { 0x0f01, 0x0118, 0x0000 },
+  { 0x8f01, 0x0129, 0x5000 },
+  { 0x8f01, 0x0121, 0x4000 },
+  { 0x8f01, 0x011d, 0x3000 },
+  { 0x8f01, 0x011b, 0x2000 },
+  { 0x0f01, 0x011a, 0x0000 },
+  { 0x0f01, 0x011c, 0x0000 },
+  { 0x8f01, 0x011f, 0x2000 },
+  { 0x0f01, 0x011e, 0x0000 },
+  { 0x0f01, 0x0120, 0x0000 },
+  { 0x8f01, 0x0125, 0x3000 },
+  { 0x8f01, 0x0123, 0x2000 },
+  { 0x0f01, 0x0122, 0x0000 },
+  { 0x0f01, 0x0124, 0x0000 },
+  { 0x8f01, 0x0127, 0x2000 },
+  { 0x0f01, 0x0126, 0x0000 },
+  { 0x0f01, 0x0128, 0x0000 },
+  { 0x8f01, 0x0131, 0x4000 },
+  { 0x8f01, 0x012d, 0x3000 },
+  { 0x8f01, 0x012b, 0x2000 },
+  { 0x0f01, 0x012a, 0x0000 },
+  { 0x0f01, 0x012c, 0x0000 },
+  { 0x8f01, 0x012f, 0x2000 },
+  { 0x0f01, 0x012e, 0x0000 },
+  { 0x0f01, 0x0130, 0x0000 },
+  { 0x9a01, 0x0138, 0x3000 },
+  { 0x8f01, 0x0133, 0x2000 },
+  { 0x0f01, 0x0132, 0x0000 },
+  { 0x1a01, 0x0137, 0x0000 },
+  { 0x9a01, 0x013a, 0x2000 },
+  { 0x1a01, 0x0139, 0x0000 },
+  { 0x1a01, 0x013b, 0x0000 },
+  { 0x8701, 0x031c, 0x6000 },
+  { 0x8701, 0x030c, 0x5000 },
+  { 0x8701, 0x0304, 0x4000 },
+  { 0x8701, 0x0300, 0x3000 },
+  { 0x9a01, 0x013e, 0x2000 },
+  { 0x1a01, 0x013d, 0x0000 },
+  { 0x1a01, 0x013f, 0x0000 },
+  { 0x8701, 0x0302, 0x2000 },
+  { 0x0701, 0x0301, 0x0000 },
+  { 0x0701, 0x0303, 0x0000 },
+  { 0x8701, 0x0308, 0x3000 },
+  { 0x8701, 0x0306, 0x2000 },
+  { 0x0701, 0x0305, 0x0000 },
+  { 0x0701, 0x0307, 0x0000 },
+  { 0x8701, 0x030a, 0x2000 },
+  { 0x0701, 0x0309, 0x0000 },
+  { 0x0701, 0x030b, 0x0000 },
+  { 0x8701, 0x0314, 0x4000 },
+  { 0x8701, 0x0310, 0x3000 },
+  { 0x8701, 0x030e, 0x2000 },
+  { 0x0701, 0x030d, 0x0000 },
+  { 0x0701, 0x030f, 0x0000 },
+  { 0x8701, 0x0312, 0x2000 },
+  { 0x0701, 0x0311, 0x0000 },
+  { 0x0701, 0x0313, 0x0000 },
+  { 0x8701, 0x0318, 0x3000 },
+  { 0x8701, 0x0316, 0x2000 },
+  { 0x0701, 0x0315, 0x0000 },
+  { 0x0701, 0x0317, 0x0000 },
+  { 0x8701, 0x031a, 0x2000 },
+  { 0x0701, 0x0319, 0x0000 },
+  { 0x0701, 0x031b, 0x0000 },
+  { 0x8701, 0x0339, 0x5000 },
+  { 0x8701, 0x0331, 0x4000 },
+  { 0x8f01, 0x0321, 0x3000 },
+  { 0x8701, 0x031e, 0x2000 },
+  { 0x0701, 0x031d, 0x0000 },
+  { 0x0f01, 0x0320, 0x0000 },
+  { 0x8f01, 0x0323, 0x2000 },
+  { 0x0f01, 0x0322, 0x0000 },
+  { 0x0701, 0x0330, 0x0000 },
+  { 0x8701, 0x0335, 0x3000 },
+  { 0x8701, 0x0333, 0x2000 },
+  { 0x0701, 0x0332, 0x0000 },
+  { 0x0701, 0x0334, 0x0000 },
+  { 0x8701, 0x0337, 0x2000 },
+  { 0x0701, 0x0336, 0x0000 },
+  { 0x0701, 0x0338, 0x0000 },
+  { 0x8701, 0x0341, 0x4000 },
+  { 0x8701, 0x033d, 0x3000 },
+  { 0x8701, 0x033b, 0x2000 },
+  { 0x0701, 0x033a, 0x0000 },
+  { 0x0701, 0x033c, 0x0000 },
+  { 0x8701, 0x033f, 0x2000 },
+  { 0x0701, 0x033e, 0x0000 },
+  { 0x0701, 0x0340, 0x0000 },
+  { 0x8701, 0x0345, 0x3000 },
+  { 0x8701, 0x0343, 0x2000 },
+  { 0x0701, 0x0342, 0x0000 },
+  { 0x0701, 0x0344, 0x0000 },
+  { 0x8701, 0x0347, 0x2000 },
+  { 0x0701, 0x0346, 0x0000 },
+  { 0x0701, 0x0348, 0x0000 },
+  { 0x8901, 0x041f, 0x7028 },
+  { 0x9501, 0x039f, 0x6000 },
+  { 0x8701, 0x038e, 0x5000 },
+  { 0x8701, 0x0386, 0x4000 },
+  { 0x8701, 0x0382, 0x3000 },
+  { 0x8701, 0x0380, 0x2000 },
+  { 0x0e01, 0x034a, 0x0000 },
+  { 0x0701, 0x0381, 0x0000 },
+  { 0x8701, 0x0384, 0x2000 },
+  { 0x0701, 0x0383, 0x0000 },
+  { 0x0701, 0x0385, 0x0000 },
+  { 0x8701, 0x038a, 0x3000 },
+  { 0x8701, 0x0388, 0x2000 },
+  { 0x0701, 0x0387, 0x0000 },
+  { 0x0701, 0x0389, 0x0000 },
+  { 0x8701, 0x038c, 0x2000 },
+  { 0x0701, 0x038b, 0x0000 },
+  { 0x0701, 0x038d, 0x0000 },
+  { 0x8701, 0x0396, 0x4000 },
+  { 0x8701, 0x0392, 0x3000 },
+  { 0x8701, 0x0390, 0x2000 },
+  { 0x0701, 0x038f, 0x0000 },
+  { 0x0701, 0x0391, 0x0000 },
+  { 0x8701, 0x0394, 0x2000 },
+  { 0x0701, 0x0393, 0x0000 },
+  { 0x0701, 0x0395, 0x0000 },
+  { 0x8701, 0x039a, 0x3000 },
+  { 0x8701, 0x0398, 0x2000 },
+  { 0x0701, 0x0397, 0x0000 },
+  { 0x0701, 0x0399, 0x0000 },
+  { 0x8701, 0x039c, 0x2000 },
+  { 0x0701, 0x039b, 0x0000 },
+  { 0x0701, 0x039d, 0x0000 },
+  { 0x8901, 0x040f, 0x5028 },
+  { 0x8901, 0x0407, 0x4028 },
+  { 0x8901, 0x0403, 0x3028 },
+  { 0x8901, 0x0401, 0x2028 },
+  { 0x0901, 0x0400, 0x0028 },
+  { 0x0901, 0x0402, 0x0028 },
+  { 0x8901, 0x0405, 0x2028 },
+  { 0x0901, 0x0404, 0x0028 },
+  { 0x0901, 0x0406, 0x0028 },
+  { 0x8901, 0x040b, 0x3028 },
+  { 0x8901, 0x0409, 0x2028 },
+  { 0x0901, 0x0408, 0x0028 },
+  { 0x0901, 0x040a, 0x0028 },
+  { 0x8901, 0x040d, 0x2028 },
+  { 0x0901, 0x040c, 0x0028 },
+  { 0x0901, 0x040e, 0x0028 },
+  { 0x8901, 0x0417, 0x4028 },
+  { 0x8901, 0x0413, 0x3028 },
+  { 0x8901, 0x0411, 0x2028 },
+  { 0x0901, 0x0410, 0x0028 },
+  { 0x0901, 0x0412, 0x0028 },
+  { 0x8901, 0x0415, 0x2028 },
+  { 0x0901, 0x0414, 0x0028 },
+  { 0x0901, 0x0416, 0x0028 },
+  { 0x8901, 0x041b, 0x3028 },
+  { 0x8901, 0x0419, 0x2028 },
+  { 0x0901, 0x0418, 0x0028 },
+  { 0x0901, 0x041a, 0x0028 },
+  { 0x8901, 0x041d, 0x2028 },
+  { 0x0901, 0x041c, 0x0028 },
+  { 0x0901, 0x041e, 0x0028 },
+  { 0x8501, 0x043f, 0x6fd8 },
+  { 0x8501, 0x042f, 0x5fd8 },
+  { 0x8901, 0x0427, 0x4028 },
+  { 0x8901, 0x0423, 0x3028 },
+  { 0x8901, 0x0421, 0x2028 },
+  { 0x0901, 0x0420, 0x0028 },
+  { 0x0901, 0x0422, 0x0028 },
+  { 0x8901, 0x0425, 0x2028 },
+  { 0x0901, 0x0424, 0x0028 },
+  { 0x0901, 0x0426, 0x0028 },
+  { 0x8501, 0x042b, 0x3fd8 },
+  { 0x8501, 0x0429, 0x2fd8 },
+  { 0x0501, 0x0428, 0x0fd8 },
+  { 0x0501, 0x042a, 0x0fd8 },
+  { 0x8501, 0x042d, 0x2fd8 },
+  { 0x0501, 0x042c, 0x0fd8 },
+  { 0x0501, 0x042e, 0x0fd8 },
+  { 0x8501, 0x0437, 0x4fd8 },
+  { 0x8501, 0x0433, 0x3fd8 },
+  { 0x8501, 0x0431, 0x2fd8 },
+  { 0x0501, 0x0430, 0x0fd8 },
+  { 0x0501, 0x0432, 0x0fd8 },
+  { 0x8501, 0x0435, 0x2fd8 },
+  { 0x0501, 0x0434, 0x0fd8 },
+  { 0x0501, 0x0436, 0x0fd8 },
+  { 0x8501, 0x043b, 0x3fd8 },
+  { 0x8501, 0x0439, 0x2fd8 },
+  { 0x0501, 0x0438, 0x0fd8 },
+  { 0x0501, 0x043a, 0x0fd8 },
+  { 0x8501, 0x043d, 0x2fd8 },
+  { 0x0501, 0x043c, 0x0fd8 },
+  { 0x0501, 0x043e, 0x0fd8 },
+  { 0x8501, 0x044f, 0x5fd8 },
+  { 0x8501, 0x0447, 0x4fd8 },
+  { 0x8501, 0x0443, 0x3fd8 },
+  { 0x8501, 0x0441, 0x2fd8 },
+  { 0x0501, 0x0440, 0x0fd8 },
+  { 0x0501, 0x0442, 0x0fd8 },
+  { 0x8501, 0x0445, 0x2fd8 },
+  { 0x0501, 0x0444, 0x0fd8 },
+  { 0x0501, 0x0446, 0x0fd8 },
+  { 0x8501, 0x044b, 0x3fd8 },
+  { 0x8501, 0x0449, 0x2fd8 },
+  { 0x0501, 0x0448, 0x0fd8 },
+  { 0x0501, 0x044a, 0x0fd8 },
+  { 0x8501, 0x044d, 0x2fd8 },
+  { 0x0501, 0x044c, 0x0fd8 },
+  { 0x0501, 0x044e, 0x0fd8 },
+  { 0x8701, 0x0457, 0x4000 },
+  { 0x8701, 0x0453, 0x3000 },
+  { 0x8701, 0x0451, 0x2000 },
+  { 0x0701, 0x0450, 0x0000 },
+  { 0x0701, 0x0452, 0x0000 },
+  { 0x8701, 0x0455, 0x2000 },
+  { 0x0701, 0x0454, 0x0000 },
+  { 0x0701, 0x0456, 0x0000 },
+  { 0x8701, 0x045b, 0x3000 },
+  { 0x8701, 0x0459, 0x2000 },
+  { 0x0701, 0x0458, 0x0000 },
+  { 0x0701, 0x045a, 0x0000 },
+  { 0x8701, 0x045d, 0x2000 },
+  { 0x0701, 0x045c, 0x0000 },
+  { 0x0701, 0x045e, 0x0000 },
+  { 0x9a01, 0xd000, 0x8000 },
+  { 0x8d01, 0x04a1, 0x7000 },
+  { 0x8701, 0x047f, 0x6000 },
+  { 0x8701, 0x046f, 0x5000 },
+  { 0x8701, 0x0467, 0x4000 },
+  { 0x8701, 0x0463, 0x3000 },
+  { 0x8701, 0x0461, 0x2000 },
+  { 0x0701, 0x0460, 0x0000 },
+  { 0x0701, 0x0462, 0x0000 },
+  { 0x8701, 0x0465, 0x2000 },
+  { 0x0701, 0x0464, 0x0000 },
+  { 0x0701, 0x0466, 0x0000 },
+  { 0x8701, 0x046b, 0x3000 },
+  { 0x8701, 0x0469, 0x2000 },
+  { 0x0701, 0x0468, 0x0000 },
+  { 0x0701, 0x046a, 0x0000 },
+  { 0x8701, 0x046d, 0x2000 },
+  { 0x0701, 0x046c, 0x0000 },
+  { 0x0701, 0x046e, 0x0000 },
+  { 0x8701, 0x0477, 0x4000 },
+  { 0x8701, 0x0473, 0x3000 },
+  { 0x8701, 0x0471, 0x2000 },
+  { 0x0701, 0x0470, 0x0000 },
+  { 0x0701, 0x0472, 0x0000 },
+  { 0x8701, 0x0475, 0x2000 },
+  { 0x0701, 0x0474, 0x0000 },
+  { 0x0701, 0x0476, 0x0000 },
+  { 0x8701, 0x047b, 0x3000 },
+  { 0x8701, 0x0479, 0x2000 },
+  { 0x0701, 0x0478, 0x0000 },
+  { 0x0701, 0x047a, 0x0000 },
+  { 0x8701, 0x047d, 0x2000 },
+  { 0x0701, 0x047c, 0x0000 },
+  { 0x0701, 0x047e, 0x0000 },
+  { 0x8701, 0x048f, 0x5000 },
+  { 0x8701, 0x0487, 0x4000 },
+  { 0x8701, 0x0483, 0x3000 },
+  { 0x8701, 0x0481, 0x2000 },
+  { 0x0701, 0x0480, 0x0000 },
+  { 0x0701, 0x0482, 0x0000 },
+  { 0x8701, 0x0485, 0x2000 },
+  { 0x0701, 0x0484, 0x0000 },
+  { 0x0701, 0x0486, 0x0000 },
+  { 0x8701, 0x048b, 0x3000 },
+  { 0x8701, 0x0489, 0x2000 },
+  { 0x0701, 0x0488, 0x0000 },
+  { 0x0701, 0x048a, 0x0000 },
+  { 0x8701, 0x048d, 0x2000 },
+  { 0x0701, 0x048c, 0x0000 },
+  { 0x0701, 0x048e, 0x0000 },
+  { 0x8701, 0x0497, 0x4000 },
+  { 0x8701, 0x0493, 0x3000 },
+  { 0x8701, 0x0491, 0x2000 },
+  { 0x0701, 0x0490, 0x0000 },
+  { 0x0701, 0x0492, 0x0000 },
+  { 0x8701, 0x0495, 0x2000 },
+  { 0x0701, 0x0494, 0x0000 },
+  { 0x0701, 0x0496, 0x0000 },
+  { 0x8701, 0x049b, 0x3000 },
+  { 0x8701, 0x0499, 0x2000 },
+  { 0x0701, 0x0498, 0x0000 },
+  { 0x0701, 0x049a, 0x0000 },
+  { 0x8701, 0x049d, 0x2000 },
+  { 0x0701, 0x049c, 0x0000 },
+  { 0x0d01, 0x04a0, 0x0000 },
+  { 0x8701, 0x081a, 0x6000 },
+  { 0x8701, 0x080a, 0x5000 },
+  { 0x8d01, 0x04a9, 0x4000 },
+  { 0x8d01, 0x04a5, 0x3000 },
+  { 0x8d01, 0x04a3, 0x2000 },
+  { 0x0d01, 0x04a2, 0x0000 },
+  { 0x0d01, 0x04a4, 0x0000 },
+  { 0x8d01, 0x04a7, 0x2000 },
+  { 0x0d01, 0x04a6, 0x0000 },
+  { 0x0d01, 0x04a8, 0x0000 },
+  { 0x8701, 0x0803, 0x3000 },
+  { 0x8701, 0x0801, 0x2000 },
+  { 0x0701, 0x0800, 0x0000 },
+  { 0x0701, 0x0802, 0x0000 },
+  { 0x8701, 0x0805, 0x2000 },
+  { 0x0701, 0x0804, 0x0000 },
+  { 0x0701, 0x0808, 0x0000 },
+  { 0x8701, 0x0812, 0x4000 },
+  { 0x8701, 0x080e, 0x3000 },
+  { 0x8701, 0x080c, 0x2000 },
+  { 0x0701, 0x080b, 0x0000 },
+  { 0x0701, 0x080d, 0x0000 },
+  { 0x8701, 0x0810, 0x2000 },
+  { 0x0701, 0x080f, 0x0000 },
+  { 0x0701, 0x0811, 0x0000 },
+  { 0x8701, 0x0816, 0x3000 },
+  { 0x8701, 0x0814, 0x2000 },
+  { 0x0701, 0x0813, 0x0000 },
+  { 0x0701, 0x0815, 0x0000 },
+  { 0x8701, 0x0818, 0x2000 },
+  { 0x0701, 0x0817, 0x0000 },
+  { 0x0701, 0x0819, 0x0000 },
+  { 0x8701, 0x082a, 0x5000 },
+  { 0x8701, 0x0822, 0x4000 },
+  { 0x8701, 0x081e, 0x3000 },
+  { 0x8701, 0x081c, 0x2000 },
+  { 0x0701, 0x081b, 0x0000 },
+  { 0x0701, 0x081d, 0x0000 },
+  { 0x8701, 0x0820, 0x2000 },
+  { 0x0701, 0x081f, 0x0000 },
+  { 0x0701, 0x0821, 0x0000 },
+  { 0x8701, 0x0826, 0x3000 },
+  { 0x8701, 0x0824, 0x2000 },
+  { 0x0701, 0x0823, 0x0000 },
+  { 0x0701, 0x0825, 0x0000 },
+  { 0x8701, 0x0828, 0x2000 },
+  { 0x0701, 0x0827, 0x0000 },
+  { 0x0701, 0x0829, 0x0000 },
+  { 0x8701, 0x0832, 0x4000 },
+  { 0x8701, 0x082e, 0x3000 },
+  { 0x8701, 0x082c, 0x2000 },
+  { 0x0701, 0x082b, 0x0000 },
+  { 0x0701, 0x082d, 0x0000 },
+  { 0x8701, 0x0830, 0x2000 },
+  { 0x0701, 0x082f, 0x0000 },
+  { 0x0701, 0x0831, 0x0000 },
+  { 0x8701, 0x0837, 0x3000 },
+  { 0x8701, 0x0834, 0x2000 },
+  { 0x0701, 0x0833, 0x0000 },
+  { 0x0701, 0x0835, 0x0000 },
+  { 0x8701, 0x083c, 0x2000 },
+  { 0x0701, 0x0838, 0x0000 },
+  { 0x0701, 0x083f, 0x0000 },
+  { 0x9a01, 0xd040, 0x7000 },
+  { 0x9a01, 0xd020, 0x6000 },
+  { 0x9a01, 0xd010, 0x5000 },
+  { 0x9a01, 0xd008, 0x4000 },
+  { 0x9a01, 0xd004, 0x3000 },
+  { 0x9a01, 0xd002, 0x2000 },
+  { 0x1a01, 0xd001, 0x0000 },
+  { 0x1a01, 0xd003, 0x0000 },
+  { 0x9a01, 0xd006, 0x2000 },
+  { 0x1a01, 0xd005, 0x0000 },
+  { 0x1a01, 0xd007, 0x0000 },
+  { 0x9a01, 0xd00c, 0x3000 },
+  { 0x9a01, 0xd00a, 0x2000 },
+  { 0x1a01, 0xd009, 0x0000 },
+  { 0x1a01, 0xd00b, 0x0000 },
+  { 0x9a01, 0xd00e, 0x2000 },
+  { 0x1a01, 0xd00d, 0x0000 },
+  { 0x1a01, 0xd00f, 0x0000 },
+  { 0x9a01, 0xd018, 0x4000 },
+  { 0x9a01, 0xd014, 0x3000 },
+  { 0x9a01, 0xd012, 0x2000 },
+  { 0x1a01, 0xd011, 0x0000 },
+  { 0x1a01, 0xd013, 0x0000 },
+  { 0x9a01, 0xd016, 0x2000 },
+  { 0x1a01, 0xd015, 0x0000 },
+  { 0x1a01, 0xd017, 0x0000 },
+  { 0x9a01, 0xd01c, 0x3000 },
+  { 0x9a01, 0xd01a, 0x2000 },
+  { 0x1a01, 0xd019, 0x0000 },
+  { 0x1a01, 0xd01b, 0x0000 },
+  { 0x9a01, 0xd01e, 0x2000 },
+  { 0x1a01, 0xd01d, 0x0000 },
+  { 0x1a01, 0xd01f, 0x0000 },
+  { 0x9a01, 0xd030, 0x5000 },
+  { 0x9a01, 0xd028, 0x4000 },
+  { 0x9a01, 0xd024, 0x3000 },
+  { 0x9a01, 0xd022, 0x2000 },
+  { 0x1a01, 0xd021, 0x0000 },
+  { 0x1a01, 0xd023, 0x0000 },
+  { 0x9a01, 0xd026, 0x2000 },
+  { 0x1a01, 0xd025, 0x0000 },
+  { 0x1a01, 0xd027, 0x0000 },
+  { 0x9a01, 0xd02c, 0x3000 },
+  { 0x9a01, 0xd02a, 0x2000 },
+  { 0x1a01, 0xd029, 0x0000 },
+  { 0x1a01, 0xd02b, 0x0000 },
+  { 0x9a01, 0xd02e, 0x2000 },
+  { 0x1a01, 0xd02d, 0x0000 },
+  { 0x1a01, 0xd02f, 0x0000 },
+  { 0x9a01, 0xd038, 0x4000 },
+  { 0x9a01, 0xd034, 0x3000 },
+  { 0x9a01, 0xd032, 0x2000 },
+  { 0x1a01, 0xd031, 0x0000 },
+  { 0x1a01, 0xd033, 0x0000 },
+  { 0x9a01, 0xd036, 0x2000 },
+  { 0x1a01, 0xd035, 0x0000 },
+  { 0x1a01, 0xd037, 0x0000 },
+  { 0x9a01, 0xd03c, 0x3000 },
+  { 0x9a01, 0xd03a, 0x2000 },
+  { 0x1a01, 0xd039, 0x0000 },
+  { 0x1a01, 0xd03b, 0x0000 },
+  { 0x9a01, 0xd03e, 0x2000 },
+  { 0x1a01, 0xd03d, 0x0000 },
+  { 0x1a01, 0xd03f, 0x0000 },
+  { 0x9a01, 0xd060, 0x6000 },
+  { 0x9a01, 0xd050, 0x5000 },
+  { 0x9a01, 0xd048, 0x4000 },
+  { 0x9a01, 0xd044, 0x3000 },
+  { 0x9a01, 0xd042, 0x2000 },
+  { 0x1a01, 0xd041, 0x0000 },
+  { 0x1a01, 0xd043, 0x0000 },
+  { 0x9a01, 0xd046, 0x2000 },
+  { 0x1a01, 0xd045, 0x0000 },
+  { 0x1a01, 0xd047, 0x0000 },
+  { 0x9a01, 0xd04c, 0x3000 },
+  { 0x9a01, 0xd04a, 0x2000 },
+  { 0x1a01, 0xd049, 0x0000 },
+  { 0x1a01, 0xd04b, 0x0000 },
+  { 0x9a01, 0xd04e, 0x2000 },
+  { 0x1a01, 0xd04d, 0x0000 },
+  { 0x1a01, 0xd04f, 0x0000 },
+  { 0x9a01, 0xd058, 0x4000 },
+  { 0x9a01, 0xd054, 0x3000 },
+  { 0x9a01, 0xd052, 0x2000 },
+  { 0x1a01, 0xd051, 0x0000 },
+  { 0x1a01, 0xd053, 0x0000 },
+  { 0x9a01, 0xd056, 0x2000 },
+  { 0x1a01, 0xd055, 0x0000 },
+  { 0x1a01, 0xd057, 0x0000 },
+  { 0x9a01, 0xd05c, 0x3000 },
+  { 0x9a01, 0xd05a, 0x2000 },
+  { 0x1a01, 0xd059, 0x0000 },
+  { 0x1a01, 0xd05b, 0x0000 },
+  { 0x9a01, 0xd05e, 0x2000 },
+  { 0x1a01, 0xd05d, 0x0000 },
+  { 0x1a01, 0xd05f, 0x0000 },
+  { 0x9a01, 0xd070, 0x5000 },
+  { 0x9a01, 0xd068, 0x4000 },
+  { 0x9a01, 0xd064, 0x3000 },
+  { 0x9a01, 0xd062, 0x2000 },
+  { 0x1a01, 0xd061, 0x0000 },
+  { 0x1a01, 0xd063, 0x0000 },
+  { 0x9a01, 0xd066, 0x2000 },
+  { 0x1a01, 0xd065, 0x0000 },
+  { 0x1a01, 0xd067, 0x0000 },
+  { 0x9a01, 0xd06c, 0x3000 },
+  { 0x9a01, 0xd06a, 0x2000 },
+  { 0x1a01, 0xd069, 0x0000 },
+  { 0x1a01, 0xd06b, 0x0000 },
+  { 0x9a01, 0xd06e, 0x2000 },
+  { 0x1a01, 0xd06d, 0x0000 },
+  { 0x1a01, 0xd06f, 0x0000 },
+  { 0x9a01, 0xd078, 0x4000 },
+  { 0x9a01, 0xd074, 0x3000 },
+  { 0x9a01, 0xd072, 0x2000 },
+  { 0x1a01, 0xd071, 0x0000 },
+  { 0x1a01, 0xd073, 0x0000 },
+  { 0x9a01, 0xd076, 0x2000 },
+  { 0x1a01, 0xd075, 0x0000 },
+  { 0x1a01, 0xd077, 0x0000 },
+  { 0x9a01, 0xd07c, 0x3000 },
+  { 0x9a01, 0xd07a, 0x2000 },
+  { 0x1a01, 0xd079, 0x0000 },
+  { 0x1a01, 0xd07b, 0x0000 },
+  { 0x9a01, 0xd07e, 0x2000 },
+  { 0x1a01, 0xd07d, 0x0000 },
+  { 0x1a01, 0xd07f, 0x0000 },
+  { 0x9a01, 0xd18d, 0x9000 },
+  { 0x9a01, 0xd10a, 0x8000 },
+  { 0x9a01, 0xd0c0, 0x7000 },
+  { 0x9a01, 0xd0a0, 0x6000 },
+  { 0x9a01, 0xd090, 0x5000 },
+  { 0x9a01, 0xd088, 0x4000 },
+  { 0x9a01, 0xd084, 0x3000 },
+  { 0x9a01, 0xd082, 0x2000 },
+  { 0x1a01, 0xd081, 0x0000 },
+  { 0x1a01, 0xd083, 0x0000 },
+  { 0x9a01, 0xd086, 0x2000 },
+  { 0x1a01, 0xd085, 0x0000 },
+  { 0x1a01, 0xd087, 0x0000 },
+  { 0x9a01, 0xd08c, 0x3000 },
+  { 0x9a01, 0xd08a, 0x2000 },
+  { 0x1a01, 0xd089, 0x0000 },
+  { 0x1a01, 0xd08b, 0x0000 },
+  { 0x9a01, 0xd08e, 0x2000 },
+  { 0x1a01, 0xd08d, 0x0000 },
+  { 0x1a01, 0xd08f, 0x0000 },
+  { 0x9a01, 0xd098, 0x4000 },
+  { 0x9a01, 0xd094, 0x3000 },
+  { 0x9a01, 0xd092, 0x2000 },
+  { 0x1a01, 0xd091, 0x0000 },
+  { 0x1a01, 0xd093, 0x0000 },
+  { 0x9a01, 0xd096, 0x2000 },
+  { 0x1a01, 0xd095, 0x0000 },
+  { 0x1a01, 0xd097, 0x0000 },
+  { 0x9a01, 0xd09c, 0x3000 },
+  { 0x9a01, 0xd09a, 0x2000 },
+  { 0x1a01, 0xd099, 0x0000 },
+  { 0x1a01, 0xd09b, 0x0000 },
+  { 0x9a01, 0xd09e, 0x2000 },
+  { 0x1a01, 0xd09d, 0x0000 },
+  { 0x1a01, 0xd09f, 0x0000 },
+  { 0x9a01, 0xd0b0, 0x5000 },
+  { 0x9a01, 0xd0a8, 0x4000 },
+  { 0x9a01, 0xd0a4, 0x3000 },
+  { 0x9a01, 0xd0a2, 0x2000 },
+  { 0x1a01, 0xd0a1, 0x0000 },
+  { 0x1a01, 0xd0a3, 0x0000 },
+  { 0x9a01, 0xd0a6, 0x2000 },
+  { 0x1a01, 0xd0a5, 0x0000 },
+  { 0x1a01, 0xd0a7, 0x0000 },
+  { 0x9a01, 0xd0ac, 0x3000 },
+  { 0x9a01, 0xd0aa, 0x2000 },
+  { 0x1a01, 0xd0a9, 0x0000 },
+  { 0x1a01, 0xd0ab, 0x0000 },
+  { 0x9a01, 0xd0ae, 0x2000 },
+  { 0x1a01, 0xd0ad, 0x0000 },
+  { 0x1a01, 0xd0af, 0x0000 },
+  { 0x9a01, 0xd0b8, 0x4000 },
+  { 0x9a01, 0xd0b4, 0x3000 },
+  { 0x9a01, 0xd0b2, 0x2000 },
+  { 0x1a01, 0xd0b1, 0x0000 },
+  { 0x1a01, 0xd0b3, 0x0000 },
+  { 0x9a01, 0xd0b6, 0x2000 },
+  { 0x1a01, 0xd0b5, 0x0000 },
+  { 0x1a01, 0xd0b7, 0x0000 },
+  { 0x9a01, 0xd0bc, 0x3000 },
+  { 0x9a01, 0xd0ba, 0x2000 },
+  { 0x1a01, 0xd0b9, 0x0000 },
+  { 0x1a01, 0xd0bb, 0x0000 },
+  { 0x9a01, 0xd0be, 0x2000 },
+  { 0x1a01, 0xd0bd, 0x0000 },
+  { 0x1a01, 0xd0bf, 0x0000 },
+  { 0x9a01, 0xd0e0, 0x6000 },
+  { 0x9a01, 0xd0d0, 0x5000 },
+  { 0x9a01, 0xd0c8, 0x4000 },
+  { 0x9a01, 0xd0c4, 0x3000 },
+  { 0x9a01, 0xd0c2, 0x2000 },
+  { 0x1a01, 0xd0c1, 0x0000 },
+  { 0x1a01, 0xd0c3, 0x0000 },
+  { 0x9a01, 0xd0c6, 0x2000 },
+  { 0x1a01, 0xd0c5, 0x0000 },
+  { 0x1a01, 0xd0c7, 0x0000 },
+  { 0x9a01, 0xd0cc, 0x3000 },
+  { 0x9a01, 0xd0ca, 0x2000 },
+  { 0x1a01, 0xd0c9, 0x0000 },
+  { 0x1a01, 0xd0cb, 0x0000 },
+  { 0x9a01, 0xd0ce, 0x2000 },
+  { 0x1a01, 0xd0cd, 0x0000 },
+  { 0x1a01, 0xd0cf, 0x0000 },
+  { 0x9a01, 0xd0d8, 0x4000 },
+  { 0x9a01, 0xd0d4, 0x3000 },
+  { 0x9a01, 0xd0d2, 0x2000 },
+  { 0x1a01, 0xd0d1, 0x0000 },
+  { 0x1a01, 0xd0d3, 0x0000 },
+  { 0x9a01, 0xd0d6, 0x2000 },
+  { 0x1a01, 0xd0d5, 0x0000 },
+  { 0x1a01, 0xd0d7, 0x0000 },
+  { 0x9a01, 0xd0dc, 0x3000 },
+  { 0x9a01, 0xd0da, 0x2000 },
+  { 0x1a01, 0xd0d9, 0x0000 },
+  { 0x1a01, 0xd0db, 0x0000 },
+  { 0x9a01, 0xd0de, 0x2000 },
+  { 0x1a01, 0xd0dd, 0x0000 },
+  { 0x1a01, 0xd0df, 0x0000 },
+  { 0x9a01, 0xd0f0, 0x5000 },
+  { 0x9a01, 0xd0e8, 0x4000 },
+  { 0x9a01, 0xd0e4, 0x3000 },
+  { 0x9a01, 0xd0e2, 0x2000 },
+  { 0x1a01, 0xd0e1, 0x0000 },
+  { 0x1a01, 0xd0e3, 0x0000 },
+  { 0x9a01, 0xd0e6, 0x2000 },
+  { 0x1a01, 0xd0e5, 0x0000 },
+  { 0x1a01, 0xd0e7, 0x0000 },
+  { 0x9a01, 0xd0ec, 0x3000 },
+  { 0x9a01, 0xd0ea, 0x2000 },
+  { 0x1a01, 0xd0e9, 0x0000 },
+  { 0x1a01, 0xd0eb, 0x0000 },
+  { 0x9a01, 0xd0ee, 0x2000 },
+  { 0x1a01, 0xd0ed, 0x0000 },
+  { 0x1a01, 0xd0ef, 0x0000 },
+  { 0x9a01, 0xd102, 0x4000 },
+  { 0x9a01, 0xd0f4, 0x3000 },
+  { 0x9a01, 0xd0f2, 0x2000 },
+  { 0x1a01, 0xd0f1, 0x0000 },
+  { 0x1a01, 0xd0f3, 0x0000 },
+  { 0x9a01, 0xd100, 0x2000 },
+  { 0x1a01, 0xd0f5, 0x0000 },
+  { 0x1a01, 0xd101, 0x0000 },
+  { 0x9a01, 0xd106, 0x3000 },
+  { 0x9a01, 0xd104, 0x2000 },
+  { 0x1a01, 0xd103, 0x0000 },
+  { 0x1a01, 0xd105, 0x0000 },
+  { 0x9a01, 0xd108, 0x2000 },
+  { 0x1a01, 0xd107, 0x0000 },
+  { 0x1a01, 0xd109, 0x0000 },
+  { 0x9a01, 0xd14d, 0x7000 },
+  { 0x9a01, 0xd12d, 0x6000 },
+  { 0x9a01, 0xd11a, 0x5000 },
+  { 0x9a01, 0xd112, 0x4000 },
+  { 0x9a01, 0xd10e, 0x3000 },
+  { 0x9a01, 0xd10c, 0x2000 },
+  { 0x1a01, 0xd10b, 0x0000 },
+  { 0x1a01, 0xd10d, 0x0000 },
+  { 0x9a01, 0xd110, 0x2000 },
+  { 0x1a01, 0xd10f, 0x0000 },
+  { 0x1a01, 0xd111, 0x0000 },
+  { 0x9a01, 0xd116, 0x3000 },
+  { 0x9a01, 0xd114, 0x2000 },
+  { 0x1a01, 0xd113, 0x0000 },
+  { 0x1a01, 0xd115, 0x0000 },
+  { 0x9a01, 0xd118, 0x2000 },
+  { 0x1a01, 0xd117, 0x0000 },
+  { 0x1a01, 0xd119, 0x0000 },
+  { 0x9a01, 0xd122, 0x4000 },
+  { 0x9a01, 0xd11e, 0x3000 },
+  { 0x9a01, 0xd11c, 0x2000 },
+  { 0x1a01, 0xd11b, 0x0000 },
+  { 0x1a01, 0xd11d, 0x0000 },
+  { 0x9a01, 0xd120, 0x2000 },
+  { 0x1a01, 0xd11f, 0x0000 },
+  { 0x1a01, 0xd121, 0x0000 },
+  { 0x9a01, 0xd126, 0x3000 },
+  { 0x9a01, 0xd124, 0x2000 },
+  { 0x1a01, 0xd123, 0x0000 },
+  { 0x1a01, 0xd125, 0x0000 },
+  { 0x9a01, 0xd12b, 0x2000 },
+  { 0x1a01, 0xd12a, 0x0000 },
+  { 0x1a01, 0xd12c, 0x0000 },
+  { 0x9a01, 0xd13d, 0x5000 },
+  { 0x9a01, 0xd135, 0x4000 },
+  { 0x9a01, 0xd131, 0x3000 },
+  { 0x9a01, 0xd12f, 0x2000 },
+  { 0x1a01, 0xd12e, 0x0000 },
+  { 0x1a01, 0xd130, 0x0000 },
+  { 0x9a01, 0xd133, 0x2000 },
+  { 0x1a01, 0xd132, 0x0000 },
+  { 0x1a01, 0xd134, 0x0000 },
+  { 0x9a01, 0xd139, 0x3000 },
+  { 0x9a01, 0xd137, 0x2000 },
+  { 0x1a01, 0xd136, 0x0000 },
+  { 0x1a01, 0xd138, 0x0000 },
+  { 0x9a01, 0xd13b, 0x2000 },
+  { 0x1a01, 0xd13a, 0x0000 },
+  { 0x1a01, 0xd13c, 0x0000 },
+  { 0x9a01, 0xd145, 0x4000 },
+  { 0x9a01, 0xd141, 0x3000 },
+  { 0x9a01, 0xd13f, 0x2000 },
+  { 0x1a01, 0xd13e, 0x0000 },
+  { 0x1a01, 0xd140, 0x0000 },
+  { 0x9a01, 0xd143, 0x2000 },
+  { 0x1a01, 0xd142, 0x0000 },
+  { 0x1a01, 0xd144, 0x0000 },
+  { 0x9a01, 0xd149, 0x3000 },
+  { 0x9a01, 0xd147, 0x2000 },
+  { 0x1a01, 0xd146, 0x0000 },
+  { 0x1a01, 0xd148, 0x0000 },
+  { 0x9a01, 0xd14b, 0x2000 },
+  { 0x1a01, 0xd14a, 0x0000 },
+  { 0x1a01, 0xd14c, 0x0000 },
+  { 0x8a01, 0xd16d, 0x6000 },
+  { 0x9a01, 0xd15d, 0x5000 },
+  { 0x9a01, 0xd155, 0x4000 },
+  { 0x9a01, 0xd151, 0x3000 },
+  { 0x9a01, 0xd14f, 0x2000 },
+  { 0x1a01, 0xd14e, 0x0000 },
+  { 0x1a01, 0xd150, 0x0000 },
+  { 0x9a01, 0xd153, 0x2000 },
+  { 0x1a01, 0xd152, 0x0000 },
+  { 0x1a01, 0xd154, 0x0000 },
+  { 0x9a01, 0xd159, 0x3000 },
+  { 0x9a01, 0xd157, 0x2000 },
+  { 0x1a01, 0xd156, 0x0000 },
+  { 0x1a01, 0xd158, 0x0000 },
+  { 0x9a01, 0xd15b, 0x2000 },
+  { 0x1a01, 0xd15a, 0x0000 },
+  { 0x1a01, 0xd15c, 0x0000 },
+  { 0x8a01, 0xd165, 0x4000 },
+  { 0x9a01, 0xd161, 0x3000 },
+  { 0x9a01, 0xd15f, 0x2000 },
+  { 0x1a01, 0xd15e, 0x0000 },
+  { 0x1a01, 0xd160, 0x0000 },
+  { 0x9a01, 0xd163, 0x2000 },
+  { 0x1a01, 0xd162, 0x0000 },
+  { 0x1a01, 0xd164, 0x0000 },
+  { 0x8c01, 0xd169, 0x3000 },
+  { 0x8c01, 0xd167, 0x2000 },
+  { 0x0a01, 0xd166, 0x0000 },
+  { 0x0c01, 0xd168, 0x0000 },
+  { 0x9a01, 0xd16b, 0x2000 },
+  { 0x1a01, 0xd16a, 0x0000 },
+  { 0x1a01, 0xd16c, 0x0000 },
+  { 0x8c01, 0xd17d, 0x5000 },
+  { 0x8101, 0xd175, 0x4000 },
+  { 0x8a01, 0xd171, 0x3000 },
+  { 0x8a01, 0xd16f, 0x2000 },
+  { 0x0a01, 0xd16e, 0x0000 },
+  { 0x0a01, 0xd170, 0x0000 },
+  { 0x8101, 0xd173, 0x2000 },
+  { 0x0a01, 0xd172, 0x0000 },
+  { 0x0101, 0xd174, 0x0000 },
+  { 0x8101, 0xd179, 0x3000 },
+  { 0x8101, 0xd177, 0x2000 },
+  { 0x0101, 0xd176, 0x0000 },
+  { 0x0101, 0xd178, 0x0000 },
+  { 0x8c01, 0xd17b, 0x2000 },
+  { 0x0101, 0xd17a, 0x0000 },
+  { 0x0c01, 0xd17c, 0x0000 },
+  { 0x8c01, 0xd185, 0x4000 },
+  { 0x8c01, 0xd181, 0x3000 },
+  { 0x8c01, 0xd17f, 0x2000 },
+  { 0x0c01, 0xd17e, 0x0000 },
+  { 0x0c01, 0xd180, 0x0000 },
+  { 0x9a01, 0xd183, 0x2000 },
+  { 0x0c01, 0xd182, 0x0000 },
+  { 0x1a01, 0xd184, 0x0000 },
+  { 0x8c01, 0xd189, 0x3000 },
+  { 0x8c01, 0xd187, 0x2000 },
+  { 0x0c01, 0xd186, 0x0000 },
+  { 0x0c01, 0xd188, 0x0000 },
+  { 0x8c01, 0xd18b, 0x2000 },
+  { 0x0c01, 0xd18a, 0x0000 },
+  { 0x1a01, 0xd18c, 0x0000 },
+  { 0x9a01, 0xd32f, 0x8000 },
+  { 0x9a01, 0xd1cd, 0x7000 },
+  { 0x8c01, 0xd1ad, 0x6000 },
+  { 0x9a01, 0xd19d, 0x5000 },
+  { 0x9a01, 0xd195, 0x4000 },
+  { 0x9a01, 0xd191, 0x3000 },
+  { 0x9a01, 0xd18f, 0x2000 },
+  { 0x1a01, 0xd18e, 0x0000 },
+  { 0x1a01, 0xd190, 0x0000 },
+  { 0x9a01, 0xd193, 0x2000 },
+  { 0x1a01, 0xd192, 0x0000 },
+  { 0x1a01, 0xd194, 0x0000 },
+  { 0x9a01, 0xd199, 0x3000 },
+  { 0x9a01, 0xd197, 0x2000 },
+  { 0x1a01, 0xd196, 0x0000 },
+  { 0x1a01, 0xd198, 0x0000 },
+  { 0x9a01, 0xd19b, 0x2000 },
+  { 0x1a01, 0xd19a, 0x0000 },
+  { 0x1a01, 0xd19c, 0x0000 },
+  { 0x9a01, 0xd1a5, 0x4000 },
+  { 0x9a01, 0xd1a1, 0x3000 },
+  { 0x9a01, 0xd19f, 0x2000 },
+  { 0x1a01, 0xd19e, 0x0000 },
+  { 0x1a01, 0xd1a0, 0x0000 },
+  { 0x9a01, 0xd1a3, 0x2000 },
+  { 0x1a01, 0xd1a2, 0x0000 },
+  { 0x1a01, 0xd1a4, 0x0000 },
+  { 0x9a01, 0xd1a9, 0x3000 },
+  { 0x9a01, 0xd1a7, 0x2000 },
+  { 0x1a01, 0xd1a6, 0x0000 },
+  { 0x1a01, 0xd1a8, 0x0000 },
+  { 0x8c01, 0xd1ab, 0x2000 },
+  { 0x0c01, 0xd1aa, 0x0000 },
+  { 0x0c01, 0xd1ac, 0x0000 },
+  { 0x9a01, 0xd1bd, 0x5000 },
+  { 0x9a01, 0xd1b5, 0x4000 },
+  { 0x9a01, 0xd1b1, 0x3000 },
+  { 0x9a01, 0xd1af, 0x2000 },
+  { 0x1a01, 0xd1ae, 0x0000 },
+  { 0x1a01, 0xd1b0, 0x0000 },
+  { 0x9a01, 0xd1b3, 0x2000 },
+  { 0x1a01, 0xd1b2, 0x0000 },
+  { 0x1a01, 0xd1b4, 0x0000 },
+  { 0x9a01, 0xd1b9, 0x3000 },
+  { 0x9a01, 0xd1b7, 0x2000 },
+  { 0x1a01, 0xd1b6, 0x0000 },
+  { 0x1a01, 0xd1b8, 0x0000 },
+  { 0x9a01, 0xd1bb, 0x2000 },
+  { 0x1a01, 0xd1ba, 0x0000 },
+  { 0x1a01, 0xd1bc, 0x0000 },
+  { 0x9a01, 0xd1c5, 0x4000 },
+  { 0x9a01, 0xd1c1, 0x3000 },
+  { 0x9a01, 0xd1bf, 0x2000 },
+  { 0x1a01, 0xd1be, 0x0000 },
+  { 0x1a01, 0xd1c0, 0x0000 },
+  { 0x9a01, 0xd1c3, 0x2000 },
+  { 0x1a01, 0xd1c2, 0x0000 },
+  { 0x1a01, 0xd1c4, 0x0000 },
+  { 0x9a01, 0xd1c9, 0x3000 },
+  { 0x9a01, 0xd1c7, 0x2000 },
+  { 0x1a01, 0xd1c6, 0x0000 },
+  { 0x1a01, 0xd1c8, 0x0000 },
+  { 0x9a01, 0xd1cb, 0x2000 },
+  { 0x1a01, 0xd1ca, 0x0000 },
+  { 0x1a01, 0xd1cc, 0x0000 },
+  { 0x9a01, 0xd30f, 0x6000 },
+  { 0x9a01, 0xd1dd, 0x5000 },
+  { 0x9a01, 0xd1d5, 0x4000 },
+  { 0x9a01, 0xd1d1, 0x3000 },
+  { 0x9a01, 0xd1cf, 0x2000 },
+  { 0x1a01, 0xd1ce, 0x0000 },
+  { 0x1a01, 0xd1d0, 0x0000 },
+  { 0x9a01, 0xd1d3, 0x2000 },
+  { 0x1a01, 0xd1d2, 0x0000 },
+  { 0x1a01, 0xd1d4, 0x0000 },
+  { 0x9a01, 0xd1d9, 0x3000 },
+  { 0x9a01, 0xd1d7, 0x2000 },
+  { 0x1a01, 0xd1d6, 0x0000 },
+  { 0x1a01, 0xd1d8, 0x0000 },
+  { 0x9a01, 0xd1db, 0x2000 },
+  { 0x1a01, 0xd1da, 0x0000 },
+  { 0x1a01, 0xd1dc, 0x0000 },
+  { 0x9a01, 0xd307, 0x4000 },
+  { 0x9a01, 0xd303, 0x3000 },
+  { 0x9a01, 0xd301, 0x2000 },
+  { 0x1a01, 0xd300, 0x0000 },
+  { 0x1a01, 0xd302, 0x0000 },
+  { 0x9a01, 0xd305, 0x2000 },
+  { 0x1a01, 0xd304, 0x0000 },
+  { 0x1a01, 0xd306, 0x0000 },
+  { 0x9a01, 0xd30b, 0x3000 },
+  { 0x9a01, 0xd309, 0x2000 },
+  { 0x1a01, 0xd308, 0x0000 },
+  { 0x1a01, 0xd30a, 0x0000 },
+  { 0x9a01, 0xd30d, 0x2000 },
+  { 0x1a01, 0xd30c, 0x0000 },
+  { 0x1a01, 0xd30e, 0x0000 },
+  { 0x9a01, 0xd31f, 0x5000 },
+  { 0x9a01, 0xd317, 0x4000 },
+  { 0x9a01, 0xd313, 0x3000 },
+  { 0x9a01, 0xd311, 0x2000 },
+  { 0x1a01, 0xd310, 0x0000 },
+  { 0x1a01, 0xd312, 0x0000 },
+  { 0x9a01, 0xd315, 0x2000 },
+  { 0x1a01, 0xd314, 0x0000 },
+  { 0x1a01, 0xd316, 0x0000 },
+  { 0x9a01, 0xd31b, 0x3000 },
+  { 0x9a01, 0xd319, 0x2000 },
+  { 0x1a01, 0xd318, 0x0000 },
+  { 0x1a01, 0xd31a, 0x0000 },
+  { 0x9a01, 0xd31d, 0x2000 },
+  { 0x1a01, 0xd31c, 0x0000 },
+  { 0x1a01, 0xd31e, 0x0000 },
+  { 0x9a01, 0xd327, 0x4000 },
+  { 0x9a01, 0xd323, 0x3000 },
+  { 0x9a01, 0xd321, 0x2000 },
+  { 0x1a01, 0xd320, 0x0000 },
+  { 0x1a01, 0xd322, 0x0000 },
+  { 0x9a01, 0xd325, 0x2000 },
+  { 0x1a01, 0xd324, 0x0000 },
+  { 0x1a01, 0xd326, 0x0000 },
+  { 0x9a01, 0xd32b, 0x3000 },
+  { 0x9a01, 0xd329, 0x2000 },
+  { 0x1a01, 0xd328, 0x0000 },
+  { 0x1a01, 0xd32a, 0x0000 },
+  { 0x9a01, 0xd32d, 0x2000 },
+  { 0x1a01, 0xd32c, 0x0000 },
+  { 0x1a01, 0xd32e, 0x0000 },
+  { 0x8901, 0xd418, 0x7000 },
+  { 0x9a01, 0xd34f, 0x6000 },
+  { 0x9a01, 0xd33f, 0x5000 },
+  { 0x9a01, 0xd337, 0x4000 },
+  { 0x9a01, 0xd333, 0x3000 },
+  { 0x9a01, 0xd331, 0x2000 },
+  { 0x1a01, 0xd330, 0x0000 },
+  { 0x1a01, 0xd332, 0x0000 },
+  { 0x9a01, 0xd335, 0x2000 },
+  { 0x1a01, 0xd334, 0x0000 },
+  { 0x1a01, 0xd336, 0x0000 },
+  { 0x9a01, 0xd33b, 0x3000 },
+  { 0x9a01, 0xd339, 0x2000 },
+  { 0x1a01, 0xd338, 0x0000 },
+  { 0x1a01, 0xd33a, 0x0000 },
+  { 0x9a01, 0xd33d, 0x2000 },
+  { 0x1a01, 0xd33c, 0x0000 },
+  { 0x1a01, 0xd33e, 0x0000 },
+  { 0x9a01, 0xd347, 0x4000 },
+  { 0x9a01, 0xd343, 0x3000 },
+  { 0x9a01, 0xd341, 0x2000 },
+  { 0x1a01, 0xd340, 0x0000 },
+  { 0x1a01, 0xd342, 0x0000 },
+  { 0x9a01, 0xd345, 0x2000 },
+  { 0x1a01, 0xd344, 0x0000 },
+  { 0x1a01, 0xd346, 0x0000 },
+  { 0x9a01, 0xd34b, 0x3000 },
+  { 0x9a01, 0xd349, 0x2000 },
+  { 0x1a01, 0xd348, 0x0000 },
+  { 0x1a01, 0xd34a, 0x0000 },
+  { 0x9a01, 0xd34d, 0x2000 },
+  { 0x1a01, 0xd34c, 0x0000 },
+  { 0x1a01, 0xd34e, 0x0000 },
+  { 0x8901, 0xd408, 0x5000 },
+  { 0x8901, 0xd400, 0x4000 },
+  { 0x9a01, 0xd353, 0x3000 },
+  { 0x9a01, 0xd351, 0x2000 },
+  { 0x1a01, 0xd350, 0x0000 },
+  { 0x1a01, 0xd352, 0x0000 },
+  { 0x9a01, 0xd355, 0x2000 },
+  { 0x1a01, 0xd354, 0x0000 },
+  { 0x1a01, 0xd356, 0x0000 },
+  { 0x8901, 0xd404, 0x3000 },
+  { 0x8901, 0xd402, 0x2000 },
+  { 0x0901, 0xd401, 0x0000 },
+  { 0x0901, 0xd403, 0x0000 },
+  { 0x8901, 0xd406, 0x2000 },
+  { 0x0901, 0xd405, 0x0000 },
+  { 0x0901, 0xd407, 0x0000 },
+  { 0x8901, 0xd410, 0x4000 },
+  { 0x8901, 0xd40c, 0x3000 },
+  { 0x8901, 0xd40a, 0x2000 },
+  { 0x0901, 0xd409, 0x0000 },
+  { 0x0901, 0xd40b, 0x0000 },
+  { 0x8901, 0xd40e, 0x2000 },
+  { 0x0901, 0xd40d, 0x0000 },
+  { 0x0901, 0xd40f, 0x0000 },
+  { 0x8901, 0xd414, 0x3000 },
+  { 0x8901, 0xd412, 0x2000 },
+  { 0x0901, 0xd411, 0x0000 },
+  { 0x0901, 0xd413, 0x0000 },
+  { 0x8901, 0xd416, 0x2000 },
+  { 0x0901, 0xd415, 0x0000 },
+  { 0x0901, 0xd417, 0x0000 },
+  { 0x8901, 0xd438, 0x6000 },
+  { 0x8501, 0xd428, 0x5000 },
+  { 0x8501, 0xd420, 0x4000 },
+  { 0x8501, 0xd41c, 0x3000 },
+  { 0x8501, 0xd41a, 0x2000 },
+  { 0x0901, 0xd419, 0x0000 },
+  { 0x0501, 0xd41b, 0x0000 },
+  { 0x8501, 0xd41e, 0x2000 },
+  { 0x0501, 0xd41d, 0x0000 },
+  { 0x0501, 0xd41f, 0x0000 },
+  { 0x8501, 0xd424, 0x3000 },
+  { 0x8501, 0xd422, 0x2000 },
+  { 0x0501, 0xd421, 0x0000 },
+  { 0x0501, 0xd423, 0x0000 },
+  { 0x8501, 0xd426, 0x2000 },
+  { 0x0501, 0xd425, 0x0000 },
+  { 0x0501, 0xd427, 0x0000 },
+  { 0x8501, 0xd430, 0x4000 },
+  { 0x8501, 0xd42c, 0x3000 },
+  { 0x8501, 0xd42a, 0x2000 },
+  { 0x0501, 0xd429, 0x0000 },
+  { 0x0501, 0xd42b, 0x0000 },
+  { 0x8501, 0xd42e, 0x2000 },
+  { 0x0501, 0xd42d, 0x0000 },
+  { 0x0501, 0xd42f, 0x0000 },
+  { 0x8901, 0xd434, 0x3000 },
+  { 0x8501, 0xd432, 0x2000 },
+  { 0x0501, 0xd431, 0x0000 },
+  { 0x0501, 0xd433, 0x0000 },
+  { 0x8901, 0xd436, 0x2000 },
+  { 0x0901, 0xd435, 0x0000 },
+  { 0x0901, 0xd437, 0x0000 },
+  { 0x8901, 0xd448, 0x5000 },
+  { 0x8901, 0xd440, 0x4000 },
+  { 0x8901, 0xd43c, 0x3000 },
+  { 0x8901, 0xd43a, 0x2000 },
+  { 0x0901, 0xd439, 0x0000 },
+  { 0x0901, 0xd43b, 0x0000 },
+  { 0x8901, 0xd43e, 0x2000 },
+  { 0x0901, 0xd43d, 0x0000 },
+  { 0x0901, 0xd43f, 0x0000 },
+  { 0x8901, 0xd444, 0x3000 },
+  { 0x8901, 0xd442, 0x2000 },
+  { 0x0901, 0xd441, 0x0000 },
+  { 0x0901, 0xd443, 0x0000 },
+  { 0x8901, 0xd446, 0x2000 },
+  { 0x0901, 0xd445, 0x0000 },
+  { 0x0901, 0xd447, 0x0000 },
+  { 0x8501, 0xd450, 0x4000 },
+  { 0x8901, 0xd44c, 0x3000 },
+  { 0x8901, 0xd44a, 0x2000 },
+  { 0x0901, 0xd449, 0x0000 },
+  { 0x0901, 0xd44b, 0x0000 },
+  { 0x8501, 0xd44e, 0x2000 },
+  { 0x0901, 0xd44d, 0x0000 },
+  { 0x0501, 0xd44f, 0x0000 },
+  { 0x8501, 0xd454, 0x3000 },
+  { 0x8501, 0xd452, 0x2000 },
+  { 0x0501, 0xd451, 0x0000 },
+  { 0x0501, 0xd453, 0x0000 },
+  { 0x8501, 0xd457, 0x2000 },
+  { 0x0501, 0xd456, 0x0000 },
+  { 0x0501, 0xd458, 0x0000 },
+  { 0x8702, 0xf876, 0xb000 },
+  { 0x8901, 0xd670, 0xa000 },
+  { 0x8901, 0xd570, 0x9000 },
+  { 0x8901, 0xd4e4, 0x8000 },
+  { 0x8501, 0xd499, 0x7000 },
+  { 0x8901, 0xd479, 0x6000 },
+  { 0x8901, 0xd469, 0x5000 },
+  { 0x8501, 0xd461, 0x4000 },
+  { 0x8501, 0xd45d, 0x3000 },
+  { 0x8501, 0xd45b, 0x2000 },
+  { 0x0501, 0xd45a, 0x0000 },
+  { 0x0501, 0xd45c, 0x0000 },
+  { 0x8501, 0xd45f, 0x2000 },
+  { 0x0501, 0xd45e, 0x0000 },
+  { 0x0501, 0xd460, 0x0000 },
+  { 0x8501, 0xd465, 0x3000 },
+  { 0x8501, 0xd463, 0x2000 },
+  { 0x0501, 0xd462, 0x0000 },
+  { 0x0501, 0xd464, 0x0000 },
+  { 0x8501, 0xd467, 0x2000 },
+  { 0x0501, 0xd466, 0x0000 },
+  { 0x0901, 0xd468, 0x0000 },
+  { 0x8901, 0xd471, 0x4000 },
+  { 0x8901, 0xd46d, 0x3000 },
+  { 0x8901, 0xd46b, 0x2000 },
+  { 0x0901, 0xd46a, 0x0000 },
+  { 0x0901, 0xd46c, 0x0000 },
+  { 0x8901, 0xd46f, 0x2000 },
+  { 0x0901, 0xd46e, 0x0000 },
+  { 0x0901, 0xd470, 0x0000 },
+  { 0x8901, 0xd475, 0x3000 },
+  { 0x8901, 0xd473, 0x2000 },
+  { 0x0901, 0xd472, 0x0000 },
+  { 0x0901, 0xd474, 0x0000 },
+  { 0x8901, 0xd477, 0x2000 },
+  { 0x0901, 0xd476, 0x0000 },
+  { 0x0901, 0xd478, 0x0000 },
+  { 0x8501, 0xd489, 0x5000 },
+  { 0x8901, 0xd481, 0x4000 },
+  { 0x8901, 0xd47d, 0x3000 },
+  { 0x8901, 0xd47b, 0x2000 },
+  { 0x0901, 0xd47a, 0x0000 },
+  { 0x0901, 0xd47c, 0x0000 },
+  { 0x8901, 0xd47f, 0x2000 },
+  { 0x0901, 0xd47e, 0x0000 },
+  { 0x0901, 0xd480, 0x0000 },
+  { 0x8501, 0xd485, 0x3000 },
+  { 0x8501, 0xd483, 0x2000 },
+  { 0x0501, 0xd482, 0x0000 },
+  { 0x0501, 0xd484, 0x0000 },
+  { 0x8501, 0xd487, 0x2000 },
+  { 0x0501, 0xd486, 0x0000 },
+  { 0x0501, 0xd488, 0x0000 },
+  { 0x8501, 0xd491, 0x4000 },
+  { 0x8501, 0xd48d, 0x3000 },
+  { 0x8501, 0xd48b, 0x2000 },
+  { 0x0501, 0xd48a, 0x0000 },
+  { 0x0501, 0xd48c, 0x0000 },
+  { 0x8501, 0xd48f, 0x2000 },
+  { 0x0501, 0xd48e, 0x0000 },
+  { 0x0501, 0xd490, 0x0000 },
+  { 0x8501, 0xd495, 0x3000 },
+  { 0x8501, 0xd493, 0x2000 },
+  { 0x0501, 0xd492, 0x0000 },
+  { 0x0501, 0xd494, 0x0000 },
+  { 0x8501, 0xd497, 0x2000 },
+  { 0x0501, 0xd496, 0x0000 },
+  { 0x0501, 0xd498, 0x0000 },
+  { 0x8501, 0xd4c3, 0x6000 },
+  { 0x8901, 0xd4b1, 0x5000 },
+  { 0x8901, 0xd4a6, 0x4000 },
+  { 0x8901, 0xd49e, 0x3000 },
+  { 0x8501, 0xd49b, 0x2000 },
+  { 0x0501, 0xd49a, 0x0000 },
+  { 0x0901, 0xd49c, 0x0000 },
+  { 0x8901, 0xd4a2, 0x2000 },
+  { 0x0901, 0xd49f, 0x0000 },
+  { 0x0901, 0xd4a5, 0x0000 },
+  { 0x8901, 0xd4ac, 0x3000 },
+  { 0x8901, 0xd4aa, 0x2000 },
+  { 0x0901, 0xd4a9, 0x0000 },
+  { 0x0901, 0xd4ab, 0x0000 },
+  { 0x8901, 0xd4af, 0x2000 },
+  { 0x0901, 0xd4ae, 0x0000 },
+  { 0x0901, 0xd4b0, 0x0000 },
+  { 0x8501, 0xd4b9, 0x4000 },
+  { 0x8901, 0xd4b5, 0x3000 },
+  { 0x8901, 0xd4b3, 0x2000 },
+  { 0x0901, 0xd4b2, 0x0000 },
+  { 0x0901, 0xd4b4, 0x0000 },
+  { 0x8501, 0xd4b7, 0x2000 },
+  { 0x0501, 0xd4b6, 0x0000 },
+  { 0x0501, 0xd4b8, 0x0000 },
+  { 0x8501, 0xd4bf, 0x3000 },
+  { 0x8501, 0xd4bd, 0x2000 },
+  { 0x0501, 0xd4bb, 0x0000 },
+  { 0x0501, 0xd4be, 0x0000 },
+  { 0x8501, 0xd4c1, 0x2000 },
+  { 0x0501, 0xd4c0, 0x0000 },
+  { 0x0501, 0xd4c2, 0x0000 },
+  { 0x8901, 0xd4d4, 0x5000 },
+  { 0x8501, 0xd4cc, 0x4000 },
+  { 0x8501, 0xd4c8, 0x3000 },
+  { 0x8501, 0xd4c6, 0x2000 },
+  { 0x0501, 0xd4c5, 0x0000 },
+  { 0x0501, 0xd4c7, 0x0000 },
+  { 0x8501, 0xd4ca, 0x2000 },
+  { 0x0501, 0xd4c9, 0x0000 },
+  { 0x0501, 0xd4cb, 0x0000 },
+  { 0x8901, 0xd4d0, 0x3000 },
+  { 0x8501, 0xd4ce, 0x2000 },
+  { 0x0501, 0xd4cd, 0x0000 },
+  { 0x0501, 0xd4cf, 0x0000 },
+  { 0x8901, 0xd4d2, 0x2000 },
+  { 0x0901, 0xd4d1, 0x0000 },
+  { 0x0901, 0xd4d3, 0x0000 },
+  { 0x8901, 0xd4dc, 0x4000 },
+  { 0x8901, 0xd4d8, 0x3000 },
+  { 0x8901, 0xd4d6, 0x2000 },
+  { 0x0901, 0xd4d5, 0x0000 },
+  { 0x0901, 0xd4d7, 0x0000 },
+  { 0x8901, 0xd4da, 0x2000 },
+  { 0x0901, 0xd4d9, 0x0000 },
+  { 0x0901, 0xd4db, 0x0000 },
+  { 0x8901, 0xd4e0, 0x3000 },
+  { 0x8901, 0xd4de, 0x2000 },
+  { 0x0901, 0xd4dd, 0x0000 },
+  { 0x0901, 0xd4df, 0x0000 },
+  { 0x8901, 0xd4e2, 0x2000 },
+  { 0x0901, 0xd4e1, 0x0000 },
+  { 0x0901, 0xd4e3, 0x0000 },
+  { 0x8501, 0xd529, 0x7000 },
+  { 0x8901, 0xd504, 0x6000 },
+  { 0x8501, 0xd4f4, 0x5000 },
+  { 0x8501, 0xd4ec, 0x4000 },
+  { 0x8901, 0xd4e8, 0x3000 },
+  { 0x8901, 0xd4e6, 0x2000 },
+  { 0x0901, 0xd4e5, 0x0000 },
+  { 0x0901, 0xd4e7, 0x0000 },
+  { 0x8501, 0xd4ea, 0x2000 },
+  { 0x0901, 0xd4e9, 0x0000 },
+  { 0x0501, 0xd4eb, 0x0000 },
+  { 0x8501, 0xd4f0, 0x3000 },
+  { 0x8501, 0xd4ee, 0x2000 },
+  { 0x0501, 0xd4ed, 0x0000 },
+  { 0x0501, 0xd4ef, 0x0000 },
+  { 0x8501, 0xd4f2, 0x2000 },
+  { 0x0501, 0xd4f1, 0x0000 },
+  { 0x0501, 0xd4f3, 0x0000 },
+  { 0x8501, 0xd4fc, 0x4000 },
+  { 0x8501, 0xd4f8, 0x3000 },
+  { 0x8501, 0xd4f6, 0x2000 },
+  { 0x0501, 0xd4f5, 0x0000 },
+  { 0x0501, 0xd4f7, 0x0000 },
+  { 0x8501, 0xd4fa, 0x2000 },
+  { 0x0501, 0xd4f9, 0x0000 },
+  { 0x0501, 0xd4fb, 0x0000 },
+  { 0x8501, 0xd500, 0x3000 },
+  { 0x8501, 0xd4fe, 0x2000 },
+  { 0x0501, 0xd4fd, 0x0000 },
+  { 0x0501, 0xd4ff, 0x0000 },
+  { 0x8501, 0xd502, 0x2000 },
+  { 0x0501, 0xd501, 0x0000 },
+  { 0x0501, 0xd503, 0x0000 },
+  { 0x8901, 0xd518, 0x5000 },
+  { 0x8901, 0xd50f, 0x4000 },
+  { 0x8901, 0xd509, 0x3000 },
+  { 0x8901, 0xd507, 0x2000 },
+  { 0x0901, 0xd505, 0x0000 },
+  { 0x0901, 0xd508, 0x0000 },
+  { 0x8901, 0xd50d, 0x2000 },
+  { 0x0901, 0xd50a, 0x0000 },
+  { 0x0901, 0xd50e, 0x0000 },
+  { 0x8901, 0xd513, 0x3000 },
+  { 0x8901, 0xd511, 0x2000 },
+  { 0x0901, 0xd510, 0x0000 },
+  { 0x0901, 0xd512, 0x0000 },
+  { 0x8901, 0xd516, 0x2000 },
+  { 0x0901, 0xd514, 0x0000 },
+  { 0x0901, 0xd517, 0x0000 },
+  { 0x8501, 0xd521, 0x4000 },
+  { 0x8901, 0xd51c, 0x3000 },
+  { 0x8901, 0xd51a, 0x2000 },
+  { 0x0901, 0xd519, 0x0000 },
+  { 0x0901, 0xd51b, 0x0000 },
+  { 0x8501, 0xd51f, 0x2000 },
+  { 0x0501, 0xd51e, 0x0000 },
+  { 0x0501, 0xd520, 0x0000 },
+  { 0x8501, 0xd525, 0x3000 },
+  { 0x8501, 0xd523, 0x2000 },
+  { 0x0501, 0xd522, 0x0000 },
+  { 0x0501, 0xd524, 0x0000 },
+  { 0x8501, 0xd527, 0x2000 },
+  { 0x0501, 0xd526, 0x0000 },
+  { 0x0501, 0xd528, 0x0000 },
+  { 0x8901, 0xd54f, 0x6000 },
+  { 0x8901, 0xd539, 0x5000 },
+  { 0x8501, 0xd531, 0x4000 },
+  { 0x8501, 0xd52d, 0x3000 },
+  { 0x8501, 0xd52b, 0x2000 },
+  { 0x0501, 0xd52a, 0x0000 },
+  { 0x0501, 0xd52c, 0x0000 },
+  { 0x8501, 0xd52f, 0x2000 },
+  { 0x0501, 0xd52e, 0x0000 },
+  { 0x0501, 0xd530, 0x0000 },
+  { 0x8501, 0xd535, 0x3000 },
+  { 0x8501, 0xd533, 0x2000 },
+  { 0x0501, 0xd532, 0x0000 },
+  { 0x0501, 0xd534, 0x0000 },
+  { 0x8501, 0xd537, 0x2000 },
+  { 0x0501, 0xd536, 0x0000 },
+  { 0x0901, 0xd538, 0x0000 },
+  { 0x8901, 0xd543, 0x4000 },
+  { 0x8901, 0xd53e, 0x3000 },
+  { 0x8901, 0xd53c, 0x2000 },
+  { 0x0901, 0xd53b, 0x0000 },
+  { 0x0901, 0xd53d, 0x0000 },
+  { 0x8901, 0xd541, 0x2000 },
+  { 0x0901, 0xd540, 0x0000 },
+  { 0x0901, 0xd542, 0x0000 },
+  { 0x8901, 0xd54b, 0x3000 },
+  { 0x8901, 0xd546, 0x2000 },
+  { 0x0901, 0xd544, 0x0000 },
+  { 0x0901, 0xd54a, 0x0000 },
+  { 0x8901, 0xd54d, 0x2000 },
+  { 0x0901, 0xd54c, 0x0000 },
+  { 0x0901, 0xd54e, 0x0000 },
+  { 0x8501, 0xd560, 0x5000 },
+  { 0x8501, 0xd558, 0x4000 },
+  { 0x8501, 0xd554, 0x3000 },
+  { 0x8501, 0xd552, 0x2000 },
+  { 0x0901, 0xd550, 0x0000 },
+  { 0x0501, 0xd553, 0x0000 },
+  { 0x8501, 0xd556, 0x2000 },
+  { 0x0501, 0xd555, 0x0000 },
+  { 0x0501, 0xd557, 0x0000 },
+  { 0x8501, 0xd55c, 0x3000 },
+  { 0x8501, 0xd55a, 0x2000 },
+  { 0x0501, 0xd559, 0x0000 },
+  { 0x0501, 0xd55b, 0x0000 },
+  { 0x8501, 0xd55e, 0x2000 },
+  { 0x0501, 0xd55d, 0x0000 },
+  { 0x0501, 0xd55f, 0x0000 },
+  { 0x8501, 0xd568, 0x4000 },
+  { 0x8501, 0xd564, 0x3000 },
+  { 0x8501, 0xd562, 0x2000 },
+  { 0x0501, 0xd561, 0x0000 },
+  { 0x0501, 0xd563, 0x0000 },
+  { 0x8501, 0xd566, 0x2000 },
+  { 0x0501, 0xd565, 0x0000 },
+  { 0x0501, 0xd567, 0x0000 },
+  { 0x8901, 0xd56c, 0x3000 },
+  { 0x8501, 0xd56a, 0x2000 },
+  { 0x0501, 0xd569, 0x0000 },
+  { 0x0501, 0xd56b, 0x0000 },
+  { 0x8901, 0xd56e, 0x2000 },
+  { 0x0901, 0xd56d, 0x0000 },
+  { 0x0901, 0xd56f, 0x0000 },
+  { 0x8501, 0xd5f0, 0x8000 },
+  { 0x8901, 0xd5b0, 0x7000 },
+  { 0x8501, 0xd590, 0x6000 },
+  { 0x8901, 0xd580, 0x5000 },
+  { 0x8901, 0xd578, 0x4000 },
+  { 0x8901, 0xd574, 0x3000 },
+  { 0x8901, 0xd572, 0x2000 },
+  { 0x0901, 0xd571, 0x0000 },
+  { 0x0901, 0xd573, 0x0000 },
+  { 0x8901, 0xd576, 0x2000 },
+  { 0x0901, 0xd575, 0x0000 },
+  { 0x0901, 0xd577, 0x0000 },
+  { 0x8901, 0xd57c, 0x3000 },
+  { 0x8901, 0xd57a, 0x2000 },
+  { 0x0901, 0xd579, 0x0000 },
+  { 0x0901, 0xd57b, 0x0000 },
+  { 0x8901, 0xd57e, 0x2000 },
+  { 0x0901, 0xd57d, 0x0000 },
+  { 0x0901, 0xd57f, 0x0000 },
+  { 0x8501, 0xd588, 0x4000 },
+  { 0x8901, 0xd584, 0x3000 },
+  { 0x8901, 0xd582, 0x2000 },
+  { 0x0901, 0xd581, 0x0000 },
+  { 0x0901, 0xd583, 0x0000 },
+  { 0x8501, 0xd586, 0x2000 },
+  { 0x0901, 0xd585, 0x0000 },
+  { 0x0501, 0xd587, 0x0000 },
+  { 0x8501, 0xd58c, 0x3000 },
+  { 0x8501, 0xd58a, 0x2000 },
+  { 0x0501, 0xd589, 0x0000 },
+  { 0x0501, 0xd58b, 0x0000 },
+  { 0x8501, 0xd58e, 0x2000 },
+  { 0x0501, 0xd58d, 0x0000 },
+  { 0x0501, 0xd58f, 0x0000 },
+  { 0x8901, 0xd5a0, 0x5000 },
+  { 0x8501, 0xd598, 0x4000 },
+  { 0x8501, 0xd594, 0x3000 },
+  { 0x8501, 0xd592, 0x2000 },
+  { 0x0501, 0xd591, 0x0000 },
+  { 0x0501, 0xd593, 0x0000 },
+  { 0x8501, 0xd596, 0x2000 },
+  { 0x0501, 0xd595, 0x0000 },
+  { 0x0501, 0xd597, 0x0000 },
+  { 0x8501, 0xd59c, 0x3000 },
+  { 0x8501, 0xd59a, 0x2000 },
+  { 0x0501, 0xd599, 0x0000 },
+  { 0x0501, 0xd59b, 0x0000 },
+  { 0x8501, 0xd59e, 0x2000 },
+  { 0x0501, 0xd59d, 0x0000 },
+  { 0x0501, 0xd59f, 0x0000 },
+  { 0x8901, 0xd5a8, 0x4000 },
+  { 0x8901, 0xd5a4, 0x3000 },
+  { 0x8901, 0xd5a2, 0x2000 },
+  { 0x0901, 0xd5a1, 0x0000 },
+  { 0x0901, 0xd5a3, 0x0000 },
+  { 0x8901, 0xd5a6, 0x2000 },
+  { 0x0901, 0xd5a5, 0x0000 },
+  { 0x0901, 0xd5a7, 0x0000 },
+  { 0x8901, 0xd5ac, 0x3000 },
+  { 0x8901, 0xd5aa, 0x2000 },
+  { 0x0901, 0xd5a9, 0x0000 },
+  { 0x0901, 0xd5ab, 0x0000 },
+  { 0x8901, 0xd5ae, 0x2000 },
+  { 0x0901, 0xd5ad, 0x0000 },
+  { 0x0901, 0xd5af, 0x0000 },
+  { 0x8501, 0xd5d0, 0x6000 },
+  { 0x8501, 0xd5c0, 0x5000 },
+  { 0x8901, 0xd5b8, 0x4000 },
+  { 0x8901, 0xd5b4, 0x3000 },
+  { 0x8901, 0xd5b2, 0x2000 },
+  { 0x0901, 0xd5b1, 0x0000 },
+  { 0x0901, 0xd5b3, 0x0000 },
+  { 0x8901, 0xd5b6, 0x2000 },
+  { 0x0901, 0xd5b5, 0x0000 },
+  { 0x0901, 0xd5b7, 0x0000 },
+  { 0x8501, 0xd5bc, 0x3000 },
+  { 0x8501, 0xd5ba, 0x2000 },
+  { 0x0901, 0xd5b9, 0x0000 },
+  { 0x0501, 0xd5bb, 0x0000 },
+  { 0x8501, 0xd5be, 0x2000 },
+  { 0x0501, 0xd5bd, 0x0000 },
+  { 0x0501, 0xd5bf, 0x0000 },
+  { 0x8501, 0xd5c8, 0x4000 },
+  { 0x8501, 0xd5c4, 0x3000 },
+  { 0x8501, 0xd5c2, 0x2000 },
+  { 0x0501, 0xd5c1, 0x0000 },
+  { 0x0501, 0xd5c3, 0x0000 },
+  { 0x8501, 0xd5c6, 0x2000 },
+  { 0x0501, 0xd5c5, 0x0000 },
+  { 0x0501, 0xd5c7, 0x0000 },
+  { 0x8501, 0xd5cc, 0x3000 },
+  { 0x8501, 0xd5ca, 0x2000 },
+  { 0x0501, 0xd5c9, 0x0000 },
+  { 0x0501, 0xd5cb, 0x0000 },
+  { 0x8501, 0xd5ce, 0x2000 },
+  { 0x0501, 0xd5cd, 0x0000 },
+  { 0x0501, 0xd5cf, 0x0000 },
+  { 0x8901, 0xd5e0, 0x5000 },
+  { 0x8901, 0xd5d8, 0x4000 },
+  { 0x8901, 0xd5d4, 0x3000 },
+  { 0x8501, 0xd5d2, 0x2000 },
+  { 0x0501, 0xd5d1, 0x0000 },
+  { 0x0501, 0xd5d3, 0x0000 },
+  { 0x8901, 0xd5d6, 0x2000 },
+  { 0x0901, 0xd5d5, 0x0000 },
+  { 0x0901, 0xd5d7, 0x0000 },
+  { 0x8901, 0xd5dc, 0x3000 },
+  { 0x8901, 0xd5da, 0x2000 },
+  { 0x0901, 0xd5d9, 0x0000 },
+  { 0x0901, 0xd5db, 0x0000 },
+  { 0x8901, 0xd5de, 0x2000 },
+  { 0x0901, 0xd5dd, 0x0000 },
+  { 0x0901, 0xd5df, 0x0000 },
+  { 0x8901, 0xd5e8, 0x4000 },
+  { 0x8901, 0xd5e4, 0x3000 },
+  { 0x8901, 0xd5e2, 0x2000 },
+  { 0x0901, 0xd5e1, 0x0000 },
+  { 0x0901, 0xd5e3, 0x0000 },
+  { 0x8901, 0xd5e6, 0x2000 },
+  { 0x0901, 0xd5e5, 0x0000 },
+  { 0x0901, 0xd5e7, 0x0000 },
+  { 0x8901, 0xd5ec, 0x3000 },
+  { 0x8901, 0xd5ea, 0x2000 },
+  { 0x0901, 0xd5e9, 0x0000 },
+  { 0x0901, 0xd5eb, 0x0000 },
+  { 0x8501, 0xd5ee, 0x2000 },
+  { 0x0901, 0xd5ed, 0x0000 },
+  { 0x0501, 0xd5ef, 0x0000 },
+  { 0x8501, 0xd630, 0x7000 },
+  { 0x8901, 0xd610, 0x6000 },
+  { 0x8501, 0xd600, 0x5000 },
+  { 0x8501, 0xd5f8, 0x4000 },
+  { 0x8501, 0xd5f4, 0x3000 },
+  { 0x8501, 0xd5f2, 0x2000 },
+  { 0x0501, 0xd5f1, 0x0000 },
+  { 0x0501, 0xd5f3, 0x0000 },
+  { 0x8501, 0xd5f6, 0x2000 },
+  { 0x0501, 0xd5f5, 0x0000 },
+  { 0x0501, 0xd5f7, 0x0000 },
+  { 0x8501, 0xd5fc, 0x3000 },
+  { 0x8501, 0xd5fa, 0x2000 },
+  { 0x0501, 0xd5f9, 0x0000 },
+  { 0x0501, 0xd5fb, 0x0000 },
+  { 0x8501, 0xd5fe, 0x2000 },
+  { 0x0501, 0xd5fd, 0x0000 },
+  { 0x0501, 0xd5ff, 0x0000 },
+  { 0x8901, 0xd608, 0x4000 },
+  { 0x8501, 0xd604, 0x3000 },
+  { 0x8501, 0xd602, 0x2000 },
+  { 0x0501, 0xd601, 0x0000 },
+  { 0x0501, 0xd603, 0x0000 },
+  { 0x8501, 0xd606, 0x2000 },
+  { 0x0501, 0xd605, 0x0000 },
+  { 0x0501, 0xd607, 0x0000 },
+  { 0x8901, 0xd60c, 0x3000 },
+  { 0x8901, 0xd60a, 0x2000 },
+  { 0x0901, 0xd609, 0x0000 },
+  { 0x0901, 0xd60b, 0x0000 },
+  { 0x8901, 0xd60e, 0x2000 },
+  { 0x0901, 0xd60d, 0x0000 },
+  { 0x0901, 0xd60f, 0x0000 },
+  { 0x8901, 0xd620, 0x5000 },
+  { 0x8901, 0xd618, 0x4000 },
+  { 0x8901, 0xd614, 0x3000 },
+  { 0x8901, 0xd612, 0x2000 },
+  { 0x0901, 0xd611, 0x0000 },
+  { 0x0901, 0xd613, 0x0000 },
+  { 0x8901, 0xd616, 0x2000 },
+  { 0x0901, 0xd615, 0x0000 },
+  { 0x0901, 0xd617, 0x0000 },
+  { 0x8901, 0xd61c, 0x3000 },
+  { 0x8901, 0xd61a, 0x2000 },
+  { 0x0901, 0xd619, 0x0000 },
+  { 0x0901, 0xd61b, 0x0000 },
+  { 0x8901, 0xd61e, 0x2000 },
+  { 0x0901, 0xd61d, 0x0000 },
+  { 0x0901, 0xd61f, 0x0000 },
+  { 0x8501, 0xd628, 0x4000 },
+  { 0x8501, 0xd624, 0x3000 },
+  { 0x8501, 0xd622, 0x2000 },
+  { 0x0901, 0xd621, 0x0000 },
+  { 0x0501, 0xd623, 0x0000 },
+  { 0x8501, 0xd626, 0x2000 },
+  { 0x0501, 0xd625, 0x0000 },
+  { 0x0501, 0xd627, 0x0000 },
+  { 0x8501, 0xd62c, 0x3000 },
+  { 0x8501, 0xd62a, 0x2000 },
+  { 0x0501, 0xd629, 0x0000 },
+  { 0x0501, 0xd62b, 0x0000 },
+  { 0x8501, 0xd62e, 0x2000 },
+  { 0x0501, 0xd62d, 0x0000 },
+  { 0x0501, 0xd62f, 0x0000 },
+  { 0x8901, 0xd650, 0x6000 },
+  { 0x8901, 0xd640, 0x5000 },
+  { 0x8501, 0xd638, 0x4000 },
+  { 0x8501, 0xd634, 0x3000 },
+  { 0x8501, 0xd632, 0x2000 },
+  { 0x0501, 0xd631, 0x0000 },
+  { 0x0501, 0xd633, 0x0000 },
+  { 0x8501, 0xd636, 0x2000 },
+  { 0x0501, 0xd635, 0x0000 },
+  { 0x0501, 0xd637, 0x0000 },
+  { 0x8901, 0xd63c, 0x3000 },
+  { 0x8501, 0xd63a, 0x2000 },
+  { 0x0501, 0xd639, 0x0000 },
+  { 0x0501, 0xd63b, 0x0000 },
+  { 0x8901, 0xd63e, 0x2000 },
+  { 0x0901, 0xd63d, 0x0000 },
+  { 0x0901, 0xd63f, 0x0000 },
+  { 0x8901, 0xd648, 0x4000 },
+  { 0x8901, 0xd644, 0x3000 },
+  { 0x8901, 0xd642, 0x2000 },
+  { 0x0901, 0xd641, 0x0000 },
+  { 0x0901, 0xd643, 0x0000 },
+  { 0x8901, 0xd646, 0x2000 },
+  { 0x0901, 0xd645, 0x0000 },
+  { 0x0901, 0xd647, 0x0000 },
+  { 0x8901, 0xd64c, 0x3000 },
+  { 0x8901, 0xd64a, 0x2000 },
+  { 0x0901, 0xd649, 0x0000 },
+  { 0x0901, 0xd64b, 0x0000 },
+  { 0x8901, 0xd64e, 0x2000 },
+  { 0x0901, 0xd64d, 0x0000 },
+  { 0x0901, 0xd64f, 0x0000 },
+  { 0x8501, 0xd660, 0x5000 },
+  { 0x8501, 0xd658, 0x4000 },
+  { 0x8901, 0xd654, 0x3000 },
+  { 0x8901, 0xd652, 0x2000 },
+  { 0x0901, 0xd651, 0x0000 },
+  { 0x0901, 0xd653, 0x0000 },
+  { 0x8501, 0xd656, 0x2000 },
+  { 0x0901, 0xd655, 0x0000 },
+  { 0x0501, 0xd657, 0x0000 },
+  { 0x8501, 0xd65c, 0x3000 },
+  { 0x8501, 0xd65a, 0x2000 },
+  { 0x0501, 0xd659, 0x0000 },
+  { 0x0501, 0xd65b, 0x0000 },
+  { 0x8501, 0xd65e, 0x2000 },
+  { 0x0501, 0xd65d, 0x0000 },
+  { 0x0501, 0xd65f, 0x0000 },
+  { 0x8501, 0xd668, 0x4000 },
+  { 0x8501, 0xd664, 0x3000 },
+  { 0x8501, 0xd662, 0x2000 },
+  { 0x0501, 0xd661, 0x0000 },
+  { 0x0501, 0xd663, 0x0000 },
+  { 0x8501, 0xd666, 0x2000 },
+  { 0x0501, 0xd665, 0x0000 },
+  { 0x0501, 0xd667, 0x0000 },
+  { 0x8501, 0xd66c, 0x3000 },
+  { 0x8501, 0xd66a, 0x2000 },
+  { 0x0501, 0xd669, 0x0000 },
+  { 0x0501, 0xd66b, 0x0000 },
+  { 0x8501, 0xd66e, 0x2000 },
+  { 0x0501, 0xd66d, 0x0000 },
+  { 0x0501, 0xd66f, 0x0000 },
+  { 0x8501, 0xd774, 0x9000 },
+  { 0x8901, 0xd6f4, 0x8000 },
+  { 0x8901, 0xd6b4, 0x7000 },
+  { 0x8501, 0xd690, 0x6000 },
+  { 0x8901, 0xd680, 0x5000 },
+  { 0x8901, 0xd678, 0x4000 },
+  { 0x8901, 0xd674, 0x3000 },
+  { 0x8901, 0xd672, 0x2000 },
+  { 0x0901, 0xd671, 0x0000 },
+  { 0x0901, 0xd673, 0x0000 },
+  { 0x8901, 0xd676, 0x2000 },
+  { 0x0901, 0xd675, 0x0000 },
+  { 0x0901, 0xd677, 0x0000 },
+  { 0x8901, 0xd67c, 0x3000 },
+  { 0x8901, 0xd67a, 0x2000 },
+  { 0x0901, 0xd679, 0x0000 },
+  { 0x0901, 0xd67b, 0x0000 },
+  { 0x8901, 0xd67e, 0x2000 },
+  { 0x0901, 0xd67d, 0x0000 },
+  { 0x0901, 0xd67f, 0x0000 },
+  { 0x8901, 0xd688, 0x4000 },
+  { 0x8901, 0xd684, 0x3000 },
+  { 0x8901, 0xd682, 0x2000 },
+  { 0x0901, 0xd681, 0x0000 },
+  { 0x0901, 0xd683, 0x0000 },
+  { 0x8901, 0xd686, 0x2000 },
+  { 0x0901, 0xd685, 0x0000 },
+  { 0x0901, 0xd687, 0x0000 },
+  { 0x8501, 0xd68c, 0x3000 },
+  { 0x8501, 0xd68a, 0x2000 },
+  { 0x0901, 0xd689, 0x0000 },
+  { 0x0501, 0xd68b, 0x0000 },
+  { 0x8501, 0xd68e, 0x2000 },
+  { 0x0501, 0xd68d, 0x0000 },
+  { 0x0501, 0xd68f, 0x0000 },
+  { 0x8501, 0xd6a0, 0x5000 },
+  { 0x8501, 0xd698, 0x4000 },
+  { 0x8501, 0xd694, 0x3000 },
+  { 0x8501, 0xd692, 0x2000 },
+  { 0x0501, 0xd691, 0x0000 },
+  { 0x0501, 0xd693, 0x0000 },
+  { 0x8501, 0xd696, 0x2000 },
+  { 0x0501, 0xd695, 0x0000 },
+  { 0x0501, 0xd697, 0x0000 },
+  { 0x8501, 0xd69c, 0x3000 },
+  { 0x8501, 0xd69a, 0x2000 },
+  { 0x0501, 0xd699, 0x0000 },
+  { 0x0501, 0xd69b, 0x0000 },
+  { 0x8501, 0xd69e, 0x2000 },
+  { 0x0501, 0xd69d, 0x0000 },
+  { 0x0501, 0xd69f, 0x0000 },
+  { 0x8901, 0xd6ac, 0x4000 },
+  { 0x8901, 0xd6a8, 0x3000 },
+  { 0x8501, 0xd6a2, 0x2000 },
+  { 0x0501, 0xd6a1, 0x0000 },
+  { 0x0501, 0xd6a3, 0x0000 },
+  { 0x8901, 0xd6aa, 0x2000 },
+  { 0x0901, 0xd6a9, 0x0000 },
+  { 0x0901, 0xd6ab, 0x0000 },
+  { 0x8901, 0xd6b0, 0x3000 },
+  { 0x8901, 0xd6ae, 0x2000 },
+  { 0x0901, 0xd6ad, 0x0000 },
+  { 0x0901, 0xd6af, 0x0000 },
+  { 0x8901, 0xd6b2, 0x2000 },
+  { 0x0901, 0xd6b1, 0x0000 },
+  { 0x0901, 0xd6b3, 0x0000 },
+  { 0x8501, 0xd6d4, 0x6000 },
+  { 0x8501, 0xd6c4, 0x5000 },
+  { 0x8901, 0xd6bc, 0x4000 },
+  { 0x8901, 0xd6b8, 0x3000 },
+  { 0x8901, 0xd6b6, 0x2000 },
+  { 0x0901, 0xd6b5, 0x0000 },
+  { 0x0901, 0xd6b7, 0x0000 },
+  { 0x8901, 0xd6ba, 0x2000 },
+  { 0x0901, 0xd6b9, 0x0000 },
+  { 0x0901, 0xd6bb, 0x0000 },
+  { 0x8901, 0xd6c0, 0x3000 },
+  { 0x8901, 0xd6be, 0x2000 },
+  { 0x0901, 0xd6bd, 0x0000 },
+  { 0x0901, 0xd6bf, 0x0000 },
+  { 0x8501, 0xd6c2, 0x2000 },
+  { 0x1901, 0xd6c1, 0x0000 },
+  { 0x0501, 0xd6c3, 0x0000 },
+  { 0x8501, 0xd6cc, 0x4000 },
+  { 0x8501, 0xd6c8, 0x3000 },
+  { 0x8501, 0xd6c6, 0x2000 },
+  { 0x0501, 0xd6c5, 0x0000 },
+  { 0x0501, 0xd6c7, 0x0000 },
+  { 0x8501, 0xd6ca, 0x2000 },
+  { 0x0501, 0xd6c9, 0x0000 },
+  { 0x0501, 0xd6cb, 0x0000 },
+  { 0x8501, 0xd6d0, 0x3000 },
+  { 0x8501, 0xd6ce, 0x2000 },
+  { 0x0501, 0xd6cd, 0x0000 },
+  { 0x0501, 0xd6cf, 0x0000 },
+  { 0x8501, 0xd6d2, 0x2000 },
+  { 0x0501, 0xd6d1, 0x0000 },
+  { 0x0501, 0xd6d3, 0x0000 },
+  { 0x8901, 0xd6e4, 0x5000 },
+  { 0x8501, 0xd6dc, 0x4000 },
+  { 0x8501, 0xd6d8, 0x3000 },
+  { 0x8501, 0xd6d6, 0x2000 },
+  { 0x0501, 0xd6d5, 0x0000 },
+  { 0x0501, 0xd6d7, 0x0000 },
+  { 0x8501, 0xd6da, 0x2000 },
+  { 0x0501, 0xd6d9, 0x0000 },
+  { 0x1901, 0xd6db, 0x0000 },
+  { 0x8501, 0xd6e0, 0x3000 },
+  { 0x8501, 0xd6de, 0x2000 },
+  { 0x0501, 0xd6dd, 0x0000 },
+  { 0x0501, 0xd6df, 0x0000 },
+  { 0x8901, 0xd6e2, 0x2000 },
+  { 0x0501, 0xd6e1, 0x0000 },
+  { 0x0901, 0xd6e3, 0x0000 },
+  { 0x8901, 0xd6ec, 0x4000 },
+  { 0x8901, 0xd6e8, 0x3000 },
+  { 0x8901, 0xd6e6, 0x2000 },
+  { 0x0901, 0xd6e5, 0x0000 },
+  { 0x0901, 0xd6e7, 0x0000 },
+  { 0x8901, 0xd6ea, 0x2000 },
+  { 0x0901, 0xd6e9, 0x0000 },
+  { 0x0901, 0xd6eb, 0x0000 },
+  { 0x8901, 0xd6f0, 0x3000 },
+  { 0x8901, 0xd6ee, 0x2000 },
+  { 0x0901, 0xd6ed, 0x0000 },
+  { 0x0901, 0xd6ef, 0x0000 },
+  { 0x8901, 0xd6f2, 0x2000 },
+  { 0x0901, 0xd6f1, 0x0000 },
+  { 0x0901, 0xd6f3, 0x0000 },
+  { 0x8901, 0xd734, 0x7000 },
+  { 0x8501, 0xd714, 0x6000 },
+  { 0x8501, 0xd704, 0x5000 },
+  { 0x8501, 0xd6fc, 0x4000 },
+  { 0x8901, 0xd6f8, 0x3000 },
+  { 0x8901, 0xd6f6, 0x2000 },
+  { 0x0901, 0xd6f5, 0x0000 },
+  { 0x0901, 0xd6f7, 0x0000 },
+  { 0x8901, 0xd6fa, 0x2000 },
+  { 0x0901, 0xd6f9, 0x0000 },
+  { 0x1901, 0xd6fb, 0x0000 },
+  { 0x8501, 0xd700, 0x3000 },
+  { 0x8501, 0xd6fe, 0x2000 },
+  { 0x0501, 0xd6fd, 0x0000 },
+  { 0x0501, 0xd6ff, 0x0000 },
+  { 0x8501, 0xd702, 0x2000 },
+  { 0x0501, 0xd701, 0x0000 },
+  { 0x0501, 0xd703, 0x0000 },
+  { 0x8501, 0xd70c, 0x4000 },
+  { 0x8501, 0xd708, 0x3000 },
+  { 0x8501, 0xd706, 0x2000 },
+  { 0x0501, 0xd705, 0x0000 },
+  { 0x0501, 0xd707, 0x0000 },
+  { 0x8501, 0xd70a, 0x2000 },
+  { 0x0501, 0xd709, 0x0000 },
+  { 0x0501, 0xd70b, 0x0000 },
+  { 0x8501, 0xd710, 0x3000 },
+  { 0x8501, 0xd70e, 0x2000 },
+  { 0x0501, 0xd70d, 0x0000 },
+  { 0x0501, 0xd70f, 0x0000 },
+  { 0x8501, 0xd712, 0x2000 },
+  { 0x0501, 0xd711, 0x0000 },
+  { 0x0501, 0xd713, 0x0000 },
+  { 0x8901, 0xd724, 0x5000 },
+  { 0x8901, 0xd71c, 0x4000 },
+  { 0x8501, 0xd718, 0x3000 },
+  { 0x8501, 0xd716, 0x2000 },
+  { 0x1901, 0xd715, 0x0000 },
+  { 0x0501, 0xd717, 0x0000 },
+  { 0x8501, 0xd71a, 0x2000 },
+  { 0x0501, 0xd719, 0x0000 },
+  { 0x0501, 0xd71b, 0x0000 },
+  { 0x8901, 0xd720, 0x3000 },
+  { 0x8901, 0xd71e, 0x2000 },
+  { 0x0901, 0xd71d, 0x0000 },
+  { 0x0901, 0xd71f, 0x0000 },
+  { 0x8901, 0xd722, 0x2000 },
+  { 0x0901, 0xd721, 0x0000 },
+  { 0x0901, 0xd723, 0x0000 },
+  { 0x8901, 0xd72c, 0x4000 },
+  { 0x8901, 0xd728, 0x3000 },
+  { 0x8901, 0xd726, 0x2000 },
+  { 0x0901, 0xd725, 0x0000 },
+  { 0x0901, 0xd727, 0x0000 },
+  { 0x8901, 0xd72a, 0x2000 },
+  { 0x0901, 0xd729, 0x0000 },
+  { 0x0901, 0xd72b, 0x0000 },
+  { 0x8901, 0xd730, 0x3000 },
+  { 0x8901, 0xd72e, 0x2000 },
+  { 0x0901, 0xd72d, 0x0000 },
+  { 0x0901, 0xd72f, 0x0000 },
+  { 0x8901, 0xd732, 0x2000 },
+  { 0x0901, 0xd731, 0x0000 },
+  { 0x0901, 0xd733, 0x0000 },
+  { 0x8501, 0xd754, 0x6000 },
+  { 0x8501, 0xd744, 0x5000 },
+  { 0x8501, 0xd73c, 0x4000 },
+  { 0x8501, 0xd738, 0x3000 },
+  { 0x8501, 0xd736, 0x2000 },
+  { 0x1901, 0xd735, 0x0000 },
+  { 0x0501, 0xd737, 0x0000 },
+  { 0x8501, 0xd73a, 0x2000 },
+  { 0x0501, 0xd739, 0x0000 },
+  { 0x0501, 0xd73b, 0x0000 },
+  { 0x8501, 0xd740, 0x3000 },
+  { 0x8501, 0xd73e, 0x2000 },
+  { 0x0501, 0xd73d, 0x0000 },
+  { 0x0501, 0xd73f, 0x0000 },
+  { 0x8501, 0xd742, 0x2000 },
+  { 0x0501, 0xd741, 0x0000 },
+  { 0x0501, 0xd743, 0x0000 },
+  { 0x8501, 0xd74c, 0x4000 },
+  { 0x8501, 0xd748, 0x3000 },
+  { 0x8501, 0xd746, 0x2000 },
+  { 0x0501, 0xd745, 0x0000 },
+  { 0x0501, 0xd747, 0x0000 },
+  { 0x8501, 0xd74a, 0x2000 },
+  { 0x0501, 0xd749, 0x0000 },
+  { 0x0501, 0xd74b, 0x0000 },
+  { 0x8501, 0xd750, 0x3000 },
+  { 0x8501, 0xd74e, 0x2000 },
+  { 0x0501, 0xd74d, 0x0000 },
+  { 0x1901, 0xd74f, 0x0000 },
+  { 0x8501, 0xd752, 0x2000 },
+  { 0x0501, 0xd751, 0x0000 },
+  { 0x0501, 0xd753, 0x0000 },
+  { 0x8901, 0xd764, 0x5000 },
+  { 0x8901, 0xd75c, 0x4000 },
+  { 0x8901, 0xd758, 0x3000 },
+  { 0x8901, 0xd756, 0x2000 },
+  { 0x0501, 0xd755, 0x0000 },
+  { 0x0901, 0xd757, 0x0000 },
+  { 0x8901, 0xd75a, 0x2000 },
+  { 0x0901, 0xd759, 0x0000 },
+  { 0x0901, 0xd75b, 0x0000 },
+  { 0x8901, 0xd760, 0x3000 },
+  { 0x8901, 0xd75e, 0x2000 },
+  { 0x0901, 0xd75d, 0x0000 },
+  { 0x0901, 0xd75f, 0x0000 },
+  { 0x8901, 0xd762, 0x2000 },
+  { 0x0901, 0xd761, 0x0000 },
+  { 0x0901, 0xd763, 0x0000 },
+  { 0x8901, 0xd76c, 0x4000 },
+  { 0x8901, 0xd768, 0x3000 },
+  { 0x8901, 0xd766, 0x2000 },
+  { 0x0901, 0xd765, 0x0000 },
+  { 0x0901, 0xd767, 0x0000 },
+  { 0x8901, 0xd76a, 0x2000 },
+  { 0x0901, 0xd769, 0x0000 },
+  { 0x0901, 0xd76b, 0x0000 },
+  { 0x8501, 0xd770, 0x3000 },
+  { 0x8901, 0xd76e, 0x2000 },
+  { 0x0901, 0xd76d, 0x0000 },
+  { 0x1901, 0xd76f, 0x0000 },
+  { 0x8501, 0xd772, 0x2000 },
+  { 0x0501, 0xd771, 0x0000 },
+  { 0x0501, 0xd773, 0x0000 },
+  { 0x8d01, 0xd7f8, 0x8000 },
+  { 0x8501, 0xd7b4, 0x7000 },
+  { 0x8901, 0xd794, 0x6000 },
+  { 0x8501, 0xd784, 0x5000 },
+  { 0x8501, 0xd77c, 0x4000 },
+  { 0x8501, 0xd778, 0x3000 },
+  { 0x8501, 0xd776, 0x2000 },
+  { 0x0501, 0xd775, 0x0000 },
+  { 0x0501, 0xd777, 0x0000 },
+  { 0x8501, 0xd77a, 0x2000 },
+  { 0x0501, 0xd779, 0x0000 },
+  { 0x0501, 0xd77b, 0x0000 },
+  { 0x8501, 0xd780, 0x3000 },
+  { 0x8501, 0xd77e, 0x2000 },
+  { 0x0501, 0xd77d, 0x0000 },
+  { 0x0501, 0xd77f, 0x0000 },
+  { 0x8501, 0xd782, 0x2000 },
+  { 0x0501, 0xd781, 0x0000 },
+  { 0x0501, 0xd783, 0x0000 },
+  { 0x8501, 0xd78c, 0x4000 },
+  { 0x8501, 0xd788, 0x3000 },
+  { 0x8501, 0xd786, 0x2000 },
+  { 0x0501, 0xd785, 0x0000 },
+  { 0x0501, 0xd787, 0x0000 },
+  { 0x8501, 0xd78a, 0x2000 },
+  { 0x1901, 0xd789, 0x0000 },
+  { 0x0501, 0xd78b, 0x0000 },
+  { 0x8901, 0xd790, 0x3000 },
+  { 0x8501, 0xd78e, 0x2000 },
+  { 0x0501, 0xd78d, 0x0000 },
+  { 0x0501, 0xd78f, 0x0000 },
+  { 0x8901, 0xd792, 0x2000 },
+  { 0x0901, 0xd791, 0x0000 },
+  { 0x0901, 0xd793, 0x0000 },
+  { 0x8901, 0xd7a4, 0x5000 },
+  { 0x8901, 0xd79c, 0x4000 },
+  { 0x8901, 0xd798, 0x3000 },
+  { 0x8901, 0xd796, 0x2000 },
+  { 0x0901, 0xd795, 0x0000 },
+  { 0x0901, 0xd797, 0x0000 },
+  { 0x8901, 0xd79a, 0x2000 },
+  { 0x0901, 0xd799, 0x0000 },
+  { 0x0901, 0xd79b, 0x0000 },
+  { 0x8901, 0xd7a0, 0x3000 },
+  { 0x8901, 0xd79e, 0x2000 },
+  { 0x0901, 0xd79d, 0x0000 },
+  { 0x0901, 0xd79f, 0x0000 },
+  { 0x8901, 0xd7a2, 0x2000 },
+  { 0x0901, 0xd7a1, 0x0000 },
+  { 0x0901, 0xd7a3, 0x0000 },
+  { 0x8501, 0xd7ac, 0x4000 },
+  { 0x8901, 0xd7a8, 0x3000 },
+  { 0x8901, 0xd7a6, 0x2000 },
+  { 0x0901, 0xd7a5, 0x0000 },
+  { 0x0901, 0xd7a7, 0x0000 },
+  { 0x8501, 0xd7aa, 0x2000 },
+  { 0x1901, 0xd7a9, 0x0000 },
+  { 0x0501, 0xd7ab, 0x0000 },
+  { 0x8501, 0xd7b0, 0x3000 },
+  { 0x8501, 0xd7ae, 0x2000 },
+  { 0x0501, 0xd7ad, 0x0000 },
+  { 0x0501, 0xd7af, 0x0000 },
+  { 0x8501, 0xd7b2, 0x2000 },
+  { 0x0501, 0xd7b1, 0x0000 },
+  { 0x0501, 0xd7b3, 0x0000 },
+  { 0x8d01, 0xd7d8, 0x6000 },
+  { 0x8501, 0xd7c4, 0x5000 },
+  { 0x8501, 0xd7bc, 0x4000 },
+  { 0x8501, 0xd7b8, 0x3000 },
+  { 0x8501, 0xd7b6, 0x2000 },
+  { 0x0501, 0xd7b5, 0x0000 },
+  { 0x0501, 0xd7b7, 0x0000 },
+  { 0x8501, 0xd7ba, 0x2000 },
+  { 0x0501, 0xd7b9, 0x0000 },
+  { 0x0501, 0xd7bb, 0x0000 },
+  { 0x8501, 0xd7c0, 0x3000 },
+  { 0x8501, 0xd7be, 0x2000 },
+  { 0x0501, 0xd7bd, 0x0000 },
+  { 0x0501, 0xd7bf, 0x0000 },
+  { 0x8501, 0xd7c2, 0x2000 },
+  { 0x0501, 0xd7c1, 0x0000 },
+  { 0x1901, 0xd7c3, 0x0000 },
+  { 0x8d01, 0xd7d0, 0x4000 },
+  { 0x8501, 0xd7c8, 0x3000 },
+  { 0x8501, 0xd7c6, 0x2000 },
+  { 0x0501, 0xd7c5, 0x0000 },
+  { 0x0501, 0xd7c7, 0x0000 },
+  { 0x8d01, 0xd7ce, 0x2000 },
+  { 0x0501, 0xd7c9, 0x0000 },
+  { 0x0d01, 0xd7cf, 0x0000 },
+  { 0x8d01, 0xd7d4, 0x3000 },
+  { 0x8d01, 0xd7d2, 0x2000 },
+  { 0x0d01, 0xd7d1, 0x0000 },
+  { 0x0d01, 0xd7d3, 0x0000 },
+  { 0x8d01, 0xd7d6, 0x2000 },
+  { 0x0d01, 0xd7d5, 0x0000 },
+  { 0x0d01, 0xd7d7, 0x0000 },
+  { 0x8d01, 0xd7e8, 0x5000 },
+  { 0x8d01, 0xd7e0, 0x4000 },
+  { 0x8d01, 0xd7dc, 0x3000 },
+  { 0x8d01, 0xd7da, 0x2000 },
+  { 0x0d01, 0xd7d9, 0x0000 },
+  { 0x0d01, 0xd7db, 0x0000 },
+  { 0x8d01, 0xd7de, 0x2000 },
+  { 0x0d01, 0xd7dd, 0x0000 },
+  { 0x0d01, 0xd7df, 0x0000 },
+  { 0x8d01, 0xd7e4, 0x3000 },
+  { 0x8d01, 0xd7e2, 0x2000 },
+  { 0x0d01, 0xd7e1, 0x0000 },
+  { 0x0d01, 0xd7e3, 0x0000 },
+  { 0x8d01, 0xd7e6, 0x2000 },
+  { 0x0d01, 0xd7e5, 0x0000 },
+  { 0x0d01, 0xd7e7, 0x0000 },
+  { 0x8d01, 0xd7f0, 0x4000 },
+  { 0x8d01, 0xd7ec, 0x3000 },
+  { 0x8d01, 0xd7ea, 0x2000 },
+  { 0x0d01, 0xd7e9, 0x0000 },
+  { 0x0d01, 0xd7eb, 0x0000 },
+  { 0x8d01, 0xd7ee, 0x2000 },
+  { 0x0d01, 0xd7ed, 0x0000 },
+  { 0x0d01, 0xd7ef, 0x0000 },
+  { 0x8d01, 0xd7f4, 0x3000 },
+  { 0x8d01, 0xd7f2, 0x2000 },
+  { 0x0d01, 0xd7f1, 0x0000 },
+  { 0x0d01, 0xd7f3, 0x0000 },
+  { 0x8d01, 0xd7f6, 0x2000 },
+  { 0x0d01, 0xd7f5, 0x0000 },
+  { 0x0d01, 0xd7f7, 0x0000 },
+  { 0x8702, 0xf836, 0x7000 },
+  { 0x8702, 0xf816, 0x6000 },
+  { 0x8702, 0xf806, 0x5000 },
+  { 0x8702, 0x0000, 0x4000 },
+  { 0x8d01, 0xd7fc, 0x3000 },
+  { 0x8d01, 0xd7fa, 0x2000 },
+  { 0x0d01, 0xd7f9, 0x0000 },
+  { 0x0d01, 0xd7fb, 0x0000 },
+  { 0x8d01, 0xd7fe, 0x2000 },
+  { 0x0d01, 0xd7fd, 0x0000 },
+  { 0x0d01, 0xd7ff, 0x0000 },
+  { 0x8702, 0xf802, 0x3000 },
+  { 0x8702, 0xf800, 0x2000 },
+  { 0x0702, 0xa6d6, 0x0000 },
+  { 0x0702, 0xf801, 0x0000 },
+  { 0x8702, 0xf804, 0x2000 },
+  { 0x0702, 0xf803, 0x0000 },
+  { 0x0702, 0xf805, 0x0000 },
+  { 0x8702, 0xf80e, 0x4000 },
+  { 0x8702, 0xf80a, 0x3000 },
+  { 0x8702, 0xf808, 0x2000 },
+  { 0x0702, 0xf807, 0x0000 },
+  { 0x0702, 0xf809, 0x0000 },
+  { 0x8702, 0xf80c, 0x2000 },
+  { 0x0702, 0xf80b, 0x0000 },
+  { 0x0702, 0xf80d, 0x0000 },
+  { 0x8702, 0xf812, 0x3000 },
+  { 0x8702, 0xf810, 0x2000 },
+  { 0x0702, 0xf80f, 0x0000 },
+  { 0x0702, 0xf811, 0x0000 },
+  { 0x8702, 0xf814, 0x2000 },
+  { 0x0702, 0xf813, 0x0000 },
+  { 0x0702, 0xf815, 0x0000 },
+  { 0x8702, 0xf826, 0x5000 },
+  { 0x8702, 0xf81e, 0x4000 },
+  { 0x8702, 0xf81a, 0x3000 },
+  { 0x8702, 0xf818, 0x2000 },
+  { 0x0702, 0xf817, 0x0000 },
+  { 0x0702, 0xf819, 0x0000 },
+  { 0x8702, 0xf81c, 0x2000 },
+  { 0x0702, 0xf81b, 0x0000 },
+  { 0x0702, 0xf81d, 0x0000 },
+  { 0x8702, 0xf822, 0x3000 },
+  { 0x8702, 0xf820, 0x2000 },
+  { 0x0702, 0xf81f, 0x0000 },
+  { 0x0702, 0xf821, 0x0000 },
+  { 0x8702, 0xf824, 0x2000 },
+  { 0x0702, 0xf823, 0x0000 },
+  { 0x0702, 0xf825, 0x0000 },
+  { 0x8702, 0xf82e, 0x4000 },
+  { 0x8702, 0xf82a, 0x3000 },
+  { 0x8702, 0xf828, 0x2000 },
+  { 0x0702, 0xf827, 0x0000 },
+  { 0x0702, 0xf829, 0x0000 },
+  { 0x8702, 0xf82c, 0x2000 },
+  { 0x0702, 0xf82b, 0x0000 },
+  { 0x0702, 0xf82d, 0x0000 },
+  { 0x8702, 0xf832, 0x3000 },
+  { 0x8702, 0xf830, 0x2000 },
+  { 0x0702, 0xf82f, 0x0000 },
+  { 0x0702, 0xf831, 0x0000 },
+  { 0x8702, 0xf834, 0x2000 },
+  { 0x0702, 0xf833, 0x0000 },
+  { 0x0702, 0xf835, 0x0000 },
+  { 0x8702, 0xf856, 0x6000 },
+  { 0x8702, 0xf846, 0x5000 },
+  { 0x8702, 0xf83e, 0x4000 },
+  { 0x8702, 0xf83a, 0x3000 },
+  { 0x8702, 0xf838, 0x2000 },
+  { 0x0702, 0xf837, 0x0000 },
+  { 0x0702, 0xf839, 0x0000 },
+  { 0x8702, 0xf83c, 0x2000 },
+  { 0x0702, 0xf83b, 0x0000 },
+  { 0x0702, 0xf83d, 0x0000 },
+  { 0x8702, 0xf842, 0x3000 },
+  { 0x8702, 0xf840, 0x2000 },
+  { 0x0702, 0xf83f, 0x0000 },
+  { 0x0702, 0xf841, 0x0000 },
+  { 0x8702, 0xf844, 0x2000 },
+  { 0x0702, 0xf843, 0x0000 },
+  { 0x0702, 0xf845, 0x0000 },
+  { 0x8702, 0xf84e, 0x4000 },
+  { 0x8702, 0xf84a, 0x3000 },
+  { 0x8702, 0xf848, 0x2000 },
+  { 0x0702, 0xf847, 0x0000 },
+  { 0x0702, 0xf849, 0x0000 },
+  { 0x8702, 0xf84c, 0x2000 },
+  { 0x0702, 0xf84b, 0x0000 },
+  { 0x0702, 0xf84d, 0x0000 },
+  { 0x8702, 0xf852, 0x3000 },
+  { 0x8702, 0xf850, 0x2000 },
+  { 0x0702, 0xf84f, 0x0000 },
+  { 0x0702, 0xf851, 0x0000 },
+  { 0x8702, 0xf854, 0x2000 },
+  { 0x0702, 0xf853, 0x0000 },
+  { 0x0702, 0xf855, 0x0000 },
+  { 0x8702, 0xf866, 0x5000 },
+  { 0x8702, 0xf85e, 0x4000 },
+  { 0x8702, 0xf85a, 0x3000 },
+  { 0x8702, 0xf858, 0x2000 },
+  { 0x0702, 0xf857, 0x0000 },
+  { 0x0702, 0xf859, 0x0000 },
+  { 0x8702, 0xf85c, 0x2000 },
+  { 0x0702, 0xf85b, 0x0000 },
+  { 0x0702, 0xf85d, 0x0000 },
+  { 0x8702, 0xf862, 0x3000 },
+  { 0x8702, 0xf860, 0x2000 },
+  { 0x0702, 0xf85f, 0x0000 },
+  { 0x0702, 0xf861, 0x0000 },
+  { 0x8702, 0xf864, 0x2000 },
+  { 0x0702, 0xf863, 0x0000 },
+  { 0x0702, 0xf865, 0x0000 },
+  { 0x8702, 0xf86e, 0x4000 },
+  { 0x8702, 0xf86a, 0x3000 },
+  { 0x8702, 0xf868, 0x2000 },
+  { 0x0702, 0xf867, 0x0000 },
+  { 0x0702, 0xf869, 0x0000 },
+  { 0x8702, 0xf86c, 0x2000 },
+  { 0x0702, 0xf86b, 0x0000 },
+  { 0x0702, 0xf86d, 0x0000 },
+  { 0x8702, 0xf872, 0x3000 },
+  { 0x8702, 0xf870, 0x2000 },
+  { 0x0702, 0xf86f, 0x0000 },
+  { 0x0702, 0xf871, 0x0000 },
+  { 0x8702, 0xf874, 0x2000 },
+  { 0x0702, 0xf873, 0x0000 },
+  { 0x0702, 0xf875, 0x0000 },
+  { 0x8702, 0xf976, 0x9000 },
+  { 0x8702, 0xf8f6, 0x8000 },
+  { 0x8702, 0xf8b6, 0x7000 },
+  { 0x8702, 0xf896, 0x6000 },
+  { 0x8702, 0xf886, 0x5000 },
+  { 0x8702, 0xf87e, 0x4000 },
+  { 0x8702, 0xf87a, 0x3000 },
+  { 0x8702, 0xf878, 0x2000 },
+  { 0x0702, 0xf877, 0x0000 },
+  { 0x0702, 0xf879, 0x0000 },
+  { 0x8702, 0xf87c, 0x2000 },
+  { 0x0702, 0xf87b, 0x0000 },
+  { 0x0702, 0xf87d, 0x0000 },
+  { 0x8702, 0xf882, 0x3000 },
+  { 0x8702, 0xf880, 0x2000 },
+  { 0x0702, 0xf87f, 0x0000 },
+  { 0x0702, 0xf881, 0x0000 },
+  { 0x8702, 0xf884, 0x2000 },
+  { 0x0702, 0xf883, 0x0000 },
+  { 0x0702, 0xf885, 0x0000 },
+  { 0x8702, 0xf88e, 0x4000 },
+  { 0x8702, 0xf88a, 0x3000 },
+  { 0x8702, 0xf888, 0x2000 },
+  { 0x0702, 0xf887, 0x0000 },
+  { 0x0702, 0xf889, 0x0000 },
+  { 0x8702, 0xf88c, 0x2000 },
+  { 0x0702, 0xf88b, 0x0000 },
+  { 0x0702, 0xf88d, 0x0000 },
+  { 0x8702, 0xf892, 0x3000 },
+  { 0x8702, 0xf890, 0x2000 },
+  { 0x0702, 0xf88f, 0x0000 },
+  { 0x0702, 0xf891, 0x0000 },
+  { 0x8702, 0xf894, 0x2000 },
+  { 0x0702, 0xf893, 0x0000 },
+  { 0x0702, 0xf895, 0x0000 },
+  { 0x8702, 0xf8a6, 0x5000 },
+  { 0x8702, 0xf89e, 0x4000 },
+  { 0x8702, 0xf89a, 0x3000 },
+  { 0x8702, 0xf898, 0x2000 },
+  { 0x0702, 0xf897, 0x0000 },
+  { 0x0702, 0xf899, 0x0000 },
+  { 0x8702, 0xf89c, 0x2000 },
+  { 0x0702, 0xf89b, 0x0000 },
+  { 0x0702, 0xf89d, 0x0000 },
+  { 0x8702, 0xf8a2, 0x3000 },
+  { 0x8702, 0xf8a0, 0x2000 },
+  { 0x0702, 0xf89f, 0x0000 },
+  { 0x0702, 0xf8a1, 0x0000 },
+  { 0x8702, 0xf8a4, 0x2000 },
+  { 0x0702, 0xf8a3, 0x0000 },
+  { 0x0702, 0xf8a5, 0x0000 },
+  { 0x8702, 0xf8ae, 0x4000 },
+  { 0x8702, 0xf8aa, 0x3000 },
+  { 0x8702, 0xf8a8, 0x2000 },
+  { 0x0702, 0xf8a7, 0x0000 },
+  { 0x0702, 0xf8a9, 0x0000 },
+  { 0x8702, 0xf8ac, 0x2000 },
+  { 0x0702, 0xf8ab, 0x0000 },
+  { 0x0702, 0xf8ad, 0x0000 },
+  { 0x8702, 0xf8b2, 0x3000 },
+  { 0x8702, 0xf8b0, 0x2000 },
+  { 0x0702, 0xf8af, 0x0000 },
+  { 0x0702, 0xf8b1, 0x0000 },
+  { 0x8702, 0xf8b4, 0x2000 },
+  { 0x0702, 0xf8b3, 0x0000 },
+  { 0x0702, 0xf8b5, 0x0000 },
+  { 0x8702, 0xf8d6, 0x6000 },
+  { 0x8702, 0xf8c6, 0x5000 },
+  { 0x8702, 0xf8be, 0x4000 },
+  { 0x8702, 0xf8ba, 0x3000 },
+  { 0x8702, 0xf8b8, 0x2000 },
+  { 0x0702, 0xf8b7, 0x0000 },
+  { 0x0702, 0xf8b9, 0x0000 },
+  { 0x8702, 0xf8bc, 0x2000 },
+  { 0x0702, 0xf8bb, 0x0000 },
+  { 0x0702, 0xf8bd, 0x0000 },
+  { 0x8702, 0xf8c2, 0x3000 },
+  { 0x8702, 0xf8c0, 0x2000 },
+  { 0x0702, 0xf8bf, 0x0000 },
+  { 0x0702, 0xf8c1, 0x0000 },
+  { 0x8702, 0xf8c4, 0x2000 },
+  { 0x0702, 0xf8c3, 0x0000 },
+  { 0x0702, 0xf8c5, 0x0000 },
+  { 0x8702, 0xf8ce, 0x4000 },
+  { 0x8702, 0xf8ca, 0x3000 },
+  { 0x8702, 0xf8c8, 0x2000 },
+  { 0x0702, 0xf8c7, 0x0000 },
+  { 0x0702, 0xf8c9, 0x0000 },
+  { 0x8702, 0xf8cc, 0x2000 },
+  { 0x0702, 0xf8cb, 0x0000 },
+  { 0x0702, 0xf8cd, 0x0000 },
+  { 0x8702, 0xf8d2, 0x3000 },
+  { 0x8702, 0xf8d0, 0x2000 },
+  { 0x0702, 0xf8cf, 0x0000 },
+  { 0x0702, 0xf8d1, 0x0000 },
+  { 0x8702, 0xf8d4, 0x2000 },
+  { 0x0702, 0xf8d3, 0x0000 },
+  { 0x0702, 0xf8d5, 0x0000 },
+  { 0x8702, 0xf8e6, 0x5000 },
+  { 0x8702, 0xf8de, 0x4000 },
+  { 0x8702, 0xf8da, 0x3000 },
+  { 0x8702, 0xf8d8, 0x2000 },
+  { 0x0702, 0xf8d7, 0x0000 },
+  { 0x0702, 0xf8d9, 0x0000 },
+  { 0x8702, 0xf8dc, 0x2000 },
+  { 0x0702, 0xf8db, 0x0000 },
+  { 0x0702, 0xf8dd, 0x0000 },
+  { 0x8702, 0xf8e2, 0x3000 },
+  { 0x8702, 0xf8e0, 0x2000 },
+  { 0x0702, 0xf8df, 0x0000 },
+  { 0x0702, 0xf8e1, 0x0000 },
+  { 0x8702, 0xf8e4, 0x2000 },
+  { 0x0702, 0xf8e3, 0x0000 },
+  { 0x0702, 0xf8e5, 0x0000 },
+  { 0x8702, 0xf8ee, 0x4000 },
+  { 0x8702, 0xf8ea, 0x3000 },
+  { 0x8702, 0xf8e8, 0x2000 },
+  { 0x0702, 0xf8e7, 0x0000 },
+  { 0x0702, 0xf8e9, 0x0000 },
+  { 0x8702, 0xf8ec, 0x2000 },
+  { 0x0702, 0xf8eb, 0x0000 },
+  { 0x0702, 0xf8ed, 0x0000 },
+  { 0x8702, 0xf8f2, 0x3000 },
+  { 0x8702, 0xf8f0, 0x2000 },
+  { 0x0702, 0xf8ef, 0x0000 },
+  { 0x0702, 0xf8f1, 0x0000 },
+  { 0x8702, 0xf8f4, 0x2000 },
+  { 0x0702, 0xf8f3, 0x0000 },
+  { 0x0702, 0xf8f5, 0x0000 },
+  { 0x8702, 0xf936, 0x7000 },
+  { 0x8702, 0xf916, 0x6000 },
+  { 0x8702, 0xf906, 0x5000 },
+  { 0x8702, 0xf8fe, 0x4000 },
+  { 0x8702, 0xf8fa, 0x3000 },
+  { 0x8702, 0xf8f8, 0x2000 },
+  { 0x0702, 0xf8f7, 0x0000 },
+  { 0x0702, 0xf8f9, 0x0000 },
+  { 0x8702, 0xf8fc, 0x2000 },
+  { 0x0702, 0xf8fb, 0x0000 },
+  { 0x0702, 0xf8fd, 0x0000 },
+  { 0x8702, 0xf902, 0x3000 },
+  { 0x8702, 0xf900, 0x2000 },
+  { 0x0702, 0xf8ff, 0x0000 },
+  { 0x0702, 0xf901, 0x0000 },
+  { 0x8702, 0xf904, 0x2000 },
+  { 0x0702, 0xf903, 0x0000 },
+  { 0x0702, 0xf905, 0x0000 },
+  { 0x8702, 0xf90e, 0x4000 },
+  { 0x8702, 0xf90a, 0x3000 },
+  { 0x8702, 0xf908, 0x2000 },
+  { 0x0702, 0xf907, 0x0000 },
+  { 0x0702, 0xf909, 0x0000 },
+  { 0x8702, 0xf90c, 0x2000 },
+  { 0x0702, 0xf90b, 0x0000 },
+  { 0x0702, 0xf90d, 0x0000 },
+  { 0x8702, 0xf912, 0x3000 },
+  { 0x8702, 0xf910, 0x2000 },
+  { 0x0702, 0xf90f, 0x0000 },
+  { 0x0702, 0xf911, 0x0000 },
+  { 0x8702, 0xf914, 0x2000 },
+  { 0x0702, 0xf913, 0x0000 },
+  { 0x0702, 0xf915, 0x0000 },
+  { 0x8702, 0xf926, 0x5000 },
+  { 0x8702, 0xf91e, 0x4000 },
+  { 0x8702, 0xf91a, 0x3000 },
+  { 0x8702, 0xf918, 0x2000 },
+  { 0x0702, 0xf917, 0x0000 },
+  { 0x0702, 0xf919, 0x0000 },
+  { 0x8702, 0xf91c, 0x2000 },
+  { 0x0702, 0xf91b, 0x0000 },
+  { 0x0702, 0xf91d, 0x0000 },
+  { 0x8702, 0xf922, 0x3000 },
+  { 0x8702, 0xf920, 0x2000 },
+  { 0x0702, 0xf91f, 0x0000 },
+  { 0x0702, 0xf921, 0x0000 },
+  { 0x8702, 0xf924, 0x2000 },
+  { 0x0702, 0xf923, 0x0000 },
+  { 0x0702, 0xf925, 0x0000 },
+  { 0x8702, 0xf92e, 0x4000 },
+  { 0x8702, 0xf92a, 0x3000 },
+  { 0x8702, 0xf928, 0x2000 },
+  { 0x0702, 0xf927, 0x0000 },
+  { 0x0702, 0xf929, 0x0000 },
+  { 0x8702, 0xf92c, 0x2000 },
+  { 0x0702, 0xf92b, 0x0000 },
+  { 0x0702, 0xf92d, 0x0000 },
+  { 0x8702, 0xf932, 0x3000 },
+  { 0x8702, 0xf930, 0x2000 },
+  { 0x0702, 0xf92f, 0x0000 },
+  { 0x0702, 0xf931, 0x0000 },
+  { 0x8702, 0xf934, 0x2000 },
+  { 0x0702, 0xf933, 0x0000 },
+  { 0x0702, 0xf935, 0x0000 },
+  { 0x8702, 0xf956, 0x6000 },
+  { 0x8702, 0xf946, 0x5000 },
+  { 0x8702, 0xf93e, 0x4000 },
+  { 0x8702, 0xf93a, 0x3000 },
+  { 0x8702, 0xf938, 0x2000 },
+  { 0x0702, 0xf937, 0x0000 },
+  { 0x0702, 0xf939, 0x0000 },
+  { 0x8702, 0xf93c, 0x2000 },
+  { 0x0702, 0xf93b, 0x0000 },
+  { 0x0702, 0xf93d, 0x0000 },
+  { 0x8702, 0xf942, 0x3000 },
+  { 0x8702, 0xf940, 0x2000 },
+  { 0x0702, 0xf93f, 0x0000 },
+  { 0x0702, 0xf941, 0x0000 },
+  { 0x8702, 0xf944, 0x2000 },
+  { 0x0702, 0xf943, 0x0000 },
+  { 0x0702, 0xf945, 0x0000 },
+  { 0x8702, 0xf94e, 0x4000 },
+  { 0x8702, 0xf94a, 0x3000 },
+  { 0x8702, 0xf948, 0x2000 },
+  { 0x0702, 0xf947, 0x0000 },
+  { 0x0702, 0xf949, 0x0000 },
+  { 0x8702, 0xf94c, 0x2000 },
+  { 0x0702, 0xf94b, 0x0000 },
+  { 0x0702, 0xf94d, 0x0000 },
+  { 0x8702, 0xf952, 0x3000 },
+  { 0x8702, 0xf950, 0x2000 },
+  { 0x0702, 0xf94f, 0x0000 },
+  { 0x0702, 0xf951, 0x0000 },
+  { 0x8702, 0xf954, 0x2000 },
+  { 0x0702, 0xf953, 0x0000 },
+  { 0x0702, 0xf955, 0x0000 },
+  { 0x8702, 0xf966, 0x5000 },
+  { 0x8702, 0xf95e, 0x4000 },
+  { 0x8702, 0xf95a, 0x3000 },
+  { 0x8702, 0xf958, 0x2000 },
+  { 0x0702, 0xf957, 0x0000 },
+  { 0x0702, 0xf959, 0x0000 },
+  { 0x8702, 0xf95c, 0x2000 },
+  { 0x0702, 0xf95b, 0x0000 },
+  { 0x0702, 0xf95d, 0x0000 },
+  { 0x8702, 0xf962, 0x3000 },
+  { 0x8702, 0xf960, 0x2000 },
+  { 0x0702, 0xf95f, 0x0000 },
+  { 0x0702, 0xf961, 0x0000 },
+  { 0x8702, 0xf964, 0x2000 },
+  { 0x0702, 0xf963, 0x0000 },
+  { 0x0702, 0xf965, 0x0000 },
+  { 0x8702, 0xf96e, 0x4000 },
+  { 0x8702, 0xf96a, 0x3000 },
+  { 0x8702, 0xf968, 0x2000 },
+  { 0x0702, 0xf967, 0x0000 },
+  { 0x0702, 0xf969, 0x0000 },
+  { 0x8702, 0xf96c, 0x2000 },
+  { 0x0702, 0xf96b, 0x0000 },
+  { 0x0702, 0xf96d, 0x0000 },
+  { 0x8702, 0xf972, 0x3000 },
+  { 0x8702, 0xf970, 0x2000 },
+  { 0x0702, 0xf96f, 0x0000 },
+  { 0x0702, 0xf971, 0x0000 },
+  { 0x8702, 0xf974, 0x2000 },
+  { 0x0702, 0xf973, 0x0000 },
+  { 0x0702, 0xf975, 0x0000 },
+  { 0x810e, 0x0077, 0x9000 },
+  { 0x8702, 0xf9f6, 0x8000 },
+  { 0x8702, 0xf9b6, 0x7000 },
+  { 0x8702, 0xf996, 0x6000 },
+  { 0x8702, 0xf986, 0x5000 },
+  { 0x8702, 0xf97e, 0x4000 },
+  { 0x8702, 0xf97a, 0x3000 },
+  { 0x8702, 0xf978, 0x2000 },
+  { 0x0702, 0xf977, 0x0000 },
+  { 0x0702, 0xf979, 0x0000 },
+  { 0x8702, 0xf97c, 0x2000 },
+  { 0x0702, 0xf97b, 0x0000 },
+  { 0x0702, 0xf97d, 0x0000 },
+  { 0x8702, 0xf982, 0x3000 },
+  { 0x8702, 0xf980, 0x2000 },
+  { 0x0702, 0xf97f, 0x0000 },
+  { 0x0702, 0xf981, 0x0000 },
+  { 0x8702, 0xf984, 0x2000 },
+  { 0x0702, 0xf983, 0x0000 },
+  { 0x0702, 0xf985, 0x0000 },
+  { 0x8702, 0xf98e, 0x4000 },
+  { 0x8702, 0xf98a, 0x3000 },
+  { 0x8702, 0xf988, 0x2000 },
+  { 0x0702, 0xf987, 0x0000 },
+  { 0x0702, 0xf989, 0x0000 },
+  { 0x8702, 0xf98c, 0x2000 },
+  { 0x0702, 0xf98b, 0x0000 },
+  { 0x0702, 0xf98d, 0x0000 },
+  { 0x8702, 0xf992, 0x3000 },
+  { 0x8702, 0xf990, 0x2000 },
+  { 0x0702, 0xf98f, 0x0000 },
+  { 0x0702, 0xf991, 0x0000 },
+  { 0x8702, 0xf994, 0x2000 },
+  { 0x0702, 0xf993, 0x0000 },
+  { 0x0702, 0xf995, 0x0000 },
+  { 0x8702, 0xf9a6, 0x5000 },
+  { 0x8702, 0xf99e, 0x4000 },
+  { 0x8702, 0xf99a, 0x3000 },
+  { 0x8702, 0xf998, 0x2000 },
+  { 0x0702, 0xf997, 0x0000 },
+  { 0x0702, 0xf999, 0x0000 },
+  { 0x8702, 0xf99c, 0x2000 },
+  { 0x0702, 0xf99b, 0x0000 },
+  { 0x0702, 0xf99d, 0x0000 },
+  { 0x8702, 0xf9a2, 0x3000 },
+  { 0x8702, 0xf9a0, 0x2000 },
+  { 0x0702, 0xf99f, 0x0000 },
+  { 0x0702, 0xf9a1, 0x0000 },
+  { 0x8702, 0xf9a4, 0x2000 },
+  { 0x0702, 0xf9a3, 0x0000 },
+  { 0x0702, 0xf9a5, 0x0000 },
+  { 0x8702, 0xf9ae, 0x4000 },
+  { 0x8702, 0xf9aa, 0x3000 },
+  { 0x8702, 0xf9a8, 0x2000 },
+  { 0x0702, 0xf9a7, 0x0000 },
+  { 0x0702, 0xf9a9, 0x0000 },
+  { 0x8702, 0xf9ac, 0x2000 },
+  { 0x0702, 0xf9ab, 0x0000 },
+  { 0x0702, 0xf9ad, 0x0000 },
+  { 0x8702, 0xf9b2, 0x3000 },
+  { 0x8702, 0xf9b0, 0x2000 },
+  { 0x0702, 0xf9af, 0x0000 },
+  { 0x0702, 0xf9b1, 0x0000 },
+  { 0x8702, 0xf9b4, 0x2000 },
+  { 0x0702, 0xf9b3, 0x0000 },
+  { 0x0702, 0xf9b5, 0x0000 },
+  { 0x8702, 0xf9d6, 0x6000 },
+  { 0x8702, 0xf9c6, 0x5000 },
+  { 0x8702, 0xf9be, 0x4000 },
+  { 0x8702, 0xf9ba, 0x3000 },
+  { 0x8702, 0xf9b8, 0x2000 },
+  { 0x0702, 0xf9b7, 0x0000 },
+  { 0x0702, 0xf9b9, 0x0000 },
+  { 0x8702, 0xf9bc, 0x2000 },
+  { 0x0702, 0xf9bb, 0x0000 },
+  { 0x0702, 0xf9bd, 0x0000 },
+  { 0x8702, 0xf9c2, 0x3000 },
+  { 0x8702, 0xf9c0, 0x2000 },
+  { 0x0702, 0xf9bf, 0x0000 },
+  { 0x0702, 0xf9c1, 0x0000 },
+  { 0x8702, 0xf9c4, 0x2000 },
+  { 0x0702, 0xf9c3, 0x0000 },
+  { 0x0702, 0xf9c5, 0x0000 },
+  { 0x8702, 0xf9ce, 0x4000 },
+  { 0x8702, 0xf9ca, 0x3000 },
+  { 0x8702, 0xf9c8, 0x2000 },
+  { 0x0702, 0xf9c7, 0x0000 },
+  { 0x0702, 0xf9c9, 0x0000 },
+  { 0x8702, 0xf9cc, 0x2000 },
+  { 0x0702, 0xf9cb, 0x0000 },
+  { 0x0702, 0xf9cd, 0x0000 },
+  { 0x8702, 0xf9d2, 0x3000 },
+  { 0x8702, 0xf9d0, 0x2000 },
+  { 0x0702, 0xf9cf, 0x0000 },
+  { 0x0702, 0xf9d1, 0x0000 },
+  { 0x8702, 0xf9d4, 0x2000 },
+  { 0x0702, 0xf9d3, 0x0000 },
+  { 0x0702, 0xf9d5, 0x0000 },
+  { 0x8702, 0xf9e6, 0x5000 },
+  { 0x8702, 0xf9de, 0x4000 },
+  { 0x8702, 0xf9da, 0x3000 },
+  { 0x8702, 0xf9d8, 0x2000 },
+  { 0x0702, 0xf9d7, 0x0000 },
+  { 0x0702, 0xf9d9, 0x0000 },
+  { 0x8702, 0xf9dc, 0x2000 },
+  { 0x0702, 0xf9db, 0x0000 },
+  { 0x0702, 0xf9dd, 0x0000 },
+  { 0x8702, 0xf9e2, 0x3000 },
+  { 0x8702, 0xf9e0, 0x2000 },
+  { 0x0702, 0xf9df, 0x0000 },
+  { 0x0702, 0xf9e1, 0x0000 },
+  { 0x8702, 0xf9e4, 0x2000 },
+  { 0x0702, 0xf9e3, 0x0000 },
+  { 0x0702, 0xf9e5, 0x0000 },
+  { 0x8702, 0xf9ee, 0x4000 },
+  { 0x8702, 0xf9ea, 0x3000 },
+  { 0x8702, 0xf9e8, 0x2000 },
+  { 0x0702, 0xf9e7, 0x0000 },
+  { 0x0702, 0xf9e9, 0x0000 },
+  { 0x8702, 0xf9ec, 0x2000 },
+  { 0x0702, 0xf9eb, 0x0000 },
+  { 0x0702, 0xf9ed, 0x0000 },
+  { 0x8702, 0xf9f2, 0x3000 },
+  { 0x8702, 0xf9f0, 0x2000 },
+  { 0x0702, 0xf9ef, 0x0000 },
+  { 0x0702, 0xf9f1, 0x0000 },
+  { 0x8702, 0xf9f4, 0x2000 },
+  { 0x0702, 0xf9f3, 0x0000 },
+  { 0x0702, 0xf9f5, 0x0000 },
+  { 0x810e, 0x0037, 0x7000 },
+  { 0x8702, 0xfa16, 0x6000 },
+  { 0x8702, 0xfa06, 0x5000 },
+  { 0x8702, 0xf9fe, 0x4000 },
+  { 0x8702, 0xf9fa, 0x3000 },
+  { 0x8702, 0xf9f8, 0x2000 },
+  { 0x0702, 0xf9f7, 0x0000 },
+  { 0x0702, 0xf9f9, 0x0000 },
+  { 0x8702, 0xf9fc, 0x2000 },
+  { 0x0702, 0xf9fb, 0x0000 },
+  { 0x0702, 0xf9fd, 0x0000 },
+  { 0x8702, 0xfa02, 0x3000 },
+  { 0x8702, 0xfa00, 0x2000 },
+  { 0x0702, 0xf9ff, 0x0000 },
+  { 0x0702, 0xfa01, 0x0000 },
+  { 0x8702, 0xfa04, 0x2000 },
+  { 0x0702, 0xfa03, 0x0000 },
+  { 0x0702, 0xfa05, 0x0000 },
+  { 0x8702, 0xfa0e, 0x4000 },
+  { 0x8702, 0xfa0a, 0x3000 },
+  { 0x8702, 0xfa08, 0x2000 },
+  { 0x0702, 0xfa07, 0x0000 },
+  { 0x0702, 0xfa09, 0x0000 },
+  { 0x8702, 0xfa0c, 0x2000 },
+  { 0x0702, 0xfa0b, 0x0000 },
+  { 0x0702, 0xfa0d, 0x0000 },
+  { 0x8702, 0xfa12, 0x3000 },
+  { 0x8702, 0xfa10, 0x2000 },
+  { 0x0702, 0xfa0f, 0x0000 },
+  { 0x0702, 0xfa11, 0x0000 },
+  { 0x8702, 0xfa14, 0x2000 },
+  { 0x0702, 0xfa13, 0x0000 },
+  { 0x0702, 0xfa15, 0x0000 },
+  { 0x810e, 0x0027, 0x5000 },
+  { 0x810e, 0x0001, 0x4000 },
+  { 0x8702, 0xfa1a, 0x3000 },
+  { 0x8702, 0xfa18, 0x2000 },
+  { 0x0702, 0xfa17, 0x0000 },
+  { 0x0702, 0xfa19, 0x0000 },
+  { 0x8702, 0xfa1c, 0x2000 },
+  { 0x0702, 0xfa1b, 0x0000 },
+  { 0x0702, 0xfa1d, 0x0000 },
+  { 0x810e, 0x0023, 0x3000 },
+  { 0x810e, 0x0021, 0x2000 },
+  { 0x010e, 0x0020, 0x0000 },
+  { 0x010e, 0x0022, 0x0000 },
+  { 0x810e, 0x0025, 0x2000 },
+  { 0x010e, 0x0024, 0x0000 },
+  { 0x010e, 0x0026, 0x0000 },
+  { 0x810e, 0x002f, 0x4000 },
+  { 0x810e, 0x002b, 0x3000 },
+  { 0x810e, 0x0029, 0x2000 },
+  { 0x010e, 0x0028, 0x0000 },
+  { 0x010e, 0x002a, 0x0000 },
+  { 0x810e, 0x002d, 0x2000 },
+  { 0x010e, 0x002c, 0x0000 },
+  { 0x010e, 0x002e, 0x0000 },
+  { 0x810e, 0x0033, 0x3000 },
+  { 0x810e, 0x0031, 0x2000 },
+  { 0x010e, 0x0030, 0x0000 },
+  { 0x010e, 0x0032, 0x0000 },
+  { 0x810e, 0x0035, 0x2000 },
+  { 0x010e, 0x0034, 0x0000 },
+  { 0x010e, 0x0036, 0x0000 },
+  { 0x810e, 0x0057, 0x6000 },
+  { 0x810e, 0x0047, 0x5000 },
+  { 0x810e, 0x003f, 0x4000 },
+  { 0x810e, 0x003b, 0x3000 },
+  { 0x810e, 0x0039, 0x2000 },
+  { 0x010e, 0x0038, 0x0000 },
+  { 0x010e, 0x003a, 0x0000 },
+  { 0x810e, 0x003d, 0x2000 },
+  { 0x010e, 0x003c, 0x0000 },
+  { 0x010e, 0x003e, 0x0000 },
+  { 0x810e, 0x0043, 0x3000 },
+  { 0x810e, 0x0041, 0x2000 },
+  { 0x010e, 0x0040, 0x0000 },
+  { 0x010e, 0x0042, 0x0000 },
+  { 0x810e, 0x0045, 0x2000 },
+  { 0x010e, 0x0044, 0x0000 },
+  { 0x010e, 0x0046, 0x0000 },
+  { 0x810e, 0x004f, 0x4000 },
+  { 0x810e, 0x004b, 0x3000 },
+  { 0x810e, 0x0049, 0x2000 },
+  { 0x010e, 0x0048, 0x0000 },
+  { 0x010e, 0x004a, 0x0000 },
+  { 0x810e, 0x004d, 0x2000 },
+  { 0x010e, 0x004c, 0x0000 },
+  { 0x010e, 0x004e, 0x0000 },
+  { 0x810e, 0x0053, 0x3000 },
+  { 0x810e, 0x0051, 0x2000 },
+  { 0x010e, 0x0050, 0x0000 },
+  { 0x010e, 0x0052, 0x0000 },
+  { 0x810e, 0x0055, 0x2000 },
+  { 0x010e, 0x0054, 0x0000 },
+  { 0x010e, 0x0056, 0x0000 },
+  { 0x810e, 0x0067, 0x5000 },
+  { 0x810e, 0x005f, 0x4000 },
+  { 0x810e, 0x005b, 0x3000 },
+  { 0x810e, 0x0059, 0x2000 },
+  { 0x010e, 0x0058, 0x0000 },
+  { 0x010e, 0x005a, 0x0000 },
+  { 0x810e, 0x005d, 0x2000 },
+  { 0x010e, 0x005c, 0x0000 },
+  { 0x010e, 0x005e, 0x0000 },
+  { 0x810e, 0x0063, 0x3000 },
+  { 0x810e, 0x0061, 0x2000 },
+  { 0x010e, 0x0060, 0x0000 },
+  { 0x010e, 0x0062, 0x0000 },
+  { 0x810e, 0x0065, 0x2000 },
+  { 0x010e, 0x0064, 0x0000 },
+  { 0x010e, 0x0066, 0x0000 },
+  { 0x810e, 0x006f, 0x4000 },
+  { 0x810e, 0x006b, 0x3000 },
+  { 0x810e, 0x0069, 0x2000 },
+  { 0x010e, 0x0068, 0x0000 },
+  { 0x010e, 0x006a, 0x0000 },
+  { 0x810e, 0x006d, 0x2000 },
+  { 0x010e, 0x006c, 0x0000 },
+  { 0x010e, 0x006e, 0x0000 },
+  { 0x810e, 0x0073, 0x3000 },
+  { 0x810e, 0x0071, 0x2000 },
+  { 0x010e, 0x0070, 0x0000 },
+  { 0x010e, 0x0072, 0x0000 },
+  { 0x810e, 0x0075, 0x2000 },
+  { 0x010e, 0x0074, 0x0000 },
+  { 0x010e, 0x0076, 0x0000 },
+  { 0x8c0e, 0x0177, 0x8000 },
+  { 0x8c0e, 0x0137, 0x7000 },
+  { 0x8c0e, 0x0117, 0x6000 },
+  { 0x8c0e, 0x0107, 0x5000 },
+  { 0x810e, 0x007f, 0x4000 },
+  { 0x810e, 0x007b, 0x3000 },
+  { 0x810e, 0x0079, 0x2000 },
+  { 0x010e, 0x0078, 0x0000 },
+  { 0x010e, 0x007a, 0x0000 },
+  { 0x810e, 0x007d, 0x2000 },
+  { 0x010e, 0x007c, 0x0000 },
+  { 0x010e, 0x007e, 0x0000 },
+  { 0x8c0e, 0x0103, 0x3000 },
+  { 0x8c0e, 0x0101, 0x2000 },
+  { 0x0c0e, 0x0100, 0x0000 },
+  { 0x0c0e, 0x0102, 0x0000 },
+  { 0x8c0e, 0x0105, 0x2000 },
+  { 0x0c0e, 0x0104, 0x0000 },
+  { 0x0c0e, 0x0106, 0x0000 },
+  { 0x8c0e, 0x010f, 0x4000 },
+  { 0x8c0e, 0x010b, 0x3000 },
+  { 0x8c0e, 0x0109, 0x2000 },
+  { 0x0c0e, 0x0108, 0x0000 },
+  { 0x0c0e, 0x010a, 0x0000 },
+  { 0x8c0e, 0x010d, 0x2000 },
+  { 0x0c0e, 0x010c, 0x0000 },
+  { 0x0c0e, 0x010e, 0x0000 },
+  { 0x8c0e, 0x0113, 0x3000 },
+  { 0x8c0e, 0x0111, 0x2000 },
+  { 0x0c0e, 0x0110, 0x0000 },
+  { 0x0c0e, 0x0112, 0x0000 },
+  { 0x8c0e, 0x0115, 0x2000 },
+  { 0x0c0e, 0x0114, 0x0000 },
+  { 0x0c0e, 0x0116, 0x0000 },
+  { 0x8c0e, 0x0127, 0x5000 },
+  { 0x8c0e, 0x011f, 0x4000 },
+  { 0x8c0e, 0x011b, 0x3000 },
+  { 0x8c0e, 0x0119, 0x2000 },
+  { 0x0c0e, 0x0118, 0x0000 },
+  { 0x0c0e, 0x011a, 0x0000 },
+  { 0x8c0e, 0x011d, 0x2000 },
+  { 0x0c0e, 0x011c, 0x0000 },
+  { 0x0c0e, 0x011e, 0x0000 },
+  { 0x8c0e, 0x0123, 0x3000 },
+  { 0x8c0e, 0x0121, 0x2000 },
+  { 0x0c0e, 0x0120, 0x0000 },
+  { 0x0c0e, 0x0122, 0x0000 },
+  { 0x8c0e, 0x0125, 0x2000 },
+  { 0x0c0e, 0x0124, 0x0000 },
+  { 0x0c0e, 0x0126, 0x0000 },
+  { 0x8c0e, 0x012f, 0x4000 },
+  { 0x8c0e, 0x012b, 0x3000 },
+  { 0x8c0e, 0x0129, 0x2000 },
+  { 0x0c0e, 0x0128, 0x0000 },
+  { 0x0c0e, 0x012a, 0x0000 },
+  { 0x8c0e, 0x012d, 0x2000 },
+  { 0x0c0e, 0x012c, 0x0000 },
+  { 0x0c0e, 0x012e, 0x0000 },
+  { 0x8c0e, 0x0133, 0x3000 },
+  { 0x8c0e, 0x0131, 0x2000 },
+  { 0x0c0e, 0x0130, 0x0000 },
+  { 0x0c0e, 0x0132, 0x0000 },
+  { 0x8c0e, 0x0135, 0x2000 },
+  { 0x0c0e, 0x0134, 0x0000 },
+  { 0x0c0e, 0x0136, 0x0000 },
+  { 0x8c0e, 0x0157, 0x6000 },
+  { 0x8c0e, 0x0147, 0x5000 },
+  { 0x8c0e, 0x013f, 0x4000 },
+  { 0x8c0e, 0x013b, 0x3000 },
+  { 0x8c0e, 0x0139, 0x2000 },
+  { 0x0c0e, 0x0138, 0x0000 },
+  { 0x0c0e, 0x013a, 0x0000 },
+  { 0x8c0e, 0x013d, 0x2000 },
+  { 0x0c0e, 0x013c, 0x0000 },
+  { 0x0c0e, 0x013e, 0x0000 },
+  { 0x8c0e, 0x0143, 0x3000 },
+  { 0x8c0e, 0x0141, 0x2000 },
+  { 0x0c0e, 0x0140, 0x0000 },
+  { 0x0c0e, 0x0142, 0x0000 },
+  { 0x8c0e, 0x0145, 0x2000 },
+  { 0x0c0e, 0x0144, 0x0000 },
+  { 0x0c0e, 0x0146, 0x0000 },
+  { 0x8c0e, 0x014f, 0x4000 },
+  { 0x8c0e, 0x014b, 0x3000 },
+  { 0x8c0e, 0x0149, 0x2000 },
+  { 0x0c0e, 0x0148, 0x0000 },
+  { 0x0c0e, 0x014a, 0x0000 },
+  { 0x8c0e, 0x014d, 0x2000 },
+  { 0x0c0e, 0x014c, 0x0000 },
+  { 0x0c0e, 0x014e, 0x0000 },
+  { 0x8c0e, 0x0153, 0x3000 },
+  { 0x8c0e, 0x0151, 0x2000 },
+  { 0x0c0e, 0x0150, 0x0000 },
+  { 0x0c0e, 0x0152, 0x0000 },
+  { 0x8c0e, 0x0155, 0x2000 },
+  { 0x0c0e, 0x0154, 0x0000 },
+  { 0x0c0e, 0x0156, 0x0000 },
+  { 0x8c0e, 0x0167, 0x5000 },
+  { 0x8c0e, 0x015f, 0x4000 },
+  { 0x8c0e, 0x015b, 0x3000 },
+  { 0x8c0e, 0x0159, 0x2000 },
+  { 0x0c0e, 0x0158, 0x0000 },
+  { 0x0c0e, 0x015a, 0x0000 },
+  { 0x8c0e, 0x015d, 0x2000 },
+  { 0x0c0e, 0x015c, 0x0000 },
+  { 0x0c0e, 0x015e, 0x0000 },
+  { 0x8c0e, 0x0163, 0x3000 },
+  { 0x8c0e, 0x0161, 0x2000 },
+  { 0x0c0e, 0x0160, 0x0000 },
+  { 0x0c0e, 0x0162, 0x0000 },
+  { 0x8c0e, 0x0165, 0x2000 },
+  { 0x0c0e, 0x0164, 0x0000 },
+  { 0x0c0e, 0x0166, 0x0000 },
+  { 0x8c0e, 0x016f, 0x4000 },
+  { 0x8c0e, 0x016b, 0x3000 },
+  { 0x8c0e, 0x0169, 0x2000 },
+  { 0x0c0e, 0x0168, 0x0000 },
+  { 0x0c0e, 0x016a, 0x0000 },
+  { 0x8c0e, 0x016d, 0x2000 },
+  { 0x0c0e, 0x016c, 0x0000 },
+  { 0x0c0e, 0x016e, 0x0000 },
+  { 0x8c0e, 0x0173, 0x3000 },
+  { 0x8c0e, 0x0171, 0x2000 },
+  { 0x0c0e, 0x0170, 0x0000 },
+  { 0x0c0e, 0x0172, 0x0000 },
+  { 0x8c0e, 0x0175, 0x2000 },
+  { 0x0c0e, 0x0174, 0x0000 },
+  { 0x0c0e, 0x0176, 0x0000 },
+  { 0x8c0e, 0x01b7, 0x7000 },
+  { 0x8c0e, 0x0197, 0x6000 },
+  { 0x8c0e, 0x0187, 0x5000 },
+  { 0x8c0e, 0x017f, 0x4000 },
+  { 0x8c0e, 0x017b, 0x3000 },
+  { 0x8c0e, 0x0179, 0x2000 },
+  { 0x0c0e, 0x0178, 0x0000 },
+  { 0x0c0e, 0x017a, 0x0000 },
+  { 0x8c0e, 0x017d, 0x2000 },
+  { 0x0c0e, 0x017c, 0x0000 },
+  { 0x0c0e, 0x017e, 0x0000 },
+  { 0x8c0e, 0x0183, 0x3000 },
+  { 0x8c0e, 0x0181, 0x2000 },
+  { 0x0c0e, 0x0180, 0x0000 },
+  { 0x0c0e, 0x0182, 0x0000 },
+  { 0x8c0e, 0x0185, 0x2000 },
+  { 0x0c0e, 0x0184, 0x0000 },
+  { 0x0c0e, 0x0186, 0x0000 },
+  { 0x8c0e, 0x018f, 0x4000 },
+  { 0x8c0e, 0x018b, 0x3000 },
+  { 0x8c0e, 0x0189, 0x2000 },
+  { 0x0c0e, 0x0188, 0x0000 },
+  { 0x0c0e, 0x018a, 0x0000 },
+  { 0x8c0e, 0x018d, 0x2000 },
+  { 0x0c0e, 0x018c, 0x0000 },
+  { 0x0c0e, 0x018e, 0x0000 },
+  { 0x8c0e, 0x0193, 0x3000 },
+  { 0x8c0e, 0x0191, 0x2000 },
+  { 0x0c0e, 0x0190, 0x0000 },
+  { 0x0c0e, 0x0192, 0x0000 },
+  { 0x8c0e, 0x0195, 0x2000 },
+  { 0x0c0e, 0x0194, 0x0000 },
+  { 0x0c0e, 0x0196, 0x0000 },
+  { 0x8c0e, 0x01a7, 0x5000 },
+  { 0x8c0e, 0x019f, 0x4000 },
+  { 0x8c0e, 0x019b, 0x3000 },
+  { 0x8c0e, 0x0199, 0x2000 },
+  { 0x0c0e, 0x0198, 0x0000 },
+  { 0x0c0e, 0x019a, 0x0000 },
+  { 0x8c0e, 0x019d, 0x2000 },
+  { 0x0c0e, 0x019c, 0x0000 },
+  { 0x0c0e, 0x019e, 0x0000 },
+  { 0x8c0e, 0x01a3, 0x3000 },
+  { 0x8c0e, 0x01a1, 0x2000 },
+  { 0x0c0e, 0x01a0, 0x0000 },
+  { 0x0c0e, 0x01a2, 0x0000 },
+  { 0x8c0e, 0x01a5, 0x2000 },
+  { 0x0c0e, 0x01a4, 0x0000 },
+  { 0x0c0e, 0x01a6, 0x0000 },
+  { 0x8c0e, 0x01af, 0x4000 },
+  { 0x8c0e, 0x01ab, 0x3000 },
+  { 0x8c0e, 0x01a9, 0x2000 },
+  { 0x0c0e, 0x01a8, 0x0000 },
+  { 0x0c0e, 0x01aa, 0x0000 },
+  { 0x8c0e, 0x01ad, 0x2000 },
+  { 0x0c0e, 0x01ac, 0x0000 },
+  { 0x0c0e, 0x01ae, 0x0000 },
+  { 0x8c0e, 0x01b3, 0x3000 },
+  { 0x8c0e, 0x01b1, 0x2000 },
+  { 0x0c0e, 0x01b0, 0x0000 },
+  { 0x0c0e, 0x01b2, 0x0000 },
+  { 0x8c0e, 0x01b5, 0x2000 },
+  { 0x0c0e, 0x01b4, 0x0000 },
+  { 0x0c0e, 0x01b6, 0x0000 },
+  { 0x8c0e, 0x01d7, 0x6000 },
+  { 0x8c0e, 0x01c7, 0x5000 },
+  { 0x8c0e, 0x01bf, 0x4000 },
+  { 0x8c0e, 0x01bb, 0x3000 },
+  { 0x8c0e, 0x01b9, 0x2000 },
+  { 0x0c0e, 0x01b8, 0x0000 },
+  { 0x0c0e, 0x01ba, 0x0000 },
+  { 0x8c0e, 0x01bd, 0x2000 },
+  { 0x0c0e, 0x01bc, 0x0000 },
+  { 0x0c0e, 0x01be, 0x0000 },
+  { 0x8c0e, 0x01c3, 0x3000 },
+  { 0x8c0e, 0x01c1, 0x2000 },
+  { 0x0c0e, 0x01c0, 0x0000 },
+  { 0x0c0e, 0x01c2, 0x0000 },
+  { 0x8c0e, 0x01c5, 0x2000 },
+  { 0x0c0e, 0x01c4, 0x0000 },
+  { 0x0c0e, 0x01c6, 0x0000 },
+  { 0x8c0e, 0x01cf, 0x4000 },
+  { 0x8c0e, 0x01cb, 0x3000 },
+  { 0x8c0e, 0x01c9, 0x2000 },
+  { 0x0c0e, 0x01c8, 0x0000 },
+  { 0x0c0e, 0x01ca, 0x0000 },
+  { 0x8c0e, 0x01cd, 0x2000 },
+  { 0x0c0e, 0x01cc, 0x0000 },
+  { 0x0c0e, 0x01ce, 0x0000 },
+  { 0x8c0e, 0x01d3, 0x3000 },
+  { 0x8c0e, 0x01d1, 0x2000 },
+  { 0x0c0e, 0x01d0, 0x0000 },
+  { 0x0c0e, 0x01d2, 0x0000 },
+  { 0x8c0e, 0x01d5, 0x2000 },
+  { 0x0c0e, 0x01d4, 0x0000 },
+  { 0x0c0e, 0x01d6, 0x0000 },
+  { 0x8c0e, 0x01e7, 0x5000 },
+  { 0x8c0e, 0x01df, 0x4000 },
+  { 0x8c0e, 0x01db, 0x3000 },
+  { 0x8c0e, 0x01d9, 0x2000 },
+  { 0x0c0e, 0x01d8, 0x0000 },
+  { 0x0c0e, 0x01da, 0x0000 },
+  { 0x8c0e, 0x01dd, 0x2000 },
+  { 0x0c0e, 0x01dc, 0x0000 },
+  { 0x0c0e, 0x01de, 0x0000 },
+  { 0x8c0e, 0x01e3, 0x3000 },
+  { 0x8c0e, 0x01e1, 0x2000 },
+  { 0x0c0e, 0x01e0, 0x0000 },
+  { 0x0c0e, 0x01e2, 0x0000 },
+  { 0x8c0e, 0x01e5, 0x2000 },
+  { 0x0c0e, 0x01e4, 0x0000 },
+  { 0x0c0e, 0x01e6, 0x0000 },
+  { 0x8c0e, 0x01ef, 0x4000 },
+  { 0x8c0e, 0x01eb, 0x3000 },
+  { 0x8c0e, 0x01e9, 0x2000 },
+  { 0x0c0e, 0x01e8, 0x0000 },
+  { 0x0c0e, 0x01ea, 0x0000 },
+  { 0x8c0e, 0x01ed, 0x2000 },
+  { 0x0c0e, 0x01ec, 0x0000 },
+  { 0x0c0e, 0x01ee, 0x0000 },
+  { 0x830f, 0xfffd, 0x2000 },
+  { 0x030f, 0x0000, 0x0000 },
+  { 0x0310, 0x0000, 0x1000 },
+  { 0x0310, 0xfffd, 0x0000 },
+};
diff -Nurp tin-1.6.2/pcre/version.sh tin-1.8.0/pcre/version.sh
--- tin-1.6.2/pcre/version.sh	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/pcre/version.sh	2005-09-12 16:34:51.000000000 +0200
@@ -6,7 +6,7 @@
 # digits for minor numbers less than 10. There are unlikely to be
 # that many releases anyway.
 
-PCRE_MAJOR=4
-PCRE_MINOR=3
-PCRE_DATE=21-May-2003
+PCRE_MAJOR=6
+PCRE_MINOR=4
+PCRE_DATE=05-Sep-2005
 PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR}
diff -Nurp tin-1.6.2/po/POTFILES.in tin-1.8.0/po/POTFILES.in
--- tin-1.6.2/po/POTFILES.in	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/po/POTFILES.in	2005-06-28 10:31:29.000000000 +0200
@@ -34,7 +34,7 @@ src/my_tmpfile.c
 src/newsrc.c
 src/nntplib.c
 src/nrctbl.c
-src/open.c
+src/options_menu.c
 src/page.c
 src/pgp.c
 src/plp_snprintf.c
Binary files tin-1.6.2/po/de.gmo and tin-1.8.0/po/de.gmo differ
diff -Nurp tin-1.6.2/po/de.po tin-1.8.0/po/de.po
--- tin-1.6.2/po/de.po	2003-09-10 17:08:19.000000000 +0200
+++ tin-1.8.0/po/de.po	2005-12-24 19:09:50.505828455 +0100
@@ -5,277 +5,359 @@
 # Christian Garbs <tin-dev@cgarbs.de>, 2003
 #
 msgid	""
-msgstr	"Project-Id-Version: tin 1.6.2\n"
-	"POT-Creation-Date: 2003-09-10 17:05+0200\n"
-	"PO-Revision-Date: 2003-03-13 04:15+0200\n"
-	"Last-Translator: Sven Hartge <oweh@ds9.argh.org>, Kai Bojens "
-	"<kbojens@on-luebeck.de>\n"
+msgstr	"Project-Id-Version: tin 1.8.0\n"
+	"Report-Msgid-Bugs-To: \n"
+	"POT-Creation-Date: 2005-12-24 19:09+0100\n"
+	"PO-Revision-Date: 2005-01-29 23:50+0100\n"
+	"Last-Translator: Sven Hartge <oweh@ds9.argh.org>, Kai Bojens <kbojens@on-"
+	"luebeck.de>\n"
 	"Language-Team: German <german-tin@ds9.argh.org>\n"
 	"MIME-Version: 1.0\n"
 	"Content-Type: text/plain; charset=ISO-8859-1\n"
 	"Content-Transfer-Encoding: 8bit\n"
 
-#: src/attrib.c:574
+#: src/art.c:1533
+#, c-format
+msgid	"%d Bad overview record (%d fields) '%s'"
+msgstr	"%d Fehlerhafter Overview-Datensatz (%d Felder) '%s'"
+
+#: src/attrib.c:649
+#, c-format
 msgid	"# Do not edit this comment block\n"
 	"#\n"
 msgstr	"# Diesen Kommentarabschnitt nicht verändern\n"
 	"#\n"
 
-#: src/attrib.c:575
+#: src/attrib.c:650
+#, c-format
 msgid	"#  scope=STRING (ie. alt.*,!alt.bin*) [mandatory]\n"
-msgstr	"#  scope=STRING  [notwendig]\n"
-	"#    Gültigkeitsbereich, zB. alt.*,!alt.bin*\n"
+msgstr	"#  scope=ZEICHENKETTE  [notwendig]\n"
+	"#    Gültigkeitsbereich, z.B. alt.*,!alt.bin*\n"
 
-#: src/attrib.c:576
+#: src/attrib.c:651
+#, c-format
 msgid	"#  maildir=STRING (ie. ~/Mail)\n"
-msgstr	"#  maildir=STRING\n"
-	"#    Verzeichnis der Mailfolder, z.B. ~/Mail\n"
+msgstr	"#  maildir=ZEICHENKETTE\n"
+	"#    Verzeichnis der Mail-Ordner, z.B. ~/Mail\n"
 
-#: src/attrib.c:577
+#: src/attrib.c:652
+#, c-format
 msgid	"#  savedir=STRING (ie. ~user/News)\n"
-msgstr	"#  savedir=STRING\n"
+msgstr	"#  savedir=ZEICHENKETTE\n"
 	"#    Verzeichnis zum Speichern, z.B. ~user/News\n"
 
-#: src/attrib.c:578
+#: src/attrib.c:653
+#, c-format
 msgid	"#  savefile=STRING (ie. =linux)\n"
-msgstr	"#  savefile=STRING\n"
+msgstr	"#  savefile=ZEICHENKETTE\n"
 	"#    Datei zum Speichern, z.B. =linux\n"
 
-#: src/attrib.c:579
+#: src/attrib.c:654
+#, c-format
 msgid	"#  sigfile=STRING (ie. $var/sig)\n"
-msgstr	"#  sigfile=STRING\n"
+msgstr	"#  sigfile=ZEICHENKETTE\n"
 	"#    Signatur, z.B. $var/sig\n"
 
-#: src/attrib.c:580
+#: src/attrib.c:655
+#, c-format
 msgid	"#  organization=STRING (if beginning with '/' read from file)\n"
-msgstr	"#  organization=STRING\n"
+msgstr	"#  organization=ZEICHENKETTE\n"
 	"#    Organization-Header; ist das erste Zeichen ein '/', wird der\n"
 	"#    Wert aus dieser Datei gelesen.\n"
 
-#: src/attrib.c:581
+#: src/attrib.c:656
+#, c-format
 msgid	"#  followup_to=STRING\n"
-msgstr	"#  followup_to=STRING\n"
+msgstr	"#  followup_to=ZEICHENKETTE\n"
 	"#    Voreinstellung für den Followup-To-Header\n"
 
-#: src/attrib.c:582
+#: src/attrib.c:657
+#, c-format
 msgid	"#  mailing_list=STRING (ie. majordomo@example.org)\n"
-msgstr	"#  mailing_list=STRING\n"
+msgstr	"#  mailing_list=ZEICHENKETTE\n"
 	"#    Gruppe ist eine gegatete Mailingliste, z.B. majordomo@example.org\n"
 
-#: src/attrib.c:583
+#: src/attrib.c:658
+#, c-format
 msgid	"#  x_headers=STRING (ie. ~/.tin/extra-headers)\n"
-msgstr	"#  x_headers=STRING\n"
+msgstr	"#  x_headers=ZEICHENKETTE\n"
 	"#    Zusätzliche Header, z.B. ~/.tin/extra-headers\n"
 
-#: src/attrib.c:584
+#: src/attrib.c:659
+#, c-format
 msgid	"#  x_body=STRING (ie. ~/.tin/extra-body-text)\n"
-msgstr	"#  x_body=STRING\n"
+msgstr	"#  x_body=ZEICHENKETTE\n"
 	"#    Text wird automatisch zu Beginn des Artikels eingefügt,\n"
 	"#    z.B. ~/.tin/extra-body-text\n"
 
-#: src/attrib.c:585
+#: src/attrib.c:660
+#, c-format
 msgid	"#  from=STRING (just append wanted From:-line, don't use quotes)\n"
-msgstr	"#  from=STRING\n"
+msgstr	"#  from=ZEICHENKETTE\n"
 	"#    Absender, einfach den gewünschten Wert eintragen,\n"
 	"#    keine Anführungszeichen verwenden\n"
 
-#: src/attrib.c:586
+#: src/attrib.c:661
+#, c-format
 msgid	"#  news_quote_format=STRING\n"
-msgstr	"#  news_quote_format=STRING\n"
+msgstr	"#  news_quote_format=ZEICHENKETTE\n"
 	"#    Einleitungszeile, z.B. news_quote_format=In %%M, %%F wrote:\n"
 
-#: src/attrib.c:587
+#: src/attrib.c:662
+#, c-format
 msgid	"#  quote_chars=STRING (%%s, %%S for initials)\n"
-msgstr	"#  quote_chars=STRING\n"
+msgstr	"#  quote_chars=ZEICHENKETTE\n"
 	"#    Zeichen für Zitate in Antworten, %%s oder %%S ergibt Autoreninitialien\n"
 
-#: src/attrib.c:588
+#: src/attrib.c:663
+#, c-format
 msgid	"#  mime_types_to_save=STRING (eg. image/*,!image/bmp)\n"
-msgstr	"#  mime_types_to_save=STRING\n"
+msgstr	"#  mime_types_to_save=ZEICHENKETTE\n"
 	"#    z.B. image/*,!image/bmp\n"
 
-#: src/attrib.c:590
+#: src/attrib.c:665
+#, c-format
 msgid	"#  ispell=STRING\n"
-msgstr	"#  ispell=STRING\n"
+msgstr	"#  ispell=ZEICHENKETTE\n"
 	"#    Aufruf der Rechtschreibprüfung,\n"
 	"#    z.B. ispell -C -ddeutsch -w äöüÄÖÜß@ -Tlatin1\n"
 
-#: src/attrib.c:592
+#: src/attrib.c:667
+#, c-format
 msgid	"#  auto_select=ON/OFF\n"
 msgstr	"#  auto_select=ON/OFF\n"
 	"#    Führe GroupMarkUnselArtRead Kommando automatisch beim Betreten\n"
 	"#    der Gruppe aus\n"
 
-#: src/attrib.c:593
+#: src/attrib.c:668
+#, c-format
 msgid	"#  auto_save=ON/OFF\n"
 msgstr	"#  auto_save=ON/OFF\n"
 	"#    Artikel mit 'Archive-name:'-Header automatisch in die darin\n"
 	"#    angegebene Datei speichern\n"
 
-#: src/attrib.c:594
+#: src/attrib.c:669
+#, c-format
 msgid	"#  batch_save=ON/OFF\n"
 msgstr	"#  batch_save=ON/OFF\n"
-	"#    Im Batch-Modus werden die Article beachtet\n"
+	"#    Im Batch-Modus werden die Artikel beachtet\n"
 
-#: src/attrib.c:595
+#: src/attrib.c:670
+#, c-format
 msgid	"#  delete_tmp_files=ON/OFF\n"
 msgstr	"#  delete_tmp_files=ON/OFF\n"
 	"#    Gespeicherte, zur Nachbearbeitung weitergegebene Artikel ohne\n"
 	"#    Nachfrage löschen\n"
 
-#: src/attrib.c:596
+#: src/attrib.c:671
+#, c-format
 msgid	"#  show_only_unread=ON/OFF\n"
 msgstr	"#  show_only_unread=ON/OFF\n"
 	"#    nur ungelesene Artikel anzeigen\n"
 
-#: src/attrib.c:597
+#: src/attrib.c:672
+#, c-format
 msgid	"#  thread_arts=NUM"
 msgstr	"#  thread_arts=ZAHL\n"
 	"#    Threading nach:"
 
-#: src/attrib.c:604
+#: src/attrib.c:679
+#, c-format
+msgid	"#  thread_perc=NUM\n"
+msgstr	"#  thread_perc=ZAHL\n"
+	"#    Wieviel Prozent des Subjects müssen gleich sein?\n"
+
+#: src/attrib.c:680
+#, c-format
 msgid	"#  show_author=NUM\n"
 msgstr	"#  show_author=ZAHL\n"
 	"#    Anzeige des From-Felds\n"
 
-#: src/attrib.c:610
+#: src/attrib.c:686
+#, c-format
+msgid	"#  show_info=NUM\n"
+msgstr	"#  show_info=ZAHL\n"
+
+#: src/attrib.c:692
+#, c-format
 msgid	"#  sort_art_type=NUM\n"
 msgstr	"#  sort_art_type=ZAHL\n"
 	"#    Artikel sortieren nach:\n"
 
-#: src/attrib.c:628
+#: src/attrib.c:710
+#, c-format
 msgid	"#  sort_threads_type=NUM\n"
 msgstr	"#  sort_threads_type=ZAHL\n"
 	"#    Threads sortieren nach:\n"
 
-#: src/attrib.c:633
+#: src/attrib.c:715
+#, c-format
 msgid	"#  post_proc_type=NUM\n"
 msgstr	"#  post_proc_type=ZAHL\n"
 	"#    Nachbearbeitung\n"
 
-#: src/attrib.c:638
+#: src/attrib.c:720
+#, c-format
 msgid	"#  quick_kill_scope=STRING (ie. talk.*)\n"
-msgstr	"#  quick_kill_scope=STRING\n"
+msgstr	"#  quick_kill_scope=ZEICHENKETTE\n"
 	"#    Voreinstellung für Gültigkeitsbereich neuer Kill-Einträge,\n"
 	"#    z.B. talk.*\n"
 
-#: src/attrib.c:639
+#: src/attrib.c:721
+#, c-format
 msgid	"#  quick_kill_expire=ON/OFF\n"
 msgstr	"#  quick_kill_expire=ON/OFF\n"
 	"#    Kill verfällt automatisch\n"
 
-#: src/attrib.c:640
+#: src/attrib.c:722
+#, c-format
 msgid	"#  quick_kill_case=ON/OFF\n"
 msgstr	"#  quick_kill_case=ON/OFF\n"
 	"#    Kill beachtet Gross/Kleinschreibung\n"
 
-#: src/attrib.c:641
+#: src/attrib.c:723
+#, c-format
 msgid	"#  quick_kill_header=NUM\n"
 msgstr	"#  quick_kill_header=ZAHL\n"
 	"#    Killen nach:\n"
 
-#: src/attrib.c:642 src/attrib.c:649
+#: src/attrib.c:724 src/attrib.c:731
+#, c-format
 msgid	"#    0=subj (case sensitive) 1=subj (ignore case)\n"
 msgstr	"#    0=Subject (Gross/Kleinschreibung beachten), 1=Subject (G/K ignorieren)\n"
 
-#: src/attrib.c:643 src/attrib.c:650
+#: src/attrib.c:725 src/attrib.c:732
+#, c-format
 msgid	"#    2=from (case sensitive) 3=from (ignore case)\n"
 msgstr	"#    2=From (G/K beachten), 3=From (G/K ignorieren)\n"
 
-#: src/attrib.c:644 src/attrib.c:651
+#: src/attrib.c:726 src/attrib.c:733
+#, c-format
 msgid	"#    4=msgid 5=lines\n"
 msgstr	"#    4=Message-ID, 5=Zeilen\n"
 
-#: src/attrib.c:645
+#: src/attrib.c:727
+#, c-format
 msgid	"#  quick_select_scope=STRING\n"
-msgstr	"#  quick_select_scope=STRING\n"
+msgstr	"#  quick_select_scope=ZEICHENKETTE\n"
 	"#    Voreinstellung für Gültigkeitsbereich neuer Auswahlregeln (Hochscoren)\n"
 
-#: src/attrib.c:646
+#: src/attrib.c:728
+#, c-format
 msgid	"#  quick_select_expire=ON/OFF\n"
 msgstr	"#  quick_select_expire=ON/OFF\n"
 	"#    Regel verfällt automatisch\n"
 
-#: src/attrib.c:647
+#: src/attrib.c:729
+#, c-format
 msgid	"#  quick_select_case=ON/OFF\n"
 msgstr	"#  quick_select_case=ON/OFF\n"
 	"#    Regel beachtet Gross/Kleinschreibung\n"
 
-#: src/attrib.c:648
+#: src/attrib.c:730
+#, c-format
 msgid	"#  quick_select_header=NUM\n"
 msgstr	"#  quick_select_header=NUM\n"
 	"#    Auswählen (Hochscoren) nach:\n"
 
-#: src/attrib.c:652
+#: src/attrib.c:734
+#, c-format
 msgid	"#  x_comment_to=ON/OFF\n"
 msgstr	"#  x_comment_to=ON/OFF\n"
 	"#    X-Comment-To:-Header einfügen.\n"
 	"#    (Nur sinnvoll in nach Fido Technology Network gegateten Gruppen.)\n"
 
-#: src/attrib.c:653
+#: src/attrib.c:735
+#, c-format
+msgid	"#  fcc=STRING (eg. =mailbox)\n"
+msgstr	"#  fcc=ZEICHENKETTE\n"
+	"#    Datei in der eine Kopie der Mail abgelegt werden soll,#    z.B: "
+	"=mailbox\n"
+
+#: src/attrib.c:736
+#, c-format
 msgid	"#  tex2iso_conv=ON/OFF\n"
 msgstr	"#  tex2iso_conv=ON/OFF\n"
 	"#    Automatische Umwandlung von TeX-Umlauten\n"
 
-#: src/attrib.c:655
+#: src/attrib.c:737
+#, c-format
+msgid	"#  mime_forward=ON/OFF\n"
+msgstr	"#  mime_forward=ON/OFF\n"
+	"#    Weitergeleitete Artikel als MIME-Anhang senden\n"
+
+#: src/attrib.c:739
+#, c-format
 msgid	"#  mm_network_charset=supported_charset"
 msgstr	"#  mm_network_charset=Zeichensatz\n"
 	"#    Erlaubt sind folgende:"
 
-#: src/attrib.c:662
+#: src/attrib.c:746
+#, c-format
 msgid	"#  undeclared_charset=STRING (default is US-ASCII)\n"
-msgstr	"#  undeclared_charset=STRING\n"
+msgstr	"#  undeclared_charset=ZEICHENKETTE\n"
 	"#    Voreinstellung ist US-ASCII\n"
 
-#: src/attrib.c:664
+#: src/attrib.c:748
+#, c-format
 msgid	"#\n"
 	"# Note that it is best to put general (global scoping)\n"
 msgstr	"#\n"
 	"# Es empfiehlt sich, zuerst allgemein gültige und danach spezielle,\n"
 
-#: src/attrib.c:665
+#: src/attrib.c:749
+#, c-format
 msgid	"# entries first followed by group specific entries.\n"
 	"#\n"
 msgstr	"# nur für bestimmte Newsgruppen gültige Einträge aufzuführen.\n"
 	"#\n"
 
-#: src/attrib.c:666
+#: src/attrib.c:750
+#, c-format
 msgid	"############################################################################\n"
 	"\n"
 msgstr	"############################################################################\n"
 	"\n"
 
-#: src/attrib.c:672
+#: src/attrib.c:756
+#, c-format
 msgid	"# include extra headers\n"
 msgstr	"# Zusätzliche Header einfügen\n"
 
-#: src/attrib.c:680
+#: src/attrib.c:764
+#, c-format
 msgid	"# in *sources* set post process type to shar only\n"
 msgstr	"# in *sources* nur Nachbearbeitung mit shar\n"
 
-#: src/attrib.c:684
-msgid	"# in *binaries* do full post processing, remove tmp files\n"
-msgstr	"# in *binaries* Nachbearbeitung, temporäre Dateien löschen\n"
-
-#: src/attrib.c:685
-msgid	"# and set Followup-To: poster\n"
-msgstr	"# und Antwort per EMail (Followup-To: poster) anfordern\n"
+#: src/attrib.c:768
+#, c-format
+msgid	"# in *binaries* do full post processing but no TeX2ISO conversion,\n"
+msgstr	"# in *binaries* Nachbearbeitung ohne TeX2ISO umwandlung,\n"
+
+#: src/attrib.c:769
+#, c-format
+msgid	"# remove tmp files and set Followup-To: poster\n"
+msgstr	"# temporäre Dateien löschen und Followup-To: poster setzen\n"
 
-#: src/cook.c:799
+#: src/cook.c:499
 msgid	"(unknown)"
 msgstr	"(unbekannt)"
 
 #.
 #. * TODO: add to the right rule, give better explanation, -> lang.c
 #.
-#: src/filter.c:604 src/filter.c:612
+#: src/filter.c:597 src/filter.c:605
 msgid	"Removed from the previous rule: "
 msgstr	"Aus der vorigen Regel gelöscht: "
 
+# TRANSLATION MISSING
+#: src/keymap.c:271
+msgid	"NULL"
+msgstr	""
+
 #: src/lang.c:42
-#, c-format
-msgid	"1 Response%s"
-msgstr	"1 Antwort%s"
+msgid	"1 Response"
+msgstr	"1 Antwort"
 
 #: src/lang.c:46
 #, c-format
@@ -307,7 +389,7 @@ msgstr	"Artikel kann nicht gecancelt (ge
 
 #: src/lang.c:52
 msgid	"Article deleted."
-msgstr	"Artikel gelöscht"
+msgstr	"Artikel gelöscht."
 
 #: src/lang.c:53
 #, c-format
@@ -357,7 +439,7 @@ msgstr	"Artikel abgelehnt (abgespeichert
 #: src/lang.c:62
 #, c-format
 msgid	"%s=article, %s=thread, %s=hot, %s=pattern, %s=tagged articles, %s=quit: "
-msgstr	"%s=Artikel %s=Thread %s=hervorgehoben %s=muster %s=markierte %s=beenden: "
+msgstr	"%s=Artikel %s=Thread %s=hervorgehoben %s=Muster %s=markierte %s=beenden: "
 
 #: src/lang.c:63
 msgid	"Article unavailable"
@@ -365,7 +447,7 @@ msgstr	"Artikel nicht verfügbar"
 
 #: src/lang.c:64
 msgid	"Article undeleted."
-msgstr	"Artikellöschen rückgängig gemacht"
+msgstr	"Artikel löschen rückgängig gemacht."
 
 #: src/lang.c:66
 msgid	"articles"
@@ -498,8 +580,9 @@ msgid	"*** Beginning of article ***"
 msgstr	"*** Anfang des Artikels ***"
 
 #: src/lang.c:97
-msgid	"Cancel (delete) or supersede (overwrite) article [%%.*s]? (%s/%s/%s): "
-msgstr	"[%%.*s] canceln (löschen) oder superseden (überschreiben)? (%s/%s/%s): "
+#, c-format
+msgid	"Cancel (delete) or supersede (overwrite) article [%%s]? (%s/%s/%s): "
+msgstr	"[%%s] canceln (löschen) oder superseden (überschreiben)? (%s/%s/%s): "
 
 #: src/lang.c:98
 msgid	"Cancelling article..."
@@ -587,271 +670,271 @@ msgstr	"Prüfe, ob neue Artikel vorhanden
 msgid	"Post-process %s=no, %s=yes, %s=shar, %s=quit: "
 msgstr	"Nachbearbeiten %s=nein, %s=ja, %s=shar, %s=Ende: "
 
-#: src/lang.c:118
+#: src/lang.c:119
 msgid	"ANSI color disabled"
 msgstr	"ANSI Farben ausgeschaltet"
 
-#: src/lang.c:119
+#: src/lang.c:120
 msgid	"ANSI color enabled"
 msgstr	"ANSI Farben eingeschaltet"
 
-#: src/lang.c:120
+#: src/lang.c:122
 #, c-format
 msgid	"Command failed: %s"
 msgstr	"Befehl fehlgeschlagen: %s"
 
-#: src/lang.c:121
+#: src/lang.c:123
 msgid	"Mark not selected articles read?"
 msgstr	"Nicht ausgewählte (hot) Artikel auf gelesen setzen?"
 
-#: src/lang.c:122
+#: src/lang.c:124
 #, c-format
 msgid	"Connecting to %s..."
 msgstr	"Verbinde mit %s..."
 
-#: src/lang.c:123
+#: src/lang.c:125
 msgid	"<CR>"
 msgstr	"<CR>"
 
-#: src/lang.c:124
+#: src/lang.c:126
 msgid	"Creating active file for saved groups...\n"
 msgstr	"Erzeuge die Datei 'active' für gespeicherte Gruppen...\n"
 
-#: src/lang.c:125
+#: src/lang.c:127
 msgid	"Creating newsrc file...\n"
 msgstr	"Erzeuge newsrc Datei...\n"
 
-#: src/lang.c:127 src/lang.c:1129
+#: src/lang.c:129 src/lang.c:1150
 msgid	"Default"
 msgstr	"Voreinstellung"
 
-#: src/lang.c:128
+#: src/lang.c:130
 msgid	"Delete saved files that have been post processed?"
 msgstr	"Löschen der gespeicherten Dateien, die nachbearbeitet wurden?"
 
-#: src/lang.c:129
+#: src/lang.c:131
 msgid	"Deleting temporary files..."
 msgstr	"Lösche temporäre Dateien..."
 
-#: src/lang.c:131
+#: src/lang.c:133
 msgid	"*** End of article ***"
 msgstr	"*** Ende des Artikels ***"
 
-#: src/lang.c:132
+#: src/lang.c:134
 msgid	"*** End of articles ***"
 msgstr	"*** Ende der Artikel ***"
 
-#: src/lang.c:133
+#: src/lang.c:135
 msgid	"*** End of groups ***"
 msgstr	"*** Ende der Gruppen ***"
 
-#: src/lang.c:134
+#: src/lang.c:136
 msgid	"*** End of thread ***"
 msgstr	"*** Ende des Threads ***"
 
-#: src/lang.c:135
+#: src/lang.c:137
 msgid	"Enter limit of articles to get> "
 msgstr	"Anzahl zu holender Artikel> "
 
-#: src/lang.c:136
+#: src/lang.c:138
 msgid	"Enter Message-ID to go to> "
 msgstr	"Message-ID, die Sie suchen> "
 
-#: src/lang.c:137
+#: src/lang.c:139
 msgid	" and enter next unread thread"
 msgstr	" und nächsten ungel. Thread betreten"
 
-#: src/lang.c:138
+#: src/lang.c:140
 msgid	" and enter next unread group"
 msgstr	" und betritt nächste Gruppe"
 
-#: src/lang.c:139
+#: src/lang.c:141
 msgid	"Enter option number> "
 msgstr	"Optionsnummer eingeben> "
 
-#: src/lang.c:140
+#: src/lang.c:142
 #, c-format
 msgid	"Enter range [%s]> "
 msgstr	"Bereich eingeben [%s]> "
 
-#: src/lang.c:141
+#: src/lang.c:143
 msgid	"\n"
 	"Warning: Approved: header used.\n"
 msgstr	"\n"
 	"Warnung: Approved:-Header benutzt.\n"
 
-#: src/lang.c:143
+#: src/lang.c:145
 msgid	"\n"
 	"Error: Bad address in Approved: header.\n"
 msgstr	"\n"
 	"Fehler: Ungültige Adresse im Approved:-Header.\n"
 
-#: src/lang.c:144
+#: src/lang.c:146
 msgid	"\n"
 	"Error: Bad address in From: header.\n"
 msgstr	"\n"
 	"Fehler: Ungültige Adresse im From:-Header.\n"
 
-#: src/lang.c:145
+#: src/lang.c:147
 msgid	"\n"
 	"Error: Bad address in Reply-To: header.\n"
 msgstr	"\n"
 	"Fehler: Ungültige Adresse im Reply-To:-Header.\n"
 
-#: src/lang.c:146
+#: src/lang.c:148
 msgid	"\n"
 	"Error: Bad FQDN in Message-ID: header.\n"
 msgstr	"\n"
-	"Error: Ungültiger FQDN im Message-ID:-Header.\n"
+	"Fehler: Ungültiger FQDN im Message-ID:-Header.\n"
 
-#: src/lang.c:147
+#: src/lang.c:149
 #, c-format
 msgid	"Can't unlock %s"
 msgstr	"Kann Lock auf %s nicht entfernen"
 
-#: src/lang.c:149
+#: src/lang.c:151
 #, c-format
 msgid	"Corrupted file %s"
 msgstr	"Datei %s ist beschädigt"
 
-#: src/lang.c:150
+#: src/lang.c:152
 #, c-format
 msgid	"Couldn't dotlock %s - article not appended!"
 msgstr	"Konnte %s nicht dotlocken - Artikel nicht angehängt!"
 
-#: src/lang.c:151
+#: src/lang.c:153
 #, c-format
 msgid	"Couldn't lock %s - article not appended!"
 msgstr	"Konnte %s nicht locken - Artikel nicht angehängt!"
 
-#: src/lang.c:153
+#: src/lang.c:155
 msgid	"Internal error in GNKSA routine - send bug report.\n"
 msgstr	"Interner Fehler in der GNKSA Routine - Senden Sie einen Fehlerbericht.\n"
 
-#: src/lang.c:154
+#: src/lang.c:156
 msgid	"Left angle bracket missing in route address.\n"
 msgstr	"Linkes Größerzeichen '<' fehlt in Route-Adresse.\n"
 
-#: src/lang.c:155
+#: src/lang.c:157
 msgid	"Left parenthesis missing in old-style address.\n"
 msgstr	"Linke Klammer '(' fehlt in EMail-Adresse (alter Stil).\n"
 
-#: src/lang.c:156
+#: src/lang.c:158
 msgid	"Right parenthesis missing in old-style address.\n"
 msgstr	"Rechte Klammer ')' fehlt in EMail-Adresse (alter Stil).\n"
 
-#: src/lang.c:157
+#: src/lang.c:159
 msgid	"At-sign missing in mail address.\n"
 msgstr	"In der Mailadresse fehlt das '@'.\n"
 
-#: src/lang.c:158
+#: src/lang.c:160
 msgid	"Single component FQDN is not allowed. Add your domain.\n"
-msgstr	"Ein einteiliger FQDN ist nicht erlaubt. Fügen Sie ihre Domain hinzu.\n"
+msgstr	"Ein einteiliger FQDN ist nicht erlaubt. Fügen Sie Ihre Domain hinzu.\n"
 
-#: src/lang.c:159
+#: src/lang.c:161
 msgid	"Invalid domain. Send bug report if your top level domain really exists.\n"
 	"Use .invalid as top level domain for munged addresses.\n"
-msgstr	"Unzulässige Domain. Senden Sie einen Fehlerbericht, wenn es ihre TL-Domain\n"
-	"wirklich gibt. Benutzen sie .invalid für bewusst falsche Adressen.\n"
+msgstr	"Unzulässige Domain. Senden Sie einen Fehlerbericht, wenn es Ihre TL-Domain\n"
+	"wirklich gibt. Benutzen Sie .invalid für bewusst falsche Adressen.\n"
 
-#: src/lang.c:160
+#: src/lang.c:162
 msgid	"Illegal domain. Send bug report if your top level domain really exists.\n"
 	"Use .invalid as top level domain for munged addresses.\n"
-msgstr	"Regelwidrige Domain. Senden Sie einen Fehlerbericht, wenn es ihre TL-Domain\n"
-	"wirklich gibt. Benutzen sie .invalid für bewusst falsche Adressen.\n"
+msgstr	"Regelwidrige Domain. Senden Sie einen Fehlerbericht, wenn es Ihre TL-Domain\n"
+	"wirklich gibt. Benutzen Sie .invalid für bewusst falsche Adressen.\n"
 
-#: src/lang.c:161
+#: src/lang.c:163
 msgid	"Unknown domain. Send bug report if your top level domain really exists.\n"
 	"Use .invalid as top level domain for munged addresses.\n"
-msgstr	"Unbekannte Domain. Senden Sie einen Fehlerbericht, wenn es ihre TL-Domain\n"
-	"wirklich gibt. Benutzen sie .invalid für bewusst falsche Adressen.\n"
+msgstr	"Unbekannte Domain. Senden Sie einen Fehlerbericht, wenn es Ihre TL-Domain\n"
+	"wirklich gibt. Benutzen Sie .invalid für bewusst falsche Adressen.\n"
 
-#: src/lang.c:162
+#: src/lang.c:164
 msgid	"Illegal character in FQDN.\n"
 msgstr	"Ungültiges Zeichen im FQDN.\n"
 
-#: src/lang.c:163
+#: src/lang.c:165
 msgid	"Zero length FQDN component not allowed.\n"
 msgstr	"Der FQDN darf keine leere Komponente enthalten.\n"
 
-#: src/lang.c:164
+#: src/lang.c:166
 msgid	"FQDN component exceeds maximum allowed length (63 chars).\n"
 msgstr	"Eine Komponente des FQDN überschreitet die maximale Länge (63 Zeichen).\n"
 
-#: src/lang.c:165
+#: src/lang.c:167
 msgid	"FQDN component may not start or end with hyphen.\n"
 msgstr	"Komponenten des FQDN dürfen nicht mit einem Bindestrich beginnen.\n"
 
-#: src/lang.c:166
+#: src/lang.c:168
 msgid	"FQDN component may not start with digit.\n"
 msgstr	"Komponenten des FQDN dürfen nicht mit einer Zahl beginnen.\n"
 
-#: src/lang.c:167
+#: src/lang.c:169
 msgid	"Domain literal has impossible numeric value.\n"
 msgstr	"Die IP-Adresse ist nicht gültig.\n"
 
-#: src/lang.c:168
+#: src/lang.c:170
 msgid	"Domain literal is for private use only and not allowed for global use.\n"
 msgstr	"Die IP-Adresse ist ausschließlich für den privaten Gebrauch gedacht.\n"
 
-#: src/lang.c:169
+#: src/lang.c:171
 msgid	"Right bracket missing in domain literal.\n"
 msgstr	"Die rechte Klammer nach der IP-Adresse fehlt.\n"
 
-#: src/lang.c:170
+#: src/lang.c:172
 msgid	"Missing localpart of mail address.\n"
 msgstr	"Fehlender Lokalteil in der Mailadresse.\n"
 
-#: src/lang.c:171
+#: src/lang.c:173
 msgid	"Illegal character in localpart of mail address.\n"
 msgstr	"Ungültiges Zeichen im Lokalteil der Mailadresse.\n"
 
-#: src/lang.c:172
+#: src/lang.c:174
 msgid	"Zero length localpart component not allowed.\n"
 msgstr	"Eine leere Lokalteilkomponente ist nicht erlaubt.\n"
 
-#: src/lang.c:173
+#: src/lang.c:175
 msgid	"Illegal character in realname.\n"
 	"Unquoted words may not contain '!()<>@,;:\\.[]' in route addresses.\n"
 msgstr	"Ungültiges Zeichen im Realname.\n"
 	"Ungeschützte Wörter dürfen kein '!()<>@,;:\\.[]' in der Adresse enthalten.\n"
 
-#: src/lang.c:174
+#: src/lang.c:176
 msgid	"Illegal character in realname.\n"
 	"Quoted words may not contain '()<>\\'.\n"
 msgstr	"Ungültiges Zeichen im Realname.\n"
 	"Geschützte Wörter dürfen kein '()<>\\' enthalten.\n"
 
-#: src/lang.c:175
+#: src/lang.c:177
 msgid	"Illegal character in realname.\n"
 	"Encoded words may not contain '!()<>@,;:\"\\.[]/=' in parameter.\n"
 msgstr	"Ungültiges Zeichen im Realname.\n"
 	"Kodierte Wörter dürfen '!()<>@,;:\"\\.[]/=' nicht enthalten.\n"
 
-#: src/lang.c:176
+#: src/lang.c:178
 msgid	"Bad syntax in encoded word used in realname.\n"
 msgstr	"Falsche Syntax im kodierten Wort, das im Realname enthalten ist.\n"
 
-#: src/lang.c:177
+#: src/lang.c:179
 msgid	"Illegal character in realname.\n"
 	"Unquoted words may not contain '()<>\\' in old-style addresses.\n"
 msgstr	"Ungültiges Zeichen im Realname.\n"
 	"Ungeschützte Wörter dürfen kein '()<>\\' in Adressen enthalten (alter Stil).\n"
 
-#: src/lang.c:178
+#: src/lang.c:180
 msgid	"Illegal character in realname.\n"
 	"Control characters and unencoded 8bit characters > 127 are not allowed.\n"
 msgstr	"Ungültiges Zeichen im Realname.\n"
 	"Kontrollzeichen und unkodierte 8bit Zeichen > 127 sind verboten.\n"
 
-#: src/lang.c:179
+#: src/lang.c:181
 msgid	"\n"
 	"Error: No blank line found after header.\n"
 msgstr	"\n"
 	"Fehler: Keine Leerzeile nach dem Header gefunden.\n"
 
 #. TODO: fixme, US-ASCII is not the only 7bit charset we know about
-#: src/lang.c:181
+#: src/lang.c:183
 msgid	"\n"
 	"Error: Posting contains non-ASCII characters but MM_CHARSET is set to\n"
 	"       US-ASCII  - please change this setting to a suitable value for\n"
@@ -860,10 +943,10 @@ msgid	"\n"
 msgstr	"\n"
 	"Fehler: Das Posting enthält  nicht-ASCII Zeichen,  aber MM_CHARSET ist\n"
 	"        auf  US-ASCII  eingestellt.  Bitte ändern  Sie dies  auf einen\n"
-	"        passenden  Wert für ihre  Sprache,  indem Sie  M)enü benutzen,\n"
+	"        passenden  Wert für Ihre  Sprache,  indem Sie  M)enü benutzen,\n"
 	"        oder direkt die tinrc ändern.\n"
 
-#: src/lang.c:186
+#: src/lang.c:188
 msgid	"\n"
 	"Error: Posting contains  non-ASCII characters  but the  MIME encoding\n"
 	"       for news  messages  is set  to \"7bit\"  -  please change this\n"
@@ -876,13 +959,13 @@ msgstr	"\n"
 	"        \"8bit\" oder \"quoted-printable\" - Zeichensatzabhängig -  via\n"
 	"         M)enü oder durch editieren der tinrc.\n"
 
-#: src/lang.c:192
+#: src/lang.c:194
 msgid	"\n"
 	"Error: Article starts with blank line instead of header\n"
 msgstr	"\n"
 	"Fehler: Der Artikel beginnt mit einer Leerzeile anstatt des Headers\n"
 
-#: src/lang.c:193
+#: src/lang.c:195
 #, c-format
 msgid	"\n"
 	"Error: Header on line %d does not have a colon after the header name:\n"
@@ -891,21 +974,21 @@ msgstr	"\n"
 	"Fehler: Der Header in Zeile %d enthält kein ':' nach seinem Bezeichner:\n"
 	"%s\n"
 
-#: src/lang.c:194
+#: src/lang.c:196
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line is empty.\n"
 msgstr	"\n"
 	"Fehler: Die \"%s:\" Zeile ist leer.\n"
 
-#: src/lang.c:195
+#: src/lang.c:197
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line is missing from the article header.\n"
 msgstr	"\n"
 	"Fehler: Die \"%s:\" Zeile fehlt im Artikel Header.\n"
 
-#: src/lang.c:196
+#: src/lang.c:198
 #, c-format
 msgid	"\n"
 	"Error: Header on line %d does not have a space after the colon:\n"
@@ -914,145 +997,152 @@ msgstr	"\n"
 	"Fehler: Der Header in der Zeile %d hat kein Leerzeichen nach dem ':' :\n"
 	"%s\n"
 
-#: src/lang.c:197
+#: src/lang.c:199
 #, c-format
 msgid	"\n"
 	"Error: There are multiple (%d) \"%s:\" lines in the header.\n"
 msgstr	"\n"
 	"Fehler: Es sind mehrere (%d) \"%s:\" Zeilen im Header.\n"
 
-#: src/lang.c:198
+#: src/lang.c:200
 #, c-format
 msgid	"Insecure permissions of %s (%o)"
 msgstr	"Unsichere Zugriffsbeschränkungen auf %s (%o)"
 
-#: src/lang.c:199 src/open.c:1009
+#: src/lang.c:201
 #, c-format
 msgid	"Invalid response to GROUP command, %s"
 msgstr	"Ungültige Antwort auf GROUP-Befehl, %s"
 
-#: src/lang.c:201
+#: src/lang.c:203
 #, c-format
 msgid	"MIME parse error: Unexpected end of %s/%s article"
-msgstr	"Fehlerhafter %s/%s-Artikel: Unerwartetes Ende"
+msgstr	"MIME-Fehler: Unerwartetes Ende des %s/%s-Artikels"
 
-# TRANSLATION MISSING
-#: src/lang.c:202
+#: src/lang.c:204
 msgid	"MIME parse error: Start boundary whilst reading headers"
-msgstr	""
+msgstr	"MIME-Fehler: Anfangsgrenze in Hadern"
 
-#: src/lang.c:203
+#: src/lang.c:205
 msgid	"Can't get a (fully-qualified) domain-name!"
 msgstr	"Kann keinen (vollqualifizierten) Domainnamen finden!"
 
-#: src/lang.c:204
+#: src/lang.c:206
 #, c-format
 msgid	"No permissions to go into %s\n"
 msgstr	"Keine Berechtigung um %s zu betreten\n"
 
-#: src/lang.c:205
+#: src/lang.c:207
 msgid	"\n"
 	"Error: From: line missing.\n"
 msgstr	"\n"
 	"Fehler: Die From: Zeile fehlt.\n"
 
-#: src/lang.c:206
+#: src/lang.c:208
 #, c-format
 msgid	"No read permissions for %s\n"
 msgstr	"Keine Leseberechtigung für %s\n"
 
-#: src/lang.c:207
+#: src/lang.c:209
 #, c-format
 msgid	"File %s does not exist\n"
 msgstr	"Datei %s existiert nicht\n"
 
-#: src/lang.c:208
+#: src/lang.c:210
 #, c-format
 msgid	"No write permissions for %s\n"
 msgstr	"Keine Schreibberechtigung für %s\n"
 
-#: src/lang.c:209
+#: src/lang.c:211
 msgid	"Can't get user information (/etc/passwd missing?)"
 msgstr	"Kann Benutzer-Infos nicht finden (/etc/passwd fehlt?)"
 
-#: src/lang.c:210
+#: src/lang.c:212
 msgid	"errors"
 msgstr	"Fehler"
 
-#: src/lang.c:211
+#: src/lang.c:213
 #, c-format
 msgid	"\n"
 	"Error on line %d: \"Sender:\" header not allowed (it will be added for you)\n"
 msgstr	"\n"
 	"Fehler in Zeile %d: \"Sender:\" Header ist nicht erlaubt (wird hinzugefügt)\n"
 
-#: src/lang.c:212
+#: src/lang.c:214
 #, c-format
 msgid	"Server has non of the groups listed in %s"
 msgstr	"Server führt keine der Gruppen aus %s"
 
-#: src/lang.c:213
+#: src/lang.c:215
 msgid	"error"
 msgstr	"Fehler"
 
-#: src/lang.c:214
+#: src/lang.c:216
 msgid	"Unknown display level"
 msgstr	"Unbekannter Level"
 
-#: src/lang.c:215
+#: src/lang.c:217
 msgid	"<ESC>"
 msgstr	"<ESC>"
 
-#: src/lang.c:216
+#: src/lang.c:218
 msgid	"Exiting..."
 msgstr	"Beenden..."
 
-#: src/lang.c:217
+#: src/lang.c:219
 msgid	"leaving external mail-reader"
 msgstr	"Verlasse externen Mailreader"
 
-#: src/lang.c:218
+#: src/lang.c:220
 #, c-format
 msgid	"Extracting %s..."
 msgstr	"Entpacke %s..."
 
-#: src/lang.c:220
+#: src/lang.c:222
 #, c-format
 msgid	"Error writing %s file. Filesystem full? File reset to previous state."
 msgstr	"Fehler beim Schreiben von %s. Dateisystem voll? Datei zurückgesetzt."
 
-#: src/lang.c:221
+#: src/lang.c:223
 #, c-format
 msgid	"Error making backup of %s file. Filesystem full?"
 msgstr	"Fehler beim Erzeugen der Sicherung von %s. Dateisystem voll?"
 
-#: src/lang.c:222
+#: src/lang.c:224
 #, c-format
 msgid	"Filtering global rules (%d/%d)..."
 msgstr	"Filtern nach den globalen Regeln (%d/%d)..."
 
-#: src/lang.c:223
+#: src/lang.c:225
 msgid	"Rule created by: "
 msgstr	"Regel erstellt von: "
 
-#: src/lang.c:224
+#: src/lang.c:226
 #, c-format
 msgid	"Enter pattern [%s]> "
 msgstr	"Muster eingeben [%s]> "
 
-#: src/lang.c:225
+#: src/lang.c:227
 #, c-format
 msgid	"\n"
 	"You requested followups to your article to go to the following %s:\n"
 msgstr	"\n"
-	"Antworten auf ihre Artikel sollen in folgenden %s erscheinen:\n"
+	"Antworten auf Ihre Artikel sollen in folgenden %s erscheinen:\n"
 
-#: src/lang.c:226
+#: src/lang.c:228
 #, c-format
 msgid	"  %s\t Answers will be directed to you by mail.\n"
 msgstr	"  %s\t Antworten erhalten Sie direkt per Mail.\n"
 
-#: src/lang.c:227
+#: src/lang.c:229
+msgid	"-- forwarded message --\n"
+msgstr	"-- weitergeleitete Nachricht --\n"
+
+#: src/lang.c:230
+msgid	"-- end of forwarded message --\n"
+msgstr	"-- Ende der weitergeleiteten Nachricht --\n"
+
+#: src/lang.c:231
 msgid	"# Format:\n"
 	"#   comment=STRING    Optional. Multiple lines allowed. Comments must be "
 	"placed\n"
@@ -1080,32 +1170,32 @@ msgid	"# Format:\n"
 	"#   time=NUM          Optional. time_t value when rule expires\n"
 	"#\n"
 msgstr	"# Format:\n"
-	"#   comment=STRING    Optionaler Kommentar. Es sind mehrere "
+	"#   comment=Z.KETTE   Optionaler Kommentar. Es sind mehrere "
 	"Kommentareinträge\n"
-	"#                     Regel erlaubt. Kommentare müssen ganz am Anfang "
+	"#                     pro Regel erlaubt. Kommentare müssen ganz am Anfang "
 	"stehen,\n"
 	"#                     sonst werden sie zur nächsten Regel verschoben. '#' "
 	"darf\n"
 	"#                     nicht im Kommentar vorkommen!\n"
-	"#   group=STRING      Liste der Newsgroups (z.B. comp.*,!*sources*) "
+	"#   group=Z.KETTE     Liste der Newsgroups (z.B. comp.*,!*sources*) "
 	"[obligatorisch]\n"
 	"#   case=ZAHL         Groß/Kleinschreibung beim Filtern beachten=0,\n"
 	"#                     ignorieren=1        [obligatorisch]\n"
-	"#   score=ZAHL|STRING Score/Bewertung für diese Regel, entweder eine\n"
+	"#   score=ZAHL|ZKETTE Score/Bewertung für diese Regel, entweder eine\n"
 	"#                     Zahl (z.B. 70) oder eines der beiden Schlüsselwörter\n"
 	"#                     'hot' oder 'kill'\n"
-	"#   subj=STRING       Subject(Betreff). (z.B. How to be a wizard)\n"
-	"#   from=STRING       From(Absender). (z.B. *Craig Shergold*)\n"
-	"#   msgid=STRING      Message-ID (z.B.<123@@ether.net>) kommt in Message-ID-\n"
+	"#   subj=ZEICHENKETTE Subject(Betreff). (z.B. How to be a wizard)\n"
+	"#   from=ZEICHENKETTE From(Absender). (z.B. *Craig Shergold*)\n"
+	"#   msgid=Z.KETTE     Message-ID (z.B.<123@@ether.net>) kommt in Message-ID-\n"
 	"#                     oder References-Zeile vor. - Regel wirkt auf den "
 	"Artikel\n"
 	"#                     mit der M-ID und alle Antworten darauf.\n"
-	"#   msgid_last=STRING Message-ID-Header selbst und letzte Element von "
+	"#   msgid_last=ZKETTE Message-ID-Header selbst und letzte Element von "
 	"References\n"
 	"#                     Regel wirkt auf Posting selbst oder _direkte_ "
 	"Antworten.\n"
-	"#   msgid_only=STRING Message-ID lautet (z.B.<123@@ether.net>).\n"
-	"#   refs_only=STRING  References-Header (z.B.<123@@ether.net>), kein\n"
+	"#   msgid_only=ZKETTE Message-ID lautet (z.B.<123@@ether.net>).\n"
+	"#   refs_only=Z.KETTE References-Header (z.B.<123@@ether.net>), kein\n"
 	"#                     Vergleich mit Message-ID-Header.\n"
 	"#   lines=[<>]?ZAHL   Zeilenanzahl (Lines-Header)\n"
 	"#   gnksa=[<>]?ZAHL   Rückgabewert der Funktion GNKSA parse_from()\n"
@@ -1116,733 +1206,754 @@ msgstr	"# Format:\n"
 	"#                     (Anzahl der Sekunden seit 1970-01-01 00:00:00 UTC)\n"
 	"#\n"
 
-#: src/lang.c:248
+#: src/lang.c:252
 #, c-format
 msgid	"Enter score for rule (default=%d): "
 msgstr	"Bewertung für Regel (Standard=%d): "
 
-#: src/lang.c:249
+#: src/lang.c:253
 #, c-format
 msgid	"Enter the score weight (range 0 < score <= %d)"
 msgstr	"Geben Sie die Höhe der Bewertung an (Bereich 0 < Bewertung <= %d)"
 
 #. SCORE_MAX
-#: src/lang.c:250
+#: src/lang.c:254
 msgid	"Full"
 msgstr	"Voll"
 
-#: src/lang.c:251
+#: src/lang.c:255
 msgid	"Comment (optional)  : "
 msgstr	"Kommentar (optional): "
 
-#: src/lang.c:252
+#: src/lang.c:256
 msgid	"Apply pattern to    : "
 msgstr	"Wende Muster an auf : "
 
-#: src/lang.c:253
+#: src/lang.c:257
 msgid	"From: line (ignore case)      "
 msgstr	"From: Zeile (ignoriere Groß- Kleinschreibung)"
 
-#: src/lang.c:254
+#: src/lang.c:258
 msgid	"From: line (case sensitive)   "
 msgstr	"From: Zeile (Groß- Kleinschreibung beachten) "
 
-#: src/lang.c:256
+#: src/lang.c:260
 #, c-format
 msgid	"%s%s: Unknown host.\n"
 msgstr	"%s%s: Unbekannter Host.\n"
 
-#: src/lang.c:257
+#: src/lang.c:261
 msgid	"global "
 msgstr	"Global "
 
-#: src/lang.c:258
+#: src/lang.c:262
 #, c-format
 msgid	"Please use %.100s instead"
 msgstr	"Bitte %.100s statt dessen benutzen"
 
-#: src/lang.c:259
+#: src/lang.c:263
 #, c-format
-msgid	"Group %s is moderated. Continue?"
-msgstr	"Gruppe %s ist moderiert. Fortfahren?"
-
-#: src/lang.c:260
+msgid	"%s is bogus"
+msgstr	"%s ist ungültig"
+
+#: src/lang.c:264
+#, c-format
+msgid	"Group %s is moderated. Continue?"
+msgstr	"Gruppe %s ist moderiert. Fortfahren?"
+
+#: src/lang.c:265
 msgid	"groups"
 msgstr	"Gruppen"
 
-#: src/lang.c:261
+#: src/lang.c:266
+#, c-format
+msgid	"Rereading %s..."
+msgstr	"Lese %s..."
+
+#: src/lang.c:267
 msgid	"Top Level Commands"
 msgstr	"Top Level Befehle"
 
-#: src/lang.c:262
+#: src/lang.c:268
 msgid	"Group Selection"
 msgstr	"Gruppen-Auswahl"
 
-#: src/lang.c:263
+#: src/lang.c:269
 msgid	"group"
 msgstr	"Gruppe"
 
-#: src/lang.c:265
+#: src/lang.c:271
 msgid	"One or more lines of comment. <CR> to add a line or proceed if line is empty."
 msgstr	"Kommentarzeile(n). <CR> für nächsten Menüpunkt bzw. Ende der eingeg. Zeile."
 
-#: src/lang.c:266
+#: src/lang.c:272
 msgid	"From: line to add to filter file. <SPACE> toggles & <CR> sets."
 msgstr	"From: zum Filter hinzufügen. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:267
+#: src/lang.c:273
 msgid	"Linecount of articles to be filtered. < for less, > for more, = for equal."
 msgstr	"Zeilenzahl der Artikel, die gefiltert werden. < weniger, > mehr, = gleich."
 
-#: src/lang.c:268
+#: src/lang.c:274
 msgid	"Message-ID: line to add to filter file. <SPACE> toggles & <CR> sets."
 msgstr	"Message-ID: zum Filter hinzufügen. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:269
+#: src/lang.c:275
 msgid	"Subject: line to add to filter file. <SPACE> toggles & <CR> sets."
 msgstr	"Subject: zum Filter hinzufügen. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:270
+#: src/lang.c:276
 msgid	"Enter text pattern to filter if Subject: & From: lines are not what you want."
-msgstr	"Textmuster zum Filtern, wenn Subject: & From: nicht ihren Wünschen entspricht."
+msgstr	"Textmuster zum Filtern, wenn Subject: & From: nicht Ihren Wünschen entspricht."
 
-#: src/lang.c:271
+#: src/lang.c:277
 msgid	"Select where text pattern should be applied. <SPACE> toggles & <CR> sets."
 msgstr	"Wähle worauf das Textmuster angewendet wird. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:272
+#: src/lang.c:278
 msgid	"Expiration time in days for the entered filter. <SPACE> toggles & <CR> sets."
 msgstr	"Gültigkeitsdauer in Tagen für den Filter. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:273
+#: src/lang.c:279
 msgid	"Apply kill only to current group or all groups. <SPACE> toggles & <CR> sets."
 msgstr	"Filterregel gilt für aktuelle/alle Gruppe(n). <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:274
+#: src/lang.c:280
 msgid	"Apply select to current group or all groups. <SPACE> toggles & <CR> sets."
 msgstr	"Filterregel gilt für aktuelle/allen Gruppe(n).<SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:275
+#: src/lang.c:281
 msgid	"kill an article via a menu"
 msgstr	"killt einen Artikel mittels eines Menüs"
 
-#: src/lang.c:276
+#: src/lang.c:282
 msgid	"auto-select (hot) an article via a menu"
 msgstr	"Filterregel (hochscoren) für Artikel via Menü erstellen"
 
-#: src/lang.c:277
+#: src/lang.c:283
 msgid	"Browse URLs in article"
 msgstr	"URLs im Artikel mit Browser öffnen"
 
-#: src/lang.c:278
+#: src/lang.c:284
 msgid	"0 - 9\t  display article by number in current thread"
 msgstr	"0 - 9\t  zeigt Artikel nach Nummern sortiert im aktuellen Thread"
 
-#: src/lang.c:279
-msgid	"cancel (delete) current article; must have been posted by you"
-msgstr	"cancelt (löscht) den aktuellen Artikel; dieser muß von Ihnen sein"
+#: src/lang.c:285
+msgid	"cancel (delete) or supersede (overwrite) current article"
+msgstr	"cancelt (löscht) oder ersetzt den aktuellen Artikel"
 
-#: src/lang.c:280
+#: src/lang.c:286
 msgid	"edit article (mail-groups only)"
 msgstr	"editiere Artikel (nur bei Mail-Gruppen)"
 
-#: src/lang.c:281
+#: src/lang.c:287
 msgid	"display first article in current thread"
 msgstr	"ersten Artikel im aktuellen Thread anzeigen"
 
-#: src/lang.c:282
+#: src/lang.c:288
 msgid	"display first page of article"
 msgstr	"zeigt erste Seite des Artikels an"
 
-#: src/lang.c:283
+#: src/lang.c:289
 msgid	"post followup to current article"
 msgstr	"aktuellen Artikel beantworten (followup)"
 
-#: src/lang.c:284
+#: src/lang.c:290
 msgid	"post followup (don't copy text) to current article"
 msgstr	"aktuellen Artikel beantworten, ohne Zitieren des Textes"
 
-#: src/lang.c:285
+#: src/lang.c:291
 msgid	"post followup to current article quoting complete headers"
 msgstr	"aktuellen Artikel beantworten, mit Komplettzitat der Header"
 
-#: src/lang.c:286
+#: src/lang.c:292
 msgid	"display last article in current thread"
 msgstr	"letzten Artikel im aktuellen Thread anzeigen"
 
-#: src/lang.c:287
+#: src/lang.c:293
 msgid	"display last page of article"
 msgstr	"letzte Seite des Artikels anzeigen"
 
-#: src/lang.c:288
+#: src/lang.c:294
 msgid	"mark rest of thread as read and advance to next unread"
 msgstr	"markiere Rest des Thread als gelesen, springe zu nächstem ungelesenen"
 
-#: src/lang.c:289
+#: src/lang.c:295
 msgid	"display next article"
 msgstr	"nächsten Artikel anzeigen"
 
-#: src/lang.c:290
+#: src/lang.c:296
 msgid	"display first article in next thread"
 msgstr	"zeigt den ersten Artikel im nächsten Thread an"
 
-#: src/lang.c:291 src/lang.c:298 src/lang.c:357 src/lang.c:358
+#: src/lang.c:297
 msgid	"display next unread article"
 msgstr	"nächsten ungelesenen Artikel anzeigen"
 
-#: src/lang.c:292
+#: src/lang.c:298
 msgid	"go to the article that this one followed up"
 msgstr	"(Bezugs)Artikel anzeigen, den der aktuelle Artikel beantwortet hat"
 
-#: src/lang.c:293
+#: src/lang.c:299
 msgid	"display previous article"
 msgstr	"vorhergehenden Artikel anzeigen"
 
-#: src/lang.c:294 src/lang.c:360
+#: src/lang.c:300
 msgid	"display previous unread article"
 msgstr	"vorhergehenden ungelesenen Artikel anzeigen"
 
-#: src/lang.c:295
+#: src/lang.c:301
 msgid	"quickly kill an article using defaults"
 msgstr	"killt einen Artikel schnell und benutzt dabei die Voreinstellungen"
 
-#: src/lang.c:296
+#: src/lang.c:302
 msgid	"quickly auto-select (hot) an article using defaults"
 msgstr	"markiert (hervorheben) Artikel und benutzt die Voreinstellungen"
 
-#: src/lang.c:297
+#: src/lang.c:303
 msgid	"return to group selection level"
 msgstr	"kehrt zum Gruppenauswahlmenü zurück"
 
-#: src/lang.c:299
+#: src/lang.c:304
 msgid	"reply through mail to author"
 msgstr	"Antwort per Mail an den Autor"
 
-#: src/lang.c:300
+#: src/lang.c:305
 msgid	"reply through mail (don't copy text) to author"
 msgstr	"Antwort per Mail an den Autor (ohne Zitieren des Textes)"
 
-#: src/lang.c:301
+#: src/lang.c:306
 msgid	"reply through mail to author quoting complete headers"
 msgstr	"Antwort per Mail an den Autor, wobei der komplette Header zitiert wird"
 
-#: src/lang.c:302 src/lang.c:362
+#: src/lang.c:307
 msgid	"repost chosen article to another group"
 msgstr	"gewählten Artikel in eine andere Gruppe reposten"
 
-#: src/lang.c:303
+#: src/lang.c:308
 msgid	"search backwards within this article"
 msgstr	"sucht rückwärts innerhalb des Artikels"
 
-#: src/lang.c:304
+#: src/lang.c:309
 msgid	"search forwards within this article"
 msgstr	"sucht vorwärts innerhalb des Artikels"
 
-#: src/lang.c:305
+#: src/lang.c:310
 msgid	"show article in raw-mode (including all headers)"
 msgstr	"Artikel im Rohformat (inklusive aller Header) anzeigen"
 
-#: src/lang.c:306
+#: src/lang.c:311
 msgid	"skip next block of included text"
 msgstr	"überspringt den nächsten Zitatblock"
 
-#: src/lang.c:307
+#: src/lang.c:312
 msgid	"toggle display of sections hidden by a form-feed (^L) on/off"
 msgstr	"schalte Anzeige von durch Form-Feed (^L) versteckten Teilen ein/aus"
 
-#: src/lang.c:308
+#: src/lang.c:313
 msgid	"toggle word highlighting on/off"
 msgstr	"schaltet das Wort-Hervorheben ein/aus"
 
-#: src/lang.c:309
+#: src/lang.c:314
 msgid	"toggle ROT-13 (basic decode) for current article"
 msgstr	"(de)aktiviert ROT-13 Dekodierung für den aktuellen Artikel"
 
-#: src/lang.c:310
+#: src/lang.c:315
 msgid	"toggle tabwidth 4 <-> 8"
 msgstr	"wechsle Tabulatorweite 4 <-> 8"
 
-#: src/lang.c:311
+#: src/lang.c:316
 msgid	"toggle german TeX style decoding for current article"
 msgstr	"(de)aktiviere deutsche TeX-style Dekodierung für aktuellen Artikel"
 
-#: src/lang.c:312
+#: src/lang.c:317
 msgid	"toggle display of uuencoded sections"
 msgstr	"Anzeige von UU-kodierten Teilen umschalten"
 
-#: src/lang.c:313
+#: src/lang.c:318
 msgid	"View/save multimedia attachments"
 msgstr	"Multimedia-Anhänge anzeigen/speichern"
 
-#: src/lang.c:314
+#: src/lang.c:319
 #, c-format
 msgid	"report bug or comment via mail to %s"
 msgstr	"sendet Fehlerbericht oder Kommentar via Mail an %s"
 
-#: src/lang.c:315
+#: src/lang.c:320
 msgid	"choose range of articles to be affected by next command"
 msgstr	"Bereich der Artikel, die vom nächsten Kommando betroffen sind"
 
-#: src/lang.c:316
+#: src/lang.c:321
 msgid	"escape from command prompt"
 msgstr	"Verlassen der Kommandozeile"
 
-#: src/lang.c:317
+#: src/lang.c:322
+msgid	"edit filter file"
+msgstr	"Filter-Datei bearbeiten"
+
+#: src/lang.c:323
 msgid	"get help"
 msgstr	"zeigt die Hilfe"
 
-#: src/lang.c:318
+#: src/lang.c:324
 msgid	"display last article viewed"
 msgstr	"zeigt den zuletzt angezeigten Artikel an"
 
-#: src/lang.c:319
+#: src/lang.c:325
 msgid	"down one line"
 msgstr	"eine Zeile runter"
 
-#: src/lang.c:320
+#: src/lang.c:326
 msgid	"up one line"
 msgstr	"eine Zeile hoch"
 
-#: src/lang.c:321
+#: src/lang.c:327
 msgid	"go to article chosen by Message-ID"
 msgstr	"Artikel mit dieser Message-ID anzeigen"
 
-#: src/lang.c:322
+#: src/lang.c:328
 msgid	"mail article/thread/hot/pattern/tagged articles to someone"
 msgstr	"Artikel/Thread/hervorgeh./markierten Artikel per Mail weiterleiten"
 
-#: src/lang.c:323
+#: src/lang.c:329
 msgid	"menu of configurable options"
 msgstr	"Menü der konfigurierbaren Optionen"
 
-#: src/lang.c:324
+#: src/lang.c:330
 msgid	"down one page"
 msgstr	"eine Seite runter"
 
-#: src/lang.c:325
+#: src/lang.c:331
 msgid	"up one page"
 msgstr	"eine Seite hoch"
 
-#: src/lang.c:326
+#: src/lang.c:332
 msgid	"post (write) article to current group"
 msgstr	"poste (schreibe) Artikel in die aktuelle Gruppe"
 
-#: src/lang.c:327
+#: src/lang.c:333
 msgid	"post postponed articles"
 msgstr	"poste zurückgestellte Artikel"
 
-#: src/lang.c:328
+#: src/lang.c:334
 msgid	"list articles posted by you (from posted file)"
-msgstr	"listet ihre geposteten Artikel auf (aus der 'posted' Datei)"
+msgstr	"listet Ihre geposteten Artikel auf (aus der 'posted' Datei)"
 
-#: src/lang.c:329
+#: src/lang.c:335
 msgid	"return to previous menu"
 msgstr	"kehrt zum vorherigen Menü zurück"
 
-#: src/lang.c:330
+#: src/lang.c:336
 msgid	"quit tin immediately"
 msgstr	"beendet tin sofort"
 
-#: src/lang.c:331
+#: src/lang.c:337
 msgid	"redraw page"
 msgstr	"Bildschirmdarstellung neu zeichnen"
 
-#: src/lang.c:332
+#: src/lang.c:338
 msgid	"save article/thread/hot/pattern/tagged articles to file"
-msgstr	"speichert Artikel/Thread hervorgehoben/muster/markierten Artikel"
+msgstr	"speichert Artikel/Thread hervorgehoben/Muster/markierten Artikel"
 
-#: src/lang.c:333
+#: src/lang.c:339
 msgid	"save marked articles automatically without user prompts"
 msgstr	"speichert markierte Artikel automatisch ohne Nachfrage"
 
-#: src/lang.c:334
+#: src/lang.c:340
+msgid	"scroll the screen one line down"
+msgstr	"Bildschirm eine Zeile nach oben schieben"
+
+#: src/lang.c:341
+msgid	"scroll the screen one line up"
+msgstr	"Bildschirm eine Zeile nach unten schieben"
+
+#: src/lang.c:342
 msgid	"search for articles by author backwards"
 msgstr	"sucht rückwärts nach Artikeln von Autor"
 
-#: src/lang.c:335
+#: src/lang.c:343
 msgid	"search for articles by author forwards"
 msgstr	"sucht vorwärts nach Artikeln von Autor"
 
-#: src/lang.c:336
+#: src/lang.c:344
 msgid	"search all articles for a given string (this may take some time)"
 msgstr	"sucht in allen Artikel nach vorgegebener Zeichenkette (kann dauern)"
 
 # TODO: formating
-#: src/lang.c:337
+#: src/lang.c:345
 msgid	" \t  (searches are case-insensitive and wrap around to all articles)"
 msgstr	" \t  (Suchen beachten Gross/Kleinschreibung nicht und laufen über den\n"
 	"          letzten Artikel hinaus zum ersten Artikel der Gruppe und von dort\n"
 	"          aus weiter.)"
 
-#: src/lang.c:338
+#: src/lang.c:346
 msgid	"search for articles by Subject line backwards"
 msgstr	"durchsucht Artikel rückwärts nach Subject Zeile"
 
-#: src/lang.c:339
+#: src/lang.c:347
 msgid	"search for articles by Subject line forwards"
 msgstr	"durchsucht Artikel vorwärts nach Subject Zeile"
 
-#: src/lang.c:340
+#: src/lang.c:348
 msgid	"repeat last search"
 msgstr	"letzte Suche wiederholen"
 
-#: src/lang.c:341
+#: src/lang.c:349
 msgid	"tag current article for reposting/mailing/piping/printing/saving"
 msgstr	"markiere Artikel für nochmaliges posten/pipen/drucken/abspeichern"
 
-#: src/lang.c:342
+#: src/lang.c:350
 msgid	"toggle info message in last line (subject/description)"
 msgstr	"Anzeige von Subject/Beschreibung in d. letzten Zeile (de)aktivieren"
 
-#: src/lang.c:343
+#: src/lang.c:351
 msgid	"toggle inverse video"
 msgstr	"(de)aktiviert inverse Darstellung"
 
-#: src/lang.c:344
+#: src/lang.c:352
 msgid	"toggle mini help menu display"
 msgstr	"schaltet das Minihilfemenü ein/aus"
 
-#: src/lang.c:345
+#: src/lang.c:353
+msgid	"cycle the display of authors email address, real name, both or neither"
+msgstr	"Zeigt des Autors EMail Adresse, Realname, beides oder nichts von beidem an"
+
+#: src/lang.c:354
 msgid	"show version information"
 msgstr	"zeige Versionsinformationen"
 
-#: src/lang.c:346
+#: src/lang.c:355
 msgid	"mark all articles as read and return to group selection menu"
 msgstr	"markiert alle Artikel als gelesen und kehrt zum Gruppenmenü zurück"
 
-#: src/lang.c:347
+#: src/lang.c:356
 msgid	"mark all articles as read and enter next group with unread articles"
 msgstr	"markiere Artikel gelesen; öffne nä. Gruppe mit ungelesenen Artikeln"
 
-#: src/lang.c:348
+#: src/lang.c:357
 msgid	"choose first thread in list"
 msgstr	"Wähle ersten Thread in der Liste"
 
-#: src/lang.c:349 src/lang.c:380
-msgid	"choose group by name"
-msgstr	"Gruppe anhand des Namens auswählen"
-
-#: src/lang.c:350
+#: src/lang.c:358
 msgid	"choose last thread in list"
 msgstr	"Wähle letzten Thread in der Liste"
 
-#: src/lang.c:351
+#: src/lang.c:359
 msgid	"list articles within current thread (bring up Thread sub-menu)"
 msgstr	"listet Artikel im aktuellen Thread (öffnet das Thread Untermenü)"
 
-#: src/lang.c:352
+#: src/lang.c:360
 msgid	"mark article as unread"
 msgstr	"markiert Artikel als ungelesen"
 
-#: src/lang.c:353
+#: src/lang.c:361
 msgid	"mark current thread or tagged threads as read"
 msgstr	"markiert den aktuellen Thread oder markierte Artikel als gelesen"
 
-#: src/lang.c:354
+#: src/lang.c:362
 msgid	"mark thread as unread"
 msgstr	"markiert den aktuellen Thread als ungelesen"
 
-#: src/lang.c:355
+#: src/lang.c:363
 msgid	"toggle display of all/selected articles"
 msgstr	"wechselt zwischen der Anzeige aller/markierter (hot) Artikel"
 
-#: src/lang.c:356
+#: src/lang.c:364
 msgid	"display next group"
 msgstr	"zeige nächste Gruppe"
 
-#: src/lang.c:359
+#: src/lang.c:365
 msgid	"display previous group"
 msgstr	"zeige vorhergehende Gruppe"
 
-#: src/lang.c:361 src/lang.c:409
-msgid	"read chosen article"
-msgstr	"zeige gewählten Artikel"
-
-#: src/lang.c:363
+#: src/lang.c:366
 msgid	"toggle all selections (all articles)"
 msgstr	"Markierung 'hot'/wichtig für alle Artikel umschalten"
 
-#: src/lang.c:364
+#: src/lang.c:367
 msgid	"select group (make \"hot\")"
 msgstr	"Markierung 'hot'/wichtig für Gruppe setzen"
 
-#: src/lang.c:365
+#: src/lang.c:368
 msgid	"select thread"
 msgstr	"Markierung 'hot'/wichtig für Thread setzen"
 
 # TODO: formating
-#: src/lang.c:366
+#: src/lang.c:369
 msgid	"select threads if at least one unread article is selected"
 msgstr	"Markierung 'hot'/wichtig für alle Threads setzen, die schon einen\n"
 	"          ungelesenen Artikel mit Markierung 'hot'/wichtig enthalten."
 
 # TODO: formating
-#: src/lang.c:367
+#: src/lang.c:370
 msgid	"select threads that match user specified pattern"
 msgstr	"Markierung 'hot'/wichtig für alle Threads setzen, die einem\n"
 	"          gewählten Muster entsprechen"
 
-#: src/lang.c:368
+#: src/lang.c:371
 msgid	"tag all parts of current multipart-message in order"
 msgstr	"markiert alle Teile der multipart-Nachrichten in der Reihenfolge"
 
-#: src/lang.c:369
+#: src/lang.c:372
 msgid	"0 - 9\t  choose thread by number"
 msgstr	"0 - 9\t  wählt Thread anhand der Nummer"
 
-#: src/lang.c:370
+#: src/lang.c:373
 msgid	"toggle limit number of articles to get, and reload"
 msgstr	"Anzahl der zu holenden oder wieder zu ladenden Artikel ändern"
 
-#: src/lang.c:371
+#: src/lang.c:374
 msgid	"toggle display of all/unread articles"
 msgstr	"wechselt zwischen der Anzeige aller/ungelesener Artikel"
 
-#: src/lang.c:372 src/lang.c:410
-msgid	"cycle the display of authors email address, real name, both or neither"
-msgstr	"Zeigt des Autors EMail Adresse, Realname, beides oder keins an"
-
-#: src/lang.c:373
+#: src/lang.c:375
 msgid	"toggle selection of thread"
 msgstr	"Markierung 'hot'/wichtig für Thread setzen/entfernen"
 
-#: src/lang.c:374
+#: src/lang.c:376
 msgid	"cycle through threading options available"
 msgstr	"wechsle durch die verschiedenen Threading-Optionen"
 
-#: src/lang.c:375
+#: src/lang.c:377
 msgid	"undo all selections (all articles)"
 msgstr	"Markierung 'hot'/wichtig für alle Artikel entfernen"
 
-#: src/lang.c:376
+#: src/lang.c:378
 msgid	"untag all tagged threads"
 msgstr	"hebt die Markierung der markierten Artikel auf"
 
-#: src/lang.c:377
+#: src/lang.c:379
 msgid	"mark all articles in group as read"
 msgstr	"markiert alle Artikel der Gruppe als gelesen"
 
-#: src/lang.c:378
+#: src/lang.c:380
 msgid	"mark all articles in group as read and move to next unread group"
 msgstr	"markiert Gruppe als gelesen, springt zur nächsten mit ungel. Artikeln"
 
-#: src/lang.c:379
+#: src/lang.c:381
 msgid	"choose first group in list"
 msgstr	"Wähle erste Gruppe in der Liste"
 
-#: src/lang.c:381
+#: src/lang.c:382
+msgid	"choose group by name"
+msgstr	"Gruppe anhand des Namens auswählen"
+
+#: src/lang.c:383
 msgid	"0 - 9\t  choose group by number"
 msgstr	"0 - 9\t  wählt die Gruppe anhand der Nummer"
 
-#: src/lang.c:382
+#: src/lang.c:384
 msgid	"choose range of groups to be affected by next command"
 msgstr	"Bereich der Gruppen, die vom nächsten Kommando betroffen sind"
 
-#: src/lang.c:383
+#: src/lang.c:385
 msgid	"choose last group in list"
 msgstr	"Wähle letzte Gruppe in der Liste"
 
-#: src/lang.c:384
+#: src/lang.c:386
 msgid	"mark all articles in chosen group unread"
 msgstr	"markiert alle Artikel in der gewählten Gruppe als ungelesen"
 
-#: src/lang.c:385
+#: src/lang.c:387
 msgid	"move chosen group within list"
 msgstr	"bewegt die gewählte Gruppe innerhalb der Liste"
 
-#: src/lang.c:386
+#: src/lang.c:388
 msgid	"choose next group with unread news"
 msgstr	"wählt die nächste Gruppe mit ungelesenen Artikeln"
 
-#: src/lang.c:387 src/lang.c:1176
+#: src/lang.c:389 src/lang.c:1197
 msgid	"quit"
 msgstr	"Beenden"
 
-#: src/lang.c:388
+#: src/lang.c:390
 msgid	"quit without saving configuration changes"
 msgstr	"beenden ohne die Konfigurationsänderungen zu sichern"
 
-#: src/lang.c:389
+#: src/lang.c:391
 msgid	"read chosen group"
 msgstr	"liest ausgewählte Gruppe"
 
-#: src/lang.c:390
+#: src/lang.c:392
 msgid	"reset .newsrc (all available articles in groups marked unread)"
 msgstr	"setzt die .newsrc zurück (alle Artikel als gelesen markiert)"
 
-#: src/lang.c:391
+#: src/lang.c:393
 msgid	"search backwards for a group name"
 msgstr	"sucht rückwärts nach einem Gruppennamen"
 
-#: src/lang.c:392
+#: src/lang.c:394
 msgid	" \t  (all searches are case-insensitive and wrap around)"
 msgstr	" \t  (alle Suchen sind case-insensitive und beginnen am Ende von vorn)"
 
-#: src/lang.c:393
+#: src/lang.c:395
 msgid	"search forwards for a group name"
 msgstr	"suche vorwärts nach einer Gruppe"
 
-#: src/lang.c:394
+#: src/lang.c:396
 msgid	"subscribe to chosen group"
 msgstr	"abonniert ausgewählte Gruppe"
 
-#: src/lang.c:395
+#: src/lang.c:397
 msgid	"subscribe to groups that match pattern"
 msgstr	"abonniere Gruppen, die auf das Muster passen"
 
-#: src/lang.c:396
+#: src/lang.c:398
 msgid	"reread active file to check for any new news"
 msgstr	"lies die Datei 'active' neu ein, um nach neuen Artikeln zu suchen"
 
-#: src/lang.c:397
+#: src/lang.c:399
 msgid	"toggle display of group name only or group name plus description"
 msgstr	"Anzeige der Kurzbeschreibung der Gruppe (de)aktivieren."
 
-#: src/lang.c:398
+#: src/lang.c:400
 msgid	"toggle display to show all/unread subscribed groups"
 msgstr	"wechselt die Anzeige zwischen allen/ungelesenen abonnierten Gruppen"
 
-#: src/lang.c:399
+#: src/lang.c:401
 msgid	"unsubscribe from chosen group"
 msgstr	"bestellt ausgewählte Gruppe ab"
 
-#: src/lang.c:400
+#: src/lang.c:402
 msgid	"unsubscribe from groups that match pattern"
 msgstr	"bestelle Gruppen ab, die auf das Muster passen"
 
-#: src/lang.c:401
+#: src/lang.c:403
 msgid	"sort the list of groups"
 msgstr	"Liste der Gruppen sortieren"
 
-#: src/lang.c:402
+#: src/lang.c:404
 msgid	"toggle display to show all/subscribed groups"
 msgstr	"schaltet um zwischen der Anzeige aller/abonnierten Gruppen"
 
-#: src/lang.c:403
+#: src/lang.c:405
 msgid	"0 - 9\t  choose article by number"
 msgstr	"0 - 9\t  Wähle Artikel anhand der Nummer"
 
-#: src/lang.c:404
+#: src/lang.c:406
 msgid	"mark thread as read and return to group index page"
 msgstr	"markiert den Thread als gelesen und kehrt zum Gruppenindex zurück"
 
-#: src/lang.c:405
+#: src/lang.c:407
 msgid	"mark thread as read and enter next unread thread or group"
 msgstr	"markiert Thread als gelesen; nächster ungelesener Thread/Gruppe"
 
-#: src/lang.c:406
+#: src/lang.c:408
 msgid	"choose first article in list"
 msgstr	"wähle ersten Artikel in der Liste"
 
-#: src/lang.c:407
+#: src/lang.c:409
 msgid	"choose last article in list"
 msgstr	"wähle letzten Artikel in der Liste"
 
-# TRANSLATION MISSING
-#: src/lang.c:408
+#: src/lang.c:410
 msgid	"mark article or tagged articles as read and move cursor to next unread article"
-msgstr	""
+msgstr	"markiert Artikel als gelesen geht zum nächsten ungelesenen Artikel"
 
 #: src/lang.c:411
+msgid	"read chosen article"
+msgstr	"zeige gewählten Artikel"
+
+#: src/lang.c:412
 msgid	"Display properties\n"
 	"------------------"
 msgstr	"Darstellungsoptionen\n"
 	"--------------------"
 
-#: src/lang.c:412
+#: src/lang.c:413
 msgid	"Miscellaneous\n"
 	"-------------"
 msgstr	"Verschiedenes\n"
 	"-------------"
 
-#: src/lang.c:413
+#: src/lang.c:414
 msgid	"Moving around\n"
 	"-------------"
 msgstr	"Position ändern\n"
 	"---------------"
 
-#: src/lang.c:414
+#: src/lang.c:415
 msgid	"Group/thread/article operations\n"
 	"-------------------------------"
 msgstr	"Gruppe/Thread/Artikel Kommandos\n"
 	"-------------------------------"
 
-#: src/lang.c:416
+#: src/lang.c:417
 msgid	"Group Level Commands"
 msgstr	"Gruppenlevel Befehle"
 
-#: src/lang.c:417
+#: src/lang.c:418
 msgid	"Kill filter added"
 msgstr	"Killfilter hinzugefügt"
 
-#: src/lang.c:418
+#: src/lang.c:419
 msgid	"Auto-selection filter added"
 msgstr	"Automatischer Auswahlfilter hinzugefügt"
 
-#: src/lang.c:419
+#: src/lang.c:420
 msgid	"All parts tagged"
 msgstr	"Alle Teile markiert"
 
-#: src/lang.c:420
+#: src/lang.c:421
 msgid	"Storing article for later posting"
 msgstr	"Speichert Artikel, um ihn später zu posten"
 
-#: src/lang.c:421
+#: src/lang.c:422
 msgid	"Please enter a valid character"
 msgstr	"Bitte ein gültiges Zeichen eingeben"
 
-#: src/lang.c:422
+#: src/lang.c:423
 #, c-format
 msgid	"Missing part #%d"
 msgstr	"Teil Nummer %d fehlt."
 
-#: src/lang.c:423
+#: src/lang.c:424
 msgid	"*** No postponed articles ***"
 msgstr	"*** Keine zurückgelegten Artikel ***"
 
-#: src/lang.c:424
+#: src/lang.c:425
 msgid	"Not a multi-part message"
 msgstr	"Kein mehrteiliger Artikel"
 
-#: src/lang.c:425
+#: src/lang.c:426
 msgid	"You are not subscribed to this group"
 msgstr	"Sie haben diese Gruppe nicht abonniert"
 
-#: src/lang.c:426
+#: src/lang.c:427
 msgid	"No previous expression"
 msgstr	"Kein vorhergehender Ausdruck"
 
-#: src/lang.c:427
+#: src/lang.c:428
 msgid	"Operation disabled in no-overwrite mode"
 msgstr	"Ausführung nicht möglich im nicht-überschreiben Modus"
 
 #. TODO: replace hardcoded key-name in txt_info_postponed
-#: src/lang.c:429
+#: src/lang.c:430
 #, c-format
 msgid	"%d postponed %s, reuse with ^O...\n"
 msgstr	"%d zurückgelegte %s, hervorholen mit ^O...\n"
 
-#: src/lang.c:430
+#: src/lang.c:431
 msgid	"X-Conversion-Note: multipart/alternative contents have been removed.\n"
 	"  To get the whole article, turn alternative handling OFF in the Option Menu\n"
 msgstr	"X-Conversion-Note: multipart/alternative Inhalt wurde entfernt.\n"
 	"  Um das zu ändern, setzen Sie in der tinrc das alternative_handling auf OFF\n"
 
-#: src/lang.c:432
+#: src/lang.c:433
 #, c-format
 msgid	"Save filename for %s/%s is a mailbox. Attachment not saved"
 msgstr	"Dateiname für %s/%s ist eine Mailbox. Anhang nicht gespeichert"
 
-#: src/lang.c:433
+#: src/lang.c:434
 msgid	"TeX2Iso encoded article"
 msgstr	"TeX2Iso kodierter Artikel"
 
-#: src/lang.c:434
+#: src/lang.c:435
 msgid	"incomplete "
 msgstr	"unvollständige "
 
 #. TODO: replace hardcoded key-names
-#: src/lang.c:436
+#: src/lang.c:437
 #, c-format
 msgid	"\n"
 	"Welcome to %s, a full screen threaded Netnews reader. It can read news "
@@ -1892,7 +2003,7 @@ msgstr	"\n"
 	"\n"
 	"Artikel, Threads, markierte Artikel oder Artikel, die einem Suchmuster\n"
 	"entsprechen, können gemailt ('m'), gedruckt ('o'), gespeichert ('s') oder\n"
-	"gepipet ('|') werden. Benutzen sie 'w', um einen neuen Artikel zu schreiben,\n"
+	"gepipet ('|') werden. Benutzen Sie 'w', um einen neuen Artikel zu schreiben,\n"
 	"'f'/'F', um auf einen Artikel zu antworten und 'r'/'R', um den Autor via\n"
 	"Mail zu antworten. Mit 'M' können Sie %s mittels eines Menüs konfigurieren.\n"
 	"\n"
@@ -1900,129 +2011,137 @@ msgstr	"\n"
 	"Bitte senden Sie Fehlerberichte und Kommentare mittels des 'R' Kommandos an\n"
 	"%s.\n"
 
-#: src/lang.c:452
+#: src/lang.c:453
 #, c-format
 msgid	"Invalid  From: %s  line. Read the INSTALL file again."
-msgstr	"Ungültige From: %s Zeile. Lesen sie  INSTALL nochmal."
+msgstr	"Ungültige From: %s Zeile. Lesen Sie  INSTALL nochmal."
 
-#: src/lang.c:453
+#: src/lang.c:455
+msgid	"Invalid multibyte sequence found\n"
+msgstr	"Ungültige Mehrbytezeichen-Folge vorhanden\n"
+
+#: src/lang.c:457
 #, c-format
 msgid	"Invalid  Sender:-header %s"
 msgstr	"Ungültiger Sender:-Header %s"
 
-#: src/lang.c:454
+#: src/lang.c:458
 msgid	"Inverse video disabled"
 msgstr	"Inverse Bilddarstellung abgestellt"
 
-#: src/lang.c:455
+#: src/lang.c:459
 msgid	"Inverse video enabled"
 msgstr	"Inverse Bilddarstellung eingeschaltet"
 
-#: src/lang.c:457
+#: src/lang.c:461
 #, c-format
 msgid	"Missing definition for %s\n"
 msgstr	"Fehlende Definition für %s\n"
 
-#: src/lang.c:458
+#: src/lang.c:462
 #, c-format
 msgid	"Invalid key definition '%s'\n"
 msgstr	"Ungültige Tastenbelegung '%s'\n"
 
-#: src/lang.c:459
+#: src/lang.c:463
 #, c-format
 msgid	"Invalid keyname '%s'\n"
 msgstr	"Ungültiger Tastenname '%s'\n"
 
-#: src/lang.c:460
+#: src/lang.c:464
 #, c-format
-msgid	"Key '%s' is defined for both %s%s and %s%s\n"
-msgstr	"Taste '%s' ist für %s%s und %s%s definiert\n"
+msgid	"Keymap file was upgraded to version %s\n"
+msgstr	"Keymap-File wurde auf Version %s umgestellt\n"
 
-#: src/lang.c:461
+#: src/lang.c:465
 #, c-format
-msgid	"Kill From:     [%-*.*s] (y/n): "
-msgstr	"Filter From:   [%-*.*s] (j/n): "
+msgid	"Kill From:     [%s] (y/n): "
+msgstr	"Filter From:   [%s] (j/n): "
 
-#: src/lang.c:462
+#: src/lang.c:466
 msgid	"Kill Lines: (</>num): "
 msgstr	"Filter Z.:  (</>num): "
 
-#: src/lang.c:463
+#: src/lang.c:467
 msgid	"Kill Article Menu"
 msgstr	"Filter Menü (Kill, Bewertung/Score verringern)"
 
-#: src/lang.c:464
+#: src/lang.c:468
 #, c-format
-msgid	"Kill Msg-Id:   [%-*.*s] (f/l/o/n): "
-msgstr	"Filter Msg-Id: [%-*.*s] (v/l/n/n): "
+msgid	"Kill Msg-Id:   [%s] (f/l/o/n): "
+msgstr	"Filter Msg-Id: [%s] (v/l/n/n): "
 
-#: src/lang.c:465
+#: src/lang.c:469
 msgid	"Kill pattern scope  : "
 msgstr	"Filter nach Muster  : "
 
-#: src/lang.c:466
+#: src/lang.c:470
 #, c-format
-msgid	"Kill Subject:  [%-*.*s] (y/n): "
-msgstr	"Filter Subject:[%-*.*s] (j/n): "
+msgid	"Kill Subject:  [%s] (y/n): "
+msgstr	"Filter Subject:[%s] (j/n): "
 
-#: src/lang.c:467
+#: src/lang.c:471
 msgid	"Kill text pattern   : "
 msgstr	"Filter Textmuster   : "
 
-#: src/lang.c:468
+#: src/lang.c:472
 msgid	"Kill time in days   : "
 msgstr	"Filterzeit in Tagen : "
 
-#: src/lang.c:470
+#: src/lang.c:474
 msgid	"Last"
 msgstr	"Letzte"
 
-#: src/lang.c:471
+#: src/lang.c:475
 msgid	"-- Last response --"
 msgstr	"-- Letzte Antwort --"
 
-#: src/lang.c:472
+#: src/lang.c:476
 #, c-format
 msgid	"Lines %s  "
 msgstr	"Zeilen %s "
 
-#: src/lang.c:474
+#: src/lang.c:478
 msgid	"Message-ID: line              "
 msgstr	"Message-ID: Zeile             "
 
-#: src/lang.c:476
+#: src/lang.c:479
+msgid	"Mail"
+msgstr	"Maile"
+
+#: src/lang.c:480
 msgid	"mailbox "
 msgstr	"Mailbox "
 
-#: src/lang.c:477
+#: src/lang.c:481
 #, c-format
 msgid	"Mail article(s) to [%.*s]> "
 msgstr	"Mailt Artikel an [%.*s]> "
 
-#: src/lang.c:478
+#: src/lang.c:482
 #, c-format
 msgid	"Mailing log to %s\n"
 msgstr	"Maile Log-Datei an %s\n"
 
-#: src/lang.c:479
+#: src/lang.c:483
 msgid	"Mail bug report..."
 msgstr	"Maile einen Fehlerbericht..."
 
-#: src/lang.c:480
+#: src/lang.c:484
 #, c-format
 msgid	"Mail BUG REPORT to %s?"
 msgstr	"Fehlerbericht an %s senden?"
 
-#: src/lang.c:481
+#: src/lang.c:485
 msgid	"Mailed"
 msgstr	"Gemailt"
 
-#: src/lang.c:482
+#: src/lang.c:486
 #, c-format
 msgid	"Mailing to %s..."
 msgstr	"Senden der Mail an %s..."
 
-#: src/lang.c:483
+#: src/lang.c:487
 msgid	"# [Mail/Save] active file. Format is like news active file:\n"
 	"#   groupname  max.artnum  min.artnum  /dir\n"
 	"# The 4th field is the basedir (ie. ~/Mail or ~/News)\n"
@@ -2032,288 +2151,283 @@ msgstr	"# [Mail/Speicher] active-Datei. 
 	"# Das 4. Feld ist das Basisverzeichnis (z.B. ~/Mail oder ~/News)\n"
 	"#\n"
 
-#: src/lang.c:486
+#: src/lang.c:490
 #, c-format
 msgid	"%s marked as unread"
 msgstr	"%s als ungelesen markiert"
 
-#: src/lang.c:487
+#: src/lang.c:491
 #, c-format
 msgid	"Marked %d of %d tagged %s as read"
 msgstr	"%d von %d %s als gelesen markiert"
 
-#: src/lang.c:488
+#: src/lang.c:492
 #, c-format
 msgid	"Mark all articles as read%s?"
 msgstr	"Alle Artikel als gelesen markieren%s?"
 
-#: src/lang.c:489
+#: src/lang.c:493
 #, c-format
 msgid	"Mark %s=tagged articles, %s=current article, %s=quit: "
 msgstr	"%s=markierte oder %s=aktuellen Artikel auf gelesen setzen. %s=Abbrechen: "
 
-#: src/lang.c:490
+#: src/lang.c:494
 #, c-format
-msgid	"Mark group %.*s as read?"
-msgstr	"Die Gruppe %.*s als gelesen markieren?"
+msgid	"Mark group %s as read?"
+msgstr	"Die Gruppe %s als gelesen markieren?"
 
-#: src/lang.c:491
+#: src/lang.c:495
 #, c-format
 msgid	"Mark thread as read%s?"
 msgstr	"Den Thread als gelesen markieren%s?"
 
-#: src/lang.c:492
+#: src/lang.c:496
 #, c-format
 msgid	"Mark %s=tagged articles/threads, %s=current thread, %s=quit: "
-msgstr	"%s=markierte oder %s=aktuellen Artikel/Thread auf gelesen setzen. "
-	"%s=Abbrechen: "
+msgstr	"%s=markierte oder %s=aktuellen Artikel/Thread auf gelesen setzen. %"
+	"s=Abbrechen: "
 
-#: src/lang.c:493
+#: src/lang.c:497
 #, c-format
 msgid	"Matching %s groups..."
 msgstr	"Übereinstimmende %s Gruppen..."
 
-#: src/lang.c:494 src/lang.c:498
+#: src/lang.c:498 src/lang.c:502
 #, c-format
 msgid	"<n>=set current to n; %s=next unread; %s=search pattern; %s=kill/select"
 msgstr	"<n>=Wähle n; %s=n. ungel.; %s=Suche; %s=Filter"
 
-#: src/lang.c:495
+#: src/lang.c:499
 #, c-format
 msgid	"%s=author search; %s=catchup; %s=line down; %s=line up; %s=mark read; %s=list "
 	"thread"
 msgstr	"%s=Autorsuche; %s=Catchup; %s=n. unten; %s=n. oben; %s=gelesen; %s=Thread anz."
 
-#: src/lang.c:496
+#: src/lang.c:500
 #, c-format
 msgid	"%s=line up; %s=line down; %s=page up; %s=page down; %s=top; %s=bottom"
 msgstr	"%s=n. oben; %s=n. unten; %s=BildAuf; %s=BildAb; %s=Anfang; %s=letzte Zeile"
 
-#: src/lang.c:497
+#: src/lang.c:501
 #, c-format
 msgid	"%s=search forwards; %s=search backwards; %s=quit"
 msgstr	"%s=Suche vorwärts; %s=Suche rückwärts; %s=Beenden"
 
-#: src/lang.c:499
+#: src/lang.c:503
 #, c-format
 msgid	"%s=author search; %s=body search; %s=catchup; %s=followup; %s=mark read"
 msgstr	"%s=Autorsuche; %s=Su. Inhalt; %s=Catchup; %s=Antw in NG; %s=gelesen"
 
-#: src/lang.c:500
+#: src/lang.c:504
 #, c-format
 msgid	"<n>=set current to n; %s=next unread; %s,%s=search pattern; %s=catchup"
 msgstr	"<n>=Wähle n; %s=n. ungel.; %s,%s=Suche; %s=Catchup"
 
-#: src/lang.c:501
+#: src/lang.c:505
 #, c-format
 msgid	"%s=line down; %s=line up; %s=help; %s=move; %s=quit; %s=toggle all/unread"
 msgstr	"%s=n. unten; %s=n. oben; %s=Hilfe; %s=verschieben; %s=Ende; %s=Alle/Nur ungel."
 
-#: src/lang.c:502
+#: src/lang.c:506
 #, c-format
 msgid	"%s=subscribe; %s=sub pattern; %s=unsubscribe; %s=unsub pattern; %s=yank in/out"
 msgstr	"%s=Abo; %s=Abo n. Muster; %s=Abbestellen; %s=Abbest. n. Muster; %s=Alle/Nur "
 	"abon."
 
-#: src/lang.c:503
+#: src/lang.c:507
 #, c-format
 msgid	"<n>=set current to n; %s=next unread; %s=catchup; %s=display toggle"
 msgstr	"<n>=Wähle n; %s=n. ungel.; %s=Catchup; %s=Infozeile"
 
-#: src/lang.c:504
+#: src/lang.c:508
 #, c-format
 msgid	"%s=help; %s=line down; %s=line up; %s=quit; %s=tag; %s=mark unread"
 msgstr	"%s=Hilfe; %s=n. unten; %s=n. oben; %s=Ende; %s=tag; %s=ungelesen"
 
-#: src/lang.c:505
+#: src/lang.c:509
 msgid	"--More--"
 msgstr	"--Mehr--"
 
-#: src/lang.c:506
+#: src/lang.c:510
 #, c-format
 msgid	"Moving %s..."
 msgstr	"Verschiebe %s..."
 
-#: src/lang.c:508
+#: src/lang.c:512
 msgid	", name: "
 msgstr	", Name: "
 
-#: src/lang.c:509
+#: src/lang.c:513
 #, c-format
 msgid	"Goto newsgroup [%s]> "
 msgstr	"Gehe zu Gruppe [%s]> "
 
-#: src/lang.c:510
+#: src/lang.c:514
 msgid	"newsgroups"
 msgstr	"Gruppen"
 
-#: src/lang.c:511
+#: src/lang.c:515
 #, c-format
 msgid	"Position %s in group list (1,2,..,$) [%d]> "
 msgstr	"Position %s in der Gruppenliste (1,2,..,$) [%d]> "
 
-#: src/lang.c:512
+#: src/lang.c:516
 msgid	"newsgroup"
 msgstr	"Gruppe"
 
-#: src/lang.c:513
+#: src/lang.c:517
 msgid	"Try and save newsrc file again?"
 msgstr	"Erneut versuchen, die newsrc-Datei zu schreiben?"
 
-#: src/lang.c:514
+#: src/lang.c:518
 msgid	"Warning: No newsgroups were written to your newsrc file. Save aborted."
-msgstr	"Warnung: Keine Newsgruppen in die newsrc geschrieben. Speicherabbruch"
+msgstr	"Warnung: Keine Newsgruppen in die newsrc geschrieben. Speicherabbruch."
 
-#: src/lang.c:515
+#: src/lang.c:519
 msgid	"newsrc file saved successfully.\n"
 msgstr	"newsrc-Datei erfolgreich geschrieben.\n"
 
-#: src/lang.c:516
+#: src/lang.c:520
 msgid	"-- Next response --"
-msgstr	"- Nächste Antwort -"
+msgstr	"-- Nächste Antwort --"
 
-#: src/lang.c:517
+#: src/lang.c:521
 #, c-format
 msgid	"NNTP authorization password not found for %s"
 msgstr	"NNTP Anmeldepasswort für %s nicht gefunden"
 
-#: src/lang.c:518
+#: src/lang.c:522
 msgid	"No  "
 msgstr	"Nein"
 
-#: src/lang.c:519
+#: src/lang.c:523
 msgid	"*** No articles ***"
 msgstr	"*** Keine Artikel ***"
 
-#: src/lang.c:520
+#: src/lang.c:524
 msgid	"No articles have been posted"
 msgstr	"Es wurden keine Artikel gepostet"
 
-#: src/lang.c:521
+#: src/lang.c:525
 msgid	"*** No description ***"
 msgstr	"*** Keine Kurzbeschreibung ***"
 
-#: src/lang.c:522
+#: src/lang.c:526
 msgid	"No filename"
 msgstr	"Kein Dateiname"
 
-#: src/lang.c:523
+#: src/lang.c:527
 msgid	"No group"
 msgstr	"Keine Gruppe"
 
-#: src/lang.c:524
+#: src/lang.c:528
 msgid	"*** No groups ***"
 msgstr	"*** Keine Newsgruppen ***"
 
-#: src/lang.c:525
+#: src/lang.c:529
 msgid	"No more groups to read"
 msgstr	"Keine Gruppen zum Lesen übrig"
 
-#: src/lang.c:526
+#: src/lang.c:530
 msgid	"No last message"
 msgstr	"Keine letzte Nachricht"
 
-#: src/lang.c:527
+#: src/lang.c:531
 msgid	"No mail address"
 msgstr	"Keine EMail-Adresse"
 
-#: src/lang.c:528
+#: src/lang.c:532
 msgid	"No articles marked for saving"
 msgstr	"Keine Artikel zum Speichern markiert"
 
-#: src/lang.c:529
+#: src/lang.c:533
 msgid	"No match"
 msgstr	"Kein Treffer"
 
-#: src/lang.c:530
+#: src/lang.c:534
 msgid	"No more groups"
 msgstr	"Keine Gruppen mehr"
 
-#: src/lang.c:531
+#: src/lang.c:535
 msgid	"No newsgroups"
 msgstr	"Keine Newsgruppen"
 
-#: src/lang.c:532
+#: src/lang.c:536
 msgid	"No next unread article"
 msgstr	"Kein nächster ungelesener Artikel"
 
-#: src/lang.c:533
+#: src/lang.c:537
 msgid	"No previous group"
 msgstr	"Keine vorherige Gruppe"
 
-#: src/lang.c:534
+#: src/lang.c:538
 msgid	"No previous unread article"
 msgstr	"Kein vorheriger ungelesener Artikel"
 
-#: src/lang.c:535
-#, c-format
-msgid	"No responses%s"
-msgstr	"Keine Antworten%s"
-
-#: src/lang.c:536
+#: src/lang.c:539
 msgid	"No responses"
 msgstr	"Keine Antworten"
 
-#: src/lang.c:537
+#: src/lang.c:540
 msgid	"No responses to list in current thread"
 msgstr	"Keine Antworten vorhanden im aktuellen Thread"
 
-#: src/lang.c:538
+#: src/lang.c:541
 msgid	"No search string"
 msgstr	"Kein Suchmuster"
 
-#: src/lang.c:539
+#: src/lang.c:542
 msgid	"No subject"
 msgstr	"Kein Subject"
 
-#: src/lang.c:540
+#: src/lang.c:544
 #, c-format
 msgid	"%s: Terminal must have clear to end-of-line (ce)\n"
 msgstr	"%s: Terminal muss Löschen bis zum Ende der Zeile (ce) unterstützen\n"
 
-#: src/lang.c:541
+#: src/lang.c:545
 #, c-format
 msgid	"%s: Terminal must have clear to end-of-screen (cd)\n"
 msgstr	"%s: Terminal muss Löschen bis zum Ende des Schirmes unterstützen (cd)\n"
 
-#: src/lang.c:542
+#: src/lang.c:546
 #, c-format
 msgid	"%s: Terminal must have clearscreen (cl) capability\n"
 msgstr	"%s: Terminal muss Schirmlöschen (cl) unterstützen\n"
 
-#: src/lang.c:543
+#: src/lang.c:547
 #, c-format
 msgid	"%s: Terminal must have cursor motion (cm)\n"
 msgstr	"%s: Terminal muss Cursor-Bewegungen unterstützen (cm)\n"
 
-#: src/lang.c:544
+#: src/lang.c:548
 #, c-format
 msgid	"%s: TERM variable must be set to use screen capabilities\n"
 msgstr	"%s: TERM-Variable muss gesetzt sein, um das Terminal richtig anzusteuern\n"
 
-#: src/lang.c:545
+#: src/lang.c:550
 #, c-format
 msgid	"No viewer found for %s/%s\n"
 msgstr	"Kein Programm für %s/%s gefunden\n"
 
-#: src/lang.c:546
+#: src/lang.c:551
 msgid	"Newsgroup does not exist on this server"
 msgstr	"Newsgruppe existiert nicht auf diesem Server"
 
-#: src/lang.c:547
+#: src/lang.c:552
 #, c-format
 msgid	"Group %s not found in active file"
 msgstr	"Gruppe %s nicht in der Active-Datei gefunden"
 
-#: src/lang.c:548
+#: src/lang.c:553
 msgid	"c)reate it, use a)lternative name, use d)efault .newsrc, q)uit tin: "
 msgstr	"c=erzeuge, a=alternativer Name, d=voreingestellte .newsrc, q=beende tin: "
 
-#: src/lang.c:549
+#: src/lang.c:554
 msgid	"use a)lternative name, use d)efault .newsrc, q)uit tin: "
 msgstr	"a=alternativer Name, d=voreingestellte .newsrc, q=beende tin: "
 
-#: src/lang.c:550
+#: src/lang.c:555
 #, c-format
 msgid	"# NNTP-server -> newsrc translation table and NNTP-server\n"
 	"# shortname list for %s %s\n"
@@ -2340,40 +2454,40 @@ msgstr	"# NNTP-Server -> newsrc Übersetz
 	"#   news.ka.nu    /tmp/nrc-nu      kanu    nu\n"
 	"#\n"
 
-#: src/lang.c:557
+#: src/lang.c:562
 msgid	"Only"
 msgstr	"Nur"
 
-#: src/lang.c:558
+#: src/lang.c:563
 #, c-format
 msgid	"Option not enabled. Recompile with %s."
-msgstr	"Option nicht vorhanden. Neukompilieren mit %s."
+msgstr	"Option nicht vorhanden. Neu kompilieren mit %s."
 
-#: src/lang.c:559
+#: src/lang.c:564
 msgid	"Options Menu"
 msgstr	"Optionsmenü"
 
-#: src/lang.c:562
+#: src/lang.c:567
 #, c-format
 msgid	"Error in regex: %s at pos. %d '%s'"
 msgstr	"Fehler im regulären Ausdruck: %s an Pos. %d '%s'"
 
-#: src/lang.c:563
+#: src/lang.c:568
 #, c-format
 msgid	"Error in regex: pcre internal error %d"
 msgstr	"Fehler im regulären Ausdruck: Interner Fehler %d des pcre"
 
-#: src/lang.c:564
+#: src/lang.c:569
 #, c-format
 msgid	"Error in regex: study - pcre internal error %s"
 msgstr	"Fehler im regulären Ausdruck: pcre interner Fehler %s"
 
-#: src/lang.c:565
+#: src/lang.c:570
 msgid	"Post a followup..."
 msgstr	"Schreibe eine Antwort..."
 
 #. TODO: replace hardcoded key-name in txt_post_error_ask_postpone
-#: src/lang.c:567
+#: src/lang.c:572
 msgid	"An error has occurred while posting the article. If you think that this\n"
 	"error is temporary or otherwise correctable, you can postpone the article\n"
 	"and pick it up again with ^O later.\n"
@@ -2381,269 +2495,276 @@ msgstr	"Ein Fehler trat beim Posten des 
 	"ein temporäres Problem ist, das später nicht mehr vorhanden ist, können Sie\n"
 	"den Artikel zurückstellen und später mit ^O wieder hervorholen.\n"
 
-#: src/lang.c:570
+#: src/lang.c:575
 msgid	"Posted articles history"
 msgstr	"Übersicht der geposteten Artikel"
 
-#: src/lang.c:571
+#: src/lang.c:576
 #, c-format
 msgid	"Post to newsgroup(s) [%s]> "
 msgstr	"In Newsgruppe(n) [%s] posten> "
 
-#: src/lang.c:572
+#: src/lang.c:577
 msgid	"-- post processing started --"
 msgstr	"-- Nachbearbeitung gestartet --"
 
-#: src/lang.c:573
+#: src/lang.c:578
 msgid	"-- post processing completed --"
 msgstr	"-- Nachbearbeitung beendet --"
 
-#: src/lang.c:574
+#: src/lang.c:579
 #, c-format
 msgid	"Post subject [%s]> "
 msgstr	"Wähle Subject [%s]> "
 
-#: src/lang.c:575
+#: src/lang.c:580
 msgid	"# Summary of mailed/posted messages viewable by 'W' command from within tin.\n"
 msgstr	"# Zusammenfassung der gemailten/geposteten Artikel mit 'W' in tin.\n"
 
-#: src/lang.c:576
+#: src/lang.c:581
 msgid	"Posting article..."
 msgstr	"Poste Artikel..."
 
-#: src/lang.c:577
-msgid	"Post postponed articles [%%.*s]? (%s/%s/%s/%s/%s): "
-msgstr	"Zurückgelegten Artikel [%%.*s]posten? (%s/%s/%s/%s/%s): "
+#: src/lang.c:582
+#, c-format
+msgid	"Post postponed articles [%%s]? (%s/%s/%s/%s/%s): "
+msgstr	"Zurückgelegten Artikel [%%s]posten? (%s/%s/%s/%s/%s): "
 
-#: src/lang.c:578
+#: src/lang.c:583
 #, c-format
 msgid	"Hot %s"
 msgstr	"Wichtig/Hot %s"
 
-#: src/lang.c:579
+#: src/lang.c:584
 #, c-format
 msgid	"Tagged %s"
 msgstr	"%s markiert"
 
-#: src/lang.c:580
+#: src/lang.c:585
 #, c-format
 msgid	"Untagged %s"
 msgstr	"%s Markierung entfernt"
 
-#: src/lang.c:581
+#: src/lang.c:586
 msgid	"Processing mail messages marked for deletion."
-msgstr	"Bearbeite zum Löschen markierte EMails"
+msgstr	"Bearbeite zum Löschen markierte EMails."
 
-#: src/lang.c:582
+#: src/lang.c:587
 msgid	"Processing saved articles marked for deletion."
 msgstr	"Bearbeite zum Löschen markierte gespeicherte Artikel."
 
-#: src/lang.c:583
+#: src/lang.c:588
 #, c-format
 msgid	"Accept Followup-To? %s=post, %s=ignore, %s=quit: "
 msgstr	"Followup-To akzeptieren? %s=posten, %s=ignorieren, %s=Ende: "
 
-#: src/lang.c:584
+#: src/lang.c:589
 msgid	"Article unchanged, abort mailing?"
 msgstr	"Mail unverändert, Absenden abbrechen?"
 
-#: src/lang.c:585
+#: src/lang.c:590
 #, c-format
 msgid	"Do you want to see postponed articles (%d)?"
 msgstr	"Wollen Sie die zurückgestellten Artikel sehen (%d)?"
 
-#: src/lang.c:587
+#: src/lang.c:592
 msgid	"Add quick kill filter?"
 msgstr	"Artikel schnell (laut Voreinstellungen) killen?"
 
-#: src/lang.c:588
+#: src/lang.c:593
 msgid	"Add quick selection filter?"
 msgstr	"Filterregel (hochscoren) (laut Voreinstellungen) hinzufügen?"
 
-#: src/lang.c:589
+#: src/lang.c:594
 msgid	"Do you really want to quit?"
 msgstr	"Möchten Sie das Programm wirklich beenden?"
 
-#: src/lang.c:590
-msgid	"%s=edit cancel message, %s=quit, %s=delete (cancel) [%%.*s]: "
-msgstr	"%s=cancel-Nachricht editieren, %s=Ende, %s=löschen [%%.*s]: "
+#: src/lang.c:595
+#, c-format
+msgid	"%s=edit cancel message, %s=quit, %s=delete (cancel) [%%s]: "
+msgstr	"%s=cancel-Nachricht editieren, %s=Ende, %s=löschen [%%s]: "
 
-#: src/lang.c:591
+#: src/lang.c:596
 msgid	"You have tagged articles in this group - quit anyway?"
 msgstr	"Es befinden sich markierte Artikel in der Gruppe, trotzdem beenden?"
 
-#: src/lang.c:592
+#: src/lang.c:597
 #, c-format
 msgid	"%s=quit, %s=edit, %s=postpone: "
 msgstr	"%s=Ende, %s=bearbeiten, %s=zurücklegen: "
 
-#: src/lang.c:593
+#: src/lang.c:598
 #, c-format
 msgid	"%s=quit %s=edit %s=save kill description: "
 msgstr	"%s=Abbrechen %s=Editieren %s=Kill-Filter speichern: "
 
-#: src/lang.c:594
+#: src/lang.c:599
 #, c-format
 msgid	"%s=quit %s=edit %s=save select description: "
-msgstr	" %s=Abbrechen %s=Editieren %s=Filter (hot) speichern: "
+msgstr	"%s=Abbrechen %s=Editieren %s=Filter (hot) speichern: "
 
-#: src/lang.c:595
+#: src/lang.c:600
 msgid	"Do you really want to quit without saving your configuration?"
 msgstr	"Wirklich ohne Speichern der Konfiguration beenden?"
 
-#: src/lang.c:598
+#: src/lang.c:603
 msgid	"Invalid range - valid are '0-9.$' eg. 1-$"
 msgstr	"Ungültige Bereichsangabe - Gültig wäre '0-9.$' z.B. 1-$"
 
-#: src/lang.c:599
+#: src/lang.c:604
 msgid	"Do you want to abort this operation?"
 msgstr	"Wollen Sie diese Operation abbrechen?"
 
-#: src/lang.c:600
+#: src/lang.c:605
 msgid	"Do you want to exit tin immediately?"
 msgstr	"Wollen Sie tin augenblicklich verlassen?"
 
-#: src/lang.c:601
+#: src/lang.c:606
 msgid	"Read response> "
 msgstr	"Lese Antwort> "
 
-#: src/lang.c:602
+#: src/lang.c:607
 msgid	"Reading ('q' to quit)..."
 msgstr	"Lesen ('q' zum Beenden)..."
 
-#: src/lang.c:603
+#: src/lang.c:608
 #, c-format
 msgid	"Reading %sarticles..."
 msgstr	"Lese %sArtikel..."
 
-#: src/lang.c:604
+#: src/lang.c:609
 #, c-format
 msgid	"Reading %sattributes file...\n"
 msgstr	"Lese %sAttribute-Datei...\n"
 
-#: src/lang.c:605
+#: src/lang.c:610
 #, c-format
 msgid	"Reading %sconfig file...\n"
 msgstr	"Lese %sKonfigurations-Datei...\n"
 
-#: src/lang.c:606
+#: src/lang.c:611
 msgid	"Reading filter file...\n"
 msgstr	"Lese Filter-Datei...\n"
 
-#: src/lang.c:607
+#: src/lang.c:612
 #, c-format
 msgid	"Reading %s groups..."
 msgstr	"Lese %s Gruppen..."
 
-#: src/lang.c:608
+#: src/lang.c:613
 msgid	"Reading input history file...\n"
 msgstr	"Lese Eingabe-History...\n"
 
-#: src/lang.c:609
+#: src/lang.c:614
 msgid	"Reading keymap file...\n"
 msgstr	"Lese Tastaturbelegungen...\n"
 
-#: src/lang.c:610
+#: src/lang.c:615
 msgid	"Reading groups from active file... "
 msgstr	"Lese Gruppen aus dem Active... "
 
-#: src/lang.c:611
+#: src/lang.c:616
 msgid	"Reading groups from newsrc file... "
 msgstr	"Lese Gruppen aus der newsrc-Datei... "
 
-#: src/lang.c:612
+#: src/lang.c:617
 msgid	"Reading newsgroups file... "
 msgstr	"Lese Newsgroups-Datei... "
 
-#: src/lang.c:613
+#: src/lang.c:618
 msgid	"Reading newsrc file..."
 msgstr	"Lese newsrc-Datei..."
 
-#: src/lang.c:614
+#: src/lang.c:620
+#, c-format
+msgid	"(%d:%02d remaining)"
+msgstr	"(noch %d:%02d benötigt)"
+
+#: src/lang.c:622
 #, c-format
 msgid	"Bogus group %s removed."
 msgstr	"Nicht vorhandene Gruppe %s entfernt."
 
-#: src/lang.c:615
+#: src/lang.c:623
 #, c-format
 msgid	"Error: rename %s to %s"
 msgstr	"Fehler: Benenne %s in %s"
 
-#: src/lang.c:616
+#: src/lang.c:624
 msgid	"Reply to author..."
 msgstr	"Mailantwort an Autor..."
 
-#: src/lang.c:617
+#: src/lang.c:625
 msgid	"Repost"
 msgstr	"Reposte"
 
-#: src/lang.c:618
+#: src/lang.c:626
 msgid	"Reposting article..."
 msgstr	"Wiederholtes posten des Artikels..."
 
-#: src/lang.c:619
+#: src/lang.c:627
 #, c-format
 msgid	"Repost article(s) to group(s) [%s]> "
 msgstr	"Wiederholtes posten de(s|r) Artikel(s) in [%s]> "
 
-#: src/lang.c:620
+#: src/lang.c:628
 msgid	"Reset newsrc?"
 msgstr	"newsrc zurücksetzen?"
 
-#: src/lang.c:621
+#: src/lang.c:629
 msgid	"Responses have been directed to the following newsgroups"
 msgstr	"Antworten werden in folgende Gruppen gepostet"
 
-#: src/lang.c:622
+#: src/lang.c:630
 #, c-format
 msgid	"Responses have been directed to poster. %s=mail, %s=post, %s=quit: "
 msgstr	"Antwort per Mail wurde angefordert. %s=Mail, %s=post, %s=beenden: "
 
-#: src/lang.c:623
+#: src/lang.c:631
 #, c-format
-msgid	"RespNo %4d of %4d%s"
-msgstr	"Antw. %4d von %4d%s"
+msgid	"RespNo %4d of %4d"
+msgstr	"Antw. %4d von %4d"
 
-#: src/lang.c:624
+#: src/lang.c:632
 msgid	"Press <RETURN> to continue..."
-msgstr	"Drücken sie <RETURN> um fortzufahren..."
+msgstr	"Drücken Sie <RETURN> um fortzufahren..."
 
-#: src/lang.c:626
+#: src/lang.c:634
 #, c-format
-msgid	"Select From    [%-*.*s] (y/n): "
-msgstr	"Wähle From     [%-*.*s] (j/n): "
+msgid	"Select From    [%s] (y/n): "
+msgstr	"Wähle From     [%s] (j/n): "
 
-#: src/lang.c:627
+#: src/lang.c:635
 msgid	"Select Lines: (</>num): "
 msgstr	"Wähle Zeilen: (</>num): "
 
-#: src/lang.c:628
+#: src/lang.c:636
 msgid	"Auto-select Article Menu"
 msgstr	"Filter Menü (Bewertung/Score erhöhen)"
 
-#: src/lang.c:629
+#: src/lang.c:637
 #, c-format
-msgid	"Select Msg-Id  [%-*.*s] (f/l/o/n): "
-msgstr	"Wähle Msg-Id   [%-*.*s] (v/l/n/n): "
+msgid	"Select Msg-Id  [%s] (f/l/o/n): "
+msgstr	"Wähle Msg-Id   [%s] (v/l/n/n): "
 
-#: src/lang.c:630
+#: src/lang.c:638
 msgid	"Select pattern scope: "
 msgstr	"Wähle Muster        : "
 
-#: src/lang.c:631
+#: src/lang.c:639
 #, c-format
-msgid	"Select Subject [%-*.*s] (y/n): "
-msgstr	"Wähle Subject  [%-*.*s] (j/n): "
+msgid	"Select Subject [%s] (y/n): "
+msgstr	"Wähle Subject  [%s] (j/n): "
 
-#: src/lang.c:632
+#: src/lang.c:640
 msgid	"Select text pattern : "
 msgstr	"Wähle Textmuster    : "
 
-#: src/lang.c:633
+#: src/lang.c:641
 msgid	"Select time in days   : "
 msgstr	"Wähle Zeit in Tagen   : "
 
-#: src/lang.c:634
+#: src/lang.c:642
 #, c-format
 msgid	"# %s server configuration file\n"
 	"# This file was automatically saved by %s %s %s (\"%s\")\n"
@@ -2658,223 +2779,228 @@ msgstr	"# %s Server Konfigurationsdatei\
 	"#\n"
 	"# Nicht verändern während %s läuft, da alle Änderungen automatisch\n"
 	"# überschrieben werden wenn Sie %s verlassen.\n"
-	"# Wenn Sie nicht genau wissen was Sie tun, dann lassen sie einfach die\n"
+	"# Wenn Sie nicht genau wissen was Sie tun, dann lassen Sie einfach die\n"
 	"# Finger von dieser Datei.\n"
 	"############################################################################\n"
 	"\n"
 
-#: src/lang.c:640
+#: src/lang.c:648
 msgid	"Showing unread groups only"
 msgstr	"Zeige nur Gruppen mit ungelesenen Artikeln"
 
-#: src/lang.c:641
+#: src/lang.c:649
 msgid	"Subject: line (ignore case)   "
 msgstr	"Subject: Z. (Groß-Kl. ign.)                  "
 
-#: src/lang.c:642
+#: src/lang.c:650
 msgid	"Subject: line (case sensitive)"
 msgstr	"Subject: Z. (Groß-Kl. beachten)              "
 
-#: src/lang.c:643
+#: src/lang.c:651
 msgid	"Save"
 msgstr	"Speichern"
 
-#: src/lang.c:644
+#: src/lang.c:652
 #, c-format
 msgid	"Save '%s' (%s/%s)?"
 msgstr	"'%s' (%s/%s) speichern?"
 
-#: src/lang.c:645
+#: src/lang.c:653
 msgid	"Save configuration before continuing?"
 msgstr	"Zuerst Konfiguration speichern und danach fortfahren?"
 
-#: src/lang.c:646
+#: src/lang.c:654
 msgid	"Save filename> "
 msgstr	"Name der zu speichernden Datei> "
 
-#: src/lang.c:647
+#: src/lang.c:655
 msgid	"Saved"
 msgstr	"Gespeichert"
 
-#: src/lang.c:648
+#: src/lang.c:656
 #, c-format
 msgid	"%4d unread (%4d hot) %s in %s\n"
 msgstr	"%4d ungelesene (%4d 'hot') %s in %s\n"
 
-#: src/lang.c:649
+#: src/lang.c:657
 #, c-format
 msgid	"Saved %s...\n"
 msgstr	"%s gespeichert...\n"
 
-#: src/lang.c:650
+#: src/lang.c:658
 msgid	"Nothing was saved"
 msgstr	"Nichts gespeichert"
 
-#: src/lang.c:651
+#: src/lang.c:659
 #, c-format
 msgid	"\n"
 	"%s %d %s from %d %s\n"
 msgstr	"\n"
 	"%s %d %s aus %d %s\n"
 
-#: src/lang.c:652
+#: src/lang.c:660
 #, c-format
 msgid	"-- %s saved to %s%s --"
 msgstr	"-- %s nach %s%s gespeichert --"
 
-#: src/lang.c:653
+#: src/lang.c:661
 #, c-format
 msgid	"-- %s saved to %s - %s --"
 msgstr	"-- %s gespeichert als %s - %s --"
 
-#: src/lang.c:654
+#: src/lang.c:662
 msgid	"Saving..."
 msgstr	"Speichere..."
 
-#: src/lang.c:655
+#: src/lang.c:663
 #, c-format
 msgid	"%s: Screen initialization failed"
 msgstr	"%s: Initialisierung des Bildschirms fehlgeschlagen"
 
-#: src/lang.c:656
+#: src/lang.c:665
 #, c-format
 msgid	"%s: screen is too small\n"
 msgstr	"%s: Anzeige ist zu klein\n"
 
-#: src/lang.c:657
+#: src/lang.c:667
 #, c-format
 msgid	"screen is too small, %s is exiting\n"
 msgstr	"Anzeige zu klein, %s beendet sich\n"
 
-#: src/lang.c:658
+#: src/lang.c:668
 #, c-format
 msgid	"Search backwards [%s]> "
 msgstr	"Suche rückwärts [%s]> "
 
-#: src/lang.c:659
+#: src/lang.c:669
 #, c-format
 msgid	"Search body [%s]> "
 msgstr	"Durchsuche Artikelinhalt [%s]> "
 
-#: src/lang.c:660
+#: src/lang.c:670
 #, c-format
 msgid	"Search forwards [%s]> "
 msgstr	"Suche vorwärts [%s]> "
 
-#: src/lang.c:661
+#: src/lang.c:671
 msgid	"Searching..."
 msgstr	"Suche..."
 
-#: src/lang.c:662
+#: src/lang.c:672
 #, c-format
 msgid	"Searching article %d of %d ('q' to abort)..."
 msgstr	"Suche Artikel %d von %d ('q' zum abbrechen)..."
 
-#: src/lang.c:663
+#: src/lang.c:673
 msgid	"Select article> "
 msgstr	"Wähle Artikel> "
 
-#: src/lang.c:664
+#: src/lang.c:674
 msgid	"Select option number before text or use arrow keys and <CR>. 'q' to quit."
 msgstr	"Wähle Optionsnummer, oder benutze die Cursor Tasten und <CR>. 'q' zum beenden."
 
-#: src/lang.c:665
+#: src/lang.c:675
 msgid	"Select group> "
 msgstr	"Wähle Gruppe> "
 
-#: src/lang.c:666
+#: src/lang.c:676
 #, c-format
 msgid	"Enter selection pattern [%s]> "
 msgstr	"Nenne das Auswahlmuster [%s]> "
 
-#: src/lang.c:667
+#: src/lang.c:677
 msgid	"Select thread > "
 msgstr	"Wähle thread > "
 
-#: src/lang.c:668
+#: src/lang.c:678
 #, c-format
 msgid	"%s %s %s (\"%s\") [%s]: send a DETAILED bug report to %s\n"
-msgstr	"%s %s %s (\"%s\") [%s]: schicken sie einen DETAILIERTEN Fehlerbericht an %s\n"
+msgstr	"%s %s %s (\"%s\") [%s]: schicken Sie einen DETAILLIERTEN Fehlerbericht an %s\n"
 
-#: src/lang.c:669
+#: src/lang.c:679
 msgid	"servers active-file"
 msgstr	"Die 'active' Datei des Servers"
 
-#: src/lang.c:670
+#: src/lang.c:680
 msgid	"Cannot move into new newsgroups. Subscribe first..."
 msgstr	"Kann die Newsgruppe nicht öffnen. Sie muss erst abonniert werden..."
 
-#: src/lang.c:671
+#: src/lang.c:681
 msgid	"<SPACE>"
 msgstr	"<LEERT>"
 
-#: src/lang.c:672
+#: src/lang.c:682
 #, c-format
 msgid	"Starting: (%s)"
 msgstr	"Starte: (%s)"
 
-#: src/lang.c:673
+#: src/lang.c:683
 #, c-format
 msgid	"List Thread (%d of %d)"
 msgstr	"Zeige Thread (%d von %d)"
 
-#: src/lang.c:674
+#: src/lang.c:684
 #, c-format
 msgid	"Thread (%.*s)"
 msgstr	"Thread (%.*s)"
 
-#: src/lang.c:675
+#: src/lang.c:685
 msgid	"Enter wildcard subscribe pattern> "
 msgstr	"Wildcardmuster für zu abonnierende Gruppen> "
 
-#: src/lang.c:676
+#: src/lang.c:686
 #, c-format
 msgid	"subscribed to %d groups"
 msgstr	"%d Gruppen sind abonniert"
 
-#: src/lang.c:677
+#: src/lang.c:687
 #, c-format
 msgid	"Subscribed to %s"
 msgstr	"%s wurde abonniert"
 
-#: src/lang.c:678
+#: src/lang.c:688
 msgid	"Subscribing... "
 msgstr	"Abonniere... "
 
-#: src/lang.c:679
-msgid	"Repost or supersede article(s) [%%.*s]? (%s/%s/%s): "
-msgstr	"Artikel erneut posten oder überschreiben [%%.*s]? (%s/%s/%s): "
+#: src/lang.c:689
+#, c-format
+msgid	"Repost or supersede article(s) [%%s]? (%s/%s/%s): "
+msgstr	"Artikel erneut posten oder überschreiben [%%s]? (%s/%s/%s): "
 
-#: src/lang.c:680
+#: src/lang.c:690
 #, c-format
 msgid	"Supersede article(s) to group(s) [%s]> "
 msgstr	"Supersede (überschreibe) Artikel in den Gruppen [%s]> "
 
-#: src/lang.c:681
+#: src/lang.c:691
 msgid	"Superseding article ..."
 msgstr	"Überschreibe Artikel ..."
 
-#: src/lang.c:682
+#: src/lang.c:692
 #, c-format
 msgid	"\n"
 	"Stopped. Type 'fg' to restart %s\n"
 msgstr	"\n"
-	"Angehalten. Geben sie 'fg' ein um %s wieder zu starten\n"
+	"Angehalten. Geben Sie 'fg' ein um %s wieder zu starten\n"
 
-#: src/lang.c:684
+#: src/lang.c:694
 #, c-format
 msgid	"%d days"
 msgstr	"%d Tage"
 
-#: src/lang.c:685
+#: src/lang.c:695
 msgid	"<TAB>"
 msgstr	"<TAB>"
 
-#: src/lang.c:686
+#: src/lang.c:696
+msgid	"TeX "
+msgstr	"TeX "
+
+#: src/lang.c:697
 msgid	"# Default action/prompt strings\n"
 msgstr	"# Voreingestellte Aktion/zeige Zeichenkette\n"
 
-#: src/lang.c:687
+#: src/lang.c:698
 msgid	"# Defaults for quick (1 key) kill & auto-selection filters\n"
 	"# header=NUM  0,1=Subject: 2,3=From: 4=Message-ID: & full References: line\n"
 	"#             5=Message-ID: & last References: entry only\n"
@@ -2890,262 +3016,261 @@ msgstr	"# Voreinstellung für schnellen (
 	"# case=ON/OFF    ON=Filter case sensitive OFF=ignoriere case\n"
 	"# expire=ON/OFF  ON=Verfallen nach default_filter_days OFF=verfällt nie\n"
 
-#: src/lang.c:700
+#: src/lang.c:711
 msgid	"# If ON use print current subject or newsgroup description in the last line\n"
 msgstr	"# Falls ON anzeige des Subject oder des Gruppennamens in der letzten Zeile.\n"
 
-#: src/lang.c:701
+#: src/lang.c:712
 msgid	"# Host & time info used for detecting new groups (don't touch)\n"
-msgstr	"# Host & Zeit Info benutzen um neue Gruppen zu finden (nicht ändern)\n"
+msgstr	"# Benutzte Host- & Zeit-Info um neue Gruppen zu finden (nicht ändern)\n"
 
-#: src/lang.c:702
+#: src/lang.c:713
 msgid	"There is no news\n"
 msgstr	"Es gibt keine neuen Artikel\n"
 
-#: src/lang.c:703
+#: src/lang.c:714
 msgid	"Thread"
 msgstr	"Thread"
 
-#: src/lang.c:704
+#: src/lang.c:715
 msgid	"Thread Level Commands"
 msgstr	"Thread Level Kommandos"
 
-#: src/lang.c:705
+#: src/lang.c:716
 msgid	"Thread deselected"
 msgstr	"Thread nicht mehr ausgewählt"
 
-#: src/lang.c:706
+#: src/lang.c:717
 msgid	"Thread selected"
 msgstr	"Thread ausgewählt"
 
-#: src/lang.c:707
+#: src/lang.c:719
 msgid	"threads"
 msgstr	"Threads"
 
-#: src/lang.c:708
+#: src/lang.c:721
 msgid	"Thread range"
 msgstr	"Thread-Bereich"
 
-#: src/lang.c:709
+#: src/lang.c:722
 msgid	"thread"
 msgstr	"Thread"
 
-#: src/lang.c:710
+#: src/lang.c:723
 #, c-format
-msgid	"%sThread %4s of %4s"
-msgstr	"%sThread %4s v. %4s"
+msgid	"Thread %4s of %4s"
+msgstr	"Thread %4s v. %4s"
 
-#: src/lang.c:711
+#: src/lang.c:724
 msgid	"Threading articles..."
 msgstr	"Sortiere Artikel..."
 
-#: src/lang.c:712
+#: src/lang.c:725
 #, c-format
 msgid	"Toggled word highlighting %s"
 msgstr	"Wort-Hervorhebung: %s"
 
-#: src/lang.c:713
+#: src/lang.c:726
 msgid	"Toggled rot13 encoding"
 msgstr	"ROT13-Kodierung (de)aktiviert"
 
-#: src/lang.c:714
+#: src/lang.c:727
 #, c-format
 msgid	"Toggled german TeX encoding %s"
 msgstr	"Deutsche TeX-Dekodierung: %s"
 
-#: src/lang.c:715
+#: src/lang.c:728
 #, c-format
 msgid	"Toggled tab-width to %d"
 msgstr	"Tabulatorweite zu %d gewechselt"
 
-#: src/lang.c:716
+#: src/lang.c:729
 #, c-format
 msgid	"%d Trying to dotlock %s"
 msgstr	"%d Versuche %s zu dotlocken"
 
-#: src/lang.c:717
+#: src/lang.c:730
 #, c-format
 msgid	"%d Trying to lock %s"
 msgstr	"%d Versuche %s zu locken"
 
-#: src/lang.c:718
+#: src/lang.c:731
 msgid	"           h=help\n"
 msgstr	"          h=Hilfe\n"
 
-#: src/lang.c:720
+#: src/lang.c:733
 msgid	"Unlimited"
 msgstr	"Unbegrenzt"
 
-#: src/lang.c:721
+#: src/lang.c:734
 msgid	"Enter wildcard unsubscribe pattern> "
 msgstr	"Wildcardmuster für abzubestellende Gruppen> "
 
-#: src/lang.c:722
+#: src/lang.c:735
 #, c-format
 msgid	"Error decoding %s : %s"
 msgstr	"Fehler beim Dekodieren von %s : %s"
 
-#: src/lang.c:723
+#: src/lang.c:736
 msgid	"No end."
 msgstr	"Kein Ende."
 
-#: src/lang.c:724
+#: src/lang.c:737
 #, c-format
 msgid	"%s successfully decoded."
-msgstr	"%s erfolgreich dekodiert"
+msgstr	"%s erfolgreich dekodiert."
 
-#: src/lang.c:725
+#: src/lang.c:738
 #, c-format
 msgid	"%*s[-- %s/%s, %suuencoded file, %d lines, name: %s --]\n"
 	"\n"
 msgstr	"%*s[-- %s/%s, %suukodierte Datei, %d Zeilen, Name: %s --]\n"
 	"\n"
 
-#: src/lang.c:726
+#: src/lang.c:739
 msgid	"unread "
 msgstr	"ungelesen "
 
-#: src/lang.c:727
+#: src/lang.c:740
 #, c-format
 msgid	"unsubscribed from %d groups"
 msgstr	"%d Gruppen abbestellt"
 
-#: src/lang.c:728
+#: src/lang.c:741
 #, c-format
 msgid	"Unsubscribed from %s"
 msgstr	"%s wurde abbestellt"
 
-#: src/lang.c:729
+#: src/lang.c:742
 msgid	"Unsubscribing... "
 msgstr	"Abbestellen... "
 
-#: src/lang.c:730
+#: src/lang.c:743
 msgid	"Unthreading articles..."
 msgstr	"Aktuelle Sortierung der Artikel aufheben..."
 
-#: src/lang.c:731
+#: src/lang.c:744
 msgid	"Updated"
 msgstr	"Aktualisiert"
 
-#: src/lang.c:732
+#: src/lang.c:745
 msgid	"Updating"
 msgstr	"Aktualisiere"
 
-#: src/lang.c:733
+#: src/lang.c:746
 #, c-format
 msgid	"Opening %s\n"
 msgstr	"Öffne %s\n"
 
-#: src/lang.c:734
+#: src/lang.c:747
 msgid	"No more URL's in this article"
 msgstr	"Keine weiteren URLs im Artikel"
 
-#: src/lang.c:735
+#: src/lang.c:748
 msgid	"Use MIME display program for this message?"
 msgstr	"MIME-Anzeigeprogramm für diese Nachricht benutzen?"
 
-#: src/lang.c:736
+#: src/lang.c:749
 msgid	"  -c       mark all news as read in subscribed newsgroups (batch mode)"
 msgstr	"  -c       Markiere Artikel gelesen in den abonnierten Gruppen (Batch-Modus)"
 
-#: src/lang.c:737
+#: src/lang.c:750
 msgid	"  -Z       return status indicating if any unread news (batch mode)"
 msgstr	"  -Z       Rückgabewert zeigt, ob ungelesene Artikel vorliegen (Batch-Modus)"
 
-#: src/lang.c:738
+#: src/lang.c:751
 msgid	"  -q       don't check for new newsgroups"
 msgstr	"  -q       Überprüfe nicht auf neue Newsgruppen"
 
-#: src/lang.c:739
+#: src/lang.c:752
 msgid	"  -X       don't save any files on quit"
 msgstr	"  -X       Speicher keine Dateien beim Beenden"
 
-#: src/lang.c:740
+#: src/lang.c:753
 msgid	"  -d       don't show newsgroup descriptions"
 msgstr	"  -d       Zeige keine Newsgruppenbeschreibungen"
 
-#: src/lang.c:741
+#: src/lang.c:754
 msgid	"  -G limit get only limit articles/group"
 msgstr	"  -G limit Hole nur 'limit' Artikel pro Newsgruppe"
 
-#: src/lang.c:742
+#: src/lang.c:755
 #, c-format
 msgid	"  -H       help information about %s"
 msgstr	"  -H       Hilfe und Informationen über %s"
 
-#: src/lang.c:743
+#: src/lang.c:756
 msgid	"  -h       this help message"
 msgstr	"  -h       Diese Hilfeseite"
 
-#: src/lang.c:744
+#: src/lang.c:757
 #, c-format
 msgid	"  -I dir   news index file directory [default=%s]"
 msgstr	"  -I Verz. Verzeichnis für Artikel-Index-Datei [Standard=%s]"
 
-#: src/lang.c:745
+#: src/lang.c:758
 msgid	"  -u       update index files (batch mode)"
 msgstr	"  -u       Erneuere Index-Dateien (Batch-Modus)"
 
-#: src/lang.c:746
+#: src/lang.c:759
 #, c-format
 msgid	"  -m dir   mailbox directory [default=%s]"
 msgstr	"  -m Verz. Mailbox-Verzeichnis [Standard=%s]"
 
-#: src/lang.c:747
+#: src/lang.c:760
 #, c-format
 msgid	"\n"
 	"Mail bug reports/comments to %s"
 msgstr	"\n"
 	"Schicken Sie Fehlerberichte/Kommentare an %s"
 
-#: src/lang.c:748
+#: src/lang.c:761
 msgid	"  -N       mail new news to your posts (batch mode)"
 msgstr	"  -N       Maile neue Artikel an sich selbst (Batch-Modus)"
 
-#: src/lang.c:749
+#: src/lang.c:762
 msgid	"  -M user  mail new news to specified user (batch mode)"
 msgstr	"  -M user  Maile neue News-Artikel an 'user' (Batch-Modus)"
 
-#: src/lang.c:750
+#: src/lang.c:763
 #, c-format
 msgid	"  -f file  subscribed to newsgroups file [default=%s]"
 msgstr	"  -f Datei 'Datei' als .newsrc-Datei nutzen [Standard=%s]"
 
-# TRANSLATION MISSING
-#: src/lang.c:751
+#: src/lang.c:764
 msgid	"  -x       no posting mode"
-msgstr	""
+msgstr	"  -x       Posten nicht erlaubt Modus"
 
-#: src/lang.c:752
+#: src/lang.c:765
 msgid	"  -w       post an article and exit"
 msgstr	"  -w       Postet einen Artikel und beendet tin"
 
-#: src/lang.c:753
+#: src/lang.c:766
 msgid	"  -o       post all postponed articles and exit"
 msgstr	"  -o       Postet alle zurückgelegten Artikel und beendet tin"
 
-#: src/lang.c:754
+#: src/lang.c:767
 msgid	"  -r       read news remotely from default NNTP server"
 msgstr	"  -r       Lese Artikel vom Standard-NNTP-Server"
 
-#: src/lang.c:755
+#: src/lang.c:768
 msgid	"  -R       read news saved by -S option"
 msgstr	"  -R       Lese Artikel, die durch -S gespeichert wurden"
 
-#: src/lang.c:756
+#: src/lang.c:769
 #, c-format
 msgid	"  -s dir   save news directory [default=%s]"
 msgstr	"  -s Verz. Verzeichnis zum News-Speichern [Standard=%s]"
 
-#: src/lang.c:757
+#: src/lang.c:770
 msgid	"  -S       save new news for later reading (batch mode)"
 msgstr	"  -S       Speichere Artikel für das spätere Lesen (Batch-Modus)"
 
-#: src/lang.c:758
+#: src/lang.c:771
 msgid	"  -z       start if any unread news"
 msgstr	"  -z       Starte, wenn ungelesene Artikel vorliegen"
 
-#: src/lang.c:759
+#: src/lang.c:772
 #, c-format
 msgid	"A Usenet reader.\n"
 	"\n"
@@ -3154,37 +3279,37 @@ msgstr	"Ein Usenet-Client.\n"
 	"\n"
 	"Syntax: %s [Optionen] [Newsgruppe[,...]]"
 
-#: src/lang.c:760
+#: src/lang.c:773
 msgid	"  -v       verbose output for batch mode options"
 msgstr	"  -v       Ausführliche Ausgabe für Batch-Modus-Optionen"
 
-#: src/lang.c:761
+#: src/lang.c:774
 msgid	"  -V       print version & date information"
 msgstr	"  -V       Gebe Versions- und Datumsinformationen aus"
 
-#: src/lang.c:762
+#: src/lang.c:775
 #, c-format
 msgid	"%s only useful without batch mode operations\n"
 msgstr	"%s ist nur sinnvoll ohne Batchmodeoperationen\n"
 
-#: src/lang.c:763
+#: src/lang.c:776
 #, c-format
 msgid	"%s only useful for batch mode operations\n"
 msgstr	"%s ist nur sinnvoll für Batchmodeoperationen\n"
 
-#: src/lang.c:765
+#: src/lang.c:778
 #, c-format
 msgid	"\n"
 	"%s%d out of range (0 - %d). Reset to 0"
 msgstr	"\n"
 	"%s%d ist außerhalb der Grenzen (0 - %d). Zurücksetzen auf 0"
 
-#: src/lang.c:766
+#: src/lang.c:779
 #, c-format
 msgid	"View '%s' (%s/%s)?"
 msgstr	"'%s' (%s/%s) anzeigen?"
 
-#: src/lang.c:768
+#: src/lang.c:781
 #, c-format
 msgid	"\n"
 	"Warning: posting exceeds %d columns. Line %d is the first long one:\n"
@@ -3193,26 +3318,26 @@ msgstr	"\n"
 	"Warnung: Artikel überschreitet %d Spalten. Zeile %d ist die erste lange:\n"
 	"%-100s\n"
 
-#: src/lang.c:769
+#: src/lang.c:782
 msgid	"\n"
 	"Warning: article unchanged after editing\n"
 msgstr	"\n"
 	"Warnung: Artikel wurde im Editor nicht verändert\n"
 
-#: src/lang.c:770
+#: src/lang.c:783
 msgid	"\n"
 	"Warning: \"Subject:\" contains only whitespaces.\n"
 msgstr	"\n"
 	"Warnung: \"Subject:\" enthält nur Leerzeichen.\n"
 
-#: src/lang.c:771
+#: src/lang.c:784
 msgid	"\n"
 	"Warning: \"Subject:\" begins with \"Re: \" but there are no \"References:\".\n"
 msgstr	"\n"
-	"Warnung: \"Subject:\" beginnt mit \"Re: \", aber es gibt keine "
-	"\"References:\".\n"
+	"Warnung: \"Subject:\" beginnt mit \"Re: \", aber es gibt keine \"References:"
+	"\".\n"
 
-#: src/lang.c:773
+#: src/lang.c:786
 msgid	"\n"
 	"Warning: Article has \"References:\" but \"Subject:\" does not begin\n"
 	"         with \"Re: \" and does not contain \"(was:\".\n"
@@ -3220,7 +3345,7 @@ msgstr	"\n"
 	"Warnung: Artikel hat \"References:\" aber \"Subject:\" beginnt nicht\n"
 	"         mit \"Re: \" and enthält auch kein \"(was:\".\n"
 
-#: src/lang.c:776
+#: src/lang.c:789
 msgid	"Read carefully!\n"
 	"\n"
 	"  You are about to cancel an article seemingly written by you. This will "
@@ -3237,10 +3362,10 @@ msgstr	"Sorgfältig lesen!\n"
 	" Dies wird den Artikel von den meisten Newsservern dieser Welt löschen.\n"
 	" Es gibt aber keine Garantie, das dies überall geschieht.\n"
 	"\n"
-	"Das ist der Artikel, den sie canceln (löschen) wollen:\n"
+	"Das ist der Artikel, den Sie canceln (löschen) wollen:\n"
 	"\n"
 
-#: src/lang.c:780
+#: src/lang.c:793
 msgid	"\n"
 	"Warning: You are using a non-plain transfer encoding (such as base64 or\n"
 	"         quoted-printable) and an external inews program to submit your\n"
@@ -3248,11 +3373,11 @@ msgid	"\n"
 	"         not be encoded properly.\n"
 msgstr	"\n"
 	"Warnung: Sie benutzen eine Zeichenkodierung, die Zeichen verändert (z.B.\n"
-	"         base64 oder quoted-printable) und einen externen inews um ihren\n"
+	"         base64 oder quoted-printable) und einen externen inews um Ihren\n"
 	"         Artikel zu übertragen. Falls durch diesen inews eine Signatur\n"
 	"         angehängt wird, so kann diese nicht korrekt kodiert werden.\n"
 
-#: src/lang.c:785
+#: src/lang.c:798
 #, c-format
 msgid	"\n"
 	"\n"
@@ -3263,9 +3388,9 @@ msgstr	"\n"
 	"\n"
 	"Sie benutzen jetzt tin %s, eine neuere Version als früher.\n"
 	"Einige Einstellungen in Ihrem %s-File haben sich geändert!\n"
-	"Lesen sie \"WHATSNEW\", usw....\n"
+	"Lesen Sie \"WHATSNEW\", usw....\n"
 
-#: src/lang.c:787
+#: src/lang.c:800
 #, c-format
 msgid	"\n"
 	"\n"
@@ -3274,35 +3399,35 @@ msgid	"\n"
 msgstr	"\n"
 	"\n"
 	"Sie benutzen jetzt tin %s, eine ältere Version als früher!\n"
-	"Evtl. werden Einstellungen in Ihrem %s-File nicht erkannt\n"
-	"oder ändern sich!\n"
+	"Evtl. werden Einstellungen in Ihrem %s-File\n"
+	"nicht erkannt oder ändern sich!\n"
 
-#: src/lang.c:790
+#: src/lang.c:803
 #, c-format
 msgid	"Warning: tin wrote fewer groups to your\n"
 	"\t%s\n"
 	"than it read at startup. If you didn't unsubscribe from %ld %s during\n"
 	"this session this indicates an error and you should backup your %s\n"
 	"before you start tin once again!\n"
-msgstr	"Warnung: tin hat weniger Gruppen in ihre\n"
+msgstr	"Warnung: tin hat weniger Gruppen in Ihre\n"
 	"\t%s\n"
 	"geschrieben, als es beim Start eingelesen hat. Falls Sie nicht %ld %s\n"
 	"währenddessen abbestellt haben, ist ein Fehler aufgetreten und Sie sollten\n"
-	"ihre %s wiederherstellen, bevor Sie tin nochmal starten!\n"
+	"Ihre %s wiederherstellen, bevor Sie tin nochmal starten!\n"
 
-#: src/lang.c:794
+#: src/lang.c:807
 #, c-format
 msgid	"\n"
 	"Warning: Found %d '-- \\n' lines, this may confuse some people.\n"
 msgstr	"\n"
 	"Warnung: Es gibt %d '-- \\n' Zeilen. Das könnte einige Leute verwirren.\n"
 
-#: src/lang.c:795
+#: src/lang.c:808
 #, c-format
 msgid	"Warning: Only %d out of %d articles were saved"
 msgstr	"Warnung: Nur %d von %d Artikeln gespeichert"
 
-#: src/lang.c:796
+#: src/lang.c:809
 #, c-format
 msgid	"\n"
 	"Warning: Your signature  is longer than %d lines.  Since signatures usually "
@@ -3316,48 +3441,48 @@ msgstr	"\n"
 	"         nützlichen Informationen enthalten, sollten sie so kurz wie möglich\n"
 	"         gehalten werden.\n"
 
-#: src/lang.c:800
+#: src/lang.c:813
 #, c-format
 msgid	"Warning: this mail address may contain a spamtrap. %s=continue, %s=abort? "
 msgstr	"Warnung: E-Mailadr. evtl. verfälscht (Spamfalle). %s=weiter, %s=Abbruch? "
 
-#: src/lang.c:801
+#: src/lang.c:814
 msgid	"\n"
 	"Warning: Signatures should start with '-- \\n' not with '--\\n'.\n"
 msgstr	"\n"
 	"Warnung: Signaturen sollten mit '-- \\n' und nicht mit '--\\n' beginnen.\n"
 
-#: src/lang.c:802
+#: src/lang.c:815
 msgid	"Writing attributes file..."
 msgstr	"Schreibe Datei mit den Eigenschaften der Newsgruppen..."
 
-#: src/lang.c:804
+#: src/lang.c:817
 #, c-format
-msgid	"%d Responses%s"
-msgstr	"%d Antworten%s"
+msgid	"%d Responses"
+msgstr	"%d Antworten"
 
-#: src/lang.c:806
+#: src/lang.c:819
 #, c-format
 msgid	"Added %d %s"
 msgstr	"%d %s hinzugefügt"
 
-#: src/lang.c:807
+#: src/lang.c:820
 msgid	"No unsubscribed groups to show"
 msgstr	"Keine nicht abonnierte Gruppen gefunden"
 
-#: src/lang.c:808
+#: src/lang.c:821
 msgid	"Showing subscribed to groups only"
 msgstr	"Zeige nur abonnierte Gruppen"
 
-#: src/lang.c:809
+#: src/lang.c:822
 msgid	"Yes "
 msgstr	"Ja  "
 
-#: src/lang.c:810
+#: src/lang.c:823
 msgid	"    You have mail\n"
 msgstr	"   Sie haben Mail\n"
 
-#: src/lang.c:815
+#: src/lang.c:828
 #, c-format
 msgid	"\n"
 	"Warning: Posting is in %s and contains characters which are not\n"
@@ -3372,20 +3497,15 @@ msgstr	"\n"
 	"         konfiguriertem MM_NETWORK_CHARSET: %s enthalten sind.\n"
 	"         Diese Zeichen werden durch '?' ersetzt wenn der Artikel\n"
 	"         unverändert gepostet wird. Um das zu vermeiden sollten Sie\n"
-	"         entweder den Artiklen entspechend ändern und diese Zeichen\n"
+	"         entweder den Artikeln entsprechend ändern und diese Zeichen\n"
 	"         entfernen oder MM_NETWORK_CHARSET im M)neu auf einen\n"
 	"         passenderen Wert setzen.\n"
 
-#: src/lang.c:826
-#, c-format
-msgid	"Redefined key %s '%s' -> '%s'\n"
-msgstr	"Neubelegung %s '%s' -> '%s'\n"
-
-#: src/lang.c:827
+#: src/lang.c:839
 msgid	"  -D       debug mode 1=NNTP 2=ALL"
 msgstr	"  -D       Debug-Modus 1=NNTP 2=ALLES"
 
-#: src/lang.c:831
+#: src/lang.c:843
 msgid	"Read carefully!\n"
 	"\n"
 	"  You are about to cancel an article seemingly not written by you.  This "
@@ -3411,384 +3531,408 @@ msgstr	"Sorgfältig lesen!\n"
 	"Dies ist der Artikel, den Sie canceln (löschen) wollen:\n"
 	"\n"
 
-#: src/lang.c:840
+#: src/lang.c:852
 msgid	"toggle color"
 msgstr	"Farben ein/aus"
 
-#: src/lang.c:841
-msgid	"# For color-adjust use the following numbers\n"
-	"#  0-black       1-red         2-green        3-brown\n"
-	"#  4-blue        5-pink        6-cyan         7-white\n"
+#: src/lang.c:853
+msgid	"# Changing colors of several screen parts\n"
+	"# Possible values are:\n"
+	"#  -1 = default (white for foreground and black for background)\n"
+	"#   0 = black\n"
+	"#   1 = red\n"
+	"#   2 = green\n"
+	"#   3 = brown\n"
+	"#   4 = blue\n"
+	"#   5 = pink\n"
+	"#   6 = cyan\n"
+	"#   7 = white\n"
 	"# These are *only* for foreground:\n"
-	"#  8-gray        9-lightred   10-lightgreen  11-yellow\n"
-	"# 12-lightblue  13-lightpink  14-lightcyan   15-lightwhite\n"
-	"# A '-1' is interpreted as default (foreground normally is white, and\n"
-	"# background black)\n"
-	"\n"
-msgstr	"# Für die Farbanpassung benutzen Sie folgende Nummern\n"
-	"#  0-schwarz     1-rot         2-grün         3-braun\n"
-	"#  4-blau        5-rosa        6-cyan         7-weiß\n"
+	"#   8 = gray\n"
+	"#   9 = light red\n"
+	"#  10 = light green\n"
+	"#  11 = yellow\n"
+	"#  12 = light blue\n"
+	"#  13 = light pink\n"
+	"#  14 = light cyan\n"
+	"#  15 = light white\n"
+	"\n"
+msgstr	"# Farbeinstellungen\n"
+	"# Mögliche Werte sind:\n"
+	"#  -1 = Voreinstellung (weißer Vordergrund, schwarzer Hintergrund)\n"
+	"#   0 = schwarz\n"
+	"#   1 = rot\n"
+	"#   2 = grün\n"
+	"#   3 = braun\n"
+	"#   4 = blau\n"
+	"#   5 = rosa\n"
+	"#   6 = cyan\n"
+	"#   7 = weiß\n"
 	"# Diese sind *nur* für den Vordergrund:\n"
-	"#  8-grau        9-hellrot   10-hellgrün   11-gelb\n"
-	"# 12-hellblau   13-hellrosa  14-hellcyan   15-hellweiß\n"
-	"# Eine '-1' wird als Voreinstellung interpretiert (der Vordergrund ist\n"
-	"# normalerweise weiß und der Hintergrund schwarz)\n"
+	"#   8 = grau\n"
+	"#   9 = hellrot\n"
+	"#  10 = hellgrün\n"
+	"#  11 = gelb\n"
+	"#  12 = hellblau\n"
+	"#  13 = hellrosa\n"
+	"#  14 = hellcyan\n"
+	"#  15 = hellweiß\n"
+	"\n"
 
-#: src/lang.c:849
+#: src/lang.c:873
 msgid	"  -a       toggle color flag"
 msgstr	"  -a       Farbe ein- oder ausschalten"
 
-#: src/lang.c:853
+#: src/lang.c:877
 msgid	"\n"
 	"Error: Followup-To set to more than one newsgroup!\n"
 msgstr	"\n"
 	"Fehler: Followup-To auf mehr als eine Newsgruppe gesetzt!\n"
 
-#: src/lang.c:854
+#: src/lang.c:878
 #, c-format
 msgid	"\n"
 	"Error: cross-posting to %d newsgroups and no Followup-To line!\n"
 msgstr	"\n"
 	"Fehler: Crossposting in %d Newsgruppen und kein Followup-To gesetzt!\n"
 
-#: src/lang.c:855
+#: src/lang.c:879
 #, c-format
 msgid	"\n"
 	"Error: \"%s\" is not a valid newsgroup!\n"
 msgstr	"\n"
 	"Fehler: \"%s\" ist keine gültige Newsgruppe!\n"
 
-#: src/lang.c:857
+#: src/lang.c:881
 msgid	"\n"
 	"Warning: Followup-To set to more than one newsgroup!\n"
 msgstr	"\n"
 	"Warnung: Followup-To in mehr als eine Newsgruppe gesetzt!\n"
 
-#: src/lang.c:858
+#: src/lang.c:882
 #, c-format
 msgid	"\n"
 	"Warning: cross-posting to %d newsgroups and no Followup-To line!\n"
 msgstr	"\n"
 	"Warnung: Crossposting in %d Newsgruppen und kein Followup-To gesetzt!\n"
 
-#: src/lang.c:859
+#: src/lang.c:883
 #, c-format
 msgid	"\n"
 	"Warning: \"%s\" is not in your newsrc, it may be invalid at this site!\n"
 msgstr	"\n"
 	"Warnung: \"%s\" ist nicht in Ihrer newsrc, sie könnte ungültig sein!\n"
 
-#: src/lang.c:860
+#: src/lang.c:884
 #, c-format
 msgid	"\n"
 	"Warning: \"%s\" is not a valid newsgroup at this site!\n"
 msgstr	"\n"
 	"Warnung: \"%s\" ist keine gültige Newsgruppe auf diesem Server!\n"
 
-#: src/lang.c:864
+#: src/lang.c:888
 #, c-format
 msgid	"%d files successfully written from %d articles. %d %s occurred."
-msgstr	"%d Dateien aus %d Artikeln erfolgreich geschrieben. %d %s traten auf"
+msgstr	"%d Dateien aus %d Artikeln erfolgreich geschrieben. %d %s trat(en) auf."
 
-#: src/lang.c:865
+#: src/lang.c:889
 msgid	"Missing parts."
 msgstr	"Teile fehlen."
 
-#: src/lang.c:866
+#: src/lang.c:890
 msgid	"No beginning."
 msgstr	"Kein Anfang."
 
-#: src/lang.c:867
+#: src/lang.c:891
 msgid	"No data."
 msgstr	"Keine Daten."
 
-#: src/lang.c:868
+#: src/lang.c:892
 msgid	"Unknown error."
 msgstr	"Unbekannter Fehler."
 
-#: src/lang.c:870
+#: src/lang.c:895
 #, c-format
 msgid	"\tChecksum of %s (%ld %s)"
 msgstr	"\tPrüfsumme für %s (%ld %s)"
 
-#: src/lang.c:874
+#: src/lang.c:900
 msgid	"Reading mail active file... "
 msgstr	"Lese EMail-Active-Datei... "
 
-#: src/lang.c:875
+#: src/lang.c:901
 msgid	"Reading mailgroups file... "
 msgstr	"Lese Mailgruppen-Datei... "
 
-#: src/lang.c:879
+#: src/lang.c:905
 msgid	"perform PGP operations on article"
 msgstr	"wendet PGP auf den Artikel an"
 
-#: src/lang.c:880
+#: src/lang.c:906
 msgid	"Add key(s) to public keyring?"
 msgstr	"Schlüssel dem Öffentlichen Schlüsselring hinzufügen?"
 
-#: src/lang.c:881
+#: src/lang.c:907
 #, c-format
 msgid	"%s=encrypt, %s=sign, %s=both, %s=quit: "
 msgstr	"%s=verschlüsseln, %s=signieren, %s=beides, %s=Ende: "
 
-#: src/lang.c:882
+#: src/lang.c:908
 #, c-format
 msgid	"%s=sign, %s=sign & include public key, %s=quit: "
 msgstr	"%s=signiere, %s=signiere & füge öffentl. Schlüssel hinzu, %s=Ende: "
 
-#: src/lang.c:883
+#: src/lang.c:909
 #, c-format
 msgid	"PGP has not been set up (can't open %s)"
 msgstr	"PGP Wurde nicht konfiguriert (kann %s nicht öffnen)"
 
-#: src/lang.c:884
+#: src/lang.c:910
 msgid	"Article not signed and no public keys found"
 msgstr	"Artikel ist nicht signiert; keine öffentlichen Schlüssel gefunden"
 
-#: src/lang.c:886
+#: src/lang.c:912
 #, c-format
 msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone: "
-msgstr	"%s=Ende, %s=bearbeiten, %s=ispell, %s=pgp, %s=Menu, %s=posten, "
-	"%s=zurücklegen: "
+msgstr	"%s=Ende, %s=bearbeiten, %s=ispell, %s=pgp, %s=Menü, %s=posten, %"
+	"s=zurücklegen: "
 
-#: src/lang.c:887
-msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%.*s]: "
-msgstr	"%s=Ende, %s=bearbeiten, %s=ispell, %s=pgp, %s=verschicken [%%.*s]: "
+#: src/lang.c:913
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%s]: "
+msgstr	"%s=Ende, %s=bearbeiten, %s=ispell, %s=pgp, %s=verschicken [%%s]: "
 
-#: src/lang.c:888
-msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	"%s=Ende, %s=bearbeiten, %s=ispell, %s=pgp, %s=Menu, %s=posten, %s=zurücklegen "
-	"[%%.*s]: "
+#: src/lang.c:914
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=Ende, %s=bearbeiten, %s=ispell, %s=pgp, %s=Menü, %s=posten, %s=zurücklegen "
+	"[%%s]: "
 
-#: src/lang.c:890
+#: src/lang.c:916
 #, c-format
 msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone: "
-msgstr	"%s=Ende, %s=bearbeiten, %s=pgp, %s=Menu, %s=posten, %s=zurücklegen: "
+msgstr	"%s=Ende, %s=bearbeiten, %s=pgp, %s=Menü, %s=posten, %s=zurücklegen: "
 
-#: src/lang.c:891
-msgid	"%s=quit, %s=edit, %s=pgp, %s=send [%%.*s]: "
-msgstr	"%s=Ende, %s=bearbeiten, %s=pgp, %s=verschicken [%%.*s]: "
+#: src/lang.c:917
+#, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=send [%%s]: "
+msgstr	"%s=Ende, %s=bearbeiten, %s=pgp, %s=verschicken [%%s]: "
 
-#: src/lang.c:892
-msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	"%s=Ende, %s=bearbeiten, %s=pgp, %s=Menu, %s=posten, %s=zurücklegen [%%.*s]: "
+#: src/lang.c:918
+#, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=Ende, %s=bearbeiten, %s=pgp, %s=Menü, %s=posten, %s=zurücklegen [%%s]: "
 
-#: src/lang.c:896
+#: src/lang.c:922
 #, c-format
 msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone: "
 msgstr	"%s=Ende, %s=bearbeiten, %s=ispell, %s=Menü, %s=posten, %s=zurücklegen: "
 
-#: src/lang.c:897
-msgid	"%s=quit, %s=edit, %s=ispell, %s=send [%%.*s]: "
-msgstr	"%s=Ende, %s=bearbeiten, %s=ispell, %s=verschicken [%%.*s]: "
-
-#: src/lang.c:898
-msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	"%s=Ende, %s=bearbeiten, %s=ispell, %s=Menü, %s=post, %s=Zurückl. [%%.*s]: "
-
-#: src/lang.c:900
+#: src/lang.c:923
 #, c-format
-msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone: "
-msgstr	"%s=Ende, %s=bearbeiten, %s=Menu, %s=posten, %s=zurücklegen: "
+msgid	"%s=quit, %s=edit, %s=ispell, %s=send [%%s]: "
+msgstr	"%s=Ende, %s=bearbeiten, %s=ispell, %s=verschicken [%%s]: "
 
-#: src/lang.c:901
-msgid	"%s=quit, %s=edit, %s=send [%%.*s]: "
-msgstr	"%s=Ende, %s=bearbeiten, %s=verschicken [%%.*s]: "
+#: src/lang.c:924
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=Ende, %s=bearbeiten, %s=ispell, %s=Menü, %s=post, %s=Zurückl. [%%s]: "
 
-#: src/lang.c:902
-msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	"%s=Ende, %s=bearbeiten, %s=Menü, %s=posten, %s=zurücklegen [%%.*s]: "
+#: src/lang.c:926
+#, c-format
+msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=Ende, %s=bearbeiten, %s=Menü, %s=posten, %s=zurücklegen: "
 
-#: src/lang.c:908
+#: src/lang.c:927
 #, c-format
-msgid	"Environment variable %s not found. Set and retry..."
-msgstr	"Umgebungsvariable %s nicht gefunden. Setzen und nochmal versuchen..."
+msgid	"%s=quit, %s=edit, %s=send [%%s]: "
+msgstr	"%s=Ende, %s=bearbeiten, %s=verschicken [%%s]: "
 
-#: src/lang.c:909
-msgid	"  -B       BBS mode. File operations limited to home directories."
-msgstr	"  -B       BBS-Modus. Datei-Operationen limitiert auf das Home-Verzeichnis."
+#: src/lang.c:928
+#, c-format
+msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=Ende, %s=bearbeiten, %s=Menü, %s=posten, %s=zurücklegen [%%s]: "
 
-#: src/lang.c:917
+#: src/lang.c:937
 msgid	"Try cache_overview_files to speed up things.\n"
-msgstr	"Setze cache_overview_files um das lesen zu beschleubigen.\n"
+msgstr	"Setze cache_overview_files um das lesen zu beschleunigen.\n"
 
-#: src/lang.c:918
+#: src/lang.c:938
 msgid	"Tin will use local index files instead.\n"
 msgstr	"Tin wird lokale index files benutzen.\n"
 
-#: src/lang.c:919
+#: src/lang.c:939
 msgid	"Cannot find NNTP server name"
 msgstr	"Kann den Namen des NNTP Servers nicht finden"
 
-#: src/lang.c:920
+#: src/lang.c:940
 #, c-format
 msgid	"Connecting to %s:%d..."
 msgstr	"Verbinde mit %s:%d..."
 
-#: src/lang.c:921
+#: src/lang.c:941
 msgid	"Disconnecting from server...\n"
 msgstr	"Trenne Verbindung zum Server...\n"
 
-#: src/lang.c:922
+#: src/lang.c:942
 #, c-format
 msgid	"Wrong newsgroup name in response of GROUP command, %s for %s"
 msgstr	"Falsche Newsgruppe in Antwort auf GROUP-Befehl, %s statt %s"
 
-#: src/lang.c:923
+#: src/lang.c:943
 #, c-format
 msgid	"Failed to connect to NNTP server %s. Exiting..."
 msgstr	"Konnte nicht zum NNTP Server %s verbinden. Beende..."
 
-#: src/lang.c:924 src/nntplib.c:975
+#: src/lang.c:944
 msgid	"205  Closing connection"
 msgstr	"205  Schließe Verbindung"
 
-#: src/lang.c:925
+#: src/lang.c:945
 msgid	"Your server does not support the NNTP XOVER or OVER command.\n"
 msgstr	"Ihr Server unterstützt kein NNTP XOVER oder OVER Kommando.\n"
 
-#: src/lang.c:926
+#: src/lang.c:946
 msgid	"Connection to news server has timed out. Reconnect?"
 msgstr	"Die Verbindung zum Newsserver wurde unterbrochen. Wieder verbinden?"
 
-#: src/lang.c:927
+#: src/lang.c:947
 #, c-format
 msgid	"Put the server name in the file %s,\n"
 	"or set the environment variable NNTPSERVER"
 msgstr	"Schreiben Sie den Servernamen in die Datei %s,\n"
 	"oder setzen Sie die Umgebungsvariable NNTPSERVER"
 
-#: src/lang.c:928
+#: src/lang.c:948
 msgid	"  -A       force authentication on connect"
 msgstr	"  -A       Erzwinge Anmeldung bei Verbindung"
 
-#: src/lang.c:929
+#: src/lang.c:949
 #, c-format
 msgid	"  -g serv  read news from NNTP server serv [default=%s]"
 msgstr	"  -g serv  Lese Artikel vom NNTP-Server 'serv' [Standard=%s]"
 
-#: src/lang.c:930
+#: src/lang.c:950
 #, c-format
 msgid	"  -p port  use port as NNTP port [default=%d]"
 msgstr	"  -p port  Benutze 'port' als NNTP-Port [Standard=%d]"
 
-#: src/lang.c:931
+#: src/lang.c:951
 msgid	"  -Q       quick start. Same as -nqd"
 msgstr	"  -Q       Schnellstart. Das Selbe wie -nqd"
 
-#: src/lang.c:932
+#: src/lang.c:952
 msgid	"  -l       use only LIST instead of GROUP (-n) command"
 msgstr	"  -l       Benutze nur das LIST anstelle vom GROUP-Kommando (-n)"
 
-#: src/lang.c:933
+#: src/lang.c:953
 msgid	"  -n       only read subscribed .newsrc groups from NNTP server"
 msgstr	"  -n       Lese nur Gruppen aus der .newsrc-Datei vom NNTP-Server"
 
-#: src/lang.c:935
+#: src/lang.c:955
 #, c-format
 msgid	"%s/tcp: Unknown service.\n"
 msgstr	"%s/tcp: Unbekannter Service.\n"
 
-#: src/lang.c:938
+#: src/lang.c:958
 msgid	"\n"
 	"socket or connect problem\n"
 msgstr	"\n"
 	"Socket oder Verbindungsproblem\n"
 
-#: src/lang.c:940
+#: src/lang.c:960
 #, c-format
 msgid	"\n"
 	"Connection to %s: "
 msgstr	"\n"
 	"Verbindung mit %s: "
 
-#: src/lang.c:941
+#: src/lang.c:961
 msgid	"Giving up...\n"
 msgstr	"Gebe auf...\n"
 
-#: src/lang.c:944
+#: src/lang.c:964
 msgid	"Your server does not have Xref: in its XOVER information.\n"
 	"Tin will try to use XHDR XREF instead (slows down things a bit).\n"
 msgstr	"Ihr Server hat kein Xref: in seiner XOVER-Information.\n"
 	"Tin versucht XHDR XREF zu benutzen (verlangsamt den Prozess etwas).\n"
 
-#: src/lang.c:947
+#: src/lang.c:967
 msgid	"Your server does not have Xref: in its XOVER information.\n"
 msgstr	"Ihr Server hat kein Xref: in seiner XOVER-Information.\n"
 
-#: src/lang.c:950
+#: src/lang.c:970
 #, c-format
 msgid	"Can't open %s. Try %s -r to read news via NNTP.\n"
 msgstr	"Kann %s nicht öffnen. Probieren Sie %s -r um via NNTP zu lesen.\n"
 
-#: src/lang.c:953
+#: src/lang.c:973
 msgid	"  -Q       quick start. Same as -qd"
 msgstr	"  -Q       Schnellstart. Das Selbe wie -qd"
 
-#: src/lang.c:954
+#: src/lang.c:974
 msgid	"  -l       read only active file instead of scanning spool (-n) command"
 msgstr	"  -l       Nur active File lesen ohne den Spool zu durchsuchen (-n) Kommando"
 
-#: src/lang.c:955
+#: src/lang.c:975
 msgid	"  -n       only read subscribed .newsrc groups from spool"
 msgstr	"  -n       Lese nur Gruppen aus der .newsrc-Datei aus dem lokalen Spool"
 
-#: src/lang.c:956
+#: src/lang.c:976
 msgid	"Your server does not have Xref: in its NOV-files.\n"
-msgstr	"Ihr Server hat kein Xref: in seinern NOV-Dateien.\n"
+msgstr	"Ihr Server hat kein Xref: in seinen NOV-Dateien.\n"
 
-#: src/lang.c:960
+#: src/lang.c:980
 msgid	"Posting using external inews failed. Use built in inews instead?"
 msgstr	"Fehler beim Posten mit externem inews, verwende eingebautes?"
 
-#: src/lang.c:961
+#: src/lang.c:981
 msgid	"It worked! Should I always use my built in inews from now on?"
 msgstr	"Das hat funktioniert. In Zukunft immer eingebautes inews verwenden?"
 
-#: src/lang.c:969
+#: src/lang.c:989
 #, c-format
 msgid	"%d %s printed"
 msgstr	"%d %s gedruckt"
 
-#: src/lang.c:970
+#: src/lang.c:990
 msgid	"output article/thread/hot/pattern/tagged articles to printer"
 msgstr	"druckt Artikel/Thread/hervorgehobene/Muster/markierten"
 
-#: src/lang.c:971
+#: src/lang.c:991
 msgid	"Print"
-msgstr	"drucken"
+msgstr	"Drucke"
 
-#: src/lang.c:972
+#: src/lang.c:992
 msgid	"Printing..."
 msgstr	"Drucke..."
 
-#: src/lang.c:976
+#: src/lang.c:996
 msgid	"pipe article/thread/hot/pattern/tagged articles into command"
-msgstr	"pipet Artikel/thread hervorgehoben/muster/markierten Artikel"
+msgstr	"pipet Artikel/thread hervorgehoben/Muster/markierten Artikel"
 
-#: src/lang.c:977
+#: src/lang.c:997
 msgid	"No command"
 msgstr	"Kein Kommando"
 
-#: src/lang.c:978
+#: src/lang.c:998
 msgid	"Pipe"
 msgstr	"Pipe"
 
-#: src/lang.c:979
+#: src/lang.c:999
 #, c-format
 msgid	"Pipe to command [%.*s]> "
 msgstr	"Pipen in Kommando [%.*s]> "
 
-#: src/lang.c:980
+#: src/lang.c:1000
 msgid	"Piping..."
 msgstr	"Pipen..."
 
-#: src/lang.c:982
+#: src/lang.c:1002
 msgid	"Piping not enabled."
 msgstr	"Pipen nicht aktiviert."
 
-#: src/lang.c:986
+#: src/lang.c:1006
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line has spaces  in it that MUST be removed.\n"
@@ -3798,10 +3942,10 @@ msgid	"\n"
 msgstr	"\n"
 	"Fehler: Die \"%s:\" Zeile hat Leerzeichen, die entfernt werden MÜSSEN.\n"
 	"        Der einzig erlaubte Leerraum ist derjenige, der das ':'\n"
-	"        vom Inhalt trennt. Benutzen sie ein ',' um mehrere Newsgruppen\n"
+	"        vom Inhalt trennt. Benutzen Sie ein ',' um mehrere Newsgruppen\n"
 	"        anzugeben\n"
 
-#: src/lang.c:991
+#: src/lang.c:1011
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line is  continued in  the next line.  Since\n"
@@ -3812,7 +3956,7 @@ msgstr	"\n"
 	"        Da diese Zeile keinen leeren Raum enthalten darf, ist dies nicht\n"
 	"        erlaubt. Bitte schreiben Sie alle Newsgruppen in eine Zeile\n"
 
-#: src/lang.c:996
+#: src/lang.c:1016
 #, c-format
 msgid	"\n"
 	"Warning: The \"%s:\" line is continued in the next line.\n"
@@ -3823,7 +3967,7 @@ msgstr	"\n"
 	"         Da diese Zeile keinen leeren Raum enthalten darf, ist dies nicht\n"
 	"         erlaubt. Bitte schreiben Sie alle Newsgruppen in eine Zeile.\n"
 
-#: src/lang.c:1000
+#: src/lang.c:1020
 #, c-format
 msgid	"\n"
 	"Warning: The \"%s:\" line has spaces in it that SHOULD be removed.\n"
@@ -3831,7 +3975,7 @@ msgstr	"\n"
 	"Warnung: Die \"%s:\" Zeile enthält Leerzeichen die entfernt\n"
 	"         werden sollten.\n"
 
-#: src/lang.c:1005
+#: src/lang.c:1025
 msgid	"\n"
 	"  If your article contains quoted text  please take some time to pare it "
 	"down\n"
@@ -3851,871 +3995,1003 @@ msgid	"\n"
 	"are\n"
 	"  likely to ignore it completely.  It's a crowded net out there.\n"
 msgstr	"\n"
-	"  Wenn ihr Artikel zitierten Text enthält, nehmen Sie sich Zeit und kürzen\n"
+	"  Wenn Ihr Artikel zitierten Text enthält, nehmen Sie sich Zeit und kürzen\n"
 	"  Sie die Zitate auf das Nötigste, behalten Sie nur die Kernpunkte bei, auf\n"
 	"  die Sie sich beziehen! Viele Leute lesen Artikel, deren erste Seite nur\n"
-	"  aus zitiertem Text besteht, überhaupt nicht. Formatieren Sie ihren Artikel\n"
-	"  so, dass er maximal 80 Zeichen lange Zeilen enthält, für ihren eigenen\n"
+	"  aus zitiertem Text besteht, überhaupt nicht. Formatieren Sie Ihren Artikel\n"
+	"  so, dass er maximal 80 Zeichen lange Zeilen enthält, für Ihren eigenen\n"
 	"  Text sind 72 Zeichen eine gute Wahl, so bleibt dieser auch zitiert unter\n"
-	"  80 Zeichen. Wenn ihre Zeilen zu lang sind, werden Sie auf dem Bildschirm\n"
-	"  kammartig umbrochen, und sind daher sehr mühsam zu lesen. Wenn Sie ihren\n"
+	"  80 Zeichen. Wenn Ihre Zeilen zu lang sind, werden Sie auf dem Bildschirm\n"
+	"  kammartig umbrochen, und sind daher sehr mühsam zu lesen. Wenn Sie Ihren\n"
 	"  Artikel nicht sorgfältig formatieren, ist es sehr wahrscheinlich, dass er\n"
 	"  von vielen gar nicht gelesen wird.\n"
 
-#: src/lang.c:1018
+#: src/lang.c:1038
 msgid	"shell escape"
 msgstr	"Ausgang zur Shell"
 
-#: src/lang.c:1019
+#: src/lang.c:1039
 #, c-format
 msgid	"Shell Command (%s)"
 msgstr	"Shellkommando (%s)"
 
-#: src/lang.c:1020
+#: src/lang.c:1040
 #, c-format
 msgid	"Enter shell command [%s]> "
 msgstr	"Geben Sie ein Shellkommando ein [%s]> "
 
-#: src/lang.c:1024
+#: src/lang.c:1044
 #, c-format
 msgid	"%s: Can't get entry for TERM\n"
 msgstr	"%s: Kann den Wert für TERM nicht finden\n"
 
-#: src/lang.c:1028
+#: src/lang.c:1048
 #, c-format
 msgid	"Group %.*s ('q' to quit)..."
-msgstr	"Gruppe %.*s ('q' zum beenden...)"
+msgstr	"Gruppe %.*s ('q' zum beenden)..."
 
-#: src/lang.c:1030
+#: src/lang.c:1050
 #, c-format
 msgid	"Group %.*s..."
 msgstr	"Gruppe %.*s..."
 
-#: src/lang.c:1034
+#: src/lang.c:1054
 msgid	"Server unavailable\n"
 msgstr	"Server nicht erreichbar\n"
 
-#: src/lang.c:1040
+#: src/lang.c:1060
 #, c-format
-msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; "
-	"%s=post"
-msgstr	"%s=Pipe; %s=Mail; %s=Drucken; %s=Ende; %s=Alle/Nur ungel.; %s=Speich.; "
-	"%s=tag; %s=Posten"
+msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %"
+	"s=post"
+msgstr	"%s=Pipe; %s=Mail; %s=Drucken; %s=Ende; %s=Alle/Nur ungel.; %s=Speich.; %"
+	"s=tag; %s=Posten"
 
-#: src/lang.c:1041
+#: src/lang.c:1061
 #, c-format
 msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
-msgstr	"%s=Pipe; %s=Mail; %s=Drucken; %s=Ende; %s=Antw. Mail; %s=Speich.; %s=tag; "
-	"%s=Posten"
+msgstr	"%s=Pipe; %s=Mail; %s=Drucken; %s=Ende; %s=Antw. Mail; %s=Speich.; %s=tag; %"
+	"s=Posten"
 
-#: src/lang.c:1043
+#: src/lang.c:1063
 #, c-format
 msgid	"%s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
-msgstr	"%s=Mail; %s=Drucken; %s=Ende; %s=Alle/Nur ungel.; %s=Speich.; %s=tag; "
-	"%s=Posten"
+msgstr	"%s=Mail; %s=Drucken; %s=Ende; %s=Alle/Nur ungel.; %s=Speich.; %s=tag; %"
+	"s=Posten"
 
-#: src/lang.c:1044
+#: src/lang.c:1064
 #, c-format
 msgid	"%s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr	"%s=Mail; %s=Drucken; %s=Ende; %s=Antw. Mail; %s=Speich.; %s=tag; %s=Posten"
 
-#: src/lang.c:1048
+#: src/lang.c:1068
 #, c-format
 msgid	"%s=pipe; %s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
 msgstr	"%s=Pipe; %s=Mail; %s=Ende; %s=Alle/Nur ungel.; %s=Speich.; %s=tag; %s=Posten"
 
-#: src/lang.c:1049
+#: src/lang.c:1069
 #, c-format
 msgid	"%s=pipe; %s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr	"%s=Pipe; %s=Mail; %s=Ende; %s=Antw. Mail; %s=Speich.; %s=tag; %s=Posten"
 
-#: src/lang.c:1051
+#: src/lang.c:1071
 #, c-format
 msgid	"%s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
 msgstr	"%s=Mail; %s=Ende; %s=Alle/Nur ungel.; %s=Speich.; %s=tag; %s=Posten"
 
-#: src/lang.c:1052
+#: src/lang.c:1072
 #, c-format
 msgid	"%s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr	"%s=Mail; %s=Ende; %s=Antw. Mail; %s=Speich.; %s=tag; %s=Posten"
 
-#: src/lang.c:1058
+#: src/lang.c:1078
 msgid	"Terminal does not support color"
 msgstr	"Terminal unterstützt keine Farben"
 
-#: src/lang.c:1063
+#: src/lang.c:1083
 #, c-format
 msgid	"Trying %s"
 msgstr	"Versuche %s"
 
-#: src/lang.c:1077 src/lang.c:1102 src/lang.c:1118 src/refs.c:266
+#: src/lang.c:1097 src/lang.c:1123 src/lang.c:1139 src/lang.c:1318 src/refs.c:296
 msgid	"None"
 msgstr	"Nichts"
 
-#: src/lang.c:1078
+#: src/lang.c:1098
 msgid	"Subject"
 msgstr	"Subject"
 
-#: src/lang.c:1079
+#: src/lang.c:1099
 msgid	"References"
 msgstr	"References"
 
-#: src/lang.c:1080
+#: src/lang.c:1100
 msgid	"Both Subject and References"
 msgstr	"Beides: Subject und References"
 
-#: src/lang.c:1081
+#: src/lang.c:1101
 msgid	"Multipart Subject"
 msgstr	"Mehrteilige Artikel (Subject)"
 
-#: src/lang.c:1093 src/lang.c:1204
+#: src/lang.c:1102
+msgid	"Percentage Match"
+msgstr	"Prozentualer Treffer"
+
+#: src/lang.c:1114 src/lang.c:1225
 msgid	"No"
 msgstr	"Nein"
 
-#: src/lang.c:1094 src/lang.c:1206
+#: src/lang.c:1115 src/lang.c:1227
 msgid	"Yes"
 msgstr	"Ja"
 
-#: src/lang.c:1095
+#: src/lang.c:1116
 msgid	"Hide All"
 msgstr	"Alle ausblenden"
 
-#: src/lang.c:1103
+#: src/lang.c:1124
 msgid	"Address"
 msgstr	"Adresse"
 
-#: src/lang.c:1104
+#: src/lang.c:1125
 msgid	"Full Name"
 msgstr	"Voller Name"
 
-#: src/lang.c:1105
+#: src/lang.c:1126
 msgid	"Address and Name"
 msgstr	"Adresse und Name"
 
-#: src/lang.c:1112
+#: src/lang.c:1133
 msgid	"Max"
 msgstr	"Höchster"
 
-#: src/lang.c:1113
+#: src/lang.c:1134
 msgid	"Sum"
 msgstr	"Summe"
 
-#: src/lang.c:1114
+#: src/lang.c:1135
 msgid	"Average"
 msgstr	"Durchschnitt"
 
-#: src/lang.c:1119
+#: src/lang.c:1140
 msgid	"Lines"
 msgstr	"Zeilen"
 
-#: src/lang.c:1120
+#: src/lang.c:1141
 msgid	"Score"
 msgstr	"Bewertung"
 
-#: src/lang.c:1121
+#: src/lang.c:1142
 msgid	"Lines & Score"
 msgstr	"Zeilen und Bewertung"
 
-#: src/lang.c:1130
+#: src/lang.c:1151
 msgid	"Black"
 msgstr	"Schwarz"
 
-#: src/lang.c:1131
+#: src/lang.c:1152
 msgid	"Red"
 msgstr	"Rot"
 
-#: src/lang.c:1132
+#: src/lang.c:1153
 msgid	"Green"
 msgstr	"Grün"
 
-#: src/lang.c:1133
+#: src/lang.c:1154
 msgid	"Brown"
 msgstr	"Braun"
 
-#: src/lang.c:1134
+#: src/lang.c:1155
 msgid	"Blue"
 msgstr	"Blau"
 
-#: src/lang.c:1135
+#: src/lang.c:1156
 msgid	"Pink"
 msgstr	"Rosa"
 
-#: src/lang.c:1136
+#: src/lang.c:1157
 msgid	"Cyan"
 msgstr	"Cyan"
 
-#: src/lang.c:1137
+#: src/lang.c:1158
 msgid	"White"
 msgstr	"Weiß"
 
-#: src/lang.c:1138
+#: src/lang.c:1159
 msgid	"Gray"
 msgstr	"Grau"
 
-#: src/lang.c:1139
+#: src/lang.c:1160
 msgid	"Light Red"
 msgstr	"Helles Rot"
 
-#: src/lang.c:1140
+#: src/lang.c:1161
 msgid	"Light Green"
 msgstr	"Helles Grün"
 
-#: src/lang.c:1141
+#: src/lang.c:1162
 msgid	"Yellow"
 msgstr	"Gelb"
 
-#: src/lang.c:1142
+#: src/lang.c:1163
 msgid	"Light Blue"
 msgstr	"Helles Blau"
 
-#: src/lang.c:1143
+#: src/lang.c:1164
 msgid	"Light Pink"
 msgstr	"Helles Rosa"
 
-#: src/lang.c:1144
+#: src/lang.c:1165
 msgid	"Light Cyan"
 msgstr	"Helles Cyan"
 
-#: src/lang.c:1145
+#: src/lang.c:1166
 msgid	"Light White"
 msgstr	"Helles Weiß"
 
-#: src/lang.c:1153 src/lang.c:1210 src/lang.c:1224
+#: src/lang.c:1174 src/lang.c:1231 src/lang.c:1245
 msgid	"Nothing"
 msgstr	"Nichts"
 
-#: src/lang.c:1154
+#: src/lang.c:1175
 msgid	"Mark"
 msgstr	"Markierung"
 
-#: src/lang.c:1155
+#: src/lang.c:1176
 msgid	"Space"
 msgstr	"Leerzeichen"
 
-#: src/lang.c:1162
+#: src/lang.c:1183
 msgid	"Normal"
 msgstr	"Normal"
 
-#: src/lang.c:1163
+#: src/lang.c:1184
 msgid	"Best highlighting"
 msgstr	"Beste Hervorhebung"
 
-#: src/lang.c:1164
+#: src/lang.c:1185
 msgid	"Underline"
 msgstr	"Unterstreichen"
 
-#: src/lang.c:1165
+#: src/lang.c:1186
 msgid	"Reverse video"
 msgstr	"Invers"
 
-#: src/lang.c:1166
+#: src/lang.c:1187
 msgid	"Blinking"
 msgstr	"Blinkend"
 
-#: src/lang.c:1167
+#: src/lang.c:1188
 msgid	"Half bright"
 msgstr	"Halbe Helligkeit"
 
-#: src/lang.c:1168
+#: src/lang.c:1189
 msgid	"Bold"
 msgstr	"Fett"
 
-#: src/lang.c:1173
+#: src/lang.c:1194
 msgid	"none"
 msgstr	"Nichts"
 
-#: src/lang.c:1174
+#: src/lang.c:1195
 msgid	"commands"
 msgstr	"Kommandos"
 
-#: src/lang.c:1175
+#: src/lang.c:1196
 msgid	"select"
 msgstr	"X-Befehl"
 
-#: src/lang.c:1177
+#: src/lang.c:1198
 msgid	"commands & quit"
 msgstr	"Kommandos & Ende"
 
-#: src/lang.c:1178
+#: src/lang.c:1199
 msgid	"commands & select"
 msgstr	"Kommandos & X-Befehl"
 
-#: src/lang.c:1179
+#: src/lang.c:1200
 msgid	"quit & select"
 msgstr	"Ende & X-Befehl"
 
-#: src/lang.c:1180
+#: src/lang.c:1201
 msgid	"commands & quit & select"
 msgstr	"Kmndos & Ende & X-Befehl"
 
-#: src/lang.c:1205
+#: src/lang.c:1226
 msgid	"Shell archive"
 msgstr	"Shellarchiv"
 
-#: src/lang.c:1211
+#: src/lang.c:1232
 msgid	"Subject: (descending)"
 msgstr	"Subject: (Absteigend)"
 
-#: src/lang.c:1212
+#: src/lang.c:1233
 msgid	"Subject: (ascending)"
 msgstr	"Subject: (Aufsteigend)"
 
-#: src/lang.c:1213
+#: src/lang.c:1234
 msgid	"From: (descending)"
 msgstr	"From: (Absteigend)"
 
-#: src/lang.c:1214
+#: src/lang.c:1235
 msgid	"From: (ascending)"
 msgstr	"From: (Aufsteigend)"
 
-#: src/lang.c:1215
+#: src/lang.c:1236
 msgid	"Date: (descending)"
 msgstr	"Date: (Absteigend)"
 
-#: src/lang.c:1216
+#: src/lang.c:1237
 msgid	"Date: (ascending)"
 msgstr	"Date: (Aufsteigend)"
 
-#: src/lang.c:1217 src/lang.c:1225
+#: src/lang.c:1238 src/lang.c:1246
 msgid	"Score (descending)"
 msgstr	"Bewertung (Absteigend)"
 
-#: src/lang.c:1218 src/lang.c:1226
+#: src/lang.c:1239 src/lang.c:1247
 msgid	"Score (ascending)"
 msgstr	"Bewertung (Aufsteigend)"
 
-#: src/lang.c:1219
+#: src/lang.c:1240
 msgid	"Lines: (descending)"
 msgstr	"Lines: (Absteigend)"
 
-#: src/lang.c:1220
+#: src/lang.c:1241
 msgid	"Lines: (ascending)"
 msgstr	"Lines: (Aufsteigend)"
 
-#: src/lang.c:1231
+#: src/lang.c:1252
 msgid	"Always Keep"
 msgstr	"Immer behalten"
 
-#: src/lang.c:1232
+#: src/lang.c:1253
 msgid	"Always Remove"
 msgstr	"Immer entfernen"
 
-#: src/lang.c:1233
+#: src/lang.c:1254
 msgid	"Mark with D on selection screen"
 msgstr	"Mit D in der Anzeige markiert"
 
-#: src/lang.c:1238
+#: src/lang.c:1259
 msgid	"Kill only unread arts"
 msgstr	"Killt nur ungelesene Artikel"
 
-#: src/lang.c:1239
+#: src/lang.c:1260
 msgid	"Kill all arts & show with K"
 msgstr	"Killt alle Artikel, markiert mit K"
 
 #. TODO: s/K/art_marked_killed/
-#: src/lang.c:1240
+#: src/lang.c:1261
 msgid	"Kill all arts and never show"
 msgstr	"Killt alle Artikel, zeigt sie nie"
 
-#: src/lang.c:1245
+#: src/lang.c:1266
 msgid	"Nothing special"
 msgstr	"Nichts besonderes"
 
-#: src/lang.c:1246
+#: src/lang.c:1267
 msgid	"Compress quotes"
 msgstr	"Zitatzeichen zusammenfassen"
 
-#: src/lang.c:1247
+#: src/lang.c:1268
 msgid	"Quote signatures"
 msgstr	"Signaturen zitieren"
 
-#: src/lang.c:1248
+#: src/lang.c:1269
 msgid	"Compress quotes, quote sigs"
 msgstr	"Zitatz. kürzen, Signat. zitieren"
 
-#: src/lang.c:1249
+#: src/lang.c:1270
 msgid	"Quote empty lines"
 msgstr	"Leerzeilen zitieren"
 
-#: src/lang.c:1250
+#: src/lang.c:1271
 msgid	"Compress quotes, quote empty lines"
 msgstr	"Zitatz. kürzen, Leerzeilen zit."
 
-#: src/lang.c:1251
+#: src/lang.c:1272
 msgid	"Quote sigs & empty lines"
 msgstr	"Signat. und Leerzeilen zitieren"
 
-#: src/lang.c:1252
+#: src/lang.c:1273
 msgid	"Comp. q., quote sigs & empty lines"
 msgstr	"Zitatz. kürzen, Sign & Leerz. zit."
 
-#: src/lang.c:1290
+#: src/lang.c:1311
+msgid	"no"
+msgstr	"nein"
+
+#: src/lang.c:1312
+msgid	"with headers"
+msgstr	"mit Header"
+
+#: src/lang.c:1313
+msgid	"without headers"
+msgstr	"ohne Header"
+
+#: src/lang.c:1320 src/lang.c:1326
+msgid	"NFKC"
+msgstr	"NFKC"
+
+#: src/lang.c:1321
+msgid	"NFKD"
+msgstr	"NFKD"
+
+#: src/lang.c:1322
+msgid	"NFC"
+msgstr	"NFC"
+
+#: src/lang.c:1323
+msgid	"NFD"
+msgstr	"NFD"
+
+#: src/lang.c:1334
 msgid	"Display Options"
 msgstr	"Darstellungseinstellungen"
 
-#: src/lang.c:1296
+#: src/lang.c:1341
 msgid	"Color Options"
 msgstr	"Farbeinstellungen"
 
-#: src/lang.c:1302
+#: src/lang.c:1348
 msgid	"Article-Limiting Options"
 msgstr	"Artikel-Begrenzungseinstellungen"
 
-#: src/lang.c:1308
+#: src/lang.c:1354
 msgid	"Posting/Mailing Options"
 msgstr	"Versandeinstellungen für Mail und News"
 
-#: src/lang.c:1314
+#: src/lang.c:1360
 msgid	"Saving/Printing Options"
 msgstr	"Speicher- und Druckereinstellungen"
 
-#: src/lang.c:1320
+#: src/lang.c:1366
 msgid	"Expert Options"
 msgstr	"Experteneinstellungen"
 
-#: src/lang.c:1326
+#: src/lang.c:1372
 msgid	"Filtering Options"
 msgstr	"Filtereinstellungen"
 
-#: src/lang.c:1331 src/lang.c:1357 src/lang.c:1363 src/lang.c:1370 src/lang.c:1402
-#: src/lang.c:1408 src/lang.c:1416 src/lang.c:1436 src/lang.c:1511 src/lang.c:1673
-#: src/lang.c:1679 src/lang.c:1685 src/lang.c:1691 src/lang.c:1703 src/lang.c:1710
-#: src/lang.c:1761 src/lang.c:1770 src/lang.c:1776 src/lang.c:1782 src/lang.c:1788
-#: src/lang.c:1794 src/lang.c:1800 src/lang.c:1806 src/lang.c:1812 src/lang.c:1818
-#: src/lang.c:1824 src/lang.c:1830 src/lang.c:1836 src/lang.c:1842 src/lang.c:1848
-#: src/lang.c:1854 src/lang.c:1860 src/lang.c:1866 src/lang.c:1872 src/lang.c:1878
-#: src/lang.c:1884 src/lang.c:1891 src/lang.c:1897 src/lang.c:1903 src/lang.c:1910
-#: src/lang.c:1921 src/lang.c:1927 src/lang.c:1933 src/lang.c:1939 src/lang.c:1945
-#: src/lang.c:1959 src/lang.c:1971 src/lang.c:2005 src/lang.c:2057 src/lang.c:2064
-#: src/lang.c:2070 src/lang.c:2095 src/lang.c:2112 src/lang.c:2165 src/lang.c:2198
-#: src/lang.c:2218 src/lang.c:2253 src/lang.c:2261 src/lang.c:2286 src/lang.c:2298
+#: src/lang.c:1377 src/lang.c:1408 src/lang.c:1414 src/lang.c:1440 src/lang.c:1490
+#: src/lang.c:1496 src/lang.c:1506 src/lang.c:1526 src/lang.c:1601 src/lang.c:1771
+#: src/lang.c:1777 src/lang.c:1783 src/lang.c:1789 src/lang.c:1801 src/lang.c:1808
+#: src/lang.c:1862 src/lang.c:1871 src/lang.c:1877 src/lang.c:1884 src/lang.c:1891
+#: src/lang.c:1898 src/lang.c:1905 src/lang.c:1912 src/lang.c:1919 src/lang.c:1926
+#: src/lang.c:1933 src/lang.c:1940 src/lang.c:1947 src/lang.c:1954 src/lang.c:1961
+#: src/lang.c:1968 src/lang.c:1975 src/lang.c:1982 src/lang.c:1989 src/lang.c:1996
+#: src/lang.c:2003 src/lang.c:2010 src/lang.c:2017 src/lang.c:2024 src/lang.c:2031
+#: src/lang.c:2039 src/lang.c:2055 src/lang.c:2062 src/lang.c:2069 src/lang.c:2076
+#: src/lang.c:2082 src/lang.c:2088 src/lang.c:2105 src/lang.c:2117 src/lang.c:2151
+#: src/lang.c:2204 src/lang.c:2211 src/lang.c:2217 src/lang.c:2242 src/lang.c:2259
+#: src/lang.c:2312 src/lang.c:2348 src/lang.c:2368 src/lang.c:2403 src/lang.c:2413
+#: src/lang.c:2438 src/lang.c:2454 src/lang.c:2473 src/lang.c:2486
 msgid	"<SPACE> toggles, <CR> sets, <ESC> cancels."
 msgstr	"<SPACE> schaltet um, <CR> setzt, <ESC> bricht ab."
 
-#: src/lang.c:1332
-msgid	"Show mini menu & posting etiquette :"
-msgstr	"Zeigt Minimenü & Posting etiquette :"
+#: src/lang.c:1378
+msgid	"Show mini menu & posting etiquette"
+msgstr	"Zeigt Minimenü & Posting etiquette"
 
-#: src/lang.c:1333
+#: src/lang.c:1379
 msgid	"# If ON show a mini menu of useful commands at each level\n"
 	"# and posting etiquette after composing an article\n"
 msgstr	"# Falls ON wird ein kleines Menü mit nützlichen Kommandos in jedem Level\n"
 	"# angezeigt. Nach dem Erstellen eines Artikels wird die etiquette angezeigt\n"
 
-#: src/lang.c:1338
+#: src/lang.c:1384
 msgid	"Show short description for each newsgroup. <SPACE> toggles & <CR> sets."
 msgstr	"Zeige Kurzbeschreibung für Gruppe. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:1339
-msgid	"Show description of each newsgroup :"
-msgstr	"Zeige Beschreibung der Newsgruppen :"
+#: src/lang.c:1385
+msgid	"Show description of each newsgroup"
+msgstr	"Zeige Beschreibung der Newsgruppen"
 
-#: src/lang.c:1340
+#: src/lang.c:1386
 msgid	"# If ON show group description text after newsgroup name at\n"
 	"# group selection level\n"
 msgstr	"# Falls ON wird die Newsgruppenbeschreibung im Gruppenauswahlmenü\n"
 	"# nach dem Namen angezeigt\n"
 
-#: src/lang.c:1345
+#: src/lang.c:1391
 msgid	"Show Subject & From (author) fields in group menu. <SPACE> toggles & <CR> "
 	"sets."
 msgstr	"Zeigt Subject & From (Autor) Felder im Gruppenmenü. <SPACE> wechselt & <CR> "
 	"setzt."
 
-#: src/lang.c:1346
-msgid	"In group menu, show author by      :"
-msgstr	"Im Gruppenmenü, zeige Autor an nach:"
-
-#: src/lang.c:1347
-msgid	"# Part of from field to display 0) none 1) address 2) full name 3) both\n"
-msgstr	"# Anzeige des 'From:' Felds 0) nichts 1) Adresse 2) Voller Name 3) beides\n"
+#: src/lang.c:1392
+msgid	"In group menu, show author by"
+msgstr	"Im Gruppenmenü, zeige Autor an nach"
+
+#: src/lang.c:1393
+msgid	"# Part of from field to display\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = none\n"
+	"#   1 = address\n"
+	"# * 2 = full name\n"
+	"#   3 = both\n"
+msgstr	"# Anzeige des 'From:' Felds\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"#   0 = nichts\n"
+	"#   1 = Adresse\n"
+	"# * 2 = Voller Name\n"
+	"#   3 = beides (Adresse und Name)\n"
 
-#: src/lang.c:1351
+#: src/lang.c:1402
 msgid	"Draw -> or highlighted bar for selection. <SPACE> toggles & <CR> sets."
 msgstr	"Zeige -> oder Hervorhebung für Auswahl. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:1352
-msgid	"Draw -> instead of highlighted bar :"
-msgstr	"Zeige -> anstatt einer Markierung  :"
+#: src/lang.c:1403
+msgid	"Draw -> instead of highlighted bar"
+msgstr	"Zeige -> anstatt einer Markierung"
 
-#: src/lang.c:1353
+#: src/lang.c:1404
 msgid	"# If ON use -> otherwise highlighted bar for selection\n"
 msgstr	"# Falls ON benutze -> andernfalls benutze eine Markierung zur Auswahl\n"
 
-#: src/lang.c:1358
-msgid	"Use inverse video for page headers :"
-msgstr	"Inverse Darstellung für die Header :"
+#: src/lang.c:1409
+msgid	"Use inverse video for page headers"
+msgstr	"Inverse Darstellung für die Header"
 
-#: src/lang.c:1359
+#: src/lang.c:1410
 msgid	"# If ON use inverse video for page headers at different levels\n"
 msgstr	"# Falls ON nutze inverse Darstellung für Header bei verschiedenen Ebenen\n"
 
-#: src/lang.c:1364
-msgid	"Thread articles by                 :"
-msgstr	"Threade Artikel anhand             :"
-
-#: src/lang.c:1365
-msgid	"# Thread articles on 0=(nothing) 1=(Subject) 2=(References) 3=(Both)\n"
-	"# 4=(Multipart Subject).\n"
-msgstr	"# Zeige Artikel nach 0=(nichts) 1=(Subject) 2=(References) 3=(beides)\n"
-	"# 4=(Mehrteilige Artikel).\n"
-
-#: src/lang.c:1371
-msgid	"Score of a thread                  :"
-msgstr	"Bewertung eines Threads            :"
+#: src/lang.c:1415
+msgid	"Thread articles by"
+msgstr	"Threade Artikel anhand"
+
+#: src/lang.c:1416
+msgid	"# Thread articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject\n"
+	"#   2 = References\n"
+	"# * 3 = Both (Subject and References)\n"
+	"#   4 = Multipart Subject\n"
+	"#   5 = Percentage Match\n"
+msgstr	"# Gruppiere Artikel nach\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"#   0 = nichts\n"
+	"#   1 = Subject\n"
+	"#   2 = References\n"
+	"# * 3 = beides (Subject und References)\n"
+	"#   4 = Mehrteilige Artikel\n"
+	"#   5 = prozentualer Subject vergleich\n"
+
+#: src/lang.c:1427
+msgid	"Enter percentage match required to thread together. <CR> sets."
+msgstr	"Prozent des Subject das gleich sein muß. <CR> setzt."
+
+#: src/lang.c:1428
+msgid	"Thread percentage match"
+msgstr	"Prozentualer Subject vergleich"
 
-#: src/lang.c:1372
-msgid	"# Thread score 0=(Max) 1=(Sum) 2=(Average)\n"
-msgstr	"# Bewertung des Threads 0=(Höchster) 1=(Summe) 2=(Durchschnitt)\n"
+# TRANSLATION MISSING
+#: src/lang.c:1429
+#, c-format
+msgid	"# Thread percentage match...\n"
+	"# the percentage of characters in the subject of an article that must match\n"
+	"# a base article for both those articles to be considered to belong to the\n"
+	"# same thread. This option is an integer percentage, eg. 80, no decimals may\n"
+	"# follow. If 80 is used here, then 80%% of the characters must match "
+	"exactly,\n"
+	"# no insertion of a character, for the two articles to be put in the same\n"
+	"# thread. eg. 'happy' and 'harpy' would match, but 'harpie', 'happie' and\n"
+	"# 'harppy' would be threaded separately from 'happy'\n"
+msgstr	""
+
+#: src/lang.c:1441
+msgid	"Score of a thread"
+msgstr	"Bewertung eines Threads"
+
+#: src/lang.c:1442
+msgid	"# Thread score\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = max\n"
+	"#   1 = sum\n"
+	"#   2 = average\n"
+msgstr	"# Bewertung des Threads\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"# * 0 = Höchster\n"
+	"#   1 = Summe\n"
+	"#   2 = Durchschnitt\n"
 
-#: src/lang.c:1376
+#: src/lang.c:1450
 msgid	"Sort articles by Subject, From, Date or Score. <SPACE> toggles & <CR> sets."
 msgstr	"Sortiere Artikel nach Subject, From, Datum oder Bewertung."
 
-#: src/lang.c:1377
-msgid	"Sort articles by                   :"
-msgstr	"Sortiere Artikel nach              :"
+#: src/lang.c:1451
+msgid	"Sort articles by"
+msgstr	"Sortiere Artikel nach"
 
-#: src/lang.c:1378
-msgid	"# Sort articles by 0=(nothing) 1=(Subject descend) 2=(Subject ascend)\n"
-	"# 3=(From descend) 4=(From ascend) 5=(Date descend) 6=(Date ascend)\n"
-	"# 7=(Score descend) 8=(Score ascend) 9=(Lines descend) 10=(Lines ascend).\n"
-msgstr	"# Sort. Art. nach 0=(nichts) 1=(Subject absteigend) 2=(Subject aufsteigend)\n"
-	"# 3=(From abst.) 4=(From aufst.) 5=(Datum abst.) 6=(Datum aufst.)\n"
-	"# 7=(Bewertung abst.) 8=(Bewertung aufst.) 9=(Lines abst.) 10=(Lines "
-	"aufst.).\n"
+#: src/lang.c:1452
+msgid	"# Sort articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject descending\n"
+	"#   2 = Subject ascending\n"
+	"#   3 = From descending\n"
+	"#   4 = From ascending\n"
+	"#   5 = Date descending\n"
+	"# * 6 = Date ascending\n"
+	"#   7 = Score descending\n"
+	"#   8 = Score ascending\n"
+	"#   9 = Lines descending\n"
+	"#  10 = Lines ascending\n"
+msgstr	"# Sortiere Artikel nach\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"#   0 = nichts\n"
+	"#   1 = Subject absteigend\n"
+	"#   2 = Subject aufsteigend\n"
+	"#   3 = From absteigend\n"
+	"#   4 = From aufsteigend\n"
+	"#   5 = Datum absteigend\n"
+	"# * 6 = Datum aufsteigend\n"
+	"#   7 = Bewertung absteigend\n"
+	"#   8 = Bewertung aufsteigend\n"
+	"#   9 = Lines absteigend\n"
+	"#  10 = Lines aufsteigend\n"
 
-#: src/lang.c:1384
+#: src/lang.c:1468
 msgid	"Sort threads by Nothing or Score. <SPACE> toggles & <CR> sets."
-msgstr	"Threads nach Bewertung (Score) oder nichts ordnen. <SPACE> wechselt & <CR> "
-	"setzt"
+msgstr	"Threads nach Bewertung (Score) ordnen? <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:1385
-msgid	"Sort threads by                    :"
-msgstr	"Sortiere Threads nach              :"
+#: src/lang.c:1469
+msgid	"Sort threads by"
+msgstr	"Sortiere Threads nach"
 
-#: src/lang.c:1386
-msgid	"# Sort thread by 0=(nothing) 1=(Score descend) 2=(Score ascend)\n"
-msgstr	"# Ordne Threads nach 0=(nichts) 1=(Bewertung abst.) 2=(Bewertung aufst.)\n"
+#: src/lang.c:1470
+msgid	"# Sort thread by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = Score descending\n"
+	"#   2 = Score ascending\n"
+msgstr	"# Ordne Threads nach\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"#   0 = nichts \n"
+	"# * 1 = Bewertung absteigend\n"
+	"#   2 = Bewertung aufsteigend\n"
 
-#: src/lang.c:1390
+#: src/lang.c:1478
 msgid	"Put cursor at first/last unread art in groups. <SPACE> toggles & <CR> sets."
 msgstr	"Setze Cursor an ersten/letzten ungel. Artikel. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:1391
-msgid	"Goto first unread article in group :"
-msgstr	"Setze Cursor auf ersten ungel. Art.:"
+#: src/lang.c:1479
+msgid	"Goto first unread article in group"
+msgstr	"Setze Cursor auf ersten ungel. Art."
 
-#: src/lang.c:1392
+#: src/lang.c:1480
 msgid	"# If ON put cursor at first unread art in group otherwise last art\n"
-msgstr	"# Falls ON setze Cursor auf ersten ungelesenen Art., sonst auf letzten\n"
+msgstr	"# Falls ON setze Cursor auf ersten ungelesenen Artikel, sonst auf letzten\n"
 
-#: src/lang.c:1396
+#: src/lang.c:1484
 msgid	"Show all articles or only unread articles. <SPACE> toggles & <CR> sets."
 msgstr	"Zeige alle oder nur ungelesene Artikel. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:1397
-msgid	"Show only unread articles          :"
-msgstr	"Zeige nur ungelesene Artikel       :"
+#: src/lang.c:1485
+msgid	"Show only unread articles"
+msgstr	"Zeige nur ungelesene Artikel"
 
-#: src/lang.c:1398
+#: src/lang.c:1486
 msgid	"# If ON show only new/unread articles otherwise show all.\n"
 msgstr	"# Falls ON zeige nur neue/ungelesene Artikel, sonst alle.\n"
 
-#: src/lang.c:1403
-msgid	"Show only groups with unread arts  :"
-msgstr	"Zeige nur Gruppen mit ungel. Art.  :"
+#: src/lang.c:1491
+msgid	"Show only groups with unread arts"
+msgstr	"Zeige nur Gruppen mit ungel. Art."
 
-#: src/lang.c:1404
+#: src/lang.c:1492
 msgid	"# If ON show only subscribed to groups that contain unread articles.\n"
 msgstr	"# Falls ON zeige nur abonnierte Gruppen mit ungelesen Artikeln.\n"
 
-#: src/lang.c:1409
-msgid	"Filter which articles              :"
-msgstr	"Filter (kill) anwenden auf         :"
+#: src/lang.c:1497
+msgid	"Filter which articles"
+msgstr	"Filter (kill) anwenden auf"
+
+#: src/lang.c:1498
+msgid	"# Filter which articles\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = only kill unread articles\n"
+	"#   1 = kill all articles and show in threads marked with K\n"
+	"#   2 = kill all articles and never show them\n"
+msgstr	"# Filter (kill) anwenden auf\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"# * 0 = Filtert nur ungelesene Artikel\n"
+	"#   1 = Filtert alle Artikel und markiert sie mit K\n"
+	"#   2 = Filtert alle Artikel und zeigt gekillte niemals an\n"
 
-#: src/lang.c:1410
-msgid	"# 0=(Only kill unread articles)\n"
-	"# 1=(Kill all articles and show in threads marked with K)\n"
-	"# 2=(Kill all articles and never show them).\n"
-msgstr	"# 0=(Filtert nur ungelesene Artikel)\n"
-	"# 1=(Filtert alle Artikel und markiert sie mit K)\n"
-	"# 2=(Filtert alle Artikel und zeigt sie niemals an).\n"
-
-#: src/lang.c:1417
-msgid	"Tab goes to next unread article    :"
-msgstr	"Tab zeigt nächsten ungelesenen Art.:"
+#: src/lang.c:1507
+msgid	"Tab goes to next unread article"
+msgstr	"Tab zeigt nächsten ungelesenen Art."
 
-#: src/lang.c:1418
+#: src/lang.c:1508
 msgid	"# If ON the TAB command will go to next unread article at article viewer "
 	"level\n"
 msgstr	"# Falls ON wechselt TAB sofort zum nächsten ungelesenen Artikel\n"
 
-#: src/lang.c:1422
+#: src/lang.c:1512
 msgid	"Scrolling with <SPACE> past the end of an art. jumps to the next unread one."
 msgstr	"Weiterscrollen mit Leertaste am Artikelende wechselt zum nächsten ungel. "
-	"Artikel"
+	"Artikel."
 
-#: src/lang.c:1423
-msgid	"Space goes to next unread article  :"
-msgstr	"Leertaste zeigt nächsten unge. Art.:"
+#: src/lang.c:1513
+msgid	"Space goes to next unread article"
+msgstr	"Leertaste zeigt nächsten unge. Art."
 
-#: src/lang.c:1424
+#: src/lang.c:1514
 msgid	"# If ON the SPACE command will go to next unread article at article viewer\n"
 	"# level when the end of the article is reached (rn-style pager)\n"
 msgstr	"# Falls ON wechselt die Leertaste zum nächsten ungelesenen Artikel, wenn\n"
 	"# das Ende des Artikels erreicht wird (rn-Stil)\n"
 
-#: src/lang.c:1429
+#: src/lang.c:1519
 msgid	"Scrolling with <PGDN>/<DOWN> past the end of an art. jumps to the unread one."
-msgstr	"Weiterscrollen mit BildAb am Artikelende wechselt zum nächsten ungel. Artikel"
+msgstr	"Weiterscrollen mit BildAb am Artikelende wechselt zum nächsten ungel. Artikel."
 
-#: src/lang.c:1430
-msgid	"PgDn goes to next unread article   :"
-msgstr	"PgDn zeigt nächst. ungelesenen Art.:"
+#: src/lang.c:1520
+msgid	"PgDn goes to next unread article"
+msgstr	"PgDn zeigt nächst. ungelesenen Art."
 
-#: src/lang.c:1431
+#: src/lang.c:1521
 msgid	"# If ON the PGDN or DOWN command will go to next unread article when\n"
 	"# pressed at end of message\n"
 msgstr	"# Falls ON wechselt Bildrunter oder Cursorrunter zum nächsten ungelesenen\n"
 	"# Artikel, wenn das Artikelende erreicht wurde\n"
 
-#: src/lang.c:1437
-msgid	"List thread using right arrow key  :"
-msgstr	"Zeige Thread mit rechter Pfeilt. an:"
+#: src/lang.c:1527
+msgid	"List thread using right arrow key"
+msgstr	"Zeige Thread mit rechter Pfeilt. an"
 
-#: src/lang.c:1438
+#: src/lang.c:1528
 msgid	"# If ON automatically list thread when entering it using right arrow key.\n"
 msgstr	"# Falls ON: Thread beim Betreten mit der rechten Cursortaste automatisch\n"
 	"# anzeigen?\n"
 
-#: src/lang.c:1442
+#: src/lang.c:1532
 msgid	"Enter character to indicate deleted articles. <CR> sets, <ESC> cancels."
 msgstr	"Definiere Zeichen für gelöschte Artikel. <CR> setzt, <ESC> bricht ab."
 
-#: src/lang.c:1443
-msgid	"Character to show deleted articles :"
-msgstr	"Zeichen für gelöschte Artikel      :"
+#: src/lang.c:1533
+msgid	"Character to show deleted articles"
+msgstr	"Zeichen für gelöschte Artikel"
 
-#: src/lang.c:1444
+#: src/lang.c:1534
 msgid	"# Character used to show that an art was deleted (default 'D')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Zeichen für einen Artikel, der gelöscht wurde (Voreinstellung 'D')\n"
 	"# _ wird in ' ' umgewandelt\n"
 
-#: src/lang.c:1449
+#: src/lang.c:1539
 msgid	"Enter character to indicate articles in a range. <CR> sets, <ESC> cancels."
 msgstr	"Definiere Zeichen, das Artikel im Bereich anzeigt.<CR> setzt, <ESC> bricht ab."
 
-#: src/lang.c:1450
-msgid	"Character to show inrange articles :"
-msgstr	"Zeichen für Artikel im Bereich     :"
+#: src/lang.c:1540
+msgid	"Character to show inrange articles"
+msgstr	"Zeichen für Artikel im Bereich"
 
-#: src/lang.c:1451
+#: src/lang.c:1541
 msgid	"# Character used to show that an art is in a range (default '#')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Zeichen für Artikel die im Bereich sind (Voreinstellung '#')\n"
 	"# _ wird in ' ' umgewandelt\n"
 
-#: src/lang.c:1456
+#: src/lang.c:1546
 msgid	"Enter character to indicate that article will return. <CR> sets, <ESC> "
 	"cancels."
 msgstr	"Definiere Zeichen für wiederkehrende Art. <CR> setzt. <ESC> bricht ab."
 
-#: src/lang.c:1457
-msgid	"Character to show returning arts   :"
-msgstr	"Zeichen für wiederkehrende Artikel :"
+#: src/lang.c:1547
+msgid	"Character to show returning arts"
+msgstr	"Zeichen für wiederkehrende Artikel"
 
-#: src/lang.c:1458
+#: src/lang.c:1548
 msgid	"# Character used to show that an art will return (default '-')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Zeichen, dass ein Artikel wiederkommen wird (Voreinstellung '-')\n"
 	"# _ wird in ' ' umgewandelt\n"
 
-#: src/lang.c:1463
+#: src/lang.c:1553
 msgid	"Enter character to indicate selected articles. <CR> sets, <ESC> cancels."
 msgstr	"Zeichen für Artikel mit Markierung wichtig/'hot' <CR> setzt, <ESC> bricht ab."
 
-#: src/lang.c:1464
-msgid	"Character to show selected articles:"
-msgstr	"Zeichen für wichtige Artikel       :"
+#: src/lang.c:1554
+msgid	"Character to show selected articles"
+msgstr	"Zeichen für wichtige Artikel"
 
-#: src/lang.c:1465
+#: src/lang.c:1555
 msgid	"# Character used to show that an art was auto-selected (default '*')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Zeichen für Artikel mit Markierung wichtig/'hot' (Voreinstellung '*')\n"
 	"# _ wird in ' ' umgewandelt\n"
 
-#: src/lang.c:1470
+#: src/lang.c:1560
 msgid	"Enter character to indicate recent articles. <CR> sets, <ESC> cancels."
 msgstr	"Definiere Zeichen für aktuelle Artikel. <CR> setzt, <ESC> bricht ab."
 
-#: src/lang.c:1471
-msgid	"Character to show recent articles  :"
-msgstr	"Zeichen für aktuelle Artikel       :"
+#: src/lang.c:1561
+msgid	"Character to show recent articles"
+msgstr	"Zeichen für aktuelle Artikel"
 
-#: src/lang.c:1472
+#: src/lang.c:1562
 msgid	"# Character used to show that an art is recent (default 'o')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Zeichen für einen aktuellen Artikel (Voreinstellung ist 'o')\n"
 	"# _ wird in ' ' umgewandelt\n"
 
-#: src/lang.c:1477
+#: src/lang.c:1567
 msgid	"Enter character to indicate unread articles. <CR> sets, <ESC> cancels."
 msgstr	"Zeichen für ungelesene Artikel. <CR> setzt, <ESC> bricht ab."
 
-#: src/lang.c:1478
-msgid	"Character to show unread articles  :"
-msgstr	"Zeichen für ungelesene Artikel     :"
+#: src/lang.c:1568
+msgid	"Character to show unread articles"
+msgstr	"Zeichen für ungelesene Artikel"
 
-#: src/lang.c:1479
+#: src/lang.c:1569
 msgid	"# Character used to show that an art is unread (default '+')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Zeichen für ungelesene Artikel (Voreinstellung '+')\n"
 	"# _ wird in ' ' umgewandelt\n"
 
-#: src/lang.c:1484
+#: src/lang.c:1574
 msgid	"Enter character to indicate read articles. <CR> sets, <ESC> cancels."
 msgstr	"Zeichen für gelesene Artikel. <CR> setzt, <ESC> bricht ab."
 
-#: src/lang.c:1485
-msgid	"Character to show read articles    :"
-msgstr	"Zeichen für gelesene Artikel       :"
+#: src/lang.c:1575
+msgid	"Character to show read articles"
+msgstr	"Zeichen für gelesene Artikel"
 
-#: src/lang.c:1486
+#: src/lang.c:1576
 msgid	"# Character used to show that an art was read (default ' ')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Zeichen für gelesene Artikel (Voreinstellung ' ')\n"
 	"# _ wird in ' ' umgewandelt\n"
 
-#: src/lang.c:1491
+#: src/lang.c:1581
 msgid	"Enter character to indicate killed articles. <CR> sets, <ESC> cancels."
 msgstr	"Zeichen für gekillte Artikel. <CR> setzt, <ESC> bricht ab."
 
-#: src/lang.c:1492
-msgid	"Character to show killed articles  :"
-msgstr	"Zeichen für gekillte Artikel       :"
+#: src/lang.c:1582
+msgid	"Character to show killed articles"
+msgstr	"Zeichen für gekillte Artikel"
 
-#: src/lang.c:1493
+#: src/lang.c:1583
 msgid	"# Character used to show that an art was killed (default 'K')\n"
 	"# kill_level must be set accordingly, _ is turned into ' '\n"
 msgstr	"# Zeichen für gekillte Artikel (Voreinstellung 'K')\n"
 	"# _ wird in ' ' umgewandelt, kill_level muss passend gesetzt sein.\n"
 
-#: src/lang.c:1498
+#: src/lang.c:1588
 msgid	"Enter character to indicate read selected articles. <CR> sets, <ESC> cancels."
 msgstr	"Zeichen für gelesene wichtige/'hot' Artikel. <CR> setzt, <ESC> bricht ab."
 
-#: src/lang.c:1499
-msgid	"Character to show readselected arts:"
-msgstr	"Zeichen für gelesene wichtige Art. :"
+#: src/lang.c:1589
+msgid	"Character to show readselected arts"
+msgstr	"Zeichen für gelesene wichtige Art."
 
-#: src/lang.c:1500
+#: src/lang.c:1590
 msgid	"# Character used to show that an art was selected before read (default ':')\n"
 	"# kill_level must be set accordingly, _ is turned into ' '\n"
 msgstr	"# Zeichen für bereits gelesene Artikel mit Markierung wichtig/'hot'\n"
 	"# (Voreinstellung ':')\n"
 	"# _ wird in ' ' umgewandelt, kill_level muss passend gesetzt sein.\n"
 
-#: src/lang.c:1505
+#: src/lang.c:1595
 msgid	"Enter maximum length of newsgroup names displayed. <CR> sets."
 msgstr	"Maximale Länge des angezeigten Newsgruppennamens. <CR> setzt."
 
-#: src/lang.c:1506
-msgid	"Max. length of group names shown   :"
-msgstr	"Max. Länge angezeigter Gruppennamen:"
+#: src/lang.c:1596
+msgid	"Max. length of group names shown"
+msgstr	"Max. Länge angezeigter Gruppennamen"
 
-#: src/lang.c:1507
+#: src/lang.c:1597
 msgid	"# Maximum length of the names of newsgroups displayed\n"
 msgstr	"# Maximale Länge der angezeigten Newsgruppennamen\n"
 
-#: src/lang.c:1512
-msgid	"Show lines/score in listings       :"
-msgstr	"Zeige Zeilenz./Bewert. in Übersicht:"
+#: src/lang.c:1602
+msgid	"Show lines/score in listings"
+msgstr	"Zeige Zeilenz./Bewert. in Übersicht"
 
-#: src/lang.c:1513
+#: src/lang.c:1603
 msgid	"# What informations should be displayed in article/thread listing\n"
-	"# 0 = nothing, 1 = lines, 2 = score, 3 = lines & score\n"
-msgstr	"# Welche weiteren Informationen sollen in der Artikel/Thread\n"
-	"# Übersicht angezeigt werden:\n"
-	"# 0 = keine, 1 = Zeilenzahl, 2 = Bewertung, 3 = Zeilenzahl & Bewertung\n"
-
-#: src/lang.c:1518
-msgid	"0 = full page scrolling, -1 = show previous last line as first on next page, "
-	"-2 = half page"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = lines\n"
+	"#   2 = score\n"
+	"#   3 = lines & score\n"
+msgstr	"# Welche weiteren Informationen sollen in der Artikel/Thread Übersicht\n"
+	"# angezeigt werden.\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"#   0 = keine\n"
+	"#   1 = Zeilenzahl\n"
+	"#   2 = Bewertung\n"
+	"#   3 = Zeilenzahl & Bewertung\n"
+
+#: src/lang.c:1612
+msgid	"0 = full page scrolling, -1 = show previous last line as first on next page, -"
+	"2 = half page"
 msgstr	"0 = seitenweise, -1 = zeige zusätzlich letzte Zeile der vorigen Seite, -2 = "
 	"halbe Seite"
 
-#: src/lang.c:1519
-msgid	"Number of lines to scroll in pager :"
-msgstr	"Blättere Artikel um ... Zeilen     :"
+#: src/lang.c:1613
+msgid	"Number of lines to scroll in pager"
+msgstr	"Blättere Artikel um ... Zeilen"
 
-#: src/lang.c:1520
+#: src/lang.c:1614
 msgid	"# Number of lines that cursor-up/down will scroll in article pager\n"
-	"# eg, 1+ = line-by-line, 0 = page-by-page (traditional behavior),\n"
-	"# -1 = the top/bottom line is carried over onto the next page,\n"
-	"# -2 = half-page scrolling\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#  -2 = half-page scrolling\n"
+	"#  -1 = the top/bottom line is carried over onto the next page\n"
+	"#   0 = page-by-page (traditional behavior)\n"
+	"# * 1 = line-by-line\n"
+	"#   2 or greater = scroll by 2 or more lines (only in the pager)\n"
 msgstr	"# Anzahl der Zeilen, die Cursor-Auf/Ab bei der Artikelanzeige\n"
-	"# weiterblättert. z.B.: 1+ = zeilenweise, 0 = seitenweise,\n"
-	"# -1 = seitenweise, zeigt zusätzlich letzte Zeile der vorigen Seite\n"
-	"# -2 = um eine halbe Seite\n"
+	"# weiterblättert.\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"#  -2 = um eine halbe Seite\n"
+	"#  -1 = seitenweise, zeigt zusätzlich letzte Zeile der vorigen Seite\n"
+	"#   0 = seitenweise\n"
+	"# * 1 = zeilenweise\n"
+	"#   2 oder mehr = um 2 oder mehr Zeilen\n"
 
-#: src/lang.c:1527
+#: src/lang.c:1624
 msgid	"Display signatures. <SPACE> toggles & <CR> sets."
 msgstr	"Zeige Signaturen an. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:1528
-msgid	"Display signatures                 :"
-msgstr	"Zeige Signaturen an                :"
+#: src/lang.c:1625
+msgid	"Display signatures"
+msgstr	"Zeige Signaturen an"
 
-#: src/lang.c:1529
+#: src/lang.c:1626
 msgid	"# If OFF don't show signatures when displaying articles\n"
 msgstr	"# Falls OFF zeige keine Signaturen an\n"
 
-#: src/lang.c:1533
+#: src/lang.c:1630
 msgid	"Display uuencoded data as tagged attachments. <SPACE> toggles & <CR> sets."
 msgstr	"Uu-kodierte Teile als Attachment anzeigen. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:1534
-msgid	"Display uue data as an attachment  :"
-msgstr	"Zeige uue-Teile als Attachment     :"
+#: src/lang.c:1631
+msgid	"Display uue data as an attachment"
+msgstr	"Zeige uue-Teile als Attachment"
 
-#: src/lang.c:1535
+#: src/lang.c:1632
 msgid	"# Handling of uuencoded data in the pager\n"
-	"# 0 = display raw uuencoded data\n"
-	"# 1 = uuencoded data will be condensed to a single tag line showing\n"
-	"#     size and filename, similar to how MIME attachments are displayed\n"
-	"# 2 = as for 1, but any line that looks like uuencoded data will be folded\n"
-	"#     into a tag line.\n"
-msgstr	"# Behandlung von uuencodeten Daten bei der Artikelanzeige:\n"
-	"# 0 = Anzeige der Rohdaten\n"
-	"# 1 = Einzeilige Zusammenfassung für vollständige Daten,\n"
-	"#     ähnlich der von MIME Anhängen\n"
-	"# 2 = Einzeilige Zusammenfassung auch für unvollständige Daten\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no, display raw uuencoded data\n"
+	"#   1 = yes, uuencoded data will be condensed to a single tag line showing\n"
+	"#       size and filename, similar to how MIME attachments are displayed\n"
+	"#   2 = hide all, as for 1, but any line that looks like uuencoded data will\n"
+	"#       be folded into a tag line.\n"
+msgstr	"# Behandlung von uuencodeten Daten bei der Artikelanzeige.\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"# * 0 = Anzeige der Rohdaten\n"
+	"#   1 = Einzeilige Zusammenfassung für vollständige Daten\n"
+	"#       ähnlich der von MIME Anhängen\n"
+	"#   2 = Einzeilige Zusammenfassung auch für unvollständige Daten\n"
 
-#: src/lang.c:1544
+#: src/lang.c:1642
 msgid	"Decode German style TeX umlaut codes to ISO. <SPACE> toggles & <CR> sets."
 msgstr	"TeX german.sty Umlautkodierung auswerten. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:1545
-msgid	"Display \"a as Umlaut-a             :"
-msgstr	"Wandle TeX-Umlaute automatisch um  :"
+#: src/lang.c:1643
+msgid	"Display \"a as Umlaut-a"
+msgstr	"Wandle TeX-Umlaute automatisch um"
 
-#: src/lang.c:1546
+#: src/lang.c:1644
 msgid	"# If ON decode German style TeX umlaut codes to ISO and\n"
 	"# show \"a as Umlaut-a, etc.\n"
 msgstr	"# Wenn ON dekodiere laut german.sty (TeX) kodierte Umlaute und stelle\n"
 	"# \"a als ä, usw. dar\n"
 
-#: src/lang.c:1551 src/lang.c:1561
+#: src/lang.c:1649 src/lang.c:1659
 msgid	"Space separated list of header fields"
 msgstr	"Durch Leerzeichen getrennte Liste der Header-Felder"
 
-#: src/lang.c:1552
-msgid	"Display these header fields (or *) :"
-msgstr	"Zeige diese Header-Felder (oder *) :"
+#: src/lang.c:1650
+msgid	"Display these header fields (or *)"
+msgstr	"Zeige diese Header-Felder (oder *)"
 
-#: src/lang.c:1553
+#: src/lang.c:1651
 msgid	"# Which news headers you wish to see. If you want to see _all_ the headers,\n"
 	"# place an '*' as this value. This is the only way a wildcard can be used.\n"
 	"# If you enter 'X-' as the value, you will see all headers beginning with\n"
@@ -4729,11 +5005,11 @@ msgstr	"# Welche Header wollen Sie sehen
 	"# Leerzeichen getrennte Werte angeben. Wenn Sie hier nichts definieren\n"
 	"# wird diese Option deaktiviert.\n"
 
-#: src/lang.c:1562
-msgid	"Do not display these header fields :"
-msgstr	"Zeige folgende Header nicht an     :"
+#: src/lang.c:1660
+msgid	"Do not display these header fields"
+msgstr	"Zeige folgende Header nicht an"
 
-#: src/lang.c:1563
+#: src/lang.c:1661
 msgid	"# Same as 'news_headers_to_display' except it denotes the opposite.\n"
 	"# An example of using both options might be if you thought X- headers were\n"
 	"# A Good Thing(tm), but thought Alan and Pape were miscreants...well then "
@@ -4744,33 +5020,33 @@ msgid	"# Same as 'news_headers_to_displa
 	"# Not defining anything turns off this option.\n"
 msgstr	"# Genau das gleiche wie 'news_headers_to_display', mit der Ausnahme,\n"
 	"# das es das Gegenteil bewirkt. Wenn Sie dachten, das die X- Header eine\n"
-	"# tolle Sachen waren, nun aber festgestellt haben, das dort einiges über-\n"
-	"# flüssiges steht, dann könnten Sie wie folgt vorgehen:\n"
+	"# tolle Sachen waren, nun aber festgestellt haben, das dort einiges\n"
+	"# überflüssiges steht, dann könnten Sie wie folgt vorgehen:\n"
 	"# news_headers_to_display=X-\n"
 	"# news_headers_to_not_display=X-Alan X-Pape\n"
 	"# Wenn Sie hier nichts angeben, wird diese Option deaktiviert.\n"
 
-#: src/lang.c:1573
+#: src/lang.c:1671
 msgid	"Do you want to enable automatic handling of multipart/alternative articles?"
 msgstr	"Automatische Bearbeitung von Art. mit multipart/alternative-Teilen aktivieren?"
 
-#: src/lang.c:1574
-msgid	"Skip multipart/alternative parts   :"
-msgstr	"Übersp. multipart/alternative-Teile:"
+#: src/lang.c:1672
+msgid	"Skip multipart/alternative parts"
+msgstr	"Übersp. multipart/alternative-Teile"
 
-#: src/lang.c:1575
+#: src/lang.c:1673
 msgid	"# If ON strip multipart/alternative messages automatically\n"
 msgstr	"# Falls ON entsorge multipart/alternative Teile des Artikels automatisch\n"
 
-#: src/lang.c:1580
+#: src/lang.c:1678
 msgid	"A regex used to decide which lines to show in col_quote."
 msgstr	"Regulärer Ausdruck für Zeilen, die mit col_quote dargestellt werden."
 
-#: src/lang.c:1581
-msgid	"Regex used to show quoted lines    :"
-msgstr	"Regulärer Ausd. für zit. Zeilen    :"
+#: src/lang.c:1679
+msgid	"Regex used to show quoted lines"
+msgstr	"Regulärer Ausd. für zit. Zeilen"
 
-#: src/lang.c:1582
+#: src/lang.c:1680
 msgid	"# A regular expression that tin will use to decide which lines are\n"
 	"# quoted when viewing articles. Quoted lines are shown in col_quote.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4779,15 +5055,15 @@ msgstr	"# Ein regulärer Ausdruck, den ti
 	"# Farbe angezeigt, die in col_quote definiert sind.\n"
 	"# Wenn Sie hier nichts angeben, werden die Voreinstellungen benutzt.\n"
 
-#: src/lang.c:1588
+#: src/lang.c:1686
 msgid	"A regex used to decide which lines to show in col_quote2."
-msgstr	"Regulärer Ausdruck für Zeilen, die mit col_quote2 dargestellt werden"
+msgstr	"Regulärer Ausdruck für Zeilen, die mit col_quote2 dargestellt werden."
 
-#: src/lang.c:1589
-msgid	"Regex used to show twice quoted l. :"
-msgstr	"Reg. Ausd. für zweifach zitierte Z.:"
+#: src/lang.c:1687
+msgid	"Regex used to show twice quoted l."
+msgstr	"Reg. Ausd. für zweifach zitierte Z."
 
-#: src/lang.c:1590
+#: src/lang.c:1688
 msgid	"# A regular expression that tin will use to decide which lines are\n"
 	"# quoted twice. Twice quoted lines are shown in col_quote2.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4796,15 +5072,15 @@ msgstr	"# Ein regulärer Ausdruck, den ti
 	"# Farbe dargestellt, die in col_quote2 definiert ist.\n"
 	"# Wenn Sie hier nichts eingeben, werden die Voreinstellungen benutzt.\n"
 
-#: src/lang.c:1596
+#: src/lang.c:1694
 msgid	"A regex used to decide which lines to show in col_quote3."
 msgstr	"Regulärer Ausdruck für Zeilen, die mit col_quote3 dargestellt werden."
 
-#: src/lang.c:1597
-msgid	"Regex used to show >= 3 times q.l. :"
-msgstr	"Reg. Ausd. für >=3-fach zitierte Z.:"
+#: src/lang.c:1695
+msgid	"Regex used to show >= 3 times q.l."
+msgstr	"Reg. Ausd. für >=3-fach zitierte Z."
 
-#: src/lang.c:1598
+#: src/lang.c:1696
 msgid	"# A regular expression that tin will use to decide which lines are\n"
 	"# quoted >=3 times. >=3 times quoted lines are shown in col_quote3.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4813,15 +5089,15 @@ msgstr	"# Ein regulärer Ausdruck, der en
 	"# dargestellt, die in col_quote3 definiert sind.\n"
 	"# Wenn Sie hier nichts eingeben, werden die Voreinstellungen benutzt.\n"
 
-#: src/lang.c:1605
+#: src/lang.c:1703
 msgid	"A regex used to decide which words to show in col_markslashes."
 msgstr	"Regulärer Ausdruck für Zeilen, die mit col_markslashes dargestellt werden."
 
-#: src/lang.c:1606
-msgid	"Regex used to highlight /slashes/  :"
-msgstr	"Reg. für /Schrägst./ Hervorhebungen:"
+#: src/lang.c:1704
+msgid	"Regex used to highlight /slashes/"
+msgstr	"Reg. für /Schrägst./ Hervorhebungen"
 
-#: src/lang.c:1607
+#: src/lang.c:1705
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '/' are to be shown in col_markslashes.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4829,15 +5105,15 @@ msgstr	"# Ein regulärer Ausdruck, der en
 	"# zwischen '/' in col_markslashes angezeigt werden.\n"
 	"# Wenn Sie hier nichts eingeben, werden die Voreinstellungen benutzt.\n"
 
-#: src/lang.c:1613
+#: src/lang.c:1711
 msgid	"A regex used to decide which words to show in col_markstars."
 msgstr	"Regulärer Ausdruck für Zeilen, die mit col_markstars dargestellt werden."
 
-#: src/lang.c:1614
-msgid	"Regex used to highlight *stars*    :"
-msgstr	"Regu. A. für *Stern* Hervorhebungen:"
+#: src/lang.c:1712
+msgid	"Regex used to highlight *stars*"
+msgstr	"Regu. A. für *Stern* Hervorhebungen"
 
-#: src/lang.c:1615
+#: src/lang.c:1713
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '*' are to be shown in col_markstars.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4845,15 +5121,15 @@ msgstr	"# Ein regulärer Ausdruck, der en
 	"# zwischen '*' in col_markstars angezeigt werden.\n"
 	"# Wenn Sie hier nichts eingeben, werden die Voreinstellungen benutzt.\n"
 
-#: src/lang.c:1621
+#: src/lang.c:1719
 msgid	"A regex used to decide which words to show in col_markstroke."
 msgstr	"Regulärer Ausdruck für Zeilen, die mit col_markstroke dargestellt werden."
 
-#: src/lang.c:1622
-msgid	"Regex used to highlight -strokes-  :"
-msgstr	"Reg. für -Durchstr.- Hervorhebungen:"
+#: src/lang.c:1720
+msgid	"Regex used to highlight -strokes-"
+msgstr	"Reg. für -Durchstr.- Hervorhebungen"
 
-#: src/lang.c:1623
+#: src/lang.c:1721
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '-' are to be shown in col_markstroke.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4861,15 +5137,15 @@ msgstr	"# Ein regulärer Ausdruck, der en
 	"# zwischen '-' in col_markstroke angezeigt werden.\n"
 	"# Wenn Sie hier nichts eingeben, werden die Voreinstellungen benutzt.\n"
 
-#: src/lang.c:1629
+#: src/lang.c:1727
 msgid	"A regex used to decide which words to show in col_markdash."
 msgstr	"Regulärer Ausdruck für Zeilen, die mit col_markdash dargestellt werden."
 
-#: src/lang.c:1630
-msgid	"Regex used to highlight _underline_:"
-msgstr	"Reg. für _Unterstr._ Hervorhebungen:"
+#: src/lang.c:1728
+msgid	"Regex used to highlight _underline_"
+msgstr	"Reg. für _Unterstr._ Hervorhebungen"
 
-#: src/lang.c:1631
+#: src/lang.c:1729
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '_' are to be shown in col_markdash.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4877,44 +5153,44 @@ msgstr	"# Ein regulärer Ausdruck, der en
 	"# zwischen '_' in col_markdash angezeigt werden.\n"
 	"# Wenn Sie hier nichts eingeben, werden die Voreinstellungen benutzt.\n"
 
-#: src/lang.c:1637
+#: src/lang.c:1735
 msgid	"A regex used to find Subject prefixes to remove.  Use '|' as separator."
 msgstr	"Reg. Ausd., um Teile im Subjectanfang zu entfernen. '|' trennt die Ausd.."
 
-#: src/lang.c:1638
-msgid	"Regex with Subject prefixes        :"
-msgstr	"Reg. Ausd. für den Subjectanfang   :"
+#: src/lang.c:1736
+msgid	"Regex with Subject prefixes"
+msgstr	"Reg. Ausd. für den Subjectanfang"
 
-#: src/lang.c:1639
+#: src/lang.c:1737
 msgid	"# A regular expression that tin will use to find Subject prefixes\n"
 	"# which will be removed before showing the header.\n"
 msgstr	"# Ein regulärer Ausdruck, mit dem tin Worte im Anfang des Subjects findet,\n"
 	"# die dann entfernt werden.\n"
 
-#: src/lang.c:1644
+#: src/lang.c:1742
 msgid	"A regex used to find Subject suffixes to remove.  Use '|' as separator."
 msgstr	"Reg. Ausd., um Teile am Subjectanfang zu entfernen. '|' trennt die Ausd.."
 
-#: src/lang.c:1645
-msgid	"Regex with Subject suffixes        :"
-msgstr	"Reg. Ausd. für das Subjectende     :"
+#: src/lang.c:1743
+msgid	"Regex with Subject suffixes"
+msgstr	"Reg. Ausd. für das Subjectende"
 
-#: src/lang.c:1646
+#: src/lang.c:1744
 msgid	"# A regular expression that tin will use to find Subject suffixes\n"
 	"# which will be removed when replying or posting followup.\n"
 msgstr	"# Ein regulärer Ausdruck, der beim Antworten zum Abschneiden von\n"
 	"# unerwünschten Teilen am Ende des Subjects verwendet wird.\n"
 
-#: src/lang.c:1651
+#: src/lang.c:1749
 msgid	"Enter name and options for external MIME viewer, --internal for built-in "
 	"viewer"
 msgstr	"Name und Optionen für ext. MIME-Viewer, --internal für eingebaute Version"
 
-#: src/lang.c:1652
-msgid	"MIME binary content viewer         :"
-msgstr	"MIME-Viewer                        :"
+#: src/lang.c:1750
+msgid	"MIME binary content viewer"
+msgstr	"MIME-Viewer"
 
-#: src/lang.c:1653
+#: src/lang.c:1751
 msgid	"# If --internal automatically use the built in MIME viewer for non-text\n"
 	"# parts of articles.\n"
 	"# Otherwise specify an external viewer program (eg, metamail) or leave blank\n"
@@ -4923,471 +5199,586 @@ msgstr	"# Falls --internal wird der eing
 	"# nicht Text teilen benutzt. Andernfalls das angegebene Programm\n"
 	"# (z.B. metamail). Keine Angabe schaltet die automatische Anzeige aus.\n"
 
-#: src/lang.c:1660
+#: src/lang.c:1758
 msgid	"Confirm before starting non-text viewing program"
 msgstr	"Start des MIME-Viewers bestätigen"
 
-#: src/lang.c:1661
-msgid	"Ask before using MIME viewer       :"
-msgstr	"Start des MIME-Viewers bestätigen  :"
+#: src/lang.c:1759
+msgid	"Ask before using MIME viewer"
+msgstr	"Start des MIME-Viewers bestätigen"
 
-#: src/lang.c:1662
+#: src/lang.c:1760
 msgid	"# If ON tin will ask before using metamail to display MIME messages\n"
 	"# this only happens if metamail_prog is set to something\n"
 msgstr	"# Falls ON fragt tin nach, bevor metamail zum Anzeigen von MIME Artikeln\n"
 	"# benutzt wird. Das passiert nur, wenn auch metamail_prog gesetzt ist.\n"
 
-#: src/lang.c:1667
+#: src/lang.c:1765
 msgid	"Ask to mark groups read when quitting. <SPACE> toggles & <CR> sets."
 msgstr	"Beim Beenden anbieten, alle betretenen Gruppen als gelesen zu markieren?"
 
-#: src/lang.c:1668
-msgid	"Catchup read groups when quitting  :"
-msgstr	"Aufholen der Gruppen beim Beenden  :"
+#: src/lang.c:1766
+msgid	"Catchup read groups when quitting"
+msgstr	"Aufholen der Gruppen beim Beenden"
 
-#: src/lang.c:1669
+#: src/lang.c:1767
 msgid	"# If ON ask user if read groups should all be marked read\n"
 msgstr	"# Falls ON: Beim Beenden von tin anbieten, alle betretenen Gruppen\n"
 	"#           als gelesen zu markieren\n"
 
-#: src/lang.c:1674
-msgid	"Catchup group using left key       :"
-msgstr	"Catchup der Gruppe mit l. Cursor   :"
+#: src/lang.c:1772
+msgid	"Catchup group using left key"
+msgstr	"Catchup der Gruppe mit l. Cursor"
 
-#: src/lang.c:1675
+#: src/lang.c:1773
 msgid	"# If ON catchup group/thread when leaving with the left arrow key.\n"
 msgstr	"# Falls ON: Aufholen (als gelesen markieren) der Gruppe/des Threads\n"
 	"#           beim Verlassen mit der linken Cursortaste\n"
 
-#: src/lang.c:1680
-msgid	"Catchup thread by using left key   :"
-msgstr	"Catchup mit der linken Cursort.    :"
+#: src/lang.c:1778
+msgid	"Catchup thread by using left key"
+msgstr	"Catchup mit der linken Cursort."
 
-#: src/lang.c:1686
-msgid	"Which actions require confirmation :"
-msgstr	"Bestätigung erforderlich für       :"
+#: src/lang.c:1784
+msgid	"Which actions require confirmation"
+msgstr	"Bestätigung erforderlich für"
 
-#: src/lang.c:1687
+#: src/lang.c:1785
 msgid	"# What should we ask confirmation for.\n"
 msgstr	"# Welche Operationen müssen explizit bestätigt werden.\n"
 	"# Kommandos, die im Manual mit [after confirmation] markiert sind,\n"
 	"# Beenden von tin, markieren aller nicht hochgescorter Artikel als\n"
 	"# gelesen (siehe 'X' Befehl im Manual).\n"
 
-# TRANSLATION MISSING
-#: src/lang.c:1692
-msgid	"'Mark article read' ignores tags   :"
-msgstr	""
+# TRANSLATION TOO LONG
+#: src/lang.c:1790
+msgid	"'Mark article read' ignores tags"
+msgstr	"'Art. gelesen markieren' ignoriert Markierte"
 
-#: src/lang.c:1693
+#: src/lang.c:1791
 msgid	"# If ON the 'Mark article read' function marks only the current article.\n"
-msgstr	""
+msgstr	"# Falls ON wird mit der Funktion 'Artikel als gelesen markieren' nur\n"
+	"# der jeweilige Artikel markiert.\n"
 
-#: src/lang.c:1697
+#: src/lang.c:1795
 msgid	"Program to run to open URL's, <CR> sets, <ESC> cancels."
 msgstr	"Öffne URLs mit ... <CR> setzt, <ESC> bricht ab."
 
-#: src/lang.c:1698
-msgid	"Program that opens URL's           :"
-msgstr	"Öffne URLs mit ...                 :"
+#: src/lang.c:1796
+msgid	"Program that opens URL's"
+msgstr	"Öffne URLs mit ..."
 
-#: src/lang.c:1699
+#: src/lang.c:1797
 msgid	"# The program used to open URL's. The actual URL will be appended\n"
 msgstr	"# Programm zum Öffnen von URLs, die jeweilige URL wird hinten angehängt.\n"
 
-#: src/lang.c:1704
-msgid	"Use mouse in xterm                 :"
-msgstr	"Maus in xterm nutzen               :"
+#: src/lang.c:1802
+msgid	"Use mouse in xterm"
+msgstr	"Maus in xterm nutzen"
 
-#: src/lang.c:1705
+#: src/lang.c:1803
 msgid	"# If ON enable mouse key support on xterm terminals\n"
 msgstr	"# Falls ON wird die Maustastenunterstützung für xterm aktiviert\n"
 
-#: src/lang.c:1711
-msgid	"Use scroll keys on keypad          :"
-msgstr	"Scrollt. vom Nummernblock nutzen   :"
+#: src/lang.c:1809
+msgid	"Use scroll keys on keypad"
+msgstr	"Scrollt. vom Nummernblock nutzen"
 
-#: src/lang.c:1712
+#: src/lang.c:1810
 msgid	"# If ON enable scroll keys on terminals that support it\n"
 msgstr	"# Falls ON werden die Scrolltasten genutzt (Terminalabhängig)\n"
 
-#: src/lang.c:1717
+#: src/lang.c:1815
 msgid	"Enter maximum number of article to get. <CR> sets."
 msgstr	"Maximale Anzahl der zu holenden Artikel eingeben. <CR> setzt."
 
-#: src/lang.c:1718
-msgid	"Number of articles to get          :"
-msgstr	"Anzahl der zu holenden Artikel     :"
+#: src/lang.c:1816
+msgid	"Number of articles to get"
+msgstr	"Anzahl der zu holenden Artikel"
 
-#: src/lang.c:1719
+#: src/lang.c:1817
 msgid	"# Number of articles to get (0=no limit), if negative sets maximum number\n"
 	"# of already read articles to be read before first unread one\n"
 msgstr	"# Anzahl der zu holenden Artikel (0=unbegrenzt), falls ein negativer Wert\n"
 	"# angegeben wird, holt tin alle ungelesenen plus die letzten n gelesenen\n"
 	"# Artikel\n"
 
-#: src/lang.c:1724
+#: src/lang.c:1822
 msgid	"Enter number of days article is considered recent. <CR> sets."
 msgstr	"Anzahl der Tage, die ein Artikel als neu eingestuft wird. <CR> setzt."
 
-#: src/lang.c:1725
-msgid	"Article recentness time limit      :"
-msgstr	"Artikel Neuheitszeit-Limit         :"
+#: src/lang.c:1823
+msgid	"Article recentness time limit"
+msgstr	"Artikel Neuheitszeit-Limit"
 
-#: src/lang.c:1726
+#: src/lang.c:1824
 msgid	"# Number of days in which article is considered recent, (0=OFF)\n"
 msgstr	"# Anzahl der Tage, die ein Artikel als neu eingestuft wird, (0=Aus)\n"
 
-#: src/lang.c:1730
+#: src/lang.c:1828
 msgid	"WILDMAT for normal wildcards, REGEX for full regular expression matching."
 msgstr	"WILDMAT für normale Wildcards, REGEX für die Nutzung von regulären Ausdrücken."
 
-#: src/lang.c:1731
-msgid	"Wildcard matching                  :"
-msgstr	"Wildcardprüfung                    :"
-
-#: src/lang.c:1732
-msgid	"# Wildcard matching 0=(wildmat) 1=(regex)\n"
-msgstr	"# Wildcardprüfung 0=(wildmat) 1=(Regulärer Ausdruck)\n"
+#: src/lang.c:1829
+msgid	"Wildcard matching"
+msgstr	"Wildcardprüfung"
+
+#: src/lang.c:1830
+msgid	"# Wildcard matching\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = wildmat\n"
+	"#   1 = regex\n"
+msgstr	"# Wildcardprüfung\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"# * 0 = wildmat\n"
+	"#   1 = Regulärer Ausdruck\n"
 
-#: src/lang.c:1736
+#: src/lang.c:1837
 msgid	"Enter minimal score before an article is marked killed. <CR> sets."
 msgstr	"Artikel mit weniger Bewertung (Score) werden als `gekillt' markiert. <CR> "
 	"setzt."
 
-#: src/lang.c:1737
-msgid	"Score limit (kill)                 :"
-msgstr	"Bewertungsgrenze (kill)            :"
+#: src/lang.c:1838
+msgid	"Score limit (kill)"
+msgstr	"Bewertungsgrenze (kill)"
 
-#: src/lang.c:1738
+#: src/lang.c:1839
 msgid	"# Score limit before an article is marked killed\n"
 msgstr	"# Jeder Artikel mit einer niedrigeren Bewertung (Score) wird als\n"
 	"# gekillt markiert\n"
 
-#: src/lang.c:1742
+#: src/lang.c:1843
 msgid	"Enter default score to kill articles. <CR> sets."
 msgstr	"Bewertung für gekillte Artikel. <CR> setzt."
 
-#: src/lang.c:1743
-msgid	"Default score to kill articles     :"
-msgstr	"Bewertung für gekillte Artikel     :"
+#: src/lang.c:1844
+msgid	"Default score to kill articles"
+msgstr	"Bewertung für gekillte Artikel"
 
-#: src/lang.c:1744
+#: src/lang.c:1845
 msgid	"# Default score to kill articles\n"
 msgstr	"# Bewertung für gekillte Artikel\n"
 
-#: src/lang.c:1748
+#: src/lang.c:1849
 msgid	"Enter minimal score before an article is marked hot. <CR> sets."
 msgstr	"Artikel mit einer höheren Bewertung (Score) werd. als wichtig/hot markiert."
 
-#: src/lang.c:1749
-msgid	"Score limit (select)               :"
-msgstr	"Bewertungsgrenze (select)          :"
+#: src/lang.c:1850
+msgid	"Score limit (select)"
+msgstr	"Bewertungsgrenze (select)"
 
-#: src/lang.c:1750
+#: src/lang.c:1851
 msgid	"# Score limit before an article is marked hot\n"
 msgstr	"# Artikel mit einer höheren Bewertung (Score) werden als\n"
 	"# wichtig (hot) markiert\n"
 
-#: src/lang.c:1754
+#: src/lang.c:1855
 msgid	"Enter default score to select articles. <CR> sets."
 msgstr	"Bewertung für wichtige Artikel (hot). <CR> setzt."
 
-#: src/lang.c:1755
-msgid	"Default score to select articles   :"
-msgstr	"Bewertung für wichtige Artikel     :"
+#: src/lang.c:1856
+msgid	"Default score to select articles"
+msgstr	"Bewertung für wichtige Artikel"
 
-#: src/lang.c:1756
+#: src/lang.c:1857
 msgid	"# Default score to select articles\n"
 msgstr	"# Bewertung für wichtige Artikel (hot)\n"
 
-#: src/lang.c:1762
-msgid	"Use slrnface to show ''X-Face:''s  :"
-msgstr	"''X-Face:''s mit slrnface Anzeigen :"
+#: src/lang.c:1863
+msgid	"Use slrnface to show ''X-Face:''s"
+msgstr	"''X-Face:''s mit slrnface Anzeigen"
 
-#: src/lang.c:1763
+#: src/lang.c:1864
 msgid	"# If ON using slrnface(1) to interpret the ''X-Face:'' header.\n"
 	"# Only useful when running in an xterm.\n"
 msgstr	"# Falls ON benutze slrnface(1) um ''X-Face:'' anzuzeigen.\n"
 	"# Funktioniert nur wenn tin in einem xterm läuft.\n"
 
-#: src/lang.c:1771
-msgid	"Use ANSI color                     :"
-msgstr	"Benutze ANSI-Farben                :"
+#: src/lang.c:1872
+msgid	"Use ANSI color"
+msgstr	"Benutze ANSI-Farben"
 
-#: src/lang.c:1772
+#: src/lang.c:1873
 msgid	"# If ON using ANSI-color\n"
 msgstr	"# Falls ON benutze ANSI-Farben\n"
 
-#: src/lang.c:1777
-msgid	"Standard foreground color          :"
-msgstr	"Standard Vordergrundfarbe          :"
+#: src/lang.c:1878
+msgid	"Standard foreground color"
+msgstr	"Standard Vordergrundfarbe"
 
-#: src/lang.c:1778
+#: src/lang.c:1879
 msgid	"# Standard foreground color\n"
+	"# Default: -1 (default color)\n"
 msgstr	"# Standard Vordergrundfarbe\n"
+	"# Voreinstellung: -1 (Standard Farbe)\n"
 
-#: src/lang.c:1783
-msgid	"Standard background color          :"
-msgstr	"Standard Hintergrundfarbe          :"
+#: src/lang.c:1885
+msgid	"Standard background color"
+msgstr	"Standard Hintergrundfarbe"
 
-#: src/lang.c:1784
-msgid	"# Standard-Background-Color\n"
+#: src/lang.c:1886
+msgid	"# Standard background color\n"
+	"# Default: -1 (default color)\n"
 msgstr	"# Standard Hintergrundfarbe\n"
+	"# Voreinstellung: -1 (Standard Farbe)\n"
 
-#: src/lang.c:1789
-msgid	"Color for inverse text (background):"
-msgstr	"Farbe des inversen Text (Hinterg.) :"
+#: src/lang.c:1892
+msgid	"Color for inverse text (background)"
+msgstr	"Farbe des inversen Text (Hinterg.)"
 
-#: src/lang.c:1790
+#: src/lang.c:1893
 msgid	"# Color of background for inverse text\n"
+	"# Default: 4 (blue)\n"
 msgstr	"# Farbe des Hintergrunds für inversen Text\n"
+	"# Voreinstellung: 4 (blau)\n"
 
-#: src/lang.c:1795
-msgid	"Color for inverse text (foreground):"
-msgstr	"Farbe des inversen Text (Vordergr.):"
+#: src/lang.c:1899
+msgid	"Color for inverse text (foreground)"
+msgstr	"Farbe des inversen Text (Vordergr.)"
 
-#: src/lang.c:1796
+#: src/lang.c:1900
 msgid	"# Color of foreground for inverse text\n"
+	"# Default: 7 (white)\n"
 msgstr	"# Farbe des Vordergrunds für inversen Text\n"
+	"# Voreinstellung: 7 (weiß)\n"
 
-#: src/lang.c:1801
-msgid	"Color of text lines                :"
-msgstr	"Farbe der Textzeilen               :"
-
-#: src/lang.c:1802
-msgid	"# Color of text-lines\n"
+#: src/lang.c:1906
+msgid	"Color of text lines"
+msgstr	"Farbe der Textzeilen"
+
+#: src/lang.c:1907
+msgid	"# Color of text lines\n"
+	"# Default: -1 (default color)\n"
 msgstr	"# Farbe der Textzeilen\n"
+	"# Voreinstellung: -1 (Standard Farbe)\n"
 
-#: src/lang.c:1807
-msgid	"Color of mini help menu            :"
-msgstr	"Farbe des Minihilfemenü            :"
+#: src/lang.c:1913
+msgid	"Color of mini help menu"
+msgstr	"Farbe des Minihilfemenü"
 
-#: src/lang.c:1808
+#: src/lang.c:1914
 msgid	"# Color of mini help menu\n"
+	"# Default: 3 (brown)\n"
 msgstr	"# Farbe des Minihilfemenü\n"
+	"# Voreinstellung: 3 (braun)\n"
 
-#: src/lang.c:1813
-msgid	"Color of help text                 :"
-msgstr	"Farbe des Hilfstext                :"
+#: src/lang.c:1920
+msgid	"Color of help text"
+msgstr	"Farbe des Hilfstext"
 
-#: src/lang.c:1814
+#: src/lang.c:1921
 msgid	"# Color of help pages\n"
+	"# Default: -1 (default color)\n"
 msgstr	"# Farbe der Hilfsseiten\n"
+	"# Voreinstellung: -1 (Standard Farbe)\n"
 
-#: src/lang.c:1819
-msgid	"Color of status messages           :"
-msgstr	"Farbe der Statusmeldungen          :"
+#: src/lang.c:1927
+msgid	"Color of status messages"
+msgstr	"Farbe der Statusmeldungen"
 
-#: src/lang.c:1820
+#: src/lang.c:1928
 msgid	"# Color of messages in last line\n"
+	"# Default: 6 (cyan)\n"
 msgstr	"# Farbe der letzten Zeile im Artikel\n"
+	"# Voreinstellung: 6 (cyan)\n"
 
-#: src/lang.c:1825
-msgid	"Color of quoted lines              :"
-msgstr	"Farbe der zitierten Zeilen         :"
+#: src/lang.c:1934
+msgid	"Color of quoted lines"
+msgstr	"Farbe der zitierten Zeilen"
 
-#: src/lang.c:1826
+#: src/lang.c:1935
 msgid	"# Color of quote-lines\n"
+	"# Default: 2 (green)\n"
 msgstr	"# Farbe der zitierten Zeilen\n"
+	"# Voreinstellung: 2 (grün)\n"
 
-#: src/lang.c:1831
-msgid	"Color of twice quoted line         :"
-msgstr	"Farbe von zweifach zitierten Zeilen:"
+#: src/lang.c:1941
+msgid	"Color of twice quoted line"
+msgstr	"Farbe von zweifach zitierten Zeilen"
 
-#: src/lang.c:1832
+#: src/lang.c:1942
 msgid	"# Color of twice quoted lines\n"
+	"# Default: 3 (brown)\n"
 msgstr	"# Farbe von zweifach zitierten Zeilen\n"
+	"# Voreinstellung: 3 (braun)\n"
 
-#: src/lang.c:1837
-msgid	"Color of =>3 times quoted line     :"
-msgstr	"Farbe von =>3-fach zitierten Zeilen:"
+#: src/lang.c:1948
+msgid	"Color of =>3 times quoted line"
+msgstr	"Farbe von =>3-fach zitierten Zeilen"
 
-#: src/lang.c:1838
+#: src/lang.c:1949
 msgid	"# Color of >=3 times quoted lines\n"
+	"# Default: 4 (blue)\n"
 msgstr	"# Farbe von =>3-fach zitierten Zeilen\n"
+	"# Voreinstellung: 4 (blau)\n"
 
-#: src/lang.c:1843
-msgid	"Color of article header lines      :"
-msgstr	"Farbe der Artikelheaderzeilen      :"
+#: src/lang.c:1955
+msgid	"Color of article header lines"
+msgstr	"Farbe der Artikelheaderzeilen"
 
-#: src/lang.c:1844
+#: src/lang.c:1956
 msgid	"# Color of header-lines\n"
+	"# Default: 2 (green)\n"
 msgstr	"# Farbe der Artikelheaderzeilen\n"
+	"# Voreinstellung: 2 (grün)\n"
 
-#: src/lang.c:1849
-msgid	"Color of actual news header fields :"
-msgstr	"Farbe des angezeigten Headers      :"
+#: src/lang.c:1962
+msgid	"Color of actual news header fields"
+msgstr	"Farbe des angezeigten Headers"
 
-#: src/lang.c:1850
+#: src/lang.c:1963
 msgid	"# Color of actual news header fields\n"
+	"# Default: 9 (light red)\n"
 msgstr	"# Farbe des angezeigten Headers\n"
+	"# Voreinstellung: 9 (hellrot)\n"
 
-#: src/lang.c:1855
-msgid	"Color of article subject lines     :"
-msgstr	"Farbe der Subjectzeile             :"
+#: src/lang.c:1969
+msgid	"Color of article subject lines"
+msgstr	"Farbe der Subjectzeile"
 
-#: src/lang.c:1856
+#: src/lang.c:1970
 msgid	"# Color of article subject\n"
+	"# Default: 6 (cyan)\n"
 msgstr	"# Farbe der Subjectzeile\n"
+	"# Voreinstellung: 6 (cyan)\n"
 
-#: src/lang.c:1861
-msgid	"Color of response counter          :"
-msgstr	"Farbe des Antwortzählers           :"
+#: src/lang.c:1976
+msgid	"Color of response counter"
+msgstr	"Farbe des Antwortzählers"
 
-#: src/lang.c:1862
+#: src/lang.c:1977
 msgid	"# Color of response counter\n"
+	"# Default: 2 (green)\n"
 msgstr	"# Farbe des Antwortzählers\n"
+	"# Voreinstellung: 2 (grün)\n"
 
-#: src/lang.c:1867
-msgid	"Color of sender (From:)            :"
-msgstr	"Farbe des Autors (From:)           :"
+#: src/lang.c:1983
+msgid	"Color of sender (From:)"
+msgstr	"Farbe des Autors (From:)"
 
-#: src/lang.c:1868
+#: src/lang.c:1984
 msgid	"# Color of sender (From:)\n"
+	"# Default: 2 (green)\n"
 msgstr	"# Farbe des Autors (From:)\n"
+	"# Voreinstellung: 2 (grün)\n"
 
-#: src/lang.c:1873
-msgid	"Color of help/mail sign            :"
-msgstr	"Farbe des Hilfe/Mail-Zeichen       :"
+#: src/lang.c:1990
+msgid	"Color of help/mail sign"
+msgstr	"Farbe des Hilfe/Mail-Zeichen"
 
-#: src/lang.c:1874
+#: src/lang.c:1991
 msgid	"# Color of Help/Mail-Sign\n"
+	"# Default: 4 (blue)\n"
 msgstr	"# Farbe des Hilfe/Mail-Zeichen\n"
+	"# Voreinstellung: 4 (blau)\n"
 
-#: src/lang.c:1879
-msgid	"Color of signatures                :"
-msgstr	"Farbe von Signaturen               :"
+#: src/lang.c:1997
+msgid	"Color of signatures"
+msgstr	"Farbe von Signaturen"
 
-#: src/lang.c:1880
+#: src/lang.c:1998
 msgid	"# Color of signature\n"
+	"# Default: 4 (blue)\n"
 msgstr	"# Farbe von Signaturen\n"
+	"# Voreinstellung: 4 (blau)\n"
 
-#: src/lang.c:1885
-msgid	"Color of highlighting with *stars* :"
-msgstr	"Farbe der Hervorhebung *Sterne*    :"
-
-#: src/lang.c:1886
-msgid	"# Color of word highlighting. There are four possibilities\n"
-	"# in articles: *stars*, /slashes/, _underdashes_ and -strokes-.\n"
-msgstr	"# Farbe der Hervorhebungen. Es gibt vier Möglichkeiten in Artikeln:\n"
-	"# *Sterne*, _Unterstriche_, /Schrägstriche/ und -Durchstreichen-.\n"
+#: src/lang.c:2004
+msgid	"Color of highlighted URLs"
+msgstr	"Farbe der hervorgehobenen URLs"
+
+#: src/lang.c:2005
+msgid	"# Color of highlighted URLs\n"
+	"# Default: -1 (default color)\n"
+msgstr	"# Farbe der hervorgehobenen URLs\n"
+	"# Voreinstellung: -1 (Standard Farbe)\n"
+
+#: src/lang.c:2011
+msgid	"Color of highlighting with *stars*"
+msgstr	"Farbe der Hervorhebung *Sterne*"
+
+#: src/lang.c:2012
+msgid	"# Color of word highlighting with *stars*\n"
+	"# Default: 11 (yellow)\n"
+msgstr	"# Farbe der Hervorhebung durch *Sterne*\n"
+	"# Voreinstellung: 11 (gelb)\n"
+
+#: src/lang.c:2018
+msgid	"Color of highlighting with _dash_"
+msgstr	"Farbe der Hervorhebung _Striche_"
+
+#: src/lang.c:2019
+msgid	"# Color of word highlighting with _dash_\n"
+	"# Default: 13 (light pink)\n"
+msgstr	"# Farbe der Hervorhebung durch _Striche_\n"
+	"# Voreinstellung: 13 (hellrosa)\n"
+
+#: src/lang.c:2025
+msgid	"Color of highlighting with /slash/"
+msgstr	"Farbe der Hervorhebung /Schrägstr./"
+
+#: src/lang.c:2026
+msgid	"# Color of word highlighting with /slash/\n"
+	"# Default: 14 (light cyan)\n"
+msgstr	"# Farbe der Hervorhebung durch /Schrägstriche/\n"
+	"# Voreinstellung: 11 (hellcyan)\n"
+
+#: src/lang.c:2032
+msgid	"Color of highlighting with -stroke-"
+msgstr	"Farbe der Hervorhebung -Durchstr.-"
+
+#: src/lang.c:2033
+msgid	"# Color of word highlighting with -stroke-\n"
+	"# Default: 12 (light blue)\n"
+msgstr	"# Farbe der Hervorhebung durch -Durchstreichen-\n"
+	"# Voreinstellung: 12 (hellblau)\n"
 
-#: src/lang.c:1892
-msgid	"Color of highlighting with _dash_  :"
-msgstr	"Farbe der Hervorhebung _Striche_   :"
+#: src/lang.c:2040
+msgid	"Attr. of highlighting with *stars*"
+msgstr	"Hervorhebungsattribute *Sterne*"
 
-#: src/lang.c:1898
-msgid	"Color of highlighting with /slash/ :"
-msgstr	"Farbe der Hervorhebung /Schrägstr./:"
-
-#: src/lang.c:1904
-msgid	"Color of highlighting with -stroke-:"
-msgstr	"Farbe der Hervorhebung -Durchstr.- :"
-
-#: src/lang.c:1911
-msgid	"Attr. of highlighting with *stars* :"
-msgstr	"Hervorhebungsattribute *Sterne*    :"
-
-#: src/lang.c:1912
-msgid	"# Attribute of word highlighting on mono terminals.\n"
-	"# There are four possibilities in articles:\n"
-	"# *stars*, /slashes/, _underdashes_ and -strokes-.\n"
-	"# The possible values are:\n"
-	"# 0 - Normal, 1 - Underline, 2 - Best highlighting,\n"
-	"# 3 - Reverse video, 4 - Blinking, 5 - Half bright, 6 - Bold\n"
+#: src/lang.c:2041
+msgid	"# Attributes of word highlighting on mono terminals\n"
+	"# Possible values are:\n"
+	"#   0 = Normal\n"
+	"#   1 = Underline\n"
+	"#   2 = Best highlighting\n"
+	"#   3 = Reverse video\n"
+	"#   4 = Blinking\n"
+	"#   5 = Half bright\n"
+	"#   6 = Bold\n"
+	"\n"
+	"# Attribute of word highlighting with *stars*\n"
+	"# Default: 6 (bold)\n"
 msgstr	"# Attribute der Hervorhebung von Wörtern auf monochromen Terminals.\n"
-	"# Es gibt vier Möglichkeiten in Artikeln:\n"
-	"# *Sterne*, /Schrägstriche/, _Unterstriche_ und -Durchstreichungen-.\n"
-	"# Die möglichen Werte sind:\n"
-	"# 0 - normal, 1 - unterstrichen, 2 - beste Hervorhebung,\n"
-	"# 3 - invers, 4 - blinkend, 5 - halbe Helligkeit, 6 - fett\n"
-
-#: src/lang.c:1922
-msgid	"Attr. of highlighting with _dash_  :"
-msgstr	"Hervorhebungsattr. _Unterstriche_  :"
-
-#: src/lang.c:1928
-msgid	"Attr. of highlighting with /slash/ :"
-msgstr	"Hervorhebungsattr. /Schrägstriche/ :"
+	"# Mögliche Werte sind:\n"
+	"#   0 = normal\n"
+	"#   1 = unterstrichen\n"
+	"#   2 = beste Hervorhebung\n"
+	"#   3 = invers\n"
+	"#   4 = blinkend\n"
+	"#   5 = halbe Helligkeit\n"
+	"#   6 = fett\n"
+	"\n"
+	"# Hervorhebungsattribut für *Sterne*\n"
+	"# Voreinstellung: 6 (fett)\n"
 
-#: src/lang.c:1934
-msgid	"Attr. of highlighting with -stroke-:"
-msgstr	"Hervorhebungsattr. -Durchstreich.- :"
+#: src/lang.c:2056
+msgid	"Attr. of highlighting with _dash_"
+msgstr	"Hervorhebungsattr. _Unterstriche_"
+
+#: src/lang.c:2057
+msgid	"# Attribute of word highlighting with _dash_\n"
+	"# Default: 2 (best highlighting)\n"
+msgstr	"# Hervorhebungsattribut für _Unterstriche_\n"
+	"# Voreinstellung: 2 (beste Hervorhebung)\n"
+
+#: src/lang.c:2063
+msgid	"Attr. of highlighting with /slash/"
+msgstr	"Hervorhebungsattr. /Schrägstriche/"
+
+#: src/lang.c:2064
+msgid	"# Attribute of word highlighting with /slash/\n"
+	"# Default: 5 (half bright)\n"
+msgstr	"# Hervorhebungsattribut für /Schrägstriche/\n"
+	"# Voreinstellung: 5 (halbe Helligkeit)\n"
+
+#: src/lang.c:2070
+msgid	"Attr. of highlighting with -stroke-"
+msgstr	"Hervorhebungsattr. -Durchstreich.-"
 
-#: src/lang.c:1940
-msgid	"Word highlighting in message body  :"
-msgstr	"Wort-Hervorhebung im Artikel       :"
+#: src/lang.c:2071
+msgid	"# Attribute of word highlighting with -stroke-\n"
+	"# Default: 3 (reverse video)\n"
+msgstr	"# Hervorhebungsattribut für -Durchstreichen-\n"
+	"# Voreinstellung: 3 (Invers)\n"
+
+#: src/lang.c:2077
+msgid	"URL highlighting in message body"
+msgstr	"URL-Hervorhebung im Artikel"
+
+#: src/lang.c:2078
+msgid	"# Enable URL highlighting?\n"
+msgstr	"# URL-Hervorhebung aktivieren?\n"
+
+#: src/lang.c:2083
+msgid	"Word highlighting in message body"
+msgstr	"Wort-Hervorhebung im Artikel"
 
-#: src/lang.c:1941
+#: src/lang.c:2084
 msgid	"# Enable word highlighting?\n"
 msgstr	"# Wort-Hervorhebung aktivieren?\n"
 
-#: src/lang.c:1946
-msgid	"What to display instead of mark    :"
-msgstr	"Anstelle der Markierung anzeigen   :"
+#: src/lang.c:2089
+msgid	"What to display instead of mark"
+msgstr	"Anstelle der Markierung anzeigen"
 
-#: src/lang.c:1947
+#: src/lang.c:2090
 msgid	"# Should the leading and ending stars and dashes also be displayed,\n"
 	"# even when they are highlighting marks?\n"
-	"# 0 - no    1 - yes, display mark    2 - print a space instead\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = no\n"
+	"#   1 = yes, display mark\n"
+	"# * 2 = print a space instead\n"
 msgstr	"# Sollen die führenden und abschließenden Sterne und Striche dargestellt\n"
 	"# werden, auch wenn sie Hervorhebungsmarkierungen sind?\n"
-	"# 0 - nein  1 - ja, anzeigen  2 - Leerzeichen anstelle darstellen\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"#   0 = nein\n"
+	"#   1 = ja, anzeigen\n"
+	"# * 2 = Leerzeichen anstelle darstellen\n"
 
-#: src/lang.c:1953
+#: src/lang.c:2099
 msgid	"Enter column number to wrap article lines to in the pager. <CR> sets."
 msgstr	"Nach wie vielen Zeichen soll im Pager umbrochen werden? <CR> setzt."
 
-#: src/lang.c:1954
-msgid	"Page line wrap column              :"
-msgstr	"Zeilen umbrechen nach              :"
+#: src/lang.c:2100
+msgid	"Page line wrap column"
+msgstr	"Zeilen umbrechen nach"
 
-#: src/lang.c:1955
+#: src/lang.c:2101
 msgid	"# Wrap article lines at column\n"
 msgstr	"# In der Artikelanzeige Zeilen umbrechen bei Spalte\n"
 
-#: src/lang.c:1960
-msgid	"Wrap around threads on next unread :"
-msgstr	"Nä.ungel.-kein Abbr. am Listenende?:"
+#: src/lang.c:2106
+msgid	"Wrap around threads on next unread"
+msgstr	"Nä.ungel.-kein Abbr. am Listenende?"
 
-#: src/lang.c:1961
+#: src/lang.c:2107
 msgid	"# If ON wrap around threads on searching next unread article\n"
 msgstr	"# Diverse Funktionen in tin wechseln zum \"nächsten\" ungelesenen\n"
 	"# Artikel. Diese Einstellung kontrolliert, ob tin am Ende der\n"
 	"# Artikel/Threadliste abbricht (OFF) oder zum Beginn derselben springt und\n"
 	"# von dort aus den nächsten ungelesenen Artikel sucht. (ON)\n"
 
-#: src/lang.c:1965
+#: src/lang.c:2111
 msgid	"Enter default mail address (and fullname). <CR> sets."
 msgstr	"Standard Mail-Adresse (und Name) eingeben. <CR> setzt."
 
-#: src/lang.c:1966
-msgid	"Mail address (and fullname)        :"
-msgstr	"Mailadresse (und Name)             :"
+#: src/lang.c:2112
+msgid	"Mail address (and fullname)"
+msgstr	"Mailadresse (und Name)"
 
-#: src/lang.c:1967
+#: src/lang.c:2113
 msgid	"# User's mail address (and fullname), if not username@host (fullname)\n"
 msgstr	"# EMail-Adresse und vollständiger Name des Benutzers, wenn sie nicht\n"
 	"# benutzername@host (Vollständiger Name) lautet\n"
 
-#: src/lang.c:1972
-msgid	"Show empty Followup-To in editor   :"
-msgstr	"Leeres Fup'2 im Editor anzeigen    :"
+#: src/lang.c:2118
+msgid	"Show empty Followup-To in editor"
+msgstr	"Leeres Fup'2 im Editor anzeigen"
 
-#: src/lang.c:1973
+#: src/lang.c:2119
 msgid	"# If ON show empty Followup-To header when editing an article\n"
 msgstr	"# Wenn ON, zeige leeren Followup-To:-Header im Editor\n"
 
-#: src/lang.c:1977
+#: src/lang.c:2123
 msgid	"Enter path/! command/--none to create your default signature. <CR> sets."
-msgstr	"Setze Pfad/! Kommando/--none um ihre Signatur festzulegen. <CR> setzt."
+msgstr	"Setze Pfad/! Kommando/--none um Ihre Signatur festzulegen. <CR> setzt."
 
-#: src/lang.c:1978
-msgid	"Create signature from path/command :"
-msgstr	"Erzeuge Signatur aus Pfad/Kommando :"
+#: src/lang.c:2124
+msgid	"Create signature from path/command"
+msgstr	"Erzeuge Signatur aus Pfad/Kommando"
 
-#: src/lang.c:1979
+#: src/lang.c:2125
 msgid	"# Signature path (random sigs)/file to be used when posting/replying\n"
 	"# default_sigfile=file       appends file as signature\n"
 	"# default_sigfile=!command   executes external command to generate a "
@@ -5398,78 +5789,83 @@ msgstr	"# Pfad der Sig (Zufällige Sigs)/
 	"# default_sigfile=!Kommando führt Kommando aus um Sig zu erzeugen\n"
 	"# default_sigfile=--none    hängt keine Signatur an\n"
 
-#: src/lang.c:1986
+#: src/lang.c:2132
 msgid	"Prepend signature with \"-- \" on own line. <SPACE> toggles & <CR> sets."
 msgstr	"Trenne Sig mit \"-- \" in eigener Zeile ab. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:1987
-msgid	"Prepend signature with \"-- \"       :"
-msgstr	"Trenne Sig mit \"-- \" ab            :"
+#: src/lang.c:2133
+msgid	"Prepend signature with \"-- \""
+msgstr	"Trenne Sig mit \"-- \" ab"
 
-#: src/lang.c:1988
+#: src/lang.c:2134
 msgid	"# If ON prepend the signature with dashes '\\n-- \\n'\n"
 msgstr	"# Falls ON trenne Signatur mit '\\n-- \\n' ab\n"
 
-#: src/lang.c:1992
+#: src/lang.c:2138
 msgid	"Add signature when reposting articles. <SPACE> toggles & <CR> sets."
 msgstr	"Sig. beim Reposten eines Artikels hinzufügen? <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:1993
-msgid	"Add signature when reposting       :"
-msgstr	"Signatur beim Reposten anhängen    :"
+#: src/lang.c:2139
+msgid	"Add signature when reposting"
+msgstr	"Signatur beim Reposten anhängen"
 
-#: src/lang.c:1994
+#: src/lang.c:2140
 msgid	"# If ON add signature to reposted articles\n"
 msgstr	"# Falls ON wird die Signatur auch an repostete Artikel angehängt.\n"
 
-#: src/lang.c:1998
+#: src/lang.c:2144
+#, c-format
 msgid	"Enter quotation marks, %s or %S for author's initials."
 msgstr	"Zitatzeichen eingeben, %s oder %S für die Initialen des Verfassers."
 
-#: src/lang.c:1999
-msgid	"Characters used as quote-marks     :"
-msgstr	"Zitatzeichen                       :"
+#: src/lang.c:2145
+msgid	"Characters used as quote-marks"
+msgstr	"Zitatzeichen"
 
-#: src/lang.c:2000
+#: src/lang.c:2146
+#, c-format
 msgid	"# Characters used in quoting to followups and replies.\n"
 	"# '_' is replaced by ' ', %%s, %%S are replaced by author's initials.\n"
 msgstr	"# Zeichen für Zitate in Antworten.\n"
 	"# '_' wird durch ' ' ersetzt. %%s, %%S wird ersetzt durch Autoreninitialen.\n"
 
-#: src/lang.c:2006
-msgid	"Quoting behavior                   :"
-msgstr	"Zitierverhalten                    :"
+#: src/lang.c:2152
+msgid	"Quoting behavior"
+msgstr	"Zitierverhalten"
 
-#: src/lang.c:2007
+#: src/lang.c:2153
 msgid	"# How quoting should be handled when following up or replying.\n"
-	"# 0 = Nothing special\n"
-	"# 1 = Compress quotes\n"
-	"# 2 = Quote signatures\n"
-	"# 3 = Compress quotes, quote signatures\n"
-	"# 4 = Quote empty lines\n"
-	"# 5 = Compress quotes, quote empty lines\n"
-	"# 6 = Quote signatures, quote empty lines\n"
-	"# 7 = Compress quotes, quote signatures, quote empty lines\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = Nothing special\n"
+	"#   1 = Compress quotes\n"
+	"#   2 = Quote signatures\n"
+	"#   3 = Compress quotes, quote signatures\n"
+	"#   4 = Quote empty lines\n"
+	"# * 5 = Compress quotes, quote empty lines\n"
+	"#   6 = Quote signatures, quote empty lines\n"
+	"#   7 = Compress quotes, quote signatures, quote empty lines\n"
 msgstr	"# Spezielle Optionen beim Zitieren\n"
-	"# 0 = nichts besonderes\n"
-	"# 1 = Zitatzeichen zusammenziehen: '>>> ' statt '> > > '\n"
-	"# 2 = Signaturen zitieren\n"
-	"# 3 = Zitatzeichen zusammenziehen & Signaturen zitieren\n"
-	"# 4 = Leerzeilen zitieren\n"
-	"# 5 = Zitatzeichen zusammenziehen & Leerzeilen zitieren\n"
-	"# 6 = Signaturen zitieren & Leerzeilen zitieren\n"
-	"# 7 = Zitatzeichen zusammenziehen & Signaturen zitieren & Leerzeilen "
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"#   0 = nichts besonderes\n"
+	"#   1 = Zitatzeichen zusammenziehen: '>>> ' statt '> > > '\n"
+	"#   2 = Signaturen zitieren\n"
+	"#   3 = Zitatzeichen zusammenziehen & Signaturen zitieren\n"
+	"#   4 = Leerzeilen zitieren\n"
+	"# * 5 = Zitatzeichen zusammenziehen & Leerzeilen zitieren\n"
+	"#   6 = Signaturen zitieren & Leerzeilen zitieren\n"
+	"#   7 = Zitatzeichen zusammenziehen & Signaturen zitieren & Leerzeilen "
 	"zitieren\n"
 
-#: src/lang.c:2019 src/lang.c:2027 src/lang.c:2033
+#: src/lang.c:2166 src/lang.c:2174 src/lang.c:2180
 msgid	"%A Addr %D Date %F Addr+Name %G Groupname %M Message-ID %N Name %C First Name"
 msgstr	"%A Adr %D Datum %F Adr+Name %G Gruppenname %M Message-ID %N Name %C Vorname"
 
-#: src/lang.c:2020
-msgid	"Quote line when following up       :"
-msgstr	"Einleitungszeile beim Antworten    :"
+#: src/lang.c:2167
+msgid	"Quote line when following up"
+msgstr	"Einleitungszeile beim Antworten"
 
-#: src/lang.c:2021
+#: src/lang.c:2168
+#, c-format
 msgid	"# Format of quote line when mailing/posting/following-up an article\n"
 	"# %%A Address    %%D Date   %%F Addr+Name   %%G Groupname   %%M Message-ID\n"
 	"# %%N Full Name  %%C First Name   %%I Initials\n"
@@ -5477,35 +5873,35 @@ msgstr	"# Format der Einleitungszeile be
 	"# %%A Adresse  %%D Datum  %%F Adr+Name  %%G Gruppenname  %%M Message-ID\n"
 	"# %%N Voller Name  %%C Vorname  %%I Initialen\n"
 
-#: src/lang.c:2028
-msgid	"Quote line when cross-posting      :"
-msgstr	"Einleitungszeile beim Crossposten  :"
-
-#: src/lang.c:2034
-msgid	"Quote line when mailing            :"
-msgstr	"Einleitungszeile bei Mailantwort   :"
+#: src/lang.c:2175
+msgid	"Quote line when cross-posting"
+msgstr	"Einleitungszeile beim Crossposten"
+
+#: src/lang.c:2181
+msgid	"Quote line when mailing"
+msgstr	"Einleitungszeile bei Mailantwort"
 
-#: src/lang.c:2039
+#: src/lang.c:2186
 msgid	"If ON, include User-Agent: header. <SPACE> toggles & <CR> sets."
 msgstr	"Falls ON, füge User-Agent:-Header ein. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:2040
-msgid	"Insert 'User-Agent:'-header        :"
-msgstr	"Füge 'User-Agent:'-header ein      :"
+#: src/lang.c:2187
+msgid	"Insert 'User-Agent:'-header"
+msgstr	"Füge 'User-Agent:'-header ein"
 
-#: src/lang.c:2041
+#: src/lang.c:2188
 msgid	"# If ON include advertising User-Agent: header\n"
 msgstr	"# Falls ON füge 'User-Agent: header' ein\n"
 
-#: src/lang.c:2045
+#: src/lang.c:2193
 msgid	"Enter charset name for MIME (e.g. US-ASCII, ISO-8859-1, EUC-KR), <CR> to set."
 msgstr	"Zeichensatz für MIME (z.B. US-ASCII, ISO-8859-1, EUC-KR), <CR> setzt."
 
-#: src/lang.c:2046
-msgid	"MM_CHARSET                         :"
-msgstr	"MM_CHARSET                         :"
+#: src/lang.c:2194
+msgid	"MM_CHARSET"
+msgstr	"MM_CHARSET"
 
-#: src/lang.c:2047
+#: src/lang.c:2195
 msgid	"# Charset supported locally which is also used for MIME header and\n"
 	"# Content-Type header.\n"
 	"# If not set, the value of the environment variable MM_CHARSET is used.\n"
@@ -5522,27 +5918,27 @@ msgstr	"# Der lokale Zeichensatz, der au
 	"# definiert, werden andere Zeichensätze als mm_charset nicht dargestellt\n"
 	"# und die jeweiligen Zeichen durch ein '?' ersetzt.\n"
 
-#: src/lang.c:2058
-msgid	"MM_NETWORK_CHARSET                 :"
-msgstr	"MM_NETWORK_CHARSET                 :"
+#: src/lang.c:2205
+msgid	"MM_NETWORK_CHARSET"
+msgstr	"MM_NETWORK_CHARSET"
 
-#: src/lang.c:2059
+#: src/lang.c:2206
 msgid	"# Charset used for MIME (Content-Type) header in postings.\n"
 msgstr	"# Zeichensatz für den MIME (Content-Type) Header der Artikel.\n"
 
-#: src/lang.c:2065
-msgid	"Mailbox format                     :"
-msgstr	"Mailbox-Format                     :"
+#: src/lang.c:2212
+msgid	"Mailbox format"
+msgstr	"Mailbox-Format"
 
-#: src/lang.c:2066
+#: src/lang.c:2213
 msgid	"# Format of the mailbox.\n"
 msgstr	"# Format der Mailbox.\n"
 
-#: src/lang.c:2071
-msgid	"MIME encoding in news messages     :"
-msgstr	"MIME-Kodierung in Newsartikeln     :"
+#: src/lang.c:2218
+msgid	"MIME encoding in news messages"
+msgstr	"MIME-Kodierung in Newsartikeln"
 
-#: src/lang.c:2072
+#: src/lang.c:2219
 msgid	"# MIME encoding (8bit, base64, quoted-printable, 7bit) of the body\n"
 	"# for mails and posts, if necessary. QP is efficient for most European\n"
 	"# character sets (ISO-8859-X) with small fraction of non-US-ASCII chars,\n"
@@ -5556,15 +5952,15 @@ msgstr	"# MIME-Kodierung (8bit, base64, 
 	"# die meisten 8Bit Zeichensätze aus Ostasien, Griechenland und Russland\n"
 	"# ist, da dort gehäuft 8Bit Zeichen vorkommen.\n"
 
-#: src/lang.c:2080 src/lang.c:2101
+#: src/lang.c:2227 src/lang.c:2248
 msgid	"Don't change unless you know what you are doing. <ESC> cancels."
-msgstr	"Nur ändern, wenn Sie genau wissen, was Sie machen. <ESC> bricht ab"
+msgstr	"Nur ändern, wenn Sie genau wissen, was Sie machen. <ESC> bricht ab."
 
-#: src/lang.c:2081
-msgid	"Use 8bit characters in news headers:"
-msgstr	"Benutze 8bit-Zeichen im Newsheader :"
+#: src/lang.c:2228
+msgid	"Use 8bit characters in news headers"
+msgstr	"Benutze 8bit-Zeichen im Newsheader"
 
-#: src/lang.c:2082
+#: src/lang.c:2229
 msgid	"# If ON, 8bit characters in news headers are NOT encoded.\n"
 	"# default is OFF. Thus 8bit characters are encoded by default.\n"
 	"# 8bit chars in header are encoded regardless of the value of this\n"
@@ -5576,27 +5972,27 @@ msgstr	"# Wenn ON werden 8-Bit-Zeichen (
 	"# kodiert, wenn post_mime_encoding nicht auch auf 8bit eingestellt\n"
 	"# ist.\n"
 
-#: src/lang.c:2089
+#: src/lang.c:2236
 msgid	"Auto-view post-processed files <SPACE> toggles, <CR> sets, <ESC> cancels."
-msgstr	"Nachbearbeitete Artikel autom. anz. <SPACE> wechselt, <CR> setzt, <ESC> Ende"
+msgstr	"Nachbearbeitete Artikel autom. anz. <SPACE> wechselt, <CR> setzt, <ESC> Ende."
 
-#: src/lang.c:2090
-msgid	"View post-processed files          :"
-msgstr	"Nachbearbeitete Artikel anzeigen   :"
+#: src/lang.c:2237
+msgid	"View post-processed files"
+msgstr	"Nachbearbeitete Artikel anzeigen"
 
-#: src/lang.c:2091
+#: src/lang.c:2238
 msgid	"# If set, post processed files will be opened in a viewer\n"
 msgstr	"# Wenn ON werden nachbearbeitete Artikel automatisch angezeigt.\n"
 
-#: src/lang.c:2096
-msgid	"MIME encoding in mail messages     :"
-msgstr	"MIME-Kodierung für E-Mails         :"
-
-#: src/lang.c:2102
-msgid	"Use 8bit characters in mail headers:"
-msgstr	"Benutze 8bit Zeichen im Mail Header:"
+#: src/lang.c:2243
+msgid	"MIME encoding in mail messages"
+msgstr	"MIME-Kodierung für E-Mails"
+
+#: src/lang.c:2249
+msgid	"Use 8bit characters in mail headers"
+msgstr	"Benutze 8bit Zeichen im Mail Header"
 
-#: src/lang.c:2103
+#: src/lang.c:2250
 msgid	"# If ON, 8bit characters in mail headers are NOT encoded.\n"
 	"# default is OFF. Thus 8bit characters are encoded by default.\n"
 	"# 8bit chars in headers are encoded regardless of the value of this "
@@ -5613,24 +6009,24 @@ msgstr	"# Wenn ON werden 8-Bit-Zeichen (
 	"# E-Mailheadern verbieten, daher sollte diese Einstellung NICHT auf ON\n"
 	"# geändert werden, wenn es keine zwingende Gründe dafür gibt.\n"
 
-#: src/lang.c:2113
-msgid	"Strip blanks from ends of lines    :"
-msgstr	"Leerzeichen am Zeilenende entfernen:"
+#: src/lang.c:2260
+msgid	"Strip blanks from ends of lines"
+msgstr	"Leerzeichen am Zeilenende entfernen"
 
-#: src/lang.c:2114
+#: src/lang.c:2261
 msgid	"# If ON strip blanks from ends of lines for faster display on slow "
 	"terminals.\n"
 msgstr	"# Falls ON lösche Leerzeichen am Zeilenende; verbessert die Geschwindigkeit\n"
 
-#: src/lang.c:2119
+#: src/lang.c:2266
 msgid	"If ON, use transliteration. <SPACE> toggles & <CR> sets."
 msgstr	"Wenn ON verwende Umschreibungen. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:2120
-msgid	"Transliteration                    :"
-msgstr	"Verwende Umschreibungen            :"
+#: src/lang.c:2267
+msgid	"Transliteration"
+msgstr	"Verwende Umschreibungen"
 
-#: src/lang.c:2121
+#: src/lang.c:2268
 msgid	"# If ON, use //TRANSLIT extension. This means that when a character cannot\n"
 	"# be represented in the in the target character set, it can be approximated\n"
 	"# through one or several similarly looking characters.\n"
@@ -5640,666 +6036,543 @@ msgstr	"# Wenn ON verwende //TRANSLIT Er
 	"# Terminal als EUR umschrieben, ohne //TRANSLIT würde tin ein\n"
 	"# Fragezeichen verwenden.\n"
 
-#: src/lang.c:2128
+#: src/lang.c:2275
 msgid	"Send you a carbon copy automatically. <SPACE> toggles & <CR> sets."
 msgstr	"Sendet ihnen automatisch eine Kopie. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:2129
-msgid	"Send you a cc automatically        :"
-msgstr	"Sendet Ihnen ein Cc automatisch    :"
+#: src/lang.c:2276
+msgid	"Send you a cc automatically"
+msgstr	"Sendet Ihnen ein Cc automatisch"
 
-#: src/lang.c:2130
+#: src/lang.c:2277
 msgid	"# If ON automatically put your name in the Cc: field when mailing an article\n"
 msgstr	"# Falls ON wird Ihr Name in das Cc: Feld beim Mailen des Artikels eingesetzt\n"
 
-#: src/lang.c:2134
+#: src/lang.c:2281
 msgid	"Send you a blind carbon copy automatically. <SPACE> toggles & <CR> sets."
 msgstr	"Sendet ihnen automatisch eine blinde Kopie. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:2135
-msgid	"Send you a blind cc automatically  :"
-msgstr	"Sendet Ihnen eine blinde cc autom. :"
+#: src/lang.c:2282
+msgid	"Send you a blind cc automatically"
+msgstr	"Sendet Ihnen eine blinde cc autom."
 
-#: src/lang.c:2136
+#: src/lang.c:2283
 msgid	"# If ON automatically put your name in the Bcc: field when mailing an "
 	"article\n"
 msgstr	"# Falls ON wird Ihr Name in das Bcc: Feld beim Mailen des Artikels "
 	"eingesetzt\n"
 
-#: src/lang.c:2140
+#: src/lang.c:2287
 msgid	"Enter address elements about which you want to be warned. <CR> sets."
 msgstr	"Geben Sie den Adressenteil an, vor dem Sie gewarnt werden. <CR> setzt."
 
-#: src/lang.c:2141
-msgid	"Spamtrap warning address parts     :"
-msgstr	"Spamfallenwarnung in Adresse       :"
+#: src/lang.c:2288
+msgid	"Spamtrap warning address parts"
+msgstr	"Spamfallenwarnung in Adresse"
 
-#: src/lang.c:2142
+#: src/lang.c:2289
 msgid	"# A comma-delimited list of address-parts you want to be warned\n"
 	"# about when trying to reply by email.\n"
 msgstr	"# Eine Komma-separierte Liste von Adressteilen, vor denen gewarnt wird, wenn\n"
 	"# Sie via Mail antworten wollen.\n"
 
-#: src/lang.c:2147
+#: src/lang.c:2294
 msgid	"Enter default number of days a filter entry will be valid. <CR> sets."
 msgstr	"Gültigkeit eines Filtereintrags in Tagen. <CR> setzt."
 
-#: src/lang.c:2148
-msgid	"No. of days a filter entry is valid:"
-msgstr	"Tage, die ein Filter gültig ist    :"
+#: src/lang.c:2295
+msgid	"No. of days a filter entry is valid"
+msgstr	"Tage, die ein Filter gültig ist"
 
-#: src/lang.c:2149
+#: src/lang.c:2296
 msgid	"# Number of days a short term filter will be active\n"
-msgstr	"# Anzahl der Tage die ein temporaerer Filter aktiv ist\n"
+msgstr	"# Anzahl der Tage die ein temporärer Filter aktiv ist\n"
 
-#: src/lang.c:2153
+#: src/lang.c:2300
 msgid	"Add posted articles to filter. <SPACE> toggles & <CR> sets."
 msgstr	"Gepostete Artikel zum Filter hinzufügen. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:2154
-msgid	"Add posted articles to filter      :"
-msgstr	"Füge gepostete Artikel zum Filter  :"
+#: src/lang.c:2301
+msgid	"Add posted articles to filter"
+msgstr	"Füge gepostete Artikel zum Filter"
 
-#: src/lang.c:2155
+#: src/lang.c:2302
 msgid	"# If ON add posted articles which start a new thread to filter for\n"
 	"# highlighting follow-ups\n"
-msgstr	"# Falls ON füge gepostete Article die einen neunen Thread einleiten\n"
+msgstr	"# Falls ON füge gepostete Artikel die einen neuen Thread einleiten\n"
 	"# zum Filter hinzu um evtl. Antworten hervorzuheben\n"
 
-#: src/lang.c:2159
+#: src/lang.c:2306
 msgid	"The directory where articles/threads are to be saved in mailbox format."
-msgstr	"Verzeichnis, in dem Artikel/Threads im mailbox-Format gespeichert werden"
+msgstr	"Verzeichnis, in dem Artikel/Threads im mailbox-Format gespeichert werden."
 
-#: src/lang.c:2160
-msgid	"Mail directory                     :"
-msgstr	"Mail Verzeichnis                   :"
+#: src/lang.c:2307
+msgid	"Mail directory"
+msgstr	"Mail Verzeichnis"
 
-#: src/lang.c:2161
+#: src/lang.c:2308
 msgid	"# (-m) directory where articles/threads are saved in mailbox format\n"
 msgstr	"# (-m) Verzeichnis für im mailbox-Format gespeicherte Artikel/Threads\n"
 
-#: src/lang.c:2166
-msgid	"Save articles in batch mode (-S)   :"
-msgstr	"Speicher Artikel im Batchmode (-S) :"
+#: src/lang.c:2313
+msgid	"Save articles in batch mode (-S)"
+msgstr	"Speicher Artikel im Batchmode (-S)"
 
-#: src/lang.c:2167
+#: src/lang.c:2314
 msgid	"# If ON articles/threads will be saved in batch mode when save -S\n"
 	"# or mail (-M/-N) is specified on the command line\n"
-msgstr	"# Falls ON werden Artikel/Threads im Batchmode gespeichert wenn save -S,\n"
-	"# oder gemailt, wenn -M bzw. -N in der Kommandozeile angegeben wurde\n"
+msgstr	"# Falls ON werden Artikel/Threads im Batchmode gespeichert wenn -S,\n"
+	"# oder gemailt, wenn -M bzw. -N in der Kommandozeile angegeben wurde.\n"
 
-#: src/lang.c:2172
+#: src/lang.c:2319
 msgid	"The directory where you want articles/threads saved."
 msgstr	"Das Verzeichnis, in dem Artikel/Threads gespeichert werden sollen."
 
-#: src/lang.c:2173
-msgid	"Directory to save arts/threads in  :"
-msgstr	"Verz. um Art/Threads zu speichern  :"
+#: src/lang.c:2320
+msgid	"Directory to save arts/threads in"
+msgstr	"Verz. um Art/Threads zu speichern"
 
-#: src/lang.c:2174
+#: src/lang.c:2321
 msgid	"# Directory where articles/threads are saved\n"
 msgstr	"# Verzeichnis in dem Artikel/Threads gespeichert werden\n"
 
-#: src/lang.c:2178
+#: src/lang.c:2325
 msgid	"Auto save article/thread by Archive-name: header. <SPACE> toggles & <CR> sets."
 msgstr	"Autom. sp. von Art/Thread anhand Archive-name:-Header. <SPACE> wechselt & "
 	"<CR> setzt."
 
-#: src/lang.c:2179
-msgid	"Use Archive-name: header for save  :"
-msgstr	"Nutze Archive-name: zum Speichern  :"
+#: src/lang.c:2326
+msgid	"Use Archive-name: header for save"
+msgstr	"Nutze Archive-name: zum Speichern"
 
-#: src/lang.c:2180
+#: src/lang.c:2327
 msgid	"# If ON articles/threads with Archive-name: in mail header will\n"
 	"# be automatically saved with the Archive-name & part/patch no.\n"
 msgstr	"# Falls ON werden Artikel mit gesetztem Archive-name:-Header unter\n"
 	"# diesem abgespeichert\n"
 
-#: src/lang.c:2185
+#: src/lang.c:2332
 msgid	"Mark saved articles/threads as read. <SPACE> toggles, <CR> sets, <ESC> "
 	"cancels."
 msgstr	"Gesp. Art. gelesen markieren. <SPACE> wechselt, <CR> setzt, <ESC> bricht ab."
 
-#: src/lang.c:2186
-msgid	"Mark saved articles/threads as read:"
-msgstr	"Mark. gesp. Artikel/Threads gelesen:"
+#: src/lang.c:2333
+msgid	"Mark saved articles/threads as read"
+msgstr	"Mark. gesp. Artikel/Threads gelesen"
 
-#: src/lang.c:2187
+#: src/lang.c:2334
 msgid	"# If ON mark articles that are saved as read\n"
 msgstr	"# Falls ON werden gespeicherte Artikel als gelesen markiert\n"
 
-#: src/lang.c:2191
+#: src/lang.c:2338
 msgid	"Do post processing (eg. extract attachments) for saved articles."
-msgstr	"Bearbeite (z.B. unshar) gesp. Art/Threads. <SPACE> wechselt & <CR> setzt."
+msgstr	"Bearbeite (z.B. unshar) gesp. Art/Threads. <SPACE> wechselt, <CR> setzt."
 
-#: src/lang.c:2192
-msgid	"Post process saved articles        :"
-msgstr	"Nachbearbeiten gespeichert. Artikel:"
+#: src/lang.c:2339
+msgid	"Post process saved articles"
+msgstr	"Nachbearbeiten gespeichert. Artikel"
 
-#: src/lang.c:2193
+#: src/lang.c:2340
 msgid	"# Perform post processing (saving binary attachments) from saved articles.\n"
-	"# 0=(no) 1=(yes) 2=(extract shell archives (shar) only)\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no\n"
+	"#   1 = extract shell archives (shar) only\n"
+	"#   2 = yes\n"
 msgstr	"# Nachbearbeiten gespeicherter Artikel\n"
-	"# 0=(nein) 1=(ja) 2=(nur Shell Archive (shar) auspacken)\n"
-
-#: src/lang.c:2199
-msgid	"Process only unread articles       :"
-msgstr	"Bearbeite nur ungelesene Artikel   :"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"# * 0 = nein\n"
+	"#   1 = ja\n"
+	"#   2 = nur Shell Archive (shar) auspacken\n"
+
+#: src/lang.c:2349
+msgid	"Process only unread articles"
+msgstr	"Bearbeite nur ungelesene Artikel"
 
-#: src/lang.c:2200
+#: src/lang.c:2350
 msgid	"# If ON only save/print/pipe/mail unread articles (tagged articles excepted)\n"
 msgstr	"# Falls ON speichere/drucke/pipe/maile nur ungelesene Artikel\n"
 	"# (markierte Artikel ausgenommen)\n"
 
-#: src/lang.c:2205
+#: src/lang.c:2355
 msgid	"Print all or just part of header. <SPACE> toggles & <CR> sets."
 msgstr	"Drucke alles oder nur Teile des Headers <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:2206
-msgid	"Print all headers when printing    :"
-msgstr	"Alle Header beim Drucken ausgeben  :"
+#: src/lang.c:2356
+msgid	"Print all headers when printing"
+msgstr	"Alle Header beim Drucken ausgeben"
 
-#: src/lang.c:2207
+#: src/lang.c:2357
 msgid	"# If ON print all of article header otherwise just the important lines\n"
 msgstr	"# Falls ON drucke alle Header des Artikels aus. Ansonsten nur die "
 	"wichtigsten\n"
 
-#: src/lang.c:2211
+#: src/lang.c:2361
 msgid	"The printer program with options that is to be used to print articles/threads."
 msgstr	"Das Druckprogramm, das zum drucken von Artikeln/Threads benutzt wird."
 
-#: src/lang.c:2212
-msgid	"Printer program with options       :"
-msgstr	"Druckprogramm mit Optionen         :"
+#: src/lang.c:2362
+msgid	"Printer program with options"
+msgstr	"Druckprogramm mit Optionen"
 
-#: src/lang.c:2213
+#: src/lang.c:2363
 msgid	"# Print program with parameters used to print articles/threads\n"
 msgstr	"# Druckprogramm mit Optionen zum drucken der Artikel/Threads\n"
 
-#: src/lang.c:2219
-msgid	"Force redraw after certain commands:"
-msgstr	"Anzeigeauffrischung nach Kommandos :"
+#: src/lang.c:2369
+msgid	"Force redraw after certain commands"
+msgstr	"Anzeigeauffrischung nach Kommandos"
 
-#: src/lang.c:2220
+#: src/lang.c:2370
 msgid	"# If ON a screen redraw will always be done after certain external commands\n"
 msgstr	"# Falls ON wird die Anzeige nach einigen externen Kommandos aufgefrischt\n"
 
-#: src/lang.c:2224
+#: src/lang.c:2374
 msgid	"Start editor with line offset. <SPACE> toggles, <CR> sets, <ESC> cancels."
 msgstr	"Starte Editor mit Einrückung. <SPACE> wechselt, <CR> setzt, <ESC> bricht ab."
 
-#: src/lang.c:2225
-msgid	"Start editor with line offset      :"
-msgstr	"Starte Editor mit Einrückung       :"
+#: src/lang.c:2375
+msgid	"Start editor with line offset"
+msgstr	"Starte Editor mit Einrückung"
 
-#: src/lang.c:2226
+#: src/lang.c:2376
 msgid	"# If ON editor will be started with cursor offset into the file\n"
 	"# otherwise the cursor will be positioned at the first line\n"
 msgstr	"# Falls ON wird der Cursor im Editor an die definierte Position gesetzt.\n"
 	"# Anderenfalls wird der Cursor in die erste Zeile gesetzt\n"
 
-#: src/lang.c:2231
+#: src/lang.c:2381
 msgid	"Enter %E for editor, %F for filename, %N for line-number, <CR> to set."
 msgstr	"%E für Editor, %F für Dateiname, %N für Zeilennummer, <CR> setzt."
 
-#: src/lang.c:2232
-msgid	"Invocation of your editor          :"
-msgstr	"Aufruf ihres Editors               :"
+#: src/lang.c:2382
+msgid	"Invocation of your editor"
+msgstr	"Aufruf Ihres Editors"
 
-#: src/lang.c:2233
+#: src/lang.c:2383
+#, c-format
 msgid	"# Format of editor line including parameters\n"
 	"# %%E Editor  %%F Filename  %%N Linenumber\n"
 msgstr	"# Format der Editorzeile mit den Parametern für den Aufruf\n"
 	"# %%E Editor  %%F Dateiname  %%N Zeilennummer\n"
 
-#: src/lang.c:2238
+#: src/lang.c:2388
 msgid	"Enter name and options for external-inews, --internal for internal inews"
 msgstr	"Name und Optionen für ext. inews, --internal für eingebaute Version"
 
-#: src/lang.c:2239
-msgid	"External inews                     :"
-msgstr	"Externes inews-Programm            :"
+#: src/lang.c:2389
+msgid	"External inews"
+msgstr	"Externes inews-Programm"
 
-#: src/lang.c:2240
+#: src/lang.c:2390
 msgid	"# If --internal use the built in mini inews for posting via NNTP\n"
 	"# otherwise use an external inews program\n"
 msgstr	"# Falls --internal wird das eingebaute mini inews zum posten via NNTP\n"
-	"# benutzt, sonst wird das hier angegebene Programm mit den angebenen\n"
+	"# benutzt, sonst wird das hier angegebene Programm mit den angegebenen\n"
 	"# Optionen verwendet. z.B. 'inews -h'\n"
 
-#: src/lang.c:2244
+#: src/lang.c:2394
 msgid	"Enter %M for mailer, %S for subject, %T for to, %F for filename, <CR> to set."
 msgstr	"%M für den Mailer, %S für Subject, %T für to, %F für Dateinamen, <CR> setzt."
 
-#: src/lang.c:2245
-msgid	"Invocation of your mail command    :"
-msgstr	"Aufruf ihres Mailkommandos         :"
+#: src/lang.c:2395
+msgid	"Invocation of your mail command"
+msgstr	"Aufruf Ihres Mailkommandos"
 
-#: src/lang.c:2246
+#: src/lang.c:2396
+#, c-format
 msgid	"# Format of mailer line including parameters\n"
-	"# %%M Mailer  %%S Subject  %%T To  %%F Filename  %%U User (AmigaDOS)\n"
+	"# %%M Mailer  %%S Subject  %%T To  %%F Filename\n"
 	"# ie. to use elm as your mailer:    elm -s \"%%S\" \"%%T\" < %%F\n"
 	"# ie. elm interactive          :    elm -i %%F -s \"%%S\" \"%%T\"\n"
-msgstr	"# Format der Mailkommandozeile mit ihren Parametern\n"
-	"# %%M Mailprogramm  %%S Subject  %%T To  %%F Dateiname  %%U User (AmigaDOS)\n"
+msgstr	"# Format der Mailkommandozeile mit Ihren Parametern\n"
+	"# %%M Mailprogramm  %%S Subject  %%T To  %%F Dateiname\n"
 	"# Ein Beispiel für elm           :  elm -s \"%%S\" \"%%T\" < %%F\n"
 	"# Ein Beispiel für elm interaktiv:  elm -i %%F -s \"%%S\" \"%%T\"\n"
 
-#: src/lang.c:2254
-msgid	"Use interactive mail reader        :"
-msgstr	"Benutze interaktives Mailprogramm  :"
-
-#: src/lang.c:2255
-msgid	"# Interactive mailreader: if ON mailreader will be invoked earlier for\n"
-	"# reply so you can use more of its features (eg. MIME, pgp, ...)\n"
-	"# this option has to suit default_mailer_format\n"
-msgstr	"# Interaktives Mailprogramm: Falls ON wird das Mailprogramm an einer\n"
-	"# früheren Stelle aufgerufen, so das man seine Möglichkeiten besser nutzen\n"
-	"# kann (z.B. MIME, pgp, ...).\n"
-	"# Diese Option muss zu default_mailer_format passen.\n"
-
-#: src/lang.c:2262
-msgid	"Remove ~/.article after posting    :"
-msgstr	"Entferne ~/.article nach dem posten:"
+#: src/lang.c:2404
+msgid	"Use interactive mail reader"
+msgstr	"Benutze interaktives Mailprogramm"
+
+#: src/lang.c:2405
+msgid	"# Interactive mailreader\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no interactive mailreader\n"
+	"#   1 = use interactive mailreader with headers in file\n"
+	"#   2 = use interactive mailreader without headers in file\n"
+msgstr	"# Interaktives Mailprogramm.\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"# * 0 = kein interaktives Mailprogramm\n"
+	"#   1 = interaktives Mailprogramm, Mailheader werden in der Datei mit "
+	"übergeben\n"
+	"#   2 = interaktives Mailprogramm, Mailheader werden als Argumente übergeben\n"
+
+#: src/lang.c:2414
+msgid	"Remove ~/.article after posting"
+msgstr	"Entferne ~/.article nach dem posten"
 
-#: src/lang.c:2263
+#: src/lang.c:2415
 msgid	"# If ON remove ~/.article after posting.\n"
 msgstr	"# Falls ON entferne ~/.article nach dem posten.\n"
 
-#: src/lang.c:2267
+#: src/lang.c:2419
 msgid	"Filename for all posted articles, <CR> sets, no filename=do not save."
 msgstr	"Dateiname für Kopie geposteter Artikel. <CR> setzt, kein Name=keine Kopie."
 
-#: src/lang.c:2268
-msgid	"Filename for posted articles       :"
-msgstr	"Gepostete Artikel speichern in     :"
+#: src/lang.c:2420
+msgid	"Filename for posted articles"
+msgstr	"Gepostete Artikel speichern in"
 
-#: src/lang.c:2269
+#: src/lang.c:2421
 msgid	"# Filename where to keep all postings (default posted)\n"
 	"# If no filename is set then postings will not be saved\n"
 msgstr	"# Dateiname für die Kopie aller Postings (Voreinstellung posted)\n"
 	"# Ist kein Name angegeben wird keine Kopie gespeichert\n"
 
-#: src/lang.c:2274
+#: src/lang.c:2426
 msgid	"Keep all failed articles in ~/dead.articles. <SPACE> toggles & <CR> sets."
 msgstr	"Behalte alle Fehlschläge in ~/dead.articles. <SPACE> wechselt & <CR> setzt."
 
-#: src/lang.c:2275
-msgid	"Keep failed arts in ~/dead.articles:"
-msgstr	"Halte Fehlschl. in ~/dead.articles :"
+#: src/lang.c:2427
+msgid	"Keep failed arts in ~/dead.articles"
+msgstr	"Halte Fehlschl. in ~/dead.articles"
 
-#: src/lang.c:2276
+#: src/lang.c:2428
 msgid	"# If ON keep all failed postings in ~/dead.articles\n"
 msgstr	"# Falls ON werden Fehlgeschlagene Artikel in ~/dead.articles verwahrt\n"
 
-#: src/lang.c:2280
+#: src/lang.c:2432
 msgid	"Do you want to strip unsubscribed groups from .newsrc"
 msgstr	"Wollen Sie nicht-abonnierte Gruppen aus der .newsrc entfernen?"
 
-#: src/lang.c:2281
-msgid	"No unsubscribed groups in newsrc   :"
-msgstr	"Nur abonnierte Gruppen in newsrc   :"
+#: src/lang.c:2433
+msgid	"No unsubscribed groups in newsrc"
+msgstr	"Nur abonnierte Gruppen in newsrc"
 
-#: src/lang.c:2282
+#: src/lang.c:2434
 msgid	"# If ON strip unsubscribed groups from newsrc\n"
 msgstr	"# Falls ON entferne nicht-abonnierte Gruppen aus der newsrc\n"
 
-#: src/lang.c:2287
-msgid	"Remove bogus groups from newsrc    :"
-msgstr	"Lösche nicht vorhande G. aus newsrc:"
+#: src/lang.c:2439
+msgid	"Remove bogus groups from newsrc"
+msgstr	"Lösche nicht vorhan. G. aus newsrc"
 
-#: src/lang.c:2288
+#: src/lang.c:2440
 msgid	"# What to do with bogus groups in newsrc file\n"
-	"# 0=(Keep) 1=(Remove) 2=(Highlight with D on selection screen).\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = keep\n"
+	"#   1 = remove\n"
+	"#   2 = highlight with D on selection screen\n"
 msgstr	"# Was soll mit nicht mehr vorhanden Gruppen in der newsrc-Datei passieren?\n"
-	"# 0=(Behalten) 1=(entfernen) 2=(Mit D in der Auswahl markieren).\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"# * 0 = Behalten\n"
+	"#   1 = entfernen\n"
+	"#   2 = Mit D in der Auswahl markieren.\n"
 
-#: src/lang.c:2292
+#: src/lang.c:2448
 msgid	"Enter number of seconds until active file will be reread. <CR> sets."
 msgstr	"Sekunden, nach denen die active-Datei wieder gelesen wird. <CR> setzt."
 
-#: src/lang.c:2293
-msgid	"Interval in secs to reread active  :"
-msgstr	"Active alle ... Sekunden neu lesen :"
+#: src/lang.c:2449
+msgid	"Interval in secs to reread active"
+msgstr	"Active alle ... Sekunden neu lesen"
 
-#: src/lang.c:2294
+#: src/lang.c:2450
 msgid	"# Time interval in seconds between rereading the active file (0=never)\n"
 msgstr	"# Zeitintervall in Sekunden zwischen dem Wiedereinlesen des active (0=nie)\n"
 
-#: src/lang.c:2299
-msgid	"Reconnect to server automatically  :"
-msgstr	"Autom. Wiederverbindung zum Server :"
+#: src/lang.c:2455
+msgid	"Reconnect to server automatically"
+msgstr	"Autom. Wiederverbindung zum Server"
 
-#: src/lang.c:2300
+#: src/lang.c:2456
 msgid	"# If ON automatically reconnect to NNTP server if the connection is broken\n"
 msgstr	"# Falls ON wird eine unterbrochene Verbindung zum NNTP Server\n"
 	"# automatisch reaktiviert\n"
 
-#: src/lang.c:2304
+#: src/lang.c:2460
 msgid	"Create local copies of NNTP overview files. <SPACE> toggles & <CR> sets."
 msgstr	"Erzeuge lokale Kopien der NNTP Overview Dateien. <SPACE> wechselt & <CR> "
 	"setzt."
 
-#: src/lang.c:2305
-msgid	"Cache NNTP overview files locally  :"
-msgstr	"Speichere NNTP Overview Daten lokal:"
+#: src/lang.c:2461
+msgid	"Cache NNTP overview files locally"
+msgstr	"Speichere NNTP Overview Daten lokal"
 
-#: src/lang.c:2306
+#: src/lang.c:2462
 msgid	"# If ON, create local copies of NNTP overview files.\n"
 msgstr	"# Falls ON, erzeuge lokale Kopien der NNTP Overview Dateien.\n"
 
-#: src/main.c:619
-#, c-format
-msgid	"Version: %s release %s (\"%s\") %s %s"
-msgstr	"Version: %s Ausgabe %s (\"%s\") %s %s"
+#: src/lang.c:2466
+msgid	"Enter format string. <CR> sets, <ESC> cancels."
+msgstr	"Format-Zeichenkette eingeben. <CR> setzt, <ESC> bricht ab."
+
+#: src/lang.c:2467
+msgid	"Format string for display of dates"
+msgstr	"Datums Format-Zeichenkette"
+
+#: src/lang.c:2468
+msgid	"# Format string for date representation\n"
+msgstr	"# Zeichenkette die die Datumsanzeige beschreibt.\n"
+
+#: src/lang.c:2474
+msgid	"Unicode normalization form"
+msgstr	"Unicode Normalisierungsart"
+
+#: src/lang.c:2475
+msgid	"# Unicode normalization form\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = None\n"
+	"# * 1 = NFKC\n"
+	"#   2 = NFKD\n"
+	"#   3 = NFC\n"
+	"#   4 = NFD\n"
+msgstr	"# Unicode Normalisierungsart\n"
+	"# Mögliche Werte sind (die Voreinstellung ist mit * gekennzeichnet):\n"
+	"#   0 = keine\n"
+	"# * 1 = NFKC\n"
+	"#   2 = NFKD\n"
+	"#   3 = NFC\n"
+	"#   4 = NFD\n"
+
+#: src/lang.c:2487
+msgid	"Render BiDi"
+msgstr	"BiDi wiedergeben"
+
+#: src/lang.c:2488
+msgid	"# If ON, bi-directional text is rendered by tin\n"
+msgstr	"# Falls ON, wird bi-direktionaler Text von tin wiedergeben.\n"
+
+#: src/misc.c:3750
+#, c-format
+msgid	"Version: %s %s release %s (\"%s\") %s %s\n"
+msgstr	"Version: %s %s Ausgabe %s (\"%s\") %s %s\n"
 
-#: src/main.c:622
+#: src/misc.c:3753
 #, c-format
-msgid	"Version: %s release %s (\"%s\")"
-msgstr	"Version: %s Ausgabe %s (\"%s\")"
+msgid	"Version: %s %s release %s (\"%s\")\n"
+msgstr	"Version: %s %s Ausgabe %s (\"%s\")\n"
+
+#: src/newsrc.c:430
+msgid	"Unreachable?\n"
+msgstr	"Unerreichbar?\n"
 
-#: src/nntplib.c:804
+#: src/nntplib.c:824
 #, c-format
 msgid	"\n"
 	"Server timed out, trying reconnect # %d\n"
 msgstr	"\n"
 	"Server reagierte nicht, Wiederholung Nummer # %d\n"
 
-#: src/nntplib.c:822
+#: src/nntplib.c:842
 msgid	"Rejoin current group\n"
 msgstr	"Betrete aktuelle Gruppe neu\n"
 
-#: src/nntplib.c:829
+#: src/nntplib.c:849
 #, c-format
 msgid	"Read (%s)\n"
 msgstr	"Lese (%s)\n"
 
-#: src/nntplib.c:831
+#: src/nntplib.c:851
 #, c-format
 msgid	"Resend last command (%s)\n"
 msgstr	"Sende letztes Kommando (%s) neu\n"
 
-#: src/nntplib.c:951
-msgid	"100  Help text on way"
-msgstr	"100  Hilfetext ist auf dem Weg"
-
-#: src/nntplib.c:955
-msgid	"180  Authorization capabilities"
-msgstr	"180  Anmeldeeigenschaft"
-
-#: src/nntplib.c:959
-msgid	"199  Debug output"
-msgstr	"199  Debug-Ausgabe"
-
-#: src/nntplib.c:963
-msgid	"200  Hello; you can post"
-msgstr	"200  Hallo; Sie dürfen Posten"
-
-#: src/nntplib.c:967
-msgid	"201  Hello; you can't post"
-msgstr	"201  Hallo; Sie dürfen nicht Posten"
-
-#: src/nntplib.c:971
-msgid	"202  Slave status noted"
-msgstr	"202  Empfängerstatus notiert"
-
-#: src/nntplib.c:979
-msgid	"211  Group selected"
-msgstr	"211  Gruppe ausgewählt"
-
-#: src/nntplib.c:984
-msgid	"215  Newsgroups follow"
-msgstr	"215  Newsgruppen folgen"
-
-#: src/nntplib.c:989
-msgid	"218  Group index file follows"
-msgstr	"218  Gruppenindexdatei folgt"
-
-#: src/nntplib.c:994
-msgid	"220  Article (head & body) follows"
-msgstr	"220  Artikel (Header und Body) folgt"
-
-#: src/nntplib.c:998
-msgid	"221  Head follows"
-msgstr	"221  Header folgt"
-
-#: src/nntplib.c:1002
-msgid	"222  Body follows"
-msgstr	"222  Body folgt"
-
-#: src/nntplib.c:1006
-msgid	"223  No text sent -- stat, next, last"
-msgstr	"223  Kein Text gesendet -- status, nächster, letzter"
-
-#: src/nntplib.c:1010
-msgid	"230  New articles by message-id follow"
-msgstr	"230  Neue Artikel mit Message-ID folgen"
-
-#: src/nntplib.c:1014
-msgid	"231  New newsgroups follow"
-msgstr	"231  Neue Newsgruppen folgen"
-
-#: src/nntplib.c:1018
-msgid	"235  Article transferred successfully"
-msgstr	"235  Artikel erfolgreich übertragen"
-
-#: src/nntplib.c:1022
-msgid	"240  Article posted successfully"
-msgstr	"240  Artikel erfolgreich gepostet"
-
-#: src/nntplib.c:1026
-msgid	"280  Authorization system ok"
-msgstr	"280  Anmeldeart OK"
-
-#: src/nntplib.c:1030
-msgid	"281  Authorization (user/pass) ok"
-msgstr	"281  Anmeldung (Benutzer/Passwort) OK"
-
-#: src/nntplib.c:1034
-msgid	"282  binary data follows"
-msgstr	"282  Binär-Daten folgen"
-
-#: src/nntplib.c:1038
-msgid	"283  spooldir list follows"
-msgstr	"283  Spool-Verzeichnisliste folgt"
-
-#: src/nntplib.c:1042
-msgid	"284  Switching to a different spooldir"
-msgstr	"284  Schalte auf ein anderes Spool-Verzeichnis um"
-
-#: src/nntplib.c:1046
-msgid	"285  Still using same spooldir"
-msgstr	"285  Benutze immer noch das selbe Spool-Verzeichnis"
-
-#: src/nntplib.c:1050
-msgid	"286  Current spooldir"
-msgstr	"286  Aktuelles Spool-Verzeichnis"
-
-#: src/nntplib.c:1054
-msgid	"287  Available spooldir"
-msgstr	"287  Verfügbare Spool-Verzeichnisse"
-
-#: src/nntplib.c:1058
-msgid	"288  Unavailable spooldir or invalid entry"
-msgstr	"288  Nicht verfügbares Spool-Verzeichnis oder ungültiger Eintrag"
-
-#: src/nntplib.c:1062
-msgid	"335  Continue to send article"
-msgstr	"335  Fahren Sie mit dem Senden des Artikels fort"
-
-#: src/nntplib.c:1066
-msgid	"340  Continue to post article"
-msgstr	"340  Fahren sie mit dem Posten des Artikels fort"
-
-#: src/nntplib.c:1070
-msgid	"380  authorization is required"
-msgstr	"380  Anmeldung ist notwendig"
-
-#: src/nntplib.c:1074
-msgid	"381  <type> authorization data required"
-msgstr	"381  <Typ> Anmeldedaten notwendig"
-
-#: src/nntplib.c:1078
-msgid	"400  Have to hang up for some reason"
-msgstr	"400  Muss aus irgendeinem Grund die Verbindung trennen"
-
-#: src/nntplib.c:1082
-msgid	"411  No such newsgroup"
-msgstr	"411  Ungültige Newsgruppe"
-
-#: src/nntplib.c:1086
-msgid	"412  Not currently in newsgroup"
-msgstr	"412  Im Augenblick in keiner Newsgruppe"
-
-#: src/nntplib.c:1090
-msgid	"418  No index file for this group"
-msgstr	"418  Keine Index-Datei für diese Newsgruppe"
-
-#: src/nntplib.c:1094
-msgid	"420  No current article selected"
-msgstr	"420  Kein aktueller Artikel ausgewählt"
-
-#: src/nntplib.c:1098
-msgid	"421  No next article in this group"
-msgstr	"421  Kein nächster Artikel in dieser Gruppe"
-
-#: src/nntplib.c:1102
-msgid	"422  No previous article in this group"
-msgstr	"422  Kein vorheriger Artikel in dieser Gruppe"
-
-#: src/nntplib.c:1106
-msgid	"423  No such article in this group"
-msgstr	"423  Ungültiger Artikel in dieser Gruppe"
-
-#: src/nntplib.c:1110
-msgid	"430  No such article at all"
-msgstr	"430  Allgemein ungültiger Artikel"
-
-#: src/nntplib.c:1114
-msgid	"435  Already got that article, don't send"
-msgstr	"435  Habe den Artikel schon, nicht senden"
-
-#: src/nntplib.c:1118
-msgid	"436  Transfer failed"
-msgstr	"436  Transfer fehlgeschlagen"
-
-#: src/nntplib.c:1122
-msgid	"437  Article rejected, don't resend"
-msgstr	"437  Artikel abgelehnt, nicht neu senden"
-
-#: src/nntplib.c:1126
-msgid	"440  Posting not allowed"
-msgstr	"440  Posten nicht erlaubt"
-
-#: src/nntplib.c:1130
-msgid	"441  Posting failed"
-msgstr	"441  Posten fehlgeschlagen"
-
-#: src/nntplib.c:1134
-msgid	"480  authorization required for command"
-msgstr	"480  Anmeldung für dieses Kommando notwendig"
-
-#: src/nntplib.c:1138
-msgid	"481  Authorization system invalid"
-msgstr	"481  Anmeldeart ungültig"
-
-#: src/nntplib.c:1142
-msgid	"482  Authorization data rejected"
-msgstr	"482  Anmeldedaten abgelehnt"
-
-#: src/nntplib.c:1146
-msgid	"483  Invalid alias on spooldir cmd"
-msgstr	"483  Ungültiger Alias im Kommando für das Spoolverzeichnis"
-
-#: src/nntplib.c:1150
-msgid	"484  No spooldir file found"
-msgstr	"484  Kein Spool-Verzeichnis gefunden"
-
-#: src/nntplib.c:1154
-msgid	"500  Command not recognized"
-msgstr	"500  Kommando nicht erkannt"
-
-#: src/nntplib.c:1158
-msgid	"501  Command syntax error"
-msgstr	"501  Kommandosyntaxfehler"
-
-#: src/nntplib.c:1162
-msgid	"502  Access to server denied"
-msgstr	"502  Zugriff auf Server verboten"
-
-#: src/nntplib.c:1167
-msgid	"503  Program fault, command not performed"
-msgstr	"503  Programmfehler, Kommando nicht ausgeführt"
-
-#: src/nntplib.c:1171
-msgid	"580  Authorization Failed"
-msgstr	"580  Anmeldung fehlgeschlagen"
-
-#: src/nntplib.c:1175
-msgid	"Unknown NNTP response code"
-msgstr	"Unbekannter NNTP-Antwort-Code"
+# TRANSLATION MISSING
+#.
+#. * TODO: - store a hash value of the entire motd in the server-rc
+#. *         and only if it differs from the old value display the
+#. *         motd?
+#. *       - use some sort of pager?
+#. *       - -> lang.c
+#.
+#: src/nntplib.c:1759
+msgid	"MOTD: "
+msgstr	""
 
-#: src/nrctbl.c:172
+#: src/nrctbl.c:170
 #, c-format
 msgid	"couldn't expand %s\n"
 msgstr	"Kann %s nicht expandieren\n"
 
-#: src/open.c:1032
-msgid	"Unreachable?\n"
-msgstr	"Unerreichbar?\n"
-
-#: src/post.c:1749
+#: src/post.c:1171
 #, c-format
-msgid	"%s is bogus"
-msgstr	"%s ist ungültig"
+msgid	"Line %d is longer than 998 octets and should be folded, but\n"
+	"encoding is neither set to %s nor to %s\n"
+msgstr	"Zeile %d ist länger als 998 Oktets und sollte gefaltet werden,\n"
+	"aber die Kodierung ist weder auf %s noch auf %s gestellt\n"
+
+#: src/post.c:1176
+#, c-format
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is set to %s without enabling MIME_BREAK_LONG_LINES or\n"
+	"posting doesn't contain any 8bit chars and thus folding won't happen\n"
+msgstr	"Zeile %d ist länger als 998 Oktets und sollte gefaltet werden,\n"
+	"aber die Kodierung ist auf %s gestellt ohne MIME_BREAK_LONG_LINES\n"
+	"angeschaltet zu haben, oder der Artikel enhält keine 8Bit Zeichen\n"
+	"und wird daher nicht automatisch gefaltet wird.\n"
+
+#: src/post.c:1178
+#, c-format
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is not set to %s\n"
+msgstr	"Zeile %d ist länger als 998 Oktets und sollte gefaltet werden,\n"
+	"aber die Kodierung ist nicht auf %s gesetzt\n"
 
-#: src/post.c:1940
+#: src/post.c:1993
 #, c-format
 msgid	"Posting: %.*s ..."
 msgstr	"Poste: %.*s ..."
 
-#. TODO: -> lang.c
-#: src/post.c:4038
-#, c-format
-msgid	"Rereading %s..."
-msgstr	"Lese %s..."
-
-#. fp
 #. Check if okay to read
-#: src/read.c:219
+#: src/read.c:211
 msgid	"Aborting read, please wait..."
 msgstr	"Breche Lesen ab, bitte warten..."
 
-#: src/read.c:366
+#: src/read.c:358
 msgid	"Aborted read\n"
 msgstr	"Lesen abgebrochen\n"
 
-#: src/read.c:422
+#: src/read.c:414
 msgid	"Draining\n"
 msgstr	"Ablassen\n"
 
 #. Don't hash the initial '<'
-#: src/refs.c:220
+#: src/refs.c:251
 msgid	"unchanged"
 msgstr	"unverändert"
 
-#: src/refs.c:573
+#: src/refs.c:609
 msgid	"[- Unavailable -]"
 msgstr	"[- Nicht Verfügbar -]"
 
-#: src/save.c:975
+#.
+#. * preamble
+#. * TODO: -> lang.c
+#.
+#: src/rfc2047.c:1201
+#, c-format
+msgid	"This message has been composed in the 'multipart/mixed' MIME-format. If you\n"
+	"are reading this prefix, your mail reader probably has not yet been modified\n"
+	"to understand the new format, and some of what follows may look strange.\n"
+	"\n"
+msgstr	"Dieser Artikel wurde im 'multipart/mixed' MIME-Format verfasst. Wenn Sie\n"
+	"dieses Präfix lesen ist Ihr Mailprogramm vermutlich nicht in der Lage dieses\n"
+	"Format zu verstehen und einiges von was folgt, kann merkwürdig aussehen.\n"
+	"\n"
+
+#: src/save.c:972
 msgid	"bytes"
 msgstr	"Bytes"
 
-#: src/select.c:351
+#: src/select.c:379
 msgid	"unread"
 msgstr	"ungelesen"
 
-#: src/select.c:351
+#: src/select.c:379
 msgid	"all"
 msgstr	"Alle"
 
-#: src/select.c:525 src/select.c:527
+#: src/select.c:549 src/select.c:551
 msgid	" R"
 msgstr	" R"
 
@@ -6312,7 +6585,7 @@ msgstr	"Kann slrnface nicht starten: Umg
 #: src/xface.c:99 src/xface.c:131
 #, c-format
 msgid	"Can't run slrnface: failed to create %s"
-msgstr	"Kann slrnface nicht starten: Anlegen von %s fehlgeschagen"
+msgstr	"Kann slrnface nicht starten: Anlegen von %s fehlgeschlagen"
 
 #: src/xface.c:109
 msgid	"This directory is used to create named pipes for communication between\n"
Binary files tin-1.6.2/po/en_GB.gmo and tin-1.8.0/po/en_GB.gmo differ
diff -Nurp tin-1.6.2/po/en_GB.po tin-1.8.0/po/en_GB.po
--- tin-1.6.2/po/en_GB.po	2003-09-10 17:08:58.000000000 +0200
+++ tin-1.8.0/po/en_GB.po	2005-12-24 19:09:50.896754919 +0100
@@ -2,8 +2,9 @@
 # Robert Brady <rwb197@ecs.soton.ac.uk>, 2000-2002
 #
 msgid	""
-msgstr	"Project-Id-Version: tin 1.6.2\n"
-	"POT-Creation-Date: 2003-09-10 17:05+0200\n"
+msgstr	"Project-Id-Version: tin 1.7.9\n"
+	"Report-Msgid-Bugs-To: \n"
+	"POT-Creation-Date: 2005-12-24 19:09+0100\n"
 	"PO-Revision-Date: 2002-11-15 20:10+0000\n"
 	"Last-Translator: Robert Brady <rwb197@zepler.org>\n"
 	"Language-Team: \n"
@@ -11,216 +12,292 @@ msgstr	"Project-Id-Version: tin 1.6.2\n"
 	"Content-Type: text/plain; charset=ISO-8859-1\n"
 	"Content-Transfer-Encoding: 8bit\n"
 
-#: src/attrib.c:574
+#: src/art.c:1533
+#, c-format
+msgid	"%d Bad overview record (%d fields) '%s'"
+msgstr	""
+
+#: src/attrib.c:649
+#, c-format
 msgid	"# Do not edit this comment block\n"
 	"#\n"
 msgstr	""
 
-#: src/attrib.c:575
+#: src/attrib.c:650
+#, c-format
 msgid	"#  scope=STRING (ie. alt.*,!alt.bin*) [mandatory]\n"
 msgstr	""
 
-#: src/attrib.c:576
+#: src/attrib.c:651
+#, c-format
 msgid	"#  maildir=STRING (ie. ~/Mail)\n"
 msgstr	""
 
-#: src/attrib.c:577
+#: src/attrib.c:652
+#, c-format
 msgid	"#  savedir=STRING (ie. ~user/News)\n"
 msgstr	""
 
-#: src/attrib.c:578
+#: src/attrib.c:653
+#, c-format
 msgid	"#  savefile=STRING (ie. =linux)\n"
 msgstr	""
 
-#: src/attrib.c:579
+#: src/attrib.c:654
+#, c-format
 msgid	"#  sigfile=STRING (ie. $var/sig)\n"
 msgstr	""
 
-#: src/attrib.c:580
+#: src/attrib.c:655
+#, c-format
 msgid	"#  organization=STRING (if beginning with '/' read from file)\n"
 msgstr	""
 
-#: src/attrib.c:581
+#: src/attrib.c:656
+#, c-format
 msgid	"#  followup_to=STRING\n"
 msgstr	""
 
-#: src/attrib.c:582
+#: src/attrib.c:657
+#, c-format
 msgid	"#  mailing_list=STRING (ie. majordomo@example.org)\n"
 msgstr	""
 
-#: src/attrib.c:583
+#: src/attrib.c:658
+#, c-format
 msgid	"#  x_headers=STRING (ie. ~/.tin/extra-headers)\n"
 msgstr	""
 
-#: src/attrib.c:584
+#: src/attrib.c:659
+#, c-format
 msgid	"#  x_body=STRING (ie. ~/.tin/extra-body-text)\n"
 msgstr	""
 
-#: src/attrib.c:585
+#: src/attrib.c:660
+#, c-format
 msgid	"#  from=STRING (just append wanted From:-line, don't use quotes)\n"
 msgstr	""
 
-#: src/attrib.c:586
+#: src/attrib.c:661
+#, c-format
 msgid	"#  news_quote_format=STRING\n"
 msgstr	""
 
-#: src/attrib.c:587
+#: src/attrib.c:662
+#, c-format
 msgid	"#  quote_chars=STRING (%%s, %%S for initials)\n"
 msgstr	""
 
-#: src/attrib.c:588
+#: src/attrib.c:663
+#, c-format
 msgid	"#  mime_types_to_save=STRING (eg. image/*,!image/bmp)\n"
 msgstr	""
 
-#: src/attrib.c:590
+#: src/attrib.c:665
+#, c-format
 msgid	"#  ispell=STRING\n"
 msgstr	""
 
-#: src/attrib.c:592
+#: src/attrib.c:667
+#, c-format
 msgid	"#  auto_select=ON/OFF\n"
 msgstr	""
 
-#: src/attrib.c:593
+#: src/attrib.c:668
+#, c-format
 msgid	"#  auto_save=ON/OFF\n"
 msgstr	""
 
-#: src/attrib.c:594
+#: src/attrib.c:669
+#, c-format
 msgid	"#  batch_save=ON/OFF\n"
 msgstr	""
 
-#: src/attrib.c:595
+#: src/attrib.c:670
+#, c-format
 msgid	"#  delete_tmp_files=ON/OFF\n"
 msgstr	""
 
-#: src/attrib.c:596
+#: src/attrib.c:671
+#, c-format
 msgid	"#  show_only_unread=ON/OFF\n"
 msgstr	""
 
-#: src/attrib.c:597
+#: src/attrib.c:672
+#, c-format
 msgid	"#  thread_arts=NUM"
 msgstr	""
 
-#: src/attrib.c:604
+#: src/attrib.c:679
+#, c-format
+msgid	"#  thread_perc=NUM\n"
+msgstr	""
+
+#: src/attrib.c:680
+#, c-format
 msgid	"#  show_author=NUM\n"
 msgstr	""
 
-#: src/attrib.c:610
+#: src/attrib.c:686
+#, c-format
+msgid	"#  show_info=NUM\n"
+msgstr	""
+
+#: src/attrib.c:692
+#, c-format
 msgid	"#  sort_art_type=NUM\n"
 msgstr	""
 
-#: src/attrib.c:628
+#: src/attrib.c:710
+#, c-format
 msgid	"#  sort_threads_type=NUM\n"
 msgstr	""
 
-#: src/attrib.c:633
+#: src/attrib.c:715
+#, c-format
 msgid	"#  post_proc_type=NUM\n"
 msgstr	""
 
-#: src/attrib.c:638
+#: src/attrib.c:720
+#, c-format
 msgid	"#  quick_kill_scope=STRING (ie. talk.*)\n"
 msgstr	""
 
-#: src/attrib.c:639
+#: src/attrib.c:721
+#, c-format
 msgid	"#  quick_kill_expire=ON/OFF\n"
 msgstr	""
 
-#: src/attrib.c:640
+#: src/attrib.c:722
+#, c-format
 msgid	"#  quick_kill_case=ON/OFF\n"
 msgstr	""
 
-#: src/attrib.c:641
+#: src/attrib.c:723
+#, c-format
 msgid	"#  quick_kill_header=NUM\n"
 msgstr	""
 
-#: src/attrib.c:642 src/attrib.c:649
+#: src/attrib.c:724 src/attrib.c:731
+#, c-format
 msgid	"#    0=subj (case sensitive) 1=subj (ignore case)\n"
 msgstr	""
 
-#: src/attrib.c:643 src/attrib.c:650
+#: src/attrib.c:725 src/attrib.c:732
+#, c-format
 msgid	"#    2=from (case sensitive) 3=from (ignore case)\n"
 msgstr	""
 
-#: src/attrib.c:644 src/attrib.c:651
+#: src/attrib.c:726 src/attrib.c:733
+#, c-format
 msgid	"#    4=msgid 5=lines\n"
 msgstr	""
 
-#: src/attrib.c:645
+#: src/attrib.c:727
+#, c-format
 msgid	"#  quick_select_scope=STRING\n"
 msgstr	""
 
-#: src/attrib.c:646
+#: src/attrib.c:728
+#, c-format
 msgid	"#  quick_select_expire=ON/OFF\n"
 msgstr	""
 
-#: src/attrib.c:647
+#: src/attrib.c:729
+#, c-format
 msgid	"#  quick_select_case=ON/OFF\n"
 msgstr	""
 
-#: src/attrib.c:648
+#: src/attrib.c:730
+#, c-format
 msgid	"#  quick_select_header=NUM\n"
 msgstr	""
 
-#: src/attrib.c:652
+#: src/attrib.c:734
+#, c-format
 msgid	"#  x_comment_to=ON/OFF\n"
 msgstr	""
 
-#: src/attrib.c:653
+#: src/attrib.c:735
+#, c-format
+msgid	"#  fcc=STRING (eg. =mailbox)\n"
+msgstr	""
+
+#: src/attrib.c:736
+#, c-format
 msgid	"#  tex2iso_conv=ON/OFF\n"
 msgstr	""
 
-#: src/attrib.c:655
+#: src/attrib.c:737
+#, c-format
+msgid	"#  mime_forward=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:739
+#, c-format
 msgid	"#  mm_network_charset=supported_charset"
 msgstr	""
 
-#: src/attrib.c:662
+#: src/attrib.c:746
+#, c-format
 msgid	"#  undeclared_charset=STRING (default is US-ASCII)\n"
 msgstr	""
 
-#: src/attrib.c:664
+#: src/attrib.c:748
+#, c-format
 msgid	"#\n"
 	"# Note that it is best to put general (global scoping)\n"
 msgstr	""
 
-#: src/attrib.c:665
+#: src/attrib.c:749
+#, c-format
 msgid	"# entries first followed by group specific entries.\n"
 	"#\n"
 msgstr	""
 
-#: src/attrib.c:666
+#: src/attrib.c:750
+#, c-format
 msgid	"############################################################################\n"
 	"\n"
 msgstr	""
 
-#: src/attrib.c:672
+#: src/attrib.c:756
+#, c-format
 msgid	"# include extra headers\n"
 msgstr	""
 
-#: src/attrib.c:680
+#: src/attrib.c:764
+#, c-format
 msgid	"# in *sources* set post process type to shar only\n"
 msgstr	""
 
-#: src/attrib.c:684
-msgid	"# in *binaries* do full post processing, remove tmp files\n"
+#: src/attrib.c:768
+#, c-format
+msgid	"# in *binaries* do full post processing but no TeX2ISO conversion,\n"
 msgstr	""
 
-#: src/attrib.c:685
-msgid	"# and set Followup-To: poster\n"
+#: src/attrib.c:769
+#, c-format
+msgid	"# remove tmp files and set Followup-To: poster\n"
 msgstr	""
 
-#: src/cook.c:799
+#: src/cook.c:499
 msgid	"(unknown)"
 msgstr	""
 
 #.
 #. * TODO: add to the right rule, give better explanation, -> lang.c
 #.
-#: src/filter.c:604 src/filter.c:612
+#: src/filter.c:597 src/filter.c:605
 msgid	"Removed from the previous rule: "
 msgstr	""
 
+#: src/keymap.c:271
+msgid	"NULL"
+msgstr	""
+
 #: src/lang.c:42
-#, c-format
-msgid	"1 Response%s"
+msgid	"1 Response"
 msgstr	""
 
 #: src/lang.c:46
@@ -439,7 +516,8 @@ msgid	"*** Beginning of article ***"
 msgstr	""
 
 #: src/lang.c:97
-msgid	"Cancel (delete) or supersede (overwrite) article [%%.*s]? (%s/%s/%s): "
+#, c-format
+msgid	"Cancel (delete) or supersede (overwrite) article [%%s]? (%s/%s/%s): "
 msgstr	""
 
 #: src/lang.c:98
@@ -528,257 +606,257 @@ msgstr	""
 msgid	"Post-process %s=no, %s=yes, %s=shar, %s=quit: "
 msgstr	""
 
-#: src/lang.c:118
+#: src/lang.c:119
 msgid	"ANSI color disabled"
 msgstr	"ANSI colour disabled"
 
-#: src/lang.c:119
+#: src/lang.c:120
 msgid	"ANSI color enabled"
 msgstr	"ANSI colour enabled"
 
-#: src/lang.c:120
+#: src/lang.c:122
 #, c-format
 msgid	"Command failed: %s"
 msgstr	""
 
-#: src/lang.c:121
+#: src/lang.c:123
 msgid	"Mark not selected articles read?"
 msgstr	""
 
-#: src/lang.c:122
+#: src/lang.c:124
 #, c-format
 msgid	"Connecting to %s..."
 msgstr	""
 
-#: src/lang.c:123
+#: src/lang.c:125
 msgid	"<CR>"
 msgstr	""
 
-#: src/lang.c:124
+#: src/lang.c:126
 msgid	"Creating active file for saved groups...\n"
 msgstr	""
 
-#: src/lang.c:125
+#: src/lang.c:127
 msgid	"Creating newsrc file...\n"
 msgstr	""
 
-#: src/lang.c:127 src/lang.c:1129
+#: src/lang.c:129 src/lang.c:1150
 msgid	"Default"
 msgstr	""
 
-#: src/lang.c:128
+#: src/lang.c:130
 msgid	"Delete saved files that have been post processed?"
 msgstr	""
 
-#: src/lang.c:129
+#: src/lang.c:131
 msgid	"Deleting temporary files..."
 msgstr	""
 
-#: src/lang.c:131
+#: src/lang.c:133
 msgid	"*** End of article ***"
 msgstr	""
 
-#: src/lang.c:132
+#: src/lang.c:134
 msgid	"*** End of articles ***"
 msgstr	""
 
-#: src/lang.c:133
+#: src/lang.c:135
 msgid	"*** End of groups ***"
 msgstr	""
 
-#: src/lang.c:134
+#: src/lang.c:136
 msgid	"*** End of thread ***"
 msgstr	""
 
-#: src/lang.c:135
+#: src/lang.c:137
 msgid	"Enter limit of articles to get> "
 msgstr	""
 
-#: src/lang.c:136
+#: src/lang.c:138
 msgid	"Enter Message-ID to go to> "
 msgstr	""
 
-#: src/lang.c:137
+#: src/lang.c:139
 msgid	" and enter next unread thread"
 msgstr	""
 
-#: src/lang.c:138
+#: src/lang.c:140
 msgid	" and enter next unread group"
 msgstr	""
 
-#: src/lang.c:139
+#: src/lang.c:141
 msgid	"Enter option number> "
 msgstr	""
 
-#: src/lang.c:140
+#: src/lang.c:142
 #, c-format
 msgid	"Enter range [%s]> "
 msgstr	""
 
-#: src/lang.c:141
+#: src/lang.c:143
 msgid	"\n"
 	"Warning: Approved: header used.\n"
 msgstr	""
 
-#: src/lang.c:143
+#: src/lang.c:145
 msgid	"\n"
 	"Error: Bad address in Approved: header.\n"
 msgstr	""
 
-#: src/lang.c:144
+#: src/lang.c:146
 msgid	"\n"
 	"Error: Bad address in From: header.\n"
 msgstr	""
 
-#: src/lang.c:145
+#: src/lang.c:147
 msgid	"\n"
 	"Error: Bad address in Reply-To: header.\n"
 msgstr	""
 
-#: src/lang.c:146
+#: src/lang.c:148
 msgid	"\n"
 	"Error: Bad FQDN in Message-ID: header.\n"
 msgstr	""
 
-#: src/lang.c:147
+#: src/lang.c:149
 #, c-format
 msgid	"Can't unlock %s"
 msgstr	""
 
-#: src/lang.c:149
+#: src/lang.c:151
 #, c-format
 msgid	"Corrupted file %s"
 msgstr	""
 
-#: src/lang.c:150
+#: src/lang.c:152
 #, c-format
 msgid	"Couldn't dotlock %s - article not appended!"
 msgstr	""
 
-#: src/lang.c:151
+#: src/lang.c:153
 #, c-format
 msgid	"Couldn't lock %s - article not appended!"
 msgstr	""
 
-#: src/lang.c:153
+#: src/lang.c:155
 msgid	"Internal error in GNKSA routine - send bug report.\n"
 msgstr	""
 
-#: src/lang.c:154
+#: src/lang.c:156
 msgid	"Left angle bracket missing in route address.\n"
 msgstr	""
 
-#: src/lang.c:155
+#: src/lang.c:157
 msgid	"Left parenthesis missing in old-style address.\n"
 msgstr	""
 
-#: src/lang.c:156
+#: src/lang.c:158
 msgid	"Right parenthesis missing in old-style address.\n"
 msgstr	""
 
-#: src/lang.c:157
+#: src/lang.c:159
 msgid	"At-sign missing in mail address.\n"
 msgstr	""
 
-#: src/lang.c:158
+#: src/lang.c:160
 msgid	"Single component FQDN is not allowed. Add your domain.\n"
 msgstr	""
 
-#: src/lang.c:159
+#: src/lang.c:161
 msgid	"Invalid domain. Send bug report if your top level domain really exists.\n"
 	"Use .invalid as top level domain for munged addresses.\n"
 msgstr	""
 
-#: src/lang.c:160
+#: src/lang.c:162
 msgid	"Illegal domain. Send bug report if your top level domain really exists.\n"
 	"Use .invalid as top level domain for munged addresses.\n"
 msgstr	""
 
-#: src/lang.c:161
+#: src/lang.c:163
 msgid	"Unknown domain. Send bug report if your top level domain really exists.\n"
 	"Use .invalid as top level domain for munged addresses.\n"
 msgstr	""
 
-#: src/lang.c:162
+#: src/lang.c:164
 msgid	"Illegal character in FQDN.\n"
 msgstr	""
 
-#: src/lang.c:163
+#: src/lang.c:165
 msgid	"Zero length FQDN component not allowed.\n"
 msgstr	""
 
-#: src/lang.c:164
+#: src/lang.c:166
 msgid	"FQDN component exceeds maximum allowed length (63 chars).\n"
 msgstr	""
 
-#: src/lang.c:165
+#: src/lang.c:167
 msgid	"FQDN component may not start or end with hyphen.\n"
 msgstr	""
 
-#: src/lang.c:166
+#: src/lang.c:168
 msgid	"FQDN component may not start with digit.\n"
 msgstr	""
 
-#: src/lang.c:167
+#: src/lang.c:169
 msgid	"Domain literal has impossible numeric value.\n"
 msgstr	""
 
-#: src/lang.c:168
+#: src/lang.c:170
 msgid	"Domain literal is for private use only and not allowed for global use.\n"
 msgstr	""
 
-#: src/lang.c:169
+#: src/lang.c:171
 msgid	"Right bracket missing in domain literal.\n"
 msgstr	""
 
-#: src/lang.c:170
+#: src/lang.c:172
 msgid	"Missing localpart of mail address.\n"
 msgstr	""
 
-#: src/lang.c:171
+#: src/lang.c:173
 msgid	"Illegal character in localpart of mail address.\n"
 msgstr	""
 
-#: src/lang.c:172
+#: src/lang.c:174
 msgid	"Zero length localpart component not allowed.\n"
 msgstr	""
 
-#: src/lang.c:173
+#: src/lang.c:175
 msgid	"Illegal character in realname.\n"
 	"Unquoted words may not contain '!()<>@,;:\\.[]' in route addresses.\n"
 msgstr	""
 
-#: src/lang.c:174
+#: src/lang.c:176
 msgid	"Illegal character in realname.\n"
 	"Quoted words may not contain '()<>\\'.\n"
 msgstr	""
 
-#: src/lang.c:175
+#: src/lang.c:177
 msgid	"Illegal character in realname.\n"
 	"Encoded words may not contain '!()<>@,;:\"\\.[]/=' in parameter.\n"
 msgstr	""
 
-#: src/lang.c:176
+#: src/lang.c:178
 msgid	"Bad syntax in encoded word used in realname.\n"
 msgstr	""
 
-#: src/lang.c:177
+#: src/lang.c:179
 msgid	"Illegal character in realname.\n"
 	"Unquoted words may not contain '()<>\\' in old-style addresses.\n"
 msgstr	""
 
-#: src/lang.c:178
+#: src/lang.c:180
 msgid	"Illegal character in realname.\n"
 	"Control characters and unencoded 8bit characters > 127 are not allowed.\n"
 msgstr	""
 
-#: src/lang.c:179
+#: src/lang.c:181
 msgid	"\n"
 	"Error: No blank line found after header.\n"
 msgstr	""
 
 #. TODO: fixme, US-ASCII is not the only 7bit charset we know about
-#: src/lang.c:181
+#: src/lang.c:183
 msgid	"\n"
 	"Error: Posting contains non-ASCII characters but MM_CHARSET is set to\n"
 	"       US-ASCII  - please change this setting to a suitable value for\n"
@@ -786,7 +864,7 @@ msgid	"\n"
 	"       editing tinrc.\n"
 msgstr	""
 
-#: src/lang.c:186
+#: src/lang.c:188
 msgid	"\n"
 	"Error: Posting contains  non-ASCII characters  but the  MIME encoding\n"
 	"       for news  messages  is set  to \"7bit\"  -  please change this\n"
@@ -795,171 +873,179 @@ msgid	"\n"
 	"       using the M)enu of configurable options or by editing tinrc.\n"
 msgstr	""
 
-#: src/lang.c:192
+#: src/lang.c:194
 msgid	"\n"
 	"Error: Article starts with blank line instead of header\n"
 msgstr	""
 
-#: src/lang.c:193
+#: src/lang.c:195
 #, c-format
 msgid	"\n"
 	"Error: Header on line %d does not have a colon after the header name:\n"
 	"%s\n"
 msgstr	""
 
-#: src/lang.c:194
+#: src/lang.c:196
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line is empty.\n"
 msgstr	""
 
-#: src/lang.c:195
+#: src/lang.c:197
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line is missing from the article header.\n"
 msgstr	""
 
-#: src/lang.c:196
+#: src/lang.c:198
 #, c-format
 msgid	"\n"
 	"Error: Header on line %d does not have a space after the colon:\n"
 	"%s\n"
 msgstr	""
 
-#: src/lang.c:197
+#: src/lang.c:199
 #, c-format
 msgid	"\n"
 	"Error: There are multiple (%d) \"%s:\" lines in the header.\n"
 msgstr	""
 
-#: src/lang.c:198
+#: src/lang.c:200
 #, c-format
 msgid	"Insecure permissions of %s (%o)"
 msgstr	""
 
-#: src/lang.c:199 src/open.c:1009
+#: src/lang.c:201
 #, c-format
 msgid	"Invalid response to GROUP command, %s"
 msgstr	""
 
-#: src/lang.c:201
+#: src/lang.c:203
 #, c-format
 msgid	"MIME parse error: Unexpected end of %s/%s article"
 msgstr	""
 
-#: src/lang.c:202
+#: src/lang.c:204
 msgid	"MIME parse error: Start boundary whilst reading headers"
 msgstr	""
 
-#: src/lang.c:203
+#: src/lang.c:205
 msgid	"Can't get a (fully-qualified) domain-name!"
 msgstr	""
 
-#: src/lang.c:204
+#: src/lang.c:206
 #, c-format
 msgid	"No permissions to go into %s\n"
 msgstr	""
 
-#: src/lang.c:205
+#: src/lang.c:207
 msgid	"\n"
 	"Error: From: line missing.\n"
 msgstr	""
 
-#: src/lang.c:206
+#: src/lang.c:208
 #, c-format
 msgid	"No read permissions for %s\n"
 msgstr	""
 
-#: src/lang.c:207
+#: src/lang.c:209
 #, c-format
 msgid	"File %s does not exist\n"
 msgstr	""
 
-#: src/lang.c:208
+#: src/lang.c:210
 #, c-format
 msgid	"No write permissions for %s\n"
 msgstr	""
 
-#: src/lang.c:209
+#: src/lang.c:211
 msgid	"Can't get user information (/etc/passwd missing?)"
 msgstr	""
 
-#: src/lang.c:210
+#: src/lang.c:212
 msgid	"errors"
 msgstr	""
 
-#: src/lang.c:211
+#: src/lang.c:213
 #, c-format
 msgid	"\n"
 	"Error on line %d: \"Sender:\" header not allowed (it will be added for you)\n"
 msgstr	""
 
-#: src/lang.c:212
+#: src/lang.c:214
 #, c-format
 msgid	"Server has non of the groups listed in %s"
 msgstr	""
 
-#: src/lang.c:213
+#: src/lang.c:215
 msgid	"error"
 msgstr	""
 
-#: src/lang.c:214
+#: src/lang.c:216
 msgid	"Unknown display level"
 msgstr	""
 
-#: src/lang.c:215
+#: src/lang.c:217
 msgid	"<ESC>"
 msgstr	""
 
-#: src/lang.c:216
+#: src/lang.c:218
 msgid	"Exiting..."
 msgstr	""
 
-#: src/lang.c:217
+#: src/lang.c:219
 msgid	"leaving external mail-reader"
 msgstr	""
 
-#: src/lang.c:218
+#: src/lang.c:220
 #, c-format
 msgid	"Extracting %s..."
 msgstr	""
 
-#: src/lang.c:220
+#: src/lang.c:222
 #, c-format
 msgid	"Error writing %s file. Filesystem full? File reset to previous state."
 msgstr	""
 
-#: src/lang.c:221
+#: src/lang.c:223
 #, c-format
 msgid	"Error making backup of %s file. Filesystem full?"
 msgstr	""
 
-#: src/lang.c:222
+#: src/lang.c:224
 #, c-format
 msgid	"Filtering global rules (%d/%d)..."
 msgstr	""
 
-#: src/lang.c:223
+#: src/lang.c:225
 msgid	"Rule created by: "
 msgstr	""
 
-#: src/lang.c:224
+#: src/lang.c:226
 #, c-format
 msgid	"Enter pattern [%s]> "
 msgstr	""
 
-#: src/lang.c:225
+#: src/lang.c:227
 #, c-format
 msgid	"\n"
 	"You requested followups to your article to go to the following %s:\n"
 msgstr	""
 
-#: src/lang.c:226
+#: src/lang.c:228
 #, c-format
 msgid	"  %s\t Answers will be directed to you by mail.\n"
 msgstr	""
 
-#: src/lang.c:227
+#: src/lang.c:229
+msgid	"-- forwarded message --\n"
+msgstr	""
+
+#: src/lang.c:230
+msgid	"-- end of forwarded message --\n"
+msgstr	""
+
+#: src/lang.c:231
 msgid	"# Format:\n"
 	"#   comment=STRING    Optional. Multiple lines allowed. Comments must be "
 	"placed\n"
@@ -988,720 +1074,742 @@ msgid	"# Format:\n"
 	"#\n"
 msgstr	""
 
-#: src/lang.c:248
+#: src/lang.c:252
 #, c-format
 msgid	"Enter score for rule (default=%d): "
 msgstr	""
 
-#: src/lang.c:249
+#: src/lang.c:253
 #, c-format
 msgid	"Enter the score weight (range 0 < score <= %d)"
 msgstr	""
 
 #. SCORE_MAX
-#: src/lang.c:250
+#: src/lang.c:254
 msgid	"Full"
 msgstr	""
 
-#: src/lang.c:251
+#: src/lang.c:255
 msgid	"Comment (optional)  : "
 msgstr	""
 
-#: src/lang.c:252
+#: src/lang.c:256
 msgid	"Apply pattern to    : "
 msgstr	""
 
-#: src/lang.c:253
+#: src/lang.c:257
 msgid	"From: line (ignore case)      "
 msgstr	""
 
-#: src/lang.c:254
+#: src/lang.c:258
 msgid	"From: line (case sensitive)   "
 msgstr	""
 
-#: src/lang.c:256
+#: src/lang.c:260
 #, c-format
 msgid	"%s%s: Unknown host.\n"
 msgstr	""
 
-#: src/lang.c:257
+#: src/lang.c:261
 msgid	"global "
 msgstr	""
 
-#: src/lang.c:258
+#: src/lang.c:262
 #, c-format
 msgid	"Please use %.100s instead"
 msgstr	""
 
-#: src/lang.c:259
+#: src/lang.c:263
+#, c-format
+msgid	"%s is bogus"
+msgstr	""
+
+#: src/lang.c:264
 #, c-format
 msgid	"Group %s is moderated. Continue?"
 msgstr	""
 
-#: src/lang.c:260
+#: src/lang.c:265
 msgid	"groups"
 msgstr	""
 
-#: src/lang.c:261
+#: src/lang.c:266
+#, c-format
+msgid	"Rereading %s..."
+msgstr	""
+
+#: src/lang.c:267
 msgid	"Top Level Commands"
 msgstr	""
 
-#: src/lang.c:262
+#: src/lang.c:268
 msgid	"Group Selection"
 msgstr	""
 
-#: src/lang.c:263
+#: src/lang.c:269
 msgid	"group"
 msgstr	""
 
-#: src/lang.c:265
+#: src/lang.c:271
 msgid	"One or more lines of comment. <CR> to add a line or proceed if line is empty."
 msgstr	""
 
-#: src/lang.c:266
+#: src/lang.c:272
 msgid	"From: line to add to filter file. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:267
+#: src/lang.c:273
 msgid	"Linecount of articles to be filtered. < for less, > for more, = for equal."
 msgstr	""
 
-#: src/lang.c:268
+#: src/lang.c:274
 msgid	"Message-ID: line to add to filter file. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:269
+#: src/lang.c:275
 msgid	"Subject: line to add to filter file. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:270
+#: src/lang.c:276
 msgid	"Enter text pattern to filter if Subject: & From: lines are not what you want."
 msgstr	""
 
-#: src/lang.c:271
+#: src/lang.c:277
 msgid	"Select where text pattern should be applied. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:272
+#: src/lang.c:278
 msgid	"Expiration time in days for the entered filter. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:273
+#: src/lang.c:279
 msgid	"Apply kill only to current group or all groups. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:274
+#: src/lang.c:280
 msgid	"Apply select to current group or all groups. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:275
+#: src/lang.c:281
 msgid	"kill an article via a menu"
 msgstr	""
 
-#: src/lang.c:276
+#: src/lang.c:282
 msgid	"auto-select (hot) an article via a menu"
 msgstr	""
 
-#: src/lang.c:277
+#: src/lang.c:283
 msgid	"Browse URLs in article"
 msgstr	""
 
-#: src/lang.c:278
+#: src/lang.c:284
 msgid	"0 - 9\t  display article by number in current thread"
 msgstr	""
 
-#: src/lang.c:279
-msgid	"cancel (delete) current article; must have been posted by you"
+#: src/lang.c:285
+msgid	"cancel (delete) or supersede (overwrite) current article"
 msgstr	""
 
-#: src/lang.c:280
+#: src/lang.c:286
 msgid	"edit article (mail-groups only)"
 msgstr	""
 
-#: src/lang.c:281
+#: src/lang.c:287
 msgid	"display first article in current thread"
 msgstr	""
 
-#: src/lang.c:282
+#: src/lang.c:288
 msgid	"display first page of article"
 msgstr	""
 
-#: src/lang.c:283
+#: src/lang.c:289
 msgid	"post followup to current article"
 msgstr	""
 
-#: src/lang.c:284
+#: src/lang.c:290
 msgid	"post followup (don't copy text) to current article"
 msgstr	""
 
-#: src/lang.c:285
+#: src/lang.c:291
 msgid	"post followup to current article quoting complete headers"
 msgstr	""
 
-#: src/lang.c:286
+#: src/lang.c:292
 msgid	"display last article in current thread"
 msgstr	""
 
-#: src/lang.c:287
+#: src/lang.c:293
 msgid	"display last page of article"
 msgstr	""
 
-#: src/lang.c:288
+#: src/lang.c:294
 msgid	"mark rest of thread as read and advance to next unread"
 msgstr	""
 
-#: src/lang.c:289
+#: src/lang.c:295
 msgid	"display next article"
 msgstr	""
 
-#: src/lang.c:290
+#: src/lang.c:296
 msgid	"display first article in next thread"
 msgstr	""
 
-#: src/lang.c:291 src/lang.c:298 src/lang.c:357 src/lang.c:358
+#: src/lang.c:297
 msgid	"display next unread article"
 msgstr	""
 
-#: src/lang.c:292
+#: src/lang.c:298
 msgid	"go to the article that this one followed up"
 msgstr	""
 
-#: src/lang.c:293
+#: src/lang.c:299
 msgid	"display previous article"
 msgstr	""
 
-#: src/lang.c:294 src/lang.c:360
+#: src/lang.c:300
 msgid	"display previous unread article"
 msgstr	""
 
-#: src/lang.c:295
+#: src/lang.c:301
 msgid	"quickly kill an article using defaults"
 msgstr	""
 
-#: src/lang.c:296
+#: src/lang.c:302
 msgid	"quickly auto-select (hot) an article using defaults"
 msgstr	""
 
-#: src/lang.c:297
+#: src/lang.c:303
 msgid	"return to group selection level"
 msgstr	""
 
-#: src/lang.c:299
+#: src/lang.c:304
 msgid	"reply through mail to author"
 msgstr	""
 
-#: src/lang.c:300
+#: src/lang.c:305
 msgid	"reply through mail (don't copy text) to author"
 msgstr	""
 
-#: src/lang.c:301
+#: src/lang.c:306
 msgid	"reply through mail to author quoting complete headers"
 msgstr	""
 
-#: src/lang.c:302 src/lang.c:362
+#: src/lang.c:307
 msgid	"repost chosen article to another group"
 msgstr	""
 
-#: src/lang.c:303
+#: src/lang.c:308
 msgid	"search backwards within this article"
 msgstr	""
 
-#: src/lang.c:304
+#: src/lang.c:309
 msgid	"search forwards within this article"
 msgstr	""
 
-#: src/lang.c:305
+#: src/lang.c:310
 msgid	"show article in raw-mode (including all headers)"
 msgstr	""
 
-#: src/lang.c:306
+#: src/lang.c:311
 msgid	"skip next block of included text"
 msgstr	""
 
-#: src/lang.c:307
+#: src/lang.c:312
 msgid	"toggle display of sections hidden by a form-feed (^L) on/off"
 msgstr	""
 
-#: src/lang.c:308
+#: src/lang.c:313
 msgid	"toggle word highlighting on/off"
 msgstr	""
 
-#: src/lang.c:309
+#: src/lang.c:314
 msgid	"toggle ROT-13 (basic decode) for current article"
 msgstr	""
 
-#: src/lang.c:310
+#: src/lang.c:315
 msgid	"toggle tabwidth 4 <-> 8"
 msgstr	""
 
-#: src/lang.c:311
+#: src/lang.c:316
 msgid	"toggle german TeX style decoding for current article"
 msgstr	""
 
-#: src/lang.c:312
+#: src/lang.c:317
 msgid	"toggle display of uuencoded sections"
 msgstr	""
 
-#: src/lang.c:313
+#: src/lang.c:318
 msgid	"View/save multimedia attachments"
 msgstr	""
 
-#: src/lang.c:314
+#: src/lang.c:319
 #, c-format
 msgid	"report bug or comment via mail to %s"
 msgstr	""
 
-#: src/lang.c:315
+#: src/lang.c:320
 msgid	"choose range of articles to be affected by next command"
 msgstr	""
 
-#: src/lang.c:316
+#: src/lang.c:321
 msgid	"escape from command prompt"
 msgstr	""
 
-#: src/lang.c:317
+#: src/lang.c:322
+msgid	"edit filter file"
+msgstr	""
+
+#: src/lang.c:323
 msgid	"get help"
 msgstr	""
 
-#: src/lang.c:318
+#: src/lang.c:324
 msgid	"display last article viewed"
 msgstr	""
 
-#: src/lang.c:319
+#: src/lang.c:325
 msgid	"down one line"
 msgstr	""
 
-#: src/lang.c:320
+#: src/lang.c:326
 msgid	"up one line"
 msgstr	""
 
-#: src/lang.c:321
+#: src/lang.c:327
 msgid	"go to article chosen by Message-ID"
 msgstr	""
 
-#: src/lang.c:322
+#: src/lang.c:328
 msgid	"mail article/thread/hot/pattern/tagged articles to someone"
 msgstr	""
 
-#: src/lang.c:323
+#: src/lang.c:329
 msgid	"menu of configurable options"
 msgstr	""
 
-#: src/lang.c:324
+#: src/lang.c:330
 msgid	"down one page"
 msgstr	""
 
-#: src/lang.c:325
+#: src/lang.c:331
 msgid	"up one page"
 msgstr	""
 
-#: src/lang.c:326
+#: src/lang.c:332
 msgid	"post (write) article to current group"
 msgstr	""
 
-#: src/lang.c:327
+#: src/lang.c:333
 msgid	"post postponed articles"
 msgstr	""
 
-#: src/lang.c:328
+#: src/lang.c:334
 msgid	"list articles posted by you (from posted file)"
 msgstr	""
 
-#: src/lang.c:329
+#: src/lang.c:335
 msgid	"return to previous menu"
 msgstr	""
 
-#: src/lang.c:330
+#: src/lang.c:336
 msgid	"quit tin immediately"
 msgstr	""
 
-#: src/lang.c:331
+#: src/lang.c:337
 msgid	"redraw page"
 msgstr	""
 
-#: src/lang.c:332
+#: src/lang.c:338
 msgid	"save article/thread/hot/pattern/tagged articles to file"
 msgstr	""
 
-#: src/lang.c:333
+#: src/lang.c:339
 msgid	"save marked articles automatically without user prompts"
 msgstr	""
 
-#: src/lang.c:334
+#: src/lang.c:340
+msgid	"scroll the screen one line down"
+msgstr	""
+
+#: src/lang.c:341
+msgid	"scroll the screen one line up"
+msgstr	""
+
+#: src/lang.c:342
 msgid	"search for articles by author backwards"
 msgstr	""
 
-#: src/lang.c:335
+#: src/lang.c:343
 msgid	"search for articles by author forwards"
 msgstr	""
 
-#: src/lang.c:336
+#: src/lang.c:344
 msgid	"search all articles for a given string (this may take some time)"
 msgstr	""
 
-#: src/lang.c:337
+#: src/lang.c:345
 msgid	" \t  (searches are case-insensitive and wrap around to all articles)"
 msgstr	""
 
-#: src/lang.c:338
+#: src/lang.c:346
 msgid	"search for articles by Subject line backwards"
 msgstr	""
 
-#: src/lang.c:339
+#: src/lang.c:347
 msgid	"search for articles by Subject line forwards"
 msgstr	""
 
-#: src/lang.c:340
+#: src/lang.c:348
 msgid	"repeat last search"
 msgstr	""
 
-#: src/lang.c:341
+#: src/lang.c:349
 msgid	"tag current article for reposting/mailing/piping/printing/saving"
 msgstr	""
 
-#: src/lang.c:342
+#: src/lang.c:350
 msgid	"toggle info message in last line (subject/description)"
 msgstr	""
 
-#: src/lang.c:343
+#: src/lang.c:351
 msgid	"toggle inverse video"
 msgstr	""
 
-#: src/lang.c:344
+#: src/lang.c:352
 msgid	"toggle mini help menu display"
 msgstr	""
 
-#: src/lang.c:345
+#: src/lang.c:353
+msgid	"cycle the display of authors email address, real name, both or neither"
+msgstr	""
+
+#: src/lang.c:354
 msgid	"show version information"
 msgstr	""
 
-#: src/lang.c:346
+#: src/lang.c:355
 msgid	"mark all articles as read and return to group selection menu"
 msgstr	""
 
-#: src/lang.c:347
+#: src/lang.c:356
 msgid	"mark all articles as read and enter next group with unread articles"
 msgstr	""
 
-#: src/lang.c:348
+#: src/lang.c:357
 msgid	"choose first thread in list"
 msgstr	""
 
-#: src/lang.c:349 src/lang.c:380
-msgid	"choose group by name"
-msgstr	""
-
-#: src/lang.c:350
+#: src/lang.c:358
 msgid	"choose last thread in list"
 msgstr	""
 
-#: src/lang.c:351
+#: src/lang.c:359
 msgid	"list articles within current thread (bring up Thread sub-menu)"
 msgstr	""
 
-#: src/lang.c:352
+#: src/lang.c:360
 msgid	"mark article as unread"
 msgstr	""
 
-#: src/lang.c:353
+#: src/lang.c:361
 msgid	"mark current thread or tagged threads as read"
 msgstr	""
 
-#: src/lang.c:354
+#: src/lang.c:362
 msgid	"mark thread as unread"
 msgstr	""
 
-#: src/lang.c:355
+#: src/lang.c:363
 msgid	"toggle display of all/selected articles"
 msgstr	""
 
-#: src/lang.c:356
+#: src/lang.c:364
 msgid	"display next group"
 msgstr	""
 
-#: src/lang.c:359
+#: src/lang.c:365
 msgid	"display previous group"
 msgstr	""
 
-#: src/lang.c:361 src/lang.c:409
-msgid	"read chosen article"
-msgstr	""
-
-#: src/lang.c:363
+#: src/lang.c:366
 msgid	"toggle all selections (all articles)"
 msgstr	""
 
-#: src/lang.c:364
+#: src/lang.c:367
 msgid	"select group (make \"hot\")"
 msgstr	""
 
-#: src/lang.c:365
+#: src/lang.c:368
 msgid	"select thread"
 msgstr	""
 
-#: src/lang.c:366
+#: src/lang.c:369
 msgid	"select threads if at least one unread article is selected"
 msgstr	""
 
-#: src/lang.c:367
+#: src/lang.c:370
 msgid	"select threads that match user specified pattern"
 msgstr	""
 
-#: src/lang.c:368
+#: src/lang.c:371
 msgid	"tag all parts of current multipart-message in order"
 msgstr	""
 
-#: src/lang.c:369
+#: src/lang.c:372
 msgid	"0 - 9\t  choose thread by number"
 msgstr	""
 
-#: src/lang.c:370
+#: src/lang.c:373
 msgid	"toggle limit number of articles to get, and reload"
 msgstr	""
 
-#: src/lang.c:371
+#: src/lang.c:374
 msgid	"toggle display of all/unread articles"
 msgstr	""
 
-#: src/lang.c:372 src/lang.c:410
-msgid	"cycle the display of authors email address, real name, both or neither"
-msgstr	""
-
-#: src/lang.c:373
+#: src/lang.c:375
 msgid	"toggle selection of thread"
 msgstr	""
 
-#: src/lang.c:374
+#: src/lang.c:376
 msgid	"cycle through threading options available"
 msgstr	""
 
-#: src/lang.c:375
+#: src/lang.c:377
 msgid	"undo all selections (all articles)"
 msgstr	""
 
-#: src/lang.c:376
+#: src/lang.c:378
 msgid	"untag all tagged threads"
 msgstr	""
 
-#: src/lang.c:377
+#: src/lang.c:379
 msgid	"mark all articles in group as read"
 msgstr	""
 
-#: src/lang.c:378
+#: src/lang.c:380
 msgid	"mark all articles in group as read and move to next unread group"
 msgstr	""
 
-#: src/lang.c:379
+#: src/lang.c:381
 msgid	"choose first group in list"
 msgstr	""
 
-#: src/lang.c:381
+#: src/lang.c:382
+msgid	"choose group by name"
+msgstr	""
+
+#: src/lang.c:383
 msgid	"0 - 9\t  choose group by number"
 msgstr	""
 
-#: src/lang.c:382
+#: src/lang.c:384
 msgid	"choose range of groups to be affected by next command"
 msgstr	""
 
-#: src/lang.c:383
+#: src/lang.c:385
 msgid	"choose last group in list"
 msgstr	""
 
-#: src/lang.c:384
+#: src/lang.c:386
 msgid	"mark all articles in chosen group unread"
 msgstr	""
 
-#: src/lang.c:385
+#: src/lang.c:387
 msgid	"move chosen group within list"
 msgstr	""
 
-#: src/lang.c:386
+#: src/lang.c:388
 msgid	"choose next group with unread news"
 msgstr	""
 
-#: src/lang.c:387 src/lang.c:1176
+#: src/lang.c:389 src/lang.c:1197
 msgid	"quit"
 msgstr	""
 
-#: src/lang.c:388
+#: src/lang.c:390
 msgid	"quit without saving configuration changes"
 msgstr	""
 
-#: src/lang.c:389
+#: src/lang.c:391
 msgid	"read chosen group"
 msgstr	""
 
-#: src/lang.c:390
+#: src/lang.c:392
 msgid	"reset .newsrc (all available articles in groups marked unread)"
 msgstr	""
 
-#: src/lang.c:391
+#: src/lang.c:393
 msgid	"search backwards for a group name"
 msgstr	""
 
-#: src/lang.c:392
+#: src/lang.c:394
 msgid	" \t  (all searches are case-insensitive and wrap around)"
 msgstr	""
 
-#: src/lang.c:393
+#: src/lang.c:395
 msgid	"search forwards for a group name"
 msgstr	""
 
-#: src/lang.c:394
+#: src/lang.c:396
 msgid	"subscribe to chosen group"
 msgstr	""
 
-#: src/lang.c:395
+#: src/lang.c:397
 msgid	"subscribe to groups that match pattern"
 msgstr	""
 
-#: src/lang.c:396
+#: src/lang.c:398
 msgid	"reread active file to check for any new news"
 msgstr	""
 
-#: src/lang.c:397
+#: src/lang.c:399
 msgid	"toggle display of group name only or group name plus description"
 msgstr	""
 
-#: src/lang.c:398
+#: src/lang.c:400
 msgid	"toggle display to show all/unread subscribed groups"
 msgstr	""
 
-#: src/lang.c:399
+#: src/lang.c:401
 msgid	"unsubscribe from chosen group"
 msgstr	""
 
-#: src/lang.c:400
+#: src/lang.c:402
 msgid	"unsubscribe from groups that match pattern"
 msgstr	""
 
-#: src/lang.c:401
+#: src/lang.c:403
 msgid	"sort the list of groups"
 msgstr	""
 
-#: src/lang.c:402
+#: src/lang.c:404
 msgid	"toggle display to show all/subscribed groups"
 msgstr	""
 
-#: src/lang.c:403
+#: src/lang.c:405
 msgid	"0 - 9\t  choose article by number"
 msgstr	""
 
-#: src/lang.c:404
+#: src/lang.c:406
 msgid	"mark thread as read and return to group index page"
 msgstr	""
 
-#: src/lang.c:405
+#: src/lang.c:407
 msgid	"mark thread as read and enter next unread thread or group"
 msgstr	""
 
-#: src/lang.c:406
+#: src/lang.c:408
 msgid	"choose first article in list"
 msgstr	""
 
-#: src/lang.c:407
+#: src/lang.c:409
 msgid	"choose last article in list"
 msgstr	""
 
-#: src/lang.c:408
+#: src/lang.c:410
 msgid	"mark article or tagged articles as read and move cursor to next unread article"
 msgstr	""
 
 #: src/lang.c:411
+msgid	"read chosen article"
+msgstr	""
+
+#: src/lang.c:412
 msgid	"Display properties\n"
 	"------------------"
 msgstr	""
 
-#: src/lang.c:412
+#: src/lang.c:413
 msgid	"Miscellaneous\n"
 	"-------------"
 msgstr	""
 
-#: src/lang.c:413
+#: src/lang.c:414
 msgid	"Moving around\n"
 	"-------------"
 msgstr	""
 
-#: src/lang.c:414
+#: src/lang.c:415
 msgid	"Group/thread/article operations\n"
 	"-------------------------------"
 msgstr	""
 
-#: src/lang.c:416
+#: src/lang.c:417
 msgid	"Group Level Commands"
 msgstr	""
 
-#: src/lang.c:417
+#: src/lang.c:418
 msgid	"Kill filter added"
 msgstr	""
 
-#: src/lang.c:418
+#: src/lang.c:419
 msgid	"Auto-selection filter added"
 msgstr	""
 
-#: src/lang.c:419
+#: src/lang.c:420
 msgid	"All parts tagged"
 msgstr	""
 
-#: src/lang.c:420
+#: src/lang.c:421
 msgid	"Storing article for later posting"
 msgstr	""
 
-#: src/lang.c:421
+#: src/lang.c:422
 msgid	"Please enter a valid character"
 msgstr	""
 
-#: src/lang.c:422
+#: src/lang.c:423
 #, c-format
 msgid	"Missing part #%d"
 msgstr	""
 
-#: src/lang.c:423
+#: src/lang.c:424
 msgid	"*** No postponed articles ***"
 msgstr	""
 
-#: src/lang.c:424
+#: src/lang.c:425
 msgid	"Not a multi-part message"
 msgstr	""
 
-#: src/lang.c:425
+#: src/lang.c:426
 msgid	"You are not subscribed to this group"
 msgstr	""
 
-#: src/lang.c:426
+#: src/lang.c:427
 msgid	"No previous expression"
 msgstr	""
 
-#: src/lang.c:427
+#: src/lang.c:428
 msgid	"Operation disabled in no-overwrite mode"
 msgstr	""
 
 #. TODO: replace hardcoded key-name in txt_info_postponed
-#: src/lang.c:429
+#: src/lang.c:430
 #, c-format
 msgid	"%d postponed %s, reuse with ^O...\n"
 msgstr	""
 
-#: src/lang.c:430
+#: src/lang.c:431
 msgid	"X-Conversion-Note: multipart/alternative contents have been removed.\n"
 	"  To get the whole article, turn alternative handling OFF in the Option Menu\n"
 msgstr	""
 
-#: src/lang.c:432
+#: src/lang.c:433
 #, c-format
 msgid	"Save filename for %s/%s is a mailbox. Attachment not saved"
 msgstr	""
 
-#: src/lang.c:433
+#: src/lang.c:434
 msgid	"TeX2Iso encoded article"
 msgstr	""
 
-#: src/lang.c:434
+#: src/lang.c:435
 msgid	"incomplete "
 msgstr	""
 
 #. TODO: replace hardcoded key-names
-#: src/lang.c:436
+#: src/lang.c:437
 #, c-format
 msgid	"\n"
 	"Welcome to %s, a full screen threaded Netnews reader. It can read news "
@@ -1737,415 +1845,418 @@ msgid	"\n"
 	"Please send bug-reports/comments to %s with the 'R' command.\n"
 msgstr	""
 
-#: src/lang.c:452
+#: src/lang.c:453
 #, c-format
 msgid	"Invalid  From: %s  line. Read the INSTALL file again."
 msgstr	""
 
-#: src/lang.c:453
+#: src/lang.c:455
+msgid	"Invalid multibyte sequence found\n"
+msgstr	""
+
+#: src/lang.c:457
 #, c-format
 msgid	"Invalid  Sender:-header %s"
 msgstr	""
 
-#: src/lang.c:454
+#: src/lang.c:458
 msgid	"Inverse video disabled"
 msgstr	""
 
-#: src/lang.c:455
+#: src/lang.c:459
 msgid	"Inverse video enabled"
 msgstr	""
 
-#: src/lang.c:457
+#: src/lang.c:461
 #, c-format
 msgid	"Missing definition for %s\n"
 msgstr	""
 
-#: src/lang.c:458
+#: src/lang.c:462
 #, c-format
 msgid	"Invalid key definition '%s'\n"
 msgstr	""
 
-#: src/lang.c:459
+#: src/lang.c:463
 #, c-format
 msgid	"Invalid keyname '%s'\n"
 msgstr	""
 
-#: src/lang.c:460
+#: src/lang.c:464
 #, c-format
-msgid	"Key '%s' is defined for both %s%s and %s%s\n"
+msgid	"Keymap file was upgraded to version %s\n"
 msgstr	""
 
-#: src/lang.c:461
+#: src/lang.c:465
 #, c-format
-msgid	"Kill From:     [%-*.*s] (y/n): "
+msgid	"Kill From:     [%s] (y/n): "
 msgstr	""
 
-#: src/lang.c:462
+#: src/lang.c:466
 msgid	"Kill Lines: (</>num): "
 msgstr	""
 
-#: src/lang.c:463
+#: src/lang.c:467
 msgid	"Kill Article Menu"
 msgstr	""
 
-#: src/lang.c:464
+#: src/lang.c:468
 #, c-format
-msgid	"Kill Msg-Id:   [%-*.*s] (f/l/o/n): "
+msgid	"Kill Msg-Id:   [%s] (f/l/o/n): "
 msgstr	""
 
-#: src/lang.c:465
+#: src/lang.c:469
 msgid	"Kill pattern scope  : "
 msgstr	""
 
-#: src/lang.c:466
+#: src/lang.c:470
 #, c-format
-msgid	"Kill Subject:  [%-*.*s] (y/n): "
+msgid	"Kill Subject:  [%s] (y/n): "
 msgstr	""
 
-#: src/lang.c:467
+#: src/lang.c:471
 msgid	"Kill text pattern   : "
 msgstr	""
 
-#: src/lang.c:468
+#: src/lang.c:472
 msgid	"Kill time in days   : "
 msgstr	""
 
-#: src/lang.c:470
+#: src/lang.c:474
 msgid	"Last"
 msgstr	""
 
-#: src/lang.c:471
+#: src/lang.c:475
 msgid	"-- Last response --"
 msgstr	""
 
-#: src/lang.c:472
+#: src/lang.c:476
 #, c-format
 msgid	"Lines %s  "
 msgstr	""
 
-#: src/lang.c:474
+#: src/lang.c:478
 msgid	"Message-ID: line              "
 msgstr	""
 
-#: src/lang.c:476
+#: src/lang.c:479
+msgid	"Mail"
+msgstr	""
+
+#: src/lang.c:480
 msgid	"mailbox "
 msgstr	""
 
-#: src/lang.c:477
+#: src/lang.c:481
 #, c-format
 msgid	"Mail article(s) to [%.*s]> "
 msgstr	""
 
-#: src/lang.c:478
+#: src/lang.c:482
 #, c-format
 msgid	"Mailing log to %s\n"
 msgstr	""
 
-#: src/lang.c:479
+#: src/lang.c:483
 msgid	"Mail bug report..."
 msgstr	""
 
-#: src/lang.c:480
+#: src/lang.c:484
 #, c-format
 msgid	"Mail BUG REPORT to %s?"
 msgstr	""
 
-#: src/lang.c:481
+#: src/lang.c:485
 msgid	"Mailed"
 msgstr	""
 
-#: src/lang.c:482
+#: src/lang.c:486
 #, c-format
 msgid	"Mailing to %s..."
 msgstr	""
 
-#: src/lang.c:483
+#: src/lang.c:487
 msgid	"# [Mail/Save] active file. Format is like news active file:\n"
 	"#   groupname  max.artnum  min.artnum  /dir\n"
 	"# The 4th field is the basedir (ie. ~/Mail or ~/News)\n"
 	"#\n"
 msgstr	""
 
-#: src/lang.c:486
+#: src/lang.c:490
 #, c-format
 msgid	"%s marked as unread"
 msgstr	""
 
-#: src/lang.c:487
+#: src/lang.c:491
 #, c-format
 msgid	"Marked %d of %d tagged %s as read"
 msgstr	""
 
-#: src/lang.c:488
+#: src/lang.c:492
 #, c-format
 msgid	"Mark all articles as read%s?"
 msgstr	""
 
-#: src/lang.c:489
+#: src/lang.c:493
 #, c-format
 msgid	"Mark %s=tagged articles, %s=current article, %s=quit: "
 msgstr	""
 
-#: src/lang.c:490
+#: src/lang.c:494
 #, c-format
-msgid	"Mark group %.*s as read?"
+msgid	"Mark group %s as read?"
 msgstr	""
 
-#: src/lang.c:491
+#: src/lang.c:495
 #, c-format
 msgid	"Mark thread as read%s?"
 msgstr	""
 
-#: src/lang.c:492
+#: src/lang.c:496
 #, c-format
 msgid	"Mark %s=tagged articles/threads, %s=current thread, %s=quit: "
 msgstr	""
 
-#: src/lang.c:493
+#: src/lang.c:497
 #, c-format
 msgid	"Matching %s groups..."
 msgstr	""
 
-#: src/lang.c:494 src/lang.c:498
+#: src/lang.c:498 src/lang.c:502
 #, c-format
 msgid	"<n>=set current to n; %s=next unread; %s=search pattern; %s=kill/select"
 msgstr	""
 
-#: src/lang.c:495
+#: src/lang.c:499
 #, c-format
 msgid	"%s=author search; %s=catchup; %s=line down; %s=line up; %s=mark read; %s=list "
 	"thread"
 msgstr	""
 
-#: src/lang.c:496
+#: src/lang.c:500
 #, c-format
 msgid	"%s=line up; %s=line down; %s=page up; %s=page down; %s=top; %s=bottom"
 msgstr	""
 
-#: src/lang.c:497
+#: src/lang.c:501
 #, c-format
 msgid	"%s=search forwards; %s=search backwards; %s=quit"
 msgstr	""
 
-#: src/lang.c:499
+#: src/lang.c:503
 #, c-format
 msgid	"%s=author search; %s=body search; %s=catchup; %s=followup; %s=mark read"
 msgstr	""
 
-#: src/lang.c:500
+#: src/lang.c:504
 #, c-format
 msgid	"<n>=set current to n; %s=next unread; %s,%s=search pattern; %s=catchup"
 msgstr	""
 
-#: src/lang.c:501
+#: src/lang.c:505
 #, c-format
 msgid	"%s=line down; %s=line up; %s=help; %s=move; %s=quit; %s=toggle all/unread"
 msgstr	""
 
-#: src/lang.c:502
+#: src/lang.c:506
 #, c-format
 msgid	"%s=subscribe; %s=sub pattern; %s=unsubscribe; %s=unsub pattern; %s=yank in/out"
 msgstr	""
 
-#: src/lang.c:503
+#: src/lang.c:507
 #, c-format
 msgid	"<n>=set current to n; %s=next unread; %s=catchup; %s=display toggle"
 msgstr	""
 
-#: src/lang.c:504
+#: src/lang.c:508
 #, c-format
 msgid	"%s=help; %s=line down; %s=line up; %s=quit; %s=tag; %s=mark unread"
 msgstr	""
 
-#: src/lang.c:505
+#: src/lang.c:509
 msgid	"--More--"
 msgstr	""
 
-#: src/lang.c:506
+#: src/lang.c:510
 #, c-format
 msgid	"Moving %s..."
 msgstr	""
 
-#: src/lang.c:508
+#: src/lang.c:512
 msgid	", name: "
 msgstr	""
 
-#: src/lang.c:509
+#: src/lang.c:513
 #, c-format
 msgid	"Goto newsgroup [%s]> "
 msgstr	""
 
-#: src/lang.c:510
+#: src/lang.c:514
 msgid	"newsgroups"
 msgstr	""
 
-#: src/lang.c:511
+#: src/lang.c:515
 #, c-format
 msgid	"Position %s in group list (1,2,..,$) [%d]> "
 msgstr	""
 
-#: src/lang.c:512
+#: src/lang.c:516
 msgid	"newsgroup"
 msgstr	""
 
-#: src/lang.c:513
+#: src/lang.c:517
 msgid	"Try and save newsrc file again?"
 msgstr	""
 
-#: src/lang.c:514
+#: src/lang.c:518
 msgid	"Warning: No newsgroups were written to your newsrc file. Save aborted."
 msgstr	""
 
-#: src/lang.c:515
+#: src/lang.c:519
 msgid	"newsrc file saved successfully.\n"
 msgstr	""
 
-#: src/lang.c:516
+#: src/lang.c:520
 msgid	"-- Next response --"
 msgstr	""
 
-#: src/lang.c:517
+#: src/lang.c:521
 #, c-format
 msgid	"NNTP authorization password not found for %s"
 msgstr	"NNTP authorisation password not found for %s"
 
-#: src/lang.c:518
+#: src/lang.c:522
 msgid	"No  "
 msgstr	""
 
-#: src/lang.c:519
+#: src/lang.c:523
 msgid	"*** No articles ***"
 msgstr	""
 
-#: src/lang.c:520
+#: src/lang.c:524
 msgid	"No articles have been posted"
 msgstr	""
 
-#: src/lang.c:521
+#: src/lang.c:525
 msgid	"*** No description ***"
 msgstr	""
 
-#: src/lang.c:522
+#: src/lang.c:526
 msgid	"No filename"
 msgstr	""
 
-#: src/lang.c:523
+#: src/lang.c:527
 msgid	"No group"
 msgstr	""
 
-#: src/lang.c:524
+#: src/lang.c:528
 msgid	"*** No groups ***"
 msgstr	""
 
-#: src/lang.c:525
+#: src/lang.c:529
 msgid	"No more groups to read"
 msgstr	""
 
-#: src/lang.c:526
+#: src/lang.c:530
 msgid	"No last message"
 msgstr	""
 
-#: src/lang.c:527
+#: src/lang.c:531
 msgid	"No mail address"
 msgstr	""
 
-#: src/lang.c:528
+#: src/lang.c:532
 msgid	"No articles marked for saving"
 msgstr	""
 
-#: src/lang.c:529
+#: src/lang.c:533
 msgid	"No match"
 msgstr	""
 
-#: src/lang.c:530
+#: src/lang.c:534
 msgid	"No more groups"
 msgstr	""
 
-#: src/lang.c:531
+#: src/lang.c:535
 msgid	"No newsgroups"
 msgstr	""
 
-#: src/lang.c:532
+#: src/lang.c:536
 msgid	"No next unread article"
 msgstr	""
 
-#: src/lang.c:533
+#: src/lang.c:537
 msgid	"No previous group"
 msgstr	""
 
-#: src/lang.c:534
+#: src/lang.c:538
 msgid	"No previous unread article"
 msgstr	""
 
-#: src/lang.c:535
-#, c-format
-msgid	"No responses%s"
-msgstr	""
-
-#: src/lang.c:536
+#: src/lang.c:539
 msgid	"No responses"
 msgstr	""
 
-#: src/lang.c:537
+#: src/lang.c:540
 msgid	"No responses to list in current thread"
 msgstr	""
 
-#: src/lang.c:538
+#: src/lang.c:541
 msgid	"No search string"
 msgstr	""
 
-#: src/lang.c:539
+#: src/lang.c:542
 msgid	"No subject"
 msgstr	""
 
-#: src/lang.c:540
+#: src/lang.c:544
 #, c-format
 msgid	"%s: Terminal must have clear to end-of-line (ce)\n"
 msgstr	""
 
-#: src/lang.c:541
+#: src/lang.c:545
 #, c-format
 msgid	"%s: Terminal must have clear to end-of-screen (cd)\n"
 msgstr	""
 
-#: src/lang.c:542
+#: src/lang.c:546
 #, c-format
 msgid	"%s: Terminal must have clearscreen (cl) capability\n"
 msgstr	""
 
-#: src/lang.c:543
+#: src/lang.c:547
 #, c-format
 msgid	"%s: Terminal must have cursor motion (cm)\n"
 msgstr	""
 
-#: src/lang.c:544
+#: src/lang.c:548
 #, c-format
 msgid	"%s: TERM variable must be set to use screen capabilities\n"
 msgstr	""
 
-#: src/lang.c:545
+#: src/lang.c:550
 #, c-format
 msgid	"No viewer found for %s/%s\n"
 msgstr	""
 
-#: src/lang.c:546
+#: src/lang.c:551
 msgid	"Newsgroup does not exist on this server"
 msgstr	""
 
-#: src/lang.c:547
+#: src/lang.c:552
 #, c-format
 msgid	"Group %s not found in active file"
 msgstr	""
 
-#: src/lang.c:548
+#: src/lang.c:553
 msgid	"c)reate it, use a)lternative name, use d)efault .newsrc, q)uit tin: "
 msgstr	""
 
-#: src/lang.c:549
+#: src/lang.c:554
 msgid	"use a)lternative name, use d)efault .newsrc, q)uit tin: "
 msgstr	""
 
-#: src/lang.c:550
+#: src/lang.c:555
 #, c-format
 msgid	"# NNTP-server -> newsrc translation table and NNTP-server\n"
 	"# shortname list for %s %s\n"
@@ -2161,308 +2272,315 @@ msgid	"# NNTP-server -> newsrc translati
 	"#\n"
 msgstr	""
 
-#: src/lang.c:557
+#: src/lang.c:562
 msgid	"Only"
 msgstr	""
 
-#: src/lang.c:558
+#: src/lang.c:563
 #, c-format
 msgid	"Option not enabled. Recompile with %s."
 msgstr	""
 
-#: src/lang.c:559
+#: src/lang.c:564
 msgid	"Options Menu"
 msgstr	""
 
-#: src/lang.c:562
+#: src/lang.c:567
 #, c-format
 msgid	"Error in regex: %s at pos. %d '%s'"
 msgstr	""
 
-#: src/lang.c:563
+#: src/lang.c:568
 #, c-format
 msgid	"Error in regex: pcre internal error %d"
 msgstr	""
 
-#: src/lang.c:564
+#: src/lang.c:569
 #, c-format
 msgid	"Error in regex: study - pcre internal error %s"
 msgstr	""
 
-#: src/lang.c:565
+#: src/lang.c:570
 msgid	"Post a followup..."
 msgstr	""
 
 #. TODO: replace hardcoded key-name in txt_post_error_ask_postpone
-#: src/lang.c:567
+#: src/lang.c:572
 msgid	"An error has occurred while posting the article. If you think that this\n"
 	"error is temporary or otherwise correctable, you can postpone the article\n"
 	"and pick it up again with ^O later.\n"
 msgstr	""
 
-#: src/lang.c:570
+#: src/lang.c:575
 msgid	"Posted articles history"
 msgstr	""
 
-#: src/lang.c:571
+#: src/lang.c:576
 #, c-format
 msgid	"Post to newsgroup(s) [%s]> "
 msgstr	""
 
-#: src/lang.c:572
+#: src/lang.c:577
 msgid	"-- post processing started --"
 msgstr	""
 
-#: src/lang.c:573
+#: src/lang.c:578
 msgid	"-- post processing completed --"
 msgstr	""
 
-#: src/lang.c:574
+#: src/lang.c:579
 #, c-format
 msgid	"Post subject [%s]> "
 msgstr	""
 
-#: src/lang.c:575
+#: src/lang.c:580
 msgid	"# Summary of mailed/posted messages viewable by 'W' command from within tin.\n"
 msgstr	""
 
-#: src/lang.c:576
+#: src/lang.c:581
 msgid	"Posting article..."
 msgstr	""
 
-#: src/lang.c:577
-msgid	"Post postponed articles [%%.*s]? (%s/%s/%s/%s/%s): "
+#: src/lang.c:582
+#, c-format
+msgid	"Post postponed articles [%%s]? (%s/%s/%s/%s/%s): "
 msgstr	""
 
-#: src/lang.c:578
+#: src/lang.c:583
 #, c-format
 msgid	"Hot %s"
 msgstr	""
 
-#: src/lang.c:579
+#: src/lang.c:584
 #, c-format
 msgid	"Tagged %s"
 msgstr	""
 
-#: src/lang.c:580
+#: src/lang.c:585
 #, c-format
 msgid	"Untagged %s"
 msgstr	""
 
-#: src/lang.c:581
+#: src/lang.c:586
 msgid	"Processing mail messages marked for deletion."
 msgstr	""
 
-#: src/lang.c:582
+#: src/lang.c:587
 msgid	"Processing saved articles marked for deletion."
 msgstr	""
 
-#: src/lang.c:583
+#: src/lang.c:588
 #, c-format
 msgid	"Accept Followup-To? %s=post, %s=ignore, %s=quit: "
 msgstr	""
 
-#: src/lang.c:584
+#: src/lang.c:589
 msgid	"Article unchanged, abort mailing?"
 msgstr	""
 
-#: src/lang.c:585
+#: src/lang.c:590
 #, c-format
 msgid	"Do you want to see postponed articles (%d)?"
 msgstr	""
 
-#: src/lang.c:587
+#: src/lang.c:592
 msgid	"Add quick kill filter?"
 msgstr	""
 
-#: src/lang.c:588
+#: src/lang.c:593
 msgid	"Add quick selection filter?"
 msgstr	""
 
-#: src/lang.c:589
+#: src/lang.c:594
 msgid	"Do you really want to quit?"
 msgstr	""
 
-#: src/lang.c:590
-msgid	"%s=edit cancel message, %s=quit, %s=delete (cancel) [%%.*s]: "
+#: src/lang.c:595
+#, c-format
+msgid	"%s=edit cancel message, %s=quit, %s=delete (cancel) [%%s]: "
 msgstr	""
 
-#: src/lang.c:591
+#: src/lang.c:596
 msgid	"You have tagged articles in this group - quit anyway?"
 msgstr	""
 
-#: src/lang.c:592
+#: src/lang.c:597
 #, c-format
 msgid	"%s=quit, %s=edit, %s=postpone: "
 msgstr	""
 
-#: src/lang.c:593
+#: src/lang.c:598
 #, c-format
 msgid	"%s=quit %s=edit %s=save kill description: "
 msgstr	""
 
-#: src/lang.c:594
+#: src/lang.c:599
 #, c-format
 msgid	"%s=quit %s=edit %s=save select description: "
 msgstr	""
 
-#: src/lang.c:595
+#: src/lang.c:600
 msgid	"Do you really want to quit without saving your configuration?"
 msgstr	""
 
-#: src/lang.c:598
+#: src/lang.c:603
 msgid	"Invalid range - valid are '0-9.$' eg. 1-$"
 msgstr	""
 
-#: src/lang.c:599
+#: src/lang.c:604
 msgid	"Do you want to abort this operation?"
 msgstr	""
 
-#: src/lang.c:600
+#: src/lang.c:605
 msgid	"Do you want to exit tin immediately?"
 msgstr	""
 
-#: src/lang.c:601
+#: src/lang.c:606
 msgid	"Read response> "
 msgstr	""
 
-#: src/lang.c:602
+#: src/lang.c:607
 msgid	"Reading ('q' to quit)..."
 msgstr	""
 
-#: src/lang.c:603
+#: src/lang.c:608
 #, c-format
 msgid	"Reading %sarticles..."
 msgstr	""
 
-#: src/lang.c:604
+#: src/lang.c:609
 #, c-format
 msgid	"Reading %sattributes file...\n"
 msgstr	""
 
-#: src/lang.c:605
+#: src/lang.c:610
 #, c-format
 msgid	"Reading %sconfig file...\n"
 msgstr	""
 
-#: src/lang.c:606
+#: src/lang.c:611
 msgid	"Reading filter file...\n"
 msgstr	""
 
-#: src/lang.c:607
+#: src/lang.c:612
 #, c-format
 msgid	"Reading %s groups..."
 msgstr	""
 
-#: src/lang.c:608
+#: src/lang.c:613
 msgid	"Reading input history file...\n"
 msgstr	""
 
-#: src/lang.c:609
+#: src/lang.c:614
 msgid	"Reading keymap file...\n"
 msgstr	""
 
-#: src/lang.c:610
+#: src/lang.c:615
 msgid	"Reading groups from active file... "
 msgstr	""
 
-#: src/lang.c:611
+#: src/lang.c:616
 msgid	"Reading groups from newsrc file... "
 msgstr	""
 
-#: src/lang.c:612
+#: src/lang.c:617
 msgid	"Reading newsgroups file... "
 msgstr	""
 
-#: src/lang.c:613
+#: src/lang.c:618
 msgid	"Reading newsrc file..."
 msgstr	""
 
-#: src/lang.c:614
+#: src/lang.c:620
+#, c-format
+msgid	"(%d:%02d remaining)"
+msgstr	""
+
+#: src/lang.c:622
 #, c-format
 msgid	"Bogus group %s removed."
 msgstr	""
 
-#: src/lang.c:615
+#: src/lang.c:623
 #, c-format
 msgid	"Error: rename %s to %s"
 msgstr	""
 
-#: src/lang.c:616
+#: src/lang.c:624
 msgid	"Reply to author..."
 msgstr	""
 
-#: src/lang.c:617
+#: src/lang.c:625
 msgid	"Repost"
 msgstr	""
 
-#: src/lang.c:618
+#: src/lang.c:626
 msgid	"Reposting article..."
 msgstr	""
 
-#: src/lang.c:619
+#: src/lang.c:627
 #, c-format
 msgid	"Repost article(s) to group(s) [%s]> "
 msgstr	""
 
-#: src/lang.c:620
+#: src/lang.c:628
 msgid	"Reset newsrc?"
 msgstr	""
 
-#: src/lang.c:621
+#: src/lang.c:629
 msgid	"Responses have been directed to the following newsgroups"
 msgstr	""
 
-#: src/lang.c:622
+#: src/lang.c:630
 #, c-format
 msgid	"Responses have been directed to poster. %s=mail, %s=post, %s=quit: "
 msgstr	""
 
-#: src/lang.c:623
+#: src/lang.c:631
 #, c-format
-msgid	"RespNo %4d of %4d%s"
+msgid	"RespNo %4d of %4d"
 msgstr	""
 
-#: src/lang.c:624
+#: src/lang.c:632
 msgid	"Press <RETURN> to continue..."
 msgstr	""
 
-#: src/lang.c:626
+#: src/lang.c:634
 #, c-format
-msgid	"Select From    [%-*.*s] (y/n): "
+msgid	"Select From    [%s] (y/n): "
 msgstr	""
 
-#: src/lang.c:627
+#: src/lang.c:635
 msgid	"Select Lines: (</>num): "
 msgstr	""
 
-#: src/lang.c:628
+#: src/lang.c:636
 msgid	"Auto-select Article Menu"
 msgstr	""
 
-#: src/lang.c:629
+#: src/lang.c:637
 #, c-format
-msgid	"Select Msg-Id  [%-*.*s] (f/l/o/n): "
+msgid	"Select Msg-Id  [%s] (f/l/o/n): "
 msgstr	""
 
-#: src/lang.c:630
+#: src/lang.c:638
 msgid	"Select pattern scope: "
 msgstr	""
 
-#: src/lang.c:631
+#: src/lang.c:639
 #, c-format
-msgid	"Select Subject [%-*.*s] (y/n): "
+msgid	"Select Subject [%s] (y/n): "
 msgstr	""
 
-#: src/lang.c:632
+#: src/lang.c:640
 msgid	"Select text pattern : "
 msgstr	""
 
-#: src/lang.c:633
+#: src/lang.c:641
 msgid	"Select time in days   : "
 msgstr	""
 
-#: src/lang.c:634
+#: src/lang.c:642
 #, c-format
 msgid	"# %s server configuration file\n"
 	"# This file was automatically saved by %s %s %s (\"%s\")\n"
@@ -2474,216 +2592,221 @@ msgid	"# %s server configuration file\n"
 	"\n"
 msgstr	""
 
-#: src/lang.c:640
+#: src/lang.c:648
 msgid	"Showing unread groups only"
 msgstr	""
 
-#: src/lang.c:641
+#: src/lang.c:649
 msgid	"Subject: line (ignore case)   "
 msgstr	""
 
-#: src/lang.c:642
+#: src/lang.c:650
 msgid	"Subject: line (case sensitive)"
 msgstr	""
 
-#: src/lang.c:643
+#: src/lang.c:651
 msgid	"Save"
 msgstr	""
 
-#: src/lang.c:644
+#: src/lang.c:652
 #, c-format
 msgid	"Save '%s' (%s/%s)?"
 msgstr	""
 
-#: src/lang.c:645
+#: src/lang.c:653
 msgid	"Save configuration before continuing?"
 msgstr	""
 
-#: src/lang.c:646
+#: src/lang.c:654
 msgid	"Save filename> "
 msgstr	""
 
-#: src/lang.c:647
+#: src/lang.c:655
 msgid	"Saved"
 msgstr	""
 
-#: src/lang.c:648
+#: src/lang.c:656
 #, c-format
 msgid	"%4d unread (%4d hot) %s in %s\n"
 msgstr	""
 
-#: src/lang.c:649
+#: src/lang.c:657
 #, c-format
 msgid	"Saved %s...\n"
 msgstr	""
 
-#: src/lang.c:650
+#: src/lang.c:658
 msgid	"Nothing was saved"
 msgstr	""
 
-#: src/lang.c:651
+#: src/lang.c:659
 #, c-format
 msgid	"\n"
 	"%s %d %s from %d %s\n"
 msgstr	""
 
-#: src/lang.c:652
+#: src/lang.c:660
 #, c-format
 msgid	"-- %s saved to %s%s --"
 msgstr	""
 
-#: src/lang.c:653
+#: src/lang.c:661
 #, c-format
 msgid	"-- %s saved to %s - %s --"
 msgstr	""
 
-#: src/lang.c:654
+#: src/lang.c:662
 msgid	"Saving..."
 msgstr	""
 
-#: src/lang.c:655
+#: src/lang.c:663
 #, c-format
 msgid	"%s: Screen initialization failed"
 msgstr	"%s: Screen initialisation failed"
 
-#: src/lang.c:656
+#: src/lang.c:665
 #, c-format
 msgid	"%s: screen is too small\n"
 msgstr	""
 
-#: src/lang.c:657
+#: src/lang.c:667
 #, c-format
 msgid	"screen is too small, %s is exiting\n"
 msgstr	""
 
-#: src/lang.c:658
+#: src/lang.c:668
 #, c-format
 msgid	"Search backwards [%s]> "
 msgstr	""
 
-#: src/lang.c:659
+#: src/lang.c:669
 #, c-format
 msgid	"Search body [%s]> "
 msgstr	""
 
-#: src/lang.c:660
+#: src/lang.c:670
 #, c-format
 msgid	"Search forwards [%s]> "
 msgstr	""
 
-#: src/lang.c:661
+#: src/lang.c:671
 msgid	"Searching..."
 msgstr	""
 
-#: src/lang.c:662
+#: src/lang.c:672
 #, c-format
 msgid	"Searching article %d of %d ('q' to abort)..."
 msgstr	""
 
-#: src/lang.c:663
+#: src/lang.c:673
 msgid	"Select article> "
 msgstr	""
 
-#: src/lang.c:664
+#: src/lang.c:674
 msgid	"Select option number before text or use arrow keys and <CR>. 'q' to quit."
 msgstr	""
 
-#: src/lang.c:665
+#: src/lang.c:675
 msgid	"Select group> "
 msgstr	""
 
-#: src/lang.c:666
+#: src/lang.c:676
 #, c-format
 msgid	"Enter selection pattern [%s]> "
 msgstr	""
 
-#: src/lang.c:667
+#: src/lang.c:677
 msgid	"Select thread > "
 msgstr	""
 
-#: src/lang.c:668
+#: src/lang.c:678
 #, c-format
 msgid	"%s %s %s (\"%s\") [%s]: send a DETAILED bug report to %s\n"
 msgstr	""
 
-#: src/lang.c:669
+#: src/lang.c:679
 msgid	"servers active-file"
 msgstr	""
 
-#: src/lang.c:670
+#: src/lang.c:680
 msgid	"Cannot move into new newsgroups. Subscribe first..."
 msgstr	""
 
-#: src/lang.c:671
+#: src/lang.c:681
 msgid	"<SPACE>"
 msgstr	""
 
-#: src/lang.c:672
+#: src/lang.c:682
 #, c-format
 msgid	"Starting: (%s)"
 msgstr	""
 
-#: src/lang.c:673
+#: src/lang.c:683
 #, c-format
 msgid	"List Thread (%d of %d)"
 msgstr	""
 
-#: src/lang.c:674
+#: src/lang.c:684
 #, c-format
 msgid	"Thread (%.*s)"
 msgstr	""
 
-#: src/lang.c:675
+#: src/lang.c:685
 msgid	"Enter wildcard subscribe pattern> "
 msgstr	""
 
-#: src/lang.c:676
+#: src/lang.c:686
 #, c-format
 msgid	"subscribed to %d groups"
 msgstr	""
 
-#: src/lang.c:677
+#: src/lang.c:687
 #, c-format
 msgid	"Subscribed to %s"
 msgstr	""
 
-#: src/lang.c:678
+#: src/lang.c:688
 msgid	"Subscribing... "
 msgstr	""
 
-#: src/lang.c:679
-msgid	"Repost or supersede article(s) [%%.*s]? (%s/%s/%s): "
+#: src/lang.c:689
+#, c-format
+msgid	"Repost or supersede article(s) [%%s]? (%s/%s/%s): "
 msgstr	""
 
-#: src/lang.c:680
+#: src/lang.c:690
 #, c-format
 msgid	"Supersede article(s) to group(s) [%s]> "
 msgstr	""
 
-#: src/lang.c:681
+#: src/lang.c:691
 msgid	"Superseding article ..."
 msgstr	""
 
-#: src/lang.c:682
+#: src/lang.c:692
 #, c-format
 msgid	"\n"
 	"Stopped. Type 'fg' to restart %s\n"
 msgstr	""
 
-#: src/lang.c:684
+#: src/lang.c:694
 #, c-format
 msgid	"%d days"
 msgstr	""
 
-#: src/lang.c:685
+#: src/lang.c:695
 msgid	"<TAB>"
 msgstr	""
 
-#: src/lang.c:686
+#: src/lang.c:696
+msgid	"TeX "
+msgstr	""
+
+#: src/lang.c:697
 msgid	"# Default action/prompt strings\n"
 msgstr	""
 
-#: src/lang.c:687
+#: src/lang.c:698
 msgid	"# Defaults for quick (1 key) kill & auto-selection filters\n"
 	"# header=NUM  0,1=Subject: 2,3=From: 4=Message-ID: & full References: line\n"
 	"#             5=Message-ID: & last References: entry only\n"
@@ -2693,323 +2816,323 @@ msgid	"# Defaults for quick (1 key) kill
 	"# expire=ON/OFF  ON=limit to default_filter_days OFF=don't ever expire\n"
 msgstr	""
 
-#: src/lang.c:700
+#: src/lang.c:711
 msgid	"# If ON use print current subject or newsgroup description in the last line\n"
 msgstr	""
 
-#: src/lang.c:701
+#: src/lang.c:712
 msgid	"# Host & time info used for detecting new groups (don't touch)\n"
 msgstr	""
 
-#: src/lang.c:702
+#: src/lang.c:713
 msgid	"There is no news\n"
 msgstr	""
 
-#: src/lang.c:703
+#: src/lang.c:714
 msgid	"Thread"
 msgstr	""
 
-#: src/lang.c:704
+#: src/lang.c:715
 msgid	"Thread Level Commands"
 msgstr	""
 
-#: src/lang.c:705
+#: src/lang.c:716
 msgid	"Thread deselected"
 msgstr	""
 
-#: src/lang.c:706
+#: src/lang.c:717
 msgid	"Thread selected"
 msgstr	""
 
-#: src/lang.c:707
+#: src/lang.c:719
 msgid	"threads"
 msgstr	""
 
-#: src/lang.c:708
+#: src/lang.c:721
 msgid	"Thread range"
 msgstr	""
 
-#: src/lang.c:709
+#: src/lang.c:722
 msgid	"thread"
 msgstr	""
 
-#: src/lang.c:710
+#: src/lang.c:723
 #, c-format
-msgid	"%sThread %4s of %4s"
+msgid	"Thread %4s of %4s"
 msgstr	""
 
-#: src/lang.c:711
+#: src/lang.c:724
 msgid	"Threading articles..."
 msgstr	""
 
-#: src/lang.c:712
+#: src/lang.c:725
 #, c-format
 msgid	"Toggled word highlighting %s"
 msgstr	""
 
-#: src/lang.c:713
+#: src/lang.c:726
 msgid	"Toggled rot13 encoding"
 msgstr	""
 
-#: src/lang.c:714
+#: src/lang.c:727
 #, c-format
 msgid	"Toggled german TeX encoding %s"
 msgstr	""
 
-#: src/lang.c:715
+#: src/lang.c:728
 #, c-format
 msgid	"Toggled tab-width to %d"
 msgstr	""
 
-#: src/lang.c:716
+#: src/lang.c:729
 #, c-format
 msgid	"%d Trying to dotlock %s"
 msgstr	""
 
-#: src/lang.c:717
+#: src/lang.c:730
 #, c-format
 msgid	"%d Trying to lock %s"
 msgstr	""
 
-#: src/lang.c:718
+#: src/lang.c:731
 msgid	"           h=help\n"
 msgstr	""
 
-#: src/lang.c:720
+#: src/lang.c:733
 msgid	"Unlimited"
 msgstr	""
 
-#: src/lang.c:721
+#: src/lang.c:734
 msgid	"Enter wildcard unsubscribe pattern> "
 msgstr	""
 
-#: src/lang.c:722
+#: src/lang.c:735
 #, c-format
 msgid	"Error decoding %s : %s"
 msgstr	""
 
-#: src/lang.c:723
+#: src/lang.c:736
 msgid	"No end."
 msgstr	""
 
-#: src/lang.c:724
+#: src/lang.c:737
 #, c-format
 msgid	"%s successfully decoded."
 msgstr	""
 
-#: src/lang.c:725
+#: src/lang.c:738
 #, c-format
 msgid	"%*s[-- %s/%s, %suuencoded file, %d lines, name: %s --]\n"
 	"\n"
 msgstr	""
 
-#: src/lang.c:726
+#: src/lang.c:739
 msgid	"unread "
 msgstr	""
 
-#: src/lang.c:727
+#: src/lang.c:740
 #, c-format
 msgid	"unsubscribed from %d groups"
 msgstr	""
 
-#: src/lang.c:728
+#: src/lang.c:741
 #, c-format
 msgid	"Unsubscribed from %s"
 msgstr	""
 
-#: src/lang.c:729
+#: src/lang.c:742
 msgid	"Unsubscribing... "
 msgstr	""
 
-#: src/lang.c:730
+#: src/lang.c:743
 msgid	"Unthreading articles..."
 msgstr	""
 
-#: src/lang.c:731
+#: src/lang.c:744
 msgid	"Updated"
 msgstr	""
 
-#: src/lang.c:732
+#: src/lang.c:745
 msgid	"Updating"
 msgstr	""
 
-#: src/lang.c:733
+#: src/lang.c:746
 #, c-format
 msgid	"Opening %s\n"
 msgstr	""
 
-#: src/lang.c:734
+#: src/lang.c:747
 msgid	"No more URL's in this article"
 msgstr	""
 
-#: src/lang.c:735
+#: src/lang.c:748
 msgid	"Use MIME display program for this message?"
 msgstr	""
 
-#: src/lang.c:736
+#: src/lang.c:749
 msgid	"  -c       mark all news as read in subscribed newsgroups (batch mode)"
 msgstr	""
 
-#: src/lang.c:737
+#: src/lang.c:750
 msgid	"  -Z       return status indicating if any unread news (batch mode)"
 msgstr	""
 
-#: src/lang.c:738
+#: src/lang.c:751
 msgid	"  -q       don't check for new newsgroups"
 msgstr	""
 
-#: src/lang.c:739
+#: src/lang.c:752
 msgid	"  -X       don't save any files on quit"
 msgstr	""
 
-#: src/lang.c:740
+#: src/lang.c:753
 msgid	"  -d       don't show newsgroup descriptions"
 msgstr	""
 
-#: src/lang.c:741
+#: src/lang.c:754
 msgid	"  -G limit get only limit articles/group"
 msgstr	""
 
-#: src/lang.c:742
+#: src/lang.c:755
 #, c-format
 msgid	"  -H       help information about %s"
 msgstr	""
 
-#: src/lang.c:743
+#: src/lang.c:756
 msgid	"  -h       this help message"
 msgstr	""
 
-#: src/lang.c:744
+#: src/lang.c:757
 #, c-format
 msgid	"  -I dir   news index file directory [default=%s]"
 msgstr	""
 
-#: src/lang.c:745
+#: src/lang.c:758
 msgid	"  -u       update index files (batch mode)"
 msgstr	""
 
-#: src/lang.c:746
+#: src/lang.c:759
 #, c-format
 msgid	"  -m dir   mailbox directory [default=%s]"
 msgstr	""
 
-#: src/lang.c:747
+#: src/lang.c:760
 #, c-format
 msgid	"\n"
 	"Mail bug reports/comments to %s"
 msgstr	""
 
-#: src/lang.c:748
+#: src/lang.c:761
 msgid	"  -N       mail new news to your posts (batch mode)"
 msgstr	""
 
-#: src/lang.c:749
+#: src/lang.c:762
 msgid	"  -M user  mail new news to specified user (batch mode)"
 msgstr	""
 
-#: src/lang.c:750
+#: src/lang.c:763
 #, c-format
 msgid	"  -f file  subscribed to newsgroups file [default=%s]"
 msgstr	""
 
-#: src/lang.c:751
+#: src/lang.c:764
 msgid	"  -x       no posting mode"
 msgstr	""
 
-#: src/lang.c:752
+#: src/lang.c:765
 msgid	"  -w       post an article and exit"
 msgstr	""
 
-#: src/lang.c:753
+#: src/lang.c:766
 msgid	"  -o       post all postponed articles and exit"
 msgstr	""
 
-#: src/lang.c:754
+#: src/lang.c:767
 msgid	"  -r       read news remotely from default NNTP server"
 msgstr	""
 
-#: src/lang.c:755
+#: src/lang.c:768
 msgid	"  -R       read news saved by -S option"
 msgstr	""
 
-#: src/lang.c:756
+#: src/lang.c:769
 #, c-format
 msgid	"  -s dir   save news directory [default=%s]"
 msgstr	""
 
-#: src/lang.c:757
+#: src/lang.c:770
 msgid	"  -S       save new news for later reading (batch mode)"
 msgstr	""
 
-#: src/lang.c:758
+#: src/lang.c:771
 msgid	"  -z       start if any unread news"
 msgstr	""
 
-#: src/lang.c:759
+#: src/lang.c:772
 #, c-format
 msgid	"A Usenet reader.\n"
 	"\n"
 	"Usage: %s [options] [newsgroup[,...]]"
 msgstr	""
 
-#: src/lang.c:760
+#: src/lang.c:773
 msgid	"  -v       verbose output for batch mode options"
 msgstr	""
 
-#: src/lang.c:761
+#: src/lang.c:774
 msgid	"  -V       print version & date information"
 msgstr	""
 
-#: src/lang.c:762
+#: src/lang.c:775
 #, c-format
 msgid	"%s only useful without batch mode operations\n"
 msgstr	""
 
-#: src/lang.c:763
+#: src/lang.c:776
 #, c-format
 msgid	"%s only useful for batch mode operations\n"
 msgstr	""
 
-#: src/lang.c:765
+#: src/lang.c:778
 #, c-format
 msgid	"\n"
 	"%s%d out of range (0 - %d). Reset to 0"
 msgstr	""
 
-#: src/lang.c:766
+#: src/lang.c:779
 #, c-format
 msgid	"View '%s' (%s/%s)?"
 msgstr	""
 
-#: src/lang.c:768
+#: src/lang.c:781
 #, c-format
 msgid	"\n"
 	"Warning: posting exceeds %d columns. Line %d is the first long one:\n"
 	"%-100s\n"
 msgstr	""
 
-#: src/lang.c:769
+#: src/lang.c:782
 msgid	"\n"
 	"Warning: article unchanged after editing\n"
 msgstr	""
 
-#: src/lang.c:770
+#: src/lang.c:783
 msgid	"\n"
 	"Warning: \"Subject:\" contains only whitespaces.\n"
 msgstr	""
 
-#: src/lang.c:771
+#: src/lang.c:784
 msgid	"\n"
 	"Warning: \"Subject:\" begins with \"Re: \" but there are no \"References:\".\n"
 msgstr	""
 
-#: src/lang.c:773
+#: src/lang.c:786
 msgid	"\n"
 	"Warning: Article has \"References:\" but \"Subject:\" does not begin\n"
 	"         with \"Re: \" and does not contain \"(was:\".\n"
 msgstr	""
 
-#: src/lang.c:776
+#: src/lang.c:789
 msgid	"Read carefully!\n"
 	"\n"
 	"  You are about to cancel an article seemingly written by you. This will "
@@ -3022,7 +3145,7 @@ msgid	"Read carefully!\n"
 	"\n"
 msgstr	""
 
-#: src/lang.c:780
+#: src/lang.c:793
 msgid	"\n"
 	"Warning: You are using a non-plain transfer encoding (such as base64 or\n"
 	"         quoted-printable) and an external inews program to submit your\n"
@@ -3030,7 +3153,7 @@ msgid	"\n"
 	"         not be encoded properly.\n"
 msgstr	""
 
-#: src/lang.c:785
+#: src/lang.c:798
 #, c-format
 msgid	"\n"
 	"\n"
@@ -3039,7 +3162,7 @@ msgid	"\n"
 	"Read WHATSNEW, etc...\n"
 msgstr	""
 
-#: src/lang.c:787
+#: src/lang.c:800
 #, c-format
 msgid	"\n"
 	"\n"
@@ -3047,7 +3170,7 @@ msgid	"\n"
 	"Some values in your %s file may be ignored, others might have changed!\n"
 msgstr	""
 
-#: src/lang.c:790
+#: src/lang.c:803
 #, c-format
 msgid	"Warning: tin wrote fewer groups to your\n"
 	"\t%s\n"
@@ -3056,18 +3179,18 @@ msgid	"Warning: tin wrote fewer groups t
 	"before you start tin once again!\n"
 msgstr	""
 
-#: src/lang.c:794
+#: src/lang.c:807
 #, c-format
 msgid	"\n"
 	"Warning: Found %d '-- \\n' lines, this may confuse some people.\n"
 msgstr	""
 
-#: src/lang.c:795
+#: src/lang.c:808
 #, c-format
 msgid	"Warning: Only %d out of %d articles were saved"
 msgstr	""
 
-#: src/lang.c:796
+#: src/lang.c:809
 #, c-format
 msgid	"\n"
 	"Warning: Your signature  is longer than %d lines.  Since signatures usually "
@@ -3077,47 +3200,47 @@ msgid	"\n"
 	"         possible.\n"
 msgstr	""
 
-#: src/lang.c:800
+#: src/lang.c:813
 #, c-format
 msgid	"Warning: this mail address may contain a spamtrap. %s=continue, %s=abort? "
 msgstr	""
 
-#: src/lang.c:801
+#: src/lang.c:814
 msgid	"\n"
 	"Warning: Signatures should start with '-- \\n' not with '--\\n'.\n"
 msgstr	""
 
-#: src/lang.c:802
+#: src/lang.c:815
 msgid	"Writing attributes file..."
 msgstr	""
 
-#: src/lang.c:804
+#: src/lang.c:817
 #, c-format
-msgid	"%d Responses%s"
+msgid	"%d Responses"
 msgstr	""
 
-#: src/lang.c:806
+#: src/lang.c:819
 #, c-format
 msgid	"Added %d %s"
 msgstr	""
 
-#: src/lang.c:807
+#: src/lang.c:820
 msgid	"No unsubscribed groups to show"
 msgstr	""
 
-#: src/lang.c:808
+#: src/lang.c:821
 msgid	"Showing subscribed to groups only"
 msgstr	""
 
-#: src/lang.c:809
+#: src/lang.c:822
 msgid	"Yes "
 msgstr	""
 
-#: src/lang.c:810
+#: src/lang.c:823
 msgid	"    You have mail\n"
 msgstr	""
 
-#: src/lang.c:815
+#: src/lang.c:828
 #, c-format
 msgid	"\n"
 	"Warning: Posting is in %s and contains characters which are not\n"
@@ -3129,16 +3252,11 @@ msgid	"\n"
 	"         M)enu option.\n"
 msgstr	""
 
-#: src/lang.c:826
-#, c-format
-msgid	"Redefined key %s '%s' -> '%s'\n"
-msgstr	""
-
-#: src/lang.c:827
+#: src/lang.c:839
 msgid	"  -D       debug mode 1=NNTP 2=ALL"
 msgstr	""
 
-#: src/lang.c:831
+#: src/lang.c:843
 msgid	"Read carefully!\n"
 	"\n"
 	"  You are about to cancel an article seemingly not written by you.  This "
@@ -3154,372 +3272,375 @@ msgid	"Read carefully!\n"
 	"\n"
 msgstr	""
 
-#: src/lang.c:840
+#: src/lang.c:852
 msgid	"toggle color"
 msgstr	"toggle colour"
 
-#: src/lang.c:841
-msgid	"# For color-adjust use the following numbers\n"
-	"#  0-black       1-red         2-green        3-brown\n"
-	"#  4-blue        5-pink        6-cyan         7-white\n"
-	"# These are *only* for foreground:\n"
-	"#  8-gray        9-lightred   10-lightgreen  11-yellow\n"
-	"# 12-lightblue  13-lightpink  14-lightcyan   15-lightwhite\n"
-	"# A '-1' is interpreted as default (foreground normally is white, and\n"
-	"# background black)\n"
-	"\n"
-msgstr	"# For colour-adjust use the following numbers\n"
-	"#  0-black       1-red         2-green        3-brown\n"
-	"#  4-blue        5-pink        6-cyan         7-white\n"
+#: src/lang.c:853
+msgid	"# Changing colors of several screen parts\n"
+	"# Possible values are:\n"
+	"#  -1 = default (white for foreground and black for background)\n"
+	"#   0 = black\n"
+	"#   1 = red\n"
+	"#   2 = green\n"
+	"#   3 = brown\n"
+	"#   4 = blue\n"
+	"#   5 = pink\n"
+	"#   6 = cyan\n"
+	"#   7 = white\n"
 	"# These are *only* for foreground:\n"
-	"#  8-grey        9-lightred   10-lightgreen  11-yellow\n"
-	"# 12-lightblue  13-lightpink  14-lightcyan   15-lightwhite\n"
-	"# A '-1' is interpreted as default (foreground normally is white, and\n"
-	"# background black)\n"
+	"#   8 = gray\n"
+	"#   9 = light red\n"
+	"#  10 = light green\n"
+	"#  11 = yellow\n"
+	"#  12 = light blue\n"
+	"#  13 = light pink\n"
+	"#  14 = light cyan\n"
+	"#  15 = light white\n"
 	"\n"
+msgstr	""
 
-#: src/lang.c:849
+#: src/lang.c:873
 msgid	"  -a       toggle color flag"
 msgstr	"  -a       toggle colour flag"
 
-#: src/lang.c:853
+#: src/lang.c:877
 msgid	"\n"
 	"Error: Followup-To set to more than one newsgroup!\n"
 msgstr	""
 
-#: src/lang.c:854
+#: src/lang.c:878
 #, c-format
 msgid	"\n"
 	"Error: cross-posting to %d newsgroups and no Followup-To line!\n"
 msgstr	""
 
-#: src/lang.c:855
+#: src/lang.c:879
 #, c-format
 msgid	"\n"
 	"Error: \"%s\" is not a valid newsgroup!\n"
 msgstr	""
 
-#: src/lang.c:857
+#: src/lang.c:881
 msgid	"\n"
 	"Warning: Followup-To set to more than one newsgroup!\n"
 msgstr	""
 
-#: src/lang.c:858
+#: src/lang.c:882
 #, c-format
 msgid	"\n"
 	"Warning: cross-posting to %d newsgroups and no Followup-To line!\n"
 msgstr	""
 
-#: src/lang.c:859
+#: src/lang.c:883
 #, c-format
 msgid	"\n"
 	"Warning: \"%s\" is not in your newsrc, it may be invalid at this site!\n"
 msgstr	""
 
-#: src/lang.c:860
+#: src/lang.c:884
 #, c-format
 msgid	"\n"
 	"Warning: \"%s\" is not a valid newsgroup at this site!\n"
 msgstr	""
 
-#: src/lang.c:864
+#: src/lang.c:888
 #, c-format
 msgid	"%d files successfully written from %d articles. %d %s occurred."
 msgstr	""
 
-#: src/lang.c:865
+#: src/lang.c:889
 msgid	"Missing parts."
 msgstr	""
 
-#: src/lang.c:866
+#: src/lang.c:890
 msgid	"No beginning."
 msgstr	""
 
-#: src/lang.c:867
+#: src/lang.c:891
 msgid	"No data."
 msgstr	""
 
-#: src/lang.c:868
+#: src/lang.c:892
 msgid	"Unknown error."
 msgstr	""
 
-#: src/lang.c:870
+#: src/lang.c:895
 #, c-format
 msgid	"\tChecksum of %s (%ld %s)"
 msgstr	""
 
-#: src/lang.c:874
+#: src/lang.c:900
 msgid	"Reading mail active file... "
 msgstr	""
 
-#: src/lang.c:875
+#: src/lang.c:901
 msgid	"Reading mailgroups file... "
 msgstr	""
 
-#: src/lang.c:879
+#: src/lang.c:905
 msgid	"perform PGP operations on article"
 msgstr	""
 
-#: src/lang.c:880
+#: src/lang.c:906
 msgid	"Add key(s) to public keyring?"
 msgstr	""
 
-#: src/lang.c:881
+#: src/lang.c:907
 #, c-format
 msgid	"%s=encrypt, %s=sign, %s=both, %s=quit: "
 msgstr	""
 
-#: src/lang.c:882
+#: src/lang.c:908
 #, c-format
 msgid	"%s=sign, %s=sign & include public key, %s=quit: "
 msgstr	""
 
-#: src/lang.c:883
+#: src/lang.c:909
 #, c-format
 msgid	"PGP has not been set up (can't open %s)"
 msgstr	""
 
-#: src/lang.c:884
+#: src/lang.c:910
 msgid	"Article not signed and no public keys found"
 msgstr	""
 
-#: src/lang.c:886
+#: src/lang.c:912
 #, c-format
 msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone: "
 msgstr	""
 
-#: src/lang.c:887
-msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%.*s]: "
+#: src/lang.c:913
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%s]: "
 msgstr	""
 
-#: src/lang.c:888
-msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%.*s]: "
+#: src/lang.c:914
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
 msgstr	""
 
-#: src/lang.c:890
+#: src/lang.c:916
 #, c-format
 msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone: "
 msgstr	""
 
-#: src/lang.c:891
-msgid	"%s=quit, %s=edit, %s=pgp, %s=send [%%.*s]: "
+#: src/lang.c:917
+#, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=send [%%s]: "
 msgstr	""
 
-#: src/lang.c:892
-msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%.*s]: "
+#: src/lang.c:918
+#, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
 msgstr	""
 
-#: src/lang.c:896
+#: src/lang.c:922
 #, c-format
 msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone: "
 msgstr	""
 
-#: src/lang.c:897
-msgid	"%s=quit, %s=edit, %s=ispell, %s=send [%%.*s]: "
+#: src/lang.c:923
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=send [%%s]: "
 msgstr	""
 
-#: src/lang.c:898
-msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%.*s]: "
+#: src/lang.c:924
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%s]: "
 msgstr	""
 
-#: src/lang.c:900
+#: src/lang.c:926
 #, c-format
 msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone: "
 msgstr	""
 
-#: src/lang.c:901
-msgid	"%s=quit, %s=edit, %s=send [%%.*s]: "
-msgstr	""
-
-#: src/lang.c:902
-msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	""
-
-#: src/lang.c:908
+#: src/lang.c:927
 #, c-format
-msgid	"Environment variable %s not found. Set and retry..."
+msgid	"%s=quit, %s=edit, %s=send [%%s]: "
 msgstr	""
 
-#: src/lang.c:909
-msgid	"  -B       BBS mode. File operations limited to home directories."
+#: src/lang.c:928
+#, c-format
+msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%s]: "
 msgstr	""
 
-#: src/lang.c:917
+#: src/lang.c:937
 msgid	"Try cache_overview_files to speed up things.\n"
 msgstr	""
 
-#: src/lang.c:918
+#: src/lang.c:938
 msgid	"Tin will use local index files instead.\n"
 msgstr	""
 
-#: src/lang.c:919
+#: src/lang.c:939
 msgid	"Cannot find NNTP server name"
 msgstr	""
 
-#: src/lang.c:920
+#: src/lang.c:940
 #, c-format
 msgid	"Connecting to %s:%d..."
 msgstr	""
 
-#: src/lang.c:921
+#: src/lang.c:941
 msgid	"Disconnecting from server...\n"
 msgstr	""
 
-#: src/lang.c:922
+#: src/lang.c:942
 #, c-format
 msgid	"Wrong newsgroup name in response of GROUP command, %s for %s"
 msgstr	""
 
-#: src/lang.c:923
+#: src/lang.c:943
 #, c-format
 msgid	"Failed to connect to NNTP server %s. Exiting..."
 msgstr	""
 
-#: src/lang.c:924 src/nntplib.c:975
+#: src/lang.c:944
 msgid	"205  Closing connection"
 msgstr	""
 
-#: src/lang.c:925
+#: src/lang.c:945
 msgid	"Your server does not support the NNTP XOVER or OVER command.\n"
 msgstr	""
 
-#: src/lang.c:926
+#: src/lang.c:946
 msgid	"Connection to news server has timed out. Reconnect?"
 msgstr	""
 
-#: src/lang.c:927
+#: src/lang.c:947
 #, c-format
 msgid	"Put the server name in the file %s,\n"
 	"or set the environment variable NNTPSERVER"
 msgstr	""
 
-#: src/lang.c:928
+#: src/lang.c:948
 msgid	"  -A       force authentication on connect"
 msgstr	""
 
-#: src/lang.c:929
+#: src/lang.c:949
 #, c-format
 msgid	"  -g serv  read news from NNTP server serv [default=%s]"
 msgstr	""
 
-#: src/lang.c:930
+#: src/lang.c:950
 #, c-format
 msgid	"  -p port  use port as NNTP port [default=%d]"
 msgstr	""
 
-#: src/lang.c:931
+#: src/lang.c:951
 msgid	"  -Q       quick start. Same as -nqd"
 msgstr	""
 
-#: src/lang.c:932
+#: src/lang.c:952
 msgid	"  -l       use only LIST instead of GROUP (-n) command"
 msgstr	""
 
-#: src/lang.c:933
+#: src/lang.c:953
 msgid	"  -n       only read subscribed .newsrc groups from NNTP server"
 msgstr	""
 
-#: src/lang.c:935
+#: src/lang.c:955
 #, c-format
 msgid	"%s/tcp: Unknown service.\n"
 msgstr	""
 
-#: src/lang.c:938
+#: src/lang.c:958
 msgid	"\n"
 	"socket or connect problem\n"
 msgstr	""
 
-#: src/lang.c:940
+#: src/lang.c:960
 #, c-format
 msgid	"\n"
 	"Connection to %s: "
 msgstr	""
 
-#: src/lang.c:941
+#: src/lang.c:961
 msgid	"Giving up...\n"
 msgstr	""
 
-#: src/lang.c:944
+#: src/lang.c:964
 msgid	"Your server does not have Xref: in its XOVER information.\n"
 	"Tin will try to use XHDR XREF instead (slows down things a bit).\n"
 msgstr	""
 
-#: src/lang.c:947
+#: src/lang.c:967
 msgid	"Your server does not have Xref: in its XOVER information.\n"
 msgstr	""
 
-#: src/lang.c:950
+#: src/lang.c:970
 #, c-format
 msgid	"Can't open %s. Try %s -r to read news via NNTP.\n"
 msgstr	""
 
-#: src/lang.c:953
+#: src/lang.c:973
 msgid	"  -Q       quick start. Same as -qd"
 msgstr	""
 
-#: src/lang.c:954
+#: src/lang.c:974
 msgid	"  -l       read only active file instead of scanning spool (-n) command"
 msgstr	""
 
-#: src/lang.c:955
+#: src/lang.c:975
 msgid	"  -n       only read subscribed .newsrc groups from spool"
 msgstr	""
 
-#: src/lang.c:956
+#: src/lang.c:976
 msgid	"Your server does not have Xref: in its NOV-files.\n"
 msgstr	""
 
-#: src/lang.c:960
+#: src/lang.c:980
 msgid	"Posting using external inews failed. Use built in inews instead?"
 msgstr	""
 
-#: src/lang.c:961
+#: src/lang.c:981
 msgid	"It worked! Should I always use my built in inews from now on?"
 msgstr	""
 
-#: src/lang.c:969
+#: src/lang.c:989
 #, c-format
 msgid	"%d %s printed"
 msgstr	""
 
-#: src/lang.c:970
+#: src/lang.c:990
 msgid	"output article/thread/hot/pattern/tagged articles to printer"
 msgstr	""
 
-#: src/lang.c:971
+#: src/lang.c:991
 msgid	"Print"
 msgstr	""
 
-#: src/lang.c:972
+#: src/lang.c:992
 msgid	"Printing..."
 msgstr	""
 
-#: src/lang.c:976
+#: src/lang.c:996
 msgid	"pipe article/thread/hot/pattern/tagged articles into command"
 msgstr	""
 
-#: src/lang.c:977
+#: src/lang.c:997
 msgid	"No command"
 msgstr	""
 
-#: src/lang.c:978
+#: src/lang.c:998
 msgid	"Pipe"
 msgstr	""
 
-#: src/lang.c:979
+#: src/lang.c:999
 #, c-format
 msgid	"Pipe to command [%.*s]> "
 msgstr	""
 
-#: src/lang.c:980
+#: src/lang.c:1000
 msgid	"Piping..."
 msgstr	""
 
-#: src/lang.c:982
+#: src/lang.c:1002
 msgid	"Piping not enabled."
 msgstr	""
 
-#: src/lang.c:986
+#: src/lang.c:1006
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line has spaces  in it that MUST be removed.\n"
@@ -3528,7 +3649,7 @@ msgid	"\n"
 	"       newsgroup names.\n"
 msgstr	""
 
-#: src/lang.c:991
+#: src/lang.c:1011
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line is  continued in  the next line.  Since\n"
@@ -3536,7 +3657,7 @@ msgid	"\n"
 	"       Please write all newsgroups into a single line.\n"
 msgstr	""
 
-#: src/lang.c:996
+#: src/lang.c:1016
 #, c-format
 msgid	"\n"
 	"Warning: The \"%s:\" line is continued in the next line.\n"
@@ -3544,13 +3665,13 @@ msgid	"\n"
 	"         To avoid trouble please write all newsgroups into a single line.\n"
 msgstr	""
 
-#: src/lang.c:1000
+#: src/lang.c:1020
 #, c-format
 msgid	"\n"
 	"Warning: The \"%s:\" line has spaces in it that SHOULD be removed.\n"
 msgstr	""
 
-#: src/lang.c:1005
+#: src/lang.c:1025
 msgid	"\n"
 	"  If your article contains quoted text  please take some time to pare it "
 	"down\n"
@@ -3571,825 +3692,921 @@ msgid	"\n"
 	"  likely to ignore it completely.  It's a crowded net out there.\n"
 msgstr	""
 
-#: src/lang.c:1018
+#: src/lang.c:1038
 msgid	"shell escape"
 msgstr	""
 
-#: src/lang.c:1019
+#: src/lang.c:1039
 #, c-format
 msgid	"Shell Command (%s)"
 msgstr	""
 
-#: src/lang.c:1020
+#: src/lang.c:1040
 #, c-format
 msgid	"Enter shell command [%s]> "
 msgstr	""
 
-#: src/lang.c:1024
+#: src/lang.c:1044
 #, c-format
 msgid	"%s: Can't get entry for TERM\n"
 msgstr	""
 
-#: src/lang.c:1028
+#: src/lang.c:1048
 #, c-format
 msgid	"Group %.*s ('q' to quit)..."
 msgstr	""
 
-#: src/lang.c:1030
+#: src/lang.c:1050
 #, c-format
 msgid	"Group %.*s..."
 msgstr	""
 
-#: src/lang.c:1034
+#: src/lang.c:1054
 msgid	"Server unavailable\n"
 msgstr	""
 
-#: src/lang.c:1040
+#: src/lang.c:1060
 #, c-format
-msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; "
-	"%s=post"
+msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %"
+	"s=post"
 msgstr	""
 
-#: src/lang.c:1041
+#: src/lang.c:1061
 #, c-format
 msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr	""
 
-#: src/lang.c:1043
+#: src/lang.c:1063
 #, c-format
 msgid	"%s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
 msgstr	""
 
-#: src/lang.c:1044
+#: src/lang.c:1064
 #, c-format
 msgid	"%s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr	""
 
-#: src/lang.c:1048
+#: src/lang.c:1068
 #, c-format
 msgid	"%s=pipe; %s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
 msgstr	""
 
-#: src/lang.c:1049
+#: src/lang.c:1069
 #, c-format
 msgid	"%s=pipe; %s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr	""
 
-#: src/lang.c:1051
+#: src/lang.c:1071
 #, c-format
 msgid	"%s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
 msgstr	""
 
-#: src/lang.c:1052
+#: src/lang.c:1072
 #, c-format
 msgid	"%s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr	""
 
-#: src/lang.c:1058
+#: src/lang.c:1078
 msgid	"Terminal does not support color"
 msgstr	"Terminal does not support colour"
 
-#: src/lang.c:1063
+#: src/lang.c:1083
 #, c-format
 msgid	"Trying %s"
 msgstr	""
 
-#: src/lang.c:1077 src/lang.c:1102 src/lang.c:1118 src/refs.c:266
+#: src/lang.c:1097 src/lang.c:1123 src/lang.c:1139 src/lang.c:1318 src/refs.c:296
 msgid	"None"
 msgstr	""
 
-#: src/lang.c:1078
+#: src/lang.c:1098
 msgid	"Subject"
 msgstr	""
 
-#: src/lang.c:1079
+#: src/lang.c:1099
 msgid	"References"
 msgstr	""
 
-#: src/lang.c:1080
+#: src/lang.c:1100
 msgid	"Both Subject and References"
 msgstr	""
 
-#: src/lang.c:1081
+#: src/lang.c:1101
 msgid	"Multipart Subject"
 msgstr	""
 
-#: src/lang.c:1093 src/lang.c:1204
+#: src/lang.c:1102
+msgid	"Percentage Match"
+msgstr	""
+
+#: src/lang.c:1114 src/lang.c:1225
 msgid	"No"
 msgstr	""
 
-#: src/lang.c:1094 src/lang.c:1206
+#: src/lang.c:1115 src/lang.c:1227
 msgid	"Yes"
 msgstr	""
 
-#: src/lang.c:1095
+#: src/lang.c:1116
 msgid	"Hide All"
 msgstr	""
 
-#: src/lang.c:1103
+#: src/lang.c:1124
 msgid	"Address"
 msgstr	""
 
-#: src/lang.c:1104
+#: src/lang.c:1125
 msgid	"Full Name"
 msgstr	""
 
-#: src/lang.c:1105
+#: src/lang.c:1126
 msgid	"Address and Name"
 msgstr	""
 
-#: src/lang.c:1112
+#: src/lang.c:1133
 msgid	"Max"
 msgstr	""
 
-#: src/lang.c:1113
+#: src/lang.c:1134
 msgid	"Sum"
 msgstr	""
 
-#: src/lang.c:1114
+#: src/lang.c:1135
 msgid	"Average"
 msgstr	""
 
-#: src/lang.c:1119
+#: src/lang.c:1140
 msgid	"Lines"
 msgstr	""
 
-#: src/lang.c:1120
+#: src/lang.c:1141
 msgid	"Score"
 msgstr	""
 
-#: src/lang.c:1121
+#: src/lang.c:1142
 msgid	"Lines & Score"
 msgstr	""
 
-#: src/lang.c:1130
+#: src/lang.c:1151
 msgid	"Black"
 msgstr	""
 
-#: src/lang.c:1131
+#: src/lang.c:1152
 msgid	"Red"
 msgstr	""
 
-#: src/lang.c:1132
+#: src/lang.c:1153
 msgid	"Green"
 msgstr	""
 
-#: src/lang.c:1133
+#: src/lang.c:1154
 msgid	"Brown"
 msgstr	""
 
-#: src/lang.c:1134
+#: src/lang.c:1155
 msgid	"Blue"
 msgstr	""
 
-#: src/lang.c:1135
+#: src/lang.c:1156
 msgid	"Pink"
 msgstr	""
 
-#: src/lang.c:1136
+#: src/lang.c:1157
 msgid	"Cyan"
 msgstr	""
 
-#: src/lang.c:1137
+#: src/lang.c:1158
 msgid	"White"
 msgstr	""
 
-#: src/lang.c:1138
+#: src/lang.c:1159
 msgid	"Gray"
 msgstr	"Grey"
 
-#: src/lang.c:1139
+#: src/lang.c:1160
 msgid	"Light Red"
 msgstr	""
 
-#: src/lang.c:1140
+#: src/lang.c:1161
 msgid	"Light Green"
 msgstr	""
 
-#: src/lang.c:1141
+#: src/lang.c:1162
 msgid	"Yellow"
 msgstr	""
 
-#: src/lang.c:1142
+#: src/lang.c:1163
 msgid	"Light Blue"
 msgstr	""
 
-#: src/lang.c:1143
+#: src/lang.c:1164
 msgid	"Light Pink"
 msgstr	""
 
-#: src/lang.c:1144
+#: src/lang.c:1165
 msgid	"Light Cyan"
 msgstr	""
 
-#: src/lang.c:1145
+#: src/lang.c:1166
 msgid	"Light White"
 msgstr	""
 
-#: src/lang.c:1153 src/lang.c:1210 src/lang.c:1224
+#: src/lang.c:1174 src/lang.c:1231 src/lang.c:1245
 msgid	"Nothing"
 msgstr	""
 
-#: src/lang.c:1154
+#: src/lang.c:1175
 msgid	"Mark"
 msgstr	""
 
-#: src/lang.c:1155
+#: src/lang.c:1176
 msgid	"Space"
 msgstr	""
 
-#: src/lang.c:1162
+#: src/lang.c:1183
 msgid	"Normal"
 msgstr	""
 
-#: src/lang.c:1163
+#: src/lang.c:1184
 msgid	"Best highlighting"
 msgstr	""
 
-#: src/lang.c:1164
+#: src/lang.c:1185
 msgid	"Underline"
 msgstr	""
 
-#: src/lang.c:1165
+#: src/lang.c:1186
 msgid	"Reverse video"
 msgstr	""
 
-#: src/lang.c:1166
+#: src/lang.c:1187
 msgid	"Blinking"
 msgstr	""
 
-#: src/lang.c:1167
+#: src/lang.c:1188
 msgid	"Half bright"
 msgstr	""
 
-#: src/lang.c:1168
+#: src/lang.c:1189
 msgid	"Bold"
 msgstr	""
 
-#: src/lang.c:1173
+#: src/lang.c:1194
 msgid	"none"
 msgstr	""
 
-#: src/lang.c:1174
+#: src/lang.c:1195
 msgid	"commands"
 msgstr	""
 
-#: src/lang.c:1175
+#: src/lang.c:1196
 msgid	"select"
 msgstr	""
 
-#: src/lang.c:1177
+#: src/lang.c:1198
 msgid	"commands & quit"
 msgstr	""
 
-#: src/lang.c:1178
+#: src/lang.c:1199
 msgid	"commands & select"
 msgstr	""
 
-#: src/lang.c:1179
+#: src/lang.c:1200
 msgid	"quit & select"
 msgstr	""
 
-#: src/lang.c:1180
+#: src/lang.c:1201
 msgid	"commands & quit & select"
 msgstr	""
 
-#: src/lang.c:1205
+#: src/lang.c:1226
 msgid	"Shell archive"
 msgstr	""
 
-#: src/lang.c:1211
+#: src/lang.c:1232
 msgid	"Subject: (descending)"
 msgstr	""
 
-#: src/lang.c:1212
+#: src/lang.c:1233
 msgid	"Subject: (ascending)"
 msgstr	""
 
-#: src/lang.c:1213
+#: src/lang.c:1234
 msgid	"From: (descending)"
 msgstr	""
 
-#: src/lang.c:1214
+#: src/lang.c:1235
 msgid	"From: (ascending)"
 msgstr	""
 
-#: src/lang.c:1215
+#: src/lang.c:1236
 msgid	"Date: (descending)"
 msgstr	""
 
-#: src/lang.c:1216
+#: src/lang.c:1237
 msgid	"Date: (ascending)"
 msgstr	""
 
-#: src/lang.c:1217 src/lang.c:1225
+#: src/lang.c:1238 src/lang.c:1246
 msgid	"Score (descending)"
 msgstr	""
 
-#: src/lang.c:1218 src/lang.c:1226
+#: src/lang.c:1239 src/lang.c:1247
 msgid	"Score (ascending)"
 msgstr	""
 
-#: src/lang.c:1219
+#: src/lang.c:1240
 msgid	"Lines: (descending)"
 msgstr	""
 
-#: src/lang.c:1220
+#: src/lang.c:1241
 msgid	"Lines: (ascending)"
 msgstr	""
 
-#: src/lang.c:1231
+#: src/lang.c:1252
 msgid	"Always Keep"
 msgstr	""
 
-#: src/lang.c:1232
+#: src/lang.c:1253
 msgid	"Always Remove"
 msgstr	""
 
-#: src/lang.c:1233
+#: src/lang.c:1254
 msgid	"Mark with D on selection screen"
 msgstr	""
 
-#: src/lang.c:1238
+#: src/lang.c:1259
 msgid	"Kill only unread arts"
 msgstr	""
 
-#: src/lang.c:1239
+#: src/lang.c:1260
 msgid	"Kill all arts & show with K"
 msgstr	""
 
 #. TODO: s/K/art_marked_killed/
-#: src/lang.c:1240
+#: src/lang.c:1261
 msgid	"Kill all arts and never show"
 msgstr	""
 
-#: src/lang.c:1245
+#: src/lang.c:1266
 msgid	"Nothing special"
 msgstr	""
 
-#: src/lang.c:1246
+#: src/lang.c:1267
 msgid	"Compress quotes"
 msgstr	""
 
-#: src/lang.c:1247
+#: src/lang.c:1268
 msgid	"Quote signatures"
 msgstr	""
 
-#: src/lang.c:1248
+#: src/lang.c:1269
 msgid	"Compress quotes, quote sigs"
 msgstr	""
 
-#: src/lang.c:1249
+#: src/lang.c:1270
 msgid	"Quote empty lines"
 msgstr	""
 
-#: src/lang.c:1250
+#: src/lang.c:1271
 msgid	"Compress quotes, quote empty lines"
 msgstr	""
 
-#: src/lang.c:1251
+#: src/lang.c:1272
 msgid	"Quote sigs & empty lines"
 msgstr	""
 
-#: src/lang.c:1252
+#: src/lang.c:1273
 msgid	"Comp. q., quote sigs & empty lines"
 msgstr	""
 
-#: src/lang.c:1290
+#: src/lang.c:1311
+msgid	"no"
+msgstr	""
+
+#: src/lang.c:1312
+msgid	"with headers"
+msgstr	""
+
+#: src/lang.c:1313
+msgid	"without headers"
+msgstr	""
+
+#: src/lang.c:1320 src/lang.c:1326
+msgid	"NFKC"
+msgstr	""
+
+#: src/lang.c:1321
+msgid	"NFKD"
+msgstr	""
+
+#: src/lang.c:1322
+msgid	"NFC"
+msgstr	""
+
+#: src/lang.c:1323
+msgid	"NFD"
+msgstr	""
+
+#: src/lang.c:1334
 msgid	"Display Options"
 msgstr	""
 
-#: src/lang.c:1296
+#: src/lang.c:1341
 msgid	"Color Options"
 msgstr	"Colour Options"
 
-#: src/lang.c:1302
+#: src/lang.c:1348
 msgid	"Article-Limiting Options"
 msgstr	""
 
-#: src/lang.c:1308
+#: src/lang.c:1354
 msgid	"Posting/Mailing Options"
 msgstr	""
 
-#: src/lang.c:1314
+#: src/lang.c:1360
 msgid	"Saving/Printing Options"
 msgstr	""
 
-#: src/lang.c:1320
+#: src/lang.c:1366
 msgid	"Expert Options"
 msgstr	""
 
-#: src/lang.c:1326
+#: src/lang.c:1372
 msgid	"Filtering Options"
 msgstr	""
 
-#: src/lang.c:1331 src/lang.c:1357 src/lang.c:1363 src/lang.c:1370 src/lang.c:1402
-#: src/lang.c:1408 src/lang.c:1416 src/lang.c:1436 src/lang.c:1511 src/lang.c:1673
-#: src/lang.c:1679 src/lang.c:1685 src/lang.c:1691 src/lang.c:1703 src/lang.c:1710
-#: src/lang.c:1761 src/lang.c:1770 src/lang.c:1776 src/lang.c:1782 src/lang.c:1788
-#: src/lang.c:1794 src/lang.c:1800 src/lang.c:1806 src/lang.c:1812 src/lang.c:1818
-#: src/lang.c:1824 src/lang.c:1830 src/lang.c:1836 src/lang.c:1842 src/lang.c:1848
-#: src/lang.c:1854 src/lang.c:1860 src/lang.c:1866 src/lang.c:1872 src/lang.c:1878
-#: src/lang.c:1884 src/lang.c:1891 src/lang.c:1897 src/lang.c:1903 src/lang.c:1910
-#: src/lang.c:1921 src/lang.c:1927 src/lang.c:1933 src/lang.c:1939 src/lang.c:1945
-#: src/lang.c:1959 src/lang.c:1971 src/lang.c:2005 src/lang.c:2057 src/lang.c:2064
-#: src/lang.c:2070 src/lang.c:2095 src/lang.c:2112 src/lang.c:2165 src/lang.c:2198
-#: src/lang.c:2218 src/lang.c:2253 src/lang.c:2261 src/lang.c:2286 src/lang.c:2298
+#: src/lang.c:1377 src/lang.c:1408 src/lang.c:1414 src/lang.c:1440 src/lang.c:1490
+#: src/lang.c:1496 src/lang.c:1506 src/lang.c:1526 src/lang.c:1601 src/lang.c:1771
+#: src/lang.c:1777 src/lang.c:1783 src/lang.c:1789 src/lang.c:1801 src/lang.c:1808
+#: src/lang.c:1862 src/lang.c:1871 src/lang.c:1877 src/lang.c:1884 src/lang.c:1891
+#: src/lang.c:1898 src/lang.c:1905 src/lang.c:1912 src/lang.c:1919 src/lang.c:1926
+#: src/lang.c:1933 src/lang.c:1940 src/lang.c:1947 src/lang.c:1954 src/lang.c:1961
+#: src/lang.c:1968 src/lang.c:1975 src/lang.c:1982 src/lang.c:1989 src/lang.c:1996
+#: src/lang.c:2003 src/lang.c:2010 src/lang.c:2017 src/lang.c:2024 src/lang.c:2031
+#: src/lang.c:2039 src/lang.c:2055 src/lang.c:2062 src/lang.c:2069 src/lang.c:2076
+#: src/lang.c:2082 src/lang.c:2088 src/lang.c:2105 src/lang.c:2117 src/lang.c:2151
+#: src/lang.c:2204 src/lang.c:2211 src/lang.c:2217 src/lang.c:2242 src/lang.c:2259
+#: src/lang.c:2312 src/lang.c:2348 src/lang.c:2368 src/lang.c:2403 src/lang.c:2413
+#: src/lang.c:2438 src/lang.c:2454 src/lang.c:2473 src/lang.c:2486
 msgid	"<SPACE> toggles, <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:1332
-msgid	"Show mini menu & posting etiquette :"
+#: src/lang.c:1378
+msgid	"Show mini menu & posting etiquette"
 msgstr	""
 
-#: src/lang.c:1333
+#: src/lang.c:1379
 msgid	"# If ON show a mini menu of useful commands at each level\n"
 	"# and posting etiquette after composing an article\n"
 msgstr	""
 
-#: src/lang.c:1338
+#: src/lang.c:1384
 msgid	"Show short description for each newsgroup. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:1339
-msgid	"Show description of each newsgroup :"
+#: src/lang.c:1385
+msgid	"Show description of each newsgroup"
 msgstr	""
 
-#: src/lang.c:1340
+#: src/lang.c:1386
 msgid	"# If ON show group description text after newsgroup name at\n"
 	"# group selection level\n"
 msgstr	""
 
-#: src/lang.c:1345
+#: src/lang.c:1391
 msgid	"Show Subject & From (author) fields in group menu. <SPACE> toggles & <CR> "
 	"sets."
 msgstr	""
 
-#: src/lang.c:1346
-msgid	"In group menu, show author by      :"
+#: src/lang.c:1392
+msgid	"In group menu, show author by"
 msgstr	""
 
-#: src/lang.c:1347
-msgid	"# Part of from field to display 0) none 1) address 2) full name 3) both\n"
+#: src/lang.c:1393
+msgid	"# Part of from field to display\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = none\n"
+	"#   1 = address\n"
+	"# * 2 = full name\n"
+	"#   3 = both\n"
 msgstr	""
 
-#: src/lang.c:1351
+#: src/lang.c:1402
 msgid	"Draw -> or highlighted bar for selection. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:1352
-msgid	"Draw -> instead of highlighted bar :"
+#: src/lang.c:1403
+msgid	"Draw -> instead of highlighted bar"
 msgstr	""
 
-#: src/lang.c:1353
+#: src/lang.c:1404
 msgid	"# If ON use -> otherwise highlighted bar for selection\n"
 msgstr	""
 
-#: src/lang.c:1358
-msgid	"Use inverse video for page headers :"
+#: src/lang.c:1409
+msgid	"Use inverse video for page headers"
 msgstr	""
 
-#: src/lang.c:1359
+#: src/lang.c:1410
 msgid	"# If ON use inverse video for page headers at different levels\n"
 msgstr	""
 
-#: src/lang.c:1364
-msgid	"Thread articles by                 :"
+#: src/lang.c:1415
+msgid	"Thread articles by"
 msgstr	""
 
-#: src/lang.c:1365
-msgid	"# Thread articles on 0=(nothing) 1=(Subject) 2=(References) 3=(Both)\n"
-	"# 4=(Multipart Subject).\n"
+#: src/lang.c:1416
+msgid	"# Thread articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject\n"
+	"#   2 = References\n"
+	"# * 3 = Both (Subject and References)\n"
+	"#   4 = Multipart Subject\n"
+	"#   5 = Percentage Match\n"
 msgstr	""
 
-#: src/lang.c:1371
-msgid	"Score of a thread                  :"
+#: src/lang.c:1427
+msgid	"Enter percentage match required to thread together. <CR> sets."
 msgstr	""
 
-#: src/lang.c:1372
-msgid	"# Thread score 0=(Max) 1=(Sum) 2=(Average)\n"
+#: src/lang.c:1428
+msgid	"Thread percentage match"
+msgstr	""
+
+#: src/lang.c:1429
+#, c-format
+msgid	"# Thread percentage match...\n"
+	"# the percentage of characters in the subject of an article that must match\n"
+	"# a base article for both those articles to be considered to belong to the\n"
+	"# same thread. This option is an integer percentage, eg. 80, no decimals may\n"
+	"# follow. If 80 is used here, then 80%% of the characters must match "
+	"exactly,\n"
+	"# no insertion of a character, for the two articles to be put in the same\n"
+	"# thread. eg. 'happy' and 'harpy' would match, but 'harpie', 'happie' and\n"
+	"# 'harppy' would be threaded separately from 'happy'\n"
+msgstr	""
+
+#: src/lang.c:1441
+msgid	"Score of a thread"
 msgstr	""
 
-#: src/lang.c:1376
+#: src/lang.c:1442
+msgid	"# Thread score\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = max\n"
+	"#   1 = sum\n"
+	"#   2 = average\n"
+msgstr	""
+
+#: src/lang.c:1450
 msgid	"Sort articles by Subject, From, Date or Score. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:1377
-msgid	"Sort articles by                   :"
+#: src/lang.c:1451
+msgid	"Sort articles by"
 msgstr	""
 
-#: src/lang.c:1378
-msgid	"# Sort articles by 0=(nothing) 1=(Subject descend) 2=(Subject ascend)\n"
-	"# 3=(From descend) 4=(From ascend) 5=(Date descend) 6=(Date ascend)\n"
-	"# 7=(Score descend) 8=(Score ascend) 9=(Lines descend) 10=(Lines ascend).\n"
+#: src/lang.c:1452
+msgid	"# Sort articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject descending\n"
+	"#   2 = Subject ascending\n"
+	"#   3 = From descending\n"
+	"#   4 = From ascending\n"
+	"#   5 = Date descending\n"
+	"# * 6 = Date ascending\n"
+	"#   7 = Score descending\n"
+	"#   8 = Score ascending\n"
+	"#   9 = Lines descending\n"
+	"#  10 = Lines ascending\n"
 msgstr	""
 
-#: src/lang.c:1384
+#: src/lang.c:1468
 msgid	"Sort threads by Nothing or Score. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:1385
-msgid	"Sort threads by                    :"
+#: src/lang.c:1469
+msgid	"Sort threads by"
 msgstr	""
 
-#: src/lang.c:1386
-msgid	"# Sort thread by 0=(nothing) 1=(Score descend) 2=(Score ascend)\n"
+#: src/lang.c:1470
+msgid	"# Sort thread by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = Score descending\n"
+	"#   2 = Score ascending\n"
 msgstr	""
 
-#: src/lang.c:1390
+#: src/lang.c:1478
 msgid	"Put cursor at first/last unread art in groups. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:1391
-msgid	"Goto first unread article in group :"
+#: src/lang.c:1479
+msgid	"Goto first unread article in group"
 msgstr	""
 
-#: src/lang.c:1392
+#: src/lang.c:1480
 msgid	"# If ON put cursor at first unread art in group otherwise last art\n"
 msgstr	""
 
-#: src/lang.c:1396
+#: src/lang.c:1484
 msgid	"Show all articles or only unread articles. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:1397
-msgid	"Show only unread articles          :"
+#: src/lang.c:1485
+msgid	"Show only unread articles"
 msgstr	""
 
-#: src/lang.c:1398
+#: src/lang.c:1486
 msgid	"# If ON show only new/unread articles otherwise show all.\n"
 msgstr	""
 
-#: src/lang.c:1403
-msgid	"Show only groups with unread arts  :"
+#: src/lang.c:1491
+msgid	"Show only groups with unread arts"
 msgstr	""
 
-#: src/lang.c:1404
+#: src/lang.c:1492
 msgid	"# If ON show only subscribed to groups that contain unread articles.\n"
 msgstr	""
 
-#: src/lang.c:1409
-msgid	"Filter which articles              :"
+#: src/lang.c:1497
+msgid	"Filter which articles"
 msgstr	""
 
-#: src/lang.c:1410
-msgid	"# 0=(Only kill unread articles)\n"
-	"# 1=(Kill all articles and show in threads marked with K)\n"
-	"# 2=(Kill all articles and never show them).\n"
+#: src/lang.c:1498
+msgid	"# Filter which articles\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = only kill unread articles\n"
+	"#   1 = kill all articles and show in threads marked with K\n"
+	"#   2 = kill all articles and never show them\n"
 msgstr	""
 
-#: src/lang.c:1417
-msgid	"Tab goes to next unread article    :"
+#: src/lang.c:1507
+msgid	"Tab goes to next unread article"
 msgstr	""
 
-#: src/lang.c:1418
+#: src/lang.c:1508
 msgid	"# If ON the TAB command will go to next unread article at article viewer "
 	"level\n"
 msgstr	""
 
-#: src/lang.c:1422
+#: src/lang.c:1512
 msgid	"Scrolling with <SPACE> past the end of an art. jumps to the next unread one."
 msgstr	""
 
-#: src/lang.c:1423
-msgid	"Space goes to next unread article  :"
+#: src/lang.c:1513
+msgid	"Space goes to next unread article"
 msgstr	""
 
-#: src/lang.c:1424
+#: src/lang.c:1514
 msgid	"# If ON the SPACE command will go to next unread article at article viewer\n"
 	"# level when the end of the article is reached (rn-style pager)\n"
 msgstr	""
 
-#: src/lang.c:1429
+#: src/lang.c:1519
 msgid	"Scrolling with <PGDN>/<DOWN> past the end of an art. jumps to the unread one."
 msgstr	""
 
-#: src/lang.c:1430
-msgid	"PgDn goes to next unread article   :"
+#: src/lang.c:1520
+msgid	"PgDn goes to next unread article"
 msgstr	""
 
-#: src/lang.c:1431
+#: src/lang.c:1521
 msgid	"# If ON the PGDN or DOWN command will go to next unread article when\n"
 	"# pressed at end of message\n"
 msgstr	""
 
-#: src/lang.c:1437
-msgid	"List thread using right arrow key  :"
+#: src/lang.c:1527
+msgid	"List thread using right arrow key"
 msgstr	""
 
-#: src/lang.c:1438
+#: src/lang.c:1528
 msgid	"# If ON automatically list thread when entering it using right arrow key.\n"
 msgstr	""
 
-#: src/lang.c:1442
+#: src/lang.c:1532
 msgid	"Enter character to indicate deleted articles. <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:1443
-msgid	"Character to show deleted articles :"
+#: src/lang.c:1533
+msgid	"Character to show deleted articles"
 msgstr	""
 
-#: src/lang.c:1444
+#: src/lang.c:1534
 msgid	"# Character used to show that an art was deleted (default 'D')\n"
 	"# _ is turned into ' '\n"
 msgstr	""
 
-#: src/lang.c:1449
+#: src/lang.c:1539
 msgid	"Enter character to indicate articles in a range. <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:1450
-msgid	"Character to show inrange articles :"
+#: src/lang.c:1540
+msgid	"Character to show inrange articles"
 msgstr	""
 
-#: src/lang.c:1451
+#: src/lang.c:1541
 msgid	"# Character used to show that an art is in a range (default '#')\n"
 	"# _ is turned into ' '\n"
 msgstr	""
 
-#: src/lang.c:1456
+#: src/lang.c:1546
 msgid	"Enter character to indicate that article will return. <CR> sets, <ESC> "
 	"cancels."
 msgstr	""
 
-#: src/lang.c:1457
-msgid	"Character to show returning arts   :"
+#: src/lang.c:1547
+msgid	"Character to show returning arts"
 msgstr	""
 
-#: src/lang.c:1458
+#: src/lang.c:1548
 msgid	"# Character used to show that an art will return (default '-')\n"
 	"# _ is turned into ' '\n"
 msgstr	""
 
-#: src/lang.c:1463
+#: src/lang.c:1553
 msgid	"Enter character to indicate selected articles. <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:1464
-msgid	"Character to show selected articles:"
+#: src/lang.c:1554
+msgid	"Character to show selected articles"
 msgstr	""
 
-#: src/lang.c:1465
+#: src/lang.c:1555
 msgid	"# Character used to show that an art was auto-selected (default '*')\n"
 	"# _ is turned into ' '\n"
 msgstr	""
 
-#: src/lang.c:1470
+#: src/lang.c:1560
 msgid	"Enter character to indicate recent articles. <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:1471
-msgid	"Character to show recent articles  :"
+#: src/lang.c:1561
+msgid	"Character to show recent articles"
 msgstr	""
 
-#: src/lang.c:1472
+#: src/lang.c:1562
 msgid	"# Character used to show that an art is recent (default 'o')\n"
 	"# _ is turned into ' '\n"
 msgstr	""
 
-#: src/lang.c:1477
+#: src/lang.c:1567
 msgid	"Enter character to indicate unread articles. <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:1478
-msgid	"Character to show unread articles  :"
+#: src/lang.c:1568
+msgid	"Character to show unread articles"
 msgstr	""
 
-#: src/lang.c:1479
+#: src/lang.c:1569
 msgid	"# Character used to show that an art is unread (default '+')\n"
 	"# _ is turned into ' '\n"
 msgstr	""
 
-#: src/lang.c:1484
+#: src/lang.c:1574
 msgid	"Enter character to indicate read articles. <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:1485
-msgid	"Character to show read articles    :"
+#: src/lang.c:1575
+msgid	"Character to show read articles"
 msgstr	""
 
-#: src/lang.c:1486
+#: src/lang.c:1576
 msgid	"# Character used to show that an art was read (default ' ')\n"
 	"# _ is turned into ' '\n"
 msgstr	""
 
-#: src/lang.c:1491
+#: src/lang.c:1581
 msgid	"Enter character to indicate killed articles. <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:1492
-msgid	"Character to show killed articles  :"
+#: src/lang.c:1582
+msgid	"Character to show killed articles"
 msgstr	""
 
-#: src/lang.c:1493
+#: src/lang.c:1583
 msgid	"# Character used to show that an art was killed (default 'K')\n"
 	"# kill_level must be set accordingly, _ is turned into ' '\n"
 msgstr	""
 
-#: src/lang.c:1498
+#: src/lang.c:1588
 msgid	"Enter character to indicate read selected articles. <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:1499
-msgid	"Character to show readselected arts:"
+#: src/lang.c:1589
+msgid	"Character to show readselected arts"
 msgstr	""
 
-#: src/lang.c:1500
+#: src/lang.c:1590
 msgid	"# Character used to show that an art was selected before read (default ':')\n"
 	"# kill_level must be set accordingly, _ is turned into ' '\n"
 msgstr	""
 
-#: src/lang.c:1505
+#: src/lang.c:1595
 msgid	"Enter maximum length of newsgroup names displayed. <CR> sets."
 msgstr	""
 
-#: src/lang.c:1506
-msgid	"Max. length of group names shown   :"
+#: src/lang.c:1596
+msgid	"Max. length of group names shown"
 msgstr	""
 
-#: src/lang.c:1507
+#: src/lang.c:1597
 msgid	"# Maximum length of the names of newsgroups displayed\n"
 msgstr	""
 
-#: src/lang.c:1512
-msgid	"Show lines/score in listings       :"
+#: src/lang.c:1602
+msgid	"Show lines/score in listings"
 msgstr	""
 
-#: src/lang.c:1513
+#: src/lang.c:1603
 msgid	"# What informations should be displayed in article/thread listing\n"
-	"# 0 = nothing, 1 = lines, 2 = score, 3 = lines & score\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = lines\n"
+	"#   2 = score\n"
+	"#   3 = lines & score\n"
 msgstr	""
 
-#: src/lang.c:1518
-msgid	"0 = full page scrolling, -1 = show previous last line as first on next page, "
-	"-2 = half page"
+#: src/lang.c:1612
+msgid	"0 = full page scrolling, -1 = show previous last line as first on next page, -"
+	"2 = half page"
 msgstr	""
 
-#: src/lang.c:1519
-msgid	"Number of lines to scroll in pager :"
+#: src/lang.c:1613
+msgid	"Number of lines to scroll in pager"
 msgstr	""
 
-#: src/lang.c:1520
+#: src/lang.c:1614
 msgid	"# Number of lines that cursor-up/down will scroll in article pager\n"
-	"# eg, 1+ = line-by-line, 0 = page-by-page (traditional behavior),\n"
-	"# -1 = the top/bottom line is carried over onto the next page,\n"
-	"# -2 = half-page scrolling\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#  -2 = half-page scrolling\n"
+	"#  -1 = the top/bottom line is carried over onto the next page\n"
+	"#   0 = page-by-page (traditional behavior)\n"
+	"# * 1 = line-by-line\n"
+	"#   2 or greater = scroll by 2 or more lines (only in the pager)\n"
 msgstr	"# Number of lines that cursor-up/down will scroll in article pager\n"
-	"# eg, 1+ = line-by-line, 0 = page-by-page (traditional behaviour),\n"
-	"# -1 = the top/bottom line is carried over onto the next page,\n"
-	"# -2 = half-page scrolling\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#  -2 = half-page scrolling\n"
+	"#  -1 = the top/bottom line is carried over onto the next page\n"
+	"#   0 = page-by-page (traditional behaviour)\n"
+	"# * 1 = line-by-line\n"
+	"#   2 or greater = scroll by 2 or more lines (only in the pager)\n"
 
-#: src/lang.c:1527
+#: src/lang.c:1624
 msgid	"Display signatures. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:1528
-msgid	"Display signatures                 :"
+#: src/lang.c:1625
+msgid	"Display signatures"
 msgstr	""
 
-#: src/lang.c:1529
+#: src/lang.c:1626
 msgid	"# If OFF don't show signatures when displaying articles\n"
 msgstr	""
 
-#: src/lang.c:1533
+#: src/lang.c:1630
 msgid	"Display uuencoded data as tagged attachments. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:1534
-msgid	"Display uue data as an attachment  :"
+#: src/lang.c:1631
+msgid	"Display uue data as an attachment"
 msgstr	""
 
-#: src/lang.c:1535
+#: src/lang.c:1632
 msgid	"# Handling of uuencoded data in the pager\n"
-	"# 0 = display raw uuencoded data\n"
-	"# 1 = uuencoded data will be condensed to a single tag line showing\n"
-	"#     size and filename, similar to how MIME attachments are displayed\n"
-	"# 2 = as for 1, but any line that looks like uuencoded data will be folded\n"
-	"#     into a tag line.\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no, display raw uuencoded data\n"
+	"#   1 = yes, uuencoded data will be condensed to a single tag line showing\n"
+	"#       size and filename, similar to how MIME attachments are displayed\n"
+	"#   2 = hide all, as for 1, but any line that looks like uuencoded data will\n"
+	"#       be folded into a tag line.\n"
 msgstr	""
 
-#: src/lang.c:1544
+#: src/lang.c:1642
 msgid	"Decode German style TeX umlaut codes to ISO. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:1545
-msgid	"Display \"a as Umlaut-a             :"
+#: src/lang.c:1643
+msgid	"Display \"a as Umlaut-a"
 msgstr	""
 
-#: src/lang.c:1546
+#: src/lang.c:1644
 msgid	"# If ON decode German style TeX umlaut codes to ISO and\n"
 	"# show \"a as Umlaut-a, etc.\n"
 msgstr	""
 
-#: src/lang.c:1551 src/lang.c:1561
+#: src/lang.c:1649 src/lang.c:1659
 msgid	"Space separated list of header fields"
 msgstr	""
 
-#: src/lang.c:1552
-msgid	"Display these header fields (or *) :"
+#: src/lang.c:1650
+msgid	"Display these header fields (or *)"
 msgstr	""
 
-#: src/lang.c:1553
+#: src/lang.c:1651
 msgid	"# Which news headers you wish to see. If you want to see _all_ the headers,\n"
 	"# place an '*' as this value. This is the only way a wildcard can be used.\n"
 	"# If you enter 'X-' as the value, you will see all headers beginning with\n"
@@ -4398,11 +4615,11 @@ msgid	"# Which news headers you wish to 
 	"# spaces. Not defining anything turns off this option.\n"
 msgstr	""
 
-#: src/lang.c:1562
-msgid	"Do not display these header fields :"
+#: src/lang.c:1660
+msgid	"Do not display these header fields"
 msgstr	""
 
-#: src/lang.c:1563
+#: src/lang.c:1661
 msgid	"# Same as 'news_headers_to_display' except it denotes the opposite.\n"
 	"# An example of using both options might be if you thought X- headers were\n"
 	"# A Good Thing(tm), but thought Alan and Pape were miscreants...well then "
@@ -4413,599 +4630,698 @@ msgid	"# Same as 'news_headers_to_displa
 	"# Not defining anything turns off this option.\n"
 msgstr	""
 
-#: src/lang.c:1573
+#: src/lang.c:1671
 msgid	"Do you want to enable automatic handling of multipart/alternative articles?"
 msgstr	""
 
-#: src/lang.c:1574
-msgid	"Skip multipart/alternative parts   :"
+#: src/lang.c:1672
+msgid	"Skip multipart/alternative parts"
 msgstr	""
 
-#: src/lang.c:1575
+#: src/lang.c:1673
 msgid	"# If ON strip multipart/alternative messages automatically\n"
 msgstr	""
 
-#: src/lang.c:1580
+#: src/lang.c:1678
 msgid	"A regex used to decide which lines to show in col_quote."
 msgstr	""
 
-#: src/lang.c:1581
-msgid	"Regex used to show quoted lines    :"
+#: src/lang.c:1679
+msgid	"Regex used to show quoted lines"
 msgstr	""
 
-#: src/lang.c:1582
+#: src/lang.c:1680
 msgid	"# A regular expression that tin will use to decide which lines are\n"
 	"# quoted when viewing articles. Quoted lines are shown in col_quote.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
 msgstr	""
 
-#: src/lang.c:1588
+#: src/lang.c:1686
 msgid	"A regex used to decide which lines to show in col_quote2."
 msgstr	""
 
-#: src/lang.c:1589
-msgid	"Regex used to show twice quoted l. :"
+#: src/lang.c:1687
+msgid	"Regex used to show twice quoted l."
 msgstr	""
 
-#: src/lang.c:1590
+#: src/lang.c:1688
 msgid	"# A regular expression that tin will use to decide which lines are\n"
 	"# quoted twice. Twice quoted lines are shown in col_quote2.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
 msgstr	""
 
-#: src/lang.c:1596
+#: src/lang.c:1694
 msgid	"A regex used to decide which lines to show in col_quote3."
 msgstr	""
 
-#: src/lang.c:1597
-msgid	"Regex used to show >= 3 times q.l. :"
+#: src/lang.c:1695
+msgid	"Regex used to show >= 3 times q.l."
 msgstr	""
 
-#: src/lang.c:1598
+#: src/lang.c:1696
 msgid	"# A regular expression that tin will use to decide which lines are\n"
 	"# quoted >=3 times. >=3 times quoted lines are shown in col_quote3.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
 msgstr	""
 
-#: src/lang.c:1605
+#: src/lang.c:1703
 msgid	"A regex used to decide which words to show in col_markslashes."
 msgstr	""
 
-#: src/lang.c:1606
-msgid	"Regex used to highlight /slashes/  :"
+#: src/lang.c:1704
+msgid	"Regex used to highlight /slashes/"
 msgstr	""
 
-#: src/lang.c:1607
+#: src/lang.c:1705
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '/' are to be shown in col_markslashes.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
 msgstr	""
 
-#: src/lang.c:1613
+#: src/lang.c:1711
 msgid	"A regex used to decide which words to show in col_markstars."
 msgstr	""
 
-#: src/lang.c:1614
-msgid	"Regex used to highlight *stars*    :"
+#: src/lang.c:1712
+msgid	"Regex used to highlight *stars*"
 msgstr	""
 
-#: src/lang.c:1615
+#: src/lang.c:1713
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '*' are to be shown in col_markstars.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
 msgstr	""
 
-#: src/lang.c:1621
+#: src/lang.c:1719
 msgid	"A regex used to decide which words to show in col_markstroke."
 msgstr	""
 
-#: src/lang.c:1622
-msgid	"Regex used to highlight -strokes-  :"
+#: src/lang.c:1720
+msgid	"Regex used to highlight -strokes-"
 msgstr	""
 
-#: src/lang.c:1623
+#: src/lang.c:1721
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '-' are to be shown in col_markstroke.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
 msgstr	""
 
-#: src/lang.c:1629
+#: src/lang.c:1727
 msgid	"A regex used to decide which words to show in col_markdash."
 msgstr	""
 
-#: src/lang.c:1630
-msgid	"Regex used to highlight _underline_:"
+#: src/lang.c:1728
+msgid	"Regex used to highlight _underline_"
 msgstr	""
 
-#: src/lang.c:1631
+#: src/lang.c:1729
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '_' are to be shown in col_markdash.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
 msgstr	""
 
-#: src/lang.c:1637
+#: src/lang.c:1735
 msgid	"A regex used to find Subject prefixes to remove.  Use '|' as separator."
 msgstr	""
 
-#: src/lang.c:1638
-msgid	"Regex with Subject prefixes        :"
+#: src/lang.c:1736
+msgid	"Regex with Subject prefixes"
 msgstr	""
 
-#: src/lang.c:1639
+#: src/lang.c:1737
 msgid	"# A regular expression that tin will use to find Subject prefixes\n"
 	"# which will be removed before showing the header.\n"
 msgstr	""
 
-#: src/lang.c:1644
+#: src/lang.c:1742
 msgid	"A regex used to find Subject suffixes to remove.  Use '|' as separator."
 msgstr	""
 
-#: src/lang.c:1645
-msgid	"Regex with Subject suffixes        :"
+#: src/lang.c:1743
+msgid	"Regex with Subject suffixes"
 msgstr	""
 
-#: src/lang.c:1646
+#: src/lang.c:1744
 msgid	"# A regular expression that tin will use to find Subject suffixes\n"
 	"# which will be removed when replying or posting followup.\n"
 msgstr	""
 
-#: src/lang.c:1651
+#: src/lang.c:1749
 msgid	"Enter name and options for external MIME viewer, --internal for built-in "
 	"viewer"
 msgstr	""
 
-#: src/lang.c:1652
-msgid	"MIME binary content viewer         :"
+#: src/lang.c:1750
+msgid	"MIME binary content viewer"
 msgstr	""
 
-#: src/lang.c:1653
+#: src/lang.c:1751
 msgid	"# If --internal automatically use the built in MIME viewer for non-text\n"
 	"# parts of articles.\n"
 	"# Otherwise specify an external viewer program (eg, metamail) or leave blank\n"
 	"# for no automatic viewing\n"
 msgstr	""
 
-#: src/lang.c:1660
+#: src/lang.c:1758
 msgid	"Confirm before starting non-text viewing program"
 msgstr	""
 
-#: src/lang.c:1661
-msgid	"Ask before using MIME viewer       :"
+#: src/lang.c:1759
+msgid	"Ask before using MIME viewer"
 msgstr	""
 
-#: src/lang.c:1662
+#: src/lang.c:1760
 msgid	"# If ON tin will ask before using metamail to display MIME messages\n"
 	"# this only happens if metamail_prog is set to something\n"
 msgstr	""
 
-#: src/lang.c:1667
+#: src/lang.c:1765
 msgid	"Ask to mark groups read when quitting. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:1668
-msgid	"Catchup read groups when quitting  :"
+#: src/lang.c:1766
+msgid	"Catchup read groups when quitting"
 msgstr	""
 
-#: src/lang.c:1669
+#: src/lang.c:1767
 msgid	"# If ON ask user if read groups should all be marked read\n"
 msgstr	""
 
-#: src/lang.c:1674
-msgid	"Catchup group using left key       :"
+#: src/lang.c:1772
+msgid	"Catchup group using left key"
 msgstr	""
 
-#: src/lang.c:1675
+#: src/lang.c:1773
 msgid	"# If ON catchup group/thread when leaving with the left arrow key.\n"
 msgstr	""
 
-#: src/lang.c:1680
-msgid	"Catchup thread by using left key   :"
+#: src/lang.c:1778
+msgid	"Catchup thread by using left key"
 msgstr	""
 
-#: src/lang.c:1686
-msgid	"Which actions require confirmation :"
+#: src/lang.c:1784
+msgid	"Which actions require confirmation"
 msgstr	""
 
-#: src/lang.c:1687
+#: src/lang.c:1785
 msgid	"# What should we ask confirmation for.\n"
 msgstr	""
 
-#: src/lang.c:1692
-msgid	"'Mark article read' ignores tags   :"
+#: src/lang.c:1790
+msgid	"'Mark article read' ignores tags"
 msgstr	""
 
-#: src/lang.c:1693
+#: src/lang.c:1791
 msgid	"# If ON the 'Mark article read' function marks only the current article.\n"
 msgstr	""
 
-#: src/lang.c:1697
+#: src/lang.c:1795
 msgid	"Program to run to open URL's, <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:1698
-msgid	"Program that opens URL's           :"
+#: src/lang.c:1796
+msgid	"Program that opens URL's"
 msgstr	""
 
-#: src/lang.c:1699
+#: src/lang.c:1797
 msgid	"# The program used to open URL's. The actual URL will be appended\n"
 msgstr	""
 
-#: src/lang.c:1704
-msgid	"Use mouse in xterm                 :"
+#: src/lang.c:1802
+msgid	"Use mouse in xterm"
 msgstr	""
 
-#: src/lang.c:1705
+#: src/lang.c:1803
 msgid	"# If ON enable mouse key support on xterm terminals\n"
 msgstr	""
 
-#: src/lang.c:1711
-msgid	"Use scroll keys on keypad          :"
+#: src/lang.c:1809
+msgid	"Use scroll keys on keypad"
 msgstr	""
 
-#: src/lang.c:1712
+#: src/lang.c:1810
 msgid	"# If ON enable scroll keys on terminals that support it\n"
 msgstr	""
 
-#: src/lang.c:1717
+#: src/lang.c:1815
 msgid	"Enter maximum number of article to get. <CR> sets."
 msgstr	""
 
-#: src/lang.c:1718
-msgid	"Number of articles to get          :"
+#: src/lang.c:1816
+msgid	"Number of articles to get"
 msgstr	""
 
-#: src/lang.c:1719
+#: src/lang.c:1817
 msgid	"# Number of articles to get (0=no limit), if negative sets maximum number\n"
 	"# of already read articles to be read before first unread one\n"
 msgstr	""
 
-#: src/lang.c:1724
+#: src/lang.c:1822
 msgid	"Enter number of days article is considered recent. <CR> sets."
 msgstr	""
 
-#: src/lang.c:1725
-msgid	"Article recentness time limit      :"
+#: src/lang.c:1823
+msgid	"Article recentness time limit"
 msgstr	""
 
-#: src/lang.c:1726
+#: src/lang.c:1824
 msgid	"# Number of days in which article is considered recent, (0=OFF)\n"
 msgstr	""
 
-#: src/lang.c:1730
+#: src/lang.c:1828
 msgid	"WILDMAT for normal wildcards, REGEX for full regular expression matching."
 msgstr	""
 
-#: src/lang.c:1731
-msgid	"Wildcard matching                  :"
+#: src/lang.c:1829
+msgid	"Wildcard matching"
 msgstr	""
 
-#: src/lang.c:1732
-msgid	"# Wildcard matching 0=(wildmat) 1=(regex)\n"
+#: src/lang.c:1830
+msgid	"# Wildcard matching\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = wildmat\n"
+	"#   1 = regex\n"
 msgstr	""
 
-#: src/lang.c:1736
+#: src/lang.c:1837
 msgid	"Enter minimal score before an article is marked killed. <CR> sets."
 msgstr	""
 
-#: src/lang.c:1737
-msgid	"Score limit (kill)                 :"
+#: src/lang.c:1838
+msgid	"Score limit (kill)"
 msgstr	""
 
-#: src/lang.c:1738
+#: src/lang.c:1839
 msgid	"# Score limit before an article is marked killed\n"
 msgstr	""
 
-#: src/lang.c:1742
+#: src/lang.c:1843
 msgid	"Enter default score to kill articles. <CR> sets."
 msgstr	""
 
-#: src/lang.c:1743
-msgid	"Default score to kill articles     :"
+#: src/lang.c:1844
+msgid	"Default score to kill articles"
 msgstr	""
 
-#: src/lang.c:1744
+#: src/lang.c:1845
 msgid	"# Default score to kill articles\n"
 msgstr	""
 
-#: src/lang.c:1748
+#: src/lang.c:1849
 msgid	"Enter minimal score before an article is marked hot. <CR> sets."
 msgstr	""
 
-#: src/lang.c:1749
-msgid	"Score limit (select)               :"
+#: src/lang.c:1850
+msgid	"Score limit (select)"
 msgstr	""
 
-#: src/lang.c:1750
+#: src/lang.c:1851
 msgid	"# Score limit before an article is marked hot\n"
 msgstr	""
 
-#: src/lang.c:1754
+#: src/lang.c:1855
 msgid	"Enter default score to select articles. <CR> sets."
 msgstr	""
 
-#: src/lang.c:1755
-msgid	"Default score to select articles   :"
+#: src/lang.c:1856
+msgid	"Default score to select articles"
 msgstr	""
 
-#: src/lang.c:1756
+#: src/lang.c:1857
 msgid	"# Default score to select articles\n"
 msgstr	""
 
-#: src/lang.c:1762
-msgid	"Use slrnface to show ''X-Face:''s  :"
+#: src/lang.c:1863
+msgid	"Use slrnface to show ''X-Face:''s"
 msgstr	""
 
-#: src/lang.c:1763
+#: src/lang.c:1864
 msgid	"# If ON using slrnface(1) to interpret the ''X-Face:'' header.\n"
 	"# Only useful when running in an xterm.\n"
 msgstr	""
 
-#: src/lang.c:1771
-msgid	"Use ANSI color                     :"
-msgstr	"Use ANSI colour                    :"
+#: src/lang.c:1872
+msgid	"Use ANSI color"
+msgstr	"Use ANSI colour"
 
-#: src/lang.c:1772
+#: src/lang.c:1873
 msgid	"# If ON using ANSI-color\n"
 msgstr	"# If ON using ANSI-colour\n"
 
-#: src/lang.c:1777
-msgid	"Standard foreground color          :"
-msgstr	"Standard foreground colour         :"
+#: src/lang.c:1878
+msgid	"Standard foreground color"
+msgstr	"Standard foreground colour"
 
-#: src/lang.c:1778
+#: src/lang.c:1879
 msgid	"# Standard foreground color\n"
+	"# Default: -1 (default color)\n"
 msgstr	"# Standard foreground colour\n"
+	"# Default: -1 (default colour)\n"
 
-#: src/lang.c:1783
-msgid	"Standard background color          :"
-msgstr	"Standard background colour         :"
+#: src/lang.c:1885
+msgid	"Standard background color"
+msgstr	"Standard background colour"
 
-#: src/lang.c:1784
-msgid	"# Standard-Background-Color\n"
-msgstr	"# Standard-Background-Colour\n"
+#: src/lang.c:1886
+msgid	"# Standard background color\n"
+	"# Default: -1 (default color)\n"
+msgstr	"# Standard background colour\n"
+	"# Default: -1 (default colour)\n"
 
-#: src/lang.c:1789
-msgid	"Color for inverse text (background):"
-msgstr	"Colour for inverse text (bg)       :"
+#: src/lang.c:1892
+msgid	"Color for inverse text (background)"
+msgstr	"Colour for inverse text (bg)"
 
-#: src/lang.c:1790
+#: src/lang.c:1893
 msgid	"# Color of background for inverse text\n"
+	"# Default: 4 (blue)\n"
 msgstr	"# Colour of background for inverse text\n"
+	"# Default: 4 (blue)\n"
 
-#: src/lang.c:1795
-msgid	"Color for inverse text (foreground):"
-msgstr	"Colour for inverse text (fg)       :"
+#: src/lang.c:1899
+msgid	"Color for inverse text (foreground)"
+msgstr	"Colour for inverse text (fg)"
 
-#: src/lang.c:1796
+#: src/lang.c:1900
 msgid	"# Color of foreground for inverse text\n"
+	"# Default: 7 (white)\n"
 msgstr	"# Colour of foreground for inverse text\n"
+	"# Default: 7 (white)\n"
 
-#: src/lang.c:1801
-msgid	"Color of text lines                :"
-msgstr	"Colour of text lines               :"
-
-#: src/lang.c:1802
-msgid	"# Color of text-lines\n"
-msgstr	"# Colour of text-lines\n"
-
-#: src/lang.c:1807
-msgid	"Color of mini help menu            :"
-msgstr	"Colour of mini help menu           :"
+#: src/lang.c:1906
+msgid	"Color of text lines"
+msgstr	"Colour of text lines"
+
+#: src/lang.c:1907
+msgid	"# Color of text lines\n"
+	"# Default: -1 (default color)\n"
+msgstr	"# Colour of text lines\n"
+	"# Default: -1 (default colour\n"
+
+#: src/lang.c:1913
+msgid	"Color of mini help menu"
+msgstr	"Colour of mini help menu"
 
-#: src/lang.c:1808
+#: src/lang.c:1914
 msgid	"# Color of mini help menu\n"
+	"# Default: 3 (brown)\n"
 msgstr	"# Colour of mini help menu\n"
+	"# Default: 3 (brown)\n"
 
-#: src/lang.c:1813
-msgid	"Color of help text                 :"
-msgstr	"Colour of help text                :"
+#: src/lang.c:1920
+msgid	"Color of help text"
+msgstr	"Colour of help text"
 
-#: src/lang.c:1814
+#: src/lang.c:1921
 msgid	"# Color of help pages\n"
+	"# Default: -1 (default color)\n"
 msgstr	"# Colour of help pages\n"
+	"# Default: -1 (default colour)\n"
 
-#: src/lang.c:1819
-msgid	"Color of status messages           :"
-msgstr	"Colour of status messages          :"
+#: src/lang.c:1927
+msgid	"Color of status messages"
+msgstr	"Colour of status messages"
 
-#: src/lang.c:1820
+#: src/lang.c:1928
 msgid	"# Color of messages in last line\n"
+	"# Default: 6 (cyan)\n"
 msgstr	"# Colour of messages in last line\n"
+	"# Default: 6 (cyan)\n"
 
-#: src/lang.c:1825
-msgid	"Color of quoted lines              :"
-msgstr	"Colour of quoted lines             :"
+#: src/lang.c:1934
+msgid	"Color of quoted lines"
+msgstr	"Colour of quoted lines"
 
-#: src/lang.c:1826
+#: src/lang.c:1935
 msgid	"# Color of quote-lines\n"
+	"# Default: 2 (green)\n"
 msgstr	"# Colour of quote-lines\n"
+	"# Default: 2 (green)\n"
 
-#: src/lang.c:1831
-msgid	"Color of twice quoted line         :"
-msgstr	"Colour of twice quoted line        :"
+#: src/lang.c:1941
+msgid	"Color of twice quoted line"
+msgstr	"Colour of twice quoted line"
 
-#: src/lang.c:1832
+#: src/lang.c:1942
 msgid	"# Color of twice quoted lines\n"
+	"# Default: 3 (brown)\n"
 msgstr	"# Colour of twice quoted lines\n"
+	"# Default: 3 (brown)\n"
 
-#: src/lang.c:1837
-msgid	"Color of =>3 times quoted line     :"
-msgstr	"Colour of =>3 times quoted line    :"
+#: src/lang.c:1948
+msgid	"Color of =>3 times quoted line"
+msgstr	"Colour of =>3 times quoted line"
 
-#: src/lang.c:1838
+#: src/lang.c:1949
 msgid	"# Color of >=3 times quoted lines\n"
+	"# Default: 4 (blue)\n"
 msgstr	"# Colour of >=3 times quoted lines\n"
+	"# Default: 4 (blue)\n"
 
-#: src/lang.c:1843
-msgid	"Color of article header lines      :"
-msgstr	"Colour of article header lines     :"
+#: src/lang.c:1955
+msgid	"Color of article header lines"
+msgstr	"Colour of article header lines"
 
-#: src/lang.c:1844
+#: src/lang.c:1956
 msgid	"# Color of header-lines\n"
+	"# Default: 2 (green)\n"
 msgstr	"# Colour of header-lines\n"
+	"# Default: 2 (green)\n"
 
-#: src/lang.c:1849
-msgid	"Color of actual news header fields :"
-msgstr	"Colour of actual news header fields:"
+#: src/lang.c:1962
+msgid	"Color of actual news header fields"
+msgstr	"Colour of actual news header fields"
 
-#: src/lang.c:1850
+#: src/lang.c:1963
 msgid	"# Color of actual news header fields\n"
+	"# Default: 9 (light red)\n"
 msgstr	"# Colour of actual news header fields\n"
+	"# Default: 9 (light red)\n"
 
-#: src/lang.c:1855
-msgid	"Color of article subject lines     :"
-msgstr	"Colour of article subject lines    :"
+#: src/lang.c:1969
+msgid	"Color of article subject lines"
+msgstr	"Colour of article subject lines"
 
-#: src/lang.c:1856
+#: src/lang.c:1970
 msgid	"# Color of article subject\n"
+	"# Default: 6 (cyan)\n"
 msgstr	"# Colour of article subject\n"
+	"# Default: 6 (cyan)\n"
 
-#: src/lang.c:1861
-msgid	"Color of response counter          :"
-msgstr	"Colour of response counter         :"
+#: src/lang.c:1976
+msgid	"Color of response counter"
+msgstr	"Colour of response counter"
 
-#: src/lang.c:1862
+#: src/lang.c:1977
 msgid	"# Color of response counter\n"
+	"# Default: 2 (green)\n"
 msgstr	"# Colour of response counter\n"
+	"# Default: 2 (green)\n"
 
-#: src/lang.c:1867
-msgid	"Color of sender (From:)            :"
-msgstr	"Colour of sender (From:)           :"
+#: src/lang.c:1983
+msgid	"Color of sender (From:)"
+msgstr	"Colour of sender (From:)"
 
-#: src/lang.c:1868
+#: src/lang.c:1984
 msgid	"# Color of sender (From:)\n"
+	"# Default: 2 (green)\n"
 msgstr	"# Colour of sender (From:)\n"
+	"# Default: 2 (green)\n"
 
-#: src/lang.c:1873
-msgid	"Color of help/mail sign            :"
-msgstr	"Colour of help/mail sign           :"
+#: src/lang.c:1990
+msgid	"Color of help/mail sign"
+msgstr	"Colour of help/mail sign"
 
-#: src/lang.c:1874
+#: src/lang.c:1991
 msgid	"# Color of Help/Mail-Sign\n"
+	"# Default: 4 (blue)\n"
 msgstr	"# Colour of Help/Mail-Sign\n"
+	"# Default: 4 (blue)\n"
 
-#: src/lang.c:1879
-msgid	"Color of signatures                :"
-msgstr	"Colour of signatures               :"
+#: src/lang.c:1997
+msgid	"Color of signatures"
+msgstr	"Colour of signatures"
 
-#: src/lang.c:1880
+#: src/lang.c:1998
 msgid	"# Color of signature\n"
+	"# Default: 4 (blue)\n"
 msgstr	"# Colour of signature\n"
+	"# Default: 4 (blue)\n"
 
-#: src/lang.c:1885
-msgid	"Color of highlighting with *stars* :"
-msgstr	"Colour of highlighting with *stars*:"
+#: src/lang.c:2004
+msgid	"Color of highlighted URLs"
+msgstr	"Colour of highlighted URLs"
+
+#: src/lang.c:2005
+msgid	"# Color of highlighted URLs\n"
+	"# Default: -1 (default color)\n"
+msgstr	"# Colour of highlighted URLs\n"
+	"# Default: -1 (default colour)\n"
+
+#: src/lang.c:2011
+msgid	"Color of highlighting with *stars*"
+msgstr	"Colour of highlighting with *stars*"
+
+#: src/lang.c:2012
+msgid	"# Color of word highlighting with *stars*\n"
+	"# Default: 11 (yellow)\n"
+msgstr	"# Colour of word highlighting with *stars*\n"
+	"# Default: 11 (yellow)\n"
+
+#: src/lang.c:2018
+msgid	"Color of highlighting with _dash_"
+msgstr	"Colour of highlighting with _dash_"
+
+#: src/lang.c:2019
+msgid	"# Color of word highlighting with _dash_\n"
+	"# Default: 13 (light pink)\n"
+msgstr	"# Colour of word highlighting with _dash_\n"
+	"# Default: 13 (light pink)\n"
+
+#: src/lang.c:2025
+msgid	"Color of highlighting with /slash/"
+msgstr	"Colour of highlighting with /slash/"
+
+#: src/lang.c:2026
+msgid	"# Color of word highlighting with /slash/\n"
+	"# Default: 14 (light cyan)\n"
+msgstr	"# Colour of word highlighting with /slash/\n"
+	"# Default: 14 (light cyan)\n"
+
+#: src/lang.c:2032
+msgid	"Color of highlighting with -stroke-"
+msgstr	"Colour of highlighting w. -stroke-"
+
+#: src/lang.c:2033
+msgid	"# Color of word highlighting with -stroke-\n"
+	"# Default: 12 (light blue)\n"
+msgstr	"# Colour of word highlighting with -stroke-\n"
+	"# Default: 12 (light blue)\n"
 
-#: src/lang.c:1886
-msgid	"# Color of word highlighting. There are four possibilities\n"
-	"# in articles: *stars*, /slashes/, _underdashes_ and -strokes-.\n"
-msgstr	"# Colour of word highlighting. There are four possibilities\n"
-	"# in articles: *stars*, /slashes/, _underdashes_ and -strokes-.\n"
+#: src/lang.c:2040
+msgid	"Attr. of highlighting with *stars*"
+msgstr	""
 
-#: src/lang.c:1892
-msgid	"Color of highlighting with _dash_  :"
-msgstr	"Colour of highlighting with _dash_ :"
+#: src/lang.c:2041
+msgid	"# Attributes of word highlighting on mono terminals\n"
+	"# Possible values are:\n"
+	"#   0 = Normal\n"
+	"#   1 = Underline\n"
+	"#   2 = Best highlighting\n"
+	"#   3 = Reverse video\n"
+	"#   4 = Blinking\n"
+	"#   5 = Half bright\n"
+	"#   6 = Bold\n"
+	"\n"
+	"# Attribute of word highlighting with *stars*\n"
+	"# Default: 6 (bold)\n"
+msgstr	""
+
+#: src/lang.c:2056
+msgid	"Attr. of highlighting with _dash_"
+msgstr	""
 
-#: src/lang.c:1898
-msgid	"Color of highlighting with /slash/ :"
-msgstr	"Colour of highlighting with /slash/:"
+#: src/lang.c:2057
+msgid	"# Attribute of word highlighting with _dash_\n"
+	"# Default: 2 (best highlighting)\n"
+msgstr	""
 
-#: src/lang.c:1904
-msgid	"Color of highlighting with -stroke-:"
-msgstr	"Colour of highlighting w. -stroke- :"
+#: src/lang.c:2063
+msgid	"Attr. of highlighting with /slash/"
+msgstr	""
 
-#: src/lang.c:1911
-msgid	"Attr. of highlighting with *stars* :"
+#: src/lang.c:2064
+msgid	"# Attribute of word highlighting with /slash/\n"
+	"# Default: 5 (half bright)\n"
 msgstr	""
 
-#: src/lang.c:1912
-msgid	"# Attribute of word highlighting on mono terminals.\n"
-	"# There are four possibilities in articles:\n"
-	"# *stars*, /slashes/, _underdashes_ and -strokes-.\n"
-	"# The possible values are:\n"
-	"# 0 - Normal, 1 - Underline, 2 - Best highlighting,\n"
-	"# 3 - Reverse video, 4 - Blinking, 5 - Half bright, 6 - Bold\n"
+#: src/lang.c:2070
+msgid	"Attr. of highlighting with -stroke-"
 msgstr	""
 
-#: src/lang.c:1922
-msgid	"Attr. of highlighting with _dash_  :"
+#: src/lang.c:2071
+msgid	"# Attribute of word highlighting with -stroke-\n"
+	"# Default: 3 (reverse video)\n"
 msgstr	""
 
-#: src/lang.c:1928
-msgid	"Attr. of highlighting with /slash/ :"
+#: src/lang.c:2077
+msgid	"URL highlighting in message body"
 msgstr	""
 
-#: src/lang.c:1934
-msgid	"Attr. of highlighting with -stroke-:"
+#: src/lang.c:2078
+msgid	"# Enable URL highlighting?\n"
 msgstr	""
 
-#: src/lang.c:1940
-msgid	"Word highlighting in message body  :"
+#: src/lang.c:2083
+msgid	"Word highlighting in message body"
 msgstr	""
 
-#: src/lang.c:1941
+#: src/lang.c:2084
 msgid	"# Enable word highlighting?\n"
 msgstr	""
 
-#: src/lang.c:1946
-msgid	"What to display instead of mark    :"
+#: src/lang.c:2089
+msgid	"What to display instead of mark"
 msgstr	""
 
-#: src/lang.c:1947
+#: src/lang.c:2090
 msgid	"# Should the leading and ending stars and dashes also be displayed,\n"
 	"# even when they are highlighting marks?\n"
-	"# 0 - no    1 - yes, display mark    2 - print a space instead\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = no\n"
+	"#   1 = yes, display mark\n"
+	"# * 2 = print a space instead\n"
 msgstr	""
 
-#: src/lang.c:1953
+#: src/lang.c:2099
 msgid	"Enter column number to wrap article lines to in the pager. <CR> sets."
 msgstr	""
 
-#: src/lang.c:1954
-msgid	"Page line wrap column              :"
+#: src/lang.c:2100
+msgid	"Page line wrap column"
 msgstr	""
 
-#: src/lang.c:1955
+#: src/lang.c:2101
 msgid	"# Wrap article lines at column\n"
 msgstr	""
 
-#: src/lang.c:1960
-msgid	"Wrap around threads on next unread :"
+#: src/lang.c:2106
+msgid	"Wrap around threads on next unread"
 msgstr	""
 
-#: src/lang.c:1961
+#: src/lang.c:2107
 msgid	"# If ON wrap around threads on searching next unread article\n"
 msgstr	""
 
-#: src/lang.c:1965
+#: src/lang.c:2111
 msgid	"Enter default mail address (and fullname). <CR> sets."
 msgstr	""
 
-#: src/lang.c:1966
-msgid	"Mail address (and fullname)        :"
+#: src/lang.c:2112
+msgid	"Mail address (and fullname)"
 msgstr	""
 
-#: src/lang.c:1967
+#: src/lang.c:2113
 msgid	"# User's mail address (and fullname), if not username@host (fullname)\n"
 msgstr	""
 
-#: src/lang.c:1972
-msgid	"Show empty Followup-To in editor   :"
+#: src/lang.c:2118
+msgid	"Show empty Followup-To in editor"
 msgstr	""
 
-#: src/lang.c:1973
+#: src/lang.c:2119
 msgid	"# If ON show empty Followup-To header when editing an article\n"
 msgstr	""
 
-#: src/lang.c:1977
+#: src/lang.c:2123
 msgid	"Enter path/! command/--none to create your default signature. <CR> sets."
 msgstr	""
 
-#: src/lang.c:1978
-msgid	"Create signature from path/command :"
+#: src/lang.c:2124
+msgid	"Create signature from path/command"
 msgstr	""
 
-#: src/lang.c:1979
+#: src/lang.c:2125
 msgid	"# Signature path (random sigs)/file to be used when posting/replying\n"
 	"# default_sigfile=file       appends file as signature\n"
 	"# default_sigfile=!command   executes external command to generate a "
@@ -5013,102 +5329,106 @@ msgid	"# Signature path (random sigs)/fi
 	"# default_sigfile=--none     don't append a signature\n"
 msgstr	""
 
-#: src/lang.c:1986
+#: src/lang.c:2132
 msgid	"Prepend signature with \"-- \" on own line. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:1987
-msgid	"Prepend signature with \"-- \"       :"
+#: src/lang.c:2133
+msgid	"Prepend signature with \"-- \""
 msgstr	""
 
-#: src/lang.c:1988
+#: src/lang.c:2134
 msgid	"# If ON prepend the signature with dashes '\\n-- \\n'\n"
 msgstr	""
 
-#: src/lang.c:1992
+#: src/lang.c:2138
 msgid	"Add signature when reposting articles. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:1993
-msgid	"Add signature when reposting       :"
+#: src/lang.c:2139
+msgid	"Add signature when reposting"
 msgstr	""
 
-#: src/lang.c:1994
+#: src/lang.c:2140
 msgid	"# If ON add signature to reposted articles\n"
 msgstr	""
 
-#: src/lang.c:1998
+#: src/lang.c:2144
+#, c-format
 msgid	"Enter quotation marks, %s or %S for author's initials."
 msgstr	""
 
-#: src/lang.c:1999
-msgid	"Characters used as quote-marks     :"
+#: src/lang.c:2145
+msgid	"Characters used as quote-marks"
 msgstr	""
 
-#: src/lang.c:2000
+#: src/lang.c:2146
+#, c-format
 msgid	"# Characters used in quoting to followups and replies.\n"
 	"# '_' is replaced by ' ', %%s, %%S are replaced by author's initials.\n"
 msgstr	""
 
-#: src/lang.c:2006
-msgid	"Quoting behavior                   :"
-msgstr	"Quoting behaviour                  :"
+#: src/lang.c:2152
+msgid	"Quoting behavior"
+msgstr	"Quoting behaviour"
 
-#: src/lang.c:2007
+#: src/lang.c:2153
 msgid	"# How quoting should be handled when following up or replying.\n"
-	"# 0 = Nothing special\n"
-	"# 1 = Compress quotes\n"
-	"# 2 = Quote signatures\n"
-	"# 3 = Compress quotes, quote signatures\n"
-	"# 4 = Quote empty lines\n"
-	"# 5 = Compress quotes, quote empty lines\n"
-	"# 6 = Quote signatures, quote empty lines\n"
-	"# 7 = Compress quotes, quote signatures, quote empty lines\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = Nothing special\n"
+	"#   1 = Compress quotes\n"
+	"#   2 = Quote signatures\n"
+	"#   3 = Compress quotes, quote signatures\n"
+	"#   4 = Quote empty lines\n"
+	"# * 5 = Compress quotes, quote empty lines\n"
+	"#   6 = Quote signatures, quote empty lines\n"
+	"#   7 = Compress quotes, quote signatures, quote empty lines\n"
 msgstr	""
 
-#: src/lang.c:2019 src/lang.c:2027 src/lang.c:2033
+#: src/lang.c:2166 src/lang.c:2174 src/lang.c:2180
 msgid	"%A Addr %D Date %F Addr+Name %G Groupname %M Message-ID %N Name %C First Name"
 msgstr	""
 
-#: src/lang.c:2020
-msgid	"Quote line when following up       :"
+#: src/lang.c:2167
+msgid	"Quote line when following up"
 msgstr	""
 
-#: src/lang.c:2021
+#: src/lang.c:2168
+#, c-format
 msgid	"# Format of quote line when mailing/posting/following-up an article\n"
 	"# %%A Address    %%D Date   %%F Addr+Name   %%G Groupname   %%M Message-ID\n"
 	"# %%N Full Name  %%C First Name   %%I Initials\n"
 msgstr	""
 
-#: src/lang.c:2028
-msgid	"Quote line when cross-posting      :"
+#: src/lang.c:2175
+msgid	"Quote line when cross-posting"
 msgstr	""
 
-#: src/lang.c:2034
-msgid	"Quote line when mailing            :"
+#: src/lang.c:2181
+msgid	"Quote line when mailing"
 msgstr	""
 
-#: src/lang.c:2039
+#: src/lang.c:2186
 msgid	"If ON, include User-Agent: header. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:2040
-msgid	"Insert 'User-Agent:'-header        :"
+#: src/lang.c:2187
+msgid	"Insert 'User-Agent:'-header"
 msgstr	""
 
-#: src/lang.c:2041
+#: src/lang.c:2188
 msgid	"# If ON include advertising User-Agent: header\n"
 msgstr	""
 
-#: src/lang.c:2045
+#: src/lang.c:2193
 msgid	"Enter charset name for MIME (e.g. US-ASCII, ISO-8859-1, EUC-KR), <CR> to set."
 msgstr	""
 
-#: src/lang.c:2046
-msgid	"MM_CHARSET                         :"
+#: src/lang.c:2194
+msgid	"MM_CHARSET"
 msgstr	""
 
-#: src/lang.c:2047
+#: src/lang.c:2195
 msgid	"# Charset supported locally which is also used for MIME header and\n"
 	"# Content-Type header.\n"
 	"# If not set, the value of the environment variable MM_CHARSET is used.\n"
@@ -5117,27 +5437,27 @@ msgid	"# Charset supported locally which
 	"# mm_charset is considered not displayable and represented as '?'.\n"
 msgstr	""
 
-#: src/lang.c:2058
-msgid	"MM_NETWORK_CHARSET                 :"
+#: src/lang.c:2205
+msgid	"MM_NETWORK_CHARSET"
 msgstr	""
 
-#: src/lang.c:2059
+#: src/lang.c:2206
 msgid	"# Charset used for MIME (Content-Type) header in postings.\n"
 msgstr	""
 
-#: src/lang.c:2065
-msgid	"Mailbox format                     :"
+#: src/lang.c:2212
+msgid	"Mailbox format"
 msgstr	""
 
-#: src/lang.c:2066
+#: src/lang.c:2213
 msgid	"# Format of the mailbox.\n"
 msgstr	""
 
-#: src/lang.c:2071
-msgid	"MIME encoding in news messages     :"
+#: src/lang.c:2218
+msgid	"MIME encoding in news messages"
 msgstr	""
 
-#: src/lang.c:2072
+#: src/lang.c:2219
 msgid	"# MIME encoding (8bit, base64, quoted-printable, 7bit) of the body\n"
 	"# for mails and posts, if necessary. QP is efficient for most European\n"
 	"# character sets (ISO-8859-X) with small fraction of non-US-ASCII chars,\n"
@@ -5145,42 +5465,42 @@ msgid	"# MIME encoding (8bit, base64, qu
 	"# Russian charsets with a lot of 8bit characters.\n"
 msgstr	""
 
-#: src/lang.c:2080 src/lang.c:2101
+#: src/lang.c:2227 src/lang.c:2248
 msgid	"Don't change unless you know what you are doing. <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:2081
-msgid	"Use 8bit characters in news headers:"
+#: src/lang.c:2228
+msgid	"Use 8bit characters in news headers"
 msgstr	""
 
-#: src/lang.c:2082
+#: src/lang.c:2229
 msgid	"# If ON, 8bit characters in news headers are NOT encoded.\n"
 	"# default is OFF. Thus 8bit characters are encoded by default.\n"
 	"# 8bit chars in header are encoded regardless of the value of this\n"
 	"# parameter unless post_mime_encoding is 8bit as well.\n"
 msgstr	""
 
-#: src/lang.c:2089
+#: src/lang.c:2236
 msgid	"Auto-view post-processed files <SPACE> toggles, <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:2090
-msgid	"View post-processed files          :"
+#: src/lang.c:2237
+msgid	"View post-processed files"
 msgstr	""
 
-#: src/lang.c:2091
+#: src/lang.c:2238
 msgid	"# If set, post processed files will be opened in a viewer\n"
 msgstr	""
 
-#: src/lang.c:2096
-msgid	"MIME encoding in mail messages     :"
+#: src/lang.c:2243
+msgid	"MIME encoding in mail messages"
 msgstr	""
 
-#: src/lang.c:2102
-msgid	"Use 8bit characters in mail headers:"
+#: src/lang.c:2249
+msgid	"Use 8bit characters in mail headers"
 msgstr	""
 
-#: src/lang.c:2103
+#: src/lang.c:2250
 msgid	"# If ON, 8bit characters in mail headers are NOT encoded.\n"
 	"# default is OFF. Thus 8bit characters are encoded by default.\n"
 	"# 8bit chars in headers are encoded regardless of the value of this "
@@ -5190,665 +5510,525 @@ msgid	"# If ON, 8bit characters in mail 
 	"# turn it ON unless you have some compelling reason.\n"
 msgstr	""
 
-#: src/lang.c:2113
-msgid	"Strip blanks from ends of lines    :"
+#: src/lang.c:2260
+msgid	"Strip blanks from ends of lines"
 msgstr	""
 
-#: src/lang.c:2114
+#: src/lang.c:2261
 msgid	"# If ON strip blanks from ends of lines for faster display on slow "
 	"terminals.\n"
 msgstr	""
 
-#: src/lang.c:2119
+#: src/lang.c:2266
 msgid	"If ON, use transliteration. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:2120
-msgid	"Transliteration                    :"
+#: src/lang.c:2267
+msgid	"Transliteration"
 msgstr	""
 
-#: src/lang.c:2121
+#: src/lang.c:2268
 msgid	"# If ON, use //TRANSLIT extension. This means that when a character cannot\n"
 	"# be represented in the in the target character set, it can be approximated\n"
 	"# through one or several similarly looking characters.\n"
 msgstr	""
 
-#: src/lang.c:2128
+#: src/lang.c:2275
 msgid	"Send you a carbon copy automatically. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:2129
-msgid	"Send you a cc automatically        :"
+#: src/lang.c:2276
+msgid	"Send you a cc automatically"
 msgstr	""
 
-#: src/lang.c:2130
+#: src/lang.c:2277
 msgid	"# If ON automatically put your name in the Cc: field when mailing an article\n"
 msgstr	""
 
-#: src/lang.c:2134
+#: src/lang.c:2281
 msgid	"Send you a blind carbon copy automatically. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:2135
-msgid	"Send you a blind cc automatically  :"
+#: src/lang.c:2282
+msgid	"Send you a blind cc automatically"
 msgstr	""
 
-#: src/lang.c:2136
+#: src/lang.c:2283
 msgid	"# If ON automatically put your name in the Bcc: field when mailing an "
 	"article\n"
 msgstr	""
 
-#: src/lang.c:2140
+#: src/lang.c:2287
 msgid	"Enter address elements about which you want to be warned. <CR> sets."
 msgstr	""
 
-#: src/lang.c:2141
-msgid	"Spamtrap warning address parts     :"
+#: src/lang.c:2288
+msgid	"Spamtrap warning address parts"
 msgstr	""
 
-#: src/lang.c:2142
+#: src/lang.c:2289
 msgid	"# A comma-delimited list of address-parts you want to be warned\n"
 	"# about when trying to reply by email.\n"
 msgstr	""
 
-#: src/lang.c:2147
+#: src/lang.c:2294
 msgid	"Enter default number of days a filter entry will be valid. <CR> sets."
 msgstr	""
 
-#: src/lang.c:2148
-msgid	"No. of days a filter entry is valid:"
+#: src/lang.c:2295
+msgid	"No. of days a filter entry is valid"
 msgstr	""
 
-#: src/lang.c:2149
+#: src/lang.c:2296
 msgid	"# Number of days a short term filter will be active\n"
 msgstr	""
 
-#: src/lang.c:2153
+#: src/lang.c:2300
 msgid	"Add posted articles to filter. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:2154
-msgid	"Add posted articles to filter      :"
+#: src/lang.c:2301
+msgid	"Add posted articles to filter"
 msgstr	""
 
-#: src/lang.c:2155
+#: src/lang.c:2302
 msgid	"# If ON add posted articles which start a new thread to filter for\n"
 	"# highlighting follow-ups\n"
 msgstr	""
 
-#: src/lang.c:2159
+#: src/lang.c:2306
 msgid	"The directory where articles/threads are to be saved in mailbox format."
 msgstr	""
 
-#: src/lang.c:2160
-msgid	"Mail directory                     :"
+#: src/lang.c:2307
+msgid	"Mail directory"
 msgstr	""
 
-#: src/lang.c:2161
+#: src/lang.c:2308
 msgid	"# (-m) directory where articles/threads are saved in mailbox format\n"
 msgstr	""
 
-#: src/lang.c:2166
-msgid	"Save articles in batch mode (-S)   :"
+#: src/lang.c:2313
+msgid	"Save articles in batch mode (-S)"
 msgstr	""
 
-#: src/lang.c:2167
+#: src/lang.c:2314
 msgid	"# If ON articles/threads will be saved in batch mode when save -S\n"
 	"# or mail (-M/-N) is specified on the command line\n"
 msgstr	""
 
-#: src/lang.c:2172
+#: src/lang.c:2319
 msgid	"The directory where you want articles/threads saved."
 msgstr	""
 
-#: src/lang.c:2173
-msgid	"Directory to save arts/threads in  :"
+#: src/lang.c:2320
+msgid	"Directory to save arts/threads in"
 msgstr	""
 
-#: src/lang.c:2174
+#: src/lang.c:2321
 msgid	"# Directory where articles/threads are saved\n"
 msgstr	""
 
-#: src/lang.c:2178
+#: src/lang.c:2325
 msgid	"Auto save article/thread by Archive-name: header. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:2179
-msgid	"Use Archive-name: header for save  :"
+#: src/lang.c:2326
+msgid	"Use Archive-name: header for save"
 msgstr	""
 
-#: src/lang.c:2180
+#: src/lang.c:2327
 msgid	"# If ON articles/threads with Archive-name: in mail header will\n"
 	"# be automatically saved with the Archive-name & part/patch no.\n"
 msgstr	""
 
-#: src/lang.c:2185
+#: src/lang.c:2332
 msgid	"Mark saved articles/threads as read. <SPACE> toggles, <CR> sets, <ESC> "
 	"cancels."
 msgstr	""
 
-#: src/lang.c:2186
-msgid	"Mark saved articles/threads as read:"
+#: src/lang.c:2333
+msgid	"Mark saved articles/threads as read"
 msgstr	""
 
-#: src/lang.c:2187
+#: src/lang.c:2334
 msgid	"# If ON mark articles that are saved as read\n"
 msgstr	""
 
-#: src/lang.c:2191
+#: src/lang.c:2338
 msgid	"Do post processing (eg. extract attachments) for saved articles."
 msgstr	""
 
-#: src/lang.c:2192
-msgid	"Post process saved articles        :"
+#: src/lang.c:2339
+msgid	"Post process saved articles"
 msgstr	""
 
-#: src/lang.c:2193
+#: src/lang.c:2340
 msgid	"# Perform post processing (saving binary attachments) from saved articles.\n"
-	"# 0=(no) 1=(yes) 2=(extract shell archives (shar) only)\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no\n"
+	"#   1 = extract shell archives (shar) only\n"
+	"#   2 = yes\n"
 msgstr	""
 
-#: src/lang.c:2199
-msgid	"Process only unread articles       :"
+#: src/lang.c:2349
+msgid	"Process only unread articles"
 msgstr	""
 
-#: src/lang.c:2200
+#: src/lang.c:2350
 msgid	"# If ON only save/print/pipe/mail unread articles (tagged articles excepted)\n"
 msgstr	""
 
-#: src/lang.c:2205
+#: src/lang.c:2355
 msgid	"Print all or just part of header. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:2206
-msgid	"Print all headers when printing    :"
+#: src/lang.c:2356
+msgid	"Print all headers when printing"
 msgstr	""
 
-#: src/lang.c:2207
+#: src/lang.c:2357
 msgid	"# If ON print all of article header otherwise just the important lines\n"
 msgstr	""
 
-#: src/lang.c:2211
+#: src/lang.c:2361
 msgid	"The printer program with options that is to be used to print articles/threads."
 msgstr	""
 
-#: src/lang.c:2212
-msgid	"Printer program with options       :"
+#: src/lang.c:2362
+msgid	"Printer program with options"
 msgstr	""
 
-#: src/lang.c:2213
+#: src/lang.c:2363
 msgid	"# Print program with parameters used to print articles/threads\n"
 msgstr	""
 
-#: src/lang.c:2219
-msgid	"Force redraw after certain commands:"
+#: src/lang.c:2369
+msgid	"Force redraw after certain commands"
 msgstr	""
 
-#: src/lang.c:2220
+#: src/lang.c:2370
 msgid	"# If ON a screen redraw will always be done after certain external commands\n"
 msgstr	""
 
-#: src/lang.c:2224
+#: src/lang.c:2374
 msgid	"Start editor with line offset. <SPACE> toggles, <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/lang.c:2225
-msgid	"Start editor with line offset      :"
+#: src/lang.c:2375
+msgid	"Start editor with line offset"
 msgstr	""
 
-#: src/lang.c:2226
+#: src/lang.c:2376
 msgid	"# If ON editor will be started with cursor offset into the file\n"
 	"# otherwise the cursor will be positioned at the first line\n"
 msgstr	""
 
-#: src/lang.c:2231
+#: src/lang.c:2381
 msgid	"Enter %E for editor, %F for filename, %N for line-number, <CR> to set."
 msgstr	""
 
-#: src/lang.c:2232
-msgid	"Invocation of your editor          :"
+#: src/lang.c:2382
+msgid	"Invocation of your editor"
 msgstr	""
 
-#: src/lang.c:2233
+#: src/lang.c:2383
+#, c-format
 msgid	"# Format of editor line including parameters\n"
 	"# %%E Editor  %%F Filename  %%N Linenumber\n"
 msgstr	""
 
-#: src/lang.c:2238
+#: src/lang.c:2388
 msgid	"Enter name and options for external-inews, --internal for internal inews"
 msgstr	""
 
-#: src/lang.c:2239
-msgid	"External inews                     :"
+#: src/lang.c:2389
+msgid	"External inews"
 msgstr	""
 
-#: src/lang.c:2240
+#: src/lang.c:2390
 msgid	"# If --internal use the built in mini inews for posting via NNTP\n"
 	"# otherwise use an external inews program\n"
 msgstr	""
 
-#: src/lang.c:2244
+#: src/lang.c:2394
 msgid	"Enter %M for mailer, %S for subject, %T for to, %F for filename, <CR> to set."
 msgstr	""
 
-#: src/lang.c:2245
-msgid	"Invocation of your mail command    :"
+#: src/lang.c:2395
+msgid	"Invocation of your mail command"
 msgstr	""
 
-#: src/lang.c:2246
+#: src/lang.c:2396
+#, c-format
 msgid	"# Format of mailer line including parameters\n"
-	"# %%M Mailer  %%S Subject  %%T To  %%F Filename  %%U User (AmigaDOS)\n"
+	"# %%M Mailer  %%S Subject  %%T To  %%F Filename\n"
 	"# ie. to use elm as your mailer:    elm -s \"%%S\" \"%%T\" < %%F\n"
 	"# ie. elm interactive          :    elm -i %%F -s \"%%S\" \"%%T\"\n"
 msgstr	""
 
-#: src/lang.c:2254
-msgid	"Use interactive mail reader        :"
+#: src/lang.c:2404
+msgid	"Use interactive mail reader"
 msgstr	""
 
-#: src/lang.c:2255
-msgid	"# Interactive mailreader: if ON mailreader will be invoked earlier for\n"
-	"# reply so you can use more of its features (eg. MIME, pgp, ...)\n"
-	"# this option has to suit default_mailer_format\n"
+#: src/lang.c:2405
+msgid	"# Interactive mailreader\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no interactive mailreader\n"
+	"#   1 = use interactive mailreader with headers in file\n"
+	"#   2 = use interactive mailreader without headers in file\n"
 msgstr	""
 
-#: src/lang.c:2262
-msgid	"Remove ~/.article after posting    :"
+#: src/lang.c:2414
+msgid	"Remove ~/.article after posting"
 msgstr	""
 
-#: src/lang.c:2263
+#: src/lang.c:2415
 msgid	"# If ON remove ~/.article after posting.\n"
 msgstr	""
 
-#: src/lang.c:2267
+#: src/lang.c:2419
 msgid	"Filename for all posted articles, <CR> sets, no filename=do not save."
 msgstr	""
 
-#: src/lang.c:2268
-msgid	"Filename for posted articles       :"
+#: src/lang.c:2420
+msgid	"Filename for posted articles"
 msgstr	""
 
-#: src/lang.c:2269
+#: src/lang.c:2421
 msgid	"# Filename where to keep all postings (default posted)\n"
 	"# If no filename is set then postings will not be saved\n"
 msgstr	""
 
-#: src/lang.c:2274
+#: src/lang.c:2426
 msgid	"Keep all failed articles in ~/dead.articles. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:2275
-msgid	"Keep failed arts in ~/dead.articles:"
+#: src/lang.c:2427
+msgid	"Keep failed arts in ~/dead.articles"
 msgstr	""
 
-#: src/lang.c:2276
+#: src/lang.c:2428
 msgid	"# If ON keep all failed postings in ~/dead.articles\n"
 msgstr	""
 
-#: src/lang.c:2280
+#: src/lang.c:2432
 msgid	"Do you want to strip unsubscribed groups from .newsrc"
 msgstr	""
 
-#: src/lang.c:2281
-msgid	"No unsubscribed groups in newsrc   :"
+#: src/lang.c:2433
+msgid	"No unsubscribed groups in newsrc"
 msgstr	""
 
-#: src/lang.c:2282
+#: src/lang.c:2434
 msgid	"# If ON strip unsubscribed groups from newsrc\n"
 msgstr	""
 
-#: src/lang.c:2287
-msgid	"Remove bogus groups from newsrc    :"
+#: src/lang.c:2439
+msgid	"Remove bogus groups from newsrc"
 msgstr	""
 
-#: src/lang.c:2288
+#: src/lang.c:2440
 msgid	"# What to do with bogus groups in newsrc file\n"
-	"# 0=(Keep) 1=(Remove) 2=(Highlight with D on selection screen).\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = keep\n"
+	"#   1 = remove\n"
+	"#   2 = highlight with D on selection screen\n"
 msgstr	""
 
-#: src/lang.c:2292
+#: src/lang.c:2448
 msgid	"Enter number of seconds until active file will be reread. <CR> sets."
 msgstr	""
 
-#: src/lang.c:2293
-msgid	"Interval in secs to reread active  :"
+#: src/lang.c:2449
+msgid	"Interval in secs to reread active"
 msgstr	""
 
-#: src/lang.c:2294
+#: src/lang.c:2450
 msgid	"# Time interval in seconds between rereading the active file (0=never)\n"
 msgstr	""
 
-#: src/lang.c:2299
-msgid	"Reconnect to server automatically  :"
+#: src/lang.c:2455
+msgid	"Reconnect to server automatically"
 msgstr	""
 
-#: src/lang.c:2300
+#: src/lang.c:2456
 msgid	"# If ON automatically reconnect to NNTP server if the connection is broken\n"
 msgstr	""
 
-#: src/lang.c:2304
+#: src/lang.c:2460
 msgid	"Create local copies of NNTP overview files. <SPACE> toggles & <CR> sets."
 msgstr	""
 
-#: src/lang.c:2305
-msgid	"Cache NNTP overview files locally  :"
+#: src/lang.c:2461
+msgid	"Cache NNTP overview files locally"
 msgstr	""
 
-#: src/lang.c:2306
+#: src/lang.c:2462
 msgid	"# If ON, create local copies of NNTP overview files.\n"
 msgstr	""
 
-#: src/main.c:619
-#, c-format
-msgid	"Version: %s release %s (\"%s\") %s %s"
-msgstr	""
-
-#: src/main.c:622
-#, c-format
-msgid	"Version: %s release %s (\"%s\")"
-msgstr	""
-
-#: src/nntplib.c:804
-#, c-format
-msgid	"\n"
-	"Server timed out, trying reconnect # %d\n"
-msgstr	""
-
-#: src/nntplib.c:822
-msgid	"Rejoin current group\n"
-msgstr	""
-
-#: src/nntplib.c:829
-#, c-format
-msgid	"Read (%s)\n"
-msgstr	""
-
-#: src/nntplib.c:831
-#, c-format
-msgid	"Resend last command (%s)\n"
-msgstr	""
-
-#: src/nntplib.c:951
-msgid	"100  Help text on way"
-msgstr	""
-
-#: src/nntplib.c:955
-msgid	"180  Authorization capabilities"
-msgstr	"180  Authorisation capabilities"
-
-#: src/nntplib.c:959
-msgid	"199  Debug output"
-msgstr	""
-
-#: src/nntplib.c:963
-msgid	"200  Hello; you can post"
-msgstr	""
-
-#: src/nntplib.c:967
-msgid	"201  Hello; you can't post"
-msgstr	""
-
-#: src/nntplib.c:971
-msgid	"202  Slave status noted"
-msgstr	""
-
-#: src/nntplib.c:979
-msgid	"211  Group selected"
-msgstr	""
-
-#: src/nntplib.c:984
-msgid	"215  Newsgroups follow"
-msgstr	""
-
-#: src/nntplib.c:989
-msgid	"218  Group index file follows"
-msgstr	""
-
-#: src/nntplib.c:994
-msgid	"220  Article (head & body) follows"
-msgstr	""
-
-#: src/nntplib.c:998
-msgid	"221  Head follows"
-msgstr	""
-
-#: src/nntplib.c:1002
-msgid	"222  Body follows"
-msgstr	""
-
-#: src/nntplib.c:1006
-msgid	"223  No text sent -- stat, next, last"
-msgstr	""
-
-#: src/nntplib.c:1010
-msgid	"230  New articles by message-id follow"
-msgstr	""
-
-#: src/nntplib.c:1014
-msgid	"231  New newsgroups follow"
-msgstr	""
-
-#: src/nntplib.c:1018
-msgid	"235  Article transferred successfully"
-msgstr	""
-
-#: src/nntplib.c:1022
-msgid	"240  Article posted successfully"
-msgstr	""
-
-#: src/nntplib.c:1026
-msgid	"280  Authorization system ok"
-msgstr	"280  Authorisation system ok"
-
-#: src/nntplib.c:1030
-msgid	"281  Authorization (user/pass) ok"
-msgstr	"281  Authorisation (user/pass) ok"
-
-#: src/nntplib.c:1034
-msgid	"282  binary data follows"
-msgstr	""
-
-#: src/nntplib.c:1038
-msgid	"283  spooldir list follows"
-msgstr	""
-
-#: src/nntplib.c:1042
-msgid	"284  Switching to a different spooldir"
-msgstr	""
-
-#: src/nntplib.c:1046
-msgid	"285  Still using same spooldir"
-msgstr	""
-
-#: src/nntplib.c:1050
-msgid	"286  Current spooldir"
-msgstr	""
-
-#: src/nntplib.c:1054
-msgid	"287  Available spooldir"
-msgstr	""
-
-#: src/nntplib.c:1058
-msgid	"288  Unavailable spooldir or invalid entry"
-msgstr	""
-
-#: src/nntplib.c:1062
-msgid	"335  Continue to send article"
-msgstr	""
-
-#: src/nntplib.c:1066
-msgid	"340  Continue to post article"
-msgstr	""
-
-#: src/nntplib.c:1070
-msgid	"380  authorization is required"
-msgstr	"380  authorisation is required"
-
-#: src/nntplib.c:1074
-msgid	"381  <type> authorization data required"
-msgstr	"381  <type> authorisation data required"
-
-#: src/nntplib.c:1078
-msgid	"400  Have to hang up for some reason"
-msgstr	""
-
-#: src/nntplib.c:1082
-msgid	"411  No such newsgroup"
-msgstr	""
-
-#: src/nntplib.c:1086
-msgid	"412  Not currently in newsgroup"
-msgstr	""
-
-#: src/nntplib.c:1090
-msgid	"418  No index file for this group"
-msgstr	""
-
-#: src/nntplib.c:1094
-msgid	"420  No current article selected"
-msgstr	""
-
-#: src/nntplib.c:1098
-msgid	"421  No next article in this group"
+#: src/lang.c:2466
+msgid	"Enter format string. <CR> sets, <ESC> cancels."
 msgstr	""
 
-#: src/nntplib.c:1102
-msgid	"422  No previous article in this group"
+#: src/lang.c:2467
+msgid	"Format string for display of dates"
 msgstr	""
 
-#: src/nntplib.c:1106
-msgid	"423  No such article in this group"
+#: src/lang.c:2468
+msgid	"# Format string for date representation\n"
 msgstr	""
 
-#: src/nntplib.c:1110
-msgid	"430  No such article at all"
-msgstr	""
+#: src/lang.c:2474
+msgid	"Unicode normalization form"
+msgstr	"Unicode normalisation form"
 
-#: src/nntplib.c:1114
-msgid	"435  Already got that article, don't send"
-msgstr	""
+#: src/lang.c:2475
+msgid	"# Unicode normalization form\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = None\n"
+	"# * 1 = NFKC\n"
+	"#   2 = NFKD\n"
+	"#   3 = NFC\n"
+	"#   4 = NFD\n"
+msgstr	"# Unicode normalisation form\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = None\n"
+	"# * 1 = NFKC\n"
+	"#   2 = NFKD\n"
+	"#   3 = NFC\n"
+	"#   4 = NFD\n"
 
-#: src/nntplib.c:1118
-msgid	"436  Transfer failed"
+#: src/lang.c:2487
+msgid	"Render BiDi"
 msgstr	""
 
-#: src/nntplib.c:1122
-msgid	"437  Article rejected, don't resend"
+#: src/lang.c:2488
+msgid	"# If ON, bi-directional text is rendered by tin\n"
 msgstr	""
 
-#: src/nntplib.c:1126
-msgid	"440  Posting not allowed"
+#: src/misc.c:3750
+#, c-format
+msgid	"Version: %s %s release %s (\"%s\") %s %s\n"
 msgstr	""
 
-#: src/nntplib.c:1130
-msgid	"441  Posting failed"
+#: src/misc.c:3753
+#, c-format
+msgid	"Version: %s %s release %s (\"%s\")\n"
 msgstr	""
 
-#: src/nntplib.c:1134
-msgid	"480  authorization required for command"
-msgstr	"480  authorisation required for command"
-
-#: src/nntplib.c:1138
-msgid	"481  Authorization system invalid"
-msgstr	"481  Authorisation system invalid"
-
-#: src/nntplib.c:1142
-msgid	"482  Authorization data rejected"
-msgstr	"482  Authorisation data rejected"
-
-#: src/nntplib.c:1146
-msgid	"483  Invalid alias on spooldir cmd"
+#: src/newsrc.c:430
+msgid	"Unreachable?\n"
 msgstr	""
 
-#: src/nntplib.c:1150
-msgid	"484  No spooldir file found"
+#: src/nntplib.c:824
+#, c-format
+msgid	"\n"
+	"Server timed out, trying reconnect # %d\n"
 msgstr	""
 
-#: src/nntplib.c:1154
-msgid	"500  Command not recognized"
-msgstr	"500  Command not recognised"
-
-#: src/nntplib.c:1158
-msgid	"501  Command syntax error"
+#: src/nntplib.c:842
+msgid	"Rejoin current group\n"
 msgstr	""
 
-#: src/nntplib.c:1162
-msgid	"502  Access to server denied"
+#: src/nntplib.c:849
+#, c-format
+msgid	"Read (%s)\n"
 msgstr	""
 
-#: src/nntplib.c:1167
-msgid	"503  Program fault, command not performed"
+#: src/nntplib.c:851
+#, c-format
+msgid	"Resend last command (%s)\n"
 msgstr	""
 
-#: src/nntplib.c:1171
-msgid	"580  Authorization Failed"
-msgstr	"580  Authorisation Failed"
-
-#: src/nntplib.c:1175
-msgid	"Unknown NNTP response code"
+#.
+#. * TODO: - store a hash value of the entire motd in the server-rc
+#. *         and only if it differs from the old value display the
+#. *         motd?
+#. *       - use some sort of pager?
+#. *       - -> lang.c
+#.
+#: src/nntplib.c:1759
+msgid	"MOTD: "
 msgstr	""
 
-#: src/nrctbl.c:172
+#: src/nrctbl.c:170
 #, c-format
 msgid	"couldn't expand %s\n"
 msgstr	""
 
-#: src/open.c:1032
-msgid	"Unreachable?\n"
+#: src/post.c:1171
+#, c-format
+msgid	"Line %d is longer than 998 octets and should be folded, but\n"
+	"encoding is neither set to %s nor to %s\n"
 msgstr	""
 
-#: src/post.c:1749
+#: src/post.c:1176
 #, c-format
-msgid	"%s is bogus"
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is set to %s without enabling MIME_BREAK_LONG_LINES or\n"
+	"posting doesn't contain any 8bit chars and thus folding won't happen\n"
 msgstr	""
 
-#: src/post.c:1940
+#: src/post.c:1178
 #, c-format
-msgid	"Posting: %.*s ..."
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is not set to %s\n"
 msgstr	""
 
-#. TODO: -> lang.c
-#: src/post.c:4038
+#: src/post.c:1993
 #, c-format
-msgid	"Rereading %s..."
+msgid	"Posting: %.*s ..."
 msgstr	""
 
-#. fp
 #. Check if okay to read
-#: src/read.c:219
+#: src/read.c:211
 msgid	"Aborting read, please wait..."
 msgstr	""
 
-#: src/read.c:366
+#: src/read.c:358
 msgid	"Aborted read\n"
 msgstr	""
 
-#: src/read.c:422
+#: src/read.c:414
 msgid	"Draining\n"
 msgstr	""
 
 #. Don't hash the initial '<'
-#: src/refs.c:220
+#: src/refs.c:251
 msgid	"unchanged"
 msgstr	""
 
-#: src/refs.c:573
+#: src/refs.c:609
 msgid	"[- Unavailable -]"
 msgstr	""
 
-#: src/save.c:975
+#.
+#. * preamble
+#. * TODO: -> lang.c
+#.
+#: src/rfc2047.c:1201
+#, c-format
+msgid	"This message has been composed in the 'multipart/mixed' MIME-format. If you\n"
+	"are reading this prefix, your mail reader probably has not yet been modified\n"
+	"to understand the new format, and some of what follows may look strange.\n"
+	"\n"
+msgstr	""
+
+#: src/save.c:972
 msgid	"bytes"
 msgstr	""
 
-#: src/select.c:351
+#: src/select.c:379
 msgid	"unread"
 msgstr	""
 
-#: src/select.c:351
+#: src/select.c:379
 msgid	"all"
 msgstr	""
 
-#: src/select.c:525 src/select.c:527
+#: src/select.c:549 src/select.c:551
 msgid	" R"
 msgstr	""
 
Binary files tin-1.6.2/po/et.gmo and tin-1.8.0/po/et.gmo differ
diff -Nurp tin-1.6.2/po/et.po tin-1.8.0/po/et.po
--- tin-1.6.2/po/et.po	2003-09-10 17:07:56.000000000 +0200
+++ tin-1.8.0/po/et.po	2005-12-24 19:09:51.225693037 +0100
@@ -1,233 +1,311 @@
 # Estonian translations for tin
 # Copyright © 2002 Free Software Foundation, Inc.
-# Toomas Soome <Toomas.Soome@microlink.ee>, 2003.
+# Toomas Soome <Toomas.Soome@microlink.ee>, 2005.
 #
 msgid	""
-msgstr	"Project-Id-Version: tin 1.6.0\n"
-	"POT-Creation-Date: 2003-09-10 17:05+0200\n"
-	"PO-Revision-Date: 2003-07-15 11:07+0300\n"
+msgstr	"Project-Id-Version: tin 1.7.11\n"
+	"Report-Msgid-Bugs-To: \n"
+	"POT-Creation-Date: 2005-12-24 19:09+0100\n"
+	"PO-Revision-Date: 2005-09-30 09:49+0300\n"
 	"Last-Translator: Toomas Soome <Toomas.Soome@microlink.ee>\n"
 	"Language-Team: Estonian <et@li.org>\n"
 	"MIME-Version: 1.0\n"
 	"Content-Type: text/plain; charset=ISO-8859-15\n"
 	"Content-Transfer-Encoding: 8bit\n"
 
-#: src/attrib.c:574
+#: src/art.c:1533
+#, c-format
+msgid	"%d Bad overview record (%d fields) '%s'"
+msgstr	"%d Vigane overview kirje (%d välja) '%s'"
+
+#: src/attrib.c:649
+#, c-format
 msgid	"# Do not edit this comment block\n"
 	"#\n"
 msgstr	"# Ärge seda kommentaari blokki muutke\n"
 	"#\n"
 
-#: src/attrib.c:575
+#: src/attrib.c:650
+#, c-format
 msgid	"#  scope=STRING (ie. alt.*,!alt.bin*) [mandatory]\n"
 msgstr	"#  scope=SÕNE (n. alt.*,!alt.bin*) [kohustuslik]\n"
 
-#: src/attrib.c:576
+#: src/attrib.c:651
+#, c-format
 msgid	"#  maildir=STRING (ie. ~/Mail)\n"
 msgstr	"#  maildir=SÕNE (n. ~/Mail)\n"
 
-#: src/attrib.c:577
+#: src/attrib.c:652
+#, c-format
 msgid	"#  savedir=STRING (ie. ~user/News)\n"
 msgstr	"#  savedir=SÕNE (n. ~user/News)\n"
 
-#: src/attrib.c:578
+#: src/attrib.c:653
+#, c-format
 msgid	"#  savefile=STRING (ie. =linux)\n"
 msgstr	"#  savefile=SÕNE (n. =linux)\n"
 
-#: src/attrib.c:579
+#: src/attrib.c:654
+#, c-format
 msgid	"#  sigfile=STRING (ie. $var/sig)\n"
 msgstr	"#  sigfile=SÕNE (n. $var/sig)\n"
 
-#: src/attrib.c:580
+#: src/attrib.c:655
+#, c-format
 msgid	"#  organization=STRING (if beginning with '/' read from file)\n"
 msgstr	"#  organization=SÕNE (kui algab sümboliga '/', loe failist)\n"
 
-#: src/attrib.c:581
+#: src/attrib.c:656
+#, c-format
 msgid	"#  followup_to=STRING\n"
 msgstr	"#  followup_to=SÕNE\n"
 
-#: src/attrib.c:582
+#: src/attrib.c:657
+#, c-format
 msgid	"#  mailing_list=STRING (ie. majordomo@example.org)\n"
 msgstr	"#  mailing_list=SÕNE (n. majordomo@example.org)\n"
 
-#: src/attrib.c:583
+#: src/attrib.c:658
+#, c-format
 msgid	"#  x_headers=STRING (ie. ~/.tin/extra-headers)\n"
 msgstr	"#  x_headers=SÕNE (n. ~/.tin/extra-headers)\n"
 
-#: src/attrib.c:584
+#: src/attrib.c:659
+#, c-format
 msgid	"#  x_body=STRING (ie. ~/.tin/extra-body-text)\n"
 msgstr	"#  x_body=SÕNE (n. ~/.tin/extra-body-text)\n"
 
-#: src/attrib.c:585
+#: src/attrib.c:660
+#, c-format
 msgid	"#  from=STRING (just append wanted From:-line, don't use quotes)\n"
 msgstr	"#  from=SÕNE (kirjutage soovitav From: rida, ärge kasutage jutumärke)\n"
 
-#: src/attrib.c:586
+#: src/attrib.c:661
+#, c-format
 msgid	"#  news_quote_format=STRING\n"
 msgstr	"#  news_quote_format=SÕNE\n"
 
-#: src/attrib.c:587
+#: src/attrib.c:662
+#, c-format
 msgid	"#  quote_chars=STRING (%%s, %%S for initials)\n"
 msgstr	"#  quote_chars=SÕNE (%%s, %%S annavad initsiaalid)\n"
 
-#: src/attrib.c:588
+#: src/attrib.c:663
+#, c-format
 msgid	"#  mime_types_to_save=STRING (eg. image/*,!image/bmp)\n"
 msgstr	"#  mime_types_to_save=SÕNE (n. image/*,!image/bmp)\n"
 
-#: src/attrib.c:590
+#: src/attrib.c:665
+#, c-format
 msgid	"#  ispell=STRING\n"
 msgstr	"#  ispell=SÕNE\n"
 
-#: src/attrib.c:592
+#: src/attrib.c:667
+#, c-format
 msgid	"#  auto_select=ON/OFF\n"
 msgstr	"#  auto_select=ON/OFF\n"
 
-#: src/attrib.c:593
+#: src/attrib.c:668
+#, c-format
 msgid	"#  auto_save=ON/OFF\n"
 msgstr	"#  auto_save=ON/OFF\n"
 
-#: src/attrib.c:594
+#: src/attrib.c:669
+#, c-format
 msgid	"#  batch_save=ON/OFF\n"
 msgstr	"#  batch_save=ON/OFF\n"
 
-#: src/attrib.c:595
+#: src/attrib.c:670
+#, c-format
 msgid	"#  delete_tmp_files=ON/OFF\n"
 msgstr	"#  delete_tmp_files=ON/OFF\n"
 
-#: src/attrib.c:596
+#: src/attrib.c:671
+#, c-format
 msgid	"#  show_only_unread=ON/OFF\n"
 msgstr	"#  show_only_unread=ON/OFF\n"
 
-#: src/attrib.c:597
+#: src/attrib.c:672
+#, c-format
 msgid	"#  thread_arts=NUM"
 msgstr	"#  thread_arts=NUM"
 
-#: src/attrib.c:604
+#: src/attrib.c:679
+#, c-format
+msgid	"#  thread_perc=NUM\n"
+msgstr	"#  thread_perc=NUM\n"
+
+#: src/attrib.c:680
+#, c-format
 msgid	"#  show_author=NUM\n"
 msgstr	"#  show_author=NUM\n"
 
-#: src/attrib.c:610
+#: src/attrib.c:686
+#, c-format
+msgid	"#  show_info=NUM\n"
+msgstr	"#  show_info=NUM\n"
+
+#: src/attrib.c:692
+#, c-format
 msgid	"#  sort_art_type=NUM\n"
 msgstr	"#  sort_art_type=NUM\n"
 
-#: src/attrib.c:628
+#: src/attrib.c:710
+#, c-format
 msgid	"#  sort_threads_type=NUM\n"
 msgstr	"#  sort_threads_type=NUM\n"
 
-#: src/attrib.c:633
+#: src/attrib.c:715
+#, c-format
 msgid	"#  post_proc_type=NUM\n"
 msgstr	"#  post_proc_type=NUM\n"
 
-#: src/attrib.c:638
+#: src/attrib.c:720
+#, c-format
 msgid	"#  quick_kill_scope=STRING (ie. talk.*)\n"
 msgstr	"#  quick_kill_scope=SÕNE (n. talk.*)\n"
 
-#: src/attrib.c:639
+#: src/attrib.c:721
+#, c-format
 msgid	"#  quick_kill_expire=ON/OFF\n"
 msgstr	"#  quick_kill_expire=ON/OFF\n"
 
-#: src/attrib.c:640
+#: src/attrib.c:722
+#, c-format
 msgid	"#  quick_kill_case=ON/OFF\n"
 msgstr	"#  quick_kill_case=ON/OFF\n"
 
-#: src/attrib.c:641
+#: src/attrib.c:723
+#, c-format
 msgid	"#  quick_kill_header=NUM\n"
 msgstr	"#  quick_kill_header=NUM\n"
 
-#: src/attrib.c:642 src/attrib.c:649
+#: src/attrib.c:724 src/attrib.c:731
+#, c-format
 msgid	"#    0=subj (case sensitive) 1=subj (ignore case)\n"
 msgstr	"#    0=teema (tõstutundlik) 1=teema (tõstutundetu)\n"
 
-#: src/attrib.c:643 src/attrib.c:650
+#: src/attrib.c:725 src/attrib.c:732
+#, c-format
 msgid	"#    2=from (case sensitive) 3=from (ignore case)\n"
 msgstr	"#    2=saatja (tõstutundlik) 3=saatja (tõstutundetu)\n"
 
-#: src/attrib.c:644 src/attrib.c:651
+#: src/attrib.c:726 src/attrib.c:733
+#, c-format
 msgid	"#    4=msgid 5=lines\n"
 msgstr	"#    4=msgid 5=read\n"
 
-#: src/attrib.c:645
+#: src/attrib.c:727
+#, c-format
 msgid	"#  quick_select_scope=STRING\n"
 msgstr	"#  quick_select_scope=SÕNE\n"
 
-#: src/attrib.c:646
+#: src/attrib.c:728
+#, c-format
 msgid	"#  quick_select_expire=ON/OFF\n"
 msgstr	"#  quick_select_expire=ON/OFF\n"
 
-#: src/attrib.c:647
+#: src/attrib.c:729
+#, c-format
 msgid	"#  quick_select_case=ON/OFF\n"
 msgstr	"#  quick_select_case=ON/OFF\n"
 
-#: src/attrib.c:648
+#: src/attrib.c:730
+#, c-format
 msgid	"#  quick_select_header=NUM\n"
 msgstr	"#  quick_select_header=NUM\n"
 
-#: src/attrib.c:652
+#: src/attrib.c:734
+#, c-format
 msgid	"#  x_comment_to=ON/OFF\n"
 msgstr	"#  x_comment_to=ON/OFF\n"
 
+#: src/attrib.c:735
+#, c-format
+msgid	"#  fcc=STRING (eg. =mailbox)\n"
+msgstr	"#  fcc=SÕNE (n. =postkast)\n"
+
 #
-#: src/attrib.c:653
+#: src/attrib.c:736
+#, c-format
 msgid	"#  tex2iso_conv=ON/OFF\n"
 msgstr	"#  tex2iso_conv=ON/OFF\n"
 
-#: src/attrib.c:655
+#: src/attrib.c:737
+#, c-format
+msgid	"#  mime_forward=ON/OFF\n"
+msgstr	"#  mime_forward=ON/OFF\n"
+
+#: src/attrib.c:739
+#, c-format
 msgid	"#  mm_network_charset=supported_charset"
 msgstr	"#  mm_network_charset=toetatud_koodileht"
 
-#: src/attrib.c:662
+#: src/attrib.c:746
+#, c-format
 msgid	"#  undeclared_charset=STRING (default is US-ASCII)\n"
 msgstr	"#  undeclared_charset=SÕNE (vaikimisi on US-ASCII)\n"
 
-#: src/attrib.c:664
+#: src/attrib.c:748
+#, c-format
 msgid	"#\n"
 	"# Note that it is best to put general (global scoping)\n"
 msgstr	"#\n"
 	"# Märkus: parem on kõigepealt kirjeldada üldisemad (globaalse skoobiga)\n"
 
-#: src/attrib.c:665
+#: src/attrib.c:749
+#, c-format
 msgid	"# entries first followed by group specific entries.\n"
 	"#\n"
 msgstr	"# ning seejärel konkreetsemad, grupi spetsiifilised, reeglid.\n"
 	"#\n"
 
-#: src/attrib.c:666
+#: src/attrib.c:750
+#, c-format
 msgid	"############################################################################\n"
 	"\n"
 msgstr	"############################################################################\n"
 	"\n"
 
-#: src/attrib.c:672
+#: src/attrib.c:756
+#, c-format
 msgid	"# include extra headers\n"
 msgstr	"# lisa täiendavaid päiseid\n"
 
-#: src/attrib.c:680
+#: src/attrib.c:764
+#, c-format
 msgid	"# in *sources* set post process type to shar only\n"
 msgstr	"# *tekstidel* sea järeltöötlemise tüübiks ainult shar\n"
 
-#: src/attrib.c:684
-msgid	"# in *binaries* do full post processing, remove tmp files\n"
-msgstr	"# *binaarfailidel* sea täielik järeltöötlemine, kustuta ajutised failid\n"
-
-#: src/attrib.c:685
-msgid	"# and set Followup-To: poster\n"
-msgstr	"# ja sea Followup-To: postitaja\n"
+#: src/attrib.c:768
+#, c-format
+msgid	"# in *binaries* do full post processing but no TeX2ISO conversion,\n"
+msgstr	"# *binaarfailidel* sea täielik järeltöötlemine, kuid mitte TeX2ISO "
+	"teisendus,\n"
+
+#: src/attrib.c:769
+#, c-format
+msgid	"# remove tmp files and set Followup-To: poster\n"
+msgstr	"# kustuta ajutised failid ja sea Followup-To: postitaja\n"
 
-#: src/cook.c:799
+#: src/cook.c:499
 msgid	"(unknown)"
 msgstr	"(tundmatu)"
 
 #.
 #. * TODO: add to the right rule, give better explanation, -> lang.c
 #.
-#: src/filter.c:604 src/filter.c:612
+#: src/filter.c:597 src/filter.c:605
 msgid	"Removed from the previous rule: "
 msgstr	"Eelmisest reeglist eemaldatud: "
 
+#: src/keymap.c:271
+msgid	"NULL"
+msgstr	"NULL"
+
 #: src/lang.c:42
-#, c-format
-msgid	"1 Response%s"
-msgstr	"1 Vastus%s"
+msgid	"1 Response"
+msgstr	"1 Vastus"
 
 #: src/lang.c:46
 #, c-format
@@ -450,12 +528,13 @@ msgid	"*** Beginning of article ***"
 msgstr	"*** Artikli algus ***"
 
 #: src/lang.c:97
-msgid	"Cancel (delete) or supersede (overwrite) article [%%.*s]? (%s/%s/%s): "
-msgstr	"Katkestada (kustutada) või asendada artikkel [%%.*s]? (%s/%s/%s): "
+#, c-format
+msgid	"Cancel (delete) or supersede (overwrite) article [%%s]? (%s/%s/%s): "
+msgstr	"Katkestada (kustutada) või asendada artikkel [%%s]? (%s/%s/%s): "
 
 #: src/lang.c:98
 msgid	"Cancelling article..."
-msgstr	"Katkestan artiklit...."
+msgstr	"Katkestan artiklit..."
 
 #: src/lang.c:100
 #, c-format
@@ -539,272 +618,272 @@ msgstr	"Otsin uudiseid..."
 msgid	"Post-process %s=no, %s=yes, %s=shar, %s=quit: "
 msgstr	"Järeltöötle %s=ei, %s=jah, %s=shar, %s=välju: "
 
-#: src/lang.c:118
+#: src/lang.c:119
 msgid	"ANSI color disabled"
 msgstr	"ANSI värvid on keelatud"
 
-#: src/lang.c:119
+#: src/lang.c:120
 msgid	"ANSI color enabled"
 msgstr	"ANSI värvid on lubatud"
 
-#: src/lang.c:120
+#: src/lang.c:122
 #, c-format
 msgid	"Command failed: %s"
 msgstr	"Käsk ebaõnnestus: %s"
 
-#: src/lang.c:121
+#: src/lang.c:123
 msgid	"Mark not selected articles read?"
 msgstr	"Märgin valimata artiklid loetuks?"
 
-#: src/lang.c:122
+#: src/lang.c:124
 #, c-format
 msgid	"Connecting to %s..."
 msgstr	"Loon ühendust serveriga %s..."
 
-#: src/lang.c:123
+#: src/lang.c:125
 msgid	"<CR>"
 msgstr	"<CR>"
 
-#: src/lang.c:124
+#: src/lang.c:126
 msgid	"Creating active file for saved groups...\n"
 msgstr	"Loon salvestatud gruppidele active faili...\n"
 
-#: src/lang.c:125
+#: src/lang.c:127
 msgid	"Creating newsrc file...\n"
 msgstr	"Loon newsrc faili...\n"
 
-#: src/lang.c:127 src/lang.c:1129
+#: src/lang.c:129 src/lang.c:1150
 msgid	"Default"
 msgstr	"Vaikimisi"
 
-#: src/lang.c:128
+#: src/lang.c:130
 msgid	"Delete saved files that have been post processed?"
 msgstr	"Kas kustutada salvestatud ja töödeldud failid?"
 
-#: src/lang.c:129
+#: src/lang.c:131
 msgid	"Deleting temporary files..."
 msgstr	"Kustutan ajutisi faile..."
 
-#: src/lang.c:131
+#: src/lang.c:133
 msgid	"*** End of article ***"
 msgstr	"*** Artiklid on otsas ***"
 
-#: src/lang.c:132
+#: src/lang.c:134
 msgid	"*** End of articles ***"
 msgstr	"*** Artiklid on otsas ***"
 
-#: src/lang.c:133
+#: src/lang.c:135
 msgid	"*** End of groups ***"
 msgstr	"*** Grupid on otsas ***"
 
-#: src/lang.c:134
+#: src/lang.c:136
 msgid	"*** End of thread ***"
 msgstr	"*** Teema on otsas ***"
 
-#: src/lang.c:135
+#: src/lang.c:137
 msgid	"Enter limit of articles to get> "
 msgstr	"Sisestage leatavate artiklite piirang> "
 
-#: src/lang.c:136
+#: src/lang.c:138
 msgid	"Enter Message-ID to go to> "
 msgstr	"Sisestage Message-ID> "
 
-#: src/lang.c:137
+#: src/lang.c:139
 msgid	" and enter next unread thread"
 msgstr	" ja siseneda järgmisse lugemata teemasse"
 
-#: src/lang.c:138
+#: src/lang.c:140
 msgid	" and enter next unread group"
 msgstr	" ja siseneda järgmisse lugemata teemasse"
 
-#: src/lang.c:139
+#: src/lang.c:141
 msgid	"Enter option number> "
 msgstr	"Sisestage omaduse number> "
 
-#: src/lang.c:140
+#: src/lang.c:142
 #, c-format
 msgid	"Enter range [%s]> "
 msgstr	"Sisestage vahemik [%s]> "
 
-#: src/lang.c:141
+#: src/lang.c:143
 msgid	"\n"
 	"Warning: Approved: header used.\n"
 msgstr	"\n"
 	"Hoiatus: Kasutati päiserida Approved:.\n"
 
-#: src/lang.c:143
+#: src/lang.c:145
 msgid	"\n"
 	"Error: Bad address in Approved: header.\n"
 msgstr	"\n"
 	"Viga: Vigane aadress Approved: real.\n"
 
-#: src/lang.c:144
+#: src/lang.c:146
 msgid	"\n"
 	"Error: Bad address in From: header.\n"
 msgstr	"\n"
 	"Viga: Vigane aadress From: real.\n"
 
-#: src/lang.c:145
+#: src/lang.c:147
 msgid	"\n"
 	"Error: Bad address in Reply-To: header.\n"
 msgstr	"\n"
 	"Viga: Vigane aadress Reply-To: real.\n"
 
-#: src/lang.c:146
+#: src/lang.c:148
 msgid	"\n"
 	"Error: Bad FQDN in Message-ID: header.\n"
 msgstr	"\n"
 	"Viga: Vigane FQDN Message-ID: real.\n"
 
-#: src/lang.c:147
+#: src/lang.c:149
 #, c-format
 msgid	"Can't unlock %s"
 msgstr	"%s ei saa lahti lukustada"
 
-#: src/lang.c:149
+#: src/lang.c:151
 #, c-format
 msgid	"Corrupted file %s"
 msgstr	"Vigane fail %s"
 
-#: src/lang.c:150
+#: src/lang.c:152
 #, c-format
 msgid	"Couldn't dotlock %s - article not appended!"
 msgstr	"Ei saa punkt-lukustada %s - artiklit ei lisatud!"
 
-#: src/lang.c:151
+#: src/lang.c:153
 #, c-format
 msgid	"Couldn't lock %s - article not appended!"
 msgstr	"Ei saa lukustada %s - artiklit ei lisatud!"
 
-#: src/lang.c:153
+#: src/lang.c:155
 msgid	"Internal error in GNKSA routine - send bug report.\n"
 msgstr	"Sisemine viga GNKSA protseduuris - saatke vearaport.\n"
 
-#: src/lang.c:154
+#: src/lang.c:156
 msgid	"Left angle bracket missing in route address.\n"
 msgstr	"Aadressis puudub <.\n"
 
-#: src/lang.c:155
+#: src/lang.c:157
 msgid	"Left parenthesis missing in old-style address.\n"
 msgstr	"Vanas stiilis aadressis puudub vasak ümarsulg.\n"
 
-#: src/lang.c:156
+#: src/lang.c:158
 msgid	"Right parenthesis missing in old-style address.\n"
 msgstr	"Vanas stiilis aadressis puudub parem ümarsulg.\n"
 
-#: src/lang.c:157
+#: src/lang.c:159
 msgid	"At-sign missing in mail address.\n"
 msgstr	"Postiaadressis puudub at-märk.\n"
 
-#: src/lang.c:158
+#: src/lang.c:160
 msgid	"Single component FQDN is not allowed. Add your domain.\n"
 msgstr	"Ühekomponendiline FQDN pole lubatud. Lisage oma doomen.\n"
 
-#: src/lang.c:159
+#: src/lang.c:161
 msgid	"Invalid domain. Send bug report if your top level domain really exists.\n"
 	"Use .invalid as top level domain for munged addresses.\n"
 msgstr	"Vigane doomen. Saatke vearaport, kui teie doomen on reaalselt olemas.\n"
 	"Kasutage \"vigase\" aadressi kirjutamisel juurmise doomenina .invalid.\n"
 
-#: src/lang.c:160
+#: src/lang.c:162
 msgid	"Illegal domain. Send bug report if your top level domain really exists.\n"
 	"Use .invalid as top level domain for munged addresses.\n"
 msgstr	"Vigane doomen. Saatke vearaport, kui teie doomen on reaalselt olemas.\n"
 	"Kasutage \"vigase\" aadressi kirjutamisel juurmise doomenina .invalid.\n"
 
-#: src/lang.c:161
+#: src/lang.c:163
 msgid	"Unknown domain. Send bug report if your top level domain really exists.\n"
 	"Use .invalid as top level domain for munged addresses.\n"
 msgstr	"Vigane doomen. Saatke vearaport, kui teie doomen on reaalselt olemas.\n"
 	"Kasutage \"vigase\" aadressi kirjutamisel juurmise doomenina .invalid.\n"
 
-#: src/lang.c:162
+#: src/lang.c:164
 msgid	"Illegal character in FQDN.\n"
 msgstr	"FQDN sisaldab lubamatut sümbolit.\n"
 
-#: src/lang.c:163
+#: src/lang.c:165
 msgid	"Zero length FQDN component not allowed.\n"
 msgstr	"Null pikkusega FQDN komponent ei ole lubatud.\n"
 
-#: src/lang.c:164
+#: src/lang.c:166
 msgid	"FQDN component exceeds maximum allowed length (63 chars).\n"
 msgstr	"FQDN komponendi pikkus ületab maksimaalset lubatut (63 sümbolit).\n"
 
-#: src/lang.c:165
+#: src/lang.c:167
 msgid	"FQDN component may not start or end with hyphen.\n"
 msgstr	"FQDN komponendi alguses ega lõpus ei või olla kriips.\n"
 
-#: src/lang.c:166
+#: src/lang.c:168
 msgid	"FQDN component may not start with digit.\n"
 msgstr	"FQDN komponent ei või alata numbriga.\n"
 
-#: src/lang.c:167
+#: src/lang.c:169
 msgid	"Domain literal has impossible numeric value.\n"
 msgstr	"Doomen sisaldab võimatut numbrilist väärtust.\n"
 
-#: src/lang.c:168
+#: src/lang.c:170
 msgid	"Domain literal is for private use only and not allowed for global use.\n"
 msgstr	"Doomenit on lubatud kasutada ainult privaatvõrgus.\n"
 
-#: src/lang.c:169
+#: src/lang.c:171
 msgid	"Right bracket missing in domain literal.\n"
 msgstr	"Doomenis puudub vasak sulg.\n"
 
-#: src/lang.c:170
+#: src/lang.c:172
 msgid	"Missing localpart of mail address.\n"
 msgstr	"Aadressil puudub lokaalne osa.\n"
 
-#: src/lang.c:171
+#: src/lang.c:173
 msgid	"Illegal character in localpart of mail address.\n"
 msgstr	"Lubamatu sümbol aadressi lokaalses osas.\n"
 
-#: src/lang.c:172
+#: src/lang.c:174
 msgid	"Zero length localpart component not allowed.\n"
 msgstr	"Null pikkusega lokaalne komponent ei ole lubatud.\n"
 
-#: src/lang.c:173
+#: src/lang.c:175
 msgid	"Illegal character in realname.\n"
 	"Unquoted words may not contain '!()<>@,;:\\.[]' in route addresses.\n"
 msgstr	"Pärisnimes on lubamatu sümbol.\n"
 	"Kvootimata sõnad aadressides ei tohi sisaldada '!()<>@,;:\\.[]'.\n"
 
-#: src/lang.c:174
+#: src/lang.c:176
 msgid	"Illegal character in realname.\n"
 	"Quoted words may not contain '()<>\\'.\n"
 msgstr	"Pärisnimes on lubamatu sümbol.\n"
 	"Kvooditud sõnad ei või sisaldada '()<>\\'.\n"
 
-#: src/lang.c:175
+#: src/lang.c:177
 msgid	"Illegal character in realname.\n"
 	"Encoded words may not contain '!()<>@,;:\"\\.[]/=' in parameter.\n"
 msgstr	"Pärisnimes on lubamatu sümbol.\n"
 	"Kodeeritud sõnad parameetris ei või sisaldada '!()<>@,;:\"\\.[]/='.\n"
 
-#: src/lang.c:176
+#: src/lang.c:178
 msgid	"Bad syntax in encoded word used in realname.\n"
 msgstr	"Vigane reaalses nimes kasutatud kodeeritud sõna süntaks.\n"
 
-#: src/lang.c:177
+#: src/lang.c:179
 msgid	"Illegal character in realname.\n"
 	"Unquoted words may not contain '()<>\\' in old-style addresses.\n"
 msgstr	"Pärisnimes on lubamatu sümbol.\n"
 	"Kvootimata sõnad vanas stiilis aadressides ei või sisaldada '()<>\\'.\n"
 
-#: src/lang.c:178
+#: src/lang.c:180
 msgid	"Illegal character in realname.\n"
 	"Control characters and unencoded 8bit characters > 127 are not allowed.\n"
 msgstr	"Pärisnimes on lubamatu sümbol.\n"
 	"Kontrollsümbolid ja kodeerimata 8bit sümbolid väärtusega > 127 ei ole "
 	"lubatud.\n"
 
-#: src/lang.c:179
+#: src/lang.c:181
 msgid	"\n"
 	"Error: No blank line found after header.\n"
 msgstr	"\n"
 	"Viga: peale päiseridu pole tühja rida.\n"
 
 #. TODO: fixme, US-ASCII is not the only 7bit charset we know about
-#: src/lang.c:181
+#: src/lang.c:183
 msgid	"\n"
 	"Error: Posting contains non-ASCII characters but MM_CHARSET is set to\n"
 	"       US-ASCII  - please change this setting to a suitable value for\n"
@@ -815,7 +894,7 @@ msgstr	"\n"
 	"      on US_ASCII - palun seadke MM_CHARSET väärtus oma keelele sobivaks\n"
 	"      kasutades seadete M)enüüd või toimetades tinrc faili.\n"
 
-#: src/lang.c:186
+#: src/lang.c:188
 msgid	"\n"
 	"Error: Posting contains  non-ASCII characters  but the  MIME encoding\n"
 	"       for news  messages  is set  to \"7bit\"  -  please change this\n"
@@ -829,13 +908,13 @@ msgstr	"\n"
 	"      enam levinud.  Muuta saate kasutades seadete M)enüüd või toimetades\n"
 	"      tinrc faili.\n"
 
-#: src/lang.c:192
+#: src/lang.c:194
 msgid	"\n"
 	"Error: Article starts with blank line instead of header\n"
 msgstr	"\n"
 	"Viga: Artikkel algab päise asemel tühja reaga\n"
 
-#: src/lang.c:193
+#: src/lang.c:195
 #, c-format
 msgid	"\n"
 	"Error: Header on line %d does not have a colon after the header name:\n"
@@ -844,21 +923,21 @@ msgstr	"\n"
 	"Viga: Päisereal %d puudub päise nime järel koolon:\n"
 	"%s\n"
 
-#: src/lang.c:194
+#: src/lang.c:196
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line is empty.\n"
 msgstr	"\n"
 	"Viga: \"%s:\" rida on tühi.\n"
 
-#: src/lang.c:195
+#: src/lang.c:197
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line is missing from the article header.\n"
 msgstr	"\n"
 	"Viga: Artikli päises puudub rida \"%s:\".\n"
 
-#: src/lang.c:196
+#: src/lang.c:198
 #, c-format
 msgid	"\n"
 	"Error: Header on line %d does not have a space after the colon:\n"
@@ -867,145 +946,153 @@ msgstr	"\n"
 	"Viga: Päisel real %d puudub kooloni järel tühik:\n"
 	"%s\n"
 
-#: src/lang.c:197
+#: src/lang.c:199
 #, c-format
 msgid	"\n"
 	"Error: There are multiple (%d) \"%s:\" lines in the header.\n"
 msgstr	"\n"
 	"Viga: Päises on mitu (%d) \"%s:\" rida.\n"
 
-#: src/lang.c:198
+#: src/lang.c:200
 #, c-format
 msgid	"Insecure permissions of %s (%o)"
 msgstr	"Ebaturvalised õigused failil %s (%o)"
 
-#: src/lang.c:199 src/open.c:1009
+#: src/lang.c:201
 #, c-format
 msgid	"Invalid response to GROUP command, %s"
 msgstr	"Vigane vastus GROUP käsule, %s"
 
-#: src/lang.c:201
+#: src/lang.c:203
 #, c-format
 msgid	"MIME parse error: Unexpected end of %s/%s article"
 msgstr	"MIME parsimise viga: Ootamatu artikli %s/%s lõpp"
 
-#: src/lang.c:202
+#: src/lang.c:204
 msgid	"MIME parse error: Start boundary whilst reading headers"
 msgstr	"MIME parsimise viga: Algas eraldaja aga loen alles päiseid"
 
-#: src/lang.c:203
+#: src/lang.c:205
 msgid	"Can't get a (fully-qualified) domain-name!"
 msgstr	"Ei õnnestu saada (täis) doomeninime!"
 
-#: src/lang.c:204
+#: src/lang.c:206
 #, c-format
 msgid	"No permissions to go into %s\n"
 msgstr	"Puuduvad õigused siseneda %s\n"
 
-#: src/lang.c:205
+#: src/lang.c:207
 msgid	"\n"
 	"Error: From: line missing.\n"
 msgstr	"\n"
 	"Viga: From: rida puudub.\n"
 
-#: src/lang.c:206
+#: src/lang.c:208
 #, c-format
 msgid	"No read permissions for %s\n"
 msgstr	"%s lugemiseks pole õiguseid\n"
 
-#: src/lang.c:207
+#: src/lang.c:209
 #, c-format
 msgid	"File %s does not exist\n"
 msgstr	"Faili %s pole\n"
 
-#: src/lang.c:208
+#: src/lang.c:210
 #, c-format
 msgid	"No write permissions for %s\n"
 msgstr	"%s kirjutamiseks pole õiguseid\n"
 
-#: src/lang.c:209
+#: src/lang.c:211
 msgid	"Can't get user information (/etc/passwd missing?)"
 msgstr	"Ei leia kasutate kohta infot (/etc/passwd puudub?)"
 
-#: src/lang.c:210
+#: src/lang.c:212
 msgid	"errors"
 msgstr	"viga"
 
-#: src/lang.c:211
+#: src/lang.c:213
 #, c-format
 msgid	"\n"
 	"Error on line %d: \"Sender:\" header not allowed (it will be added for you)\n"
 msgstr	"\n"
 	"Viga real %d: \"Sender:\" päiserida pole lubatud (see lisatakse teie eest)\n"
 
-#: src/lang.c:212
+#: src/lang.c:214
 #, c-format
 msgid	"Server has non of the groups listed in %s"
 msgstr	"Serveril pole failis %s näidatud gruppe"
 
-#: src/lang.c:213
+#: src/lang.c:215
 msgid	"error"
 msgstr	"viga"
 
-#: src/lang.c:214
+#: src/lang.c:216
 msgid	"Unknown display level"
 msgstr	"Tundmatu ektaani tase"
 
-#: src/lang.c:215
+#: src/lang.c:217
 msgid	"<ESC>"
 msgstr	"<ESC>"
 
-#: src/lang.c:216
+#: src/lang.c:218
 msgid	"Exiting..."
 msgstr	"Lõpetan..."
 
-#: src/lang.c:217
+#: src/lang.c:219
 msgid	"leaving external mail-reader"
 msgstr	"jätan välise kirjade lugeja"
 
-#: src/lang.c:218
+#: src/lang.c:220
 #, c-format
 msgid	"Extracting %s..."
 msgstr	"Loon %s..."
 
-#: src/lang.c:220
+#: src/lang.c:222
 #, c-format
 msgid	"Error writing %s file. Filesystem full? File reset to previous state."
 msgstr	"Viga faili %s kirjutamisel. Failisüsteem on täis? Faili eelmine olek "
 	"taastatud."
 
-#: src/lang.c:221
+#: src/lang.c:223
 #, c-format
 msgid	"Error making backup of %s file. Filesystem full?"
 msgstr	"Failist %s ei õnnestu varukoopiat luua. Failisüsteem on täis?"
 
-#: src/lang.c:222
+#: src/lang.c:224
 #, c-format
 msgid	"Filtering global rules (%d/%d)..."
 msgstr	"Filtreerin globaalseid reegleid (%d/%d)..."
 
-#: src/lang.c:223
+#: src/lang.c:225
 msgid	"Rule created by: "
 msgstr	"Reegli looja: "
 
-#: src/lang.c:224
+#: src/lang.c:226
 #, c-format
 msgid	"Enter pattern [%s]> "
 msgstr	"Sisestage muster [%s]> "
 
-#: src/lang.c:225
+#: src/lang.c:227
 #, c-format
 msgid	"\n"
 	"You requested followups to your article to go to the following %s:\n"
 msgstr	"\n"
 	"Te soovisite vastused artiklile %s:\n"
 
-#: src/lang.c:226
+#: src/lang.c:228
 #, c-format
 msgid	"  %s\t Answers will be directed to you by mail.\n"
 msgstr	"  %s\t Vastused saadetakse teile kirjaga.\n"
 
-#: src/lang.c:227
+#: src/lang.c:229
+msgid	"-- forwarded message --\n"
+msgstr	"-- edastatud teade --\n"
+
+#: src/lang.c:230
+msgid	"-- end of forwarded message --\n"
+msgstr	"-- edastatud teate lõpp --\n"
+
+#: src/lang.c:231
 msgid	"# Format:\n"
 	"#   comment=STRING    Optional. Multiple lines allowed. Comments must be "
 	"placed\n"
@@ -1045,13 +1132,13 @@ msgstr	"# Vorming:\n"
 	"#     score=SÕNE        üks kahest võtmesõnast: 'hot' või 'kill'.\n"
 	"#   subj=SÕNE         Mittekohustuslik. Subject: rida (n. Kuidas olla tark).\n"
 	"#   from=SÕNE         Mittekohustuslik. From: rida (n. *Jaan Tamm*)\n"
-	"#   msgid=SÕNE        Mittekohustuslik. Message-ID: rida (n. "
-	"<123@ether.net>)\n"
+	"#   msgid=SÕNE        Mittekohustuslik. Message-ID: rida (n. <123@ether."
+	"net>)\n"
 	"#                     koos kõikide viidetega.\n"
 	"#   msgid_last=SÕNE   Mittekohustuslik. Nagu ülal, aga ainult viimane viide.\n"
 	"#   msgid_only=SÕNE   Mittekohustuslik. Nagu ülal, aga viideteta.\n"
-	"#   refs_only=SÕNE    Mittekohustuslik. References: rida (n. "
-	"<123@ether.net>)\n"
+	"#   refs_only=SÕNE    Mittekohustuslik. References: rida (n. <123@ether."
+	"net>)\n"
 	"#                     ilma Message-ID:\n"
 	"#   lines=[<>]?NUMBER Mittekohustuslik. Lines: rida. '<' või '>' pole\n"
 	"#                     kohustuslikud.\n"
@@ -1061,729 +1148,747 @@ msgstr	"# Vorming:\n"
 	"#   time=NUMBER       Mittekohustuslik. Reegli aegumine time_t väärtusena\n"
 	"#\n"
 
-#: src/lang.c:248
+#: src/lang.c:252
 #, c-format
 msgid	"Enter score for rule (default=%d): "
 msgstr	"Reegli kaal        (vaikimisi=%d): "
 
-#: src/lang.c:249
+#: src/lang.c:253
 #, c-format
 msgid	"Enter the score weight (range 0 < score <= %d)"
 msgstr	"Sisestage reegli kaal (vahemik on 0 < kaal <= %d)"
 
 #. SCORE_MAX
-#: src/lang.c:250
+#: src/lang.c:254
 msgid	"Full"
 msgstr	"Täis"
 
-#: src/lang.c:251
+#: src/lang.c:255
 msgid	"Comment (optional)  : "
 msgstr	"Kommentaar (vaba)   : "
 
-#: src/lang.c:252
+#: src/lang.c:256
 msgid	"Apply pattern to    : "
 msgstr	"Rakenda mustrit     : "
 
-#: src/lang.c:253
+#: src/lang.c:257
 msgid	"From: line (ignore case)      "
 msgstr	"From: rida (tõstutundetu)   "
 
-#: src/lang.c:254
+#: src/lang.c:258
 msgid	"From: line (case sensitive)   "
 msgstr	"From: rida (tõstutundlik)   "
 
-#: src/lang.c:256
+#: src/lang.c:260
 #, c-format
 msgid	"%s%s: Unknown host.\n"
 msgstr	"%s%s: Tundmatu host.\n"
 
-#: src/lang.c:257
+#: src/lang.c:261
 msgid	"global "
 msgstr	"globaalset "
 
-#: src/lang.c:258
+#: src/lang.c:262
 #, c-format
 msgid	"Please use %.100s instead"
 msgstr	"Kasutage selle asemel palun %.100s"
 
-#: src/lang.c:259
+#: src/lang.c:263
+#, c-format
+msgid	"%s is bogus"
+msgstr	"gruppi %s pole"
+
+#: src/lang.c:264
 #, c-format
 msgid	"Group %s is moderated. Continue?"
 msgstr	"Grupp %s on modereeritav. Jätkan?"
 
-#: src/lang.c:260
+#: src/lang.c:265
 msgid	"groups"
 msgstr	"gruppi"
 
-#: src/lang.c:261
+#: src/lang.c:266
+#, c-format
+msgid	"Rereading %s..."
+msgstr	"Loen %s uuesti..."
+
+#: src/lang.c:267
 msgid	"Top Level Commands"
 msgstr	"Ülemise taseme käsud"
 
-#: src/lang.c:262
+#: src/lang.c:268
 msgid	"Group Selection"
 msgstr	"Grupi valik"
 
-#: src/lang.c:263
+#: src/lang.c:269
 msgid	"group"
 msgstr	"grupp"
 
-# TRANSLATION TOO LONG
-#: src/lang.c:265
+#: src/lang.c:271
 msgid	"One or more lines of comment. <CR> to add a line or proceed if line is empty."
-msgstr	"Üks või enam kommentaari rida. <CR> rea lisamiseks või jätkamiseks, kui rida "
-	"on tühi."
+msgstr	"Üks või enam kommentaari rida. <CR> lisamiseks või tühja rea jätkamiseks."
 
-#: src/lang.c:266
+#: src/lang.c:272
 msgid	"From: line to add to filter file. <SPACE> toggles & <CR> sets."
 msgstr	"From: rida filtrite faili. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:267
+#: src/lang.c:273
 msgid	"Linecount of articles to be filtered. < for less, > for more, = for equal."
 msgstr	"Filtraaritavate artiklite ridu. < on vähem, > on rohkem, = on võrdne."
 
-#: src/lang.c:268
+#: src/lang.c:274
 msgid	"Message-ID: line to add to filter file. <SPACE> toggles & <CR> sets."
 msgstr	"Message-ID: rida filtri faili lisamiseks. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:269
+#: src/lang.c:275
 msgid	"Subject: line to add to filter file. <SPACE> toggles & <CR> sets."
 msgstr	"Subject: rida filtri faili lisamiseks. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:270
+#: src/lang.c:276
 msgid	"Enter text pattern to filter if Subject: & From: lines are not what you want."
 msgstr	"Sisestage filtreerimiseks tekstimuster, kui Subject: ja From: ei ole piisav."
 
-#: src/lang.c:271
+#: src/lang.c:277
 msgid	"Select where text pattern should be applied. <SPACE> toggles & <CR> sets."
 msgstr	"Valige, kus tekstimustrit rakendada. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:272
+#: src/lang.c:278
 msgid	"Expiration time in days for the entered filter. <SPACE> toggles & <CR> sets."
 msgstr	"Sisestatud filtri aegumisaeg päevades. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:273
+#: src/lang.c:279
 msgid	"Apply kill only to current group or all groups. <SPACE> toggles & <CR> sets."
 msgstr	"Kasuta surmamist jooksval/kõikidel gruppidel. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:274
+#: src/lang.c:280
 msgid	"Apply select to current group or all groups. <SPACE> toggles & <CR> sets."
 msgstr	"Kasuta valikut jooksval/kõikidel gruppidel. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:275
+#: src/lang.c:281
 msgid	"kill an article via a menu"
 msgstr	"artiklite surmamise menüü"
 
-#: src/lang.c:276
+#: src/lang.c:282
 msgid	"auto-select (hot) an article via a menu"
 msgstr	"(kuuma) artikli automaatse valiku menüü"
 
-#: src/lang.c:277
+#: src/lang.c:283
 msgid	"Browse URLs in article"
 msgstr	"Brausi artiklis olevaid URLe"
 
-#: src/lang.c:278
+#: src/lang.c:284
 msgid	"0 - 9\t  display article by number in current thread"
 msgstr	"0 - 9\t  näita jooksva teema numbri järgi valitud artiklit"
 
-#: src/lang.c:279
-msgid	"cancel (delete) current article; must have been posted by you"
-msgstr	"katkesta (kustuta) jooksev artikkel; peab olema teie postitus"
+#: src/lang.c:285
+msgid	"cancel (delete) or supersede (overwrite) current article"
+msgstr	"katkesta (kustuta) või asenda (kirjuta üle) jooksev artikkel"
 
-#: src/lang.c:280
+#: src/lang.c:286
 msgid	"edit article (mail-groups only)"
 msgstr	"toimeta artiklit (ainult kirjade-grupid)"
 
-#: src/lang.c:281
+#: src/lang.c:287
 msgid	"display first article in current thread"
 msgstr	"näita jooksva teema esimest artiklit"
 
-#: src/lang.c:282
+#: src/lang.c:288
 msgid	"display first page of article"
 msgstr	"näita artikli esimest lehekülge"
 
-#: src/lang.c:283
+#: src/lang.c:289
 msgid	"post followup to current article"
 msgstr	"postita vastus jooksvale artiklile"
 
-#: src/lang.c:284
+#: src/lang.c:290
 msgid	"post followup (don't copy text) to current article"
 msgstr	"postita vastus (kopeeri teksti) jooksvale artiklile"
 
-#: src/lang.c:285
+#: src/lang.c:291
 msgid	"post followup to current article quoting complete headers"
 msgstr	"postita vastus jooksvale artiklile, tsiteerides kõiki päiseid"
 
-#: src/lang.c:286
+#: src/lang.c:292
 msgid	"display last article in current thread"
 msgstr	"näita jooksva teema viimast artiklit"
 
-#: src/lang.c:287
+#: src/lang.c:293
 msgid	"display last page of article"
 msgstr	"näita artikli viimast lehekülge"
 
-#: src/lang.c:288
+#: src/lang.c:294
 msgid	"mark rest of thread as read and advance to next unread"
 msgstr	"märgi teema loetuks ja liigu järgmisele lugemata teemale"
 
-#: src/lang.c:289
+#: src/lang.c:295
 msgid	"display next article"
 msgstr	"näita järgmist artiklit"
 
-#: src/lang.c:290
+#: src/lang.c:296
 msgid	"display first article in next thread"
 msgstr	"näita järgmise teema esimest artiklit"
 
-#: src/lang.c:291 src/lang.c:298 src/lang.c:357 src/lang.c:358
+#: src/lang.c:297
 msgid	"display next unread article"
 msgstr	"näita järgmist lugemata artiklit"
 
-#: src/lang.c:292
+#: src/lang.c:298
 msgid	"go to the article that this one followed up"
 msgstr	"mine artiklile, millele see artikkel järgneb"
 
-#: src/lang.c:293
+#: src/lang.c:299
 msgid	"display previous article"
 msgstr	"näita eelmist artiklit"
 
-#: src/lang.c:294 src/lang.c:360
+#: src/lang.c:300
 msgid	"display previous unread article"
 msgstr	"näita eelmist lugemata artiklit"
 
-#: src/lang.c:295
+#: src/lang.c:301
 msgid	"quickly kill an article using defaults"
 msgstr	"surma kiiresti artikkel, kasutades vaikeväärtusi"
 
-#: src/lang.c:296
+#: src/lang.c:302
 msgid	"quickly auto-select (hot) an article using defaults"
 msgstr	"vali kiiresti vaikeväärtusi kasutades (kuumad) artiklid"
 
-#: src/lang.c:297
+#: src/lang.c:303
 msgid	"return to group selection level"
 msgstr	"tagasi gruppide valikusse"
 
-#: src/lang.c:299
+#: src/lang.c:304
 msgid	"reply through mail to author"
 msgstr	"vasta autorile kirjaga"
 
-#: src/lang.c:300
+#: src/lang.c:305
 msgid	"reply through mail (don't copy text) to author"
 msgstr	"vasta autorile kirjaga (teksti ei kopeerita)"
 
-#: src/lang.c:301
+#: src/lang.c:306
 msgid	"reply through mail to author quoting complete headers"
 msgstr	"vasta autorile kirjaga, tsiteerides kõiki päiseid"
 
-#: src/lang.c:302 src/lang.c:362
+#: src/lang.c:307
 msgid	"repost chosen article to another group"
 msgstr	"postita valitud artikkel teise gruppi"
 
-#: src/lang.c:303
+#: src/lang.c:308
 msgid	"search backwards within this article"
 msgstr	"otsi artiklis tagaspidi"
 
-#: src/lang.c:304
+#: src/lang.c:309
 msgid	"search forwards within this article"
 msgstr	"otsi artiklis edaspidi"
 
-#: src/lang.c:305
+#: src/lang.c:310
 msgid	"show article in raw-mode (including all headers)"
 msgstr	"näita kogu artiklit (koos päistega)"
 
-#: src/lang.c:306
+#: src/lang.c:311
 msgid	"skip next block of included text"
 msgstr	"järgmisele tekstiblokile"
 
-#: src/lang.c:307
+#: src/lang.c:312
 msgid	"toggle display of sections hidden by a form-feed (^L) on/off"
 msgstr	"lülita lehevahetusega (^L) peidetud osade näitamist"
 
-#: src/lang.c:308
+#: src/lang.c:313
 msgid	"toggle word highlighting on/off"
 msgstr	"lülita sõnade märkimine sisse/välja"
 
-#: src/lang.c:309
+#: src/lang.c:314
 msgid	"toggle ROT-13 (basic decode) for current article"
 msgstr	"lülita jooksva artikli ROT-13 (lihtne dekodeering) kodeering"
 
-#: src/lang.c:310
+#: src/lang.c:315
 msgid	"toggle tabwidth 4 <-> 8"
 msgstr	"lülita tabulaatori laius 4 <-> 8"
 
-#: src/lang.c:311
+#: src/lang.c:316
 msgid	"toggle german TeX style decoding for current article"
 msgstr	"lülita jooksva artikli saksa TeX stiilis dekodeerimine"
 
-#: src/lang.c:312
+#: src/lang.c:317
 msgid	"toggle display of uuencoded sections"
 msgstr	"lülita uuenkodeeritud osade näitamine"
 
-#: src/lang.c:313
+#: src/lang.c:318
 msgid	"View/save multimedia attachments"
 msgstr	"Vaata/salvesta multimeedia lisasid"
 
-#: src/lang.c:314
+#: src/lang.c:319
 #, c-format
 msgid	"report bug or comment via mail to %s"
 msgstr	"saatke vearaport või kommentaar aadressile %s"
 
-#: src/lang.c:315
+#: src/lang.c:320
 msgid	"choose range of articles to be affected by next command"
 msgstr	"valige järgmise käsuga töödeldavate artiklite vahemik"
 
-#: src/lang.c:316
+#: src/lang.c:321
 msgid	"escape from command prompt"
 msgstr	"pääs käsuviibalt"
 
-#: src/lang.c:317
+#: src/lang.c:322
+msgid	"edit filter file"
+msgstr	"toimeta filtrite faili"
+
+#: src/lang.c:323
 msgid	"get help"
 msgstr	"anna abiinfot"
 
-#: src/lang.c:318
+#: src/lang.c:324
 msgid	"display last article viewed"
 msgstr	"näita viimasena vaadatud artiklit"
 
-#: src/lang.c:319
+#: src/lang.c:325
 msgid	"down one line"
 msgstr	"üks rida alla"
 
-#: src/lang.c:320
+#: src/lang.c:326
 msgid	"up one line"
 msgstr	"üles üks rida"
 
-#: src/lang.c:321
+#: src/lang.c:327
 msgid	"go to article chosen by Message-ID"
 msgstr	"liigu Message-ID poolt määratud artiklile"
 
-#: src/lang.c:322
+#: src/lang.c:328
 msgid	"mail article/thread/hot/pattern/tagged articles to someone"
 msgstr	"saada artikkel/teema/kuum/muster/märgitud kellelegi"
 
-#: src/lang.c:323
+#: src/lang.c:329
 msgid	"menu of configurable options"
 msgstr	"seadete menüü"
 
-#: src/lang.c:324
+#: src/lang.c:330
 msgid	"down one page"
 msgstr	"alla üks lehekülg"
 
-#: src/lang.c:325
+#: src/lang.c:331
 msgid	"up one page"
 msgstr	"üles üks lehekülg"
 
-#: src/lang.c:326
+#: src/lang.c:332
 msgid	"post (write) article to current group"
 msgstr	"postita (kirjuta) artikkel jooksvasse gruppi"
 
-#: src/lang.c:327
+#: src/lang.c:333
 msgid	"post postponed articles"
 msgstr	"postita ootel artiklid"
 
-#: src/lang.c:328
+#: src/lang.c:334
 msgid	"list articles posted by you (from posted file)"
 msgstr	"näita teie poolt postitatud artikleid (failist posted)"
 
-#: src/lang.c:329
+#: src/lang.c:335
 msgid	"return to previous menu"
 msgstr	"tagasi eelmisse menüüsse"
 
-#: src/lang.c:330
+#: src/lang.c:336
 msgid	"quit tin immediately"
 msgstr	"välju viivitamata tinist"
 
-#: src/lang.c:331
+#: src/lang.c:337
 msgid	"redraw page"
 msgstr	"värskenda lehekülge"
 
-#: src/lang.c:332
+#: src/lang.c:338
 msgid	"save article/thread/hot/pattern/tagged articles to file"
 msgstr	"salvesta artikkel/teema/kuum/muster/märgitud faili"
 
-#: src/lang.c:333
+#: src/lang.c:339
 msgid	"save marked articles automatically without user prompts"
 msgstr	"salvesta märgitud artiklid automaatselt, kasutajalt küsimata"
 
-#: src/lang.c:334
+#: src/lang.c:340
+msgid	"scroll the screen one line down"
+msgstr	"keri ekraani rida alla"
+
+#: src/lang.c:341
+msgid	"scroll the screen one line up"
+msgstr	"keri ekraani rida üles"
+
+#: src/lang.c:342
 msgid	"search for articles by author backwards"
 msgstr	"otsi artikleid autori järgi tagaspidi"
 
-#: src/lang.c:335
+#: src/lang.c:343
 msgid	"search for articles by author forwards"
 msgstr	"otsi artikleid autori järgi edaspidi"
 
-#: src/lang.c:336
+#: src/lang.c:344
 msgid	"search all articles for a given string (this may take some time)"
 msgstr	"otsi antud teksti artiklitest (see võib võtta aega)"
 
-#: src/lang.c:337
+#: src/lang.c:345
 msgid	" \t  (searches are case-insensitive and wrap around to all articles)"
 msgstr	" \t  (otsing on tõstutundetu ja käib üle kõikide artiklite)"
 
-#: src/lang.c:338
+#: src/lang.c:346
 msgid	"search for articles by Subject line backwards"
 msgstr	"otsi artiklit teema järgi tagaspidi"
 
-#: src/lang.c:339
+#: src/lang.c:347
 msgid	"search for articles by Subject line forwards"
 msgstr	"otsi artiklit teema järgi edaspidi"
 
-#: src/lang.c:340
+#: src/lang.c:348
 msgid	"repeat last search"
 msgstr	"korda eelmist otsingut"
 
-#: src/lang.c:341
+#: src/lang.c:349
 msgid	"tag current article for reposting/mailing/piping/printing/saving"
 msgstr	"märgi jooksev artikkel, et postitada/saata/trükkida/salvestada/torusse"
 
-#: src/lang.c:342
+#: src/lang.c:350
 msgid	"toggle info message in last line (subject/description)"
 msgstr	"lülita viimase rea infoteadet (teema/kirjeldus)"
 
-#: src/lang.c:343
+#: src/lang.c:351
 msgid	"toggle inverse video"
 msgstr	"lülita pööratud video"
 
-#: src/lang.c:344
+#: src/lang.c:352
 msgid	"toggle mini help menu display"
 msgstr	"abiinfo lülita ekraanil miniabi menüüd"
 
-#: src/lang.c:345
+#: src/lang.c:353
+msgid	"cycle the display of authors email address, real name, both or neither"
+msgstr	"vali näitamiseks autori aadress, pärisnimi, mõlemad või mitte midagi"
+
+#: src/lang.c:354
 msgid	"show version information"
 msgstr	"esita info versioonist"
 
-#: src/lang.c:346
+#: src/lang.c:355
 msgid	"mark all articles as read and return to group selection menu"
 msgstr	"märgi artiklid loetuks ja välju gruppide valiku menüüsse"
 
-#: src/lang.c:347
+#: src/lang.c:356
 msgid	"mark all articles as read and enter next group with unread articles"
 msgstr	"märgi artiklid loetuks, sisene järgmisse lugemata artiklitega gruppi"
 
-#: src/lang.c:348
+#: src/lang.c:357
 msgid	"choose first thread in list"
 msgstr	"vali loendist esimene teema"
 
-#: src/lang.c:349 src/lang.c:380
-msgid	"choose group by name"
-msgstr	"vali grupp nime järgi"
-
-#: src/lang.c:350
+#: src/lang.c:358
 msgid	"choose last thread in list"
 msgstr	"vali loendist viimane teema"
 
-#: src/lang.c:351
+#: src/lang.c:359
 msgid	"list articles within current thread (bring up Thread sub-menu)"
 msgstr	"artiklite loend jooksvas teemas (esita teema alam-menüü)"
 
-#: src/lang.c:352
+#: src/lang.c:360
 msgid	"mark article as unread"
 msgstr	"märgi artikkel loetuks"
 
-# TRANSLATION MISSING
-#: src/lang.c:353
+#: src/lang.c:361
 msgid	"mark current thread or tagged threads as read"
-msgstr	""
+msgstr	"märgi jooksev teema või märgitud teemad loetuks"
 
-#: src/lang.c:354
+#: src/lang.c:362
 msgid	"mark thread as unread"
 msgstr	"märgi teema loetuks"
 
-#: src/lang.c:355
+#: src/lang.c:363
 msgid	"toggle display of all/selected articles"
 msgstr	"lülita ekraanile kõik/valitud artiklid"
 
-#: src/lang.c:356
+#: src/lang.c:364
 msgid	"display next group"
 msgstr	"näita järgmist gruppi"
 
-#: src/lang.c:359
+#: src/lang.c:365
 msgid	"display previous group"
 msgstr	"näita eelmist gruppi"
 
-#: src/lang.c:361 src/lang.c:409
-msgid	"read chosen article"
-msgstr	"loe valitud artiklit"
-
-#: src/lang.c:363
+#: src/lang.c:366
 msgid	"toggle all selections (all articles)"
 msgstr	"lülita kõiki valikuid (kõiki artikleid)"
 
-#: src/lang.c:364
+#: src/lang.c:367
 msgid	"select group (make \"hot\")"
 msgstr	"vali grupp (muuda \"kuumaks\")"
 
-#: src/lang.c:365
+#: src/lang.c:368
 msgid	"select thread"
 msgstr	"vali teema"
 
-#: src/lang.c:366
+#: src/lang.c:369
 msgid	"select threads if at least one unread article is selected"
 msgstr	"vali teemad, kui on valitud vähemalt üks lugemata artikkel"
 
-#: src/lang.c:367
+#: src/lang.c:370
 msgid	"select threads that match user specified pattern"
 msgstr	"vali kasutaja määratud mustrile vastavad teemad"
 
-#: src/lang.c:368
+#: src/lang.c:371
 msgid	"tag all parts of current multipart-message in order"
 msgstr	"märgi jooksva mitmeosalise teate kõik osad"
 
-#: src/lang.c:369
+#: src/lang.c:372
 msgid	"0 - 9\t  choose thread by number"
 msgstr	"0 - 9\t  vali numbri järgi teema"
 
-#: src/lang.c:370
+#: src/lang.c:373
 msgid	"toggle limit number of articles to get, and reload"
 msgstr	"sea laetavate artiklite piirang ja lae uuesti"
 
-#: src/lang.c:371
+#: src/lang.c:374
 msgid	"toggle display of all/unread articles"
 msgstr	"lülita ekraanil kõik/lugemata artiklid"
 
-#: src/lang.c:372 src/lang.c:410
-msgid	"cycle the display of authors email address, real name, both or neither"
-msgstr	"vali näitamiseks autori aadress, pärisnimi, mõlemad või mitte midagi"
-
-#: src/lang.c:373
+#: src/lang.c:375
 msgid	"toggle selection of thread"
 msgstr	"lülita teema valikut"
 
-#: src/lang.c:374
+#: src/lang.c:376
 msgid	"cycle through threading options available"
 msgstr	"erinevad teemade käsitlemise võtmed"
 
-#: src/lang.c:375
+#: src/lang.c:377
 msgid	"undo all selections (all articles)"
 msgstr	"ennista kõik valikud (kõik artiklid)"
 
-#: src/lang.c:376
+#: src/lang.c:378
 msgid	"untag all tagged threads"
 msgstr	"eemalda märgistus kõikidelt märgitud teemadelt"
 
-#: src/lang.c:377
+#: src/lang.c:379
 msgid	"mark all articles in group as read"
 msgstr	"märgi valitud grupis kõik artiklid loetuks"
 
-#: src/lang.c:378
+#: src/lang.c:380
 msgid	"mark all articles in group as read and move to next unread group"
-msgstr	"märgi grupis kõik artiklid loetuks ja liigu järgmisele lugemata grupile"
+msgstr	"märgi grupi artiklid loetuks ja liigu järgmisse lugemata gruppi"
 
-#: src/lang.c:379
+#: src/lang.c:381
 msgid	"choose first group in list"
 msgstr	"vali loetelust esimene grupp"
 
-#: src/lang.c:381
+#: src/lang.c:382
+msgid	"choose group by name"
+msgstr	"vali grupp nime järgi"
+
+#: src/lang.c:383
 msgid	"0 - 9\t  choose group by number"
 msgstr	"0 - 9\t  vali grupp numbri järgi"
 
-#: src/lang.c:382
+#: src/lang.c:384
 msgid	"choose range of groups to be affected by next command"
 msgstr	"järgmise käsuga töödeldavate gruppide vahemik"
 
-#: src/lang.c:383
+#: src/lang.c:385
 msgid	"choose last group in list"
 msgstr	"vali loetelust viimane grupp"
 
-#: src/lang.c:384
+#: src/lang.c:386
 msgid	"mark all articles in chosen group unread"
 msgstr	"märgi valitud grupis kõik artiklid mitte-loetuks"
 
-#: src/lang.c:385
+#: src/lang.c:387
 msgid	"move chosen group within list"
 msgstr	"liiguta valitud gruppi loendis"
 
-#: src/lang.c:386
+#: src/lang.c:388
 msgid	"choose next group with unread news"
 msgstr	"vali järgmine lugemata artiklitega grupp"
 
-#: src/lang.c:387 src/lang.c:1176
+#: src/lang.c:389 src/lang.c:1197
 msgid	"quit"
 msgstr	"välju"
 
-#: src/lang.c:388
+#: src/lang.c:390
 msgid	"quit without saving configuration changes"
 msgstr	"välju muudetud seadeid salvestamata"
 
-#: src/lang.c:389
+#: src/lang.c:391
 msgid	"read chosen group"
 msgstr	"loe valitud gruppi"
 
-#: src/lang.c:390
+#: src/lang.c:392
 msgid	"reset .newsrc (all available articles in groups marked unread)"
 msgstr	".newsrc faili algväärtustamine (kõik artiklid mitte-loetuks)"
 
-#: src/lang.c:391
+#: src/lang.c:393
 msgid	"search backwards for a group name"
 msgstr	"otsi grupi nime tagaspidi"
 
-#: src/lang.c:392
+#: src/lang.c:394
 msgid	" \t  (all searches are case-insensitive and wrap around)"
 msgstr	" \t  (kõik otsingud on tõstutundetud ja vajadusel alustavad algusest)"
 
-#: src/lang.c:393
+#: src/lang.c:395
 msgid	"search forwards for a group name"
 msgstr	"otsi grupi nime edaspidi"
 
-#: src/lang.c:394
+#: src/lang.c:396
 msgid	"subscribe to chosen group"
 msgstr	"telli valitud grupp"
 
-#: src/lang.c:395
+#: src/lang.c:397
 msgid	"subscribe to groups that match pattern"
 msgstr	"telli mustrile vastavaid gruppe"
 
-#: src/lang.c:396
+#: src/lang.c:398
 msgid	"reread active file to check for any new news"
 msgstr	"kontrolli aktiivsete gruppide faili - kas on uusi artikleid"
 
-#: src/lang.c:397
+#: src/lang.c:399
 msgid	"toggle display of group name only or group name plus description"
 msgstr	"vali ekraanil ainult grupi nimi või grupi nimi ja kirjeldus"
 
-#: src/lang.c:398
+#: src/lang.c:400
 msgid	"toggle display to show all/unread subscribed groups"
 msgstr	"vali ekraanile kõik/lugemata tellitud grupid"
 
-#: src/lang.c:399
+#: src/lang.c:401
 msgid	"unsubscribe from chosen group"
 msgstr	"loobu valitud grupist"
 
-#: src/lang.c:400
+#: src/lang.c:402
 msgid	"unsubscribe from groups that match pattern"
 msgstr	"loobu mustrile vastavatest gruppidest"
 
-#: src/lang.c:401
+#: src/lang.c:403
 msgid	"sort the list of groups"
 msgstr	"järjesta gruppide loend"
 
-#: src/lang.c:402
+#: src/lang.c:404
 msgid	"toggle display to show all/subscribed groups"
 msgstr	"näita ekraanil kõiki/tellitud gruppe"
 
-#: src/lang.c:403
+#: src/lang.c:405
 msgid	"0 - 9\t  choose article by number"
 msgstr	"0 - 9\t  vali numbri järgi artikkel"
 
-#: src/lang.c:404
+#: src/lang.c:406
 msgid	"mark thread as read and return to group index page"
 msgstr	"märgi teema loetuks ja välju gruppide indeksi lehele"
 
-#: src/lang.c:405
+#: src/lang.c:407
 msgid	"mark thread as read and enter next unread thread or group"
 msgstr	"märgi teema loetuks ja sisene järgmisse teemasse või gruppi"
 
-#: src/lang.c:406
+#: src/lang.c:408
 msgid	"choose first article in list"
 msgstr	"vali loendis esimene artikkel"
 
-#: src/lang.c:407
+#: src/lang.c:409
 msgid	"choose last article in list"
 msgstr	"vali loendis viimane artikkel"
 
-# TRANSLATION MISSING
-#: src/lang.c:408
+#: src/lang.c:410
 msgid	"mark article or tagged articles as read and move cursor to next unread article"
-msgstr	""
+msgstr	"märgi artikkel või märgitud artiklid loetuks, liigu järgm. lugemata artiklile"
 
 #: src/lang.c:411
+msgid	"read chosen article"
+msgstr	"loe valitud artiklit"
+
+#: src/lang.c:412
 msgid	"Display properties\n"
 	"------------------"
 msgstr	"Ekraani omadused\n"
 	"----------------"
 
-#: src/lang.c:412
+#: src/lang.c:413
 msgid	"Miscellaneous\n"
 	"-------------"
 msgstr	"Muud\n"
 	"----"
 
-#: src/lang.c:413
+#: src/lang.c:414
 msgid	"Moving around\n"
 	"-------------"
 msgstr	"Liikumine\n"
 	"---------"
 
-#: src/lang.c:414
+#: src/lang.c:415
 msgid	"Group/thread/article operations\n"
 	"-------------------------------"
 msgstr	"Grupi/teema/artikli operatsioonid\n"
 	"---------------------------------"
 
-#: src/lang.c:416
+#: src/lang.c:417
 msgid	"Group Level Commands"
 msgstr	"Grupitaseme käsud"
 
-#: src/lang.c:417
+#: src/lang.c:418
 msgid	"Kill filter added"
 msgstr	"Surmamise filter lisatud"
 
-#: src/lang.c:418
+#: src/lang.c:419
 msgid	"Auto-selection filter added"
 msgstr	"Automaatse valiku filter lisatud"
 
-#: src/lang.c:419
+#: src/lang.c:420
 msgid	"All parts tagged"
 msgstr	"Kõik osad on märgitud"
 
-#: src/lang.c:420
+#: src/lang.c:421
 msgid	"Storing article for later posting"
 msgstr	"Salvestan artikli hiljem postitamiseks"
 
-#: src/lang.c:421
+#: src/lang.c:422
 msgid	"Please enter a valid character"
 msgstr	"Palun sisestage lubatud sümbol"
 
-#: src/lang.c:422
+#: src/lang.c:423
 #, c-format
 msgid	"Missing part #%d"
 msgstr	"Puudub osa nr: %d"
 
-#: src/lang.c:423
+#: src/lang.c:424
 msgid	"*** No postponed articles ***"
 msgstr	"*** Postitusootel artikleid pole ***"
 
-#: src/lang.c:424
+#: src/lang.c:425
 msgid	"Not a multi-part message"
 msgstr	"Ei ole mitmeosaline teade"
 
-#: src/lang.c:425
+#: src/lang.c:426
 msgid	"You are not subscribed to this group"
 msgstr	"Te pole seda gruppi tellinud"
 
-#: src/lang.c:426
+#: src/lang.c:427
 msgid	"No previous expression"
 msgstr	"Eelmist avaldist pole"
 
-#: src/lang.c:427
+#: src/lang.c:428
 msgid	"Operation disabled in no-overwrite mode"
 msgstr	"Operatsioon on ülekirjutamist keelavas moodis keelatud"
 
 #. TODO: replace hardcoded key-name in txt_info_postponed
-#: src/lang.c:429
+#: src/lang.c:430
 #, c-format
 msgid	"%d postponed %s, reuse with ^O...\n"
 msgstr	"%d ootel %s, kasutamiseks ^O...\n"
 
-#: src/lang.c:430
+#: src/lang.c:431
 msgid	"X-Conversion-Note: multipart/alternative contents have been removed.\n"
 	"  To get the whole article, turn alternative handling OFF in the Option Menu\n"
 msgstr	"X-Conversion-Note: multipart/alternative sisu on eemaldatud.\n"
 	"  Et näha tervet artiklit, lülitage alternatiivide käsitlemine välja\n"
 
-#: src/lang.c:432
+#: src/lang.c:433
 #, c-format
 msgid	"Save filename for %s/%s is a mailbox. Attachment not saved"
 msgstr	"Fail %s/%s salvestamiseks on postkast. Lisa ei salvestatud"
 
-#: src/lang.c:433
+#: src/lang.c:434
 msgid	"TeX2Iso encoded article"
 msgstr	"TeX2Iso kodeeritud artikkel"
 
-#: src/lang.c:434
+#: src/lang.c:435
 msgid	"incomplete "
 msgstr	"mittetäielik "
 
 #. TODO: replace hardcoded key-names
-#: src/lang.c:436
+#: src/lang.c:437
 #, c-format
 msgid	"\n"
 	"Welcome to %s, a full screen threaded Netnews reader. It can read news "
@@ -1841,129 +1946,137 @@ msgstr	"\n"
 	"Lisainfot leiate manualist, README, INSTALL, TODO ja FTP failidest.\n"
 	"Palun saatke vearaportid/kommentaarid 'R' käsuga aadressil %s.\n"
 
-#: src/lang.c:452
+#: src/lang.c:453
 #, c-format
 msgid	"Invalid  From: %s  line. Read the INSTALL file again."
 msgstr	"Vigane From: %s rida. Lugege uuesti faili INSTALL."
 
-#: src/lang.c:453
+#: src/lang.c:455
+msgid	"Invalid multibyte sequence found\n"
+msgstr	"Leiti vigane mitmebaidi järjend\n"
+
+#: src/lang.c:457
 #, c-format
 msgid	"Invalid  Sender:-header %s"
 msgstr	"Vigane Sender:-päis %s"
 
-#: src/lang.c:454
+#: src/lang.c:458
 msgid	"Inverse video disabled"
 msgstr	"Pööratud video keelatud"
 
-#: src/lang.c:455
+#: src/lang.c:459
 msgid	"Inverse video enabled"
 msgstr	"Pööratud video lubatud"
 
-#: src/lang.c:457
+#: src/lang.c:461
 #, c-format
 msgid	"Missing definition for %s\n"
 msgstr	"%s definitsioon puudub\n"
 
-#: src/lang.c:458
+#: src/lang.c:462
 #, c-format
 msgid	"Invalid key definition '%s'\n"
 msgstr	"Vigane klahvi definitsioon '%s'\n"
 
-#: src/lang.c:459
+#: src/lang.c:463
 #, c-format
 msgid	"Invalid keyname '%s'\n"
 msgstr	"Vigane klahvi nimi '%s'\n"
 
-#: src/lang.c:460
+#: src/lang.c:464
 #, c-format
-msgid	"Key '%s' is defined for both %s%s and %s%s\n"
-msgstr	"Klahv '%s' on defineeritud nii %s%s, kui ka %s%s jaoks\n"
+msgid	"Keymap file was upgraded to version %s\n"
+msgstr	"Keymap fail uuendati versioonini %s\n"
 
-#: src/lang.c:461
+#: src/lang.c:465
 #, c-format
-msgid	"Kill From:     [%-*.*s] (y/n): "
-msgstr	"Surmake From:  [%-*.*s] (j/e): "
+msgid	"Kill From:     [%s] (y/n): "
+msgstr	"Surmake From:  [%s] (j/e): "
 
-#: src/lang.c:462
+#: src/lang.c:466
 msgid	"Kill Lines: (</>num): "
 msgstr	"Surmake read: (</>num) : "
 
-#: src/lang.c:463
+#: src/lang.c:467
 msgid	"Kill Article Menu"
 msgstr	"Artuklite surmamise menüü"
 
-#: src/lang.c:464
+#: src/lang.c:468
 #, c-format
-msgid	"Kill Msg-Id:   [%-*.*s] (f/l/o/n): "
-msgstr	"Surmake Msg-Id:[%-*.*s] (f/l/o/n): "
+msgid	"Kill Msg-Id:   [%s] (f/l/o/n): "
+msgstr	"Surmake Msg-Id:[%s] (f/l/o/n): "
 
-#: src/lang.c:465
+#: src/lang.c:469
 msgid	"Kill pattern scope  : "
 msgstr	"Surmamise mustri ulatus: "
 
-#: src/lang.c:466
+#: src/lang.c:470
 #, c-format
-msgid	"Kill Subject:  [%-*.*s] (y/n): "
-msgstr	"Surmake teema: [%-*.*s] (j/e): "
+msgid	"Kill Subject:  [%s] (y/n): "
+msgstr	"Surmake teema: [%s] (j/e): "
 
-#: src/lang.c:467
+#: src/lang.c:471
 msgid	"Kill text pattern   : "
 msgstr	"Surmake tekst mustriga : "
 
-#: src/lang.c:468
+#: src/lang.c:472
 msgid	"Kill time in days   : "
 msgstr	"Surmamise aeg päevades : "
 
-#: src/lang.c:470
+#: src/lang.c:474
 msgid	"Last"
 msgstr	"Viimane"
 
-#: src/lang.c:471
+#: src/lang.c:475
 msgid	"-- Last response --"
 msgstr	"-- Viimane vastus --"
 
-#: src/lang.c:472
+#: src/lang.c:476
 #, c-format
 msgid	"Lines %s  "
 msgstr	"Rida: %s  "
 
-#: src/lang.c:474
+#: src/lang.c:478
 msgid	"Message-ID: line              "
 msgstr	"Message-ID: rida            "
 
-#: src/lang.c:476
+#: src/lang.c:479
+msgid	"Mail"
+msgstr	"E-post"
+
+#: src/lang.c:480
 msgid	"mailbox "
 msgstr	"postkasti "
 
-#: src/lang.c:477
+#: src/lang.c:481
 #, c-format
 msgid	"Mail article(s) to [%.*s]> "
 msgstr	"Saada artiklid aadressil [%.*s]> "
 
-#: src/lang.c:478
+#: src/lang.c:482
 #, c-format
 msgid	"Mailing log to %s\n"
 msgstr	"Saadan logi aadressil %s\n"
 
-#: src/lang.c:479
+#: src/lang.c:483
 msgid	"Mail bug report..."
 msgstr	"Saada vearaport..."
 
-#: src/lang.c:480
+#: src/lang.c:484
 #, c-format
 msgid	"Mail BUG REPORT to %s?"
 msgstr	"Saadan VEARAPORTI aadressil %s?"
 
-#: src/lang.c:481
+#: src/lang.c:485
 msgid	"Mailed"
 msgstr	"Saadetud"
 
-#: src/lang.c:482
+#: src/lang.c:486
 #, c-format
 msgid	"Mailing to %s..."
 msgstr	"Saadan aadressil %s..."
 
-#: src/lang.c:483
+#: src/lang.c:487
 msgid	"# [Mail/Save] active file. Format is like news active file:\n"
 	"#   groupname  max.artnum  min.artnum  /dir\n"
 	"# The 4th field is the basedir (ie. ~/Mail or ~/News)\n"
@@ -1973,288 +2086,283 @@ msgstr	"# [Saada/Salvesta] fail \"active
 	"# Neljas väli on baaskataloog (näiteks ~/Mail või ~/News)\n"
 	"#\n"
 
-#: src/lang.c:486
+#: src/lang.c:490
 #, c-format
 msgid	"%s marked as unread"
 msgstr	"%s märgitud loetuks"
 
-#: src/lang.c:487
+#: src/lang.c:491
 #, c-format
 msgid	"Marked %d of %d tagged %s as read"
 msgstr	"Märkisin %d (%d) märgitud %s loetuks"
 
-#: src/lang.c:488
+#: src/lang.c:492
 #, c-format
 msgid	"Mark all articles as read%s?"
 msgstr	"Märgin kõik artiklid loetuks%s?"
 
-#: src/lang.c:489
+#: src/lang.c:493
 #, c-format
 msgid	"Mark %s=tagged articles, %s=current article, %s=quit: "
 msgstr	"Märgi %s=märgitud artiklid, %s=jooksev artikkel, %s=välju: "
 
-#: src/lang.c:490
+#: src/lang.c:494
 #, c-format
-msgid	"Mark group %.*s as read?"
-msgstr	"Märgin grupi %.*s loetuks?"
+msgid	"Mark group %s as read?"
+msgstr	"Märgin grupi %s loetuks?"
 
-#: src/lang.c:491
+#: src/lang.c:495
 #, c-format
 msgid	"Mark thread as read%s?"
 msgstr	"Märgin teema loetuks%s?"
 
-#: src/lang.c:492
+#: src/lang.c:496
 #, c-format
 msgid	"Mark %s=tagged articles/threads, %s=current thread, %s=quit: "
 msgstr	"Märgi %s=märgitud artiklid/teemad, %s=jooksev teema, %s=välju: "
 
-#: src/lang.c:493
+#: src/lang.c:497
 #, c-format
 msgid	"Matching %s groups..."
 msgstr	"Otsin %s gruppe..."
 
-#: src/lang.c:494 src/lang.c:498
+#: src/lang.c:498 src/lang.c:502
 #, c-format
 msgid	"<n>=set current to n; %s=next unread; %s=search pattern; %s=kill/select"
 msgstr	"<n>=n jooksvaks grupiks; %s=järgmine lugemata; %s=otsi; %s=surma/vali;"
 
-#: src/lang.c:495
+#: src/lang.c:499
 #, c-format
 msgid	"%s=author search; %s=catchup; %s=line down; %s=line up; %s=mark read; %s=list "
 	"thread"
-msgstr	"%s=autori otsing; %s=loetud; %s=rida alla; %s=rida üles; %s=märgi loetuks; "
-	"%s=teema"
+msgstr	"%s=autori otsing; %s=loetud; %s=rida alla; %s=rida üles; %s=märgi loetuks; %"
+	"s=teema"
 
-#: src/lang.c:496
+#: src/lang.c:500
 #, c-format
 msgid	"%s=line up; %s=line down; %s=page up; %s=page down; %s=top; %s=bottom"
 msgstr	"%s=rida üles; %s=rida alla; %s=lk. üles; %s=lk. alla; %s=üles; %s=alla"
 
-#: src/lang.c:497
+#: src/lang.c:501
 #, c-format
 msgid	"%s=search forwards; %s=search backwards; %s=quit"
 msgstr	"%s=otsi edaspidi; %s=otsi tagaspidi; %s=välju"
 
-#: src/lang.c:499
+#: src/lang.c:503
 #, c-format
 msgid	"%s=author search; %s=body search; %s=catchup; %s=followup; %s=mark read"
 msgstr	"%s=autori otsing; %s=otsi sisu; %s=loetud; %s=vasta; %s=märgi loetuks"
 
-#: src/lang.c:500
+#: src/lang.c:504
 #, c-format
 msgid	"<n>=set current to n; %s=next unread; %s,%s=search pattern; %s=catchup"
 msgstr	"<n>=n jooksvaks grupiks; %s=järgmine lugemata; %s,%s=otsi; %s=loetud"
 
-#: src/lang.c:501
+#: src/lang.c:505
 #, c-format
 msgid	"%s=line down; %s=line up; %s=help; %s=move; %s=quit; %s=toggle all/unread"
 msgstr	"%s=rida alla; %s=rida üles; %s=appi; %s=tõsta; %s=välju; %s=kõik/lugemata"
 
-#: src/lang.c:502
+#: src/lang.c:506
 #, c-format
 msgid	"%s=subscribe; %s=sub pattern; %s=unsubscribe; %s=unsub pattern; %s=yank in/out"
 msgstr	"%s=telli; %s=telli muster; %s=loobu; %s=loobu muster; %s=kõik/tellitud"
 
-#: src/lang.c:503
+#: src/lang.c:507
 #, c-format
 msgid	"<n>=set current to n; %s=next unread; %s=catchup; %s=display toggle"
 msgstr	"<n>=jooksev n; %s=järgmine lugemata; %s=loetud; %s=ekraani lülit"
 
-#: src/lang.c:504
+#: src/lang.c:508
 #, c-format
 msgid	"%s=help; %s=line down; %s=line up; %s=quit; %s=tag; %s=mark unread"
 msgstr	"%s=appi; %s=rida alla; %s=rida üles; %s=välju; %s=märgi; %s=lugemata"
 
-#: src/lang.c:505
+#: src/lang.c:509
 msgid	"--More--"
 msgstr	"--Veel--"
 
-#: src/lang.c:506
+#: src/lang.c:510
 #, c-format
 msgid	"Moving %s..."
 msgstr	"Tõstan %s..."
 
-#: src/lang.c:508
+#: src/lang.c:512
 msgid	", name: "
 msgstr	", nimi: "
 
-#: src/lang.c:509
+#: src/lang.c:513
 #, c-format
 msgid	"Goto newsgroup [%s]> "
 msgstr	"Mine gruppi [%s]> "
 
-#: src/lang.c:510
+#: src/lang.c:514
 msgid	"newsgroups"
 msgstr	"gruppidesse"
 
-#: src/lang.c:511
+#: src/lang.c:515
 #, c-format
 msgid	"Position %s in group list (1,2,..,$) [%d]> "
 msgstr	"Positsioon %s gruppide nimistus (1,2,..,$) [%d]> "
 
-#: src/lang.c:512
+#: src/lang.c:516
 msgid	"newsgroup"
 msgstr	"gruppi"
 
-#: src/lang.c:513
+#: src/lang.c:517
 msgid	"Try and save newsrc file again?"
 msgstr	"Proovin newsrc faili uuesti salvestada?"
 
-#: src/lang.c:514
+#: src/lang.c:518
 msgid	"Warning: No newsgroups were written to your newsrc file. Save aborted."
 msgstr	"Hoiatus: Teie newsrc faili ei salvestatud ühtegi gruppi. Katkestasin "
 	"salvestamise."
 
-#: src/lang.c:515
+#: src/lang.c:519
 msgid	"newsrc file saved successfully.\n"
 msgstr	"newsrc fail on edukalt salvestatud.\n"
 
-#: src/lang.c:516
+#: src/lang.c:520
 msgid	"-- Next response --"
 msgstr	"- Järgmine vastus -"
 
-#: src/lang.c:517
+#: src/lang.c:521
 #, c-format
 msgid	"NNTP authorization password not found for %s"
 msgstr	"Serverile %s vastavat NNTP autoriseerimise parooli pole"
 
-#: src/lang.c:518
+#: src/lang.c:522
 msgid	"No  "
 msgstr	"Ei  "
 
-#: src/lang.c:519
+#: src/lang.c:523
 msgid	"*** No articles ***"
 msgstr	"*** Artikleid pole ***"
 
-#: src/lang.c:520
+#: src/lang.c:524
 msgid	"No articles have been posted"
 msgstr	"Postitatud artikleid pole"
 
-#: src/lang.c:521
+#: src/lang.c:525
 msgid	"*** No description ***"
 msgstr	"*** Kirjeldus puudub ***"
 
-#: src/lang.c:522
+#: src/lang.c:526
 msgid	"No filename"
 msgstr	"Failil pole nime"
 
-#: src/lang.c:523
+#: src/lang.c:527
 msgid	"No group"
 msgstr	"Gruppi pole"
 
-#: src/lang.c:524
+#: src/lang.c:528
 msgid	"*** No groups ***"
 msgstr	"*** Gruppe pole ***"
 
-#: src/lang.c:525
+#: src/lang.c:529
 msgid	"No more groups to read"
 msgstr	"Lugemiseks rohkem gruppe pole"
 
-#: src/lang.c:526
+#: src/lang.c:530
 msgid	"No last message"
 msgstr	"Viimast teadet pole"
 
-#: src/lang.c:527
+#: src/lang.c:531
 msgid	"No mail address"
 msgstr	"E-posti aadressi pole"
 
-#: src/lang.c:528
+#: src/lang.c:532
 msgid	"No articles marked for saving"
 msgstr	"Salvestamiseks märgitud artikleid pole"
 
-#: src/lang.c:529
+#: src/lang.c:533
 msgid	"No match"
 msgstr	"Ei leia"
 
-#: src/lang.c:530
+#: src/lang.c:534
 msgid	"No more groups"
 msgstr	"Rohkem gruppe pole"
 
-#: src/lang.c:531
+#: src/lang.c:535
 msgid	"No newsgroups"
 msgstr	"Gruppe pole"
 
-#: src/lang.c:532
+#: src/lang.c:536
 msgid	"No next unread article"
 msgstr	"Järgmist lugemata artiklit pole"
 
-#: src/lang.c:533
+#: src/lang.c:537
 msgid	"No previous group"
 msgstr	"Eelmist gruppi pole"
 
-#: src/lang.c:534
+#: src/lang.c:538
 msgid	"No previous unread article"
 msgstr	"Eelmist lugemata artiklit pole"
 
-#: src/lang.c:535
-#, c-format
-msgid	"No responses%s"
-msgstr	"Vastuseid pole%s"
-
-#: src/lang.c:536
+#: src/lang.c:539
 msgid	"No responses"
 msgstr	"Vastuseid pole"
 
-#: src/lang.c:537
+#: src/lang.c:540
 msgid	"No responses to list in current thread"
 msgstr	"Jooksvas teemas pole vastuseid"
 
-#: src/lang.c:538
+#: src/lang.c:541
 msgid	"No search string"
 msgstr	"Otsingusõne puudub"
 
-#: src/lang.c:539
+#: src/lang.c:542
 msgid	"No subject"
 msgstr	"Teema puudub"
 
-#: src/lang.c:540
+#: src/lang.c:544
 #, c-format
 msgid	"%s: Terminal must have clear to end-of-line (ce)\n"
 msgstr	"%s: Terminalil peab olema puhasta realõpuni (ce) omadus\n"
 
-#: src/lang.c:541
+#: src/lang.c:545
 #, c-format
 msgid	"%s: Terminal must have clear to end-of-screen (cd)\n"
 msgstr	"%s: Terminalil peab olema puhasta ekraanilõpuni (cd) omadus\n"
 
-#: src/lang.c:542
+#: src/lang.c:546
 #, c-format
 msgid	"%s: Terminal must have clearscreen (cl) capability\n"
 msgstr	"%s: Terminalil peab olema ekraanipuhastamise (cl) omadus\n"
 
-#: src/lang.c:543
+#: src/lang.c:547
 #, c-format
 msgid	"%s: Terminal must have cursor motion (cm)\n"
 msgstr	"%s: Terminal peab toetama kursori liigutamist (cm)\n"
 
-#: src/lang.c:544
+#: src/lang.c:548
 #, c-format
 msgid	"%s: TERM variable must be set to use screen capabilities\n"
 msgstr	"%s: ekraani omaduste kasutamiseks peab olema seatud keskkonnamuutuja TERM\n"
 
-#: src/lang.c:545
+#: src/lang.c:550
 #, c-format
 msgid	"No viewer found for %s/%s\n"
 msgstr	"%s/%s jaoks puudub vaatur\n"
 
-#: src/lang.c:546
+#: src/lang.c:551
 msgid	"Newsgroup does not exist on this server"
 msgstr	"Gruppi pole sellel serveril"
 
-#: src/lang.c:547
+#: src/lang.c:552
 #, c-format
 msgid	"Group %s not found in active file"
 msgstr	"Gruppi %s pole aktiivsete gruppide failis"
 
-#: src/lang.c:548
+#: src/lang.c:553
 msgid	"c)reate it, use a)lternative name, use d)efault .newsrc, q)uit tin: "
 msgstr	"c=loo fail, a)lternatiivne nimi, d=vaikimisi .newsrc, q=välju: "
 
-#: src/lang.c:549
+#: src/lang.c:554
 msgid	"use a)lternative name, use d)efault .newsrc, q)uit tin: "
 msgstr	"a)lternatiivne nimi, d=vaikimisi .newsrc, q=välju: "
 
-#: src/lang.c:550
+#: src/lang.c:555
 #, c-format
 msgid	"# NNTP-server -> newsrc translation table and NNTP-server\n"
 	"# shortname list for %s %s\n"
@@ -2281,40 +2389,40 @@ msgstr	"# NNTP-server -> newsrc teisendu
 	"#   news.ka.nu    /tmp/nrc-nu      kanu    nu\n"
 	"#\n"
 
-#: src/lang.c:557
+#: src/lang.c:562
 msgid	"Only"
 msgstr	"Ainult"
 
-#: src/lang.c:558
+#: src/lang.c:563
 #, c-format
 msgid	"Option not enabled. Recompile with %s."
 msgstr	"Võti pole lubatud. Kasutage kompileerimisel %s."
 
-#: src/lang.c:559
+#: src/lang.c:564
 msgid	"Options Menu"
 msgstr	"Omaduste menüü"
 
-#: src/lang.c:562
+#: src/lang.c:567
 #, c-format
 msgid	"Error in regex: %s at pos. %d '%s'"
 msgstr	"Viga regulaaravaldises: %s positsioonil %d '%s'"
 
-#: src/lang.c:563
+#: src/lang.c:568
 #, c-format
 msgid	"Error in regex: pcre internal error %d"
 msgstr	"Viga regulaaravaldises: pcre sisemine viga %d"
 
-#: src/lang.c:564
+#: src/lang.c:569
 #, c-format
 msgid	"Error in regex: study - pcre internal error %s"
 msgstr	"Viga regulaaravaldises: uurimiseks - pcre sisemine viga %s"
 
-#: src/lang.c:565
+#: src/lang.c:570
 msgid	"Post a followup..."
 msgstr	"Postita vastus..."
 
 #. TODO: replace hardcoded key-name in txt_post_error_ask_postpone
-#: src/lang.c:567
+#: src/lang.c:572
 msgid	"An error has occurred while posting the article. If you think that this\n"
 	"error is temporary or otherwise correctable, you can postpone the article\n"
 	"and pick it up again with ^O later.\n"
@@ -2322,269 +2430,276 @@ msgstr	"Artikli postitamisel tekkis viga
 	"või muul viisil kõrvaldatav, võite artikli salvestada hiljem postitamiseks\n"
 	"ja ^O käsuga hiljem postitada.\n"
 
-#: src/lang.c:570
+#: src/lang.c:575
 msgid	"Posted articles history"
 msgstr	"Postitatud artiklite ajalugu"
 
-#: src/lang.c:571
+#: src/lang.c:576
 #, c-format
 msgid	"Post to newsgroup(s) [%s]> "
 msgstr	"Postita gruppidesse [%s]> "
 
-#: src/lang.c:572
+#: src/lang.c:577
 msgid	"-- post processing started --"
 msgstr	"-- lõpptöötlus alustas --"
 
-#: src/lang.c:573
+#: src/lang.c:578
 msgid	"-- post processing completed --"
 msgstr	"-- lõpptöötlus lõpetas --"
 
-#: src/lang.c:574
+#: src/lang.c:579
 #, c-format
 msgid	"Post subject [%s]> "
 msgstr	"Postituse teema [%s]> "
 
-#: src/lang.c:575
+#: src/lang.c:580
 msgid	"# Summary of mailed/posted messages viewable by 'W' command from within tin.\n"
 msgstr	"# Kokkuvõtte saadetud/postitatud teadetest saate tinis 'W' käsuga.\n"
 
-#: src/lang.c:576
+#: src/lang.c:581
 msgid	"Posting article..."
 msgstr	"Postitan artiklit..."
 
-#: src/lang.c:577
-msgid	"Post postponed articles [%%.*s]? (%s/%s/%s/%s/%s): "
-msgstr	"Postitan ootel artiklid [%%.*s]? (%s/%s/%s/%s/%s): "
+#: src/lang.c:582
+#, c-format
+msgid	"Post postponed articles [%%s]? (%s/%s/%s/%s/%s): "
+msgstr	"Postitan ootel artiklid [%%s]? (%s/%s/%s/%s/%s): "
 
-#: src/lang.c:578
+#: src/lang.c:583
 #, c-format
 msgid	"Hot %s"
 msgstr	"Kuum %s"
 
-#: src/lang.c:579
+#: src/lang.c:584
 #, c-format
 msgid	"Tagged %s"
 msgstr	"Märgitud %s"
 
-#: src/lang.c:580
+#: src/lang.c:585
 #, c-format
 msgid	"Untagged %s"
 msgstr	"Märkimata %s"
 
-#: src/lang.c:581
+#: src/lang.c:586
 msgid	"Processing mail messages marked for deletion."
 msgstr	"Töötlen kirju, mis on kustutamiseks märgitud."
 
-#: src/lang.c:582
+#: src/lang.c:587
 msgid	"Processing saved articles marked for deletion."
 msgstr	"Töötlen salvestatud ja kustutamiseks märgitud artikleid."
 
-#: src/lang.c:583
+#: src/lang.c:588
 #, c-format
 msgid	"Accept Followup-To? %s=post, %s=ignore, %s=quit: "
 msgstr	"Aktsepteerin Followup-To? %s=postita, %s=ignoreeri, %s=välju: "
 
-#: src/lang.c:584
+#: src/lang.c:589
 msgid	"Article unchanged, abort mailing?"
 msgstr	"Artiklit ei ole muudetud, katkestan saatmise?"
 
-#: src/lang.c:585
+#: src/lang.c:590
 #, c-format
 msgid	"Do you want to see postponed articles (%d)?"
 msgstr	"Kas soovite näha postitamisootel artikleid (%d)?"
 
-#: src/lang.c:587
+#: src/lang.c:592
 msgid	"Add quick kill filter?"
 msgstr	"Lisan kiirsurmamise filtri?"
 
-#: src/lang.c:588
+#: src/lang.c:593
 msgid	"Add quick selection filter?"
 msgstr	"Lisan kiirvaliku filtri?"
 
-#: src/lang.c:589
+#: src/lang.c:594
 msgid	"Do you really want to quit?"
 msgstr	"Kas te tõesti soovite väljuda?"
 
-#: src/lang.c:590
-msgid	"%s=edit cancel message, %s=quit, %s=delete (cancel) [%%.*s]: "
-msgstr	"%s=toimeta katkestamisteadet, %s=välju, %s=kustuta (katkesta) [%%.*s]: "
+#: src/lang.c:595
+#, c-format
+msgid	"%s=edit cancel message, %s=quit, %s=delete (cancel) [%%s]: "
+msgstr	"%s=toimeta katkestamisteadet, %s=välju, %s=kustuta (katkesta) [%%s]: "
 
-#: src/lang.c:591
+#: src/lang.c:596
 msgid	"You have tagged articles in this group - quit anyway?"
 msgstr	"Teil on siin grupis märgitud artikleid - väljun siiski?"
 
-#: src/lang.c:592
+#: src/lang.c:597
 #, c-format
 msgid	"%s=quit, %s=edit, %s=postpone: "
 msgstr	"%s=välju, %s=toimeta, %s=ootele: "
 
-#: src/lang.c:593
+#: src/lang.c:598
 #, c-format
 msgid	"%s=quit %s=edit %s=save kill description: "
 msgstr	"%s=välju %s=toimeta %s=salvesta surmamise kirjeldus: "
 
-#: src/lang.c:594
+#: src/lang.c:599
 #, c-format
 msgid	"%s=quit %s=edit %s=save select description: "
 msgstr	"%s=välju %s=toimeta %s=salvesta valiku kirjeldus: "
 
-#: src/lang.c:595
+#: src/lang.c:600
 msgid	"Do you really want to quit without saving your configuration?"
 msgstr	"Kas te tõesti soovite seadeid salvestamata väljuda?"
 
-#: src/lang.c:598
+#: src/lang.c:603
 msgid	"Invalid range - valid are '0-9.$' eg. 1-$"
 msgstr	"Vigane vahemik - lubatud on '0-9.$' näiteks 1-$"
 
-#: src/lang.c:599
+#: src/lang.c:604
 msgid	"Do you want to abort this operation?"
 msgstr	"Kas soovite seda operatsiooni katkestada?"
 
-#: src/lang.c:600
+#: src/lang.c:605
 msgid	"Do you want to exit tin immediately?"
 msgstr	"Kas soovite viivitamata tinist väljuda?"
 
-#: src/lang.c:601
+#: src/lang.c:606
 msgid	"Read response> "
 msgstr	"Loen vastust> "
 
-#: src/lang.c:602
+#: src/lang.c:607
 msgid	"Reading ('q' to quit)..."
 msgstr	"Loen ('q' katkestamiseks)..."
 
-#: src/lang.c:603
+#: src/lang.c:608
 #, c-format
 msgid	"Reading %sarticles..."
 msgstr	"Loen %sartikleid..."
 
-#: src/lang.c:604
+#: src/lang.c:609
 #, c-format
 msgid	"Reading %sattributes file...\n"
 msgstr	"Loen %satribuutide faili...\n"
 
-#: src/lang.c:605
+#: src/lang.c:610
 #, c-format
 msgid	"Reading %sconfig file...\n"
 msgstr	"Loen %sseadete faili...\n"
 
-#: src/lang.c:606
+#: src/lang.c:611
 msgid	"Reading filter file...\n"
 msgstr	"Loen filtrite faili...\n"
 
-#: src/lang.c:607
+#: src/lang.c:612
 #, c-format
 msgid	"Reading %s groups..."
 msgstr	"Loen %s gruppe..."
 
-#: src/lang.c:608
+#: src/lang.c:613
 msgid	"Reading input history file...\n"
 msgstr	"Loen sisendi ajalugu...\n"
 
-#: src/lang.c:609
+#: src/lang.c:614
 msgid	"Reading keymap file...\n"
 msgstr	"Loen klahvitabeli faili...\n"
 
-#: src/lang.c:610
+#: src/lang.c:615
 msgid	"Reading groups from active file... "
 msgstr	"Loen aktiivseid gruppe... "
 
-#: src/lang.c:611
+#: src/lang.c:616
 msgid	"Reading groups from newsrc file... "
 msgstr	"Loen gruppe newsrc failist... "
 
-#: src/lang.c:612
+#: src/lang.c:617
 msgid	"Reading newsgroups file... "
 msgstr	"Loen gruppide kirjeldusi... "
 
-#: src/lang.c:613
+#: src/lang.c:618
 msgid	"Reading newsrc file..."
 msgstr	"Loen newsrc faili..."
 
-#: src/lang.c:614
+#: src/lang.c:620
+#, c-format
+msgid	"(%d:%02d remaining)"
+msgstr	"(%d:%02d järgneb)"
+
+#: src/lang.c:622
 #, c-format
 msgid	"Bogus group %s removed."
 msgstr	"Vigane grupp %s on eemaldatud."
 
-#: src/lang.c:615
+#: src/lang.c:623
 #, c-format
 msgid	"Error: rename %s to %s"
 msgstr	"Viga: %s uus nimi %s"
 
-#: src/lang.c:616
+#: src/lang.c:624
 msgid	"Reply to author..."
 msgstr	"Vastan autorile..."
 
-#: src/lang.c:617
+#: src/lang.c:625
 msgid	"Repost"
 msgstr	"Uuesti postitus"
 
-#: src/lang.c:618
+#: src/lang.c:626
 msgid	"Reposting article..."
 msgstr	"Postitan artikli uuesti..."
 
-#: src/lang.c:619
+#: src/lang.c:627
 #, c-format
 msgid	"Repost article(s) to group(s) [%s]> "
 msgstr	"Postitan artikli(d) gruppi(desse) [%s]> "
 
-#: src/lang.c:620
+#: src/lang.c:628
 msgid	"Reset newsrc?"
 msgstr	"Algväärtustan newsrc?"
 
-#: src/lang.c:621
+#: src/lang.c:629
 msgid	"Responses have been directed to the following newsgroups"
 msgstr	"Vastused edastatakse järgnevatesse gruppidesse"
 
-#: src/lang.c:622
+#: src/lang.c:630
 #, c-format
 msgid	"Responses have been directed to poster. %s=mail, %s=post, %s=quit: "
 msgstr	"Vastused edastatakse postitajale. %s=kirjuta, %s=postita, %s=välju: "
 
-#: src/lang.c:623
+#: src/lang.c:631
 #, c-format
-msgid	"RespNo %4d of %4d%s"
-msgstr	"Vastus %4d : %4d%s"
+msgid	"RespNo %4d of %4d"
+msgstr	"Vastus %4d : %4d"
 
-#: src/lang.c:624
+#: src/lang.c:632
 msgid	"Press <RETURN> to continue..."
 msgstr	"Jätkamiseks vajutage <RETURN>..."
 
-#: src/lang.c:626
+#: src/lang.c:634
 #, c-format
-msgid	"Select From    [%-*.*s] (y/n): "
-msgstr	"Valige From    [%-*.*s] (j/e): "
+msgid	"Select From    [%s] (y/n): "
+msgstr	"Valige From    [%s] (j/e): "
 
-#: src/lang.c:627
+#: src/lang.c:635
 msgid	"Select Lines: (</>num): "
 msgstr	"Valige read:  (</>num): "
 
-#: src/lang.c:628
+#: src/lang.c:636
 msgid	"Auto-select Article Menu"
 msgstr	"Automaatselt valitavate artiklite menüü"
 
-#: src/lang.c:629
+#: src/lang.c:637
 #, c-format
-msgid	"Select Msg-Id  [%-*.*s] (f/l/o/n): "
-msgstr	"Valige Msg-Id  [%-*.*s] (f/l/o/n): "
+msgid	"Select Msg-Id  [%s] (f/l/o/n): "
+msgstr	"Valige Msg-Id  [%s] (f/l/o/n): "
 
-#: src/lang.c:630
+#: src/lang.c:638
 msgid	"Select pattern scope: "
 msgstr	"Valige mustri ulatus: "
 
-#: src/lang.c:631
+#: src/lang.c:639
 #, c-format
-msgid	"Select Subject [%-*.*s] (y/n): "
-msgstr	"Valige teema   [%-*.*s] (j/e): "
+msgid	"Select Subject [%s] (y/n): "
+msgstr	"Valige teema   [%s] (j/e): "
 
-#: src/lang.c:632
+#: src/lang.c:640
 msgid	"Select text pattern : "
 msgstr	"Valige tekstimuster : "
 
-#: src/lang.c:633
+#: src/lang.c:641
 msgid	"Select time in days   : "
 msgstr	"Valige aeg päevades   : "
 
-#: src/lang.c:634
+#: src/lang.c:642
 #, c-format
 msgid	"# %s server configuration file\n"
 	"# This file was automatically saved by %s %s %s (\"%s\")\n"
@@ -2603,218 +2718,223 @@ msgstr	"# %s serveri seadete fail\n"
 	"############################################################################\n"
 	"\n"
 
-#: src/lang.c:640
+#: src/lang.c:648
 msgid	"Showing unread groups only"
 msgstr	"Näitan ainult lugemata gruppe"
 
-#: src/lang.c:641
+#: src/lang.c:649
 msgid	"Subject: line (ignore case)   "
 msgstr	"Subject: rida (tõstutundetu)"
 
-#: src/lang.c:642
+#: src/lang.c:650
 msgid	"Subject: line (case sensitive)"
 msgstr	"Subject: rida (tõstutundlik)"
 
-#: src/lang.c:643
+#: src/lang.c:651
 msgid	"Save"
 msgstr	"Salvesta"
 
-#: src/lang.c:644
+#: src/lang.c:652
 #, c-format
 msgid	"Save '%s' (%s/%s)?"
 msgstr	"Salvestan '%s' (%s/%s)?"
 
-#: src/lang.c:645
+#: src/lang.c:653
 msgid	"Save configuration before continuing?"
 msgstr	"Salvestan seaded enne jätkamist?"
 
-#: src/lang.c:646
+#: src/lang.c:654
 msgid	"Save filename> "
 msgstr	"Fail salvestamiseks> "
 
-#: src/lang.c:647
+#: src/lang.c:655
 msgid	"Saved"
 msgstr	"Salvestatud"
 
-#: src/lang.c:648
+#: src/lang.c:656
 #, c-format
 msgid	"%4d unread (%4d hot) %s in %s\n"
 msgstr	"%4d lugemata (%4d kuuma) %s grupis %s\n"
 
-#: src/lang.c:649
+#: src/lang.c:657
 #, c-format
 msgid	"Saved %s...\n"
 msgstr	"Salvestatud %s...\n"
 
-#: src/lang.c:650
+#: src/lang.c:658
 msgid	"Nothing was saved"
 msgstr	"Midagi ei salvestatud"
 
-#: src/lang.c:651
+#: src/lang.c:659
 #, c-format
 msgid	"\n"
 	"%s %d %s from %d %s\n"
 msgstr	"\n"
 	"%s %d %s %d grupist%s\n"
 
-#: src/lang.c:652
+#: src/lang.c:660
 #, c-format
 msgid	"-- %s saved to %s%s --"
 msgstr	"-- %s salvestati %s%s --"
 
-#: src/lang.c:653
+#: src/lang.c:661
 #, c-format
 msgid	"-- %s saved to %s - %s --"
 msgstr	"-- %s salvestati %s - %s --"
 
-#: src/lang.c:654
+#: src/lang.c:662
 msgid	"Saving..."
 msgstr	"Salvestan..."
 
-#: src/lang.c:655
+#: src/lang.c:663
 #, c-format
 msgid	"%s: Screen initialization failed"
 msgstr	"%s: Ekraani initsialiseerimine ebaõnnestus"
 
-#: src/lang.c:656
+#: src/lang.c:665
 #, c-format
 msgid	"%s: screen is too small\n"
 msgstr	"%s: ekraan on liiga väike\n"
 
-#: src/lang.c:657
+#: src/lang.c:667
 #, c-format
 msgid	"screen is too small, %s is exiting\n"
 msgstr	"ekraan on liiga väike, %s lõpetab töö\n"
 
-#: src/lang.c:658
+#: src/lang.c:668
 #, c-format
 msgid	"Search backwards [%s]> "
 msgstr	"Otsin tagurpidi [%s]> "
 
-#: src/lang.c:659
+#: src/lang.c:669
 #, c-format
 msgid	"Search body [%s]> "
 msgstr	"Otsi kehast [%s]> "
 
-#: src/lang.c:660
+#: src/lang.c:670
 #, c-format
 msgid	"Search forwards [%s]> "
 msgstr	"Otsi edaspidi [%s]> "
 
-#: src/lang.c:661
+#: src/lang.c:671
 msgid	"Searching..."
 msgstr	"Otsin..."
 
-#: src/lang.c:662
+#: src/lang.c:672
 #, c-format
 msgid	"Searching article %d of %d ('q' to abort)..."
 msgstr	"Otsin artiklit %d/%d ('q' katkestamiseks)..."
 
-#: src/lang.c:663
+#: src/lang.c:673
 msgid	"Select article> "
 msgstr	"Valige artikkel> "
 
-#: src/lang.c:664
+#: src/lang.c:674
 msgid	"Select option number before text or use arrow keys and <CR>. 'q' to quit."
 msgstr	"Valige teksti eest omaduse number või kasutage nooli ja <CR>. 'q' väljumiseks."
 
-#: src/lang.c:665
+#: src/lang.c:675
 msgid	"Select group> "
 msgstr	"Valige grupp> "
 
-#: src/lang.c:666
+#: src/lang.c:676
 #, c-format
 msgid	"Enter selection pattern [%s]> "
 msgstr	"Sisestage valiku muster [%s]> "
 
-#: src/lang.c:667
+#: src/lang.c:677
 msgid	"Select thread > "
 msgstr	"Valige teema > "
 
-#: src/lang.c:668
+#: src/lang.c:678
 #, c-format
 msgid	"%s %s %s (\"%s\") [%s]: send a DETAILED bug report to %s\n"
 msgstr	"%s %s %s (\"%s\") [%s]: saatke palun DETAILNE vea raport aadressil %s\n"
 
-#: src/lang.c:669
+#: src/lang.c:679
 msgid	"servers active-file"
 msgstr	"serveri aktiivsete gruppide fail"
 
-#: src/lang.c:670
+#: src/lang.c:680
 msgid	"Cannot move into new newsgroups. Subscribe first..."
 msgstr	"Uutesse gruppidesse ei saa siseneda. Tellige kõigepealt..."
 
-#: src/lang.c:671
+#: src/lang.c:681
 msgid	"<SPACE>"
 msgstr	"<TÜHIK>"
 
-#: src/lang.c:672
+#: src/lang.c:682
 #, c-format
 msgid	"Starting: (%s)"
 msgstr	"Stardin: (%s)"
 
-#: src/lang.c:673
+#: src/lang.c:683
 #, c-format
 msgid	"List Thread (%d of %d)"
 msgstr	"Teemad (%d/%d)"
 
-#: src/lang.c:674
+#: src/lang.c:684
 #, c-format
 msgid	"Thread (%.*s)"
 msgstr	"Teema (%.*s)"
 
-#: src/lang.c:675
+#: src/lang.c:685
 msgid	"Enter wildcard subscribe pattern> "
 msgstr	"Sisestage tellimise muster> "
 
-#: src/lang.c:676
+#: src/lang.c:686
 #, c-format
 msgid	"subscribed to %d groups"
 msgstr	"%d gruppi on tellitud"
 
-#: src/lang.c:677
+#: src/lang.c:687
 #, c-format
 msgid	"Subscribed to %s"
 msgstr	"%s on tellitud"
 
-#: src/lang.c:678
+#: src/lang.c:688
 msgid	"Subscribing... "
 msgstr	"Tellin... "
 
-#: src/lang.c:679
-msgid	"Repost or supersede article(s) [%%.*s]? (%s/%s/%s): "
-msgstr	"Postitan uuesti või asendan artikli(d) [%%.*s]? (%s/%s/%s): "
+#: src/lang.c:689
+#, c-format
+msgid	"Repost or supersede article(s) [%%s]? (%s/%s/%s): "
+msgstr	"Postitan uuesti või asendan artikli(d) [%%s]? (%s/%s/%s): "
 
-#: src/lang.c:680
+#: src/lang.c:690
 #, c-format
 msgid	"Supersede article(s) to group(s) [%s]> "
 msgstr	"Asendan artikli(d) gruppides [%s]> "
 
-#: src/lang.c:681
+#: src/lang.c:691
 msgid	"Superseding article ..."
 msgstr	"Asendan artikli ..."
 
-#: src/lang.c:682
+#: src/lang.c:692
 #, c-format
 msgid	"\n"
 	"Stopped. Type 'fg' to restart %s\n"
 msgstr	"\n"
 	"Peatatud. %s uuesti käivitamiseks kirjutage palun 'fg'\n"
 
-#: src/lang.c:684
+#: src/lang.c:694
 #, c-format
 msgid	"%d days"
 msgstr	"%d päeva"
 
-#: src/lang.c:685
+#: src/lang.c:695
 msgid	"<TAB>"
 msgstr	"<TAB>"
 
-#: src/lang.c:686
+#: src/lang.c:696
+msgid	"TeX "
+msgstr	"TeX "
+
+#: src/lang.c:697
 msgid	"# Default action/prompt strings\n"
 msgstr	"# Vaikimisi aktsioonide/viipade sõned\n"
 
-#: src/lang.c:687
+#: src/lang.c:698
 msgid	"# Defaults for quick (1 key) kill & auto-selection filters\n"
 	"# header=NUM  0,1=Subject: 2,3=From: 4=Message-ID: & full References: line\n"
 	"#             5=Message-ID: & last References: entry only\n"
@@ -2831,262 +2951,261 @@ msgstr	"# Vaikeväärtused kiire (1 võtme)
 	"# case=ON/OFF    ON=filter on tõstutundlik OFF=tõstutundetu\n"
 	"# expire=ON/OFF  ON=kehtivusaeg default_filter_days OFF=ei aegu\n"
 
-#: src/lang.c:700
+#: src/lang.c:711
 msgid	"# If ON use print current subject or newsgroup description in the last line\n"
 msgstr	"# Kui on ON, trüki teema või grupikirjeldus viimasele reale\n"
 
-#: src/lang.c:701
+#: src/lang.c:712
 msgid	"# Host & time info used for detecting new groups (don't touch)\n"
 msgstr	"# Masin & aeg - kasutatakse uute gruppide leidmiseks (mitte muuta)\n"
 
-#: src/lang.c:702
+#: src/lang.c:713
 msgid	"There is no news\n"
 msgstr	"Uudiseid pole\n"
 
-#: src/lang.c:703
+#: src/lang.c:714
 msgid	"Thread"
 msgstr	"Teema"
 
-#: src/lang.c:704
+#: src/lang.c:715
 msgid	"Thread Level Commands"
 msgstr	"Teemataseme käsud"
 
-#: src/lang.c:705
+#: src/lang.c:716
 msgid	"Thread deselected"
 msgstr	"Teema pole valitud"
 
-#: src/lang.c:706
+#: src/lang.c:717
 msgid	"Thread selected"
 msgstr	"Teema on valitud"
 
-#: src/lang.c:707
+#: src/lang.c:719
 msgid	"threads"
 msgstr	"teemad"
 
-#: src/lang.c:708
+#: src/lang.c:721
 msgid	"Thread range"
 msgstr	"Teemade vahemik"
 
-#: src/lang.c:709
+#: src/lang.c:722
 msgid	"thread"
 msgstr	"teema"
 
-#: src/lang.c:710
+#: src/lang.c:723
 #, c-format
-msgid	"%sThread %4s of %4s"
-msgstr	"%sTeema %4s : %4s"
+msgid	"Thread %4s of %4s"
+msgstr	"Teema %4s : %4s"
 
-#: src/lang.c:711
+#: src/lang.c:724
 msgid	"Threading articles..."
 msgstr	"Järjestan artiklid teemade kaupa..."
 
-#: src/lang.c:712
+#: src/lang.c:725
 #, c-format
 msgid	"Toggled word highlighting %s"
 msgstr	"Sõnade esiletõstmine lülitatud %s"
 
-#: src/lang.c:713
+#: src/lang.c:726
 msgid	"Toggled rot13 encoding"
 msgstr	"Lülitatud rot13 kodeerimine"
 
-#: src/lang.c:714
+#: src/lang.c:727
 #, c-format
 msgid	"Toggled german TeX encoding %s"
 msgstr	"Lülitatud saksa TeX kodeering %s"
 
-#: src/lang.c:715
+#: src/lang.c:728
 #, c-format
 msgid	"Toggled tab-width to %d"
 msgstr	"Lülitatud tab-width väärtus %d"
 
-#: src/lang.c:716
+#: src/lang.c:729
 #, c-format
 msgid	"%d Trying to dotlock %s"
 msgstr	"%d Üritan punkt-lukustada %s"
 
-#: src/lang.c:717
+#: src/lang.c:730
 #, c-format
 msgid	"%d Trying to lock %s"
 msgstr	"%d Üritan lukustada %s"
 
-#: src/lang.c:718
+#: src/lang.c:731
 msgid	"           h=help\n"
 msgstr	"           h=appi\n"
 
-#: src/lang.c:720
+#: src/lang.c:733
 msgid	"Unlimited"
 msgstr	"Piiramata"
 
-#: src/lang.c:721
+#: src/lang.c:734
 msgid	"Enter wildcard unsubscribe pattern> "
 msgstr	"Sisestage loobumise muster> "
 
-#: src/lang.c:722
+#: src/lang.c:735
 #, c-format
 msgid	"Error decoding %s : %s"
 msgstr	"Viga %s dekodeerimisel: %s"
 
-#: src/lang.c:723
+#: src/lang.c:736
 msgid	"No end."
 msgstr	"Lõpp puudub."
 
-#: src/lang.c:724
+#: src/lang.c:737
 #, c-format
 msgid	"%s successfully decoded."
 msgstr	"%s on edukalt dekodeeritud."
 
-#: src/lang.c:725
+#: src/lang.c:738
 #, c-format
 msgid	"%*s[-- %s/%s, %suuencoded file, %d lines, name: %s --]\n"
 	"\n"
 msgstr	"%*s[-- %s/%s, %suuenkodeeritud fail, %d rida, nimi: %s --]\n"
 	"\n"
 
-#: src/lang.c:726
+#: src/lang.c:739
 msgid	"unread "
 msgstr	"lugemata "
 
-#: src/lang.c:727
+#: src/lang.c:740
 #, c-format
 msgid	"unsubscribed from %d groups"
 msgstr	"loobunud %d grupist"
 
-#: src/lang.c:728
+#: src/lang.c:741
 #, c-format
 msgid	"Unsubscribed from %s"
 msgstr	"Loobunud grupist %s"
 
-#: src/lang.c:729
+#: src/lang.c:742
 msgid	"Unsubscribing... "
 msgstr	"Loobun gruppidest... "
 
-#: src/lang.c:730
+#: src/lang.c:743
 msgid	"Unthreading articles..."
 msgstr	"Tükeldan teemad..."
 
-#: src/lang.c:731
+#: src/lang.c:744
 msgid	"Updated"
 msgstr	"Uuendatud"
 
-#: src/lang.c:732
+#: src/lang.c:745
 msgid	"Updating"
 msgstr	"Uuendan"
 
-#: src/lang.c:733
+#: src/lang.c:746
 #, c-format
 msgid	"Opening %s\n"
 msgstr	"Proovin %s\n"
 
-#: src/lang.c:734
+#: src/lang.c:747
 msgid	"No more URL's in this article"
 msgstr	"Selles artiklis pole rohkem URL'e"
 
-#: src/lang.c:735
+#: src/lang.c:748
 msgid	"Use MIME display program for this message?"
 msgstr	"Kasutan selle teate lugemiseks MIME näitamise programmi?"
 
-#: src/lang.c:736
+#: src/lang.c:749
 msgid	"  -c       mark all news as read in subscribed newsgroups (batch mode)"
 msgstr	"  -c       märgi tellitud gruppides kõik artiklid loetuks (pakettmood)"
 
-#: src/lang.c:737
+#: src/lang.c:750
 msgid	"  -Z       return status indicating if any unread news (batch mode)"
 msgstr	"  -Z       tagasta väärtus, mis näitab, kas on lugemata artikleid (pakettmood)"
 
-#: src/lang.c:738
+#: src/lang.c:751
 msgid	"  -q       don't check for new newsgroups"
 msgstr	"  -q       ära otsi uusi gruppe"
 
-#: src/lang.c:739
+#: src/lang.c:752
 msgid	"  -X       don't save any files on quit"
 msgstr	"  -X       töö lõpetamisel ära salvesta ühtegi faili"
 
-#: src/lang.c:740
+#: src/lang.c:753
 msgid	"  -d       don't show newsgroup descriptions"
 msgstr	"  -d       ära näita gruppide kirjeldusi"
 
-#: src/lang.c:741
+#: src/lang.c:754
 msgid	"  -G limit get only limit articles/group"
 msgstr	"  -G num   loe aunult num artiklit/gruppi"
 
-#: src/lang.c:742
+#: src/lang.c:755
 #, c-format
 msgid	"  -H       help information about %s"
 msgstr	"  -H       %s kasutamise abiinfo"
 
-#: src/lang.c:743
+#: src/lang.c:756
 msgid	"  -h       this help message"
 msgstr	"  -h       see abitekst"
 
-#: src/lang.c:744
+#: src/lang.c:757
 #, c-format
 msgid	"  -I dir   news index file directory [default=%s]"
 msgstr	"  -I kat   uudiste indeksfaili kataloog [vaikimisi=%s]"
 
-#: src/lang.c:745
+#: src/lang.c:758
 msgid	"  -u       update index files (batch mode)"
 msgstr	"  -u       värskenda indeksfaile (pakettmood)"
 
-#: src/lang.c:746
+#: src/lang.c:759
 #, c-format
 msgid	"  -m dir   mailbox directory [default=%s]"
 msgstr	"  -m kat   kirjakaustade kataloog [vaikimisi=%s]"
 
-#: src/lang.c:747
+#: src/lang.c:760
 #, c-format
 msgid	"\n"
 	"Mail bug reports/comments to %s"
 msgstr	"\n"
 	"Saatke palun vea raport/kommentaarid aadressil %s"
 
-#: src/lang.c:748
+#: src/lang.c:761
 msgid	"  -N       mail new news to your posts (batch mode)"
 msgstr	"  -N       saada uued vastused teie postitustele (pakettmood)"
 
-#: src/lang.c:749
+#: src/lang.c:762
 msgid	"  -M user  mail new news to specified user (batch mode)"
 msgstr	"  -M kasut saada uued artiklid näidatud kasutajale (pakettmood)"
 
-#: src/lang.c:750
+#: src/lang.c:763
 #, c-format
 msgid	"  -f file  subscribed to newsgroups file [default=%s]"
 msgstr	"  -f fail  tellitud gruppide fail [vaikimisi=%s]"
 
-# TRANSLATION MISSING
-#: src/lang.c:751
+#: src/lang.c:764
 msgid	"  -x       no posting mode"
-msgstr	""
+msgstr	"  -x       postitamiseta mood"
 
-#: src/lang.c:752
+#: src/lang.c:765
 msgid	"  -w       post an article and exit"
 msgstr	"  -w       postita artikkel ja lõpeta töö"
 
-#: src/lang.c:753
+#: src/lang.c:766
 msgid	"  -o       post all postponed articles and exit"
 msgstr	"  -o       postita kõik postitamisootel artiklid ja lõpeta töö"
 
-#: src/lang.c:754
+#: src/lang.c:767
 msgid	"  -r       read news remotely from default NNTP server"
 msgstr	"  -r       loe artikleid kasutades vaikimisi NNTP serverit"
 
-#: src/lang.c:755
+#: src/lang.c:768
 msgid	"  -R       read news saved by -S option"
 msgstr	"  -R       loe artikleid, mis on salvestatud -S võtmega"
 
-#: src/lang.c:756
+#: src/lang.c:769
 #, c-format
 msgid	"  -s dir   save news directory [default=%s]"
 msgstr	"  -s kat   artiklite salvestamise kataloog [vaikimisi=%s]"
 
-#: src/lang.c:757
+#: src/lang.c:770
 msgid	"  -S       save new news for later reading (batch mode)"
 msgstr	"  -S       salvesta uued artiklid hilisemaks lugemiseks (pakettmood)"
 
-#: src/lang.c:758
+#: src/lang.c:771
 msgid	"  -z       start if any unread news"
 msgstr	"  -z       alusta tööd, kui on lugemata uudiseid"
 
-#: src/lang.c:759
+#: src/lang.c:772
 #, c-format
 msgid	"A Usenet reader.\n"
 	"\n"
@@ -3095,37 +3214,37 @@ msgstr	"Usenet klient.\n"
 	"\n"
 	"Kasuta: %s [võtmed] [grupp[,...]]"
 
-#: src/lang.c:760
+#: src/lang.c:773
 msgid	"  -v       verbose output for batch mode options"
 msgstr	"  -v       esita pakettmoodi käskudega detailsemat informatsiooni"
 
-#: src/lang.c:761
+#: src/lang.c:774
 msgid	"  -V       print version & date information"
 msgstr	"  -V       esita versiooni ja kuupäeva informatsioon"
 
-#: src/lang.c:762
+#: src/lang.c:775
 #, c-format
 msgid	"%s only useful without batch mode operations\n"
 msgstr	"%s on kasutatav ainult pakettmoodi käskudeta\n"
 
-#: src/lang.c:763
+#: src/lang.c:776
 #, c-format
 msgid	"%s only useful for batch mode operations\n"
 msgstr	"%s on kasutatav ainult pakettmoodi käskudega\n"
 
-#: src/lang.c:765
+#: src/lang.c:778
 #, c-format
 msgid	"\n"
 	"%s%d out of range (0 - %d). Reset to 0"
 msgstr	"\n"
 	"%s%d piiridest väljas (0 - %d). Sean 0"
 
-#: src/lang.c:766
+#: src/lang.c:779
 #, c-format
 msgid	"View '%s' (%s/%s)?"
 msgstr	"Vaatan '%s' (%s/%s)?"
 
-#: src/lang.c:768
+#: src/lang.c:781
 #, c-format
 msgid	"\n"
 	"Warning: posting exceeds %d columns. Line %d is the first long one:\n"
@@ -3134,26 +3253,26 @@ msgstr	"\n"
 	"Hoiatus: postitus ületab %d veergu. Esimene pikk rida on rida %d:\n"
 	"%-100s\n"
 
-#: src/lang.c:769
+#: src/lang.c:782
 msgid	"\n"
 	"Warning: article unchanged after editing\n"
 msgstr	"\n"
 	"Hoiatus: artiklit ei ole toimetamise käigus muudetud\n"
 
-#: src/lang.c:770
+#: src/lang.c:783
 msgid	"\n"
 	"Warning: \"Subject:\" contains only whitespaces.\n"
 msgstr	"\n"
 	"Hoiatus: \"Subject:\" real on ainult tühikud.\n"
 
-#: src/lang.c:771
+#: src/lang.c:784
 msgid	"\n"
 	"Warning: \"Subject:\" begins with \"Re: \" but there are no \"References:\".\n"
 msgstr	"\n"
 	"Hoiatus: \"Subject:\" algab fraasiga \"Re: \", aga \"References:\" välju "
 	"pole.\n"
 
-#: src/lang.c:773
+#: src/lang.c:786
 msgid	"\n"
 	"Warning: Article has \"References:\" but \"Subject:\" does not begin\n"
 	"         with \"Re: \" and does not contain \"(was:\".\n"
@@ -3161,7 +3280,7 @@ msgstr	"\n"
 	"Hoiatus: Artiklis on \"References:\" päis, aga \"Subject:\" ei alga fraasiga\n"
 	"         \"Re: \" ega sisalda \"(was:\".\n"
 
-#: src/lang.c:776
+#: src/lang.c:789
 msgid	"Read carefully!\n"
 	"\n"
 	"  You are about to cancel an article seemingly written by you. This will "
@@ -3181,7 +3300,7 @@ msgstr	"Lugege hoolikalt!\n"
 	"Siin on artikkel, mida te hakkate kustutama:\n"
 	"\n"
 
-#: src/lang.c:780
+#: src/lang.c:793
 msgid	"\n"
 	"Warning: You are using a non-plain transfer encoding (such as base64 or\n"
 	"         quoted-printable) and an external inews program to submit your\n"
@@ -3193,7 +3312,7 @@ msgstr	"\n"
 	"         lisab artiklile signatuuri, siis on võimalik,  et seda ei kodeerita\n"
 	"         korrektselt.\n"
 
-#: src/lang.c:785
+#: src/lang.c:798
 #, c-format
 msgid	"\n"
 	"\n"
@@ -3206,7 +3325,7 @@ msgstr	"\n"
 	"Väärtused failis %s on muutunud!\n"
 	"Palun lugege faile WHATSNEW, jne...\n"
 
-#: src/lang.c:787
+#: src/lang.c:800
 #, c-format
 msgid	"\n"
 	"\n"
@@ -3218,7 +3337,7 @@ msgstr	"\n"
 	"kasutatu!\n"
 	"Mõningaid väärtusi failis %s võidakse ignoreerida, mõningaid võidakse muuta!\n"
 
-#: src/lang.c:790
+#: src/lang.c:803
 #, c-format
 msgid	"Warning: tin wrote fewer groups to your\n"
 	"\t%s\n"
@@ -3231,7 +3350,7 @@ msgstr	"Hoiatus: tin kirjutas vähem grup
 	"grupist%s, tähendab see viga ja te peaksite varundama oma %s\n"
 	"enne, kui te tini uuesti käivitate!\n"
 
-#: src/lang.c:794
+#: src/lang.c:807
 #, c-format
 msgid	"\n"
 	"Warning: Found %d '-- \\n' lines, this may confuse some people.\n"
@@ -3239,12 +3358,12 @@ msgstr	"\n"
 	"Hoiatus: Leidsin %d '-- \\n' rida, mis võib tekitada osades inimestes "
 	"segadust.\n"
 
-#: src/lang.c:795
+#: src/lang.c:808
 #, c-format
 msgid	"Warning: Only %d out of %d articles were saved"
 msgstr	"Hoiatus: Salvestati ainult %d artiklit %d artiklist"
 
-#: src/lang.c:796
+#: src/lang.c:809
 #, c-format
 msgid	"\n"
 	"Warning: Your signature  is longer than %d lines.  Since signatures usually "
@@ -3259,48 +3378,48 @@ msgstr	"\n"
 	"võimalikult\n"
 	"         lühikesed.\n"
 
-#: src/lang.c:800
+#: src/lang.c:813
 #, c-format
 msgid	"Warning: this mail address may contain a spamtrap. %s=continue, %s=abort? "
 msgstr	"Hoiatus: see aadress võib sisaldada rämpsposti lõksu. %s=jätkan, %s=katkestan?"
 
-#: src/lang.c:801
+#: src/lang.c:814
 msgid	"\n"
 	"Warning: Signatures should start with '-- \\n' not with '--\\n'.\n"
 msgstr	"\n"
 	"Hoiatus: Signatuuride alguses peaks olema '-- \\n', mitte '--\\n'.\n"
 
-#: src/lang.c:802
+#: src/lang.c:815
 msgid	"Writing attributes file..."
 msgstr	"Kirjutan atribuutide faili..."
 
-#: src/lang.c:804
+#: src/lang.c:817
 #, c-format
-msgid	"%d Responses%s"
-msgstr	"%d Vastust%s"
+msgid	"%d Responses"
+msgstr	"%d Vastust"
 
-#: src/lang.c:806
+#: src/lang.c:819
 #, c-format
 msgid	"Added %d %s"
 msgstr	"Lisatud %d %s"
 
-#: src/lang.c:807
+#: src/lang.c:820
 msgid	"No unsubscribed groups to show"
 msgstr	"Tellimata gruppe pole"
 
-#: src/lang.c:808
+#: src/lang.c:821
 msgid	"Showing subscribed to groups only"
 msgstr	"Näitan ainult tellitud gruppe"
 
-#: src/lang.c:809
+#: src/lang.c:822
 msgid	"Yes "
 msgstr	"Jah "
 
-#: src/lang.c:810
+#: src/lang.c:823
 msgid	"    You have mail\n"
 msgstr	"    Teil on kiri\n"
 
-#: src/lang.c:815
+#: src/lang.c:828
 #, c-format
 msgid	"\n"
 	"Warning: Posting is in %s and contains characters which are not\n"
@@ -3316,19 +3435,14 @@ msgstr	"\n"
 	"         Kui te postitate selle artikli muutmata kujul, asendatakse\n"
 	"         need sümbolid sümboliga '?'. Et vältida sodi teie artiklis, palun\n"
 	"         seda kas muuta ja eemaldada need sümbolid või muuta seadet\n"
-	"         MM_NETWORK_CHARSET. Viimast saate teostada kasutades valikut "
-	"M)enüü.\n"
-
-#: src/lang.c:826
-#, c-format
-msgid	"Redefined key %s '%s' -> '%s'\n"
-msgstr	"Klahvi %s uus definitsioon '%s' -> '%s'\n"
+	"         MM_NETWORK_CHARSET. Viimast saate teostada kasutades valikut M)"
+	"enüü.\n"
 
-#: src/lang.c:827
+#: src/lang.c:839
 msgid	"  -D       debug mode 1=NNTP 2=ALL"
 msgstr	"  -D       silumismood 1=NNTP 2=KÕIK"
 
-#: src/lang.c:831
+#: src/lang.c:843
 msgid	"Read carefully!\n"
 	"\n"
 	"  You are about to cancel an article seemingly not written by you.  This "
@@ -3352,68 +3466,92 @@ msgstr	"Lugege hoolikalt!\n"
 	"Siin on artikkel, mida te asute kustutama:\n"
 	"\n"
 
-#: src/lang.c:840
+#: src/lang.c:852
 msgid	"toggle color"
 msgstr	"lülita värve"
 
-#: src/lang.c:841
-msgid	"# For color-adjust use the following numbers\n"
-	"#  0-black       1-red         2-green        3-brown\n"
-	"#  4-blue        5-pink        6-cyan         7-white\n"
+#: src/lang.c:853
+msgid	"# Changing colors of several screen parts\n"
+	"# Possible values are:\n"
+	"#  -1 = default (white for foreground and black for background)\n"
+	"#   0 = black\n"
+	"#   1 = red\n"
+	"#   2 = green\n"
+	"#   3 = brown\n"
+	"#   4 = blue\n"
+	"#   5 = pink\n"
+	"#   6 = cyan\n"
+	"#   7 = white\n"
 	"# These are *only* for foreground:\n"
-	"#  8-gray        9-lightred   10-lightgreen  11-yellow\n"
-	"# 12-lightblue  13-lightpink  14-lightcyan   15-lightwhite\n"
-	"# A '-1' is interpreted as default (foreground normally is white, and\n"
-	"# background black)\n"
-	"\n"
-msgstr	"# Värvide seadmiseks kasutage järgnevaid koode\n"
-	"#  0-must        1-punane      2-roheline     3-pruun\n"
-	"#  4-sinine      5-roosa       6-lilla        7-valge\n"
+	"#   8 = gray\n"
+	"#   9 = light red\n"
+	"#  10 = light green\n"
+	"#  11 = yellow\n"
+	"#  12 = light blue\n"
+	"#  13 = light pink\n"
+	"#  14 = light cyan\n"
+	"#  15 = light white\n"
+	"\n"
+msgstr	"# Ekraaniosade värvide muutmine\n"
+	"# Võimalikud väärtused on:\n"
+	"#  -1 = vaikimisi (valge esiplaan ja must tagaplaan)\n"
+	"#   0 = must\n"
+	"#   1 = punane\n"
+	"#   2 = roheline\n"
+	"#   3 = pruun\n"
+	"#   4 = sinine\n"
+	"#   5 = roosa\n"
+	"#   6 = lilla\n"
+	"#   7 = valge\n"
 	"# Need on *ainult* esiplaani tarvis:\n"
-	"#  8-hall         9-helepunane 10-heleroheline 11-kollane\n"
-	"# 12-helesinine  13-heleroosa  14-helelilla    15-helevalge\n"
-	"# '-1' interpreteeritakse vaikeväärtusena (esiplaan on tavaliselt valge,\n"
-	"# taust must)\n"
+	"#   8 = hall\n"
+	"#   9 = helepunane\n"
+	"#  10 = heleroheline\n"
+	"#  11 = kollane\n"
+	"#  12 = helesinine\n"
+	"#  13 = heleroosa\n"
+	"#  14 = helelilla\n"
+	"#  15 = helevalge\n"
 	"\n"
 
-#: src/lang.c:849
+#: src/lang.c:873
 msgid	"  -a       toggle color flag"
 msgstr	"  -a       lülita värvide kasutamist"
 
-#: src/lang.c:853
+#: src/lang.c:877
 msgid	"\n"
 	"Error: Followup-To set to more than one newsgroup!\n"
 msgstr	"\n"
 	"Viga: Followup-To real on rohkem kui üks grupp!\n"
 
-#: src/lang.c:854
+#: src/lang.c:878
 #, c-format
 msgid	"\n"
 	"Error: cross-posting to %d newsgroups and no Followup-To line!\n"
 msgstr	"\n"
 	"Viga: ristpostitus %d gruppi ja Followup-To rida puudub!\n"
 
-#: src/lang.c:855
+#: src/lang.c:879
 #, c-format
 msgid	"\n"
 	"Error: \"%s\" is not a valid newsgroup!\n"
 msgstr	"\n"
 	"Viga: \"%s\" ei ole lubatud grupp!\n"
 
-#: src/lang.c:857
+#: src/lang.c:881
 msgid	"\n"
 	"Warning: Followup-To set to more than one newsgroup!\n"
 msgstr	"\n"
 	"Hoiatus: Followup-To on seatud rohkem, kui ühele grupile!\n"
 
-#: src/lang.c:858
+#: src/lang.c:882
 #, c-format
 msgid	"\n"
 	"Warning: cross-posting to %d newsgroups and no Followup-To line!\n"
 msgstr	"\n"
 	"Hoiatus: ristpostitus %d uudisegruppi ja Followup-To rida puudub!\n"
 
-#: src/lang.c:859
+#: src/lang.c:883
 #, c-format
 msgid	"\n"
 	"Warning: \"%s\" is not in your newsrc, it may be invalid at this site!\n"
@@ -3421,317 +3559,316 @@ msgstr	"\n"
 	"Hoiatus: \"%s\" puudub teie newsrc failist, see võib olla selles serveris "
 	"vigane!\n"
 
-#: src/lang.c:860
+#: src/lang.c:884
 #, c-format
 msgid	"\n"
 	"Warning: \"%s\" is not a valid newsgroup at this site!\n"
 msgstr	"\n"
 	"Hoiatus: \"%s\" ei ole selles serveris kehtiv grupp!\n"
 
-#: src/lang.c:864
+#: src/lang.c:888
 #, c-format
 msgid	"%d files successfully written from %d articles. %d %s occurred."
 msgstr	"Edukalt kirjutatud %d faili %d artiklist. Esines %d viga%s."
 
-#: src/lang.c:865
+#: src/lang.c:889
 msgid	"Missing parts."
 msgstr	"Osad puuduvad."
 
-#: src/lang.c:866
+#: src/lang.c:890
 msgid	"No beginning."
 msgstr	"Algus puudub."
 
-#: src/lang.c:867
+#: src/lang.c:891
 msgid	"No data."
 msgstr	"Andmeid pole."
 
-#: src/lang.c:868
+#: src/lang.c:892
 msgid	"Unknown error."
 msgstr	"Tundmatu viga."
 
-#: src/lang.c:870
+#: src/lang.c:895
 #, c-format
 msgid	"\tChecksum of %s (%ld %s)"
 msgstr	"\t%s kontrollsumma (%ld %s)"
 
-#: src/lang.c:874
+#: src/lang.c:900
 msgid	"Reading mail active file... "
 msgstr	"Loen aktiivsete kirjade kausta... "
 
-#: src/lang.c:875
+#: src/lang.c:901
 msgid	"Reading mailgroups file... "
 msgstr	"Loen kirjagruppide faili... "
 
-#: src/lang.c:879
+#: src/lang.c:905
 msgid	"perform PGP operations on article"
 msgstr	"kasuta artiklil PGP operatsioone"
 
-#: src/lang.c:880
+#: src/lang.c:906
 msgid	"Add key(s) to public keyring?"
 msgstr	"Lisan võtmed avalike võtmete hoidlasse?"
 
-#: src/lang.c:881
+#: src/lang.c:907
 #, c-format
 msgid	"%s=encrypt, %s=sign, %s=both, %s=quit: "
 msgstr	"%s=krüpti, %s=allkirjasta, %s=mõlemad, %s=välju: "
 
-#: src/lang.c:882
+#: src/lang.c:908
 #, c-format
 msgid	"%s=sign, %s=sign & include public key, %s=quit: "
 msgstr	"%s=allkirjasta, %s=allkirjasta & lisa avalik võti, %s=välju: "
 
-#: src/lang.c:883
+#: src/lang.c:909
 #, c-format
 msgid	"PGP has not been set up (can't open %s)"
 msgstr	"PGP pole seadistatud (ei saa avada %s)"
 
-#: src/lang.c:884
+#: src/lang.c:910
 msgid	"Article not signed and no public keys found"
 msgstr	"Artikkel pole allkirjastatud ja avalikke võtmeid pole"
 
-#: src/lang.c:886
+#: src/lang.c:912
 #, c-format
 msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone: "
 msgstr	"%s=välju, %s=toimeta, %s=ispell, %s=pgp, %s=menüü, %s=postita, %s=ootele: "
 
-#: src/lang.c:887
-msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%.*s]: "
-msgstr	"%s=välju, %s=toimeta, %s=ispell, %s=pgp, %s=saada [%%.*s]: "
+#: src/lang.c:913
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%s]: "
+msgstr	"%s=välju, %s=toimeta, %s=ispell, %s=pgp, %s=saada [%%s]: "
 
-#: src/lang.c:888
-msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	"%s=välju, %s=toimeta, %s=ispell, %s=pgp, %s=menüü, %s=postita, %s=ootele "
-	"[%%.*s]: "
+#: src/lang.c:914
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=välju, %s=toimeta, %s=ispell, %s=pgp, %s=menüü, %s=postita, %s=ootele [%%"
+	"s]: "
 
-#: src/lang.c:890
+#: src/lang.c:916
 #, c-format
 msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone: "
 msgstr	"%s=välju, %s=toimeta, %s=pgp, %s=menüü, %s=postita, %s=ootele: "
 
-#: src/lang.c:891
-msgid	"%s=quit, %s=edit, %s=pgp, %s=send [%%.*s]: "
-msgstr	"%s=välju, %s=toimeta, %s=pgp, %s=saada [%%.*s]: "
+#: src/lang.c:917
+#, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=send [%%s]: "
+msgstr	"%s=välju, %s=toimeta, %s=pgp, %s=saada [%%s]: "
 
-#: src/lang.c:892
-msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	"%s=välju, %s=toimeta, %s=pgp, %s=menüü, %s=postita, %s=ootele [%%.*s]: "
+#: src/lang.c:918
+#, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=välju, %s=toimeta, %s=pgp, %s=menüü, %s=postita, %s=ootele [%%s]: "
 
-#: src/lang.c:896
+#: src/lang.c:922
 #, c-format
 msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone: "
 msgstr	"%s=välju, %s=toimeta, %s=ispell, %s=menüü, %s=postita, %s=ootele: "
 
-#: src/lang.c:897
-msgid	"%s=quit, %s=edit, %s=ispell, %s=send [%%.*s]: "
-msgstr	"%s=välju, %s=toimeta, %s=ispell, %s=saada [%%.*s]: "
-
-#: src/lang.c:898
-msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	"%s=välju, %s=toimeta, %s=ispell, %s=menüü, %s=postita, %s=ootele [%%.*s]: "
+#: src/lang.c:923
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=send [%%s]: "
+msgstr	"%s=välju, %s=toimeta, %s=ispell, %s=saada [%%s]: "
 
-#: src/lang.c:900
+#: src/lang.c:924
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=välju, %s=toimeta, %s=ispell, %s=menüü, %s=postita, %s=ootele [%%s]: "
+
+#: src/lang.c:926
 #, c-format
 msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone: "
 msgstr	"%s=välju, %s=toimeta, %s=menüü, %s=postita, %s=ootele: "
 
-#: src/lang.c:901
-msgid	"%s=quit, %s=edit, %s=send [%%.*s]: "
-msgstr	"%s=välju, %s=toimeta, %s=saada [%%.*s]: "
-
-#: src/lang.c:902
-msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	"%s=välju, %s=toimeta, %s=menüü, %s=postita, %s=ootele [%%.*s]: "
-
-#: src/lang.c:908
+#: src/lang.c:927
 #, c-format
-msgid	"Environment variable %s not found. Set and retry..."
-msgstr	"Keskkonnamuutujat %s pole. Looge ja proovige uuesti..."
+msgid	"%s=quit, %s=edit, %s=send [%%s]: "
+msgstr	"%s=välju, %s=toimeta, %s=saada [%%s]: "
 
-#: src/lang.c:909
-msgid	"  -B       BBS mode. File operations limited to home directories."
-msgstr	"  -B       BBS mood. Failioperatsioonid on piiratud kodukataloogiga."
+#: src/lang.c:928
+#, c-format
+msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=välju, %s=toimeta, %s=menüü, %s=postita, %s=ootele [%%s]: "
 
-#: src/lang.c:917
+#: src/lang.c:937
 msgid	"Try cache_overview_files to speed up things.\n"
 msgstr	"Proovige asjade kiirendamiseks cache_overview_files.\n"
 
-#: src/lang.c:918
+#: src/lang.c:938
 msgid	"Tin will use local index files instead.\n"
 msgstr	"Tin kasutab hoopis kohalikke indeksfaile.\n"
 
-#: src/lang.c:919
+#: src/lang.c:939
 msgid	"Cannot find NNTP server name"
 msgstr	"Ei leia NNTP serveri nime"
 
-#: src/lang.c:920
+#: src/lang.c:940
 #, c-format
 msgid	"Connecting to %s:%d..."
 msgstr	"Loon ühendust serveriga %s:%d..."
 
-#: src/lang.c:921
+#: src/lang.c:941
 msgid	"Disconnecting from server...\n"
 msgstr	"Lõpetan ühenduse...\n"
 
-#: src/lang.c:922
+#: src/lang.c:942
 #, c-format
 msgid	"Wrong newsgroup name in response of GROUP command, %s for %s"
 msgstr	"Vigane vastus GROUP käsule, %s grupile %s"
 
-#: src/lang.c:923
+#: src/lang.c:943
 #, c-format
 msgid	"Failed to connect to NNTP server %s. Exiting..."
 msgstr	"NNTP serveriga %s ühenduse loomine ebaõnnestus. Lõpetan..."
 
-#: src/lang.c:924 src/nntplib.c:975
+#: src/lang.c:944
 msgid	"205  Closing connection"
 msgstr	"205  Sulen ühendust"
 
-#: src/lang.c:925
+#: src/lang.c:945
 msgid	"Your server does not support the NNTP XOVER or OVER command.\n"
 msgstr	"Teie server ei toeta NNTP XOVER või OVER käsku.\n"
 
-#: src/lang.c:926
+#: src/lang.c:946
 msgid	"Connection to news server has timed out. Reconnect?"
 msgstr	"Ühendus uudisegruppide serveriga aegus. ühendun uuesti?"
 
-#: src/lang.c:927
+#: src/lang.c:947
 #, c-format
 msgid	"Put the server name in the file %s,\n"
 	"or set the environment variable NNTPSERVER"
 msgstr	"Kirjutage serveri nimi faili %s,\n"
 	"või seadke keskonnamuutuja NNTPSERVER"
 
-#: src/lang.c:928
+#: src/lang.c:948
 msgid	"  -A       force authentication on connect"
 msgstr	"  -A       sunni ühenduse loomisel autentima"
 
-#: src/lang.c:929
+#: src/lang.c:949
 #, c-format
 msgid	"  -g serv  read news from NNTP server serv [default=%s]"
 msgstr	"  -g serv  loe uudiseid NNTP serverist serv [vaikimisi=%s]"
 
-#: src/lang.c:930
+#: src/lang.c:950
 #, c-format
 msgid	"  -p port  use port as NNTP port [default=%d]"
 msgstr	"  -p port  kasuta NNTP porti [vaikimisi=%d]"
 
-#: src/lang.c:931
+#: src/lang.c:951
 msgid	"  -Q       quick start. Same as -nqd"
 msgstr	"  -Q       kiirstart. Sama kui -nqd"
 
-#: src/lang.c:932
+#: src/lang.c:952
 msgid	"  -l       use only LIST instead of GROUP (-n) command"
 msgstr	"  -l       kasuta LIST käsku GROUP (-n) käsu asemel"
 
-#: src/lang.c:933
+#: src/lang.c:953
 msgid	"  -n       only read subscribed .newsrc groups from NNTP server"
 msgstr	"  -n       loe NNTP serverist ainult tellitud .newsrc grupid"
 
-#: src/lang.c:935
+#: src/lang.c:955
 #, c-format
 msgid	"%s/tcp: Unknown service.\n"
 msgstr	"%s/tcp: Tundmatu teenus.\n"
 
-#: src/lang.c:938
+#: src/lang.c:958
 msgid	"\n"
 	"socket or connect problem\n"
 msgstr	"\n"
 	"Probleem pistikuga või ühendusega\n"
 
-#: src/lang.c:940
+#: src/lang.c:960
 #, c-format
 msgid	"\n"
 	"Connection to %s: "
 msgstr	"\n"
 	"Loon ühendust serveriga %s: "
 
-#: src/lang.c:941
+#: src/lang.c:961
 msgid	"Giving up...\n"
 msgstr	"Annan alla...\n"
 
-#: src/lang.c:944
+#: src/lang.c:964
 msgid	"Your server does not have Xref: in its XOVER information.\n"
 	"Tin will try to use XHDR XREF instead (slows down things a bit).\n"
 msgstr	"Teie server ei paku Xref: päiserida XOVER informatsioonis.\n"
 	"Tin üritab kasutada XHDR XREF selle asemel (võib olla mõnevõrra "
 	"aeganõudvam).\n"
 
-#: src/lang.c:947
+#: src/lang.c:967
 msgid	"Your server does not have Xref: in its XOVER information.\n"
 msgstr	"Teie server ei paku Xref: päiserida XOVER informatsioonis.\n"
 
-#: src/lang.c:950
+#: src/lang.c:970
 #, c-format
 msgid	"Can't open %s. Try %s -r to read news via NNTP.\n"
 msgstr	"%s ei saa avada. Proovige %s -r, et lugeda uudiseid üle NNTP.\n"
 
-#: src/lang.c:953
+#: src/lang.c:973
 msgid	"  -Q       quick start. Same as -qd"
 msgstr	"  -Q       kiirstart. Sama kui -qd"
 
-#: src/lang.c:954
+#: src/lang.c:974
 msgid	"  -l       read only active file instead of scanning spool (-n) command"
 msgstr	"  -l       loe pooli skaneerimise (-n) asemel ainult faili active"
 
-#: src/lang.c:955
+#: src/lang.c:975
 msgid	"  -n       only read subscribed .newsrc groups from spool"
 msgstr	"  -n       loe poolist ainult tellitud .newsrc gruppe"
 
-#: src/lang.c:956
+#: src/lang.c:976
 msgid	"Your server does not have Xref: in its NOV-files.\n"
 msgstr	"Teie server ei paku Xref: päiserida NOV failides.\n"
 
-#: src/lang.c:960
+#: src/lang.c:980
 msgid	"Posting using external inews failed. Use built in inews instead?"
 msgstr	"Välise inews programmiga postitamine ebaõnnestus. Proovin sisemist inewsi?"
 
-#: src/lang.c:961
+#: src/lang.c:981
 msgid	"It worked! Should I always use my built in inews from now on?"
 msgstr	"See töötas! Kas kasutan nüüd alati sisemist inews programmi?"
 
-#: src/lang.c:969
+#: src/lang.c:989
 #, c-format
 msgid	"%d %s printed"
 msgstr	"%d %s trükitud"
 
-#: src/lang.c:970
+#: src/lang.c:990
 msgid	"output article/thread/hot/pattern/tagged articles to printer"
 msgstr	"saada artikkel/teema/kuum/muster/märgitud trükkalile"
 
-#: src/lang.c:971
+#: src/lang.c:991
 msgid	"Print"
 msgstr	"Trüki"
 
-#: src/lang.c:972
+#: src/lang.c:992
 msgid	"Printing..."
 msgstr	"Trükin..."
 
-#: src/lang.c:976
+#: src/lang.c:996
 msgid	"pipe article/thread/hot/pattern/tagged articles into command"
 msgstr	"saada artikkel/teema/kuum/muster/märgitud toruga käsule"
 
-#: src/lang.c:977
+#: src/lang.c:997
 msgid	"No command"
 msgstr	"Käsku pole"
 
-#: src/lang.c:978
+#: src/lang.c:998
 msgid	"Pipe"
 msgstr	"Toru"
 
-#: src/lang.c:979
+#: src/lang.c:999
 #, c-format
 msgid	"Pipe to command [%.*s]> "
 msgstr	"Toru käsku [%.*s]> "
 
-#: src/lang.c:980
+#: src/lang.c:1000
 msgid	"Piping..."
 msgstr	"Saadan torusse..."
 
-#: src/lang.c:982
+#: src/lang.c:1002
 msgid	"Piping not enabled."
 msgstr	"Toru kasutamine pole lubatud."
 
-#: src/lang.c:986
+#: src/lang.c:1006
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line has spaces  in it that MUST be removed.\n"
@@ -3743,7 +3880,7 @@ msgstr	"\n"
 	"      tühik on see,  mis eraldab koolonit (:)  teistest komponentidest\n"
 	"      real. Gruppide eraldamiseks kasutage palun koma (,).\n"
 
-#: src/lang.c:991
+#: src/lang.c:1011
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line is  continued in  the next line.  Since\n"
@@ -3754,7 +3891,7 @@ msgstr	"\n"
 	"      tühikuid, siis ei ole see lubatud.  Palun kirjutage kõik grupid\n"
 	"      ühele reale.\n"
 
-#: src/lang.c:996
+#: src/lang.c:1016
 #, c-format
 msgid	"\n"
 	"Warning: The \"%s:\" line is continued in the next line.\n"
@@ -3765,14 +3902,14 @@ msgstr	"\n"
 	"      See on uus omadus ja kõik serverid ei pruugi seda toetada.\n"
 	"      Probleemide vältimiseks, kirjutage palun kõik grupid ühele reale.\n"
 
-#: src/lang.c:1000
+#: src/lang.c:1020
 #, c-format
 msgid	"\n"
 	"Warning: The \"%s:\" line has spaces in it that SHOULD be removed.\n"
 msgstr	"\n"
 	"Hoiatus: Rida \"%s:\" sisaldab tühikuid, mis TULEKS eemaldada.\n"
 
-#: src/lang.c:1005
+#: src/lang.c:1025
 msgid	"\n"
 	"  If your article contains quoted text  please take some time to pare it "
 	"down\n"
@@ -3802,861 +3939,997 @@ msgstr	"\n"
 	"  tega, siis ilmselt enamus lugejaid ignoreerib teid täiesti. Tänapäeval on\n"
 	"  võrgus palju rahvast ja infot!\n"
 
-#: src/lang.c:1018
+#: src/lang.c:1038
 msgid	"shell escape"
 msgstr	"paojada käsureale"
 
-#: src/lang.c:1019
+#: src/lang.c:1039
 #, c-format
 msgid	"Shell Command (%s)"
 msgstr	"Käsurea käsk (%s)"
 
-#: src/lang.c:1020
+#: src/lang.c:1040
 #, c-format
 msgid	"Enter shell command [%s]> "
 msgstr	"Sisestage käsurea käsk [%s]> "
 
-#: src/lang.c:1024
+#: src/lang.c:1044
 #, c-format
 msgid	"%s: Can't get entry for TERM\n"
 msgstr	"%s: Ei saa TERM kirjet\n"
 
-#: src/lang.c:1028
+#: src/lang.c:1048
 #, c-format
 msgid	"Group %.*s ('q' to quit)..."
-msgstr	"Grupp %.*s ('q' lõpetamiseks)... "
+msgstr	"Grupp %.*s ('q' lõpetamiseks)..."
 
-#: src/lang.c:1030
+#: src/lang.c:1050
 #, c-format
 msgid	"Group %.*s..."
-msgstr	"Grupp %.*s... "
+msgstr	"Grupp %.*s..."
 
-#: src/lang.c:1034
+#: src/lang.c:1054
 msgid	"Server unavailable\n"
 msgstr	"Server ei vasta\n"
 
-#: src/lang.c:1040
+#: src/lang.c:1060
 #, c-format
-msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; "
-	"%s=post"
-msgstr	"%s=toru; %s=kiri; %s=trüki; %s=välju; %s=kõik/lugem; %s=salv; %s=märgi; "
-	"%s=postita"
+msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %"
+	"s=post"
+msgstr	"%s=toru; %s=kiri; %s=trüki; %s=välju; %s=kõik/lugem; %s=salv; %s=märgi; %"
+	"s=postita"
 
-#: src/lang.c:1041
+#: src/lang.c:1061
 #, c-format
 msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
-msgstr	"%s=toru; %s=kiri; %s=trüki; %s=välju; %s=kirjuta; %s=salv; %s=märgi; "
-	"%s=postita"
+msgstr	"%s=toru; %s=kiri; %s=trüki; %s=välju; %s=kirjuta; %s=salv; %s=märgi; %"
+	"s=postita"
 
-#: src/lang.c:1043
+#: src/lang.c:1063
 #, c-format
 msgid	"%s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
 msgstr	"%s=kiri; %s=trüki; %s=välju; %s=kõik/lugem; %s=salvesta; %s=märgi; %s=postita"
 
-#: src/lang.c:1044
+#: src/lang.c:1064
 #, c-format
 msgid	"%s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr	"%s=kiri; %s=trüki; %s=välju; %s=kirjuta; %s=salvesta; %s=märgi; %s=postita"
 
-#: src/lang.c:1048
+#: src/lang.c:1068
 #, c-format
 msgid	"%s=pipe; %s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
 msgstr	"%s=toru; %s=kiri; %s=välju; %s=kõik/lugemata; %s=salv; %s=märgi; %s=postita"
 
-#: src/lang.c:1049
+#: src/lang.c:1069
 #, c-format
 msgid	"%s=pipe; %s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr	"%s=toru; %s=kiri; %s=välju; %s=kirjuta; %s=salvesta; %s=märgi; %s=postita"
 
-#: src/lang.c:1051
+#: src/lang.c:1071
 #, c-format
 msgid	"%s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
 msgstr	"%s=kiri; %s=välju; %s=kõik/lugemata; %s=salvesta; %s=märgi; %s=postita"
 
-#: src/lang.c:1052
+#: src/lang.c:1072
 #, c-format
 msgid	"%s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr	"%s=kiri; %s=välju; %s=vasta kirjaga; %s=salvesta; %s=märgi; %s=postita"
 
-#: src/lang.c:1058
+#: src/lang.c:1078
 msgid	"Terminal does not support color"
 msgstr	"Terminal ei toeta värve"
 
-#: src/lang.c:1063
+#: src/lang.c:1083
 #, c-format
 msgid	"Trying %s"
 msgstr	"Proovin %s"
 
-#: src/lang.c:1077 src/lang.c:1102 src/lang.c:1118 src/refs.c:266
+#: src/lang.c:1097 src/lang.c:1123 src/lang.c:1139 src/lang.c:1318 src/refs.c:296
 msgid	"None"
 msgstr	"Pole"
 
-#: src/lang.c:1078
+#: src/lang.c:1098
 msgid	"Subject"
 msgstr	"Teema"
 
-#: src/lang.c:1079
+#: src/lang.c:1099
 msgid	"References"
 msgstr	"Viited"
 
-#: src/lang.c:1080
+#: src/lang.c:1100
 msgid	"Both Subject and References"
 msgstr	"Nii teema kui viited"
 
-#: src/lang.c:1081
+#: src/lang.c:1101
 msgid	"Multipart Subject"
 msgstr	"Mitmeosaliste teema"
 
-#: src/lang.c:1093 src/lang.c:1204
+#: src/lang.c:1102
+msgid	"Percentage Match"
+msgstr	"Percentage Match"
+
+#: src/lang.c:1114 src/lang.c:1225
 msgid	"No"
 msgstr	"Ei"
 
-#: src/lang.c:1094 src/lang.c:1206
+#: src/lang.c:1115 src/lang.c:1227
 msgid	"Yes"
 msgstr	"Jah"
 
-#: src/lang.c:1095
+#: src/lang.c:1116
 msgid	"Hide All"
 msgstr	"Peida kõik"
 
-#: src/lang.c:1103
+#: src/lang.c:1124
 msgid	"Address"
 msgstr	"Aadress"
 
-#: src/lang.c:1104
+#: src/lang.c:1125
 msgid	"Full Name"
 msgstr	"Täisnimi"
 
-#: src/lang.c:1105
+#: src/lang.c:1126
 msgid	"Address and Name"
 msgstr	"Aadress ja nimi"
 
-#: src/lang.c:1112
+#: src/lang.c:1133
 msgid	"Max"
 msgstr	"Maksimum"
 
-#: src/lang.c:1113
+#: src/lang.c:1134
 msgid	"Sum"
 msgstr	"Summa"
 
-#: src/lang.c:1114
+#: src/lang.c:1135
 msgid	"Average"
 msgstr	"Keskmine"
 
-#: src/lang.c:1119
+#: src/lang.c:1140
 msgid	"Lines"
 msgstr	"Read"
 
-#: src/lang.c:1120
+#: src/lang.c:1141
 msgid	"Score"
 msgstr	"Kaal"
 
-#: src/lang.c:1121
+#: src/lang.c:1142
 msgid	"Lines & Score"
 msgstr	"Read & kaal"
 
-#: src/lang.c:1130
+#: src/lang.c:1151
 msgid	"Black"
 msgstr	"Must"
 
-#: src/lang.c:1131
+#: src/lang.c:1152
 msgid	"Red"
 msgstr	"Punane"
 
-#: src/lang.c:1132
+#: src/lang.c:1153
 msgid	"Green"
 msgstr	"Roheline"
 
-#: src/lang.c:1133
+#: src/lang.c:1154
 msgid	"Brown"
 msgstr	"Pruun"
 
-#: src/lang.c:1134
+#: src/lang.c:1155
 msgid	"Blue"
 msgstr	"Sinine"
 
-#: src/lang.c:1135
+#: src/lang.c:1156
 msgid	"Pink"
 msgstr	"Roosa"
 
-#: src/lang.c:1136
+#: src/lang.c:1157
 msgid	"Cyan"
 msgstr	"Lilla"
 
-#: src/lang.c:1137
+#: src/lang.c:1158
 msgid	"White"
 msgstr	"valge"
 
-#: src/lang.c:1138
+#: src/lang.c:1159
 msgid	"Gray"
 msgstr	"Hall"
 
-#: src/lang.c:1139
+#: src/lang.c:1160
 msgid	"Light Red"
 msgstr	"Helepunane"
 
-#: src/lang.c:1140
+#: src/lang.c:1161
 msgid	"Light Green"
 msgstr	"Heleroheline"
 
-#: src/lang.c:1141
+#: src/lang.c:1162
 msgid	"Yellow"
 msgstr	"Kollane"
 
-#: src/lang.c:1142
+#: src/lang.c:1163
 msgid	"Light Blue"
 msgstr	"Helesinine"
 
-#: src/lang.c:1143
+#: src/lang.c:1164
 msgid	"Light Pink"
 msgstr	"Heleroosa"
 
-#: src/lang.c:1144
+#: src/lang.c:1165
 msgid	"Light Cyan"
 msgstr	"Helelilla"
 
-#: src/lang.c:1145
+#: src/lang.c:1166
 msgid	"Light White"
 msgstr	"Helevalge"
 
-#: src/lang.c:1153 src/lang.c:1210 src/lang.c:1224
+#: src/lang.c:1174 src/lang.c:1231 src/lang.c:1245
 msgid	"Nothing"
 msgstr	"Ei kasuta"
 
-#: src/lang.c:1154
+#: src/lang.c:1175
 msgid	"Mark"
 msgstr	"Märk"
 
-#: src/lang.c:1155
+#: src/lang.c:1176
 msgid	"Space"
 msgstr	"Tühik"
 
-#: src/lang.c:1162
+#: src/lang.c:1183
 msgid	"Normal"
 msgstr	"Tavaline"
 
-#: src/lang.c:1163
+#: src/lang.c:1184
 msgid	"Best highlighting"
 msgstr	"Parim esiletõstmine"
 
-#: src/lang.c:1164
+#: src/lang.c:1185
 msgid	"Underline"
 msgstr	"Allajoonitud"
 
-#: src/lang.c:1165
+#: src/lang.c:1186
 msgid	"Reverse video"
 msgstr	"Pööratud video"
 
-#: src/lang.c:1166
+#: src/lang.c:1187
 msgid	"Blinking"
 msgstr	"Plinkiv"
 
-#: src/lang.c:1167
+#: src/lang.c:1188
 msgid	"Half bright"
 msgstr	"Poolhele"
 
-#: src/lang.c:1168
+#: src/lang.c:1189
 msgid	"Bold"
 msgstr	"Paks"
 
-#: src/lang.c:1173
+#: src/lang.c:1194
 msgid	"none"
 msgstr	"pole"
 
-#: src/lang.c:1174
+#: src/lang.c:1195
 msgid	"commands"
 msgstr	"käsud"
 
-#: src/lang.c:1175
+#: src/lang.c:1196
 msgid	"select"
 msgstr	"valik"
 
-#: src/lang.c:1177
+#: src/lang.c:1198
 msgid	"commands & quit"
 msgstr	"käsud & välju"
 
-#: src/lang.c:1178
+#: src/lang.c:1199
 msgid	"commands & select"
 msgstr	"käsud & valik"
 
-#: src/lang.c:1179
+#: src/lang.c:1200
 msgid	"quit & select"
 msgstr	"välju & valik"
 
-#: src/lang.c:1180
+#: src/lang.c:1201
 msgid	"commands & quit & select"
 msgstr	"käsud & välju & valik"
 
-#: src/lang.c:1205
+#: src/lang.c:1226
 msgid	"Shell archive"
 msgstr	"Shelli arhiiv"
 
-#: src/lang.c:1211
+#: src/lang.c:1232
 msgid	"Subject: (descending)"
 msgstr	"Subject: (kahanevalt)"
 
-#: src/lang.c:1212
+#: src/lang.c:1233
 msgid	"Subject: (ascending)"
 msgstr	"Subject: (kasvavalt)"
 
-#: src/lang.c:1213
+#: src/lang.c:1234
 msgid	"From: (descending)"
 msgstr	"From: (kahanevalt)"
 
-#: src/lang.c:1214
+#: src/lang.c:1235
 msgid	"From: (ascending)"
 msgstr	"From: (kasvavalt)"
 
-#: src/lang.c:1215
+#: src/lang.c:1236
 msgid	"Date: (descending)"
 msgstr	"Date: (kahanevalt)"
 
-#: src/lang.c:1216
+#: src/lang.c:1237
 msgid	"Date: (ascending)"
 msgstr	"Date: (kasvavalt)"
 
-#: src/lang.c:1217 src/lang.c:1225
+#: src/lang.c:1238 src/lang.c:1246
 msgid	"Score (descending)"
 msgstr	"Kaal (kahanevalt)"
 
-#: src/lang.c:1218 src/lang.c:1226
+#: src/lang.c:1239 src/lang.c:1247
 msgid	"Score (ascending)"
 msgstr	"Kaal (kasvavalt)"
 
-#: src/lang.c:1219
+#: src/lang.c:1240
 msgid	"Lines: (descending)"
 msgstr	"Lines: (kahanevalt)"
 
-#: src/lang.c:1220
+#: src/lang.c:1241
 msgid	"Lines: (ascending)"
 msgstr	"Lines: (kasvavalt)"
 
-#: src/lang.c:1231
+#: src/lang.c:1252
 msgid	"Always Keep"
 msgstr	"Hoia alati"
 
-#: src/lang.c:1232
+#: src/lang.c:1253
 msgid	"Always Remove"
 msgstr	"Eemalda alati"
 
-#: src/lang.c:1233
+#: src/lang.c:1254
 msgid	"Mark with D on selection screen"
 msgstr	"Märgi valikuekraanil tähega D"
 
-#: src/lang.c:1238
+#: src/lang.c:1259
 msgid	"Kill only unread arts"
 msgstr	"Surma ainult lugemata artiklid"
 
-#: src/lang.c:1239
+#: src/lang.c:1260
 msgid	"Kill all arts & show with K"
 msgstr	"Surma kõik artiklid & näita K tähega"
 
 #. TODO: s/K/art_marked_killed/
-#: src/lang.c:1240
+#: src/lang.c:1261
 msgid	"Kill all arts and never show"
 msgstr	"Surma kõik artiklid ja ära näita"
 
-#: src/lang.c:1245
+#: src/lang.c:1266
 msgid	"Nothing special"
 msgstr	"Ei midagi erilist"
 
-#: src/lang.c:1246
+#: src/lang.c:1267
 msgid	"Compress quotes"
 msgstr	"Tihenda tsitaadid"
 
-#: src/lang.c:1247
+#: src/lang.c:1268
 msgid	"Quote signatures"
 msgstr	"Tsiteeri allkirju"
 
-#: src/lang.c:1248
+#: src/lang.c:1269
 msgid	"Compress quotes, quote sigs"
 msgstr	"Tihenda tsitaadid, tsiteeri allkirju"
 
-#: src/lang.c:1249
+#: src/lang.c:1270
 msgid	"Quote empty lines"
 msgstr	"Tsiteeri tühje ridu"
 
-#: src/lang.c:1250
+#: src/lang.c:1271
 msgid	"Compress quotes, quote empty lines"
 msgstr	"Tihenda tsitaadid, tsiteeri tühje ridu"
 
-#: src/lang.c:1251
+#: src/lang.c:1272
 msgid	"Quote sigs & empty lines"
 msgstr	"Tsiteeri allkirju ja tühje ridu"
 
-#: src/lang.c:1252
+#: src/lang.c:1273
 msgid	"Comp. q., quote sigs & empty lines"
 msgstr	"Tihenda tsitaate, tsiteeri allkirju ja tühje ridu"
 
-#: src/lang.c:1290
+#: src/lang.c:1311
+msgid	"no"
+msgstr	"ei"
+
+#: src/lang.c:1312
+msgid	"with headers"
+msgstr	"päistega"
+
+#: src/lang.c:1313
+msgid	"without headers"
+msgstr	"päisteta"
+
+#: src/lang.c:1320 src/lang.c:1326
+msgid	"NFKC"
+msgstr	"NFKC"
+
+#: src/lang.c:1321
+msgid	"NFKD"
+msgstr	"NFKD"
+
+#: src/lang.c:1322
+msgid	"NFC"
+msgstr	"NFC"
+
+#: src/lang.c:1323
+msgid	"NFD"
+msgstr	"NFD"
+
+#: src/lang.c:1334
 msgid	"Display Options"
 msgstr	"Ekraani seaded"
 
-#: src/lang.c:1296
+#: src/lang.c:1341
 msgid	"Color Options"
 msgstr	"Värvide seaded"
 
-#: src/lang.c:1302
+#: src/lang.c:1348
 msgid	"Article-Limiting Options"
 msgstr	"Artikli piirangute seaded"
 
-#: src/lang.c:1308
+#: src/lang.c:1354
 msgid	"Posting/Mailing Options"
 msgstr	"Postitamise/saatmise seaded"
 
-#: src/lang.c:1314
+#: src/lang.c:1360
 msgid	"Saving/Printing Options"
 msgstr	"Salvestamise/trükkimise seaded"
 
-#: src/lang.c:1320
+#: src/lang.c:1366
 msgid	"Expert Options"
 msgstr	"Ekspertseaded"
 
-#: src/lang.c:1326
+#: src/lang.c:1372
 msgid	"Filtering Options"
 msgstr	"Filtreerimise seaded"
 
-#: src/lang.c:1331 src/lang.c:1357 src/lang.c:1363 src/lang.c:1370 src/lang.c:1402
-#: src/lang.c:1408 src/lang.c:1416 src/lang.c:1436 src/lang.c:1511 src/lang.c:1673
-#: src/lang.c:1679 src/lang.c:1685 src/lang.c:1691 src/lang.c:1703 src/lang.c:1710
-#: src/lang.c:1761 src/lang.c:1770 src/lang.c:1776 src/lang.c:1782 src/lang.c:1788
-#: src/lang.c:1794 src/lang.c:1800 src/lang.c:1806 src/lang.c:1812 src/lang.c:1818
-#: src/lang.c:1824 src/lang.c:1830 src/lang.c:1836 src/lang.c:1842 src/lang.c:1848
-#: src/lang.c:1854 src/lang.c:1860 src/lang.c:1866 src/lang.c:1872 src/lang.c:1878
-#: src/lang.c:1884 src/lang.c:1891 src/lang.c:1897 src/lang.c:1903 src/lang.c:1910
-#: src/lang.c:1921 src/lang.c:1927 src/lang.c:1933 src/lang.c:1939 src/lang.c:1945
-#: src/lang.c:1959 src/lang.c:1971 src/lang.c:2005 src/lang.c:2057 src/lang.c:2064
-#: src/lang.c:2070 src/lang.c:2095 src/lang.c:2112 src/lang.c:2165 src/lang.c:2198
-#: src/lang.c:2218 src/lang.c:2253 src/lang.c:2261 src/lang.c:2286 src/lang.c:2298
+#: src/lang.c:1377 src/lang.c:1408 src/lang.c:1414 src/lang.c:1440 src/lang.c:1490
+#: src/lang.c:1496 src/lang.c:1506 src/lang.c:1526 src/lang.c:1601 src/lang.c:1771
+#: src/lang.c:1777 src/lang.c:1783 src/lang.c:1789 src/lang.c:1801 src/lang.c:1808
+#: src/lang.c:1862 src/lang.c:1871 src/lang.c:1877 src/lang.c:1884 src/lang.c:1891
+#: src/lang.c:1898 src/lang.c:1905 src/lang.c:1912 src/lang.c:1919 src/lang.c:1926
+#: src/lang.c:1933 src/lang.c:1940 src/lang.c:1947 src/lang.c:1954 src/lang.c:1961
+#: src/lang.c:1968 src/lang.c:1975 src/lang.c:1982 src/lang.c:1989 src/lang.c:1996
+#: src/lang.c:2003 src/lang.c:2010 src/lang.c:2017 src/lang.c:2024 src/lang.c:2031
+#: src/lang.c:2039 src/lang.c:2055 src/lang.c:2062 src/lang.c:2069 src/lang.c:2076
+#: src/lang.c:2082 src/lang.c:2088 src/lang.c:2105 src/lang.c:2117 src/lang.c:2151
+#: src/lang.c:2204 src/lang.c:2211 src/lang.c:2217 src/lang.c:2242 src/lang.c:2259
+#: src/lang.c:2312 src/lang.c:2348 src/lang.c:2368 src/lang.c:2403 src/lang.c:2413
+#: src/lang.c:2438 src/lang.c:2454 src/lang.c:2473 src/lang.c:2486
 msgid	"<SPACE> toggles, <CR> sets, <ESC> cancels."
 msgstr	"<TÜHIK> lülitab, <CR> seab, <ESC> katkestab."
 
-#: src/lang.c:1332
-msgid	"Show mini menu & posting etiquette :"
-msgstr	"Näita minimenüüd & post. etiketti  :"
+#: src/lang.c:1378
+msgid	"Show mini menu & posting etiquette"
+msgstr	"Näita minimenüüd & post. etiketti"
 
-#: src/lang.c:1333
+#: src/lang.c:1379
 msgid	"# If ON show a mini menu of useful commands at each level\n"
 	"# and posting etiquette after composing an article\n"
 msgstr	"# Kui väärtus on ON, näita enimkasutatavate käskude minimenüüd\n"
 	"# ja peale artikli kirjutamist postitamise etiketti.\n"
 
-#: src/lang.c:1338
+#: src/lang.c:1384
 msgid	"Show short description for each newsgroup. <SPACE> toggles & <CR> sets."
 msgstr	"Näita gruppide lühikirjeldusi. <TÜHIK> lülitab ja <CR> seab."
 
-#: src/lang.c:1339
-msgid	"Show description of each newsgroup :"
-msgstr	"Näita iga grupi lühikirjeldust     :"
+#: src/lang.c:1385
+msgid	"Show description of each newsgroup"
+msgstr	"Näita iga grupi lühikirjeldust"
 
-#: src/lang.c:1340
+#: src/lang.c:1386
 msgid	"# If ON show group description text after newsgroup name at\n"
 	"# group selection level\n"
 msgstr	"# Kui väärtus on ON, näita gruppide tasemel iga grupi nime\n"
 	"# järel grupi lühikirjeldust\n"
 
-#: src/lang.c:1345
+#: src/lang.c:1391
 msgid	"Show Subject & From (author) fields in group menu. <SPACE> toggles & <CR> "
 	"sets."
 msgstr	"Näita grupimenüüs teema ja From (autor) välju. <TÜHIK> lülitab ja <CR> seab."
 
-#: src/lang.c:1346
-msgid	"In group menu, show author by      :"
-msgstr	"Näita grupimenüüs autorit          :"
-
-#: src/lang.c:1347
-msgid	"# Part of from field to display 0) none 1) address 2) full name 3) both\n"
-msgstr	"# Millist saatja nime osa näidata 0) mitte midagi 1) aadress 2) täisnimi\n"
-	"# 3) mõlemad\n"
+#: src/lang.c:1392
+msgid	"In group menu, show author by"
+msgstr	"Näita grupimenüüs autorit"
+
+#: src/lang.c:1393
+msgid	"# Part of from field to display\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = none\n"
+	"#   1 = address\n"
+	"# * 2 = full name\n"
+	"#   3 = both\n"
+msgstr	"# Millist saatja nime osa näidata\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"#   0 = mitte midagi\n"
+	"#   1 = aadress\n"
+	"# * 2 = täisnimi\n"
+	"#   3 = mõlemad\n"
 
-#: src/lang.c:1351
+#: src/lang.c:1402
 msgid	"Draw -> or highlighted bar for selection. <SPACE> toggles & <CR> sets."
 msgstr	"Märgi valik -> või heleda ribaga. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:1352
-msgid	"Draw -> instead of highlighted bar :"
-msgstr	"Joonista -> heleda riba asemel     :"
+#: src/lang.c:1403
+msgid	"Draw -> instead of highlighted bar"
+msgstr	"Joonista -> heleda riba asemel"
 
-#: src/lang.c:1353
+#: src/lang.c:1404
 msgid	"# If ON use -> otherwise highlighted bar for selection\n"
 msgstr	"# Kui väärtus on on, kasuta valiku märkimiseks ->, muidu riba\n"
 
-#: src/lang.c:1358
-msgid	"Use inverse video for page headers :"
-msgstr	"Kasuta päistel pööratud videot     :"
+#: src/lang.c:1409
+msgid	"Use inverse video for page headers"
+msgstr	"Kasuta päistel pööratud videot"
 
-#: src/lang.c:1359
+#: src/lang.c:1410
 msgid	"# If ON use inverse video for page headers at different levels\n"
 msgstr	"# Kui väärtus on ON, kasuta erinevatel tasemetel päiste näitamisel\n"
 	"# pööratud videot\n"
 
-#: src/lang.c:1364
-msgid	"Thread articles by                 :"
-msgstr	"Artiklite teemadesse jagamine      :"
-
-#: src/lang.c:1365
-msgid	"# Thread articles on 0=(nothing) 1=(Subject) 2=(References) 3=(Both)\n"
-	"# 4=(Multipart Subject).\n"
-msgstr	"# Jaga artiklid teemadesse 0=(ei jaga) 1=(teema järgi) 2=(viite järgi)\n"
-	"# 3=(mõlema järgi) 4=(Mitmeosaliste teema).\n"
-
-#: src/lang.c:1371
-msgid	"Score of a thread                  :"
-msgstr	"Teema kaal                         :"
+#: src/lang.c:1415
+msgid	"Thread articles by"
+msgstr	"Artiklite teemadesse jagamine"
+
+#: src/lang.c:1416
+msgid	"# Thread articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject\n"
+	"#   2 = References\n"
+	"# * 3 = Both (Subject and References)\n"
+	"#   4 = Multipart Subject\n"
+	"#   5 = Percentage Match\n"
+msgstr	"# Artiklite teemadesse jagamine\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"#   0 = ei jaga\n"
+	"#   1 = Teema\n"
+	"#   2 = Viited\n"
+	"# * 3 = Mõlemad (Teema ja Viited)\n"
+	"#   4 = Mitmeosaline teema\n"
+	"#   5 = Protsentuaalne sobivus\n"
+
+#: src/lang.c:1427
+msgid	"Enter percentage match required to thread together. <CR> sets."
+msgstr	"Sisestage teema loomiseks vajalik protsentuaalne sobivus. <CR> seab."
+
+#: src/lang.c:1428
+msgid	"Thread percentage match"
+msgstr	"Teema protsentuaalne sobivus"
 
-#: src/lang.c:1372
-msgid	"# Thread score 0=(Max) 1=(Sum) 2=(Average)\n"
-msgstr	"# Teema kaal 0=(Maksimum) 1=(Summa) 2=(Keskmine)\n"
+#: src/lang.c:1429
+#, c-format
+msgid	"# Thread percentage match...\n"
+	"# the percentage of characters in the subject of an article that must match\n"
+	"# a base article for both those articles to be considered to belong to the\n"
+	"# same thread. This option is an integer percentage, eg. 80, no decimals may\n"
+	"# follow. If 80 is used here, then 80%% of the characters must match "
+	"exactly,\n"
+	"# no insertion of a character, for the two articles to be put in the same\n"
+	"# thread. eg. 'happy' and 'harpy' would match, but 'harpie', 'happie' and\n"
+	"# 'harppy' would be threaded separately from 'happy'\n"
+msgstr	"# Teema protsentuaalne sobivus...\n"
+	"# artikli teemas olevate sõmbolite protsent, mis peab sobima baasartikliga,\n"
+	"# et nad mõlemad loetaks samasse teemasse. Väärtus on täisarv, näiteks 80.\n"
+	"# Väärtuse 80 korral peab täpselt 80%% sümbolitest sobima et artiklid ühte\n"
+	"# teemasse seotaks. Näiteks 'happy' ja 'harpy' sobiksid, aga 'harpie',\n"
+	"# 'happie' ja 'harppy' samasse teemasse 'happy'-ga ei läheks\n"
+
+#: src/lang.c:1441
+msgid	"Score of a thread"
+msgstr	"Teema kaal"
+
+#: src/lang.c:1442
+msgid	"# Thread score\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = max\n"
+	"#   1 = sum\n"
+	"#   2 = average\n"
+msgstr	"# Teema kaal\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"# * 0 = maksimum\n"
+	"#   1 = summa\n"
+	"#   2 = keskmine\n"
 
-#: src/lang.c:1376
+#: src/lang.c:1450
 msgid	"Sort articles by Subject, From, Date or Score. <SPACE> toggles & <CR> sets."
 msgstr	"Järjesta artiklid Subject, From, Date, kaalu järgi. <TÜHIK> lülitab, <CR> "
 	"seab."
 
-#: src/lang.c:1377
-msgid	"Sort articles by                   :"
-msgstr	"Artiklite järjestus                :"
+#: src/lang.c:1451
+msgid	"Sort articles by"
+msgstr	"Artiklite järjestus"
 
-#: src/lang.c:1378
-msgid	"# Sort articles by 0=(nothing) 1=(Subject descend) 2=(Subject ascend)\n"
-	"# 3=(From descend) 4=(From ascend) 5=(Date descend) 6=(Date ascend)\n"
-	"# 7=(Score descend) 8=(Score ascend) 9=(Lines descend) 10=(Lines ascend).\n"
-msgstr	"# Artiklite järjestamine 0=(ei järjesta) 1=(Teema kahanev) 2=(Teema kasvav)\n"
-	"# 3=(Saatja kahanev) 4=(Saatja kasvava) 5=(Kuup. kahanev) 6=(Kuup. kasvav)\n"
-	"# 7=(Kaal kahanev) 8=(Kaal kasvav) 9=(Ridu kahanev) 10=(Ridu kasvav).\n"
+#: src/lang.c:1452
+msgid	"# Sort articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject descending\n"
+	"#   2 = Subject ascending\n"
+	"#   3 = From descending\n"
+	"#   4 = From ascending\n"
+	"#   5 = Date descending\n"
+	"# * 6 = Date ascending\n"
+	"#   7 = Score descending\n"
+	"#   8 = Score ascending\n"
+	"#   9 = Lines descending\n"
+	"#  10 = Lines ascending\n"
+msgstr	"# Artiklite järjestamine\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"#   0 = ei järjesta\n"
+	"#   1 = Teema kahanev\n"
+	"#   2 = Teema kasvav\n"
+	"#   3 = Saatja kahanev\n"
+	"#   4 = Saatja kasvava\n"
+	"#   5 = Kuupäev kahanev\n"
+	"# * 6 = Kuupäev kasvav\n"
+	"#   7 = Kaal kahanev\n"
+	"#   8 = Kaal kasvav\n"
+	"#   9 = Ridu kahanev\n"
+	"#  10 = Ridu kasvav\n"
 
-#: src/lang.c:1384
+#: src/lang.c:1468
 msgid	"Sort threads by Nothing or Score. <SPACE> toggles & <CR> sets."
 msgstr	"Järjesta teemad mitte millegi või kaalu järgi. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:1385
-msgid	"Sort threads by                    :"
-msgstr	"Teemade järjestus                  :"
+#: src/lang.c:1469
+msgid	"Sort threads by"
+msgstr	"Teemade järjestus"
 
-#: src/lang.c:1386
-msgid	"# Sort thread by 0=(nothing) 1=(Score descend) 2=(Score ascend)\n"
-msgstr	"# Järjesta teema 0=(ei järjesta) 1=skoor kahanevalt, 2=skoor kasvavalt\n"
+#: src/lang.c:1470
+msgid	"# Sort thread by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = Score descending\n"
+	"#   2 = Score ascending\n"
+msgstr	"# Teemade järjestamine\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"#   0 = ei järjesta\n"
+	"# * 1 = Skoor kahanev\n"
+	"#   2 = Skoor kasvav\n"
 
-#: src/lang.c:1390
+#: src/lang.c:1478
 msgid	"Put cursor at first/last unread art in groups. <SPACE> toggles & <CR> sets."
 msgstr	"Vii kursor grupis esimesele/viimasele lugemata artiklile. <TÜHIK> lülitab, "
 	"<CR> seab."
 
-#: src/lang.c:1391
-msgid	"Goto first unread article in group :"
-msgstr	"Mine grupis esimesele lugemata art.:"
+#: src/lang.c:1479
+msgid	"Goto first unread article in group"
+msgstr	"Mine grupis esimesele lugemata art."
 
-#: src/lang.c:1392
+#: src/lang.c:1480
 msgid	"# If ON put cursor at first unread art in group otherwise last art\n"
 msgstr	"# Kui väärtus on ON, vii kursor grupi esimesele lugemata artiklile,\n"
 	"# muidu viimasele\n"
 
-#: src/lang.c:1396
+#: src/lang.c:1484
 msgid	"Show all articles or only unread articles. <SPACE> toggles & <CR> sets."
 msgstr	"Näita kõiki või ainult lugemata artikleid. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:1397
-msgid	"Show only unread articles          :"
-msgstr	"Näita ainult lugemata artikleid    :"
+#: src/lang.c:1485
+msgid	"Show only unread articles"
+msgstr	"Näita ainult lugemata artikleid"
 
-#: src/lang.c:1398
+#: src/lang.c:1486
 msgid	"# If ON show only new/unread articles otherwise show all.\n"
 msgstr	"# Kui väärtus on ON, näita ainult lugemata artikleid, muidu näita kõiki.\n"
 
-#: src/lang.c:1403
-msgid	"Show only groups with unread arts  :"
-msgstr	"Ainult lugemata artiklitega grupid :"
+#: src/lang.c:1491
+msgid	"Show only groups with unread arts"
+msgstr	"Ainult lugemata artiklitega grupid"
 
-#: src/lang.c:1404
+#: src/lang.c:1492
 msgid	"# If ON show only subscribed to groups that contain unread articles.\n"
 msgstr	"# Näita ainult neid tellitud gruppe, kus on lugemata artikleid.\n"
 
-#: src/lang.c:1409
-msgid	"Filter which articles              :"
-msgstr	"Filtreeri artikleid                :"
+#: src/lang.c:1497
+msgid	"Filter which articles"
+msgstr	"Filtreeri artikleid"
 
-#: src/lang.c:1410
-msgid	"# 0=(Only kill unread articles)\n"
-	"# 1=(Kill all articles and show in threads marked with K)\n"
-	"# 2=(Kill all articles and never show them).\n"
-msgstr	"# 0=(Surma ainult lugemata artiklid)\n"
-	"# 1=(Surma kõik artiklid ja näita teemades märgiga K)\n"
-	"# 2=(Surma kõik artiklid ja ära näita neid).\n"
-
-#: src/lang.c:1417
-msgid	"Tab goes to next unread article    :"
-msgstr	"Tab viib järgmisele lugemata art.  :"
+#: src/lang.c:1498
+msgid	"# Filter which articles\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = only kill unread articles\n"
+	"#   1 = kill all articles and show in threads marked with K\n"
+	"#   2 = kill all articles and never show them\n"
+msgstr	"# Artikklite filtreerimine\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"# * 0 = Surma ainult lugemata artiklid\n"
+	"#   1 = Surma kõik artiklid ja näita teemades märgiga K\n"
+	"#   2 = Surma kõik artiklid ja ära näita neid\n"
+
+#: src/lang.c:1507
+msgid	"Tab goes to next unread article"
+msgstr	"Tab viib järgmisele lugemata art."
 
-#: src/lang.c:1418
+#: src/lang.c:1508
 msgid	"# If ON the TAB command will go to next unread article at article viewer "
 	"level\n"
 msgstr	"# Kui väärtus on ON, viib Tab käsk järgmisele lugemata artiklile\n"
 
-#: src/lang.c:1422
+#: src/lang.c:1512
 msgid	"Scrolling with <SPACE> past the end of an art. jumps to the next unread one."
 msgstr	"Tühikuga artikli lõpust edasi kerimine hüppab järgmisele lugemata artiklile."
 
-#: src/lang.c:1423
-msgid	"Space goes to next unread article  :"
-msgstr	"Tühik viib järgmisele lugemata art.:"
+#: src/lang.c:1513
+msgid	"Space goes to next unread article"
+msgstr	"Tühik viib järgmisele lugemata art."
 
-#: src/lang.c:1424
+#: src/lang.c:1514
 msgid	"# If ON the SPACE command will go to next unread article at article viewer\n"
 	"# level when the end of the article is reached (rn-style pager)\n"
 msgstr	"# Kui väärtus on ON, viib artikli lõpus tühiku vajutamine\n"
 	"# järgmisele lugemata artiklile (rn stiil)\n"
 
-#: src/lang.c:1429
+#: src/lang.c:1519
 msgid	"Scrolling with <PGDN>/<DOWN> past the end of an art. jumps to the unread one."
 msgstr	"<PGDN>/noolega art. lõpust edasi kerimine hüppab järgmisele lugemata art."
 
-#: src/lang.c:1430
-msgid	"PgDn goes to next unread article   :"
-msgstr	"PgDn viib järgmisele lugemata art. :"
+#: src/lang.c:1520
+msgid	"PgDn goes to next unread article"
+msgstr	"PgDn viib järgmisele lugemata art."
 
-#: src/lang.c:1431
+#: src/lang.c:1521
 msgid	"# If ON the PGDN or DOWN command will go to next unread article when\n"
 	"# pressed at end of message\n"
 msgstr	"# Kui väärtus on ON, viib artikli lõpus PGDN või nool alla vajutamine\n"
 	"# järgmisele artiklile\n"
 
-#: src/lang.c:1437
-msgid	"List thread using right arrow key  :"
-msgstr	"Nool paremale näitab teema loendit :"
+#: src/lang.c:1527
+msgid	"List thread using right arrow key"
+msgstr	"Nool paremale näitab teema loendit"
 
-#: src/lang.c:1438
+#: src/lang.c:1528
 msgid	"# If ON automatically list thread when entering it using right arrow key.\n"
 msgstr	"# Kui väärtus on ON, näita nool paremale klahvi vajutamisel teema artikleid.\n"
 
-#: src/lang.c:1442
+#: src/lang.c:1532
 msgid	"Enter character to indicate deleted articles. <CR> sets, <ESC> cancels."
 msgstr	"Sisestage sümbol kustutatud artiklite märkimiseks. <CR> seab, <ESC> katkestab."
 
-#: src/lang.c:1443
-msgid	"Character to show deleted articles :"
-msgstr	"Kustutatud artiklite marker        :"
+#: src/lang.c:1533
+msgid	"Character to show deleted articles"
+msgstr	"Kustutatud artiklite marker"
 
-#: src/lang.c:1444
+#: src/lang.c:1534
 msgid	"# Character used to show that an art was deleted (default 'D')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Sümbol, mis tähistab kustutatud artiklit (vaikimisi 'D')\n"
 	"# _ asendatakse tühikuga ' '\n"
 
-#: src/lang.c:1449
+#: src/lang.c:1539
 msgid	"Enter character to indicate articles in a range. <CR> sets, <ESC> cancels."
 msgstr	"Sisestage sümbol, mis märgib vahemikku kuuluvaid artikleid. <CR> seab, <ESC> "
 	"katkestab."
 
-#: src/lang.c:1450
-msgid	"Character to show inrange articles :"
-msgstr	"Artiklite vahemiku marker          :"
+#: src/lang.c:1540
+msgid	"Character to show inrange articles"
+msgstr	"Artiklite vahemiku marker"
 
-#: src/lang.c:1451
+#: src/lang.c:1541
 msgid	"# Character used to show that an art is in a range (default '#')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Sümbol, mis märgib vahemikku kuuluvaid artikleid (vaikimisi '#')\n"
 	"# _ asendatakse tühikuga ' '\n"
 
-#: src/lang.c:1456
+#: src/lang.c:1546
 msgid	"Enter character to indicate that article will return. <CR> sets, <ESC> "
 	"cancels."
 msgstr	"Sisestage tagasituleva artikli marker. <CR> seab, <ESC> katkestab."
 
-#: src/lang.c:1457
-msgid	"Character to show returning arts   :"
-msgstr	"Tagasi tulnud artiklite marker     :"
+#: src/lang.c:1547
+msgid	"Character to show returning arts"
+msgstr	"Tagasi tulnud artiklite marker"
 
-#: src/lang.c:1458
+#: src/lang.c:1548
 msgid	"# Character used to show that an art will return (default '-')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Sümbol, mis näitab, et artikkel tuleb tagasi (vaikimisi '-')\n"
 	"# _ asendatakse tühikuga ' '\n"
 
-#: src/lang.c:1463
+#: src/lang.c:1553
 msgid	"Enter character to indicate selected articles. <CR> sets, <ESC> cancels."
 msgstr	"Sisestage valitud artikleid märkiv sümbol. <CR> seab, <ESC> katkestab."
 
-#: src/lang.c:1464
-msgid	"Character to show selected articles:"
-msgstr	"Valitud artiklite marker           :"
+#: src/lang.c:1554
+msgid	"Character to show selected articles"
+msgstr	"Valitud artiklite marker"
 
-#: src/lang.c:1465
+#: src/lang.c:1555
 msgid	"# Character used to show that an art was auto-selected (default '*')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Sümbol, mis näitab, et artikkel on automaatselt valitud (vaikimisi '*')\n"
 	"# _ asendatakse tühikuga ' '\n"
 
-#: src/lang.c:1470
+#: src/lang.c:1560
 msgid	"Enter character to indicate recent articles. <CR> sets, <ESC> cancels."
 msgstr	"Sisestage värskeid artikleid märkiv sümbol. <CR> seab, <ESC> katkestab."
 
-#: src/lang.c:1471
-msgid	"Character to show recent articles  :"
-msgstr	"Värskete artiklite marker          :"
+#: src/lang.c:1561
+msgid	"Character to show recent articles"
+msgstr	"Värskete artiklite marker"
 
-#: src/lang.c:1472
+#: src/lang.c:1562
 msgid	"# Character used to show that an art is recent (default 'o')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Sümbol, mis näitab, et artikkel on värske (vaikimisi 'o')\n"
 	"# _ asendatakse tühikuga ' '\n"
 
-#: src/lang.c:1477
+#: src/lang.c:1567
 msgid	"Enter character to indicate unread articles. <CR> sets, <ESC> cancels."
 msgstr	"Sisestage lugemata artikleid märkiv sümbol. <CR> seab, <ESC> katkestab."
 
-#: src/lang.c:1478
-msgid	"Character to show unread articles  :"
-msgstr	"Lugemata artiklite marker          :"
+#: src/lang.c:1568
+msgid	"Character to show unread articles"
+msgstr	"Lugemata artiklite marker"
 
-#: src/lang.c:1479
+#: src/lang.c:1569
 msgid	"# Character used to show that an art is unread (default '+')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Sümbol, mis näitab, et artikkel on lugemata (vaikimisi '+')\n"
 	"# _ asendatakse tühikuga ' '\n"
 
-#: src/lang.c:1484
+#: src/lang.c:1574
 msgid	"Enter character to indicate read articles. <CR> sets, <ESC> cancels."
 msgstr	"Sisestage loetud artikleid märkiv sümbol. <CR> seab, <ESC> katkestab."
 
-#: src/lang.c:1485
-msgid	"Character to show read articles    :"
-msgstr	"Loetud artiklite marker            :"
+#: src/lang.c:1575
+msgid	"Character to show read articles"
+msgstr	"Loetud artiklite marker"
 
-#: src/lang.c:1486
+#: src/lang.c:1576
 msgid	"# Character used to show that an art was read (default ' ')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Sümbol, mis näitab, et artikkel on loetud (vaikimisi ' ')\n"
 	"# _ asendatakse tühikuga ' '\n"
 
-#: src/lang.c:1491
+#: src/lang.c:1581
 msgid	"Enter character to indicate killed articles. <CR> sets, <ESC> cancels."
 msgstr	"Sisestage surmatud artikleid märkiv sümbol. <CR> seab, <ESC> katkestab."
 
-#: src/lang.c:1492
-msgid	"Character to show killed articles  :"
-msgstr	"Surmatud artiklite marker          :"
+#: src/lang.c:1582
+msgid	"Character to show killed articles"
+msgstr	"Surmatud artiklite marker"
 
-#: src/lang.c:1493
+#: src/lang.c:1583
 msgid	"# Character used to show that an art was killed (default 'K')\n"
 	"# kill_level must be set accordingly, _ is turned into ' '\n"
 msgstr	"# Sümbol, mis näitab, et artikkel on surmatud (vaikimisi 'K')\n"
 	"# _ asendatakse tühikuga ' '\n"
 
-#: src/lang.c:1498
+#: src/lang.c:1588
 msgid	"Enter character to indicate read selected articles. <CR> sets, <ESC> cancels."
 msgstr	"Sisestage valitud artikleid märkiv sümbol. <CR> seab, <ESC> katkestab."
 
-#: src/lang.c:1499
-msgid	"Character to show readselected arts:"
-msgstr	"Lugemiseks valitud artiklite marker:"
+#: src/lang.c:1589
+msgid	"Character to show readselected arts"
+msgstr	"Lugemiseks valitud artiklite marker"
 
-#: src/lang.c:1500
+#: src/lang.c:1590
 msgid	"# Character used to show that an art was selected before read (default ':')\n"
 	"# kill_level must be set accordingly, _ is turned into ' '\n"
 msgstr	"# Sümbol, mis näitab, et artikkel on enne lugemist valitud (vaikimisi ':')\n"
 	"# Surmamise tase peab samuti olema määratud, _ asendatakse tühikuga ' '\n"
 
-#: src/lang.c:1505
+#: src/lang.c:1595
 msgid	"Enter maximum length of newsgroup names displayed. <CR> sets."
 msgstr	"Sisestage maksimaalne näidatav grupi nime pikkus. <CR> seab."
 
-#: src/lang.c:1506
-msgid	"Max. length of group names shown   :"
-msgstr	"Maksimaalne grupinime pikkus       :"
+#: src/lang.c:1596
+msgid	"Max. length of group names shown"
+msgstr	"Maksimaalne grupinime pikkus"
 
-#: src/lang.c:1507
+#: src/lang.c:1597
 msgid	"# Maximum length of the names of newsgroups displayed\n"
 msgstr	"# Maksimaalne grupi nime pikkus, mida näidatakse ekraanil\n"
 
-#: src/lang.c:1512
-msgid	"Show lines/score in listings       :"
-msgstr	"Näita loendis artikli kaalu/ridu   :"
+#: src/lang.c:1602
+msgid	"Show lines/score in listings"
+msgstr	"Näita loendis artikli kaalu/ridu"
 
-#: src/lang.c:1513
+#: src/lang.c:1603
 msgid	"# What informations should be displayed in article/thread listing\n"
-	"# 0 = nothing, 1 = lines, 2 = score, 3 = lines & score\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = lines\n"
+	"#   2 = score\n"
+	"#   3 = lines & score\n"
 msgstr	"# Millist informatsiooni tuleks näidata artikli/teema loendis\n"
-	"# 0 = midagi, 1 = ridu, 2 = kaalu, 3 = ridu ja kaalu\n"
-
-#: src/lang.c:1518
-msgid	"0 = full page scrolling, -1 = show previous last line as first on next page, "
-	"-2 = half page"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"#   0 = mitte midagi\n"
+	"# * 1 = ridu\n"
+	"#   2 = kaalu\n"
+	"#   3 = ridu ja kaalu\n"
+
+#: src/lang.c:1612
+msgid	"0 = full page scrolling, -1 = show previous last line as first on next page, -"
+	"2 = half page"
 msgstr	"0 = kerida kogu leht, -1 = näita eelmist rida järgmise lehe esimese reana, -2 "
 	"= pool lehte"
 
-#: src/lang.c:1519
-msgid	"Number of lines to scroll in pager :"
-msgstr	"Lehitsejas keritavate ridade arv   :"
+#: src/lang.c:1613
+msgid	"Number of lines to scroll in pager"
+msgstr	"Lehitsejas keritavate ridade arv"
 
-#: src/lang.c:1520
+#: src/lang.c:1614
 msgid	"# Number of lines that cursor-up/down will scroll in article pager\n"
-	"# eg, 1+ = line-by-line, 0 = page-by-page (traditional behavior),\n"
-	"# -1 = the top/bottom line is carried over onto the next page,\n"
-	"# -2 = half-page scrolling\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#  -2 = half-page scrolling\n"
+	"#  -1 = the top/bottom line is carried over onto the next page\n"
+	"#   0 = page-by-page (traditional behavior)\n"
+	"# * 1 = line-by-line\n"
+	"#   2 or greater = scroll by 2 or more lines (only in the pager)\n"
 msgstr	"# Ridade arv, mida lehitseja kerib üles/alla\n"
-	"# nt, 1+ = rida haaval, 0 = leht haaval (tavaline käitumine),\n"
-	"# -1 = ülemine või alumine rida jäetakse järgmisele lehele\n"
-	"# -2 = poole lehe kaupa kerimine\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"#  -2 = poole lehe kaupa kerimine\n"
+	"#  -1 = ülemine või alumine rida jäetakse järgmisele lehele\n"
+	"#   0 = leht haaval (tavaline käitumine)\n"
+	"# * 1 = rida haaval\n"
+	"#   2 või suurem = keri 2 või enama rea haaval (ainult lehitsejas)\n"
 
-#: src/lang.c:1527
+#: src/lang.c:1624
 msgid	"Display signatures. <SPACE> toggles & <CR> sets."
 msgstr	"Näita signatuure, <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:1528
-msgid	"Display signatures                 :"
-msgstr	"Näita signatuure                   :"
+#: src/lang.c:1625
+msgid	"Display signatures"
+msgstr	"Näita signatuure"
 
-#: src/lang.c:1529
+#: src/lang.c:1626
 msgid	"# If OFF don't show signatures when displaying articles\n"
 msgstr	"# Kui väärtus on OFF, ei näita koos artiklitega signatuure\n"
 
-#: src/lang.c:1533
+#: src/lang.c:1630
 msgid	"Display uuencoded data as tagged attachments. <SPACE> toggles & <CR> sets."
 msgstr	"Näita uuenkodeeritud andmeid märgitud lisadena. <TÜHIK> lülitab ja <CR> seab."
 
-#: src/lang.c:1534
-msgid	"Display uue data as an attachment  :"
-msgstr	"Näita uuenk. andmeid lisadena      :"
+#: src/lang.c:1631
+msgid	"Display uue data as an attachment"
+msgstr	"Näita uuenk. andmeid lisadena"
 
-#: src/lang.c:1535
+#: src/lang.c:1632
 msgid	"# Handling of uuencoded data in the pager\n"
-	"# 0 = display raw uuencoded data\n"
-	"# 1 = uuencoded data will be condensed to a single tag line showing\n"
-	"#     size and filename, similar to how MIME attachments are displayed\n"
-	"# 2 = as for 1, but any line that looks like uuencoded data will be folded\n"
-	"#     into a tag line.\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no, display raw uuencoded data\n"
+	"#   1 = yes, uuencoded data will be condensed to a single tag line showing\n"
+	"#       size and filename, similar to how MIME attachments are displayed\n"
+	"#   2 = hide all, as for 1, but any line that looks like uuencoded data will\n"
+	"#       be folded into a tag line.\n"
 msgstr	"# uuenkodeeritud andmete käsitlemine lehitsejas\n"
-	"# 0 = näita puhast uuenkodeeritud andmeid\n"
-	"# 1 = uuenkodeeritud andmed koondatakse üheks märgitud reaks, mis näitab\n"
-	"#     mahtu ja failinime, sarnaselt nagu näidatakse MIME lisandeid\n"
-	"# 2 = nagu 1, aga iga rida, mis tundub olema uuenkodeeritud, esitatakse\n"
-	"#     märgituna.\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"# * 0 = näita puhast uuenkodeeritud andmeid\n"
+	"#   1 = uuenkodeeritud andmed koondatakse üheks märgitud reaks, mis näitab\n"
+	"#       mahtu ja failinime, sarnaselt nagu näidatakse MIME lisandeid\n"
+	"#   2 = nagu 1, aga iga rida, mis tundub olema uuenkodeeritud, esitatakse\n"
+	"#       märgituna.\n"
 
 #
-#: src/lang.c:1544
+#: src/lang.c:1642
 msgid	"Decode German style TeX umlaut codes to ISO. <SPACE> toggles & <CR> sets."
 msgstr	"Dekodeeri saksa TeX esituses tähed ISO koodideks. <TÜHIK> lülitab, <CR> seab."
 
 #
-#: src/lang.c:1545
-msgid	"Display \"a as Umlaut-a             :"
-msgstr	"Näita \"a kui Umlaut-a              :"
+#: src/lang.c:1643
+msgid	"Display \"a as Umlaut-a"
+msgstr	"Näita \"a kui Umlaut-a"
 
-#: src/lang.c:1546
+#: src/lang.c:1644
 msgid	"# If ON decode German style TeX umlaut codes to ISO and\n"
 	"# show \"a as Umlaut-a, etc.\n"
 msgstr	"# Kui väärtus on ON, teisenda saksa TeX esituses tähed ISO\n"
 	"# koodideks ja näita \"a nagu Umlaut-a, jne.\n"
 
-#: src/lang.c:1551 src/lang.c:1561
+#: src/lang.c:1649 src/lang.c:1659
 msgid	"Space separated list of header fields"
 msgstr	"Tühikuga eraldatud päised"
 
-#: src/lang.c:1552
-msgid	"Display these header fields (or *) :"
-msgstr	"Näita neid päiseid (või *)         :"
+#: src/lang.c:1650
+msgid	"Display these header fields (or *)"
+msgstr	"Näita neid päiseid (või *)"
 
-#: src/lang.c:1553
+#: src/lang.c:1651
 msgid	"# Which news headers you wish to see. If you want to see _all_ the headers,\n"
 	"# place an '*' as this value. This is the only way a wildcard can be used.\n"
 	"# If you enter 'X-' as the value, you will see all headers beginning with\n"
@@ -4671,11 +4944,11 @@ msgstr	"# Milliseid artikli päiseid te s
 	"tühikut.\n"
 	"# Kui te väärtust ei määra, lülitatakse see omadus välja.\n"
 
-#: src/lang.c:1562
-msgid	"Do not display these header fields :"
-msgstr	"Ära näita neid päiseridu           :"
+#: src/lang.c:1660
+msgid	"Do not display these header fields"
+msgstr	"Ära näita neid päiseridu"
 
-#: src/lang.c:1563
+#: src/lang.c:1661
 msgid	"# Same as 'news_headers_to_display' except it denotes the opposite.\n"
 	"# An example of using both options might be if you thought X- headers were\n"
 	"# A Good Thing(tm), but thought Alan and Pape were miscreants...well then "
@@ -4693,28 +4966,28 @@ msgstr	"# Sama kui 'news_headers_to_disp
 	"#\n"
 	"# Kui te väärtust ei määra, lülitatakse see omadus välja.\n"
 
-#: src/lang.c:1573
+#: src/lang.c:1671
 msgid	"Do you want to enable automatic handling of multipart/alternative articles?"
 msgstr	"Kas te soovite multipart/alternative artiklite automaatset käsitlemist?"
 
-#: src/lang.c:1574
-msgid	"Skip multipart/alternative parts   :"
-msgstr	"Jäta multipart/alternative osad    :"
+#: src/lang.c:1672
+msgid	"Skip multipart/alternative parts"
+msgstr	"Jäta multipart/alternative osad"
 
-#: src/lang.c:1575
+#: src/lang.c:1673
 msgid	"# If ON strip multipart/alternative messages automatically\n"
 msgstr	"# Kui väärtus on ON, loobu automaatselt multipart/alternative teadete "
 	"lisadest\n"
 
-#: src/lang.c:1580
+#: src/lang.c:1678
 msgid	"A regex used to decide which lines to show in col_quote."
 msgstr	"Regulaaravaldis otsustamaks, milliseid ridu tsitaatides näidata."
 
-#: src/lang.c:1581
-msgid	"Regex used to show quoted lines    :"
-msgstr	"Tsiteeritud ridade näitamise regex :"
+#: src/lang.c:1679
+msgid	"Regex used to show quoted lines"
+msgstr	"Tsiteeritud ridade näitamise regex"
 
-#: src/lang.c:1582
+#: src/lang.c:1680
 msgid	"# A regular expression that tin will use to decide which lines are\n"
 	"# quoted when viewing articles. Quoted lines are shown in col_quote.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4722,15 +4995,15 @@ msgstr	"# Regulaaravaldis, mida tin kasu
 	"# milliseid read on tsiteeritud. Tsiteeritud ridu näidatakse col_quote.\n"
 	"# Kui te jätate selle tühjaks, kasutab tin sisseehitatud väärtust.\n"
 
-#: src/lang.c:1588
+#: src/lang.c:1686
 msgid	"A regex used to decide which lines to show in col_quote2."
 msgstr	"Regulaaravaldis otsustamaks, milliseid ridu näidata col_quote2."
 
-#: src/lang.c:1589
-msgid	"Regex used to show twice quoted l. :"
-msgstr	"Topelt tsiteeritud ridu näitav reg :"
+#: src/lang.c:1687
+msgid	"Regex used to show twice quoted l."
+msgstr	"Topelt tsiteeritud ridu näitav reg"
 
-#: src/lang.c:1590
+#: src/lang.c:1688
 msgid	"# A regular expression that tin will use to decide which lines are\n"
 	"# quoted twice. Twice quoted lines are shown in col_quote2.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4739,15 +5012,15 @@ msgstr	"# Regulaaravaldis, mida tin kasu
 	"# näidatakse col_quote2.\n"
 	"# Kui te jätate selle tühjaks, kasutab tin sisseehitatud väärtust.\n"
 
-#: src/lang.c:1596
+#: src/lang.c:1694
 msgid	"A regex used to decide which lines to show in col_quote3."
 msgstr	"Regulaaravaldis otsustamaks, milliseid ridu näidata col_quote3."
 
-#: src/lang.c:1597
-msgid	"Regex used to show >= 3 times q.l. :"
-msgstr	">= 3 tsiteeritud ridu näitav reg   :"
+#: src/lang.c:1695
+msgid	"Regex used to show >= 3 times q.l."
+msgstr	">= 3 tsiteeritud ridu näitav reg"
 
-#: src/lang.c:1598
+#: src/lang.c:1696
 msgid	"# A regular expression that tin will use to decide which lines are\n"
 	"# quoted >=3 times. >=3 times quoted lines are shown in col_quote3.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4756,15 +5029,15 @@ msgstr	"# Regulaaravaldis, mida tin kasu
 	"# näidatakse col_quote3.\n"
 	"# Kui te jätate selle tühjaks, kasutab tin sisseehitatud väärtust.\n"
 
-#: src/lang.c:1605
+#: src/lang.c:1703
 msgid	"A regex used to decide which words to show in col_markslashes."
 msgstr	"Regex et otsustada, milliseid sõnu näidata col_markslashes abil."
 
-#: src/lang.c:1606
-msgid	"Regex used to highlight /slashes/  :"
-msgstr	"Regex et esile tõsta /kaldkriipse/ :"
+#: src/lang.c:1704
+msgid	"Regex used to highlight /slashes/"
+msgstr	"Regex et esile tõsta /kaldkriipse/"
 
-#: src/lang.c:1607
+#: src/lang.c:1705
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '/' are to be shown in col_markslashes.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4772,15 +5045,15 @@ msgstr	"# Regulaaravaldis mida tin kasut
 	"# sõnu näidata col_markslashes abil. Kui jätate selle tühjaks, kasutab\n"
 	"# tin sisse ehitatud vaikeväärtust.\n"
 
-#: src/lang.c:1613
+#: src/lang.c:1711
 msgid	"A regex used to decide which words to show in col_markstars."
 msgstr	"Regex et otsustada, milliseid sõnu näidata col_markstars abil."
 
-#: src/lang.c:1614
-msgid	"Regex used to highlight *stars*    :"
-msgstr	"Regex et esile tõsta *tärne*       :"
+#: src/lang.c:1712
+msgid	"Regex used to highlight *stars*"
+msgstr	"Regex et esile tõsta *tärne*"
 
-#: src/lang.c:1615
+#: src/lang.c:1713
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '*' are to be shown in col_markstars.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4788,15 +5061,15 @@ msgstr	"# Regulaaravaldis mida tin kasut
 	"# sõnu näidata col_markstars abil. Kui jätate selle tühjaks, kasutab\n"
 	"# tin sisse ehitatud vaikeväärtust.\n"
 
-#: src/lang.c:1621
+#: src/lang.c:1719
 msgid	"A regex used to decide which words to show in col_markstroke."
 msgstr	"Regex et otsustada, milliseid sõnu näidata col_markstroke abil."
 
-#: src/lang.c:1622
-msgid	"Regex used to highlight -strokes-  :"
-msgstr	"Regex et esile tõsta -kriipse-     :"
+#: src/lang.c:1720
+msgid	"Regex used to highlight -strokes-"
+msgstr	"Regex et esile tõsta -kriipse-"
 
-#: src/lang.c:1623
+#: src/lang.c:1721
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '-' are to be shown in col_markstroke.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4804,15 +5077,15 @@ msgstr	"# Regulaaravaldis mida tin kasut
 	"# sõnu näidata col_markstroke abil. Kui jätate selle tühjaks, kasutab\n"
 	"# tin sisse ehitatud vaikeväärtust.\n"
 
-#: src/lang.c:1629
+#: src/lang.c:1727
 msgid	"A regex used to decide which words to show in col_markdash."
 msgstr	"Regex et otsustada, milliseid sõnu näidata col_markdash abil."
 
-#: src/lang.c:1630
-msgid	"Regex used to highlight _underline_:"
-msgstr	"Regex et esile tõsta _alakriipse_  :"
+#: src/lang.c:1728
+msgid	"Regex used to highlight _underline_"
+msgstr	"Regex et esile tõsta _alakriipse_"
 
-#: src/lang.c:1631
+#: src/lang.c:1729
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '_' are to be shown in col_markdash.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
@@ -4820,44 +5093,44 @@ msgstr	"# Regulaaravaldis mida tin kasut
 	"# sõnu näidata col_markdash abil. Kui jätate selle tühjaks, kasutab\n"
 	"# tin sisse ehitatud vaikeväärtust.\n"
 
-#: src/lang.c:1637
+#: src/lang.c:1735
 msgid	"A regex used to find Subject prefixes to remove.  Use '|' as separator."
 msgstr	"Regulaaravaldis eemaldatava teema prefiksi leidmiseks. Eraldajaks on '|'."
 
-#: src/lang.c:1638
-msgid	"Regex with Subject prefixes        :"
-msgstr	"Regex teema prefiksi leidmiseks    :"
+#: src/lang.c:1736
+msgid	"Regex with Subject prefixes"
+msgstr	"Regex teema prefiksi leidmiseks"
 
-#: src/lang.c:1639
+#: src/lang.c:1737
 msgid	"# A regular expression that tin will use to find Subject prefixes\n"
 	"# which will be removed before showing the header.\n"
 msgstr	"# Regulaaravaldis, mida tin kasutab, et leida teema prefiksit, mida\n"
 	"# enne päise näitamist eemaldada.\n"
 
-#: src/lang.c:1644
+#: src/lang.c:1742
 msgid	"A regex used to find Subject suffixes to remove.  Use '|' as separator."
 msgstr	"Regulaaravaldis eemaldatava teema sufiksi leidmiseks. Eraldajaks on '|'."
 
-#: src/lang.c:1645
-msgid	"Regex with Subject suffixes        :"
-msgstr	"Regex teema sufiksi leidmiseks     :"
+#: src/lang.c:1743
+msgid	"Regex with Subject suffixes"
+msgstr	"Regex teema sufiksi leidmiseks"
 
-#: src/lang.c:1646
+#: src/lang.c:1744
 msgid	"# A regular expression that tin will use to find Subject suffixes\n"
 	"# which will be removed when replying or posting followup.\n"
 msgstr	"# Regulaaravaldis, mida tin kasutab teema sufiksi leidmiseks,\n"
 	"# mis eemaldatakse vastuse saatmisel või postitamisel.\n"
 
-#: src/lang.c:1651
+#: src/lang.c:1749
 msgid	"Enter name and options for external MIME viewer, --internal for built-in "
 	"viewer"
 msgstr	"Sisestage välise MIME lehitseja nimi ja võtmed, sisemise valib --internal"
 
-#: src/lang.c:1652
-msgid	"MIME binary content viewer         :"
-msgstr	"MIME kahendsisu lehitseja          :"
+#: src/lang.c:1750
+msgid	"MIME binary content viewer"
+msgstr	"MIME kahendsisu lehitseja"
 
-#: src/lang.c:1653
+#: src/lang.c:1751
 msgid	"# If --internal automatically use the built in MIME viewer for non-text\n"
 	"# parts of articles.\n"
 	"# Otherwise specify an external viewer program (eg, metamail) or leave blank\n"
@@ -4867,466 +5140,574 @@ msgstr	"# --internal korral kasuta artik
 	"# Muidu määra automaatseks vaatamiseks väline programm (nt. metamail) või\n"
 	"# jäta tühjaks\n"
 
-#: src/lang.c:1660
+#: src/lang.c:1758
 msgid	"Confirm before starting non-text viewing program"
 msgstr	"Küsi enne mitte-tekstiliste osade vaatamist kinnitust"
 
-#: src/lang.c:1661
-msgid	"Ask before using MIME viewer       :"
-msgstr	"Küsi MIME lehitseja kasutamise luba:"
+#: src/lang.c:1759
+msgid	"Ask before using MIME viewer"
+msgstr	"Küsi MIME lehitseja kasutamise luba"
 
-#: src/lang.c:1662
+#: src/lang.c:1760
 msgid	"# If ON tin will ask before using metamail to display MIME messages\n"
 	"# this only happens if metamail_prog is set to something\n"
 msgstr	"# Kui väärtus on ON, küsi metamaili kasutamise luba\n"
 	"# see juhtub ainult siis, kui metamail_prog on väärtustatud\n"
 
-#: src/lang.c:1667
+#: src/lang.c:1765
 msgid	"Ask to mark groups read when quitting. <SPACE> toggles & <CR> sets."
 msgstr	"Küsi, kas märkida väljumisel grupid loetuks. <TÜHIK> lülitab ja <CR> seab."
 
-#: src/lang.c:1668
-msgid	"Catchup read groups when quitting  :"
-msgstr	"Väljumisel märkida grupid loetuks  :"
+#: src/lang.c:1766
+msgid	"Catchup read groups when quitting"
+msgstr	"Väljumisel märkida grupid loetuks"
 
-#: src/lang.c:1669
+#: src/lang.c:1767
 msgid	"# If ON ask user if read groups should all be marked read\n"
 msgstr	"# Kui väärtus on ON, küsi kasutajalt, kas märkida loetud gruppides kõik\n"
 	"# artiklid loetuks\n"
 
-#: src/lang.c:1674
-msgid	"Catchup group using left key       :"
-msgstr	"Nool vasakule märgib grupi loetuks :"
+#: src/lang.c:1772
+msgid	"Catchup group using left key"
+msgstr	"Nool vasakule märgib grupi loetuks"
 
-#: src/lang.c:1675
+#: src/lang.c:1773
 msgid	"# If ON catchup group/thread when leaving with the left arrow key.\n"
 msgstr	"# Kui väärtus on ON, märgi grupp/teema loetuks, kui sellest väljutakse\n"
 	"# nool vasakule klahviga.\n"
 
-#: src/lang.c:1680
-msgid	"Catchup thread by using left key   :"
-msgstr	"Nool vasakule märgib teema loetuks :"
+#: src/lang.c:1778
+msgid	"Catchup thread by using left key"
+msgstr	"Nool vasakule märgib teema loetuks"
 
-# TRANSLATION TOO LONG
-#: src/lang.c:1686
-msgid	"Which actions require confirmation :"
-msgstr	"Millised tegevused nõuavad kinnitust:"
+#: src/lang.c:1784
+msgid	"Which actions require confirmation"
+msgstr	"Tegevused mis nõuavad kinnitust"
 
-#: src/lang.c:1687
+#: src/lang.c:1785
 msgid	"# What should we ask confirmation for.\n"
 msgstr	"# Millele me peaksime küsima kinnitust.\n"
 
-# TRANSLATION MISSING
-#: src/lang.c:1692
-msgid	"'Mark article read' ignores tags   :"
-msgstr	""
+#: src/lang.c:1790
+msgid	"'Mark article read' ignores tags"
+msgstr	"'Märgi art. loetuks' eirab märke"
 
-#: src/lang.c:1693
+#: src/lang.c:1791
 msgid	"# If ON the 'Mark article read' function marks only the current article.\n"
-msgstr	""
+msgstr	"# Kui väärtus on ON märgib 'Märgi artikkel loetuks' funktsioon ainult\n"
+	"# jooksva artikli.\n"
 
-#: src/lang.c:1697
+#: src/lang.c:1795
 msgid	"Program to run to open URL's, <CR> sets, <ESC> cancels."
 msgstr	"Programm URLide avamiseks, <CR> seab, <ESC> katkestab."
 
-#: src/lang.c:1698
-msgid	"Program that opens URL's           :"
-msgstr	"Programm URLide avamiseks          :"
+#: src/lang.c:1796
+msgid	"Program that opens URL's"
+msgstr	"Programm URLide avamiseks"
 
-#: src/lang.c:1699
+#: src/lang.c:1797
 msgid	"# The program used to open URL's. The actual URL will be appended\n"
 msgstr	"# Programm URLide avamiseks. URL lisatakse argumendiks\n"
 
-#: src/lang.c:1704
-msgid	"Use mouse in xterm                 :"
-msgstr	"Kasuta xterm aknas hiirt           :"
+#: src/lang.c:1802
+msgid	"Use mouse in xterm"
+msgstr	"Kasuta xterm aknas hiirt"
 
-#: src/lang.c:1705
+#: src/lang.c:1803
 msgid	"# If ON enable mouse key support on xterm terminals\n"
 msgstr	"# Kui väärtus on ON, luba xterm aknas hiire tugi\n"
 
-#: src/lang.c:1711
-msgid	"Use scroll keys on keypad          :"
-msgstr	"Kasuta kerimisnuppe                :"
+#: src/lang.c:1809
+msgid	"Use scroll keys on keypad"
+msgstr	"Kasuta kerimisnuppe"
 
-#: src/lang.c:1712
+#: src/lang.c:1810
 msgid	"# If ON enable scroll keys on terminals that support it\n"
 msgstr	"# Kui väärtus on ON, luba kerimisnuppude kasutamist terminalidel, millel need "
 	"on olemas\n"
 
-#: src/lang.c:1717
+#: src/lang.c:1815
 msgid	"Enter maximum number of article to get. <CR> sets."
 msgstr	"Sisestage suurim laetavate artiklite arv. <CR> seab."
 
-#: src/lang.c:1718
-msgid	"Number of articles to get          :"
-msgstr	"Laetavate artiklite arv            :"
+#: src/lang.c:1816
+msgid	"Number of articles to get"
+msgstr	"Laetavate artiklite arv"
 
-#: src/lang.c:1719
+#: src/lang.c:1817
 msgid	"# Number of articles to get (0=no limit), if negative sets maximum number\n"
 	"# of already read articles to be read before first unread one\n"
 msgstr	"# Laetavate artiklite arv (0=limiit puudub), negatiivne väärtus seab\n"
 	"# maksimaalse arvu loetud artikleid, mida lugeda enne lugemata artiklit\n"
 
-#: src/lang.c:1724
+#: src/lang.c:1822
 msgid	"Enter number of days article is considered recent. <CR> sets."
 msgstr	"Sisestage artikli värskuse kestus. <CR> seab."
 
-#: src/lang.c:1725
-msgid	"Article recentness time limit      :"
-msgstr	"Artikli värskuse ajapiir           :"
+#: src/lang.c:1823
+msgid	"Article recentness time limit"
+msgstr	"Artikli värskuse ajapiir"
 
-#: src/lang.c:1726
+#: src/lang.c:1824
 msgid	"# Number of days in which article is considered recent, (0=OFF)\n"
 msgstr	"# Päevad, mille jooksul loetakse artiklit värskeks, (0=OFF)\n"
 
-#: src/lang.c:1730
+#: src/lang.c:1828
 msgid	"WILDMAT for normal wildcards, REGEX for full regular expression matching."
 msgstr	"WILDMAT tavalistele jokkeritele, REGEX täisregulaaravaldistega otsimisele."
 
-#: src/lang.c:1731
-msgid	"Wildcard matching                  :"
-msgstr	"Jokkeritega otsimine               :"
-
-#: src/lang.c:1732
-msgid	"# Wildcard matching 0=(wildmat) 1=(regex)\n"
-msgstr	"# Jokkeritega otsimine 0=(wildmat) 1=(regex)\n"
+#: src/lang.c:1829
+msgid	"Wildcard matching"
+msgstr	"Jokkeritega otsimine"
+
+#: src/lang.c:1830
+msgid	"# Wildcard matching\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = wildmat\n"
+	"#   1 = regex\n"
+msgstr	"# Jokkeritega otsimine\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"# * 0 = wildmat\n"
+	"#   1 = regex\n"
 
-#: src/lang.c:1736
+#: src/lang.c:1837
 msgid	"Enter minimal score before an article is marked killed. <CR> sets."
 msgstr	"Sisestage minimaalne kaal artikli surmamiseks. <CR> seab."
 
-#: src/lang.c:1737
-msgid	"Score limit (kill)                 :"
-msgstr	"Kaalu alampiir (surmamine)         :"
+#: src/lang.c:1838
+msgid	"Score limit (kill)"
+msgstr	"Kaalu alampiir (surmamine)"
 
-#: src/lang.c:1738
+#: src/lang.c:1839
 msgid	"# Score limit before an article is marked killed\n"
 msgstr	"# Kaalu alampiir, enne kui artikkel märgitakse surmatuks\n"
 
-#: src/lang.c:1742
+#: src/lang.c:1843
 msgid	"Enter default score to kill articles. <CR> sets."
 msgstr	"Sisestage vaikimisi kaal artiklite surmamiseks. <CR> seab."
 
-# TRANSLATION TOO LONG
-#: src/lang.c:1743
-msgid	"Default score to kill articles     :"
-msgstr	"Vaikimisi kaal artiklite surmamiseks:"
+#: src/lang.c:1844
+msgid	"Default score to kill articles"
+msgstr	"Artiklite surmamise vaikimisi kaal"
 
-#: src/lang.c:1744
+#: src/lang.c:1845
 msgid	"# Default score to kill articles\n"
 msgstr	"# Vaikimisi kaal artiklite surmamiseks\n"
 
-#: src/lang.c:1748
+#: src/lang.c:1849
 msgid	"Enter minimal score before an article is marked hot. <CR> sets."
 msgstr	"Sisestage minimaalne kaal, enne kui artikkel märgitakse kuumaks. <CR> seab."
 
-#: src/lang.c:1749
-msgid	"Score limit (select)               :"
-msgstr	"Kaalu alampiir (valik)             :"
+#: src/lang.c:1850
+msgid	"Score limit (select)"
+msgstr	"Kaalu alampiir (valik)"
 
-#: src/lang.c:1750
+#: src/lang.c:1851
 msgid	"# Score limit before an article is marked hot\n"
 msgstr	"# Kaalu alampiir, enne kui artikkel märgitakse muumaks\n"
 
-#: src/lang.c:1754
+#: src/lang.c:1855
 msgid	"Enter default score to select articles. <CR> sets."
 msgstr	"Sisestage vaikimisi kaal artiklite valimiseks. <CR> seab."
 
-#: src/lang.c:1755
-msgid	"Default score to select articles   :"
-msgstr	"Vaikimisi kaal artiklite valimiseks:"
+#: src/lang.c:1856
+msgid	"Default score to select articles"
+msgstr	"Vaikimisi kaal artiklite valimiseks"
 
-#: src/lang.c:1756
+#: src/lang.c:1857
 msgid	"# Default score to select articles\n"
 msgstr	"# Vaikimisi kaal artiklite valimiseks\n"
 
-# TRANSLATION TOO LONG
-#: src/lang.c:1762
-msgid	"Use slrnface to show ''X-Face:''s  :"
-msgstr	"Et näidata ''X-Face:'', kasutage slrnface:"
+#: src/lang.c:1863
+msgid	"Use slrnface to show ''X-Face:''s"
+msgstr	"''X-Face:'' näitamiseks slrnface"
 
-#: src/lang.c:1763
+#: src/lang.c:1864
 msgid	"# If ON using slrnface(1) to interpret the ''X-Face:'' header.\n"
 	"# Only useful when running in an xterm.\n"
 msgstr	"# Kui väärtus on ON, kasutan ''X-Face:'' päiste käsitlemiseks slrnface(1).\n"
 	"# Kasulik ainult xterm aknas.\n"
 
-#: src/lang.c:1771
-msgid	"Use ANSI color                     :"
-msgstr	"Kasuta ANSI värve                  :"
+#: src/lang.c:1872
+msgid	"Use ANSI color"
+msgstr	"Kasuta ANSI värve"
 
-#: src/lang.c:1772
+#: src/lang.c:1873
 msgid	"# If ON using ANSI-color\n"
 msgstr	"# Kui väärtus on ON, kasuta ANSI värve\n"
 
-#: src/lang.c:1777
-msgid	"Standard foreground color          :"
-msgstr	"Standardne esiplaani värv          :"
+#: src/lang.c:1878
+msgid	"Standard foreground color"
+msgstr	"Standardne esiplaani värv"
 
-#: src/lang.c:1778
+#: src/lang.c:1879
 msgid	"# Standard foreground color\n"
+	"# Default: -1 (default color)\n"
 msgstr	"# Standardne esiplaani värv\n"
+	"# Vaikimisi: -1 (vaikimisi värv)\n"
 
-#: src/lang.c:1783
-msgid	"Standard background color          :"
-msgstr	"Standardne tagaplaani värv         :"
+#: src/lang.c:1885
+msgid	"Standard background color"
+msgstr	"Standardne tagaplaani värv"
 
-#: src/lang.c:1784
-msgid	"# Standard-Background-Color\n"
+#: src/lang.c:1886
+msgid	"# Standard background color\n"
+	"# Default: -1 (default color)\n"
 msgstr	"# Standardne tagaplaani värv\n"
+	"# Vaikimisi: -1 (vaikimisi värv)\n"
 
-#: src/lang.c:1789
-msgid	"Color for inverse text (background):"
-msgstr	"Pööratud teksti värv (tagaplaan)   :"
+#: src/lang.c:1892
+msgid	"Color for inverse text (background)"
+msgstr	"Pööratud teksti värv (tagaplaan)"
 
-#: src/lang.c:1790
+#: src/lang.c:1893
 msgid	"# Color of background for inverse text\n"
+	"# Default: 4 (blue)\n"
 msgstr	"# Pööratud teksti tagaplaani värv\n"
+	"# Vaikimisi: 4 (sinine)\n"
 
-#: src/lang.c:1795
-msgid	"Color for inverse text (foreground):"
-msgstr	"Pööratud teksti värv (esiplaan)    :"
+#: src/lang.c:1899
+msgid	"Color for inverse text (foreground)"
+msgstr	"Pööratud teksti värv (esiplaan)"
 
-#: src/lang.c:1796
+#: src/lang.c:1900
 msgid	"# Color of foreground for inverse text\n"
+	"# Default: 7 (white)\n"
 msgstr	"# Pööratud teksti esiplaani värv\n"
+	"# Vaikimisi: 7 (valge)\n"
 
-#: src/lang.c:1801
-msgid	"Color of text lines                :"
-msgstr	"Tekstiridade värv                  :"
-
-#: src/lang.c:1802
-msgid	"# Color of text-lines\n"
+#: src/lang.c:1906
+msgid	"Color of text lines"
+msgstr	"Tekstiridade värv"
+
+#: src/lang.c:1907
+msgid	"# Color of text lines\n"
+	"# Default: -1 (default color)\n"
 msgstr	"# Tekstiridade värv\n"
+	"# Vaikimisi: -1 (vaikimisi värv)\n"
 
-#: src/lang.c:1807
-msgid	"Color of mini help menu            :"
-msgstr	"Miniabiinfo värv                   :"
+#: src/lang.c:1913
+msgid	"Color of mini help menu"
+msgstr	"Miniabiinfo värv"
 
-#: src/lang.c:1808
+#: src/lang.c:1914
 msgid	"# Color of mini help menu\n"
+	"# Default: 3 (brown)\n"
 msgstr	"# Miniabiinfo värv\n"
+	"# Vaikimisi: 3 (pruun)\n"
 
-#: src/lang.c:1813
-msgid	"Color of help text                 :"
-msgstr	"Abiinfo värv                       :"
+#: src/lang.c:1920
+msgid	"Color of help text"
+msgstr	"Abiinfo värv"
 
-#: src/lang.c:1814
+#: src/lang.c:1921
 msgid	"# Color of help pages\n"
+	"# Default: -1 (default color)\n"
 msgstr	"# Abiinfo värv\n"
+	"# Vaikimisi: -1 (vaikimisi värv)\n"
 
-#: src/lang.c:1819
-msgid	"Color of status messages           :"
-msgstr	"Olekuteadete värv                  :"
+#: src/lang.c:1927
+msgid	"Color of status messages"
+msgstr	"Olekuteadete värv"
 
-#: src/lang.c:1820
+#: src/lang.c:1928
 msgid	"# Color of messages in last line\n"
+	"# Default: 6 (cyan)\n"
 msgstr	"# Viimasel real olevate teadete värv\n"
+	"# Default: 6 (lilla)\n"
 
-#: src/lang.c:1825
-msgid	"Color of quoted lines              :"
-msgstr	"Tsitaadi värv                      :"
+#: src/lang.c:1934
+msgid	"Color of quoted lines"
+msgstr	"Tsitaadi värv"
 
-#: src/lang.c:1826
+#: src/lang.c:1935
 msgid	"# Color of quote-lines\n"
+	"# Default: 2 (green)\n"
 msgstr	"# Tsitaadi värv\n"
+	"# Vaikimisi: 2 (roheline)\n"
 
-#: src/lang.c:1831
-msgid	"Color of twice quoted line         :"
-msgstr	"Topelt tsiteeritud rea värv        :"
+#: src/lang.c:1941
+msgid	"Color of twice quoted line"
+msgstr	"Topelt tsiteeritud rea värv"
 
-#: src/lang.c:1832
+#: src/lang.c:1942
 msgid	"# Color of twice quoted lines\n"
+	"# Default: 3 (brown)\n"
 msgstr	"# Topelt tsiteeritud rea värv\n"
+	"# Vaikimisi: 3 (pruun)\n"
 
-#: src/lang.c:1837
-msgid	"Color of =>3 times quoted line     :"
-msgstr	"=>3 korda tsiteeritud rea värv     :"
+#: src/lang.c:1948
+msgid	"Color of =>3 times quoted line"
+msgstr	"=>3 korda tsiteeritud rea värv"
 
-#: src/lang.c:1838
+#: src/lang.c:1949
 msgid	"# Color of >=3 times quoted lines\n"
+	"# Default: 4 (blue)\n"
 msgstr	"# =>3 korda tsiteeritud rea värv\n"
+	"# Vaikimisi: 4 (sinine)\n"
 
-#: src/lang.c:1843
-msgid	"Color of article header lines      :"
-msgstr	"Artikli päiseridade värv           :"
+#: src/lang.c:1955
+msgid	"Color of article header lines"
+msgstr	"Artikli päiseridade värv"
 
-#: src/lang.c:1844
+#: src/lang.c:1956
 msgid	"# Color of header-lines\n"
+	"# Default: 2 (green)\n"
 msgstr	"# Päiseridade värv\n"
+	"# Vaikimisi: 2 (roheline)\n"
 
-#: src/lang.c:1849
-msgid	"Color of actual news header fields :"
-msgstr	"Artikli tegelike päiseridade värv  :"
+#: src/lang.c:1962
+msgid	"Color of actual news header fields"
+msgstr	"Artikli tegelike päiseridade värv"
 
-#: src/lang.c:1850
+#: src/lang.c:1963
 msgid	"# Color of actual news header fields\n"
+	"# Default: 9 (light red)\n"
 msgstr	"# Artikli tegelike päiseridade värv\n"
+	"# Vaikimisi: 9 (helepunane)\n"
 
-#: src/lang.c:1855
-msgid	"Color of article subject lines     :"
-msgstr	"Artikli teemarea värv              :"
+#: src/lang.c:1969
+msgid	"Color of article subject lines"
+msgstr	"Artikli teemarea värv"
 
-#: src/lang.c:1856
+#: src/lang.c:1970
 msgid	"# Color of article subject\n"
+	"# Default: 6 (cyan)\n"
 msgstr	"# Artikli teema värv\n"
+	"# Vaikimisi: 6 (lilla)\n"
 
-#: src/lang.c:1861
-msgid	"Color of response counter          :"
-msgstr	"Vastuste arvu loenduri värv        :"
+#: src/lang.c:1976
+msgid	"Color of response counter"
+msgstr	"Vastuste arvu loenduri värv"
 
-#: src/lang.c:1862
+#: src/lang.c:1977
 msgid	"# Color of response counter\n"
+	"# Default: 2 (green)\n"
 msgstr	"# Vastuste arvu loenduri värv\n"
+	"# Vaikimisi: 2 (roheline)\n"
 
-#: src/lang.c:1867
-msgid	"Color of sender (From:)            :"
-msgstr	"Saatja värv (From:)                :"
+#: src/lang.c:1983
+msgid	"Color of sender (From:)"
+msgstr	"Saatja värv (From:)"
 
-#: src/lang.c:1868
+#: src/lang.c:1984
 msgid	"# Color of sender (From:)\n"
+	"# Default: 2 (green)\n"
 msgstr	"# Saatja värv (From:)\n"
+	"# Vaikimisi: 2 (roheline)\n"
 
-#: src/lang.c:1873
-msgid	"Color of help/mail sign            :"
-msgstr	"Abiinfo/kirja teate värv           :"
+#: src/lang.c:1990
+msgid	"Color of help/mail sign"
+msgstr	"Abiinfo/kirja teate värv"
 
-#: src/lang.c:1874
+#: src/lang.c:1991
 msgid	"# Color of Help/Mail-Sign\n"
+	"# Default: 4 (blue)\n"
 msgstr	"# Abiinfo/kirja teate värv\n"
+	"# Vaikimisi: 4 (sinine)\n"
 
-#: src/lang.c:1879
-msgid	"Color of signatures                :"
-msgstr	"Signatuuri värv                    :"
+#: src/lang.c:1997
+msgid	"Color of signatures"
+msgstr	"Signatuuri värv"
 
-#: src/lang.c:1880
+#: src/lang.c:1998
 msgid	"# Color of signature\n"
+	"# Default: 4 (blue)\n"
 msgstr	"# Signatuuri värv\n"
+	"# Vaikimisi: 4 (sinine)\n"
 
-#: src/lang.c:1885
-msgid	"Color of highlighting with *stars* :"
-msgstr	"*tärnidega* esiletõstmise värv     :"
-
-#: src/lang.c:1886
-msgid	"# Color of word highlighting. There are four possibilities\n"
-	"# in articles: *stars*, /slashes/, _underdashes_ and -strokes-.\n"
-msgstr	"# Sõnade esiletõstmise värv. Artiklites saab kasutada nelja võimalust:\n"
-	"# *tärnid*, /kaldkriipsud/, _alakriipsud_ ja -kriipsud-.\n"
+#: src/lang.c:2004
+msgid	"Color of highlighted URLs"
+msgstr	"Esiletõstetud URLide värv"
+
+#: src/lang.c:2005
+msgid	"# Color of highlighted URLs\n"
+	"# Default: -1 (default color)\n"
+msgstr	"# Esiletõstetud URLide värv\n"
+	"# Vaikimisi: -1 (vaikimisi värv)\n"
+
+#: src/lang.c:2011
+msgid	"Color of highlighting with *stars*"
+msgstr	"*tärnidega* esiletõstmise värv"
+
+#: src/lang.c:2012
+msgid	"# Color of word highlighting with *stars*\n"
+	"# Default: 11 (yellow)\n"
+msgstr	"# *tärnidega* esiletõstmise värv\n"
+	"# Vaikimisi: 11 (kollane)\n"
+
+#: src/lang.c:2018
+msgid	"Color of highlighting with _dash_"
+msgstr	"_alakriipsudega_ esiletõstmise värv"
+
+#: src/lang.c:2019
+msgid	"# Color of word highlighting with _dash_\n"
+	"# Default: 13 (light pink)\n"
+msgstr	"# _alakriipsudega_ esiletõstmise värv\n"
+	"# Vaikimisi: 13 (heleroosa)\n"
+
+#: src/lang.c:2025
+msgid	"Color of highlighting with /slash/"
+msgstr	"/Kaldkriipsude/ esiletõstmise värv"
+
+#: src/lang.c:2026
+msgid	"# Color of word highlighting with /slash/\n"
+	"# Default: 14 (light cyan)\n"
+msgstr	"# /Kaldkriipsude/ esiletõstmise värv\n"
+	"# Vaikimisi: 14 (helelilla)\n"
+
+#: src/lang.c:2032
+msgid	"Color of highlighting with -stroke-"
+msgstr	"-Kriipsudega- esiletõstmise värv"
+
+#: src/lang.c:2033
+msgid	"# Color of word highlighting with -stroke-\n"
+	"# Default: 12 (light blue)\n"
+msgstr	"# -Kriipsudega- esiletõstmise värv\n"
+	"# Vaikimisi: 12 (helesinine)\n"
 
-#: src/lang.c:1892
-msgid	"Color of highlighting with _dash_  :"
-msgstr	"_alakriipsudega_ esiletõstmise värv:"
+#: src/lang.c:2040
+msgid	"Attr. of highlighting with *stars*"
+msgstr	"*tärnidega* esiletõstmise atribuut"
 
-# TRANSLATION TOO LONG
-#: src/lang.c:1898
-msgid	"Color of highlighting with /slash/ :"
-msgstr	"/Kaldkriipsudega/ esiletõstmise värv:"
-
-#: src/lang.c:1904
-msgid	"Color of highlighting with -stroke-:"
-msgstr	"-Kriipsudega- esiletõstmise värv   :"
-
-#: src/lang.c:1911
-msgid	"Attr. of highlighting with *stars* :"
-msgstr	"*tärnidega* esiletõstmise atribuut :"
-
-#: src/lang.c:1912
-msgid	"# Attribute of word highlighting on mono terminals.\n"
-	"# There are four possibilities in articles:\n"
-	"# *stars*, /slashes/, _underdashes_ and -strokes-.\n"
-	"# The possible values are:\n"
-	"# 0 - Normal, 1 - Underline, 2 - Best highlighting,\n"
-	"# 3 - Reverse video, 4 - Blinking, 5 - Half bright, 6 - Bold\n"
+#: src/lang.c:2041
+msgid	"# Attributes of word highlighting on mono terminals\n"
+	"# Possible values are:\n"
+	"#   0 = Normal\n"
+	"#   1 = Underline\n"
+	"#   2 = Best highlighting\n"
+	"#   3 = Reverse video\n"
+	"#   4 = Blinking\n"
+	"#   5 = Half bright\n"
+	"#   6 = Bold\n"
+	"\n"
+	"# Attribute of word highlighting with *stars*\n"
+	"# Default: 6 (bold)\n"
 msgstr	"# Sõnade esiletõstmise atribuut mono terminalidel.\n"
-	"# Artiklites on neli võimalust:\n"
-	"# *tärnid*, /kaldkriipsud/, _alakriipsud_ ja -kriipsud-.\n"
 	"# Võimalikud väärtused on:\n"
-	"# 0 - Tavaline, 1 - Allajoonitud, 2 - Parim esiletõstmine,\n"
-	"# 3 - Pööratud video, 4 - Plinkiv, 5 - Poolhele, 6 - Paks\n"
-
-#: src/lang.c:1922
-msgid	"Attr. of highlighting with _dash_  :"
-msgstr	"_alakriipsudega_ esiletõstmise atr.:"
-
-# TRANSLATION TOO LONG
-#: src/lang.c:1928
-msgid	"Attr. of highlighting with /slash/ :"
-msgstr	"/Kaldkriipsudega/ esiletõstmise atr.:"
+	"#   0 - Tavaline\n"
+	"#   1 - Allajoonitud\n"
+	"#   2 - Parim esiletõstmine\n"
+	"#   3 - Pööratud video\n"
+	"#   4 - Plinkiv\n"
+	"#   5 - Poolhele\n"
+	"#   6 - Paks\n"
+	"\n"
+	"# *tärnidega* esiletõstmise atribuut\n"
+	"# Vaikimisi: 6 (paks)\n"
 
-#: src/lang.c:1934
-msgid	"Attr. of highlighting with -stroke-:"
-msgstr	"-Kriipsudega- esiletõstmise atr.   :"
+#: src/lang.c:2056
+msgid	"Attr. of highlighting with _dash_"
+msgstr	"_alakriipsudega_ esiletõstmise atr."
+
+#: src/lang.c:2057
+msgid	"# Attribute of word highlighting with _dash_\n"
+	"# Default: 2 (best highlighting)\n"
+msgstr	"# _alakriipsudega_ esiletõstmise atribuut\n"
+	"# Vaikimisi: 2 (parim esiletõstmine)\n"
+
+#: src/lang.c:2063
+msgid	"Attr. of highlighting with /slash/"
+msgstr	"/Kaldkriipsude/ esiletõstmise atr."
+
+#: src/lang.c:2064
+msgid	"# Attribute of word highlighting with /slash/\n"
+	"# Default: 5 (half bright)\n"
+msgstr	"# /Kaldkriipsude/ esiletõstmise atribuut\n"
+	"# Vaikimisi: 5 (poolhele)\n"
+
+#: src/lang.c:2070
+msgid	"Attr. of highlighting with -stroke-"
+msgstr	"-Kriipsudega- esiletõstmise atr."
 
-#: src/lang.c:1940
-msgid	"Word highlighting in message body  :"
-msgstr	"Sõnade esiletõstmine teate kehas   :"
+#: src/lang.c:2071
+msgid	"# Attribute of word highlighting with -stroke-\n"
+	"# Default: 3 (reverse video)\n"
+msgstr	"# Vaikimisi: 3 (pööratud video)\n"
+
+#: src/lang.c:2077
+msgid	"URL highlighting in message body"
+msgstr	"Teate kehas URL esiletõstmine"
+
+#: src/lang.c:2078
+msgid	"# Enable URL highlighting?\n"
+msgstr	"# Luba URLide esiletõstmine?\n"
+
+#: src/lang.c:2083
+msgid	"Word highlighting in message body"
+msgstr	"Sõnade esiletõstmine teate kehas"
 
-#: src/lang.c:1941
+#: src/lang.c:2084
 msgid	"# Enable word highlighting?\n"
 msgstr	"# Lubada sõnade esiletõstmine?\n"
 
-#: src/lang.c:1946
-msgid	"What to display instead of mark    :"
-msgstr	"Mida näidata märgi asemel          :"
+#: src/lang.c:2089
+msgid	"What to display instead of mark"
+msgstr	"Mida näidata märgi asemel"
 
-#: src/lang.c:1947
+#: src/lang.c:2090
 msgid	"# Should the leading and ending stars and dashes also be displayed,\n"
 	"# even when they are highlighting marks?\n"
-	"# 0 - no    1 - yes, display mark    2 - print a space instead\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = no\n"
+	"#   1 = yes, display mark\n"
+	"# * 2 = print a space instead\n"
 msgstr	"# Kas näidata algavaid ja lõppevaid tärne ja kriipse,\n"
 	"# isegi, kui need on ka esiletõstmise märgid?\n"
-	"# 0 - ei    1 - jah, näita märki    2 - trüki hoopis tühik\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"#   0 - ei\n"
+	"#   1 - jah, näita märki\n"
+	"# * 2 - trüki hoopis tühik\n"
 
-#: src/lang.c:1953
+#: src/lang.c:2099
 msgid	"Enter column number to wrap article lines to in the pager. <CR> sets."
 msgstr	"Sisestage veerg, millelt lehitseja hakkab ridu murdma. <CR> seab."
 
-#: src/lang.c:1954
-msgid	"Page line wrap column              :"
-msgstr	"Rea murdmise veerg lehitsejas      :"
+#: src/lang.c:2100
+msgid	"Page line wrap column"
+msgstr	"Rea murdmise veerg lehitsejas"
 
-#: src/lang.c:1955
+#: src/lang.c:2101
 msgid	"# Wrap article lines at column\n"
 msgstr	"# Murra artikli read antud veerus\n"
 
-#: src/lang.c:1960
-msgid	"Wrap around threads on next unread :"
-msgstr	"Liigu lugemata art-le ümber teemade:"
+#: src/lang.c:2106
+msgid	"Wrap around threads on next unread"
+msgstr	"Liigu lugemata art-le ümber teemade"
 
-#: src/lang.c:1961
+#: src/lang.c:2107
 msgid	"# If ON wrap around threads on searching next unread article\n"
 msgstr	"# Kui väärtus on ON, liigu lugemata artiklite otsingul ümber teemade\n"
 
-#: src/lang.c:1965
+#: src/lang.c:2111
 msgid	"Enter default mail address (and fullname). <CR> sets."
 msgstr	"Sisestage oma e-posti aadress (ja oma nimi). <CR> seab."
 
-#: src/lang.c:1966
-msgid	"Mail address (and fullname)        :"
-msgstr	"E-posti aadress (ja teie nimi)     :"
+#: src/lang.c:2112
+msgid	"Mail address (and fullname)"
+msgstr	"E-posti aadress (ja teie nimi)"
 
-#: src/lang.c:1967
+#: src/lang.c:2113
 msgid	"# User's mail address (and fullname), if not username@host (fullname)\n"
 msgstr	"# Kasutaja e-posti aadress (ja nimi), kui ei ole kasutaja@host (nimi)\n"
 
-#: src/lang.c:1972
-msgid	"Show empty Followup-To in editor   :"
-msgstr	"Näita toimetis tühja Followup-To   :"
+#: src/lang.c:2118
+msgid	"Show empty Followup-To in editor"
+msgstr	"Näita toimetis tühja Followup-To"
 
-#: src/lang.c:1973
+#: src/lang.c:2119
 msgid	"# If ON show empty Followup-To header when editing an article\n"
 msgstr	"# Kui väärtus on ON, näita artikli toimetamisel tühja Followup-To rida\n"
 
-#: src/lang.c:1977
+#: src/lang.c:2123
 msgid	"Enter path/! command/--none to create your default signature. <CR> sets."
 msgstr	"Sisestage tee/! käsk/--none, et luua oma vaikimisi signatuur. <CR> seab."
 
-#: src/lang.c:1978
-msgid	"Create signature from path/command :"
-msgstr	"Signatuuri loomiseks tee/käsk      :"
+#: src/lang.c:2124
+msgid	"Create signature from path/command"
+msgstr	"Signatuuri loomiseks tee/käsk"
 
-#: src/lang.c:1979
+#: src/lang.c:2125
 msgid	"# Signature path (random sigs)/file to be used when posting/replying\n"
 	"# default_sigfile=file       appends file as signature\n"
 	"# default_sigfile=!command   executes external command to generate a "
@@ -5337,77 +5718,82 @@ msgstr	"# Postitamisel/vastamisel kasuta
 	"# default_sigfile=!käsk      käivitab käsu, mis genereerib signatuuri\n"
 	"# default_sigfile=--none     ära lisa signatuuri\n"
 
-#: src/lang.c:1986
+#: src/lang.c:2132
 msgid	"Prepend signature with \"-- \" on own line. <SPACE> toggles & <CR> sets."
 msgstr	"Signatuurile eelnevale reale \"-- \". <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:1987
-msgid	"Prepend signature with \"-- \"       :"
-msgstr	"Lisa signatuuri ette \"-- \"         :"
+#: src/lang.c:2133
+msgid	"Prepend signature with \"-- \""
+msgstr	"Lisa signatuuri ette \"-- \""
 
-#: src/lang.c:1988
+#: src/lang.c:2134
 msgid	"# If ON prepend the signature with dashes '\\n-- \\n'\n"
 msgstr	"# Kui väärtus on ON, lisa signatuuri ette '\\n-- \\n'\n"
 
-#: src/lang.c:1992
+#: src/lang.c:2138
 msgid	"Add signature when reposting articles. <SPACE> toggles & <CR> sets."
 msgstr	"Lisa artikli uuestipostitamisel signatuur. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:1993
-msgid	"Add signature when reposting       :"
-msgstr	"Lisa uuestipostitusel signatuur    :"
+#: src/lang.c:2139
+msgid	"Add signature when reposting"
+msgstr	"Lisa uuestipostitusel signatuur"
 
-#: src/lang.c:1994
+#: src/lang.c:2140
 msgid	"# If ON add signature to reposted articles\n"
 msgstr	"# Kui väärtus on ON, lisa uuestipostitatud artiklile signatuur\n"
 
-#: src/lang.c:1998
+#: src/lang.c:2144
+#, c-format
 msgid	"Enter quotation marks, %s or %S for author's initials."
 msgstr	"Sisestage tsitaadimärgid, %s või %S annab autori initsiaalid."
 
-#: src/lang.c:1999
-msgid	"Characters used as quote-marks     :"
-msgstr	"Tsiteerimise märgid                :"
+#: src/lang.c:2145
+msgid	"Characters used as quote-marks"
+msgstr	"Tsiteerimise märgid"
 
-#: src/lang.c:2000
+#: src/lang.c:2146
+#, c-format
 msgid	"# Characters used in quoting to followups and replies.\n"
 	"# '_' is replaced by ' ', %%s, %%S are replaced by author's initials.\n"
 msgstr	"# Sümbolid, mida kasutada tsiteerimisel vastustes.\n"
 	"# '_' asendatakse tühikuga ' ', %%s, %%S asendatakse autori initsiaalidega.\n"
 
-#: src/lang.c:2006
-msgid	"Quoting behavior                   :"
-msgstr	"Käitumine tsiteerimisel            :"
+#: src/lang.c:2152
+msgid	"Quoting behavior"
+msgstr	"Käitumine tsiteerimisel"
 
-#: src/lang.c:2007
+#: src/lang.c:2153
 msgid	"# How quoting should be handled when following up or replying.\n"
-	"# 0 = Nothing special\n"
-	"# 1 = Compress quotes\n"
-	"# 2 = Quote signatures\n"
-	"# 3 = Compress quotes, quote signatures\n"
-	"# 4 = Quote empty lines\n"
-	"# 5 = Compress quotes, quote empty lines\n"
-	"# 6 = Quote signatures, quote empty lines\n"
-	"# 7 = Compress quotes, quote signatures, quote empty lines\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = Nothing special\n"
+	"#   1 = Compress quotes\n"
+	"#   2 = Quote signatures\n"
+	"#   3 = Compress quotes, quote signatures\n"
+	"#   4 = Quote empty lines\n"
+	"# * 5 = Compress quotes, quote empty lines\n"
+	"#   6 = Quote signatures, quote empty lines\n"
+	"#   7 = Compress quotes, quote signatures, quote empty lines\n"
 msgstr	"# Kuidas käsitleda vastamisel tsitaate.\n"
-	"# 0 = Ei tee midagi erilist\n"
-	"# 1 = Tihenda tsitaadid\n"
-	"# 2 = Tsiteeri allkirju\n"
-	"# 3 = Tihenda tsitaadid, tsiteeri allkirju\n"
-	"# 4 = Tsiteeri tühje ridu\n"
-	"# 5 = Tihenda tsitaadid, tsiteeri tühje ridu\n"
-	"# 6 = Tsiteeri allkirju, tsiteeri tühje ridu\n"
-	"# 7 = Tihenda tsitaadid, tsiteeri allkirju, tsiteeri tühje ridu\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"#   0 = Ei tee midagi erilist\n"
+	"#   1 = Tihenda tsitaadid\n"
+	"#   2 = Tsiteeri allkirju\n"
+	"#   3 = Tihenda tsitaadid, tsiteeri allkirju\n"
+	"#   4 = Tsiteeri tühje ridu\n"
+	"# * 5 = Tihenda tsitaadid, tsiteeri tühje ridu\n"
+	"#   6 = Tsiteeri allkirju, tsiteeri tühje ridu\n"
+	"#   7 = Tihenda tsitaadid, tsiteeri allkirju, tsiteeri tühje ridu\n"
 
-#: src/lang.c:2019 src/lang.c:2027 src/lang.c:2033
+#: src/lang.c:2166 src/lang.c:2174 src/lang.c:2180
 msgid	"%A Addr %D Date %F Addr+Name %G Groupname %M Message-ID %N Name %C First Name"
 msgstr	"%A Aadr. %D Kuup. %F Aadr.+Nimi %G Grupp %M Message-ID %N Nimi %C Eesnimi"
 
-#: src/lang.c:2020
-msgid	"Quote line when following up       :"
-msgstr	"Tsiteerimise rida vastamisel       :"
+#: src/lang.c:2167
+msgid	"Quote line when following up"
+msgstr	"Tsiteerimise rida vastamisel"
 
-#: src/lang.c:2021
+#: src/lang.c:2168
+#, c-format
 msgid	"# Format of quote line when mailing/posting/following-up an article\n"
 	"# %%A Address    %%D Date   %%F Addr+Name   %%G Groupname   %%M Message-ID\n"
 	"# %%N Full Name  %%C First Name   %%I Initials\n"
@@ -5415,35 +5801,35 @@ msgstr	"# Tsiteeriva rea vorming artikli
 	"# %%A Aadress    %%D Kuup   %%F Aadr+Nimi   %%G Grupp   %%M Message-ID\n"
 	"# %%N Täielik nimi  %%C Eesnimi   %%I Initsiaalid\n"
 
-#: src/lang.c:2028
-msgid	"Quote line when cross-posting      :"
-msgstr	"Tsiteerimise rida ristpostitusel   :"
-
-#: src/lang.c:2034
-msgid	"Quote line when mailing            :"
-msgstr	"Tsiteerimise rida kirjutamisel     :"
+#: src/lang.c:2175
+msgid	"Quote line when cross-posting"
+msgstr	"Tsiteerimise rida ristpostitusel"
+
+#: src/lang.c:2181
+msgid	"Quote line when mailing"
+msgstr	"Tsiteerimise rida kirjutamisel"
 
-#: src/lang.c:2039
+#: src/lang.c:2186
 msgid	"If ON, include User-Agent: header. <SPACE> toggles & <CR> sets."
 msgstr	"Kasuta User-Agent: päiserida. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:2040
-msgid	"Insert 'User-Agent:'-header        :"
-msgstr	"Sisestage 'User-Agent:'-päis       :"
+#: src/lang.c:2187
+msgid	"Insert 'User-Agent:'-header"
+msgstr	"Sisestage 'User-Agent:'-päis"
 
-#: src/lang.c:2041
+#: src/lang.c:2188
 msgid	"# If ON include advertising User-Agent: header\n"
 msgstr	"# Kui väärtus on ON, lisa artikli päisesse User-Agent: rida\n"
 
-#: src/lang.c:2045
+#: src/lang.c:2193
 msgid	"Enter charset name for MIME (e.g. US-ASCII, ISO-8859-1, EUC-KR), <CR> to set."
 msgstr	"Sisestage MIME kooditabeli nimi (n. US-ASCII, ISO-8859-15, EUC-KR), <CR> seab."
 
-#: src/lang.c:2046
-msgid	"MM_CHARSET                         :"
-msgstr	"MM_CHARSET                         :"
+#: src/lang.c:2194
+msgid	"MM_CHARSET"
+msgstr	"MM_CHARSET"
 
-#: src/lang.c:2047
+#: src/lang.c:2195
 msgid	"# Charset supported locally which is also used for MIME header and\n"
 	"# Content-Type header.\n"
 	"# If not set, the value of the environment variable MM_CHARSET is used.\n"
@@ -5459,27 +5845,27 @@ msgstr	"# Lokaalselt toetatud kooditabel
 	"# loetakse mm_charset väärtusest erinev kooditabel mitte-näidatavaks\n"
 	"# ja näitamisel kasutatakse '?'.\n"
 
-#: src/lang.c:2058
-msgid	"MM_NETWORK_CHARSET                 :"
-msgstr	"MM_NETWORK_CHARSET                 :"
+#: src/lang.c:2205
+msgid	"MM_NETWORK_CHARSET"
+msgstr	"MM_NETWORK_CHARSET"
 
-#: src/lang.c:2059
+#: src/lang.c:2206
 msgid	"# Charset used for MIME (Content-Type) header in postings.\n"
 msgstr	"# Postituste MIME (Content-Type) päises kasutatav kooditabel.\n"
 
-#: src/lang.c:2065
-msgid	"Mailbox format                     :"
-msgstr	"Kirjade kataloog                   :"
+#: src/lang.c:2212
+msgid	"Mailbox format"
+msgstr	"Kirjade kataloog"
 
-#: src/lang.c:2066
+#: src/lang.c:2213
 msgid	"# Format of the mailbox.\n"
 msgstr	"# Kirjade kataloog.\n"
 
-#: src/lang.c:2071
-msgid	"MIME encoding in news messages     :"
-msgstr	"Kasuta artiklites MIME kodeerimist :"
+#: src/lang.c:2218
+msgid	"MIME encoding in news messages"
+msgstr	"Kasuta artiklites MIME kodeerimist"
 
-#: src/lang.c:2072
+#: src/lang.c:2219
 msgid	"# MIME encoding (8bit, base64, quoted-printable, 7bit) of the body\n"
 	"# for mails and posts, if necessary. QP is efficient for most European\n"
 	"# character sets (ISO-8859-X) with small fraction of non-US-ASCII chars,\n"
@@ -5491,15 +5877,15 @@ msgstr	"# Vajadusel kirjade ja artiklite
 	"# Base64 on kasulik enamuse 8 bitistele ida-aasia, kreeka ja vene\n"
 	"# kooditabelitele, kus kasutatakse palju 8 bitiseid sümboleid.\n"
 
-#: src/lang.c:2080 src/lang.c:2101
+#: src/lang.c:2227 src/lang.c:2248
 msgid	"Don't change unless you know what you are doing. <ESC> cancels."
 msgstr	"Ärge muutke, kui te ei tea, mida teete. <ESC> katkestab."
 
-#: src/lang.c:2081
-msgid	"Use 8bit characters in news headers:"
-msgstr	"Kasuta artikli päises 8bit tähti   :"
+#: src/lang.c:2228
+msgid	"Use 8bit characters in news headers"
+msgstr	"Kasuta artikli päises 8bit tähti"
 
-#: src/lang.c:2082
+#: src/lang.c:2229
 msgid	"# If ON, 8bit characters in news headers are NOT encoded.\n"
 	"# default is OFF. Thus 8bit characters are encoded by default.\n"
 	"# 8bit chars in header are encoded regardless of the value of this\n"
@@ -5509,28 +5895,28 @@ msgstr	"# Kui väärtus on ON, 8bit sümbol
 	"# 8bit sümbolid päistes kodeeritakse sõltumata selle parameetri väärtusest,\n"
 	"# v.a. juhul, kui post_mime_encoding väärtus on samuti 8bit.\n"
 
-#: src/lang.c:2089
+#: src/lang.c:2236
 msgid	"Auto-view post-processed files <SPACE> toggles, <CR> sets, <ESC> cancels."
 msgstr	"Vaata töödeldud faile automaatselt <TÜHIK> lülitab, <CR> seab, <ESC> "
 	"katkestab."
 
-#: src/lang.c:2090
-msgid	"View post-processed files          :"
-msgstr	"Vaata töödeldud faile              :"
+#: src/lang.c:2237
+msgid	"View post-processed files"
+msgstr	"Vaata töödeldud faile"
 
-#: src/lang.c:2091
+#: src/lang.c:2238
 msgid	"# If set, post processed files will be opened in a viewer\n"
 msgstr	"# Kui on seatud, avatakse töödeldud fail vaatamiseks\n"
 
-#: src/lang.c:2096
-msgid	"MIME encoding in mail messages     :"
-msgstr	"Kasuta kirjades MIME kodeerimist   :"
-
-#: src/lang.c:2102
-msgid	"Use 8bit characters in mail headers:"
-msgstr	"Kasuta kirja päises 8bit tähti     :"
+#: src/lang.c:2243
+msgid	"MIME encoding in mail messages"
+msgstr	"Kasuta kirjades MIME kodeerimist"
+
+#: src/lang.c:2249
+msgid	"Use 8bit characters in mail headers"
+msgstr	"Kasuta kirja päises 8bit tähti"
 
-#: src/lang.c:2103
+#: src/lang.c:2250
 msgid	"# If ON, 8bit characters in mail headers are NOT encoded.\n"
 	"# default is OFF. Thus 8bit characters are encoded by default.\n"
 	"# 8bit chars in headers are encoded regardless of the value of this "
@@ -5545,696 +5931,570 @@ msgstr	"# Kui väärtus on ON, 8bit sümbol
 	"# et RFC 2822 keelab 8bit sümbolid kirjade päistes, seega selle\n"
 	"# parameetri väärtus ON ei ole soovitatav kasutada.\n"
 
-#: src/lang.c:2113
-msgid	"Strip blanks from ends of lines    :"
-msgstr	"Eemalda tühikud realõppudest       :"
+#: src/lang.c:2260
+msgid	"Strip blanks from ends of lines"
+msgstr	"Eemalda tühikud realõppudest"
 
-#: src/lang.c:2114
+#: src/lang.c:2261
 msgid	"# If ON strip blanks from ends of lines for faster display on slow "
 	"terminals.\n"
 msgstr	"# Kui väärtus on ON, eemalda aeglaste terminalise töö kiirendamiseks\n"
 	"# realõppudest tühikud.\n"
 
-#: src/lang.c:2119
+#: src/lang.c:2266
 msgid	"If ON, use transliteration. <SPACE> toggles & <CR> sets."
 msgstr	"Kui väärtus on ON, kasuta transliteratsiooni. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:2120
-msgid	"Transliteration                    :"
-msgstr	"Transliteratsioon                  :"
+#: src/lang.c:2267
+msgid	"Transliteration"
+msgstr	"Transliteratsioon"
 
-#: src/lang.c:2121
+#: src/lang.c:2268
 msgid	"# If ON, use //TRANSLIT extension. This means that when a character cannot\n"
 	"# be represented in the in the target character set, it can be approximated\n"
 	"# through one or several similarly looking characters.\n"
 msgstr	"# Kui väärtus on ON, kasuta //TRANSLIT laiendust. See tähendab, et kui "
-	"sümbolit# ei saa esitada soovitavas kooditabelis, võib seda esitada "
-	"kasutades\n"
+	"sümbolit\n"
+	"# ei saa esitada soovitavas kooditabelis, võib seda esitada kasutades\n"
 	"# üht või enamat sarnast sümbolit.\n"
 
-#: src/lang.c:2128
+#: src/lang.c:2275
 msgid	"Send you a carbon copy automatically. <SPACE> toggles & <CR> sets."
 msgstr	"Saada kasutajale automaatselt koopia. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:2129
-msgid	"Send you a cc automatically        :"
-msgstr	"Saada automaatselt koopia          :"
+#: src/lang.c:2276
+msgid	"Send you a cc automatically"
+msgstr	"Saada automaatselt koopia"
 
-#: src/lang.c:2130
+#: src/lang.c:2277
 msgid	"# If ON automatically put your name in the Cc: field when mailing an article\n"
 msgstr	"# Kui väärtus on ON, pane kasutaja nimi artikli saatmisel automaatselt\n"
 	"# Cc: reale\n"
 
-#: src/lang.c:2134
+#: src/lang.c:2281
 msgid	"Send you a blind carbon copy automatically. <SPACE> toggles & <CR> sets."
 msgstr	"Saada automaatselt pimekoopia. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:2135
-msgid	"Send you a blind cc automatically  :"
-msgstr	"Saada automaatselt pimekoopia      :"
+#: src/lang.c:2282
+msgid	"Send you a blind cc automatically"
+msgstr	"Saada automaatselt pimekoopia"
 
-#: src/lang.c:2136
+#: src/lang.c:2283
 msgid	"# If ON automatically put your name in the Bcc: field when mailing an "
 	"article\n"
 msgstr	"# Kui väärtus on ON, pane kasutaja nimi artikli saatmisel automaatselt\n"
 	"# Bcc: väljale\n"
 
-#: src/lang.c:2140
+#: src/lang.c:2287
 msgid	"Enter address elements about which you want to be warned. <CR> sets."
 msgstr	"Sisestage aadressi komponendid, mille eest peaks hoiatama. <CR> seab."
 
-#: src/lang.c:2141
-msgid	"Spamtrap warning address parts     :"
-msgstr	"Rämpsposti hoiatus aadressi osadele:"
+#: src/lang.c:2288
+msgid	"Spamtrap warning address parts"
+msgstr	"Rämpsposti hoiatus aadressi osadele"
 
-#: src/lang.c:2142
+#: src/lang.c:2289
 msgid	"# A comma-delimited list of address-parts you want to be warned\n"
 	"# about when trying to reply by email.\n"
 msgstr	"# Komaga eraldatud aadresside komponentide loend, mille kasutamisel\n"
 	"# tuleks kasutajat hoiatada.\n"
 
-#: src/lang.c:2147
+#: src/lang.c:2294
 msgid	"Enter default number of days a filter entry will be valid. <CR> sets."
 msgstr	"Sisestage kirje kehtivuse aeg päevades. <CR> seab."
 
-#: src/lang.c:2148
-msgid	"No. of days a filter entry is valid:"
-msgstr	"Filtri kehtivus päevades           :"
+#: src/lang.c:2295
+msgid	"No. of days a filter entry is valid"
+msgstr	"Filtri kehtivus päevades"
 
-#: src/lang.c:2149
+#: src/lang.c:2296
 msgid	"# Number of days a short term filter will be active\n"
 msgstr	"# lühiajalise filtri kehtivus päevades\n"
 
-#: src/lang.c:2153
+#: src/lang.c:2300
 msgid	"Add posted articles to filter. <SPACE> toggles & <CR> sets."
 msgstr	"Lisage postitatud artikkel filtrisse. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:2154
-msgid	"Add posted articles to filter      :"
-msgstr	"Lisage postitatud artikkel filtrile:"
+#: src/lang.c:2301
+msgid	"Add posted articles to filter"
+msgstr	"Lisage postitatud artikkel filtrile"
 
-#: src/lang.c:2155
+#: src/lang.c:2302
 msgid	"# If ON add posted articles which start a new thread to filter for\n"
 	"# highlighting follow-ups\n"
 msgstr	"# Kui väärtus on ON, lisa postitatud artiklid, mis alustavad uut teemat,\n"
 	"# filtrile, mis märgistab vastuseid\n"
 
-#: src/lang.c:2159
+#: src/lang.c:2306
 msgid	"The directory where articles/threads are to be saved in mailbox format."
 msgstr	"Kataloog, kuhu artikleid/teemasid salvestatakse kirjaformaadis."
 
-#: src/lang.c:2160
-msgid	"Mail directory                     :"
-msgstr	"Kirjade kataloog                   :"
+#: src/lang.c:2307
+msgid	"Mail directory"
+msgstr	"Kirjade kataloog"
 
-#: src/lang.c:2161
+#: src/lang.c:2308
 msgid	"# (-m) directory where articles/threads are saved in mailbox format\n"
 msgstr	"# (-m) kataloog, kuhu artikleid/teemasid salvestatakse kirjaformaadis\n"
 
-#: src/lang.c:2166
-msgid	"Save articles in batch mode (-S)   :"
-msgstr	"Salvesta artiklid pakettmoodis (-S):"
+#: src/lang.c:2313
+msgid	"Save articles in batch mode (-S)"
+msgstr	"Salvesta artiklid pakettmoodis (-S)"
 
-#: src/lang.c:2167
+#: src/lang.c:2314
 msgid	"# If ON articles/threads will be saved in batch mode when save -S\n"
 	"# or mail (-M/-N) is specified on the command line\n"
 msgstr	"# Kui väärtus on ON, artiklid salvestatakse pakettmoodis, kui käsureal\n"
 	"# on kasutatud võtmeid salvestamiseks -S või saatmiseks -M, -N\n"
 
-#: src/lang.c:2172
+#: src/lang.c:2319
 msgid	"The directory where you want articles/threads saved."
 msgstr	"Kataloog, kuhu te soovite artikleid salvestada."
 
-#: src/lang.c:2173
-msgid	"Directory to save arts/threads in  :"
-msgstr	"Kataloog artiklite salvestamiseks  :"
+#: src/lang.c:2320
+msgid	"Directory to save arts/threads in"
+msgstr	"Kataloog artiklite salvestamiseks"
 
-#: src/lang.c:2174
+#: src/lang.c:2321
 msgid	"# Directory where articles/threads are saved\n"
 msgstr	"# Kataloog, kuhu salvestatakse artiklid/teemad\n"
 
-#: src/lang.c:2178
+#: src/lang.c:2325
 msgid	"Auto save article/thread by Archive-name: header. <SPACE> toggles & <CR> sets."
 msgstr	"Salvesta artiklid Archive-name: päiserea järgi. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:2179
-msgid	"Use Archive-name: header for save  :"
-msgstr	"Kasuta salvestamisel Archive-name: :"
+#: src/lang.c:2326
+msgid	"Use Archive-name: header for save"
+msgstr	"Kasuta salvestamisel Archive-name:"
 
-#: src/lang.c:2180
+#: src/lang.c:2327
 msgid	"# If ON articles/threads with Archive-name: in mail header will\n"
 	"# be automatically saved with the Archive-name & part/patch no.\n"
 msgstr	"# Kui väärtus on ON, salvestatakse artiklid/teemad, mis omavad päiserida\n"
 	"# Archive-name:, automaatselt selle reaga määratud nime ja osa numbriga.\n"
 
-#: src/lang.c:2185
+#: src/lang.c:2332
 msgid	"Mark saved articles/threads as read. <SPACE> toggles, <CR> sets, <ESC> "
 	"cancels."
 msgstr	"Märgi salvestatud artiklid loetuks. <TÜHIK> lülitab, <CR> seab, <ESC> "
 	"katkestab."
 
-#: src/lang.c:2186
-msgid	"Mark saved articles/threads as read:"
-msgstr	"Märgi salvestatud artiklid loetuks :"
+#: src/lang.c:2333
+msgid	"Mark saved articles/threads as read"
+msgstr	"Märgi salvestatud artiklid loetuks"
 
-#: src/lang.c:2187
+#: src/lang.c:2334
 msgid	"# If ON mark articles that are saved as read\n"
 msgstr	"# Kui väärtus on ON, märgi salvestatud artiklid loetuks\n"
 
-#: src/lang.c:2191
+#: src/lang.c:2338
 msgid	"Do post processing (eg. extract attachments) for saved articles."
 msgstr	"Teosta salvestatud artiklitel järeltöötlemist (nt. lisade eraldamist)."
 
-#: src/lang.c:2192
-msgid	"Post process saved articles        :"
-msgstr	"Salvestatud artikl. järeltöötlemine:"
+#: src/lang.c:2339
+msgid	"Post process saved articles"
+msgstr	"Salvestatud artikl. järeltöötlemine"
 
-#: src/lang.c:2193
+#: src/lang.c:2340
 msgid	"# Perform post processing (saving binary attachments) from saved articles.\n"
-	"# 0=(no) 1=(yes) 2=(extract shell archives (shar) only)\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no\n"
+	"#   1 = extract shell archives (shar) only\n"
+	"#   2 = yes\n"
 msgstr	"# Teosta salvestatud artiklite järeltöötlemist (lisade eraldamine).\n"
-	"# 0=(ei) 1=(jah) 2=(eralda ainult shelli arhiivid (shar))\n"
-
-#: src/lang.c:2199
-msgid	"Process only unread articles       :"
-msgstr	"Töötle ainult lugemata artikleid   :"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"# * 0 = ei\n"
+	"#   1 = jah\n"
+	"#   2 = eralda ainult shelli arhiivid (shar)\n"
+
+#: src/lang.c:2349
+msgid	"Process only unread articles"
+msgstr	"Töötle ainult lugemata artikleid"
 
-#: src/lang.c:2200
+#: src/lang.c:2350
 msgid	"# If ON only save/print/pipe/mail unread articles (tagged articles excepted)\n"
 msgstr	"# Kui väärtus on ON, salvesta/trüki/torusse/saada lugemata artikleid\n"
 	"# (eeldatakse märgitud artikleid).\n"
 
-#: src/lang.c:2205
+#: src/lang.c:2355
 msgid	"Print all or just part of header. <SPACE> toggles & <CR> sets."
 msgstr	"Trüki kõik või ainult osa päisest. <TÜHIK> lülitab, <CR> seab."
 
-#: src/lang.c:2206
-msgid	"Print all headers when printing    :"
-msgstr	"Trükkimisel trüki kõik päised      :"
+#: src/lang.c:2356
+msgid	"Print all headers when printing"
+msgstr	"Trükkimisel trüki kõik päised"
 
-#: src/lang.c:2207
+#: src/lang.c:2357
 msgid	"# If ON print all of article header otherwise just the important lines\n"
 msgstr	"# Kui väärtus on ON, trüki kogu artikli päis, muidu ainult tähtsamad read\n"
 
-#: src/lang.c:2211
+#: src/lang.c:2361
 msgid	"The printer program with options that is to be used to print articles/threads."
 msgstr	"Programm koos argumentidega, mida kasutatakse artiklite/teemade trükkimiseks."
 
-#: src/lang.c:2212
-msgid	"Printer program with options       :"
-msgstr	"Trükikäsk koos võtmetega           :"
+#: src/lang.c:2362
+msgid	"Printer program with options"
+msgstr	"Trükikäsk koos võtmetega"
 
-#: src/lang.c:2213
+#: src/lang.c:2363
 msgid	"# Print program with parameters used to print articles/threads\n"
 msgstr	"# Programm koos argumentidega, mida kasutatakse artiklite/teemade "
 	"trükkimiseks\n"
 
-#: src/lang.c:2219
-msgid	"Force redraw after certain commands:"
-msgstr	"Värskenda ekraani peale käske      :"
+#: src/lang.c:2369
+msgid	"Force redraw after certain commands"
+msgstr	"Värskenda ekraani peale käske"
 
-#: src/lang.c:2220
+#: src/lang.c:2370
 msgid	"# If ON a screen redraw will always be done after certain external commands\n"
 msgstr	"# Kui väärtus on ON, värskendatakse alati peale teatud väliseid käske "
 	"ekraani\n"
 
-#: src/lang.c:2224
+#: src/lang.c:2374
 msgid	"Start editor with line offset. <SPACE> toggles, <CR> sets, <ESC> cancels."
 msgstr	"Käivita tekstitoimeti etteantud real. <TÜHIK> lülitab, <CR> seab, <ESC> "
 	"katkestab."
 
-#: src/lang.c:2225
-msgid	"Start editor with line offset      :"
-msgstr	"Käivita tekstitoimeti reanumbril   :"
+#: src/lang.c:2375
+msgid	"Start editor with line offset"
+msgstr	"Käivita tekstitoimeti reanumbril"
 
-#: src/lang.c:2226
+#: src/lang.c:2376
 msgid	"# If ON editor will be started with cursor offset into the file\n"
 	"# otherwise the cursor will be positioned at the first line\n"
 msgstr	"# Kui väärtus on ON, käivitatakse tekstitoimeti kursori paigutamisega\n"
 	"# vastavale reale. Vastasel korral positsioneeritakse kursor esimesele reale\n"
 
-#: src/lang.c:2231
+#: src/lang.c:2381
 msgid	"Enter %E for editor, %F for filename, %N for line-number, <CR> to set."
 msgstr	"Kasutage %E toimeti kohal, %F failinime kohal, %N reanumbrina, <CR> seab."
 
-#: src/lang.c:2232
-msgid	"Invocation of your editor          :"
-msgstr	"Teie tekstitoimeti                 :"
+#: src/lang.c:2382
+msgid	"Invocation of your editor"
+msgstr	"Teie tekstitoimeti"
 
-#: src/lang.c:2233
+#: src/lang.c:2383
+#, c-format
 msgid	"# Format of editor line including parameters\n"
 	"# %%E Editor  %%F Filename  %%N Linenumber\n"
 msgstr	"# Tekstitoimeti rea formaat koos parameetritega\n"
 	"# %%E Toimeti  %%F Failinimi  %%N Reanumber\n"
 
-#: src/lang.c:2238
+#: src/lang.c:2388
 msgid	"Enter name and options for external-inews, --internal for internal inews"
 msgstr	"Sisestage välise inews käsu nimi ja võtmed, sisemise valib --internal"
 
-#: src/lang.c:2239
-msgid	"External inews                     :"
-msgstr	"Väline inews                       :"
+#: src/lang.c:2389
+msgid	"External inews"
+msgstr	"Väline inews"
 
-#: src/lang.c:2240
+#: src/lang.c:2390
 msgid	"# If --internal use the built in mini inews for posting via NNTP\n"
 	"# otherwise use an external inews program\n"
 msgstr	"# Kui on --internal, kasuta NNTP postitustel sisseehitatud inews käsku\n"
 	"# muidu kasuta välist inews programmi\n"
 
-#: src/lang.c:2244
+#: src/lang.c:2394
 msgid	"Enter %M for mailer, %S for subject, %T for to, %F for filename, <CR> to set."
 msgstr	"Kasutage %M programmi kohal, %S teema kohal, %T saaja kohal, %F failinime "
 	"kohal, <CR> seab."
 
-#: src/lang.c:2245
-msgid	"Invocation of your mail command    :"
-msgstr	"Teie e-posti käsk                  :"
+#: src/lang.c:2395
+msgid	"Invocation of your mail command"
+msgstr	"Teie e-posti käsk"
 
-#: src/lang.c:2246
+#: src/lang.c:2396
+#, c-format
 msgid	"# Format of mailer line including parameters\n"
-	"# %%M Mailer  %%S Subject  %%T To  %%F Filename  %%U User (AmigaDOS)\n"
+	"# %%M Mailer  %%S Subject  %%T To  %%F Filename\n"
 	"# ie. to use elm as your mailer:    elm -s \"%%S\" \"%%T\" < %%F\n"
 	"# ie. elm interactive          :    elm -i %%F -s \"%%S\" \"%%T\"\n"
 msgstr	"# e-posti saatja käsurea formaat koos parameetritega\n"
-	"# %%M Programm  %%S Teema  %%T Saaja  %%F Failinimi  %%U Kasutaja (AmigaDOS)\n"
+	"# %%M Programm  %%S Teema  %%T Saaja  %%F Failinimi\n"
 	"# näiteks. kasutada saatjana elm programmi:    elm -s \"%%S\" \"%%T\" < %%F\n"
 	"# näiteks. elm interaktiivses moodis      :    elm -i %%F -s \"%%S\" \"%%T\"\n"
 
-#: src/lang.c:2254
-msgid	"Use interactive mail reader        :"
-msgstr	"Kasuta interaktiivset e-posti      :"
-
-#: src/lang.c:2255
-msgid	"# Interactive mailreader: if ON mailreader will be invoked earlier for\n"
-	"# reply so you can use more of its features (eg. MIME, pgp, ...)\n"
-	"# this option has to suit default_mailer_format\n"
-msgstr	"# Interaktiivne e-posti lugeja: kui väärtus on ON, käivitatakse vastuse\n"
-	"# kirjutamiseks e-posti lugeja, nii on võimalik kasutada vastavaid\n"
-	"# lisavõimalusi (MIME, pgp, ...)\n"
-	"# see omadus kasutab default_mailer_format väärtust\n"
-
-#: src/lang.c:2262
-msgid	"Remove ~/.article after posting    :"
-msgstr	"Eemalda ~/.article peale postitust :"
+#: src/lang.c:2404
+msgid	"Use interactive mail reader"
+msgstr	"Kasuta interaktiivset e-posti"
+
+#: src/lang.c:2405
+msgid	"# Interactive mailreader\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no interactive mailreader\n"
+	"#   1 = use interactive mailreader with headers in file\n"
+	"#   2 = use interactive mailreader without headers in file\n"
+msgstr	"# Interaktiivne e-posti programm\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"# * 0 = interaktiivset e-posti programmi pole\n"
+	"#   1 = kasuta interaktiivset e-posti programmi koos päistega\n"
+	"#   2 = kasuta interaktiivset e-posti programmi päisteta\n"
+
+#: src/lang.c:2414
+msgid	"Remove ~/.article after posting"
+msgstr	"Eemalda ~/.article peale postitust"
 
-#: src/lang.c:2263
+#: src/lang.c:2415
 msgid	"# If ON remove ~/.article after posting.\n"
 msgstr	"# Kui väärtus on ON, kustuta  ~/.article peale postitust.\n"
 
-#: src/lang.c:2267
+#: src/lang.c:2419
 msgid	"Filename for all posted articles, <CR> sets, no filename=do not save."
 msgstr	"Failinimi postitatud artiklitele. <CR> seab. Nime puudumisel ei salvestata."
 
-#: src/lang.c:2268
-msgid	"Filename for posted articles       :"
-msgstr	"Failinimi postitatud artiklitele   :"
+#: src/lang.c:2420
+msgid	"Filename for posted articles"
+msgstr	"Failinimi postitatud artiklitele"
 
-#: src/lang.c:2269
+#: src/lang.c:2421
 msgid	"# Filename where to keep all postings (default posted)\n"
 	"# If no filename is set then postings will not be saved\n"
 msgstr	"# Failinimi, kus hoida kõiki postitusi (vaikimisi posted)\n"
 	"# Kui nime pole, siis postitusi ei salvestata\n"
 
-#: src/lang.c:2274
+#: src/lang.c:2426
 msgid	"Keep all failed articles in ~/dead.articles. <SPACE> toggles & <CR> sets."
 msgstr	"Hoia ebaõnnestunud postitused failis ~/dead.articles. <TÜHIK> lülitab ja <CR> "
 	"seab."
 
-#: src/lang.c:2275
-msgid	"Keep failed arts in ~/dead.articles:"
-msgstr	"Vigased artiklid ~/dead.articles   :"
+#: src/lang.c:2427
+msgid	"Keep failed arts in ~/dead.articles"
+msgstr	"Vigased artiklid ~/dead.articles"
 
-#: src/lang.c:2276
+#: src/lang.c:2428
 msgid	"# If ON keep all failed postings in ~/dead.articles\n"
 msgstr	"# Kui väärtus on ON, hoia ebaõnnestunud postitused failis ~/dead.articles\n"
 
-#: src/lang.c:2280
+#: src/lang.c:2432
 msgid	"Do you want to strip unsubscribed groups from .newsrc"
 msgstr	"Kas te soovite eemaldada tellimata grupid .newsrc failist"
 
-#: src/lang.c:2281
-msgid	"No unsubscribed groups in newsrc   :"
-msgstr	"newsrcs ainult tellitud grupid     :"
+#: src/lang.c:2433
+msgid	"No unsubscribed groups in newsrc"
+msgstr	"newsrcs ainult tellitud grupid"
 
-#: src/lang.c:2282
+#: src/lang.c:2434
 msgid	"# If ON strip unsubscribed groups from newsrc\n"
 msgstr	"# Kui väärtus on ON, eemalda tellimata grupid newsrc failist\n"
 
-#: src/lang.c:2287
-msgid	"Remove bogus groups from newsrc    :"
-msgstr	"Eemalda olematud grupid newsrcst   :"
+#: src/lang.c:2439
+msgid	"Remove bogus groups from newsrc"
+msgstr	"Eemalda vigased grupid newsrcst"
 
-#: src/lang.c:2288
+#: src/lang.c:2440
 msgid	"# What to do with bogus groups in newsrc file\n"
-	"# 0=(Keep) 1=(Remove) 2=(Highlight with D on selection screen).\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = keep\n"
+	"#   1 = remove\n"
+	"#   2 = highlight with D on selection screen\n"
 msgstr	"# Mida teha olematute gruppidega newsrc failis\n"
-	"# 0 =(Hoia alles) 1=(Eemalda) 2=(Märgi valikuekraanil D lipuga).\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"# * 0 = Hoia alles\n"
+	"#   1 = Eemalda\n"
+	"#   2 = Märgi valikuekraanil lipuga D\n"
 
-#: src/lang.c:2292
+#: src/lang.c:2448
 msgid	"Enter number of seconds until active file will be reread. <CR> sets."
 msgstr	"Sisestage aktiivsete faili lugemise intervall sekundites. <CR> seab."
 
-#: src/lang.c:2293
-msgid	"Interval in secs to reread active  :"
-msgstr	"Aktiivsete faili lugemise intervall:"
+#: src/lang.c:2449
+msgid	"Interval in secs to reread active"
+msgstr	"Aktiivsete faili lugemise intervall"
 
-#: src/lang.c:2294
+#: src/lang.c:2450
 msgid	"# Time interval in seconds between rereading the active file (0=never)\n"
 msgstr	"# Aktiivsete faili lugemise intervall (0 = ei loe)\n"
 
-#: src/lang.c:2299
-msgid	"Reconnect to server automatically  :"
-msgstr	"Taasta automaatselt NNTP ühendus   :"
+#: src/lang.c:2455
+msgid	"Reconnect to server automatically"
+msgstr	"Taasta automaatselt NNTP ühendus"
 
-#: src/lang.c:2300
+#: src/lang.c:2456
 msgid	"# If ON automatically reconnect to NNTP server if the connection is broken\n"
 msgstr	"# Kui väärtus on ON, ürita NNTP serveriga ühenduse katkemisel ühendust\n"
 	"# automaatselt taastada\n"
 
-#: src/lang.c:2304
+#: src/lang.c:2460
 msgid	"Create local copies of NNTP overview files. <SPACE> toggles & <CR> sets."
 msgstr	"Loo NNTP overview failidest lokaalne koopia. <TÜHIK> lülitab ja <CR> seab."
 
-#: src/lang.c:2305
-msgid	"Cache NNTP overview files locally  :"
-msgstr	"Puhverda NNTP overview lokaalselt  :"
+#: src/lang.c:2461
+msgid	"Cache NNTP overview files locally"
+msgstr	"Puhverda NNTP overview lokaalselt"
 
-#: src/lang.c:2306
+#: src/lang.c:2462
 msgid	"# If ON, create local copies of NNTP overview files.\n"
 msgstr	"# Kui väärtus on ON, loo NNTP overview failidest lokaalsed koopiad.\n"
 
-#: src/main.c:619
-#, c-format
-msgid	"Version: %s release %s (\"%s\") %s %s"
-msgstr	"Versioon: %s väljalase %s (\"%s\") %s %s"
+#: src/lang.c:2466
+msgid	"Enter format string. <CR> sets, <ESC> cancels."
+msgstr	"Sisestage vormingusõne. <CR> seab, <ESC> katkestab."
+
+#: src/lang.c:2467
+msgid	"Format string for display of dates"
+msgstr	"Kuupäevade esitamise vormingusõne"
+
+#: src/lang.c:2468
+msgid	"# Format string for date representation\n"
+msgstr	"# Vormingusõne kuupäevade esitamiseks\n"
+
+#: src/lang.c:2474
+msgid	"Unicode normalization form"
+msgstr	"Unikoodi normaliseerimise kuju"
+
+#: src/lang.c:2475
+msgid	"# Unicode normalization form\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = None\n"
+	"# * 1 = NFKC\n"
+	"#   2 = NFKD\n"
+	"#   3 = NFC\n"
+	"#   4 = NFD\n"
+msgstr	"# Unikoodi normaliseerimine\n"
+	"# Võimalikud väärtused on (vaikeväärtuse tähis on *):\n"
+	"#   0 = Pole\n"
+	"# * 1 = NFKC\n"
+	"#   2 = NFKD\n"
+	"#   3 = NFC\n"
+	"#   4 = NFD\n"
+
+#: src/lang.c:2487
+msgid	"Render BiDi"
+msgstr	"Renderda BiDi"
+
+#: src/lang.c:2488
+msgid	"# If ON, bi-directional text is rendered by tin\n"
+msgstr	"# Kui väärtus on ON, renderdab tin mitmesuunalist (BiDi) teksti\n"
+
+#: src/misc.c:3750
+#, c-format
+msgid	"Version: %s %s release %s (\"%s\") %s %s\n"
+msgstr	"Versioon: %s %s väljalase %s (\"%s\") %s %s\n"
 
-#: src/main.c:622
+#: src/misc.c:3753
 #, c-format
-msgid	"Version: %s release %s (\"%s\")"
-msgstr	"Versioon: %s väljalase %s (\"%s\")"
+msgid	"Version: %s %s release %s (\"%s\")\n"
+msgstr	"Versioon: %s %s väljalase %s (\"%s\")\n"
 
-#: src/nntplib.c:804
+#: src/newsrc.c:430
+msgid	"Unreachable?\n"
+msgstr	"Kättesaamatu?\n"
+
+#: src/nntplib.c:824
 #, c-format
 msgid	"\n"
 	"Server timed out, trying reconnect # %d\n"
 msgstr	"\n"
 	"Ühendus serveriga aegus, proovin taastada, katse %d\n"
 
-#: src/nntplib.c:822
+#: src/nntplib.c:842
 msgid	"Rejoin current group\n"
 msgstr	"Taasühinen jooksva grupiga\n"
 
-#: src/nntplib.c:829
+#: src/nntplib.c:849
 #, c-format
 msgid	"Read (%s)\n"
 msgstr	"Lugesin (%s)\n"
 
-#: src/nntplib.c:831
+#: src/nntplib.c:851
 #, c-format
 msgid	"Resend last command (%s)\n"
 msgstr	"Saada viimane käsk uuesti (%s)\n"
 
-#: src/nntplib.c:951
-msgid	"100  Help text on way"
-msgstr	"100  Abitekst on tulemas"
-
-#: src/nntplib.c:955
-msgid	"180  Authorization capabilities"
-msgstr	"180  Autoriseerimis võimalused"
-
-#: src/nntplib.c:959
-msgid	"199  Debug output"
-msgstr	"199  Silumise väljund"
-
-#: src/nntplib.c:963
-msgid	"200  Hello; you can post"
-msgstr	"200  Tere; te võite postitada"
-
-#: src/nntplib.c:967
-msgid	"201  Hello; you can't post"
-msgstr	"200  Tere; te ei saa postitada"
-
-#: src/nntplib.c:971
-msgid	"202  Slave status noted"
-msgstr	"202  Alamserveri olek teadustatud"
-
-#: src/nntplib.c:979
-msgid	"211  Group selected"
-msgstr	"211  Grupp valitud"
-
-#: src/nntplib.c:984
-msgid	"215  Newsgroups follow"
-msgstr	"215  Grupid järgnevad"
-
-#: src/nntplib.c:989
-msgid	"218  Group index file follows"
-msgstr	"218  Grupi indeksfail järgneb"
-
-#: src/nntplib.c:994
-msgid	"220  Article (head & body) follows"
-msgstr	"220  Artikkel (päis ja keha) järgneb"
-
-#: src/nntplib.c:998
-msgid	"221  Head follows"
-msgstr	"221  Päis järgneb"
-
-#: src/nntplib.c:1002
-msgid	"222  Body follows"
-msgstr	"222  Keha järgneb"
-
-#: src/nntplib.c:1006
-msgid	"223  No text sent -- stat, next, last"
-msgstr	"223  Teksti ei saadetud -- stat, next, last"
-
-#: src/nntplib.c:1010
-msgid	"230  New articles by message-id follow"
-msgstr	"230  Uute artiklite message-id järgnevad"
-
-#: src/nntplib.c:1014
-msgid	"231  New newsgroups follow"
-msgstr	"231  Uued grupid järgnevad"
-
-#: src/nntplib.c:1018
-msgid	"235  Article transferred successfully"
-msgstr	"235  Artikkel on edukalt edastatud"
-
-#: src/nntplib.c:1022
-msgid	"240  Article posted successfully"
-msgstr	"240  Artikkel on edukalt postitatud"
-
-#: src/nntplib.c:1026
-msgid	"280  Authorization system ok"
-msgstr	"280  Autoriseerimissüsteem ok"
-
-#: src/nntplib.c:1030
-msgid	"281  Authorization (user/pass) ok"
-msgstr	"281  Autoriseerimine (kasutaja/parool) ok"
-
-#: src/nntplib.c:1034
-msgid	"282  binary data follows"
-msgstr	"282  kahendandmed järgnevad"
-
-#: src/nntplib.c:1038
-msgid	"283  spooldir list follows"
-msgstr	"283  spooldir nimekiri järgneb"
-
-#: src/nntplib.c:1042
-msgid	"284  Switching to a different spooldir"
-msgstr	"284  Lülitun teisele spooldirile"
-
-#: src/nntplib.c:1046
-msgid	"285  Still using same spooldir"
-msgstr	"285  Kasutan ikka endist spooldiri"
-
-#: src/nntplib.c:1050
-msgid	"286  Current spooldir"
-msgstr	"286  Jooksev spooldir"
-
-#: src/nntplib.c:1054
-msgid	"287  Available spooldir"
-msgstr	"287  Kasutatav spooldir"
-
-#: src/nntplib.c:1058
-msgid	"288  Unavailable spooldir or invalid entry"
-msgstr	"288  spooldir pole kasutatav või on vigane"
-
-#: src/nntplib.c:1062
-msgid	"335  Continue to send article"
-msgstr	"335  Jätka artikli edastamist"
-
-#: src/nntplib.c:1066
-msgid	"340  Continue to post article"
-msgstr	"340  Jätka artikli postitamist"
-
-#: src/nntplib.c:1070
-msgid	"380  authorization is required"
-msgstr	"380  nõuame autoriseerimist"
-
-#: src/nntplib.c:1074
-msgid	"381  <type> authorization data required"
-msgstr	"381  <tüüp> autoriseerimise info on nõutav"
-
-#: src/nntplib.c:1078
-msgid	"400  Have to hang up for some reason"
-msgstr	"400  Pean miskipärast ühenduse katkestama"
-
-#: src/nntplib.c:1082
-msgid	"411  No such newsgroup"
-msgstr	"411  Gruppi pole"
-
-#: src/nntplib.c:1086
-msgid	"412  Not currently in newsgroup"
-msgstr	"412  Pole grupis"
-
-#: src/nntplib.c:1090
-msgid	"418  No index file for this group"
-msgstr	"418  Sellel grupil pole indeks faili"
-
-#: src/nntplib.c:1094
-msgid	"420  No current article selected"
-msgstr	"420  Jooksvat artiklit pole valitud"
-
-#: src/nntplib.c:1098
-msgid	"421  No next article in this group"
-msgstr	"421  Selles grupis pole järgmist artiklit"
-
-#: src/nntplib.c:1102
-msgid	"422  No previous article in this group"
-msgstr	"422  Selles grupis pole eelmist artiklit"
-
-#: src/nntplib.c:1106
-msgid	"423  No such article in this group"
-msgstr	"423  Selles grupis pole sellist artiklit"
-
-#: src/nntplib.c:1110
-msgid	"430  No such article at all"
-msgstr	"430  Sellist artiklit pole"
-
-#: src/nntplib.c:1114
-msgid	"435  Already got that article, don't send"
-msgstr	"435  Sain juba selle artikli, ära uuesti saada"
-
-#: src/nntplib.c:1118
-msgid	"436  Transfer failed"
-msgstr	"436  Ülekanne ebaõnnestus"
-
-#: src/nntplib.c:1122
-msgid	"437  Article rejected, don't resend"
-msgstr	"437  Artikkel lükati tagasi, ära uueasti saada"
-
-#: src/nntplib.c:1126
-msgid	"440  Posting not allowed"
-msgstr	"440  Postitamine pole lubatud"
-
-#: src/nntplib.c:1130
-msgid	"441  Posting failed"
-msgstr	"441  Postitamine ebaõnnestus"
-
-#: src/nntplib.c:1134
-msgid	"480  authorization required for command"
-msgstr	"480  käsk nõuab autoriseerimist"
-
-#: src/nntplib.c:1138
-msgid	"481  Authorization system invalid"
-msgstr	"481  Autoriseerimise süsteem on vigane"
-
-#: src/nntplib.c:1142
-msgid	"482  Authorization data rejected"
-msgstr	"482  Autoriseerimise andmed pole vastuvõetavad"
-
-#: src/nntplib.c:1146
-msgid	"483  Invalid alias on spooldir cmd"
-msgstr	"483  Vigane spooldir käsu lühend"
-
-#: src/nntplib.c:1150
-msgid	"484  No spooldir file found"
-msgstr	"484  Spooldir faili pole"
-
-#: src/nntplib.c:1154
-msgid	"500  Command not recognized"
-msgstr	"500  Tundmatu käsk"
-
-#: src/nntplib.c:1158
-msgid	"501  Command syntax error"
-msgstr	"501  Süntaksi viga käsus"
-
-#: src/nntplib.c:1162
-msgid	"502  Access to server denied"
-msgstr	"502  Serverile pole juurdepääsu"
-
-#: src/nntplib.c:1167
-msgid	"503  Program fault, command not performed"
-msgstr	"503  Programmi tõrge, käsku ei täidetud"
-
-#: src/nntplib.c:1171
-msgid	"580  Authorization Failed"
-msgstr	"580 Autoriseerimine ebaõnnestus"
-
-#: src/nntplib.c:1175
-msgid	"Unknown NNTP response code"
-msgstr	"Tundmatu NNTP vastusekood"
+#.
+#. * TODO: - store a hash value of the entire motd in the server-rc
+#. *         and only if it differs from the old value display the
+#. *         motd?
+#. *       - use some sort of pager?
+#. *       - -> lang.c
+#.
+#: src/nntplib.c:1759
+msgid	"MOTD: "
+msgstr	"MOTD: "
 
-#: src/nrctbl.c:172
+#: src/nrctbl.c:170
 #, c-format
 msgid	"couldn't expand %s\n"
 msgstr	"ei saa laiendada %s\n"
 
-#: src/open.c:1032
-msgid	"Unreachable?\n"
-msgstr	"Kättesaamatu?\n"
-
-#: src/post.c:1749
+#: src/post.c:1171
 #, c-format
-msgid	"%s is bogus"
-msgstr	"gruppi %s pole"
+msgid	"Line %d is longer than 998 octets and should be folded, but\n"
+	"encoding is neither set to %s nor to %s\n"
+msgstr	"Rida %d on pikem, kui 998 sümbolit ja tuleks poolitada, aga kodeering\n"
+	"pole ei %s ega %s\n"
+
+#: src/post.c:1176
+#, c-format
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is set to %s without enabling MIME_BREAK_LONG_LINES or\n"
+	"posting doesn't contain any 8bit chars and thus folding won't happen\n"
+msgstr	"Rida %d on pikem, kui 998 sümbolit ja tuleks poolitada, aga kodeering\n"
+	"on %s ja MIME_BREAK_LONG_LINES pole seatud või postitamine ei sisalda\n"
+	"8 bitiseid sümboleid ja seetõttu poolitamist ei toimu\n"
+
+#: src/post.c:1178
+#, c-format
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is not set to %s\n"
+msgstr	"Rida %d on pikem, kui 998 sümbolit ja tuleks poolitada, aga kodeering\n"
+	"pole %s\n"
 
-#: src/post.c:1940
+#: src/post.c:1993
 #, c-format
 msgid	"Posting: %.*s ..."
 msgstr	"Postitan: %.*s ..."
 
-#. TODO: -> lang.c
-#: src/post.c:4038
-#, c-format
-msgid	"Rereading %s..."
-msgstr	"Loen %s uuesti..."
-
-#. fp
 #. Check if okay to read
-#: src/read.c:219
+#: src/read.c:211
 msgid	"Aborting read, please wait..."
 msgstr	"Katkestan lugemise, palun oodake..."
 
-#: src/read.c:366
+#: src/read.c:358
 msgid	"Aborted read\n"
 msgstr	"Katkestatud lugemine\n"
 
-#: src/read.c:422
+#: src/read.c:414
 msgid	"Draining\n"
 msgstr	"Tühjendan\n"
 
 #. Don't hash the initial '<'
-#: src/refs.c:220
+#: src/refs.c:251
 msgid	"unchanged"
 msgstr	"muutmata"
 
-#: src/refs.c:573
+#: src/refs.c:609
 msgid	"[- Unavailable -]"
 msgstr	"[- Pole kasutatav -]"
 
-#: src/save.c:975
+#.
+#. * preamble
+#. * TODO: -> lang.c
+#.
+#: src/rfc2047.c:1201
+#, c-format
+msgid	"This message has been composed in the 'multipart/mixed' MIME-format. If you\n"
+	"are reading this prefix, your mail reader probably has not yet been modified\n"
+	"to understand the new format, and some of what follows may look strange.\n"
+	"\n"
+msgstr	"See teade on koostatud kasutades 'multipart/mixed' MIME vormingut. Kui\n"
+	"te loete seda prefiksit, siis pole teie mailiprogrammi seadistatud seda\n"
+	"vormingut kasutama ja järgnev tekst võib olla kummaline.\n"
+	"\n"
+
+#: src/save.c:972
 msgid	"bytes"
 msgstr	"baiti"
 
-#: src/select.c:351
+#: src/select.c:379
 msgid	"unread"
 msgstr	"lugemata"
 
-#: src/select.c:351
+#: src/select.c:379
 msgid	"all"
 msgstr	"kõik"
 
-#: src/select.c:525 src/select.c:527
+#: src/select.c:549 src/select.c:551
 msgid	" R"
 msgstr	" L"
 
Binary files tin-1.6.2/po/fr.gmo and tin-1.8.0/po/fr.gmo differ
diff -Nurp tin-1.6.2/po/fr.po tin-1.8.0/po/fr.po
--- tin-1.6.2/po/fr.po	2003-09-10 17:08:26.000000000 +0200
+++ tin-1.8.0/po/fr.po	2005-12-24 19:09:51.688605947 +0100
@@ -1,232 +1,310 @@
 # French translation for tin
-# Matt Anton <tin@syrius.org>, 2003
+# Matt Anton <tin@syrius.org>, 2003-2004
 #
 msgid	""
-msgstr	"Project-Id-Version: 1.6.2\n"
-	"POT-Creation-Date: 2003-09-10 17:05+0200\n"
-	"PO-Revision-Date: 2003-07-04 04:15+0200\n"
+msgstr	"Project-Id-Version: 1.7.9\n"
+	"Report-Msgid-Bugs-To: \n"
+	"POT-Creation-Date: 2005-12-24 19:09+0100\n"
+	"PO-Revision-Date: 2004-11-17 00:50+0100\n"
 	"Last-Translator: Matt Anton <tin@syrius.org\n"
 	"Language-Team: French <tin@syrius.org>\n"
 	"MIME-Version: 1.0\n"
-	"Content-Type: text/plain; charset=ISO-8859-1\n"
+	"Content-Type: text/plain; charset=ISO-8859-15\n"
 	"Content-Transfer-Encoding: 8bit\n"
 
-#: src/attrib.c:574
+#: src/art.c:1533
+#, c-format
+msgid	"%d Bad overview record (%d fields) '%s'"
+msgstr	"%d Mauvais overview (%d champs) '%s'"
+
+#: src/attrib.c:649
+#, c-format
 msgid	"# Do not edit this comment block\n"
 	"#\n"
 msgstr	"# Ne pas éditer ce commentaire\n"
 	"#\n"
 
-#: src/attrib.c:575
+#: src/attrib.c:650
+#, c-format
 msgid	"#  scope=STRING (ie. alt.*,!alt.bin*) [mandatory]\n"
 msgstr	"#  scope=TERME (pe. alt.*,!alt.bin*) [obligatoire]\n"
 
-#: src/attrib.c:576
+#: src/attrib.c:651
+#, c-format
 msgid	"#  maildir=STRING (ie. ~/Mail)\n"
 msgstr	"#  maildir=TERME (pe. ~/Mail)\n"
 
-#: src/attrib.c:577
+#: src/attrib.c:652
+#, c-format
 msgid	"#  savedir=STRING (ie. ~user/News)\n"
 msgstr	"#  savedir=TERME (pe. ~user/News)\n"
 
-#: src/attrib.c:578
+#: src/attrib.c:653
+#, c-format
 msgid	"#  savefile=STRING (ie. =linux)\n"
 msgstr	"#  savefile=TERME (pe. =linux)\n"
 
-#: src/attrib.c:579
+#: src/attrib.c:654
+#, c-format
 msgid	"#  sigfile=STRING (ie. $var/sig)\n"
 msgstr	"#  sigfile=TERME (pe. $var/sig)\n"
 
-#: src/attrib.c:580
+#: src/attrib.c:655
+#, c-format
 msgid	"#  organization=STRING (if beginning with '/' read from file)\n"
 msgstr	"#  organization=TERME (si commence par '/' lire dans fichier)\n"
 
-#: src/attrib.c:581
+#: src/attrib.c:656
+#, c-format
 msgid	"#  followup_to=STRING\n"
 msgstr	"#  followup_to=TERME\n"
 
-#: src/attrib.c:582
+#: src/attrib.c:657
+#, c-format
 msgid	"#  mailing_list=STRING (ie. majordomo@example.org)\n"
 msgstr	"#  mailing_list=TERME (pe. majordomo@example.org)\n"
 
-#: src/attrib.c:583
+#: src/attrib.c:658
+#, c-format
 msgid	"#  x_headers=STRING (ie. ~/.tin/extra-headers)\n"
 msgstr	"#  x_headers=TERME (pe. ~/.tin/extra-headers)\n"
 
-#: src/attrib.c:584
+#: src/attrib.c:659
+#, c-format
 msgid	"#  x_body=STRING (ie. ~/.tin/extra-body-text)\n"
 msgstr	"#  x_body=TERME (pe. ~/.tin/extra-body-text)\n"
 
-#: src/attrib.c:585
+#: src/attrib.c:660
+#, c-format
 msgid	"#  from=STRING (just append wanted From:-line, don't use quotes)\n"
-msgstr	"#  from=TERME (choix du From:-ligne:, ne pas utiliser celui cité)\n"
+msgstr	"#  from=TERME (choix du 'From:', ne pas utiliser celui cité)\n"
 
-#: src/attrib.c:586
+#: src/attrib.c:661
+#, c-format
 msgid	"#  news_quote_format=STRING\n"
 msgstr	"#  news_quote_format=TERME\n"
 
-#: src/attrib.c:587
+#: src/attrib.c:662
+#, c-format
 msgid	"#  quote_chars=STRING (%%s, %%S for initials)\n"
 msgstr	"#  quote_chars=TERME (%%s, %%S pour les initiales)\n"
 
-#: src/attrib.c:588
+#: src/attrib.c:663
+#, c-format
 msgid	"#  mime_types_to_save=STRING (eg. image/*,!image/bmp)\n"
 msgstr	"#  mime_types_to_save=TERME (pe. image/*,!image/bmp)\n"
 
-#: src/attrib.c:590
+#: src/attrib.c:665
+#, c-format
 msgid	"#  ispell=STRING\n"
 msgstr	"#  ispell=TERME\n"
 
-#: src/attrib.c:592
+#: src/attrib.c:667
+#, c-format
 msgid	"#  auto_select=ON/OFF\n"
 msgstr	"#  auto_select=ON/OFF\n"
 
-#: src/attrib.c:593
+#: src/attrib.c:668
+#, c-format
 msgid	"#  auto_save=ON/OFF\n"
 msgstr	"#  auto_save=ON/OFF\n"
 
-#: src/attrib.c:594
+#: src/attrib.c:669
+#, c-format
 msgid	"#  batch_save=ON/OFF\n"
 msgstr	"#  batch_save=ON/OFF\n"
 
-#: src/attrib.c:595
+#: src/attrib.c:670
+#, c-format
 msgid	"#  delete_tmp_files=ON/OFF\n"
 msgstr	"#  delete_tmp_files=ON/OFF\n"
 
-#: src/attrib.c:596
+#: src/attrib.c:671
+#, c-format
 msgid	"#  show_only_unread=ON/OFF\n"
 msgstr	"#  show_only_unread=ON/OFF\n"
 
-#: src/attrib.c:597
+#: src/attrib.c:672
+#, c-format
 msgid	"#  thread_arts=NUM"
 msgstr	"#  thread_arts=NUM"
 
-#: src/attrib.c:604
+#: src/attrib.c:679
+#, c-format
+msgid	"#  thread_perc=NUM\n"
+msgstr	"#  thread_perc=NUM\n"
+
+#: src/attrib.c:680
+#, c-format
 msgid	"#  show_author=NUM\n"
 msgstr	"#  show_author=NUM\n"
 
-#: src/attrib.c:610
+#: src/attrib.c:686
+#, c-format
+msgid	"#  show_info=NUM\n"
+msgstr	"#  show_info=NUM\n"
+
+#: src/attrib.c:692
+#, c-format
 msgid	"#  sort_art_type=NUM\n"
 msgstr	"#  sort_art_type=NUM\n"
 
-#: src/attrib.c:628
+#: src/attrib.c:710
+#, c-format
 msgid	"#  sort_threads_type=NUM\n"
 msgstr	"#  sort_threads_type=NUM\n"
 
-#: src/attrib.c:633
+#: src/attrib.c:715
+#, c-format
 msgid	"#  post_proc_type=NUM\n"
 msgstr	"#  post_proc_type=NUM\n"
 
-#: src/attrib.c:638
+#: src/attrib.c:720
+#, c-format
 msgid	"#  quick_kill_scope=STRING (ie. talk.*)\n"
 msgstr	"#  quick_kill_scope=TERME (pe. talk.*)\n"
 
-#: src/attrib.c:639
+#: src/attrib.c:721
+#, c-format
 msgid	"#  quick_kill_expire=ON/OFF\n"
 msgstr	"#  quick_kill_expire=ON/OFF\n"
 
-#: src/attrib.c:640
+#: src/attrib.c:722
+#, c-format
 msgid	"#  quick_kill_case=ON/OFF\n"
 msgstr	"#  quick_kill_case=ON/OFF\n"
 
-#: src/attrib.c:641
+#: src/attrib.c:723
+#, c-format
 msgid	"#  quick_kill_header=NUM\n"
 msgstr	"#  quick_kill_header=NUM\n"
 
-#: src/attrib.c:642 src/attrib.c:649
+#: src/attrib.c:724 src/attrib.c:731
+#, c-format
 msgid	"#    0=subj (case sensitive) 1=subj (ignore case)\n"
-msgstr	"#    0=sujet (casse sensible) 1=sujet (ignore la casse)\n"
+msgstr	"#    0=subject (casse sensible) 1=subject (ignore la casse)\n"
 
-#: src/attrib.c:643 src/attrib.c:650
+#: src/attrib.c:725 src/attrib.c:732
+#, c-format
 msgid	"#    2=from (case sensitive) 3=from (ignore case)\n"
-msgstr	"#    2=de (casse sensible) 3=de (ignore la casse)\n"
+msgstr	"#    2=from (casse sensible) 3=from (ignore la casse)\n"
 
-#: src/attrib.c:644 src/attrib.c:651
+#: src/attrib.c:726 src/attrib.c:733
+#, c-format
 msgid	"#    4=msgid 5=lines\n"
-msgstr	"#    4=msgid 5=lignes\n"
+msgstr	"#    4=msgid 5=lines\n"
 
-#: src/attrib.c:645
+#: src/attrib.c:727
+#, c-format
 msgid	"#  quick_select_scope=STRING\n"
 msgstr	"#  quick_select_scope=TERME\n"
 
-#: src/attrib.c:646
+#: src/attrib.c:728
+#, c-format
 msgid	"#  quick_select_expire=ON/OFF\n"
 msgstr	"#  quick_select_expire=ON/OFF\n"
 
-#: src/attrib.c:647
+#: src/attrib.c:729
+#, c-format
 msgid	"#  quick_select_case=ON/OFF\n"
 msgstr	"#  quick_select_case=ON/OFF\n"
 
-#: src/attrib.c:648
+#: src/attrib.c:730
+#, c-format
 msgid	"#  quick_select_header=NUM\n"
 msgstr	"#  quick_select_header=NUM\n"
 
-#: src/attrib.c:652
+#: src/attrib.c:734
+#, c-format
 msgid	"#  x_comment_to=ON/OFF\n"
 msgstr	"#  x_comment_to=ON/OFF\n"
 
-#: src/attrib.c:653
+#: src/attrib.c:735
+#, c-format
+msgid	"#  fcc=STRING (eg. =mailbox)\n"
+msgstr	"#  fcc=TERME (pe. =mailbox)\n"
+
+#: src/attrib.c:736
+#, c-format
 msgid	"#  tex2iso_conv=ON/OFF\n"
 msgstr	"#  tex2iso_conv=ON/OFF\n"
 
-#: src/attrib.c:655
+#: src/attrib.c:737
+#, c-format
+msgid	"#  mime_forward=ON/OFF\n"
+msgstr	"#  mime_forward=ON/OFF\n"
+
+#: src/attrib.c:739
+#, c-format
 msgid	"#  mm_network_charset=supported_charset"
 msgstr	"#  mm_network_charset=encodage_supporté"
 
-#: src/attrib.c:662
+#: src/attrib.c:746
+#, c-format
 msgid	"#  undeclared_charset=STRING (default is US-ASCII)\n"
 msgstr	"#  undeclared_charset=TERME (défaut est US-ASCII)\n"
 
-#: src/attrib.c:664
+#: src/attrib.c:748
+#, c-format
 msgid	"#\n"
 	"# Note that it is best to put general (global scoping)\n"
 msgstr	"#\n"
 	"# Notez que placer les entrées générales (portée globale) en premier\n"
 
-#: src/attrib.c:665
+#: src/attrib.c:749
+#, c-format
 msgid	"# entries first followed by group specific entries.\n"
 	"#\n"
 msgstr	"# est préférable, suivies des entrées spécifiques aux groupes.\n"
 	"#\n"
 
-#: src/attrib.c:666
+#: src/attrib.c:750
+#, c-format
 msgid	"############################################################################\n"
 	"\n"
 msgstr	"############################################################################\n"
 	"\n"
 
-#: src/attrib.c:672
+#: src/attrib.c:756
+#, c-format
 msgid	"# include extra headers\n"
 msgstr	"# inclure des en-têtes supplémentaires\n"
 
-#: src/attrib.c:680
+#: src/attrib.c:764
+#, c-format
 msgid	"# in *sources* set post process type to shar only\n"
 msgstr	"# dans *sources* choisir le type shar en post-traitement\n"
 
-#: src/attrib.c:684
-msgid	"# in *binaries* do full post processing, remove tmp files\n"
-msgstr	"# dans *binaries* faire traitement complet, effaçant les fichiers "
-	"temporaires\n"
-
-#: src/attrib.c:685
-msgid	"# and set Followup-To: poster\n"
-msgstr	"# et utiliser Followup-To: poster\n"
+# TRANSLATION OUTDATED
+#: src/attrib.c:768
+#, fuzzy, c-format
+msgid	"# in *binaries* do full post processing but no TeX2ISO conversion,\n"
+msgstr	"# dans *binaries* faire traitement complet,\n"
+
+#: src/attrib.c:769
+#, c-format
+msgid	"# remove tmp files and set Followup-To: poster\n"
+msgstr	"# effaçant les fichiers temporaires et utiliser Followup-To: poster\n"
 
-#: src/cook.c:799
+#: src/cook.c:499
 msgid	"(unknown)"
 msgstr	"(inconnu)"
 
 #.
 #. * TODO: add to the right rule, give better explanation, -> lang.c
 #.
-#: src/filter.c:604 src/filter.c:612
+#: src/filter.c:597 src/filter.c:605
 msgid	"Removed from the previous rule: "
 msgstr	"Effacé de la règle précédente : "
 
+# TRANSLATION MISSING
+#: src/keymap.c:271
+msgid	"NULL"
+msgstr	""
+
 #: src/lang.c:42
-#, c-format
-msgid	"1 Response%s"
-msgstr	"1 Réponse%s"
+msgid	"1 Response"
+msgstr	"1 Réponse"
 
 #: src/lang.c:46
 #, c-format
@@ -269,7 +347,7 @@ msgid	"\n"
 msgstr	"\n"
 	"Votre article :\n"
 	"  \"%s\"\n"
-	"sera posté dans le %s suivant :\n"
+	"sera posté dans le(s) %s suivant(s) :\n"
 
 #: src/lang.c:54
 msgid	"Article not posted!"
@@ -308,7 +386,7 @@ msgstr	"Article rejeté (enregistré dans 
 #: src/lang.c:62
 #, c-format
 msgid	"%s=article, %s=thread, %s=hot, %s=pattern, %s=tagged articles, %s=quit: "
-msgstr	"%s=article, %s=fil, %s=sélection, %s=modèle, %s=art. marq., %s=quitter : "
+msgstr	"%s=article, %s=fil, %s=sélection, %s=chaîne, %s=art. marq., %s=quitter : "
 
 #: src/lang.c:63
 msgid	"Article unavailable"
@@ -316,7 +394,7 @@ msgstr	"Article indisponible"
 
 #: src/lang.c:64
 msgid	"Article undeleted."
-msgstr	"Article non effacé"
+msgstr	"Article non effacé."
 
 #: src/lang.c:66
 msgid	"articles"
@@ -347,7 +425,7 @@ msgstr	" à %s"
 #: src/lang.c:72
 #, c-format
 msgid	"%*s[-- %s/%s, encoding %s%s%s, %d lines%s%s --]\n"
-msgstr	"%*s[-- %s/%s, encodage de %s%s%s, %d lignes%s%s --]\n"
+msgstr	"%*s[-- %s/%s, encodage en %s%s%s, %d lignes%s%s --]\n"
 
 #: src/lang.c:73
 msgid	", charset: "
@@ -378,12 +456,12 @@ msgstr	"    Entrez votre identifiant svp
 #: src/lang.c:79
 #, c-format
 msgid	"Author search backwards [%s]> "
-msgstr	"Recherche arrière sur l'auteur [%s]> "
+msgstr	"Recherche arrière sur l'auteur [%s] > "
 
 #: src/lang.c:80
 #, c-format
 msgid	"Author search forwards [%s]> "
-msgstr	"Recherche avant sur l'auteur [%s]> "
+msgstr	"Recherche avant sur l'auteur [%s] > "
 
 #: src/lang.c:81
 #, c-format
@@ -414,7 +492,7 @@ msgstr	"Sélection auto. des articles (vo
 #: src/lang.c:87
 #, c-format
 msgid	"Active file corrupt - %s"
-msgstr	"Fichier actif corrompu - %s"
+msgstr	"Fichier active corrompu - %s"
 
 #: src/lang.c:88
 #, c-format
@@ -429,7 +507,7 @@ msgstr	"Attribut non reconnu : %s"
 #: src/lang.c:90
 #, c-format
 msgid	"Bad command. Type '%s' for help."
-msgstr	"Mauvaise comande. Tapez '%s' pour l'aide."
+msgstr	"Mauvaise commande. Tapez '%s' pour l'aide."
 
 #: src/lang.c:92
 msgid	"Base article"
@@ -449,8 +527,9 @@ msgid	"*** Beginning of article ***"
 msgstr	"*** Début de l'article ***"
 
 #: src/lang.c:97
-msgid	"Cancel (delete) or supersede (overwrite) article [%%.*s]? (%s/%s/%s): "
-msgstr	"Annuler (effacer) ou remplacer (écraser) l'article [%%.*s]? (%s/%s/%s) : "
+#, c-format
+msgid	"Cancel (delete) or supersede (overwrite) article [%%s]? (%s/%s/%s): "
+msgstr	"Annuler (effacer) ou remplacer (écraser) l'article [%%s]? (%s/%s/%s) : "
 
 #: src/lang.c:98
 msgid	"Cancelling article..."
@@ -493,7 +572,7 @@ msgstr	"Récupération de %s impossible"
 #: src/lang.c:107
 #, c-format
 msgid	"%s is a directory"
-msgstr	"%s est un dossier"
+msgstr	"%s est un répertoire"
 
 #: src/lang.c:108
 msgid	"Catchup"
@@ -506,7 +585,7 @@ msgstr	"Effacement sur %s..."
 
 #: src/lang.c:110
 msgid	"Catchup all groups entered during this session?"
-msgstr	"Marquer comme lu tous les groupes entrés lors de la session ?"
+msgstr	"Marquer lus tous les groupes visités lors de la session ?"
 
 #: src/lang.c:111
 msgid	"You have tagged articles in this group - catchup anyway?"
@@ -527,7 +606,7 @@ msgstr	"Vérification de l'article prépar
 
 #: src/lang.c:115
 msgid	"Checking for new groups... "
-msgstr	"Vérification de nouveaux groupes..."
+msgstr	"Vérification de nouveaux groupes... "
 
 #: src/lang.c:116
 msgid	"Checking for news..."
@@ -536,278 +615,278 @@ msgstr	"Vérification de articles..."
 #: src/lang.c:117
 #, c-format
 msgid	"Post-process %s=no, %s=yes, %s=shar, %s=quit: "
-msgstr	"Traiter %s=aucun, %s=oui, %s=shar, %s=quitter : "
+msgstr	"Traiter %s=non, %s=oui, %s=shar, %s=quitter : "
 
-#: src/lang.c:118
+#: src/lang.c:119
 msgid	"ANSI color disabled"
 msgstr	"Couleurs ANSI désactivées"
 
-#: src/lang.c:119
+#: src/lang.c:120
 msgid	"ANSI color enabled"
 msgstr	"Couleurs ANSI activées"
 
-#: src/lang.c:120
+#: src/lang.c:122
 #, c-format
 msgid	"Command failed: %s"
-msgstr	"Commande échouée : %s"
+msgstr	"Échec commande : %s"
 
-#: src/lang.c:121
+#: src/lang.c:123
 msgid	"Mark not selected articles read?"
 msgstr	"Marquer comme lu les articles sélectionnés ?"
 
-#: src/lang.c:122
+#: src/lang.c:124
 #, c-format
 msgid	"Connecting to %s..."
 msgstr	"Connexion à %s..."
 
-#: src/lang.c:123
+#: src/lang.c:125
 msgid	"<CR>"
-msgstr	"<CR>"
+msgstr	"<RETOUR>"
 
-#: src/lang.c:124
+#: src/lang.c:126
 msgid	"Creating active file for saved groups...\n"
 msgstr	"Création du fichier active des groupes enregistrés...\n"
 
-#: src/lang.c:125
+#: src/lang.c:127
 msgid	"Creating newsrc file...\n"
 msgstr	"Création du fichier newsrc...\n"
 
-#: src/lang.c:127 src/lang.c:1129
+#: src/lang.c:129 src/lang.c:1150
 msgid	"Default"
 msgstr	"Défaut"
 
-#: src/lang.c:128
+#: src/lang.c:130
 msgid	"Delete saved files that have been post processed?"
 msgstr	"Effacer les fichiers enregistrés qui ont été post-traités ?"
 
-#: src/lang.c:129
+#: src/lang.c:131
 msgid	"Deleting temporary files..."
 msgstr	"Effacement des fichiers temporaires..."
 
-#: src/lang.c:131
+#: src/lang.c:133
 msgid	"*** End of article ***"
 msgstr	"*** Fin de l'article ***"
 
-#: src/lang.c:132
+#: src/lang.c:134
 msgid	"*** End of articles ***"
 msgstr	"*** Fin de la liste ***"
 
-#: src/lang.c:133
+#: src/lang.c:135
 msgid	"*** End of groups ***"
 msgstr	"*** Fin de la liste ***"
 
-#: src/lang.c:134
+#: src/lang.c:136
 msgid	"*** End of thread ***"
 msgstr	"*** Fin du fil ***"
 
-#: src/lang.c:135
+#: src/lang.c:137
 msgid	"Enter limit of articles to get> "
-msgstr	"Entrez le nombre max d'articles à récupérer> "
+msgstr	"Entrez le nombre max d'articles à récupérer > "
 
-#: src/lang.c:136
+#: src/lang.c:138
 msgid	"Enter Message-ID to go to> "
-msgstr	"Entrez le Message-ID à aller voir> "
+msgstr	"Entrez le Message-ID à voir > "
 
-#: src/lang.c:137
+#: src/lang.c:139
 msgid	" and enter next unread thread"
 msgstr	" et passer au fil non lu suivant"
 
-#: src/lang.c:138
+#: src/lang.c:140
 msgid	" and enter next unread group"
 msgstr	" et entrer dans le groupe suivant non lu"
 
-#: src/lang.c:139
+#: src/lang.c:141
 msgid	"Enter option number> "
-msgstr	"Entrez le numéro de l'option> "
+msgstr	"Entrez le numéro de l'option > "
 
-#: src/lang.c:140
+#: src/lang.c:142
 #, c-format
 msgid	"Enter range [%s]> "
-msgstr	"Entrez un champ [%s]> "
+msgstr	"Entrez un champ [%s] > "
 
-#: src/lang.c:141
+#: src/lang.c:143
 msgid	"\n"
 	"Warning: Approved: header used.\n"
 msgstr	"\n"
 	"Attention : en-tête Approved: utilisé.\n"
 
-#: src/lang.c:143
+#: src/lang.c:145
 msgid	"\n"
 	"Error: Bad address in Approved: header.\n"
 msgstr	"\n"
 	"Erreur : Mauvaise adresse dans l'en-tête Approved:.\n"
 
-#: src/lang.c:144
+#: src/lang.c:146
 msgid	"\n"
 	"Error: Bad address in From: header.\n"
 msgstr	"\n"
 	"Erreur : Mauvaise adresse dans l'en-tête From:.\n"
 
-#: src/lang.c:145
+#: src/lang.c:147
 msgid	"\n"
 	"Error: Bad address in Reply-To: header.\n"
 msgstr	"\n"
 	"Erreur : Mauvais adresse dans l'en-ête Reply-To:.\n"
 
-#: src/lang.c:146
+#: src/lang.c:148
 msgid	"\n"
 	"Error: Bad FQDN in Message-ID: header.\n"
 msgstr	"\n"
 	"Erreur : Mauvais FQDN dans l'en-tête Message-ID:.\n"
 
-#: src/lang.c:147
+#: src/lang.c:149
 #, c-format
 msgid	"Can't unlock %s"
 msgstr	"Déverrouillage de %s impossible"
 
-#: src/lang.c:149
+#: src/lang.c:151
 #, c-format
 msgid	"Corrupted file %s"
 msgstr	"Fichier %s corrompu"
 
-#: src/lang.c:150
+#: src/lang.c:152
 #, c-format
 msgid	"Couldn't dotlock %s - article not appended!"
-msgstr	"N'a pu 'dotlock' %s - article non ajouté !"
+msgstr	"N'a pu déverrouiler %s - article non ajouté !"
 
-#: src/lang.c:151
+#: src/lang.c:153
 #, c-format
 msgid	"Couldn't lock %s - article not appended!"
 msgstr	"N'a pu verrouiller %s - article non ajouté !"
 
-#: src/lang.c:153
+#: src/lang.c:155
 msgid	"Internal error in GNKSA routine - send bug report.\n"
 msgstr	"Erreur interne dans routine GNKSA - envoi d'un rapport de bug.\n"
 
-#: src/lang.c:154
+#: src/lang.c:156
 msgid	"Left angle bracket missing in route address.\n"
 msgstr	"Accolade gauche manquante dans l'adresse de routage.\n"
 
-#: src/lang.c:155
+#: src/lang.c:157
 msgid	"Left parenthesis missing in old-style address.\n"
 msgstr	"Parenthèse gauche manquante dans l'ancien type d'adresse.\n"
 
-#: src/lang.c:156
+#: src/lang.c:158
 msgid	"Right parenthesis missing in old-style address.\n"
 msgstr	"Parenthèse droite manquante dans l'ancien type d'adresse.\n"
 
-#: src/lang.c:157
+#: src/lang.c:159
 msgid	"At-sign missing in mail address.\n"
 msgstr	"Arobase manquant dans l'adresse email.\n"
 
-#: src/lang.c:158
+#: src/lang.c:160
 msgid	"Single component FQDN is not allowed. Add your domain.\n"
 msgstr	"Composant FQDN unique non autorisé. Ajoutez votre domaine.\n"
 
-#: src/lang.c:159
+#: src/lang.c:161
 msgid	"Invalid domain. Send bug report if your top level domain really exists.\n"
 	"Use .invalid as top level domain for munged addresses.\n"
 msgstr	"Domaine invalide. Envoyez un rapport de bug si votre domaine premier existe.\n"
 	"Utilisez .invalid comme domaine premier pour les fausses adresses.\n"
 
-#: src/lang.c:160
+#: src/lang.c:162
 msgid	"Illegal domain. Send bug report if your top level domain really exists.\n"
 	"Use .invalid as top level domain for munged addresses.\n"
 msgstr	"Domaine illégal. Envoyez un rapport de bug si votre domaine premier existe.\n"
 	"Utilisez .invalid comme domaine premier pour les fausses adresses.\n"
 
-#: src/lang.c:161
+#: src/lang.c:163
 msgid	"Unknown domain. Send bug report if your top level domain really exists.\n"
 	"Use .invalid as top level domain for munged addresses.\n"
 msgstr	"Domaine inconnu. Envoyez un rapport de bug si votre domaine premier existe.\n"
 	"Utilisez .invalid comme domaine premier pour les fausses adresses.\n"
 
-#: src/lang.c:162
+#: src/lang.c:164
 msgid	"Illegal character in FQDN.\n"
 msgstr	"Caractère illégal dans le FQDN.\n"
 
-#: src/lang.c:163
+#: src/lang.c:165
 msgid	"Zero length FQDN component not allowed.\n"
 msgstr	"Valeur vide dans le FQDN non autorisé.\n"
 
-#: src/lang.c:164
+#: src/lang.c:166
 msgid	"FQDN component exceeds maximum allowed length (63 chars).\n"
 msgstr	"Composant FQDN excède la longueur max autorisée (63 car.).\n"
 
-#: src/lang.c:165
+#: src/lang.c:167
 msgid	"FQDN component may not start or end with hyphen.\n"
 msgstr	"Composant FQDN ne devrait pas commencer ou finir par un tiret.\n"
 
-#: src/lang.c:166
+#: src/lang.c:168
 msgid	"FQDN component may not start with digit.\n"
 msgstr	"Composant FQDN ne devrait pas commencer par un chiffre.\n"
 
-#: src/lang.c:167
+#: src/lang.c:169
 msgid	"Domain literal has impossible numeric value.\n"
 msgstr	"Domaine littéral contient une valeur numérique impossible.\n"
 
-#: src/lang.c:168
+#: src/lang.c:170
 msgid	"Domain literal is for private use only and not allowed for global use.\n"
 msgstr	"Domaine littéral est pour l'usage privé et n'est pas autorisé à l'usage "
 	"global.\n"
 
-#: src/lang.c:169
+#: src/lang.c:171
 msgid	"Right bracket missing in domain literal.\n"
 msgstr	"Parenthèse droite manquante dans le domaine littéral.\n"
 
-#: src/lang.c:170
+#: src/lang.c:172
 msgid	"Missing localpart of mail address.\n"
 msgstr	"Partie locale manquante dans l'adresse email.\n"
 
-#: src/lang.c:171
+#: src/lang.c:173
 msgid	"Illegal character in localpart of mail address.\n"
 msgstr	"Caractère illégal dans la partie locale de l'adresse email.\n"
 
-#: src/lang.c:172
+#: src/lang.c:174
 msgid	"Zero length localpart component not allowed.\n"
 msgstr	"Valeur vide dans composant de partie locale non autorisé.\n"
 
-#: src/lang.c:173
+#: src/lang.c:175
 msgid	"Illegal character in realname.\n"
 	"Unquoted words may not contain '!()<>@,;:\\.[]' in route addresses.\n"
 msgstr	"Caractère illégal dans le nom réel.\n"
 	"Mots non cités ne devraient pas contenir '!()<>@,;:\\.[]' dans l'adresse de "
 	"routage.\n"
 
-#: src/lang.c:174
+#: src/lang.c:176
 msgid	"Illegal character in realname.\n"
 	"Quoted words may not contain '()<>\\'.\n"
 msgstr	"Caractère illégal dans le nom réel.\n"
 	"Mots cités ne devraient pas contenir '()<>\\'.\n"
 
-#: src/lang.c:175
+#: src/lang.c:177
 msgid	"Illegal character in realname.\n"
 	"Encoded words may not contain '!()<>@,;:\"\\.[]/=' in parameter.\n"
 msgstr	"Caractère illégal dans le nom réel.\n"
 	"Mots encodés ne devraient pas contenir '!()<>@,;:\"\\.[]/=' dans le "
 	"paramètre.\n"
 
-#: src/lang.c:176
+#: src/lang.c:178
 msgid	"Bad syntax in encoded word used in realname.\n"
 msgstr	"Mauvaise syntaxe dans le mot encodé utilisé dans le nom réel.\n"
 
-#: src/lang.c:177
+#: src/lang.c:179
 msgid	"Illegal character in realname.\n"
 	"Unquoted words may not contain '()<>\\' in old-style addresses.\n"
 msgstr	"Caractère illégal dans le nom réel.\n"
 	"Mots non cités ne devraient pas contenir '()<>\\' dans les adresses de type "
 	"anciennes.\n"
 
-#: src/lang.c:178
+#: src/lang.c:180
 msgid	"Illegal character in realname.\n"
 	"Control characters and unencoded 8bit characters > 127 are not allowed.\n"
 msgstr	"Caractère illégal dans le nom réel.\n"
 	"Les caractères de contrôle et non encodés en 8bit > 127 ne sont pas "
 	"autorisés.\n"
 
-#: src/lang.c:179
+#: src/lang.c:181
 msgid	"\n"
 	"Error: No blank line found after header.\n"
 msgstr	"\n"
 	"Erreur : Pas de ligne vide trouvée après l'en-tête.\n"
 
 #. TODO: fixme, US-ASCII is not the only 7bit charset we know about
-#: src/lang.c:181
+#: src/lang.c:183
 msgid	"\n"
 	"Error: Posting contains non-ASCII characters but MM_CHARSET is set to\n"
 	"       US-ASCII  - please change this setting to a suitable value for\n"
@@ -819,7 +898,7 @@ msgstr	"\n"
 	"         correcte pour votre langue via le M)enu des options ou via\n"
 	"         l'édition de votre tinrc.\n"
 
-#: src/lang.c:186
+#: src/lang.c:188
 msgid	"\n"
 	"Error: Posting contains  non-ASCII characters  but the  MIME encoding\n"
 	"       for news  messages  is set  to \"7bit\"  -  please change this\n"
@@ -834,110 +913,110 @@ msgstr	"\n"
 	"         changement peut être effectué via le M)enu des options ou via\n"
 	"         l'édition de votre tinrc.\n"
 
-#: src/lang.c:192
+#: src/lang.c:194
 msgid	"\n"
 	"Error: Article starts with blank line instead of header\n"
 msgstr	"\n"
 	"Erreur : L'article débute avec une ligne vide au lieu d'un en-tête\n"
 
-#: src/lang.c:193
+#: src/lang.c:195
 #, c-format
 msgid	"\n"
 	"Error: Header on line %d does not have a colon after the header name:\n"
 	"%s\n"
 msgstr	"\n"
-	"Erreur : L'en-tête de la ligne %d n'a pas de séparateur après l'en-tête nom "
-	":\n"
+	"Erreur : L'en-tête de la ligne %d n'a pas de séparateur après l'en-tête "
+	"nom :\n"
 	"%s\n"
 
-#: src/lang.c:194
+#: src/lang.c:196
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line is empty.\n"
 msgstr	"\n"
 	"Erreur : La ligne \"%s:\" est vide.\n"
 
-#: src/lang.c:195
+#: src/lang.c:197
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line is missing from the article header.\n"
 msgstr	"\n"
 	"Erreur : La ligne \"%s:\" est absente de l'en-tête de l'article.\n"
 
-#: src/lang.c:196
+#: src/lang.c:198
 #, c-format
 msgid	"\n"
 	"Error: Header on line %d does not have a space after the colon:\n"
 	"%s\n"
 msgstr	"\n"
-	"Erreur : L'en-tête à la ligne %d n'a pas d'espace après le séparateur:\n"
+	"Erreur : L'en-tête à la ligne %d n'a pas d'espace après le séparateur :\n"
 	"%s\n"
 
-#: src/lang.c:197
+#: src/lang.c:199
 #, c-format
 msgid	"\n"
 	"Error: There are multiple (%d) \"%s:\" lines in the header.\n"
 msgstr	"\n"
 	"Erreur : Il y a plusieurs lignes (%d) \"%s:\" dans l'en-tête.\n"
 
-#: src/lang.c:198
+#: src/lang.c:200
 #, c-format
 msgid	"Insecure permissions of %s (%o)"
 msgstr	"Permissions de %s non sûres (%o)"
 
-#: src/lang.c:199 src/open.c:1009
+#: src/lang.c:201
 #, c-format
 msgid	"Invalid response to GROUP command, %s"
 msgstr	"Réponse de la commande GROUP invalide, %s"
 
-#: src/lang.c:201
+#: src/lang.c:203
 #, c-format
 msgid	"MIME parse error: Unexpected end of %s/%s article"
 msgstr	"Erreur MIME : Fin inattendue de l'article %s %s"
 
-#: src/lang.c:202
+#: src/lang.c:204
 msgid	"MIME parse error: Start boundary whilst reading headers"
 msgstr	"Erreur MIME : Début de la borne lors de la lecture des en-têtes"
 
-#: src/lang.c:203
+#: src/lang.c:205
 msgid	"Can't get a (fully-qualified) domain-name!"
 msgstr	"Nom de domaine (qualifié) introuvable !"
 
-#: src/lang.c:204
+#: src/lang.c:206
 #, c-format
 msgid	"No permissions to go into %s\n"
 msgstr	"Pas la permission d'aller dans %s\n"
 
-#: src/lang.c:205
+#: src/lang.c:207
 msgid	"\n"
 	"Error: From: line missing.\n"
 msgstr	"\n"
-	"Erreur : Ligne De: manquante.\n"
+	"Erreur : En-tête 'From:' manquant.\n"
 
-#: src/lang.c:206
+#: src/lang.c:208
 #, c-format
 msgid	"No read permissions for %s\n"
 msgstr	"Pas la permission de lecture pour %s\n"
 
-#: src/lang.c:207
+#: src/lang.c:209
 #, c-format
 msgid	"File %s does not exist\n"
 msgstr	"Fichier %s inexistant\n"
 
-#: src/lang.c:208
+#: src/lang.c:210
 #, c-format
 msgid	"No write permissions for %s\n"
 msgstr	"Pas la permission d'écrire pour %s\n"
 
-#: src/lang.c:209
+#: src/lang.c:211
 msgid	"Can't get user information (/etc/passwd missing?)"
 msgstr	"Info sur l'utilisateur introuvable (/etc/passwd manquant ?)"
 
-#: src/lang.c:210
+#: src/lang.c:212
 msgid	"errors"
 msgstr	"erreurs"
 
-#: src/lang.c:211
+#: src/lang.c:213
 #, c-format
 msgid	"\n"
 	"Error on line %d: \"Sender:\" header not allowed (it will be added for you)\n"
@@ -945,73 +1024,81 @@ msgstr	"\n"
 	"Erreur sur la ligne %d : en-tête \"Sender:\" non autorisé (sera ajouté pour "
 	"vous)\n"
 
-#: src/lang.c:212
+#: src/lang.c:214
 #, c-format
 msgid	"Server has non of the groups listed in %s"
 msgstr	"Le serveur n'a aucun groupe listé dans %s"
 
-#: src/lang.c:213
+#: src/lang.c:215
 msgid	"error"
 msgstr	"erreur"
 
-#: src/lang.c:214
+#: src/lang.c:216
 msgid	"Unknown display level"
 msgstr	"Vue affichée inconnue"
 
-#: src/lang.c:215
+#: src/lang.c:217
 msgid	"<ESC>"
 msgstr	"<ESC>"
 
-#: src/lang.c:216
+#: src/lang.c:218
 msgid	"Exiting..."
 msgstr	"Fermeture..."
 
-#: src/lang.c:217
+#: src/lang.c:219
 msgid	"leaving external mail-reader"
-msgstr	"fermeture du lecteur de messagerie externe"
+msgstr	"fermeture du client mail externe"
 
-#: src/lang.c:218
+#: src/lang.c:220
 #, c-format
 msgid	"Extracting %s..."
 msgstr	"Extraction de %s..."
 
-#: src/lang.c:220
+#: src/lang.c:222
 #, c-format
 msgid	"Error writing %s file. Filesystem full? File reset to previous state."
 msgstr	"Écriture du fichier %s échouée. Disque plein ? Fichier non touché."
 
-#: src/lang.c:221
+#: src/lang.c:223
 #, c-format
 msgid	"Error making backup of %s file. Filesystem full?"
 msgstr	"Erreur lors de la sauvegarde du fichier %s. Disque plein ?"
 
-#: src/lang.c:222
+#: src/lang.c:224
 #, c-format
 msgid	"Filtering global rules (%d/%d)..."
 msgstr	"Filtrage selon les règles globales (%d/%d)..."
 
-#: src/lang.c:223
+#: src/lang.c:225
 msgid	"Rule created by: "
 msgstr	"Règle créée par : "
 
-#: src/lang.c:224
+#: src/lang.c:226
 #, c-format
 msgid	"Enter pattern [%s]> "
-msgstr	"Entrez le réglage [%s]> "
+msgstr	"Entrez le réglage [%s] > "
 
-#: src/lang.c:225
+#: src/lang.c:227
 #, c-format
 msgid	"\n"
 	"You requested followups to your article to go to the following %s:\n"
 msgstr	"\n"
 	"Vous avez souhaité que les réponses à votre article aillent au %s suivant :\n"
 
-#: src/lang.c:226
+#: src/lang.c:228
 #, c-format
 msgid	"  %s\t Answers will be directed to you by mail.\n"
-msgstr	"  %s\t Réponses vous seront envoyées par email.\n"
+msgstr	"  %s\t Les réponses vous seront envoyées par email.\n"
 
-#: src/lang.c:227
+#: src/lang.c:229
+msgid	"-- forwarded message --\n"
+msgstr	"-- message redirigé --\n"
+
+#: src/lang.c:230
+msgid	"-- end of forwarded message --\n"
+msgstr	"-- fin du message redirigé --\n"
+
+#: src/lang.c:231
 msgid	"# Format:\n"
 	"#   comment=STRING    Optional. Multiple lines allowed. Comments must be "
 	"placed\n"
@@ -1038,711 +1125,762 @@ msgid	"# Format:\n"
 	"#   xref=PATTERN      Optional. Kill pattern (e.g. alt.flame*)\n"
 	"#   time=NUM          Optional. time_t value when rule expires\n"
 	"#\n"
-msgstr	""
+msgstr	"# Format :\n"
+	"#   comment=TERME\tFacultatif. Plusieurs lignes acceptées.\n"
+	"#\t\t\tLes commentaires doivent êtres placés au\n"
+	"#\t\t\tdébut de la règle, sinon ils seront déplacés\n"
+	"#\t\t\tà la règle suivante. '#' n'est pas un mot-clé\n"
+	"#\t\t\tvalide pour un commentaire !\n"
+	"#   group=TERME\tOgligatoire. Liste de groupe (pe. fr.comp.*,!*sources*).\n"
+	"#   case=NUM\t\tOgligatoire. Casse sensible=0 / casse insensible=1.\n"
+	"#   score=NUM|TERME\tObligatoire. Score à attribuer. Soit :\n"
+	"#     score=NUM\t- Un numéro (pe. 70). Ou :\n"
+	"#     score=TERME\t- Un des deux mots-clé suivants : 'hot' ou 'kill'.\n"
+	"#   subj=TERME\t\tFacultatif. En-tête 'Subject:' (pe. Comment devenir un "
+	"gourou).\n"
+	"#   from=TERME\t\tFacultatif. En-tête 'From:' (pe. *Craig Shergold*).\n"
+	"#   msgid=TERME\tFacultatif. En-tête 'Message-ID:' (pe. <123@ether.net>) "
+	"avec\n"
+	"#\t\t\tréférence complète.\n"
+	"#   msgid_last=TERME\tFacultatif. Comme ci-dessus mais avec juste le dernier "
+	"MID.\n"
+	"#   msgid_only=TERME\tFacultatif. Comme ci-dessus mais sans les références.\n"
+	"#   refs_only=TERME\tFacultatif. En-tête 'References:' (pe. <123@ether.net>) "
+	"sans\n"
+	"#\t\t\tla ligne Message-ID:\n"
+	"#   lines=[<>]?NUM\tFacultatif. En-tête 'Lines:'. '<' ou '>' sont "
+	"optionnels.\n"
+	"#   gnksa=[<>]?NUM\tFacultatif. Résultat du 'parse_from' du GNKSA. '<' ou "
+	"'>'\n"
+	"#\t\t\tsont optionnels.\n"
+	"#   xref=CHAÎNE\tFacultatif. Chaîne à filtrer (pe. alt.flame*)\n"
+	"#   time=NUM\t\tFacultatif. La valeur de time_t indique la durée de la "
+	"règle.\n"
+	"#\n"
 
-#: src/lang.c:248
+#: src/lang.c:252
 #, c-format
 msgid	"Enter score for rule (default=%d): "
-msgstr	""
+msgstr	"Entrez le score (défaut=%d) : "
 
-#: src/lang.c:249
+#: src/lang.c:253
 #, c-format
 msgid	"Enter the score weight (range 0 < score <= %d)"
-msgstr	""
+msgstr	"Entrez la valeur du score (0 < score <= %d)"
 
 #. SCORE_MAX
-#: src/lang.c:250
+#: src/lang.c:254
 msgid	"Full"
-msgstr	"Complet"
+msgstr	"Tous"
 
-#: src/lang.c:251
+#: src/lang.c:255
 msgid	"Comment (optional)  : "
-msgstr	"Commentaire (optionnel) : "
+msgstr	"Commentaire (facultatif) : "
 
-#: src/lang.c:252
+#: src/lang.c:256
 msgid	"Apply pattern to    : "
-msgstr	"Appliquer le réglage à  : "
+msgstr	"Appliquer à     : "
 
-#: src/lang.c:253
+#: src/lang.c:257
 msgid	"From: line (ignore case)      "
-msgstr	"Ligne De : (ignorer la casse) "
+msgstr	"l'en-tête 'From:' (ignorer la casse)"
 
-#: src/lang.c:254
+#: src/lang.c:258
 msgid	"From: line (case sensitive)   "
-msgstr	"Ligne De : (casse sensible)   "
+msgstr	"l'en-tête 'From:' (casse sensible)"
 
-#: src/lang.c:256
+#: src/lang.c:260
 #, c-format
 msgid	"%s%s: Unknown host.\n"
 msgstr	"%s%s : Hôte inconnu.\n"
 
-#: src/lang.c:257
+#: src/lang.c:261
 msgid	"global "
 msgstr	"global "
 
-#: src/lang.c:258
+#: src/lang.c:262
 #, c-format
 msgid	"Please use %.100s instead"
 msgstr	"Utilisez svp %.100s à la place"
 
-#: src/lang.c:259
+#: src/lang.c:263
 #, c-format
-msgid	"Group %s is moderated. Continue?"
+msgid	"%s is bogus"
+msgstr	"%s pose problème"
+
+#: src/lang.c:264
+#, c-format
+msgid	"Group %s is moderated. Continue?"
 msgstr	"Groupe %s modéré. Continuer ?"
 
-#: src/lang.c:260
+#: src/lang.c:265
 msgid	"groups"
 msgstr	"groupes"
 
-#: src/lang.c:261
+#: src/lang.c:266
+#, c-format
+msgid	"Rereading %s..."
+msgstr	"Relecture de %s..."
+
+#: src/lang.c:267
 msgid	"Top Level Commands"
 msgstr	"Commandes niveau supérieur"
 
-#: src/lang.c:262
+#: src/lang.c:268
 msgid	"Group Selection"
-msgstr	"Sélection de groupe"
+msgstr	"Sélection du groupe"
 
-#: src/lang.c:263
+#: src/lang.c:269
 msgid	"group"
 msgstr	"groupe"
 
-#: src/lang.c:265
+#: src/lang.c:271
 msgid	"One or more lines of comment. <CR> to add a line or proceed if line is empty."
-msgstr	"Un ou plusieurs lignes de commentaire. <CR> pour ajouter une ligne ou "
-	"procéder si vide."
+msgstr	"Inclure un commentaire. <RETOUR> pour ajouter une ligne ou continuer si vide."
 
-#: src/lang.c:266
+#: src/lang.c:272
 msgid	"From: line to add to filter file. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Filtrer l'en-tête 'From:'. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:267
+#: src/lang.c:273
 msgid	"Linecount of articles to be filtered. < for less, > for more, = for equal."
-msgstr	""
+msgstr	"Filtrer selon le nombre de lignes. < pour moins, > pour plus, = pareil."
 
-#: src/lang.c:268
+#: src/lang.c:274
 msgid	"Message-ID: line to add to filter file. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Filtrer l'en-tête 'Message-ID'. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:269
+#: src/lang.c:275
 msgid	"Subject: line to add to filter file. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Filtrer l'en-tête 'Subject'. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:270
+#: src/lang.c:276
 msgid	"Enter text pattern to filter if Subject: & From: lines are not what you want."
-msgstr	""
+msgstr	"Terme à filtrer si autre que les en-têtes 'Subject:' & 'From:'."
 
-#: src/lang.c:271
+#: src/lang.c:277
 msgid	"Select where text pattern should be applied. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Sur quel en-tête appliquer ce terme. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:272
+#: src/lang.c:278
 msgid	"Expiration time in days for the entered filter. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Durée (en nombre de jours) du filtre. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:273
+#: src/lang.c:279
 msgid	"Apply kill only to current group or all groups. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Filtrer groupe actuel ou tous. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:274
+#: src/lang.c:280
 msgid	"Apply select to current group or all groups. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Appliquer règle au groupe actuel ou à tous. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:275
+#: src/lang.c:281
 msgid	"kill an article via a menu"
 msgstr	"filtrer un article via un menu"
 
-#: src/lang.c:276
+#: src/lang.c:282
 msgid	"auto-select (hot) an article via a menu"
 msgstr	"sélection auto. (hot) d'un article via un menu"
 
-#: src/lang.c:277
+#: src/lang.c:283
 msgid	"Browse URLs in article"
 msgstr	"Voir les URLs dans l'article"
 
-#: src/lang.c:278
+#: src/lang.c:284
 msgid	"0 - 9\t  display article by number in current thread"
-msgstr	"0 - 9\t affiche les articles par numéro du fil actuel"
+msgstr	"0 - 9\t  affiche les articles par numéro du fil actuel"
 
-#: src/lang.c:279
-msgid	"cancel (delete) current article; must have been posted by you"
-msgstr	"annuler (effacer) l'article actuel; a dû être posté par vous"
+#: src/lang.c:285
+msgid	"cancel (delete) or supersede (overwrite) current article"
+msgstr	"annuler (effacer) ou remplacer (écraser) l'article actuel"
 
-#: src/lang.c:280
+#: src/lang.c:286
 msgid	"edit article (mail-groups only)"
 msgstr	"éditer l'article (groupes de messagerie uniquement)"
 
-#: src/lang.c:281
+#: src/lang.c:287
 msgid	"display first article in current thread"
 msgstr	"afficher le 1er article du fil actuel"
 
-#: src/lang.c:282
+#: src/lang.c:288
 msgid	"display first page of article"
 msgstr	"afficher la 1ère page de l'article"
 
-#: src/lang.c:283
+#: src/lang.c:289
 msgid	"post followup to current article"
 msgstr	"poster un suivi pour l'article actuel"
 
-#: src/lang.c:284
+#: src/lang.c:290
 msgid	"post followup (don't copy text) to current article"
 msgstr	"poster un suivi (ne pas copier le texte) pour l'article actuel"
 
-#: src/lang.c:285
+#: src/lang.c:291
 msgid	"post followup to current article quoting complete headers"
 msgstr	"poster un suivi pour l'article actuel en citant les en-têtes"
 
-#: src/lang.c:286
+#: src/lang.c:292
 msgid	"display last article in current thread"
 msgstr	"afficher le dernier article du fil actuel"
 
-#: src/lang.c:287
+#: src/lang.c:293
 msgid	"display last page of article"
 msgstr	"afficher la dernière page de l'article"
 
-#: src/lang.c:288
+#: src/lang.c:294
 msgid	"mark rest of thread as read and advance to next unread"
 msgstr	"marquer comme lu le reste du fil et aller au fil non lu suivant"
 
-#: src/lang.c:289
+#: src/lang.c:295
 msgid	"display next article"
 msgstr	"afficher l'article suivant"
 
-#: src/lang.c:290
+#: src/lang.c:296
 msgid	"display first article in next thread"
 msgstr	"afficher le 1er article du fil suivant"
 
-#: src/lang.c:291 src/lang.c:298 src/lang.c:357 src/lang.c:358
+#: src/lang.c:297
 msgid	"display next unread article"
 msgstr	"afficher le prochain article non lu"
 
-#: src/lang.c:292
+#: src/lang.c:298
 msgid	"go to the article that this one followed up"
 msgstr	"aller à l'article parent"
 
-#: src/lang.c:293
+#: src/lang.c:299
 msgid	"display previous article"
 msgstr	"afficher l'article précédent"
 
-#: src/lang.c:294 src/lang.c:360
+#: src/lang.c:300
 msgid	"display previous unread article"
 msgstr	"afficher l'article précédent non lu"
 
-#: src/lang.c:295
+#: src/lang.c:301
 msgid	"quickly kill an article using defaults"
 msgstr	"filtrer rapidement un article en utilisant les défauts"
 
-#: src/lang.c:296
+#: src/lang.c:302
 msgid	"quickly auto-select (hot) an article using defaults"
-msgstr	"sélection auto. (hot) un article en utilisant les défauts"
+msgstr	"sélection auto. (hot) d'un article en utilisant les défauts"
 
-#: src/lang.c:297
+#: src/lang.c:303
 msgid	"return to group selection level"
 msgstr	"retourner à la vue sélection de groupe"
 
-#: src/lang.c:299
+#: src/lang.c:304
 msgid	"reply through mail to author"
 msgstr	"répondre par email à l'auteur"
 
-#: src/lang.c:300
+#: src/lang.c:305
 msgid	"reply through mail (don't copy text) to author"
 msgstr	"répondre (ne pas copier le texte) par email à l'auteur"
 
-#: src/lang.c:301
+#: src/lang.c:306
 msgid	"reply through mail to author quoting complete headers"
 msgstr	"répondre par email à l'auteur en citant les en-têtes"
 
-#: src/lang.c:302 src/lang.c:362
+#: src/lang.c:307
 msgid	"repost chosen article to another group"
 msgstr	"reposter l'article choisi dans un autre groupe"
 
-#: src/lang.c:303
+#: src/lang.c:308
 msgid	"search backwards within this article"
 msgstr	"recherche arrière dans cet article"
 
-#: src/lang.c:304
+#: src/lang.c:309
 msgid	"search forwards within this article"
 msgstr	"recherche avant dans cet article"
 
-#: src/lang.c:305
+#: src/lang.c:310
 msgid	"show article in raw-mode (including all headers)"
 msgstr	"afficher la source des articles (incluant les en-têtes)"
 
-#: src/lang.c:306
+#: src/lang.c:311
 msgid	"skip next block of included text"
 msgstr	"passer au bloc suivant incluant du texte"
 
-#: src/lang.c:307
+#: src/lang.c:312
 msgid	"toggle display of sections hidden by a form-feed (^L) on/off"
 msgstr	"(dés)activer l'affichage des sections masquer par (^L)"
 
-#: src/lang.c:308
+#: src/lang.c:313
 msgid	"toggle word highlighting on/off"
 msgstr	"(dés)activer la surbrillance des mots"
 
-#: src/lang.c:309
+#: src/lang.c:314
 msgid	"toggle ROT-13 (basic decode) for current article"
 msgstr	"(dés)activer ROT-13 (décodage basic) pour l'article actuel"
 
-#: src/lang.c:310
+#: src/lang.c:315
 msgid	"toggle tabwidth 4 <-> 8"
-msgstr	"(dés)activer taille de tabulation 4 <-> 8"
+msgstr	"basculer la taille de tabulation 4 <-> 8"
 
-#: src/lang.c:311
+#: src/lang.c:316
 msgid	"toggle german TeX style decoding for current article"
-msgstr	"(dés)activer le décodage de type TeX allemand pour l'article actuel"
+msgstr	"(dés)activer le décodage Allemand de type TeX pour l'article actuel"
 
-# TRANSLATION MISSING
-#: src/lang.c:312
+#: src/lang.c:317
 msgid	"toggle display of uuencoded sections"
-msgstr	""
+msgstr	"(dés)activer l'affichage des sections uuencodées"
 
-#: src/lang.c:313
+#: src/lang.c:318
 msgid	"View/save multimedia attachments"
 msgstr	"Voir/enregistrer les pj multimédia"
 
-#: src/lang.c:314
+#: src/lang.c:319
 #, c-format
 msgid	"report bug or comment via mail to %s"
-msgstr	"envoi d'un report de bug ou de commentaires à %s"
+msgstr	"signaler un bug ou envoi d'un commentaires à %s"
 
-#: src/lang.c:315
+#: src/lang.c:320
 msgid	"choose range of articles to be affected by next command"
 msgstr	"choisir les articles qui seront affectés par la commande suivante"
 
-#: src/lang.c:316
+#: src/lang.c:321
 msgid	"escape from command prompt"
 msgstr	"quitter le prompt"
 
-#: src/lang.c:317
+#: src/lang.c:322
+msgid	"edit filter file"
+msgstr	"éditer les filtres"
+
+#: src/lang.c:323
 msgid	"get help"
-msgstr	"avoir de l'aide"
+msgstr	"voir l'aide"
 
-#: src/lang.c:318
+#: src/lang.c:324
 msgid	"display last article viewed"
 msgstr	"afficher le dernier article lu"
 
-#: src/lang.c:319
+#: src/lang.c:325
 msgid	"down one line"
 msgstr	"descendre d'une ligne"
 
-#: src/lang.c:320
+#: src/lang.c:326
 msgid	"up one line"
 msgstr	"monter d'une ligne"
 
-#: src/lang.c:321
+#: src/lang.c:327
 msgid	"go to article chosen by Message-ID"
 msgstr	"aller à l'article via son Message-ID"
 
-#: src/lang.c:322
+#: src/lang.c:328
 msgid	"mail article/thread/hot/pattern/tagged articles to someone"
 msgstr	"envoyer article/fil/sél./articles marqués à une personne"
 
-#: src/lang.c:323
+#: src/lang.c:329
 msgid	"menu of configurable options"
 msgstr	"menu des options réglables"
 
-#: src/lang.c:324
+#: src/lang.c:330
 msgid	"down one page"
 msgstr	"descendre d'une page"
 
-#: src/lang.c:325
+#: src/lang.c:331
 msgid	"up one page"
 msgstr	"monter d'une page"
 
-#: src/lang.c:326
+#: src/lang.c:332
 msgid	"post (write) article to current group"
-msgstr	"poster (écrire) l'article dans le groupe actuel"
+msgstr	"poster (écrire) un article dans le groupe actuel"
 
-#: src/lang.c:327
+#: src/lang.c:333
 msgid	"post postponed articles"
 msgstr	"poster les brouillons"
 
-#: src/lang.c:328
+#: src/lang.c:334
 msgid	"list articles posted by you (from posted file)"
 msgstr	"lister les articles postés par vous (fichier posted)"
 
-#: src/lang.c:329
+#: src/lang.c:335
 msgid	"return to previous menu"
 msgstr	"retourner au menu précédent"
 
-#: src/lang.c:330
+#: src/lang.c:336
 msgid	"quit tin immediately"
 msgstr	"quitter tin immédiatement"
 
-#: src/lang.c:331
+#: src/lang.c:337
 msgid	"redraw page"
-msgstr	"redessiner la page"
+msgstr	"rafraîchir la page"
 
-#: src/lang.c:332
+#: src/lang.c:338
 msgid	"save article/thread/hot/pattern/tagged articles to file"
 msgstr	"enregistrer article/fil/sél./articles marqués dans un fichier"
 
-#: src/lang.c:333
+#: src/lang.c:339
 msgid	"save marked articles automatically without user prompts"
 msgstr	"enregistrement auto. des articles marqués sans demander"
 
-#: src/lang.c:334
+#: src/lang.c:340
+msgid	"scroll the screen one line down"
+msgstr	"défiler une page par une page"
+
+#: src/lang.c:341
+msgid	"scroll the screen one line up"
+msgstr	"remonter une page par une page"
+
+#: src/lang.c:342
 msgid	"search for articles by author backwards"
 msgstr	"recherche arrière d'articles par auteur"
 
-#: src/lang.c:335
+#: src/lang.c:343
 msgid	"search for articles by author forwards"
 msgstr	"recherche avant d'articles par auteur"
 
-#: src/lang.c:336
+#: src/lang.c:344
 msgid	"search all articles for a given string (this may take some time)"
 msgstr	"rechercher partout un terme précis (cela peut prendre du temps)"
 
-#: src/lang.c:337
+#: src/lang.c:345
 msgid	" \t  (searches are case-insensitive and wrap around to all articles)"
-msgstr	" \t  (recherches ignorent la casse et se cantonne à tous les articles)"
+msgstr	" \t  (recherche ignore la casse et se cantonne à tous les articles)"
 
-#: src/lang.c:338
+#: src/lang.c:346
 msgid	"search for articles by Subject line backwards"
 msgstr	"recherche arrière d'articles par Sujet"
 
-#: src/lang.c:339
+#: src/lang.c:347
 msgid	"search for articles by Subject line forwards"
 msgstr	"recherche avant d'articles par Sujet"
 
-#: src/lang.c:340
+#: src/lang.c:348
 msgid	"repeat last search"
-msgstr	"répéter la dernière recherche"
+msgstr	"relancer la dernière recherche"
 
-#: src/lang.c:341
+#: src/lang.c:349
 msgid	"tag current article for reposting/mailing/piping/printing/saving"
 msgstr	"marquer article pour repostage/envoi/passer/imprimer/enregistrer"
 
-#: src/lang.c:342
+#: src/lang.c:350
 msgid	"toggle info message in last line (subject/description)"
-msgstr	"(dés)activer les infos dans la dernière ligne (sujet/description)"
+msgstr	"afficher ou non les infos dans la dernière ligne (sujet/description)"
 
-#: src/lang.c:343
+#: src/lang.c:351
 msgid	"toggle inverse video"
-msgstr	"(dés)activer vidéo inversée"
+msgstr	"afficher ou non la vidéo inversée"
 
-#: src/lang.c:344
+#: src/lang.c:352
 msgid	"toggle mini help menu display"
-msgstr	"(dés)activer vue du mini menu aide"
+msgstr	"afficher ou non le petit menu d'aide"
 
-#: src/lang.c:345
+#: src/lang.c:353
+msgid	"cycle the display of authors email address, real name, both or neither"
+msgstr	"afficher cycliquement l'email des auteurs, nom réel, les deux ou aucun"
+
+#: src/lang.c:354
 msgid	"show version information"
 msgstr	"afficher la version de tin"
 
-#: src/lang.c:346
+#: src/lang.c:355
 msgid	"mark all articles as read and return to group selection menu"
 msgstr	"marquer tous les articles comme lus et retourner au menu groupe"
 
-#: src/lang.c:347
+#: src/lang.c:356
 msgid	"mark all articles as read and enter next group with unread articles"
 msgstr	"tout marquer comme lu et entrer dans le prochain groupe non lu"
 
-#: src/lang.c:348
+#: src/lang.c:357
 msgid	"choose first thread in list"
 msgstr	"choisir le 1er fil de la liste"
 
-#: src/lang.c:349 src/lang.c:380
-msgid	"choose group by name"
-msgstr	"choisir le groupe par nom"
-
-#: src/lang.c:350
+#: src/lang.c:358
 msgid	"choose last thread in list"
 msgstr	"choisir le dernier fil de la liste"
 
-#: src/lang.c:351
+#: src/lang.c:359
 msgid	"list articles within current thread (bring up Thread sub-menu)"
 msgstr	"lister les articles du fil actuel (sous-menu fil)"
 
-#: src/lang.c:352
+#: src/lang.c:360
 msgid	"mark article as unread"
 msgstr	"marquer l'article comme non lu"
 
-#: src/lang.c:353
+#: src/lang.c:361
 msgid	"mark current thread or tagged threads as read"
-msgstr	""
+msgstr	"marquer le fil actuel ou les fils marqués comme lus"
 
-#: src/lang.c:354
+#: src/lang.c:362
 msgid	"mark thread as unread"
 msgstr	"marquer le fil comme non lu"
 
-#: src/lang.c:355
+#: src/lang.c:363
 msgid	"toggle display of all/selected articles"
 msgstr	"(dés)activer la vue de tout article/articles sélectionnés"
 
-#: src/lang.c:356
+#: src/lang.c:364
 msgid	"display next group"
 msgstr	"afficher le groupe suivant"
 
-#: src/lang.c:359
+#: src/lang.c:365
 msgid	"display previous group"
 msgstr	"afficher le groupe précédent"
 
-#: src/lang.c:361 src/lang.c:409
-msgid	"read chosen article"
-msgstr	"lire l'article choisi"
-
-#: src/lang.c:363
+#: src/lang.c:366
 msgid	"toggle all selections (all articles)"
 msgstr	"(dés)activer toutes les sélections (tout article)"
 
-#: src/lang.c:364
+#: src/lang.c:367
 msgid	"select group (make \"hot\")"
 msgstr	"sélection du groupe (utiliser \"hot\")"
 
-#: src/lang.c:365
+#: src/lang.c:368
 msgid	"select thread"
 msgstr	"sélectionner le fil"
 
-#: src/lang.c:366
+#: src/lang.c:369
 msgid	"select threads if at least one unread article is selected"
 msgstr	"sél. les fils si au moins un article non lu est sélectionné"
 
-#: src/lang.c:367
+#: src/lang.c:370
 msgid	"select threads that match user specified pattern"
 msgstr	"sélectionner les fils qui correspondent au critère choisi"
 
-#: src/lang.c:368
+#: src/lang.c:371
 msgid	"tag all parts of current multipart-message in order"
 msgstr	"marquer dans l'ordre toutes parties du message multiparties"
 
-#: src/lang.c:369
+#: src/lang.c:372
 msgid	"0 - 9\t  choose thread by number"
 msgstr	"0 - 9\t  choisir le fil par numéro"
 
-#: src/lang.c:370
+#: src/lang.c:373
 msgid	"toggle limit number of articles to get, and reload"
 msgstr	"(dés)activer le nombre limite d'article à charger et à recharger"
 
-#: src/lang.c:371
+#: src/lang.c:374
 msgid	"toggle display of all/unread articles"
 msgstr	"(dés)activer l'affichage de tout article/articles non lus"
 
-#: src/lang.c:372 src/lang.c:410
-msgid	"cycle the display of authors email address, real name, both or neither"
-msgstr	"afficher cycliquement l'email des auteurs, nom réel, les deux ou aucun"
-
-#: src/lang.c:373
+#: src/lang.c:375
 msgid	"toggle selection of thread"
 msgstr	"(dés)activer sélection du fil"
 
-#: src/lang.c:374
+#: src/lang.c:376
 msgid	"cycle through threading options available"
 msgstr	"voir toutes les options de groupage disponibles"
 
-#: src/lang.c:375
+#: src/lang.c:377
 msgid	"undo all selections (all articles)"
 msgstr	"annuler toutes sélections (tout article)"
 
-#: src/lang.c:376
+#: src/lang.c:378
 msgid	"untag all tagged threads"
 msgstr	"démarquer tout fil marqué"
 
-#: src/lang.c:377
+#: src/lang.c:379
 msgid	"mark all articles in group as read"
 msgstr	"marquer lu tous les articles du groupe"
 
-# TRANSLATION MISSING (71 chars max)
-#: src/lang.c:378
+#: src/lang.c:380
 msgid	"mark all articles in group as read and move to next unread group"
-msgstr	"marquer tout article dans groupe comme lu et aller au groupe non lu suivant"
+msgstr	"marquer lu le groupe et aller au groupe non lu suivant"
 
-#: src/lang.c:379
+#: src/lang.c:381
 msgid	"choose first group in list"
-msgstr	"choisir 1er groupe de la liste"
+msgstr	"choisir le 1er groupe de la liste"
 
-#: src/lang.c:381
+#: src/lang.c:382
+msgid	"choose group by name"
+msgstr	"choisir le groupe par nom"
+
+#: src/lang.c:383
 msgid	"0 - 9\t  choose group by number"
-msgstr	"0 - 9\t  choisir groupe par numéro"
+msgstr	"0 - 9\t  choisir un groupe par son numéro"
 
-#: src/lang.c:382
+#: src/lang.c:384
 msgid	"choose range of groups to be affected by next command"
 msgstr	"choisir les groupes affectés par la commande suivante"
 
-#: src/lang.c:383
+#: src/lang.c:385
 msgid	"choose last group in list"
-msgstr	"choisir dernier groupe de la liste"
+msgstr	"choisir le dernier groupe de la liste"
 
-#: src/lang.c:384
+#: src/lang.c:386
 msgid	"mark all articles in chosen group unread"
 msgstr	"marquer non lu tout article dans le groupe choisi"
 
-#: src/lang.c:385
+#: src/lang.c:387
 msgid	"move chosen group within list"
-msgstr	"déplacer dans la liste le groupe choisi"
+msgstr	"déplacer le groupe sélectionné"
 
-#: src/lang.c:386
+#: src/lang.c:388
 msgid	"choose next group with unread news"
-msgstr	"choisir groupe suivant ayant articles non lus"
+msgstr	"choisir le groupe suivant ayant articles non lus"
 
-#: src/lang.c:387 src/lang.c:1176
+#: src/lang.c:389 src/lang.c:1197
 msgid	"quit"
 msgstr	"quitter"
 
-#: src/lang.c:388
+#: src/lang.c:390
 msgid	"quit without saving configuration changes"
 msgstr	"quitter sans enregistrer les changements"
 
-#: src/lang.c:389
+#: src/lang.c:391
 msgid	"read chosen group"
 msgstr	"lire le groupe choisi"
 
-#: src/lang.c:390
+#: src/lang.c:392
 msgid	"reset .newsrc (all available articles in groups marked unread)"
 msgstr	"réinitialiser .newsrc (tout sera marqué non lu dans les groupes)"
 
-#: src/lang.c:391
+#: src/lang.c:393
 msgid	"search backwards for a group name"
 msgstr	"recherche arrière d'un groupe"
 
-#: src/lang.c:392
+#: src/lang.c:394
 msgid	" \t  (all searches are case-insensitive and wrap around)"
 msgstr	" \t  (les recherches sont sensibles à la casse)"
 
-#: src/lang.c:393
+#: src/lang.c:395
 msgid	"search forwards for a group name"
 msgstr	"recherche avant d'un groupe"
 
-#: src/lang.c:394
+#: src/lang.c:396
 msgid	"subscribe to chosen group"
-msgstr	"abonnement au groupe choisi"
+msgstr	"s'abonner au groupe sélectionné"
 
-#: src/lang.c:395
+#: src/lang.c:397
 msgid	"subscribe to groups that match pattern"
 msgstr	"abonnement aux groupes correspondant au critère"
 
-#: src/lang.c:396
+#: src/lang.c:398
 msgid	"reread active file to check for any new news"
-msgstr	"relire le fichier active pour vérifier nouveaux articles"
+msgstr	"vérifier l'existence de nouveaux articles"
 
-#: src/lang.c:397
+#: src/lang.c:399
 msgid	"toggle display of group name only or group name plus description"
-msgstr	""
+msgstr	"afficher ou non le nom du groupe ou le nom + sa description"
 
-#: src/lang.c:398
+#: src/lang.c:400
 msgid	"toggle display to show all/unread subscribed groups"
 msgstr	"afficher ou non tous les groupes abonnés non lu"
 
-#: src/lang.c:399
+#: src/lang.c:401
 msgid	"unsubscribe from chosen group"
-msgstr	"désabonnement du groupe choisi"
+msgstr	"se désabonner du groupe sélectionné"
 
-#: src/lang.c:400
+#: src/lang.c:402
 msgid	"unsubscribe from groups that match pattern"
 msgstr	"désabonnement aux groupes correspondant au critère"
 
-#: src/lang.c:401
+#: src/lang.c:403
 msgid	"sort the list of groups"
 msgstr	"trier la liste des groupes"
 
-#: src/lang.c:402
+#: src/lang.c:404
 msgid	"toggle display to show all/subscribed groups"
 msgstr	"afficher ou non tous les groupes abonnés"
 
-#: src/lang.c:403
+#: src/lang.c:405
 msgid	"0 - 9\t  choose article by number"
 msgstr	"0 - 9\t  choisir article par numéro"
 
-#: src/lang.c:404
+#: src/lang.c:406
 msgid	"mark thread as read and return to group index page"
 msgstr	"marquer le fil comme lu et revenir à la liste des groupes"
 
-#: src/lang.c:405
+#: src/lang.c:407
 msgid	"mark thread as read and enter next unread thread or group"
 msgstr	"marquer le fil comme lu et aller dans le fil ou groupe non lu suivant"
 
-#: src/lang.c:406
+#: src/lang.c:408
 msgid	"choose first article in list"
 msgstr	"choisir le 1er article dans la liste"
 
-#: src/lang.c:407
+#: src/lang.c:409
 msgid	"choose last article in list"
 msgstr	"choisir le dernier article dans la liste"
 
-# TRANSLATION MISSING
-#: src/lang.c:408
+# TRANSLATION TOO LONG
+#: src/lang.c:410
 msgid	"mark article or tagged articles as read and move cursor to next unread article"
-msgstr	""
+msgstr	"marquer l'article ou les articles marqués comme lus et aller au prochain "
+	"article non lu"
 
 #: src/lang.c:411
+msgid	"read chosen article"
+msgstr	"lire l'article choisi"
+
+#: src/lang.c:412
 msgid	"Display properties\n"
 	"------------------"
 msgstr	"Propriétés de l'affichage\n"
 	"-------------------------"
 
-#: src/lang.c:412
+#: src/lang.c:413
 msgid	"Miscellaneous\n"
 	"-------------"
 msgstr	"Divers\n"
 	"------"
 
-#: src/lang.c:413
+#: src/lang.c:414
 msgid	"Moving around\n"
 	"-------------"
 msgstr	"Navigation\n"
 	"----------"
 
-#: src/lang.c:414
+#: src/lang.c:415
 msgid	"Group/thread/article operations\n"
 	"-------------------------------"
-msgstr	"Opérations sur les Groupes/fils/articles\n"
-	"----------------------------------------"
+msgstr	"Opérations sur les Groupes / fils / articles\n"
+	"--------------------------------------------"
 
-#: src/lang.c:416
+#: src/lang.c:417
 msgid	"Group Level Commands"
 msgstr	"Commandes du niveau Groupe"
 
-#: src/lang.c:417
+#: src/lang.c:418
 msgid	"Kill filter added"
 msgstr	"Filtre ajouté"
 
-#: src/lang.c:418
+#: src/lang.c:419
 msgid	"Auto-selection filter added"
 msgstr	"Filtre à auto-sélection ajouté"
 
-#: src/lang.c:419
+#: src/lang.c:420
 msgid	"All parts tagged"
 msgstr	"Toutes les parties sont marquées"
 
-#: src/lang.c:420
+#: src/lang.c:421
 msgid	"Storing article for later posting"
-msgstr	"Stockage de l'article afin de la poster plus tard"
+msgstr	"Stockage de l'article afin de le poster plus tard"
 
-#: src/lang.c:421
+#: src/lang.c:422
 msgid	"Please enter a valid character"
 msgstr	"Entrez un caractère valide svp"
 
-#: src/lang.c:422
+#: src/lang.c:423
 #, c-format
 msgid	"Missing part #%d"
 msgstr	"Partie manquante #%d"
 
-#: src/lang.c:423
+#: src/lang.c:424
 msgid	"*** No postponed articles ***"
-msgstr	"*** Pas de brouillons ***"
+msgstr	"*** Aucun brouillon ***"
 
-#: src/lang.c:424
+#: src/lang.c:425
 msgid	"Not a multi-part message"
 msgstr	"N'est pas un message en plusieurs parties"
 
-#: src/lang.c:425
+#: src/lang.c:426
 msgid	"You are not subscribed to this group"
 msgstr	"Vous n'êtes pas abonné à ce groupe"
 
-#: src/lang.c:426
+#: src/lang.c:427
 msgid	"No previous expression"
 msgstr	"Pas d'expression précédente"
 
-#: src/lang.c:427
+#: src/lang.c:428
 msgid	"Operation disabled in no-overwrite mode"
 msgstr	"Opération désactivée en mode lecture"
 
 #. TODO: replace hardcoded key-name in txt_info_postponed
-#: src/lang.c:429
+#: src/lang.c:430
 #, c-format
 msgid	"%d postponed %s, reuse with ^O...\n"
-msgstr	"%d brouillon(s) %s, réutilisez-les avec ^O...\n"
+msgstr	"%d %s brouillon(s), réutilisez-le(s) avec ^O...\n"
 
-#: src/lang.c:430
+#: src/lang.c:431
 msgid	"X-Conversion-Note: multipart/alternative contents have been removed.\n"
 	"  To get the whole article, turn alternative handling OFF in the Option Menu\n"
 msgstr	"X-Conversion-Note : contenus multiparties/alternatifs retirés.\n"
@@ -1750,21 +1888,21 @@ msgstr	"X-Conversion-Note : contenus mul
 	"dans\n"
 	"  le Menu Option.\n"
 
-#: src/lang.c:432
+#: src/lang.c:433
 #, c-format
 msgid	"Save filename for %s/%s is a mailbox. Attachment not saved"
 msgstr	"Enregistrer le fichier sous %s %s est une bàl. PJ non enregistrée"
 
-#: src/lang.c:433
+#: src/lang.c:434
 msgid	"TeX2Iso encoded article"
 msgstr	"Article encodé en TeX2Iso"
 
-#: src/lang.c:434
+#: src/lang.c:435
 msgid	"incomplete "
 msgstr	"incomplet "
 
 #. TODO: replace hardcoded key-names
-#: src/lang.c:436
+#: src/lang.c:437
 #, c-format
 msgid	"\n"
 	"Welcome to %s, a full screen threaded Netnews reader. It can read news "
@@ -1799,157 +1937,168 @@ msgid	"\n"
 	"files.\n"
 	"Please send bug-reports/comments to %s with the 'R' command.\n"
 msgstr	"\n"
-	"Bienvenue dans %s, un lecteur de forums UseNet. Pouvant également lire un "
-	"spool local\n"
-	"(p.e. <spool>/news) ou depuis un serveur NNTP (Network News Transport "
-	"Protocol) distant (avec l'option -r). L'option -h liste les options "
+	"Bienvenue dans %s, un lecteur de groupes UseNet. Pouvant également lire un\n"
+	"spool local (p.e. <spool>/news) ou depuis un serveur NNTP (Network News\n"
+	"Transport Protocol) distant (avec l'option -r). L'option -h liste les "
+	"options\n"
 	"principales de la ligne de commande.\n"
 	"\n"
-	"%s a quatre niveaux, la liste des groupes, l'index du groupe, le contenu du "
-	"fil de discussion, la visualisation de l'article. Une aide est visible depuis "
+	"%s a quatre niveaux, la liste des groupes, l'index du groupe, le contenu du\n"
+	"fil de discussion, la visualisation de l'article. Une aide est visible "
+	"depuis\n"
 	"chaque niveaux en appuyant simplement sur 'h'.\n"
 	"\n"
-	"Déplacez-vous en utilisant les touches fléchées ou bien 'j' et 'k'. Utilisez "
-	"PgUp/PgDn ou Ctrl-U et Ctrl-D pour faire défiler la page de haut en bas. "
+	"Déplacez-vous en utilisant les touches fléchées ou bien 'j' et 'k'. Utilisez\n"
+	"PgUp/PgDn ou Ctrl-U et Ctrl-D pour faire défiler la page de haut en bas.\n"
 	"Entrez dans un groupe en appuyant sur RETOUR/TAB.\n"
 	"\n"
-	"Les articles, fils, articles marqués ou articles correspondant à un critère "
-	"peuvent être envoyés par mail\n"
-	"(commande 'm'), imprimés (commande 'o'), enregistrés (commande 's'), passés "
-	"dans un tuyau (commande '|').\n"
-	"Utilisez la commande 'w' pour poster un nouvel article, les commandes 'f'/'F' "
+	"Les articles, fils, articles marqués ou articles correspondant à un critère\n"
+	"peuvent être envoyés par mail (commande 'm'), imprimés (commande 'o'),\n"
+	"enregistrés (commande 's'), passés dans un tuyau (commande '|').\n"
+	"Utilisez la commande 'w' pour poster un nouvel article, les commandes "
+	"'f'/'F'\n"
 	"pour poster un suivi en réponse à un article existant et les commandes "
-	"'r'/'R' pour répondre par mail à l'auteur de l'article auquel vous répondez. "
+	"'r'/'R'\n"
+	"pour répondre par mail à l'auteur de l'article auquel vous répondez.\n"
 	"La commande 'M' permet de configurer %s via un menu.\n"
 	"\n"
-	"Pour plus d'informations, lisez les pages de manuel, ainsi que les fichiers  "
+	"Pour plus d'informations, lisez les pages de manuel, ainsi que les fichiers\n"
 	"README, INSTALL, TODO et FTP.\n"
-	"Si vous constatez des bogues ou tout autre problème, envoyez s'il vous plaît "
+	"Si vous constatez des bogues ou tout autre problème, envoyez s'il vous plaît\n"
 	"un rapport de bogue/commentaires à %s via la touche 'R'.\n"
 
-#: src/lang.c:452
+#: src/lang.c:453
 #, c-format
 msgid	"Invalid  From: %s  line. Read the INSTALL file again."
-msgstr	"Ligne From: %s invalide. Lisez le fichier INSTALL une 2e fois."
+msgstr	"En-tête From: %s invalide. Lisez le fichier INSTALL une 2e fois."
 
-#: src/lang.c:453
+# TRANSLATION MISSING
+#: src/lang.c:455
+msgid	"Invalid multibyte sequence found\n"
+msgstr	""
+
+#: src/lang.c:457
 #, c-format
 msgid	"Invalid  Sender:-header %s"
 msgstr	"En-tête Sender: %s invalide"
 
-#: src/lang.c:454
+#: src/lang.c:458
 msgid	"Inverse video disabled"
 msgstr	"Vidéo inversée désactivée"
 
-#: src/lang.c:455
+#: src/lang.c:459
 msgid	"Inverse video enabled"
 msgstr	"Vidéo inversée activée"
 
-#: src/lang.c:457
+#: src/lang.c:461
 #, c-format
 msgid	"Missing definition for %s\n"
 msgstr	"Définition manquante pour %s\n"
 
-#: src/lang.c:458
+#: src/lang.c:462
 #, c-format
 msgid	"Invalid key definition '%s'\n"
 msgstr	"Définition de clé invalide '%s'\n"
 
-#: src/lang.c:459
+#: src/lang.c:463
 #, c-format
 msgid	"Invalid keyname '%s'\n"
 msgstr	"Nom de clé invalide '%s'\n"
 
-#: src/lang.c:460
+#: src/lang.c:464
 #, c-format
-msgid	"Key '%s' is defined for both %s%s and %s%s\n"
-msgstr	"Clé '%s' est définie pour %s%s et %s%s\n"
+msgid	"Keymap file was upgraded to version %s\n"
+msgstr	"Le fichier keymap a été mis à jour en version %s\n"
 
-#: src/lang.c:461
+#: src/lang.c:465
 #, c-format
-msgid	"Kill From:     [%-*.*s] (y/n): "
-msgstr	""
+msgid	"Kill From:     [%s] (y/n): "
+msgstr	"   De : [%s] (o/n) : "
 
-#: src/lang.c:462
+#: src/lang.c:466
 msgid	"Kill Lines: (</>num): "
-msgstr	""
+msgstr	"Nombre de lignes (</>num)    : "
 
-#: src/lang.c:463
+#: src/lang.c:467
 msgid	"Kill Article Menu"
-msgstr	""
+msgstr	"Créer un filtre"
 
-#: src/lang.c:464
+#: src/lang.c:468
 #, c-format
-msgid	"Kill Msg-Id:   [%-*.*s] (f/l/o/n): "
-msgstr	""
+msgid	"Kill Msg-Id:   [%s] (f/l/o/n): "
+msgstr	"  MID : [%s] (t/d/a/n) : "
 
-#: src/lang.c:465
+#: src/lang.c:469
 msgid	"Kill pattern scope  : "
-msgstr	""
+msgstr	"Filtre s'appliquant à : "
 
-#: src/lang.c:466
+#: src/lang.c:470
 #, c-format
-msgid	"Kill Subject:  [%-*.*s] (y/n): "
-msgstr	""
+msgid	"Kill Subject:  [%s] (y/n): "
+msgstr	"Sujet : [%s] (o/n) : "
 
-#: src/lang.c:467
+#: src/lang.c:471
 msgid	"Kill text pattern   : "
-msgstr	""
+msgstr	"Texte à filtrer : "
 
-#: src/lang.c:468
+#: src/lang.c:472
 msgid	"Kill time in days   : "
-msgstr	""
+msgstr	"Durée du filtre              : "
 
-#: src/lang.c:470
+#: src/lang.c:474
 msgid	"Last"
 msgstr	"Dernier"
 
-#: src/lang.c:471
+#: src/lang.c:475
 msgid	"-- Last response --"
 msgstr	"-- Dernière réponse --"
 
-#: src/lang.c:472
+#: src/lang.c:476
 #, c-format
 msgid	"Lines %s  "
-msgstr	"Ligne %s  "
+msgstr	"%s lignes "
 
-#: src/lang.c:474
+#: src/lang.c:478
 msgid	"Message-ID: line              "
-msgstr	""
+msgstr	"l'en-tête 'Message-ID:'"
 
-#: src/lang.c:476
+#: src/lang.c:479
+msgid	"Mail"
+msgstr	"Envoyer"
+
+#: src/lang.c:480
 msgid	"mailbox "
 msgstr	"bàl"
 
-#: src/lang.c:477
+#: src/lang.c:481
 #, c-format
 msgid	"Mail article(s) to [%.*s]> "
-msgstr	"Envoyer article(s) à [%.*s]> "
+msgstr	"Envoyer article(s) à [%.*s] > "
 
-#: src/lang.c:478
+#: src/lang.c:482
 #, c-format
 msgid	"Mailing log to %s\n"
 msgstr	"Envoi de l'historique à %s\n"
 
-#: src/lang.c:479
+#: src/lang.c:483
 msgid	"Mail bug report..."
 msgstr	"Envoi d'un rapport de bug..."
 
-#: src/lang.c:480
+#: src/lang.c:484
 #, c-format
 msgid	"Mail BUG REPORT to %s?"
-msgstr	"Envoyer RAPPORT DE BUG à %s ?"
+msgstr	"Signaler LE BUG à %s ?"
 
-#: src/lang.c:481
+#: src/lang.c:485
 msgid	"Mailed"
 msgstr	"Envoyé"
 
-#: src/lang.c:482
+#: src/lang.c:486
 #, c-format
 msgid	"Mailing to %s..."
 msgstr	"Envoi à %s..."
 
-#: src/lang.c:483
+#: src/lang.c:487
 msgid	"# [Mail/Save] active file. Format is like news active file:\n"
 	"#   groupname  max.artnum  min.artnum  /dir\n"
 	"# The 4th field is the basedir (ie. ~/Mail or ~/News)\n"
@@ -1960,290 +2109,282 @@ msgstr	"# [Envoyer/Enregistrer] fichier 
 	"# Le 4ème champ est le répertoire racine utilisé\n"
 	"# (p.e. ~/Mail ou ~/News)\n"
 
-#: src/lang.c:486
+#: src/lang.c:490
 #, c-format
 msgid	"%s marked as unread"
 msgstr	"%s marqué comme non lu"
 
-#: src/lang.c:487
+#: src/lang.c:491
 #, c-format
 msgid	"Marked %d of %d tagged %s as read"
 msgstr	"%d marqué(s) sur %d sélectionné(s) %s comme lu(s)"
 
-#: src/lang.c:488
+#: src/lang.c:492
 #, c-format
 msgid	"Mark all articles as read%s?"
 msgstr	"Marquer tous les articles comme lus%s ?"
 
-#: src/lang.c:489
+#: src/lang.c:493
 #, c-format
 msgid	"Mark %s=tagged articles, %s=current article, %s=quit: "
 msgstr	"Marquer %s=art. marqués, %s=article actuel, %s=quitter : "
 
-#: src/lang.c:490
+#: src/lang.c:494
 #, c-format
-msgid	"Mark group %.*s as read?"
-msgstr	"Marquer le groupe %.*s comme lu ?"
+msgid	"Mark group %s as read?"
+msgstr	"Marquer le groupe %s comme lu ?"
 
-#: src/lang.c:491
+#: src/lang.c:495
 #, c-format
 msgid	"Mark thread as read%s?"
 msgstr	"Marquer le fil comme lu%s ?"
 
-#: src/lang.c:492
+#: src/lang.c:496
 #, c-format
 msgid	"Mark %s=tagged articles/threads, %s=current thread, %s=quit: "
 msgstr	"Marquer %s=art./fils marqués, %s=fil actuel, %s=quitter : "
 
-#: src/lang.c:493
+#: src/lang.c:497
 #, c-format
 msgid	"Matching %s groups..."
 msgstr	"%s groupes correspondants..."
 
-#: src/lang.c:494 src/lang.c:498
+#: src/lang.c:498 src/lang.c:502
 #, c-format
 msgid	"<n>=set current to n; %s=next unread; %s=search pattern; %s=kill/select"
-msgstr	"<n>=régler l'actuel à n; %s=non lu suivant; %s=rech. terme; %s=filtrer/sél."
+msgstr	"<n>=voir 'n'; %s=non lu suivant; %s=rechercher; %s=filtrer/sél."
 
-# TRANSLATION TOO LONG
-#: src/lang.c:495
+#: src/lang.c:499
 #, c-format
 msgid	"%s=author search; %s=catchup; %s=line down; %s=line up; %s=mark read; %s=list "
 	"thread"
 msgstr	"%s=rech. auteur; %s=tout lu; %s=bas; %s=haut; %s=marquer lu; %s=voir fil"
 
-#: src/lang.c:496
+#: src/lang.c:500
 #, c-format
 msgid	"%s=line up; %s=line down; %s=page up; %s=page down; %s=top; %s=bottom"
 msgstr	"%s=haut; %s=bas; %s=haut de page; %s=bas de page; %s=haut; %s=bas"
 
-#: src/lang.c:497
+#: src/lang.c:501
 #, c-format
 msgid	"%s=search forwards; %s=search backwards; %s=quit"
 msgstr	"%s=recherche avant; %s=recherche arrière; %s=quitter"
 
-#: src/lang.c:499
+#: src/lang.c:503
 #, c-format
 msgid	"%s=author search; %s=body search; %s=catchup; %s=followup; %s=mark read"
 msgstr	"%s=rech. auteur; %s=rech. corps; %s=tout marquer lu; %s=suivi; %s=marquer lu"
 
-#: src/lang.c:500
+#: src/lang.c:504
 #, c-format
 msgid	"<n>=set current to n; %s=next unread; %s,%s=search pattern; %s=catchup"
-msgstr	"<n>=passer actuel à n; %s=non lu suivant; %s,%s=rech. terme; %s=tout lu"
+msgstr	"<n>=voir 'n'; %s=non lu suivant; %s,%s=rechercher; %s=tout lu"
 
-# TRANSLATION TOO LONG
-#: src/lang.c:501
+#: src/lang.c:505
 #, c-format
 msgid	"%s=line down; %s=line up; %s=help; %s=move; %s=quit; %s=toggle all/unread"
 msgstr	"%s=bas; %s=haut; %s=aide; %s=déplacer; %s=quitter; %s=voir lu/non lu"
 
-#: src/lang.c:502
+#: src/lang.c:506
 #, c-format
 msgid	"%s=subscribe; %s=sub pattern; %s=unsubscribe; %s=unsub pattern; %s=yank in/out"
-msgstr	"%s=abonner; %s=sous-critère; %s=désabonner; %s=critère; %s=yank in/out"
+msgstr	"%s=abonner; %s=sous-critère; %s=désabonner; %s=critère; %s=liste des groupes"
 
-#: src/lang.c:503
+#: src/lang.c:507
 #, c-format
 msgid	"<n>=set current to n; %s=next unread; %s=catchup; %s=display toggle"
-msgstr	"<n>=passer l'actuel à n; %s=non lu suivant; %s=tout lu; %s=basculer "
-	"l'affichage"
+msgstr	"<n>=voir 'n'; %s=non lu suivant; %s=tout lu; %s=basculer l'affichage"
 
-#: src/lang.c:504
+#: src/lang.c:508
 #, c-format
 msgid	"%s=help; %s=line down; %s=line up; %s=quit; %s=tag; %s=mark unread"
 msgstr	"%s=aide; %s=bas; %s=haut; %s=quitter; %s=marquer; %s=marquer non lu"
 
-#: src/lang.c:505
+#: src/lang.c:509
 msgid	"--More--"
-msgstr	"-- Plus --"
+msgstr	"-- Suite --"
 
-#: src/lang.c:506
+#: src/lang.c:510
 #, c-format
 msgid	"Moving %s..."
 msgstr	"Déplacement de %s..."
 
-#: src/lang.c:508
+#: src/lang.c:512
 msgid	", name: "
 msgstr	", nom : "
 
-#: src/lang.c:509
+#: src/lang.c:513
 #, c-format
 msgid	"Goto newsgroup [%s]> "
 msgstr	"Aller dans le groupe [%s]> "
 
-#: src/lang.c:510
+#: src/lang.c:514
 msgid	"newsgroups"
 msgstr	"groupes"
 
-#: src/lang.c:511
+#: src/lang.c:515
 #, c-format
 msgid	"Position %s in group list (1,2,..,$) [%d]> "
 msgstr	"Placer %s dans la liste des groupes (1,2,..,$) [%d]> "
 
-#: src/lang.c:512
+#: src/lang.c:516
 msgid	"newsgroup"
 msgstr	"groupe"
 
-#: src/lang.c:513
+#: src/lang.c:517
 msgid	"Try and save newsrc file again?"
 msgstr	"Encore essayer et enregistrer le newsrc ?"
 
-#: src/lang.c:514
+#: src/lang.c:518
 msgid	"Warning: No newsgroups were written to your newsrc file. Save aborted."
 msgstr	"Attention : Aucuns groupes n'a été écrits dans le newsrc. Enregistrement "
 	"annulé."
 
-#: src/lang.c:515
+#: src/lang.c:519
 msgid	"newsrc file saved successfully.\n"
 msgstr	"le newsrc a été enregistré avec succès.\n"
 
-#: src/lang.c:516
+#: src/lang.c:520
 msgid	"-- Next response --"
 msgstr	"-- Réponse suivante --"
 
-#: src/lang.c:517
+#: src/lang.c:521
 #, c-format
 msgid	"NNTP authorization password not found for %s"
 msgstr	"Mot de passe NNTP introuvable pour %s"
 
-#: src/lang.c:518
+#: src/lang.c:522
 msgid	"No  "
 msgstr	"Non "
 
-#: src/lang.c:519
+#: src/lang.c:523
 msgid	"*** No articles ***"
-msgstr	"*** Pas d'articles ***"
+msgstr	"*** Aucun article ***"
 
-#: src/lang.c:520
+#: src/lang.c:524
 msgid	"No articles have been posted"
 msgstr	"Aucun article n'a été posté"
 
-#: src/lang.c:521
+#: src/lang.c:525
 msgid	"*** No description ***"
-msgstr	"*** Pas de description ***"
+msgstr	"*** Aucune description ***"
 
-#: src/lang.c:522
+#: src/lang.c:526
 msgid	"No filename"
 msgstr	"Pas de nom de fichier"
 
-#: src/lang.c:523
+#: src/lang.c:527
 msgid	"No group"
 msgstr	"Pas de groupe"
 
-#: src/lang.c:524
+#: src/lang.c:528
 msgid	"*** No groups ***"
-msgstr	"*** Pas de groupes ***"
+msgstr	"*** Aucun groupe ***"
 
-#: src/lang.c:525
+#: src/lang.c:529
 msgid	"No more groups to read"
 msgstr	"Plus de groupes à lire"
 
-#: src/lang.c:526
+#: src/lang.c:530
 msgid	"No last message"
-msgstr	"Pas de dernier message"
+msgstr	"Aucun dernier message"
 
-#: src/lang.c:527
+#: src/lang.c:531
 msgid	"No mail address"
-msgstr	"Pas d'adresse email"
+msgstr	"Aucune adresse email"
 
-#: src/lang.c:528
+#: src/lang.c:532
 msgid	"No articles marked for saving"
-msgstr	"Pas d'articles marqués à enregistrer"
+msgstr	"Aucun article marqué à enregistrer"
 
-#: src/lang.c:529
+#: src/lang.c:533
 msgid	"No match"
-msgstr	"Pas de résultat"
+msgstr	"Aucun résultat"
 
-#: src/lang.c:530
+#: src/lang.c:534
 msgid	"No more groups"
 msgstr	"Plus de groupes"
 
-#: src/lang.c:531
+#: src/lang.c:535
 msgid	"No newsgroups"
-msgstr	"Pas de groupes"
+msgstr	"Aucun groupe"
 
-#: src/lang.c:532
+#: src/lang.c:536
 msgid	"No next unread article"
-msgstr	"Pas d'article non lu suivant"
+msgstr	"Aucun article non lu suivant"
 
-#: src/lang.c:533
+#: src/lang.c:537
 msgid	"No previous group"
-msgstr	"Pas de groupe précédent"
+msgstr	"Aucun groupe précédent"
 
-#: src/lang.c:534
+#: src/lang.c:538
 msgid	"No previous unread article"
-msgstr	"Pas d'article non lu précédent"
+msgstr	"Aucun article non lu précédent"
 
-#: src/lang.c:535
-#, c-format
-msgid	"No responses%s"
-msgstr	"Pas de réponses%s"
-
-#: src/lang.c:536
+#: src/lang.c:539
 msgid	"No responses"
-msgstr	"Pas de réponses"
+msgstr	"Aucune réponse"
 
-#: src/lang.c:537
+#: src/lang.c:540
 msgid	"No responses to list in current thread"
-msgstr	"Pas de réponses à afficher dans le fil actuel"
+msgstr	"Aucune réponse à afficher dans le fil actuel"
 
-#: src/lang.c:538
+#: src/lang.c:541
 msgid	"No search string"
-msgstr	"Pas de termes à rechercher"
+msgstr	"Aucun terme à rechercher"
 
-#: src/lang.c:539
+#: src/lang.c:542
 msgid	"No subject"
-msgstr	"Pas de sujet"
+msgstr	"Aucun sujet"
 
-#: src/lang.c:540
+#: src/lang.c:544
 #, c-format
 msgid	"%s: Terminal must have clear to end-of-line (ce)\n"
 msgstr	"%s: Terminal doit avoir la fonction clear to end-of-line (ce)\n"
 
-#: src/lang.c:541
+#: src/lang.c:545
 #, c-format
 msgid	"%s: Terminal must have clear to end-of-screen (cd)\n"
 msgstr	"%s: Terminal doit avoir la fonction clear to end-of-screen (cd)\n"
 
-#: src/lang.c:542
+#: src/lang.c:546
 #, c-format
 msgid	"%s: Terminal must have clearscreen (cl) capability\n"
 msgstr	"%s: Terminal doit avoir la fonction clearscreen (cl)\n"
 
-#: src/lang.c:543
+#: src/lang.c:547
 #, c-format
 msgid	"%s: Terminal must have cursor motion (cm)\n"
 msgstr	"%s: Terminal doit avoir la fonction cursor motion (cm)\n"
 
-#: src/lang.c:544
+#: src/lang.c:548
 #, c-format
 msgid	"%s: TERM variable must be set to use screen capabilities\n"
 msgstr	"%s: la variable TERM doit être utilisée pour utiliser les fonctions\n"
 
-#: src/lang.c:545
+#: src/lang.c:550
 #, c-format
 msgid	"No viewer found for %s/%s\n"
 msgstr	"Visualiseur introuvable pour %s/%s\n"
 
-#: src/lang.c:546
+#: src/lang.c:551
 msgid	"Newsgroup does not exist on this server"
 msgstr	"Groupe inexistant sur ce serveur"
 
-#: src/lang.c:547
+#: src/lang.c:552
 #, c-format
 msgid	"Group %s not found in active file"
 msgstr	"Groupe %s introuvable dans le fichier active"
 
-#: src/lang.c:548
+#: src/lang.c:553
 msgid	"c)reate it, use a)lternative name, use d)efault .newsrc, q)uit tin: "
 msgstr	"c)réer, utiliser a)utre nom, utiliser .newsrc par d)éfaut, q)uitter tin : "
 
-#: src/lang.c:549
+#: src/lang.c:554
 msgid	"use a)lternative name, use d)efault .newsrc, q)uit tin: "
 msgstr	"utiliser a)utre nom, utiliser .newsrc par d)éfaut, q)uitter tin : "
 
-#: src/lang.c:550
+#: src/lang.c:555
 #, c-format
 msgid	"# NNTP-server -> newsrc translation table and NNTP-server\n"
 	"# shortname list for %s %s\n"
@@ -2257,54 +2398,54 @@ msgid	"# NNTP-server -> newsrc translati
 	"#   news.tin.org  .newsrc-tin.org  tinorg\n"
 	"#   news.ka.nu    /tmp/nrc-nu      kanu    nu\n"
 	"#\n"
-msgstr	"# Serveur-NNTP -> tableau de correspondance du newsrc et Serveur-NNTP\n"
+msgstr	"# Serveur NNTP -> tableau de correspondance du newsrc et serveur NNTP\n"
 	"# liste des alias pour %s %s\n"
 	"#\n"
-	"# le format de ce fichier est\n"
-	"#   <FQDN du serveur-NNTP> <fichier newsrc> <alias> ...\n"
+	"# le format de ce fichier est le suivant :\n"
+	"#   <FQDN du serveur NNTP> <fichier newsrc> <alias> ...\n"
 	"#\n"
-	"# si <fichier newsrc> n'inclut pas le chemin, $HOME est alors considéré comme "
-	"celui par défaut\n"
+	"# si <fichier newsrc> n'inclus pas le chemin,\n"
+	"# $HOME est alors considéré comme celui par défaut\n"
 	"#\n"
 	"# exemples :\n"
 	"#   news.tin.org  .newsrc-tin.org  tinorg\n"
 	"#   news.ka.nu    /tmp/nrc-nu      kanu    nu\n"
 	"#\n"
 
-#: src/lang.c:557
+#: src/lang.c:562
 msgid	"Only"
-msgstr	"Uniquement"
+msgstr	"Actuel"
 
-#: src/lang.c:558
+#: src/lang.c:563
 #, c-format
 msgid	"Option not enabled. Recompile with %s."
 msgstr	"Option non activée. Recompilez avec %s."
 
-#: src/lang.c:559
+#: src/lang.c:564
 msgid	"Options Menu"
 msgstr	"Menu Options"
 
-#: src/lang.c:562
+#: src/lang.c:567
 #, c-format
 msgid	"Error in regex: %s at pos. %d '%s'"
 msgstr	"Erreur dans la regex : %s à %d '%s'"
 
-#: src/lang.c:563
+#: src/lang.c:568
 #, c-format
 msgid	"Error in regex: pcre internal error %d"
 msgstr	"Erreur dans la regex : erreur pcre interne %d"
 
-#: src/lang.c:564
+#: src/lang.c:569
 #, c-format
 msgid	"Error in regex: study - pcre internal error %s"
 msgstr	"Erreur dans la regex : study - erreur pcre interne %s"
 
-#: src/lang.c:565
+#: src/lang.c:570
 msgid	"Post a followup..."
 msgstr	"Postage du suivi..."
 
 #. TODO: replace hardcoded key-name in txt_post_error_ask_postpone
-#: src/lang.c:567
+#: src/lang.c:572
 msgid	"An error has occurred while posting the article. If you think that this\n"
 	"error is temporary or otherwise correctable, you can postpone the article\n"
 	"and pick it up again with ^O later.\n"
@@ -2312,270 +2453,277 @@ msgstr	"Une erreur est survenue lors du 
 	"cette erreur est temporaire ou alors corrigeable, vous pouvez enregistrer\n"
 	"l'article comme brouillon et le réutiliser plus tard grâce à la commande ^O.\n"
 
-#: src/lang.c:570
+#: src/lang.c:575
 msgid	"Posted articles history"
 msgstr	"Historique des articles postés"
 
-#: src/lang.c:571
+#: src/lang.c:576
 #, c-format
 msgid	"Post to newsgroup(s) [%s]> "
 msgstr	"Poster dans groupe(s) [%s]> "
 
-#: src/lang.c:572
+#: src/lang.c:577
 msgid	"-- post processing started --"
 msgstr	"-- post-traitement lancé --"
 
-#: src/lang.c:573
+#: src/lang.c:578
 msgid	"-- post processing completed --"
 msgstr	"-- post-traitement terminé --"
 
-#: src/lang.c:574
+#: src/lang.c:579
 #, c-format
 msgid	"Post subject [%s]> "
-msgstr	"Poster le sujet [%s]> "
+msgstr	"Poster le sujet [%s] > "
 
-#: src/lang.c:575
+#: src/lang.c:580
 msgid	"# Summary of mailed/posted messages viewable by 'W' command from within tin.\n"
 msgstr	"# Sommaire des messages envoyés/postés visible par la commande 'W' depuis "
 	"tin.\n"
 
-#: src/lang.c:576
+#: src/lang.c:581
 msgid	"Posting article..."
 msgstr	"Postage de l'article..."
 
-#: src/lang.c:577
-msgid	"Post postponed articles [%%.*s]? (%s/%s/%s/%s/%s): "
-msgstr	"Poster les brouillons [%%.*s] ? (%s/%s/%s/%s/%s) : "
+#: src/lang.c:582
+#, c-format
+msgid	"Post postponed articles [%%s]? (%s/%s/%s/%s/%s): "
+msgstr	"Poster les brouillons [%%s] ? (%s/%s/%s/%s/%s) : "
 
-#: src/lang.c:578
+#: src/lang.c:583
 #, c-format
 msgid	"Hot %s"
 msgstr	"%s sélectionné"
 
-#: src/lang.c:579
+#: src/lang.c:584
 #, c-format
 msgid	"Tagged %s"
 msgstr	"%s marqué"
 
-#: src/lang.c:580
+#: src/lang.c:585
 #, c-format
 msgid	"Untagged %s"
 msgstr	"%s non marqué"
 
-#: src/lang.c:581
+#: src/lang.c:586
 msgid	"Processing mail messages marked for deletion."
 msgstr	"Traitement des emails enregistrés marqués pour effacement."
 
-#: src/lang.c:582
+#: src/lang.c:587
 msgid	"Processing saved articles marked for deletion."
 msgstr	"Traitement des articles enregistrés marqués pour effacement."
 
-#: src/lang.c:583
+#: src/lang.c:588
 #, c-format
 msgid	"Accept Followup-To? %s=post, %s=ignore, %s=quit: "
 msgstr	"Accepter le Suivi ? %s=poster, %s=ignorer, %s=quitter : "
 
-#: src/lang.c:584
+#: src/lang.c:589
 msgid	"Article unchanged, abort mailing?"
 msgstr	"Article inchangé, annuler l'envoi ?"
 
-#: src/lang.c:585
+#: src/lang.c:590
 #, c-format
 msgid	"Do you want to see postponed articles (%d)?"
 msgstr	"Voulez-vous voir les brouillons (%d) ?"
 
-#: src/lang.c:587
+#: src/lang.c:592
 msgid	"Add quick kill filter?"
-msgstr	"Ajout rapide d'un filtre d'élimination ?"
+msgstr	"Ajouter rapidement un filtre ?"
 
-#: src/lang.c:588
+#: src/lang.c:593
 msgid	"Add quick selection filter?"
-msgstr	"Ajout rapide d'un filtre de sélection ?"
+msgstr	"Ajouter rapidement une règle ?"
 
-#: src/lang.c:589
+#: src/lang.c:594
 msgid	"Do you really want to quit?"
 msgstr	"Voulez-vous réellement quitter ?"
 
-#: src/lang.c:590
-msgid	"%s=edit cancel message, %s=quit, %s=delete (cancel) [%%.*s]: "
-msgstr	"%s=éditer message d'annulation, %s=quitter, %s=effacer (annuler) [%%.*s] : "
+#: src/lang.c:595
+#, c-format
+msgid	"%s=edit cancel message, %s=quit, %s=delete (cancel) [%%s]: "
+msgstr	"%s=éditer message d'annulation, %s=quitter, %s=effacer (annuler) [%%s] : "
 
-#: src/lang.c:591
+#: src/lang.c:596
 msgid	"You have tagged articles in this group - quit anyway?"
-msgstr	"Vous avez des articles marqués dans ce groupe - tout de même quitter?"
+msgstr	"Vous avez des articles marqués dans ce groupe - quitter quand même ?"
 
-#: src/lang.c:592
+#: src/lang.c:597
 #, c-format
 msgid	"%s=quit, %s=edit, %s=postpone: "
 msgstr	"%s=quitter, %s=éditer, %s=brouillon : "
 
-#: src/lang.c:593
+#: src/lang.c:598
 #, c-format
 msgid	"%s=quit %s=edit %s=save kill description: "
-msgstr	"%s=quitter, %s=éditer, %s=enregistrer description du filtre : "
+msgstr	"%s=quitter, %s=éditer, %s=enregistrer le filtre : "
 
-#: src/lang.c:594
+#: src/lang.c:599
 #, c-format
 msgid	"%s=quit %s=edit %s=save select description: "
-msgstr	"%s=quitter %s=éditer %s=enregistrer la description sél. : "
+msgstr	"%s=quitter %s=éditer %s=enregistrer la règle : "
 
-#: src/lang.c:595
+#: src/lang.c:600
 msgid	"Do you really want to quit without saving your configuration?"
 msgstr	"Voulez-vous réellement quitter sans enregistrer votre configuration ?"
 
-#: src/lang.c:598
+#: src/lang.c:603
 msgid	"Invalid range - valid are '0-9.$' eg. 1-$"
 msgstr	"Champ invalide - '0-9.$' pe. 1-$ est valide"
 
-#: src/lang.c:599
+#: src/lang.c:604
 msgid	"Do you want to abort this operation?"
 msgstr	"Voulez-vous annuler cette opération ?"
 
-#: src/lang.c:600
+#: src/lang.c:605
 msgid	"Do you want to exit tin immediately?"
 msgstr	"Voulez-vous quitter tin immédiatement ?"
 
-#: src/lang.c:601
+#: src/lang.c:606
 msgid	"Read response> "
 msgstr	"Lire la réponse> "
 
-#: src/lang.c:602
+#: src/lang.c:607
 msgid	"Reading ('q' to quit)..."
 msgstr	"Lecture ('q' pour quitter)..."
 
-#: src/lang.c:603
+#: src/lang.c:608
 #, c-format
 msgid	"Reading %sarticles..."
 msgstr	"Lecture de %sarticles..."
 
-#: src/lang.c:604
+#: src/lang.c:609
 #, c-format
 msgid	"Reading %sattributes file...\n"
 msgstr	"Lecture du fichier %sattributes...\n"
 
-#: src/lang.c:605
+#: src/lang.c:610
 #, c-format
 msgid	"Reading %sconfig file...\n"
 msgstr	"Lecture du fichier %sconfig...\n"
 
-#: src/lang.c:606
+#: src/lang.c:611
 msgid	"Reading filter file...\n"
 msgstr	"Lecture du fichier filter...\n"
 
-#: src/lang.c:607
+#: src/lang.c:612
 #, c-format
 msgid	"Reading %s groups..."
 msgstr	"Lecture de %s groupes..."
 
-#: src/lang.c:608
+#: src/lang.c:613
 msgid	"Reading input history file...\n"
 msgstr	"Lecture du fichier d'historique...\n"
 
-#: src/lang.c:609
+#: src/lang.c:614
 msgid	"Reading keymap file...\n"
 msgstr	"Lecture du fichier keymap...\n"
 
-#: src/lang.c:610
+#: src/lang.c:615
 msgid	"Reading groups from active file... "
 msgstr	"Lecture des groupes depuis le fichier active... "
 
-#: src/lang.c:611
+#: src/lang.c:616
 msgid	"Reading groups from newsrc file... "
 msgstr	"Lecture des groupes depuis le fichier newsrc... "
 
-#: src/lang.c:612
+#: src/lang.c:617
 msgid	"Reading newsgroups file... "
 msgstr	"Lecture du fichier newsgroups... "
 
-#: src/lang.c:613
+#: src/lang.c:618
 msgid	"Reading newsrc file..."
 msgstr	"Lecture du fichier newsrc..."
 
-#: src/lang.c:614
+#: src/lang.c:620
+#, c-format
+msgid	"(%d:%02d remaining)"
+msgstr	"(%d:%02d restant)"
+
+#: src/lang.c:622
 #, c-format
 msgid	"Bogus group %s removed."
 msgstr	"Effacement du groupe corrompu %s."
 
-#: src/lang.c:615
+#: src/lang.c:623
 #, c-format
 msgid	"Error: rename %s to %s"
 msgstr	"Erreur : renommer %s à %s"
 
-#: src/lang.c:616
+#: src/lang.c:624
 msgid	"Reply to author..."
 msgstr	"Répondre à l'auteur..."
 
-#: src/lang.c:617
+#: src/lang.c:625
 msgid	"Repost"
 msgstr	"Reposter"
 
-#: src/lang.c:618
+#: src/lang.c:626
 msgid	"Reposting article..."
 msgstr	"Repostage de l'article..."
 
-#: src/lang.c:619
+#: src/lang.c:627
 #, c-format
 msgid	"Repost article(s) to group(s) [%s]> "
 msgstr	"Reposter article(s) dans groupe(s) [%s]> "
 
-#: src/lang.c:620
+#: src/lang.c:628
 msgid	"Reset newsrc?"
 msgstr	"Réinitialiser newsrc ?"
 
-#: src/lang.c:621
+#: src/lang.c:629
 msgid	"Responses have been directed to the following newsgroups"
 msgstr	"Les réponses ont été redirigées vers les groupes suivants"
 
-#: src/lang.c:622
+#: src/lang.c:630
 #, c-format
 msgid	"Responses have been directed to poster. %s=mail, %s=post, %s=quit: "
 msgstr	"Les réponses ont été redirigées à l'auteur. %s=mail, %s=poster, %s=quitter : "
 
-#: src/lang.c:623
+#: src/lang.c:631
 #, c-format
-msgid	"RespNo %4d of %4d%s"
-msgstr	"Nbre rép. %4d/%4d%s"
+msgid	"RespNo %4d of %4d"
+msgstr	"Réponse %4d sur %4d"
 
-#: src/lang.c:624
+#: src/lang.c:632
 msgid	"Press <RETURN> to continue..."
 msgstr	"Appuyez sur <RETOUR> pour continuer..."
 
-#: src/lang.c:626
+#: src/lang.c:634
 #, c-format
-msgid	"Select From    [%-*.*s] (y/n): "
-msgstr	""
+msgid	"Select From    [%s] (y/n): "
+msgstr	"   De : [%s] (o/n) : "
 
-#: src/lang.c:627
+#: src/lang.c:635
 msgid	"Select Lines: (</>num): "
-msgstr	""
+msgstr	"Nombre de lignes (</>num)    : "
 
-#: src/lang.c:628
+#: src/lang.c:636
 msgid	"Auto-select Article Menu"
-msgstr	""
+msgstr	"Créer une règle"
 
-#: src/lang.c:629
+#: src/lang.c:637
 #, c-format
-msgid	"Select Msg-Id  [%-*.*s] (f/l/o/n): "
-msgstr	""
+msgid	"Select Msg-Id  [%s] (f/l/o/n): "
+msgstr	"  MID : [%s] (t/d/a/n) : "
 
-#: src/lang.c:630
+#: src/lang.c:638
 msgid	"Select pattern scope: "
-msgstr	""
+msgstr	"Règle s'appliquant à : "
 
-#: src/lang.c:631
+#: src/lang.c:639
 #, c-format
-msgid	"Select Subject [%-*.*s] (y/n): "
-msgstr	"Sél. Sujet [%-*.*s] (o/n)    : "
+msgid	"Select Subject [%s] (y/n): "
+msgstr	"Sujet : [%s] (o/n) : "
 
-#: src/lang.c:632
+#: src/lang.c:640
 msgid	"Select text pattern : "
-msgstr	""
+msgstr	"Texte ou terme  : "
 
-#: src/lang.c:633
+#: src/lang.c:641
 msgid	"Select time in days   : "
-msgstr	"Durée en jours        : "
+msgstr	"Durée de la règle            : "
 
-#: src/lang.c:634
+#: src/lang.c:642
 #, c-format
 msgid	"# %s server configuration file\n"
 	"# This file was automatically saved by %s %s %s (\"%s\")\n"
@@ -2585,221 +2733,231 @@ msgid	"# %s server configuration file\n"
 	"# Do not edit at all if you don't know what you do.\n"
 	"############################################################################\n"
 	"\n"
-msgstr	""
+msgstr	"# Fichier de configuration serveur de %s\n"
+	"# Ce fichier a été automatiquement enregistré par %s %s %s (\"%s\")\n"
+	"#\n"
+	"# N'éditez pas ce fichier lorsque %s est ouvert, car tout changement apporté\n"
+	"# sera écrasé lorsque vous quitterez %s.\n"
+	"# Enfin, ne touchez pas à ce fichier si vous ne savez pas quoi y faire.\n"
+	"############################################################################\n"
 
-#: src/lang.c:640
+#: src/lang.c:648
 msgid	"Showing unread groups only"
 msgstr	"Afficher uniquement les groupes non lus"
 
-#: src/lang.c:641
+#: src/lang.c:649
 msgid	"Subject: line (ignore case)   "
-msgstr	"Ligne Sujet: (casse insensible)"
+msgstr	"l'en-tête 'Subject:' (ignorer la casse)"
 
-#: src/lang.c:642
+#: src/lang.c:650
 msgid	"Subject: line (case sensitive)"
-msgstr	"Ligne Sujet: (casse sensible)  "
+msgstr	"l'en-tête 'Subject:' (casse sensible)"
 
-#: src/lang.c:643
+#: src/lang.c:651
 msgid	"Save"
 msgstr	"Enregistrer"
 
-#: src/lang.c:644
+#: src/lang.c:652
 #, c-format
 msgid	"Save '%s' (%s/%s)?"
 msgstr	"Enregistrer '%s' (%s/%s) ?"
 
-#: src/lang.c:645
+#: src/lang.c:653
 msgid	"Save configuration before continuing?"
 msgstr	"Enregistrer la configuration avant de continuer ?"
 
-#: src/lang.c:646
+#: src/lang.c:654
 msgid	"Save filename> "
-msgstr	"Enregistrer sous le nom de fichier> "
+msgstr	"Enregistrer sous le nom de fichier > "
 
-#: src/lang.c:647
+#: src/lang.c:655
 msgid	"Saved"
 msgstr	"Enregistré"
 
-#: src/lang.c:648
+#: src/lang.c:656
 #, c-format
 msgid	"%4d unread (%4d hot) %s in %s\n"
 msgstr	"%4d non lu (%4d sél.) %s dans %s\n"
 
-#: src/lang.c:649
+#: src/lang.c:657
 #, c-format
 msgid	"Saved %s...\n"
 msgstr	"Enregistrement de %s...\n"
 
-#: src/lang.c:650
+#: src/lang.c:658
 msgid	"Nothing was saved"
 msgstr	"Rien n'a été enregistré"
 
-#: src/lang.c:651
+#: src/lang.c:659
 #, c-format
 msgid	"\n"
 	"%s %d %s from %d %s\n"
 msgstr	"\n"
 	"%s %d %s de %d %s\n"
 
-#: src/lang.c:652
+#: src/lang.c:660
 #, c-format
 msgid	"-- %s saved to %s%s --"
-msgstr	"-- %s enregistré dans %s%s --"
+msgstr	"-- %s enregistré sous %s%s --"
 
-#: src/lang.c:653
+#: src/lang.c:661
 #, c-format
 msgid	"-- %s saved to %s - %s --"
-msgstr	"-- %s enregistré dans %s - %s --"
+msgstr	"-- %s enregistré sous %s - %s --"
 
-#: src/lang.c:654
+#: src/lang.c:662
 msgid	"Saving..."
 msgstr	"Enregistrement..."
 
-#: src/lang.c:655
+#: src/lang.c:663
 #, c-format
 msgid	"%s: Screen initialization failed"
 msgstr	"%s : Échec de l'initialisation de l'écran"
 
-#: src/lang.c:656
+#: src/lang.c:665
 #, c-format
 msgid	"%s: screen is too small\n"
 msgstr	"%s : l'écran est trop petit\n"
 
-#: src/lang.c:657
+#: src/lang.c:667
 #, c-format
 msgid	"screen is too small, %s is exiting\n"
 msgstr	"l'écran est trop petit, %s quitte\n"
 
-#: src/lang.c:658
+#: src/lang.c:668
 #, c-format
 msgid	"Search backwards [%s]> "
-msgstr	"Recherche arrière [%s]> "
+msgstr	"Recherche arrière [%s] > "
 
-#: src/lang.c:659
+#: src/lang.c:669
 #, c-format
 msgid	"Search body [%s]> "
-msgstr	"Rechercher dans le corps [%s]> "
+msgstr	"Rechercher dans le corps [%s] > "
 
-#: src/lang.c:660
+#: src/lang.c:670
 #, c-format
 msgid	"Search forwards [%s]> "
-msgstr	"Recherche avant [%s]> "
+msgstr	"Recherche avant [%s] > "
 
-#: src/lang.c:661
+#: src/lang.c:671
 msgid	"Searching..."
 msgstr	"Recherche..."
 
-#: src/lang.c:662
+#: src/lang.c:672
 #, c-format
 msgid	"Searching article %d of %d ('q' to abort)..."
 msgstr	"Recherche article %d sur %d ('q' pour annuler)..."
 
-#: src/lang.c:663
+#: src/lang.c:673
 msgid	"Select article> "
-msgstr	"Sélectionner l'article> "
+msgstr	"Sélectionner l'article > "
 
-# TRANSLATION TOO LONG (75 chars max)
-#: src/lang.c:664
+#: src/lang.c:674
 msgid	"Select option number before text or use arrow keys and <CR>. 'q' to quit."
-msgstr	"Sélection n° avant le texte ou utiliser les flèches et <CR>. 'q' pour quitter."
+msgstr	"Choisir un numéro ou utiliser les flèches puis <RETOUR>. 'q' pour quitter."
 
-#: src/lang.c:665
+#: src/lang.c:675
 msgid	"Select group> "
-msgstr	"Sélectionner le groupe> "
+msgstr	"Sélectionner le groupe > "
 
-#: src/lang.c:666
+#: src/lang.c:676
 #, c-format
 msgid	"Enter selection pattern [%s]> "
-msgstr	"Entrez le critère de sélection [%s]> "
+msgstr	"Entrez le critère de sélection [%s] > "
 
-#: src/lang.c:667
+#: src/lang.c:677
 msgid	"Select thread > "
 msgstr	"Sélectionner le fil > "
 
-#: src/lang.c:668
+#: src/lang.c:678
 #, c-format
 msgid	"%s %s %s (\"%s\") [%s]: send a DETAILED bug report to %s\n"
 msgstr	"%s %s %s (\"%s\") [%s]: envoi d'un rapport de bug DÉTAILLÉ à %s\n"
 
-#: src/lang.c:669
+#: src/lang.c:679
 msgid	"servers active-file"
 msgstr	"fichier active des serveurs"
 
-#: src/lang.c:670
+#: src/lang.c:680
 msgid	"Cannot move into new newsgroups. Subscribe first..."
 msgstr	"Déplacement dans nouveaux groupes impossible. Abonnez-vous d'abord..."
 
-#: src/lang.c:671
+#: src/lang.c:681
 msgid	"<SPACE>"
 msgstr	"<ESPACE>"
 
-#: src/lang.c:672
+#: src/lang.c:682
 #, c-format
 msgid	"Starting: (%s)"
 msgstr	"Démarrage : (%s)"
 
-#: src/lang.c:673
+#: src/lang.c:683
 #, c-format
 msgid	"List Thread (%d of %d)"
-msgstr	"Afficher le fil (%d sur %d)"
+msgstr	"Visualisation du fil (%d sur %d)"
 
-#: src/lang.c:674
+#: src/lang.c:684
 #, c-format
 msgid	"Thread (%.*s)"
 msgstr	"Fil (%.*s)"
 
-#: src/lang.c:675
+#: src/lang.c:685
 msgid	"Enter wildcard subscribe pattern> "
-msgstr	"Entrer un caractère joker comme critère> "
+msgstr	"Entrer un caractère joker comme critère > "
 
-#: src/lang.c:676
+#: src/lang.c:686
 #, c-format
 msgid	"subscribed to %d groups"
 msgstr	"Abonné à %d groupes"
 
-#: src/lang.c:677
+#: src/lang.c:687
 #, c-format
 msgid	"Subscribed to %s"
 msgstr	"Abonné à %s"
 
-#: src/lang.c:678
+#: src/lang.c:688
 msgid	"Subscribing... "
-msgstr	"Abonnement..."
+msgstr	"Abonnement... "
 
-#: src/lang.c:679
-msgid	"Repost or supersede article(s) [%%.*s]? (%s/%s/%s): "
-msgstr	"Reposter ou remplacer le(s) article(s) [%%.*s]? (%s/%s/%s) : "
+#: src/lang.c:689
+#, c-format
+msgid	"Repost or supersede article(s) [%%s]? (%s/%s/%s): "
+msgstr	"Reposter ou remplacer le(s) article(s) [%%s]? (%s/%s/%s) : "
 
-#: src/lang.c:680
+#: src/lang.c:690
 #, c-format
 msgid	"Supersede article(s) to group(s) [%s]> "
-msgstr	"Remplacer le(s) article(s) du(es) groupe(s) [%s]> "
+msgstr	"Remplacer le(s) article(s) du(es) groupe(s) [%s] > "
 
-#: src/lang.c:681
+#: src/lang.c:691
 msgid	"Superseding article ..."
 msgstr	"Remplacement de l'article..."
 
-#: src/lang.c:682
+#: src/lang.c:692
 #, c-format
 msgid	"\n"
 	"Stopped. Type 'fg' to restart %s\n"
 msgstr	"\n"
 	"Arrêté. Tapez 'fg' pour relancer %s\n"
 
-#: src/lang.c:684
+#: src/lang.c:694
 #, c-format
 msgid	"%d days"
 msgstr	"%d jours"
 
-#: src/lang.c:685
+#: src/lang.c:695
 msgid	"<TAB>"
 msgstr	"<TAB>"
 
-#: src/lang.c:686
+#: src/lang.c:696
+msgid	"TeX "
+msgstr	"TeX "
+
+#: src/lang.c:697
 msgid	"# Default action/prompt strings\n"
 msgstr	"# Termes action/prompt par défaut\n"
 
-#: src/lang.c:687
+#: src/lang.c:698
 msgid	"# Defaults for quick (1 key) kill & auto-selection filters\n"
 	"# header=NUM  0,1=Subject: 2,3=From: 4=Message-ID: & full References: line\n"
 	"#             5=Message-ID: & last References: entry only\n"
@@ -2817,266 +2975,267 @@ msgstr	"# Réglages par défaut pour les f
 	"# case=ON/OFF    ON=filtre sensible à la casse OFF=filtre insensible\n"
 	"# expire=ON/OFF  ON=durée d'après default_filter_days OFF=n'expire jamais\n"
 
-#: src/lang.c:700
+#: src/lang.c:711
 msgid	"# If ON use print current subject or newsgroup description in the last line\n"
-msgstr	"# Si ON affiche le sujet actuel ou la description du groupe dans la dernière "
-	"ligne\n"
+msgstr	"# Si ON, affiche le sujet actuel ou la description du groupe dans la "
+	"dernière\n"
+	"# ligne\n"
 
-#: src/lang.c:701
+#: src/lang.c:712
 msgid	"# Host & time info used for detecting new groups (don't touch)\n"
 msgstr	"# Info sur l'hôte & l'heure utilisées pour détecter les nouveaux groupes (ne "
 	"pas toucher)\n"
 
-#: src/lang.c:702
+#: src/lang.c:713
 msgid	"There is no news\n"
 msgstr	"Rien de neuf\n"
 
-#: src/lang.c:703
+#: src/lang.c:714
 msgid	"Thread"
 msgstr	"Fil"
 
-#: src/lang.c:704
+#: src/lang.c:715
 msgid	"Thread Level Commands"
 msgstr	"Commandes pour fil"
 
-#: src/lang.c:705
+#: src/lang.c:716
 msgid	"Thread deselected"
 msgstr	"Fil désélectionné"
 
-#: src/lang.c:706
+#: src/lang.c:717
 msgid	"Thread selected"
 msgstr	"Fil sélectionné"
 
-#: src/lang.c:707
+#: src/lang.c:719
 msgid	"threads"
 msgstr	"fils"
 
-#: src/lang.c:708
+#: src/lang.c:721
 msgid	"Thread range"
 msgstr	"Champ du fil"
 
-#: src/lang.c:709
+#: src/lang.c:722
 msgid	"thread"
 msgstr	"fil"
 
-#: src/lang.c:710
+#: src/lang.c:723
 #, c-format
-msgid	"%sThread %4s of %4s"
-msgstr	"%sFil %4s de %4s"
+msgid	"Thread %4s of %4s"
+msgstr	"    Fil %4s sur %4s"
 
-#: src/lang.c:711
+#: src/lang.c:724
 msgid	"Threading articles..."
 msgstr	"Regroupement des articles..."
 
-#: src/lang.c:712
+#: src/lang.c:725
 #, c-format
 msgid	"Toggled word highlighting %s"
 msgstr	"(Dés)activer surbrillance %s"
 
-#: src/lang.c:713
+#: src/lang.c:726
 msgid	"Toggled rot13 encoding"
 msgstr	"(Dés)activer codage rot13"
 
-#: src/lang.c:714
+#: src/lang.c:727
 #, c-format
 msgid	"Toggled german TeX encoding %s"
 msgstr	"(Dés)activer codage TeX Allemand %s"
 
-#: src/lang.c:715
+#: src/lang.c:728
 #, c-format
 msgid	"Toggled tab-width to %d"
 msgstr	"(Dés)activer largeur de tabulation à %d"
 
-#: src/lang.c:716
+#: src/lang.c:729
 #, c-format
 msgid	"%d Trying to dotlock %s"
 msgstr	"%d essaye de déverrouiller %s"
 
-#: src/lang.c:717
+#: src/lang.c:730
 #, c-format
 msgid	"%d Trying to lock %s"
 msgstr	"%d essaye de verrouiller %s"
 
-#: src/lang.c:718
+#: src/lang.c:731
 msgid	"           h=help\n"
 msgstr	"           h=aide\n"
 
-#: src/lang.c:720
+#: src/lang.c:733
 msgid	"Unlimited"
-msgstr	"Illimité"
+msgstr	"Illimitée"
 
-#: src/lang.c:721
+#: src/lang.c:734
 msgid	"Enter wildcard unsubscribe pattern> "
-msgstr	"Terme joker pour se désabonner> "
+msgstr	"Terme joker pour se désabonner > "
 
-#: src/lang.c:722
+#: src/lang.c:735
 #, c-format
 msgid	"Error decoding %s : %s"
 msgstr	"Erreur lors du décodage de %s : %s"
 
-#: src/lang.c:723
+#: src/lang.c:736
 msgid	"No end."
 msgstr	"Pas de fin."
 
-#: src/lang.c:724
+#: src/lang.c:737
 #, c-format
 msgid	"%s successfully decoded."
 msgstr	"%s décodé avec succès."
 
-#: src/lang.c:725
+#: src/lang.c:738
 #, c-format
 msgid	"%*s[-- %s/%s, %suuencoded file, %d lines, name: %s --]\n"
 	"\n"
 msgstr	"%*s[-- %s/%s, %sfichier uuencodé, %d lignes, nom : %s --]\n"
 	"\n"
 
-#: src/lang.c:726
+#: src/lang.c:739
 msgid	"unread "
 msgstr	"non lu"
 
-#: src/lang.c:727
+#: src/lang.c:740
 #, c-format
 msgid	"unsubscribed from %d groups"
 msgstr	"désabonné de %d groupes"
 
-#: src/lang.c:728
+#: src/lang.c:741
 #, c-format
 msgid	"Unsubscribed from %s"
 msgstr	"Désabonné de %s"
 
-#: src/lang.c:729
+#: src/lang.c:742
 msgid	"Unsubscribing... "
-msgstr	"Désabonnement..."
+msgstr	"Désabonnement... "
 
-#: src/lang.c:730
+#: src/lang.c:743
 msgid	"Unthreading articles..."
 msgstr	"Dégroupement des articles..."
 
-#: src/lang.c:731
+#: src/lang.c:744
 msgid	"Updated"
 msgstr	"Mis à jour"
 
-#: src/lang.c:732
+#: src/lang.c:745
 msgid	"Updating"
 msgstr	"Rafraîchissement"
 
-#: src/lang.c:733
+#: src/lang.c:746
 #, c-format
 msgid	"Opening %s\n"
-msgstr	"Ouverture %s\n"
+msgstr	"Ouverture de %s\n"
 
-#: src/lang.c:734
+#: src/lang.c:747
 msgid	"No more URL's in this article"
 msgstr	"Plus d'URL dans cet article"
 
-#: src/lang.c:735
+#: src/lang.c:748
 msgid	"Use MIME display program for this message?"
 msgstr	"Utiliser le programme d'affichage MIME pour ce message ?"
 
-#: src/lang.c:736
+#: src/lang.c:749
 msgid	"  -c       mark all news as read in subscribed newsgroups (batch mode)"
 msgstr	"  -c       marquer tous les articles lus dans les groupes abonnés (en tâche "
 	"de fond)"
 
-#: src/lang.c:737
+#: src/lang.c:750
 msgid	"  -Z       return status indicating if any unread news (batch mode)"
 msgstr	"  -Z       retourne un statut indiquant s'il y a nouveaux articles (en tâche "
 	"de fond)"
 
-#: src/lang.c:738
+#: src/lang.c:751
 msgid	"  -q       don't check for new newsgroups"
 msgstr	"  -q       ne pas vérifier s'il y a des nouveaux groupes"
 
-#: src/lang.c:739
+#: src/lang.c:752
 msgid	"  -X       don't save any files on quit"
 msgstr	"  -X       ne pas enregistrer de fichiers à la fermeture"
 
-#: src/lang.c:740
+#: src/lang.c:753
 msgid	"  -d       don't show newsgroup descriptions"
 msgstr	"  -d       ne pas afficher les descriptions des groupes"
 
-#: src/lang.c:741
+#: src/lang.c:754
 msgid	"  -G limit get only limit articles/group"
 msgstr	"  -G nombre d'articles par groupe limite"
 
-#: src/lang.c:742
+#: src/lang.c:755
 #, c-format
 msgid	"  -H       help information about %s"
 msgstr	"  -H       aide à propos de %s"
 
-#: src/lang.c:743
+#: src/lang.c:756
 msgid	"  -h       this help message"
 msgstr	"  -h       ce message d'aide"
 
-#: src/lang.c:744
+#: src/lang.c:757
 #, c-format
 msgid	"  -I dir   news index file directory [default=%s]"
-msgstr	"  -I rép.  dossier du fichier index [défaut=%s]"
+msgstr	"  -I rép.  répertoire du fichier index [défaut=%s]"
 
-#: src/lang.c:745
+#: src/lang.c:758
 msgid	"  -u       update index files (batch mode)"
 msgstr	"  -u       màj des fichiers index (en tâche de fond)"
 
-#: src/lang.c:746
+#: src/lang.c:759
 #, c-format
 msgid	"  -m dir   mailbox directory [default=%s]"
-msgstr	"  -m rép.  dossier des bàl [défaut=%s]"
+msgstr	"  -m rép.  répertoire des bàl [défaut=%s]"
 
-#: src/lang.c:747
+#: src/lang.c:760
 #, c-format
 msgid	"\n"
 	"Mail bug reports/comments to %s"
 msgstr	"\n"
 	"Envoyez par mail vos rapports de bugs/suggestions à %s"
 
-#: src/lang.c:748
+#: src/lang.c:761
 msgid	"  -N       mail new news to your posts (batch mode)"
 msgstr	"  -N       envoyer toute réponse à vos articles (en tâche de fond)"
 
-#: src/lang.c:749
+#: src/lang.c:762
 msgid	"  -M user  mail new news to specified user (batch mode)"
 msgstr	"  -M util. envoyer tout nouvel article à une personne (en tâche de fond)"
 
-#: src/lang.c:750
+#: src/lang.c:763
 #, c-format
 msgid	"  -f file  subscribed to newsgroups file [default=%s]"
 msgstr	"  -f fich. abonné au fichier groupes [défaut=%s]"
 
-#: src/lang.c:751
+#: src/lang.c:764
 msgid	"  -x       no posting mode"
-msgstr	""
+msgstr	"  -x       mode postage OFF"
 
-#: src/lang.c:752
+#: src/lang.c:765
 msgid	"  -w       post an article and exit"
-msgstr	""
+msgstr	"  -w       poster un article puis quitter"
 
-#: src/lang.c:753
+#: src/lang.c:766
 msgid	"  -o       post all postponed articles and exit"
 msgstr	"  -o       poster tous les brouillons puis quitter"
 
-#: src/lang.c:754
+#: src/lang.c:767
 msgid	"  -r       read news remotely from default NNTP server"
 msgstr	"  -r       lire les articles depuis le serveur NNTP par défaut"
 
-#: src/lang.c:755
+#: src/lang.c:768
 msgid	"  -R       read news saved by -S option"
 msgstr	"  -R       lire les articles enregistrés via l'option -S"
 
-#: src/lang.c:756
+#: src/lang.c:769
 #, c-format
 msgid	"  -s dir   save news directory [default=%s]"
-msgstr	"  -s rép.  dossier où enregistrer les articles [défaut=%s]"
+msgstr	"  -s rép.  répertoire où enregistrer les articles [défaut=%s]"
 
-#: src/lang.c:757
+#: src/lang.c:770
 msgid	"  -S       save new news for later reading (batch mode)"
 msgstr	"  -S       enregistrer tout nouvel article pour lecture différée (en tâche de "
 	"fond)"
 
-#: src/lang.c:758
+#: src/lang.c:771
 msgid	"  -z       start if any unread news"
 msgstr	"  -z       lancer si articles non lus"
 
-#: src/lang.c:759
+#: src/lang.c:772
 #, c-format
 msgid	"A Usenet reader.\n"
 	"\n"
@@ -3084,66 +3243,66 @@ msgid	"A Usenet reader.\n"
 msgstr	"Un lecteur UseNet.\n"
 	"Usage : %s [options] [groupe[,...]]"
 
-#: src/lang.c:760
+#: src/lang.c:773
 msgid	"  -v       verbose output for batch mode options"
 msgstr	"  -v       sortie détaillée pour options en tâche de fond"
 
-#: src/lang.c:761
+#: src/lang.c:774
 msgid	"  -V       print version & date information"
 msgstr	"  -V       afficher infos date & version"
 
-#: src/lang.c:762
+#: src/lang.c:775
 #, c-format
 msgid	"%s only useful without batch mode operations\n"
 msgstr	"%s utile seulement sans opérations en tâche de fond\n"
 
-#: src/lang.c:763
+#: src/lang.c:776
 #, c-format
 msgid	"%s only useful for batch mode operations\n"
 msgstr	"%s utile seulement pour opérations en tâche de fond\n"
 
-#: src/lang.c:765
+#: src/lang.c:778
 #, c-format
 msgid	"\n"
 	"%s%d out of range (0 - %d). Reset to 0"
 msgstr	"\n"
 	"%s%d expiré (0 - %d). Remis à 0"
 
-#: src/lang.c:766
+#: src/lang.c:779
 #, c-format
 msgid	"View '%s' (%s/%s)?"
 msgstr	"Vue '%s' (%s/%s) ?"
 
-#: src/lang.c:768
+#: src/lang.c:781
 #, c-format
 msgid	"\n"
 	"Warning: posting exceeds %d columns. Line %d is the first long one:\n"
 	"%-100s\n"
 msgstr	"\n"
-	"Attention : message excédant %d colonnes. Ligne %d est la première dépassant "
-	":\n"
+	"Attention : message excédant %d colonnes. Ligne %d est la première "
+	"dépassant :\n"
 	"%-100s\n"
 
-#: src/lang.c:769
+#: src/lang.c:782
 msgid	"\n"
 	"Warning: article unchanged after editing\n"
 msgstr	"\n"
 	"Attention : article inchangé après son édition\n"
 
-#: src/lang.c:770
+#: src/lang.c:783
 msgid	"\n"
 	"Warning: \"Subject:\" contains only whitespaces.\n"
 msgstr	"\n"
 	"Attention : \"Subject:\" contient que des espaces.\n"
 
-#: src/lang.c:771
+#: src/lang.c:784
 msgid	"\n"
 	"Warning: \"Subject:\" begins with \"Re: \" but there are no \"References:\".\n"
 msgstr	"\n"
 	"Attention : \"Subject:\" commence par \"Re: \" mais il n'y a pas de "
 	"\"References:\".\n"
 
-#: src/lang.c:773
+#: src/lang.c:786
 msgid	"\n"
 	"Warning: Article has \"References:\" but \"Subject:\" does not begin\n"
 	"         with \"Re: \" and does not contain \"(was:\".\n"
@@ -3151,7 +3310,7 @@ msgstr	"\n"
 	"Attention : L'article a \"References:\" mais \"Subject:\" ne commence\n"
 	"            avec \"Re: \" et ne contient pas \"(was:\".\n"
 
-#: src/lang.c:776
+#: src/lang.c:789
 msgid	"Read carefully!\n"
 	"\n"
 	"  You are about to cancel an article seemingly written by you. This will "
@@ -3173,7 +3332,7 @@ msgstr	"Lisez ceci attentivement !\n"
 	"Voici l'article que vous vous apprêtez à effacer :\n"
 	"\n"
 
-#: src/lang.c:780
+#: src/lang.c:793
 msgid	"\n"
 	"Warning: You are using a non-plain transfer encoding (such as base64 or\n"
 	"         quoted-printable) and an external inews program to submit your\n"
@@ -3185,7 +3344,7 @@ msgstr	"\n"
 	"            votre article. Si une signature y est ajoutée par cet inews,\n"
 	"            elle ne sera pas encodée correctement.\n"
 
-#: src/lang.c:785
+#: src/lang.c:798
 #, c-format
 msgid	"\n"
 	"\n"
@@ -3198,7 +3357,7 @@ msgstr	"\n"
 	"Certaines valeurs dans votre fichier %s ont changé !\n"
 	"Lisez le fichier WHATSNEW, etc...\n"
 
-#: src/lang.c:787
+#: src/lang.c:800
 #, c-format
 msgid	"\n"
 	"\n"
@@ -3207,35 +3366,35 @@ msgid	"\n"
 msgstr	"\n"
 	"\n"
 	"Vous repassez à tin %s depuis une version plus récente !\n"
-	"Certaines valeurs dans votre fichier %s peuvent être ignorés, d'autres\n"
-	"ont peut-être changés !\n"
+	"Certaines valeurs dans votre fichier %s peuvent être ignorées, d'autres\n"
+	"ont peut-être changées !\n"
 
-#: src/lang.c:790
+#: src/lang.c:803
 #, c-format
 msgid	"Warning: tin wrote fewer groups to your\n"
 	"\t%s\n"
 	"than it read at startup. If you didn't unsubscribe from %ld %s during\n"
 	"this session this indicates an error and you should backup your %s\n"
 	"before you start tin once again!\n"
-msgstr	"Attention : tin a écrit quelque groupes dans votre\n"
+msgstr	"Attention : tin a modifié quelque groupes dans votre\n"
 	"\t%s\n"
 	"qui est lu au lancement. Si vous ne vous êtes pas désabonné de %ld %s\n"
 	"lors de cette session, cela indique une erreur et vous devriez sauvegarder\n"
 	"votre %s avant de relancer tin !\n"
 
-#: src/lang.c:794
+#: src/lang.c:807
 #, c-format
 msgid	"\n"
 	"Warning: Found %d '-- \\n' lines, this may confuse some people.\n"
 msgstr	"\n"
 	"Attention : %d lignes '-- \\n' trouvées, cela peut prêter à confusion.\n"
 
-#: src/lang.c:795
+#: src/lang.c:808
 #, c-format
 msgid	"Warning: Only %d out of %d articles were saved"
 msgstr	"Attention : Seul %d sur %d articles ont été enregistrés"
 
-#: src/lang.c:796
+#: src/lang.c:809
 #, c-format
 msgid	"\n"
 	"Warning: Your signature  is longer than %d lines.  Since signatures usually "
@@ -3250,50 +3409,50 @@ msgstr	"\n"
 	"d'être\n"
 	"            le plus court possible.\n"
 
-#: src/lang.c:800
+#: src/lang.c:813
 #, c-format
 msgid	"Warning: this mail address may contain a spamtrap. %s=continue, %s=abort? "
-msgstr	"Attention : cette email peut contenir un piège à spam. %s=continuer, "
-	"%s=annuler ?"
+msgstr	"Attention : cette email peut contenir un piège à spam. %s=continuer, %"
+	"s=annuler ?"
 
-#: src/lang.c:801
+#: src/lang.c:814
 msgid	"\n"
 	"Warning: Signatures should start with '-- \\n' not with '--\\n'.\n"
 msgstr	"\n"
 	"Attention : Les signatures doivent commencer avec '-- \\n' et non par '-- "
 	"\\n'.\n"
 
-#: src/lang.c:802
+#: src/lang.c:815
 msgid	"Writing attributes file..."
 msgstr	"Écriture du fichier attributes..."
 
-#: src/lang.c:804
+#: src/lang.c:817
 #, c-format
-msgid	"%d Responses%s"
-msgstr	"%d Réponses%s"
+msgid	"%d Responses"
+msgstr	"%d Réponses"
 
-#: src/lang.c:806
+#: src/lang.c:819
 #, c-format
 msgid	"Added %d %s"
 msgstr	"%d %s ajouté(s)"
 
-#: src/lang.c:807
+#: src/lang.c:820
 msgid	"No unsubscribed groups to show"
-msgstr	"Pas de groupes désabonnés à afficher"
+msgstr	"Aucuns groupes non abonnés à afficher"
 
-#: src/lang.c:808
+#: src/lang.c:821
 msgid	"Showing subscribed to groups only"
 msgstr	"Afficher uniquement les groupes abonnés"
 
-#: src/lang.c:809
+#: src/lang.c:822
 msgid	"Yes "
 msgstr	"Oui "
 
-#: src/lang.c:810
+#: src/lang.c:823
 msgid	"    You have mail\n"
 msgstr	"    Nouveau mail\n"
 
-#: src/lang.c:815
+#: src/lang.c:828
 #, c-format
 msgid	"\n"
 	"Warning: Posting is in %s and contains characters which are not\n"
@@ -3308,20 +3467,15 @@ msgstr	"\n"
 	"            sont pas dans votre MM_NETWORK_CHARSET: %s.\n"
 	"            Ces caractères seront remplacés par '?' si vous laissez cet\n"
 	"            article inchangé. Pour éviter de réduire en bouillie votre\n"
-	"            article, soit éditez-le, soit enlever les caractères posant\n"
+	"            article, soit éditez-le, soit enlevez les caractères posant\n"
 	"            problème, ou bien changer la valeur de MM_NETWORK_CHARSET\n"
 	"            via le M)enu.\n"
 
-#: src/lang.c:826
-#, c-format
-msgid	"Redefined key %s '%s' -> '%s'\n"
-msgstr	"Clé %s redéfinie '%s' -> '%s'\n"
-
-#: src/lang.c:827
+#: src/lang.c:839
 msgid	"  -D       debug mode 1=NNTP 2=ALL"
 msgstr	"  -D       mode debug 1=NNTP 2=TOUS"
 
-#: src/lang.c:831
+#: src/lang.c:843
 msgid	"Read carefully!\n"
 	"\n"
 	"  You are about to cancel an article seemingly not written by you.  This "
@@ -3337,8 +3491,8 @@ msgid	"Read carefully!\n"
 	"\n"
 msgstr	"Lisez ceci attentivement !\n"
 	"\n"
-	"  Vous vous apprêtez à effacer un article qui fut apparemment écrit par "
-	"vous.Cela\n"
+	"  Vous vous apprêtez à effacer un article qui fut apparemment écrit par vous. "
+	"Cela\n"
 	"  effacera l'article sur de nombreux serveurs UseNet répartis sur el globe;\n"
 	"  La mojorité d'UseNet considère cela comme inapproprié, pour ne pas dire "
 	"complètement.\n"
@@ -3348,386 +3502,408 @@ msgstr	"Lisez ceci attentivement !\n"
 	"Voici l'article que vous vous apprêtez a effacer :\n"
 	"\n"
 
-#: src/lang.c:840
+#: src/lang.c:852
 msgid	"toggle color"
 msgstr	"(dés)activer la couleur"
 
-#: src/lang.c:841
-msgid	"# For color-adjust use the following numbers\n"
-	"#  0-black       1-red         2-green        3-brown\n"
-	"#  4-blue        5-pink        6-cyan         7-white\n"
+#: src/lang.c:853
+msgid	"# Changing colors of several screen parts\n"
+	"# Possible values are:\n"
+	"#  -1 = default (white for foreground and black for background)\n"
+	"#   0 = black\n"
+	"#   1 = red\n"
+	"#   2 = green\n"
+	"#   3 = brown\n"
+	"#   4 = blue\n"
+	"#   5 = pink\n"
+	"#   6 = cyan\n"
+	"#   7 = white\n"
 	"# These are *only* for foreground:\n"
-	"#  8-gray        9-lightred   10-lightgreen  11-yellow\n"
-	"# 12-lightblue  13-lightpink  14-lightcyan   15-lightwhite\n"
-	"# A '-1' is interpreted as default (foreground normally is white, and\n"
-	"# background black)\n"
+	"#   8 = gray\n"
+	"#   9 = light red\n"
+	"#  10 = light green\n"
+	"#  11 = yellow\n"
+	"#  12 = light blue\n"
+	"#  13 = light pink\n"
+	"#  14 = light cyan\n"
+	"#  15 = light white\n"
 	"\n"
-msgstr	"# Pour ajuster les couleurs utilisez les nombres suivants\n"
-	"#  0-noir        1-rouge       2-vert         3-marron\n"
-	"#  4-bleu        5-rose        6-cyan         7-blanc\n"
-	"# Celles-là sont *uniquement* pour l'arrière-plan :\n"
-	"#  8-gris        9-rouge gras 10-vert gras   11-jaune\n"
-	"# 12-bleu gras  13-rose gras  14-cyan gras   15-blanc gras\n"
-	"# '-1' est interprété comme défaut (l'avant-plan est normalement blanc,\n"
-	"# et l'arrière-plan noir)\n"
+msgstr	"# Changer la couleur de plusieurs parties de l'écran\n"
+	"# Les valeurs possibles sont :\n"
+	"#  -1 = défaut (blanc pour l'avant-plan et noir pour l'arrière-plan)\n"
+	"#   0 = noir\n"
+	"#   1 = rouge\n"
+	"#   2 = vert\n"
+	"#   3 = marron\n"
+	"#   4 = bleu\n"
+	"#   5 = rose\n"
+	"#   6 = cyan\n"
+	"#   7 = blanc\n"
+	"# Les valeurs suivantes ne sont *que* pour l'avant-plan :\n"
+	"#   8 = gris\n"
+	"#   9 = rouge gras\n"
+	"#  10 = vert gras\n"
+	"#  11 = jaune\n"
+	"#  12 = bleu grasn#  13 = rose gras\n"
+	"#  14 = cyan gras\n"
+	"#  15 = blanc gras\n"
 	"\n"
 
-#: src/lang.c:849
+#: src/lang.c:873
 msgid	"  -a       toggle color flag"
 msgstr	"  -a       change la couleur"
 
-#: src/lang.c:853
+#: src/lang.c:877
 msgid	"\n"
 	"Error: Followup-To set to more than one newsgroup!\n"
 msgstr	"\n"
 	"Erreur : Suivi positionné sur plus d'un groupe !\n"
 
-#: src/lang.c:854
+#: src/lang.c:878
 #, c-format
 msgid	"\n"
 	"Error: cross-posting to %d newsgroups and no Followup-To line!\n"
 msgstr	"\n"
 	"Erreur : multi-postage vers %d groupes et pas de ligne Followup-To !\n"
 
-#: src/lang.c:855
+#: src/lang.c:879
 #, c-format
 msgid	"\n"
 	"Error: \"%s\" is not a valid newsgroup!\n"
 msgstr	"\n"
 	"Erreur : \"%s\" n'est pas un groupe valide !\n"
 
-#: src/lang.c:857
+#: src/lang.c:881
 msgid	"\n"
 	"Warning: Followup-To set to more than one newsgroup!\n"
 msgstr	"\n"
 	"Attention : Suivi positionné sur plus d'un groupe !\n"
 
-#: src/lang.c:858
+#: src/lang.c:882
 #, c-format
 msgid	"\n"
 	"Warning: cross-posting to %d newsgroups and no Followup-To line!\n"
 msgstr	"\n"
 	"Attention : multi-postage vers %d groupes et aucun suivi !\n"
 
-#: src/lang.c:859
+#: src/lang.c:883
 #, c-format
 msgid	"\n"
 	"Warning: \"%s\" is not in your newsrc, it may be invalid at this site!\n"
 msgstr	"\n"
 	"Attention : \"%s\" n'est pas dans votre newsrc, votre article peut ne\n"
-	"            apparaître dans ce groupe !\n"
+	"            pas apparaître dans ce groupe !\n"
 	"\n"
 
-#: src/lang.c:860
+#: src/lang.c:884
 #, c-format
 msgid	"\n"
 	"Warning: \"%s\" is not a valid newsgroup at this site!\n"
 msgstr	"\n"
 	"Attention : \"%s\" n'est pas un groupe valide !\n"
 
-#: src/lang.c:864
+#: src/lang.c:888
 #, c-format
 msgid	"%d files successfully written from %d articles. %d %s occurred."
 msgstr	"%d fichiers des %d articles écrits avec succès. %d %s est survenu."
 
-#: src/lang.c:865
+#: src/lang.c:889
 msgid	"Missing parts."
-msgstr	"Parties manquantes"
+msgstr	"Parties manquantes."
 
-#: src/lang.c:866
+#: src/lang.c:890
 msgid	"No beginning."
 msgstr	"Pas de début."
 
-#: src/lang.c:867
+#: src/lang.c:891
 msgid	"No data."
 msgstr	"Pas de données."
 
-#: src/lang.c:868
+#: src/lang.c:892
 msgid	"Unknown error."
 msgstr	"Erreur inconnue."
 
-#: src/lang.c:870
+#: src/lang.c:895
 #, c-format
 msgid	"\tChecksum of %s (%ld %s)"
 msgstr	"\tSomme de contrôle de %s (%ld %s)"
 
-#: src/lang.c:874
+#: src/lang.c:900
 msgid	"Reading mail active file... "
 msgstr	"Lecture du fichier active mail... "
 
-#: src/lang.c:875
+#: src/lang.c:901
 msgid	"Reading mailgroups file... "
 msgstr	"Lecture du fichier mailgroups... "
 
-#: src/lang.c:879
+#: src/lang.c:905
 msgid	"perform PGP operations on article"
 msgstr	"effectuer des opérations PGP sur l'article"
 
-#: src/lang.c:880
+#: src/lang.c:906
 msgid	"Add key(s) to public keyring?"
 msgstr	"Ajouter les clé(s) au cercle public ?"
 
-#: src/lang.c:881
+#: src/lang.c:907
 #, c-format
 msgid	"%s=encrypt, %s=sign, %s=both, %s=quit: "
-msgstr	"%s=encodé, %s=signer, %s=les deux, %s=quitter : "
+msgstr	"%s=encoder, %s=signer, %s=les deux, %s=quitter : "
 
-#: src/lang.c:882
+#: src/lang.c:908
 #, c-format
 msgid	"%s=sign, %s=sign & include public key, %s=quit: "
 msgstr	"%s=signer, %s=sig. & inclure clé publique, %s=quitter : "
 
-#: src/lang.c:883
+#: src/lang.c:909
 #, c-format
 msgid	"PGP has not been set up (can't open %s)"
 msgstr	"PGP n'a pas été configuré (ouverture de %s impossible)"
 
-#: src/lang.c:884
+#: src/lang.c:910
 msgid	"Article not signed and no public keys found"
 msgstr	"Article non signé et pas de clés publiques trouvées"
 
-#: src/lang.c:886
+#: src/lang.c:912
 #, c-format
 msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone: "
 msgstr	"%s=quitter, %s=éditer, %s=ispell, %s=pgp, %s=menu, %s=poster, %s=brouillon : "
 
-#: src/lang.c:887
-msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%.*s]: "
-msgstr	"%s=quitter, %s=éditer, %s=ispell, %s=pgp, %s=envoyer [%%.*s] : "
+#: src/lang.c:913
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%s]: "
+msgstr	"%s=quitter, %s=éditer, %s=ispell, %s=pgp, %s=envoyer [%%s] : "
 
-#: src/lang.c:888
-msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	"%s=quitter, %s=éditer, %s=ispell, %s=pgp, %s=menu, %s=poster, %s=brouillon "
-	"[%%.*s]: "
+#: src/lang.c:914
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=quitter, %s=éditer, %s=ispell, %s=pgp, %s=menu, %s=poster, %s=brouillon [%%"
+	"s]: "
 
-#: src/lang.c:890
+#: src/lang.c:916
 #, c-format
 msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone: "
 msgstr	"%s=quitter, %s=éditer, %s=pgp, %s=menu, %s=poster, %s=brouillon : "
 
-#: src/lang.c:891
-msgid	"%s=quit, %s=edit, %s=pgp, %s=send [%%.*s]: "
-msgstr	"%s=quitter, %s=éditer, %s=pgp, %s=envoyer [%%.*s] : "
+#: src/lang.c:917
+#, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=send [%%s]: "
+msgstr	"%s=quitter, %s=éditer, %s=pgp, %s=envoyer [%%s] : "
 
-#: src/lang.c:892
-msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	"%s=quitter, %s=éditer, %s=pgp, %s=menu, %s=poster, %s=brouillon [%%.*s]: "
+#: src/lang.c:918
+#, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=quitter, %s=éditer, %s=pgp, %s=menu, %s=poster, %s=brouillon [%%s] : "
 
-#: src/lang.c:896
+#: src/lang.c:922
 #, c-format
 msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone: "
 msgstr	"%s=quitter, %s=éditer, %s=ispell, %s=menu, %s=poster, %s=brouillon : "
 
-#: src/lang.c:897
-msgid	"%s=quit, %s=edit, %s=ispell, %s=send [%%.*s]: "
-msgstr	"%s=quitter, %s=éditer, %s=ispell, %s=envoyer [%%.*s] : "
-
-#: src/lang.c:898
-msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	"%s=quitter, %s=éditer, %s=ispell, %s=menu, %s=poster, %s=brouillon [%%.*s]: "
+#: src/lang.c:923
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=send [%%s]: "
+msgstr	"%s=quitter, %s=éditer, %s=ispell, %s=envoyer [%%s] : "
 
-#: src/lang.c:900
+#: src/lang.c:924
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=quitter, %s=éditer, %s=ispell, %s=menu, %s=poster, %s=brouillon [%%s] : "
+
+#: src/lang.c:926
 #, c-format
 msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone: "
 msgstr	"%s=quitter, %s=éditer, %s=menu, %s=poster, %s=brouillon : "
 
-#: src/lang.c:901
-msgid	"%s=quit, %s=edit, %s=send [%%.*s]: "
-msgstr	"%s=quitter, %s=éditer, %s=envoyer [%%.*s] : "
-
-#: src/lang.c:902
-msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr	"%s=quitter, %s=éditer, %s=menu, %s=poster, %s=brouillon [%%.*s]: "
-
-#: src/lang.c:908
+#: src/lang.c:927
 #, c-format
-msgid	"Environment variable %s not found. Set and retry..."
-msgstr	"Variable d'environnemeent %s introuvable. En choisir une puis réessayez..."
+msgid	"%s=quit, %s=edit, %s=send [%%s]: "
+msgstr	"%s=quitter, %s=éditer, %s=envoyer [%%s] : "
 
-#: src/lang.c:909
-msgid	"  -B       BBS mode. File operations limited to home directories."
-msgstr	""
+#: src/lang.c:928
+#, c-format
+msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=quitter, %s=éditer, %s=menu, %s=poster, %s=brouillon [%%s]: "
 
-#: src/lang.c:917
+#: src/lang.c:937
 msgid	"Try cache_overview_files to speed up things.\n"
-msgstr	""
+msgstr	"Activez 'cache_overview_files' pour accélérer les choses.\n"
 
-#: src/lang.c:918
+#: src/lang.c:938
 msgid	"Tin will use local index files instead.\n"
-msgstr	""
+msgstr	"Tin utilisera à la place un index local.\n"
 
-#: src/lang.c:919
+#: src/lang.c:939
 msgid	"Cannot find NNTP server name"
 msgstr	"Nom du serveur NNTP introuvable"
 
-#: src/lang.c:920
+#: src/lang.c:940
 #, c-format
 msgid	"Connecting to %s:%d..."
 msgstr	"Connexion à %s:%d..."
 
-#: src/lang.c:921
+#: src/lang.c:941
 msgid	"Disconnecting from server...\n"
 msgstr	"Déconnexion du serveur...\n"
 
-#: src/lang.c:922
+#: src/lang.c:942
 #, c-format
 msgid	"Wrong newsgroup name in response of GROUP command, %s for %s"
 msgstr	"Nom de groupe erroné dans la réponse de la cmd GROUP, %s pour %s"
 
-#: src/lang.c:923
+#: src/lang.c:943
 #, c-format
 msgid	"Failed to connect to NNTP server %s. Exiting..."
 msgstr	"Échec de la connexion au serveur NNTP %s. Fermeture..."
 
-#: src/lang.c:924 src/nntplib.c:975
+#: src/lang.c:944
 msgid	"205  Closing connection"
-msgstr	"205 Fermeture de la connexion"
+msgstr	"205  Fermeture de la connexion"
 
-#: src/lang.c:925
+#: src/lang.c:945
 msgid	"Your server does not support the NNTP XOVER or OVER command.\n"
 msgstr	"Votre serveur ne supporte pas la commande NNTP XOVER ou OVER.\n"
 
-#: src/lang.c:926
+#: src/lang.c:946
 msgid	"Connection to news server has timed out. Reconnect?"
 msgstr	"Connexion au serveur de nouvelles expirée. Se reconnecter ?"
 
-#: src/lang.c:927
+#: src/lang.c:947
 #, c-format
 msgid	"Put the server name in the file %s,\n"
 	"or set the environment variable NNTPSERVER"
 msgstr	"Mettez le nom du serveur dans le fichier %s,\n"
 	"ou utilisez la variable d'environnement NNTPSERVER"
 
-#: src/lang.c:928
+#: src/lang.c:948
 msgid	"  -A       force authentication on connect"
 msgstr	"  -A       force l'authentication à la connexion"
 
-#: src/lang.c:929
+#: src/lang.c:949
 #, c-format
 msgid	"  -g serv  read news from NNTP server serv [default=%s]"
 msgstr	"  -g serv  lire depuis le serveur NNTP serv [défaut=%s]"
 
-#: src/lang.c:930
+#: src/lang.c:950
 #, c-format
 msgid	"  -p port  use port as NNTP port [default=%d]"
 msgstr	"  -p port  utiliser port comme port NNTP [défaut=%d]"
 
-#: src/lang.c:931
+#: src/lang.c:951
 msgid	"  -Q       quick start. Same as -nqd"
 msgstr	"  -Q       démarrage rapide. Idem que -npd"
 
-#: src/lang.c:932
+#: src/lang.c:952
 msgid	"  -l       use only LIST instead of GROUP (-n) command"
-msgstr	"  -l       utilise seulement LIST plutôt que GROUP (n-)"
+msgstr	"  -l       utilise seulement LIST plutôt que GROUP (-n)"
 
-#: src/lang.c:933
+#: src/lang.c:953
 msgid	"  -n       only read subscribed .newsrc groups from NNTP server"
 msgstr	"  -n       lire seulement groupes abonnés du .newsrc depuis le serveur NNTP"
 
-#: src/lang.c:935
+#: src/lang.c:955
 #, c-format
 msgid	"%s/tcp: Unknown service.\n"
 msgstr	"%s/tcp : Service inconnu.\n"
 
-#: src/lang.c:938
+#: src/lang.c:958
 msgid	"\n"
 	"socket or connect problem\n"
 msgstr	"\n"
 	"problème de socket ou de connexion\n"
 
-#: src/lang.c:940
+#: src/lang.c:960
 #, c-format
 msgid	"\n"
 	"Connection to %s: "
 msgstr	"\n"
 	"Connexion à %s : "
 
-#: src/lang.c:941
+#: src/lang.c:961
 msgid	"Giving up...\n"
 msgstr	"Abandon...\n"
 
-#: src/lang.c:944
+#: src/lang.c:964
 msgid	"Your server does not have Xref: in its XOVER information.\n"
 	"Tin will try to use XHDR XREF instead (slows down things a bit).\n"
 msgstr	"Votre serveur n'a pas d'Xref: dans son information XOVER.\n"
 	"Tin essayera d'utiliser XHDR XREF à la place (plus lent).\n"
 
-#: src/lang.c:947
+#: src/lang.c:967
 msgid	"Your server does not have Xref: in its XOVER information.\n"
 msgstr	"Votre serveur n'a pas d'Xref: dans son information XOVER.\n"
 
-#: src/lang.c:950
+#: src/lang.c:970
 #, c-format
 msgid	"Can't open %s. Try %s -r to read news via NNTP.\n"
 msgstr	"Ouverture de %s impossible. Essayez %s -r pour lire via NNTP.\n"
 
-#: src/lang.c:953
+#: src/lang.c:973
 msgid	"  -Q       quick start. Same as -qd"
 msgstr	"  -Q       démarrage rapide. Idem que -qd"
 
-#: src/lang.c:954
+#: src/lang.c:974
 msgid	"  -l       read only active file instead of scanning spool (-n) command"
 msgstr	"  -l       lire seulement le fichier active plutôt que le spool (-n)"
 
-#: src/lang.c:955
+#: src/lang.c:975
 msgid	"  -n       only read subscribed .newsrc groups from spool"
 msgstr	"  -n       lire seulement groupes abonnés du .newsrc depuis le spool"
 
-#: src/lang.c:956
+#: src/lang.c:976
 msgid	"Your server does not have Xref: in its NOV-files.\n"
-msgstr	"Votre serveur n'a pas d'Xref: dans son fichier NOV.\n"
+msgstr	"Votre serveur n'a pas d'Xref: dans ses fichiers NOV.\n"
 
-#: src/lang.c:960
+#: src/lang.c:980
 msgid	"Posting using external inews failed. Use built in inews instead?"
 msgstr	"Le postage avec l'inews externe à échoué. Utiliser l'inews intégré ?"
 
-#: src/lang.c:961
+#: src/lang.c:981
 msgid	"It worked! Should I always use my built in inews from now on?"
 msgstr	"Ca a marché ! Devrais-je toujours utiliser mon inews intégré à présent ?"
 
-#: src/lang.c:969
+#: src/lang.c:989
 #, c-format
 msgid	"%d %s printed"
 msgstr	"%d %s imprimé"
 
-#: src/lang.c:970
+#: src/lang.c:990
 msgid	"output article/thread/hot/pattern/tagged articles to printer"
 msgstr	"envoyer article/fil/sél./articles marqués à l'imprimante"
 
-#: src/lang.c:971
+#: src/lang.c:991
 msgid	"Print"
 msgstr	"Imprimer"
 
-#: src/lang.c:972
+#: src/lang.c:992
 msgid	"Printing..."
 msgstr	"Impression..."
 
-#: src/lang.c:976
+#: src/lang.c:996
 msgid	"pipe article/thread/hot/pattern/tagged articles into command"
 msgstr	"passer article/fil/sél./articles marqués à une commande"
 
-#: src/lang.c:977
+#: src/lang.c:997
 msgid	"No command"
-msgstr	"Pas de commande"
+msgstr	"Aucune commande"
 
-#: src/lang.c:978
+#: src/lang.c:998
 msgid	"Pipe"
 msgstr	"Passer (pipe)"
 
-#: src/lang.c:979
+#: src/lang.c:999
 #, c-format
 msgid	"Pipe to command [%.*s]> "
-msgstr	"Passer à la commande [%.*s]> "
+msgstr	"Passer à la commande [%.*s] > "
 
-#: src/lang.c:980
+#: src/lang.c:1000
 msgid	"Piping..."
 msgstr	"Passage..."
 
-#: src/lang.c:982
+#: src/lang.c:1002
 msgid	"Piping not enabled."
 msgstr	"Passage non activé."
 
-#: src/lang.c:986
+#: src/lang.c:1006
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line has spaces  in it that MUST be removed.\n"
@@ -3740,7 +3916,7 @@ msgstr	"\n"
 	"         du contenu. Utilisez une virgule (,) pour séparer de multiples\n"
 	"         noms de groupes.\n"
 
-#: src/lang.c:991
+#: src/lang.c:1011
 #, c-format
 msgid	"\n"
 	"Error: The \"%s:\" line is  continued in  the next line.  Since\n"
@@ -3751,7 +3927,7 @@ msgstr	"\n"
 	"         Comme la ligne ne contient pas d'espace, ce n'est pas autorisé.\n"
 	"         Inscrivez svp tous les groupes sur une seule ligne.\n"
 
-#: src/lang.c:996
+#: src/lang.c:1016
 #, c-format
 msgid	"\n"
 	"Warning: The \"%s:\" line is continued in the next line.\n"
@@ -3764,7 +3940,7 @@ msgstr	"\n"
 	"            Pour éviter les problèmes, indiquez tous les groupes sur une\n"
 	"            seule ligne.\n"
 
-#: src/lang.c:1000
+#: src/lang.c:1020
 #, c-format
 msgid	"\n"
 	"Warning: The \"%s:\" line has spaces in it that SHOULD be removed.\n"
@@ -3772,7 +3948,7 @@ msgstr	"\n"
 	"Attention : La ligne \"%s:\" contient un ou des espaces qui DOIVENT\n"
 	"            être enlevés.\n"
 
-#: src/lang.c:1005
+#: src/lang.c:1025
 msgid	"\n"
 	"  If your article contains quoted text  please take some time to pare it "
 	"down\n"
@@ -3806,863 +3982,1026 @@ msgstr	"\n"
 	"simples\n"
 	"  règles, pratiquement toutes les personnes ignoreront vos articles.\n"
 
-#: src/lang.c:1018
+#: src/lang.c:1038
 msgid	"shell escape"
 msgstr	"accéder à un shell"
 
-#: src/lang.c:1019
+#: src/lang.c:1039
 #, c-format
 msgid	"Shell Command (%s)"
 msgstr	"Commande shell (%s)"
 
-#: src/lang.c:1020
+#: src/lang.c:1040
 #, c-format
 msgid	"Enter shell command [%s]> "
-msgstr	"Commande shell [%s]> "
+msgstr	"Commande shell [%s] > "
 
-#: src/lang.c:1024
+#: src/lang.c:1044
 #, c-format
 msgid	"%s: Can't get entry for TERM\n"
 msgstr	"%s : Entrée pour TERM introuvable\n"
 
-#: src/lang.c:1028
+#: src/lang.c:1048
 #, c-format
 msgid	"Group %.*s ('q' to quit)..."
 msgstr	"Groupe %.*s ('q' pour quitter)..."
 
-#: src/lang.c:1030
+#: src/lang.c:1050
 #, c-format
 msgid	"Group %.*s..."
 msgstr	"Groupe %.*s..."
 
-#: src/lang.c:1034
+#: src/lang.c:1054
 msgid	"Server unavailable\n"
 msgstr	"Service indisponible\n"
 
-# TRANSLATION TOO LONG
-#: src/lang.c:1040
+#: src/lang.c:1060
 #, c-format
-msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; "
-	"%s=post"
-msgstr	"%s=pipe; %s=mail; %s=imprimer; %s=quitter; %s=voir lu/non lu; %s=enregistrer; "
-	"%s=marquer; %s=poster"
+msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %"
+	"s=post"
+msgstr	"%s=pipe; %s=mail; %s=impr.; %s=quitter; %s=voir lu/non lu; %s=enreg.; %"
+	"s=marquer; %s=poster"
 
-# TRANSLATION TOO LONG
-#: src/lang.c:1041
+#: src/lang.c:1061
 #, c-format
 msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
-msgstr	"%s=pipe; %s=mail; %s=imprimer; %s=quitter; %s=répondre; %s=enregistrer; "
-	"%s=marquer; %s=poster"
+msgstr	"%s=pipe; %s=mail; %s=impr.; %s=quitter; %s=répondre; %s=enreg.; %s=marquer; %"
+	"s=poster"
 
-#: src/lang.c:1043
+#: src/lang.c:1063
 #, c-format
 msgid	"%s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
-msgstr	"%s=mail; %s=imprimer; %s=quitter; %s=voir lu/non lu; %s=enregistrer; "
-	"%s=marquer; %s=poster"
+msgstr	"%s=mail; %s=imprimer; %s=quitter; %s=voir lu/non lu; %s=enregistrer; %"
+	"s=marquer; %s=poster"
 
-#: src/lang.c:1044
+#: src/lang.c:1064
 #, c-format
 msgid	"%s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
-msgstr	"%s=mail; %s=imprimer; %s=quitter; %s=répondre; %s=enregistrer; %s=marquer; "
-	"%s=poster"
+msgstr	"%s=mail; %s=imprimer; %s=quitter; %s=répondre; %s=enregistrer; %s=marquer; %"
+	"s=poster"
 
-#: src/lang.c:1048
+#: src/lang.c:1068
 #, c-format
 msgid	"%s=pipe; %s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
-msgstr	"%s=pipe; %s=mail; %s=quitter; %s=voir lu/non lu; %s=enregistrer; %s=marquer; "
-	"%s=poster"
+msgstr	"%s=pipe; %s=mail; %s=quitter; %s=voir lu/non lu; %s=enregistrer; %s=marquer; %"
+	"s=poster"
 
-#: src/lang.c:1049
+#: src/lang.c:1069
 #, c-format
 msgid	"%s=pipe; %s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
-msgstr	"%s=pipe; %s=mail; %s=quitter; %s=répondre; %s=enregistrer; %s=marquer; "
-	"%s=poster"
+msgstr	"%s=pipe; %s=mail; %s=quitter; %s=répondre; %s=enregistrer; %s=marquer; %"
+	"s=poster"
 
-#: src/lang.c:1051
+#: src/lang.c:1071
 #, c-format
 msgid	"%s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
 msgstr	"%s=mail; %s=quitter; %s=voir lu/non lu; %s=enregistrer; %s=marquer; %s=poster"
 
-#: src/lang.c:1052
+#: src/lang.c:1072
 #, c-format
 msgid	"%s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr	"%s=mail; %s=quitter; %s=répondre; %s=enregistrer; %s=marquer; %s=poster"
 
-#: src/lang.c:1058
+#: src/lang.c:1078
 msgid	"Terminal does not support color"
-msgstr	"Terminal ne supporte pas les couleurs"
+msgstr	"Le terminal ne supporte pas les couleurs"
 
-#: src/lang.c:1063
+#: src/lang.c:1083
 #, c-format
 msgid	"Trying %s"
 msgstr	"Essai %s"
 
-#: src/lang.c:1077 src/lang.c:1102 src/lang.c:1118 src/refs.c:266
+#: src/lang.c:1097 src/lang.c:1123 src/lang.c:1139 src/lang.c:1318 src/refs.c:296
 msgid	"None"
 msgstr	"Aucun"
 
-#: src/lang.c:1078
+#: src/lang.c:1098
 msgid	"Subject"
 msgstr	"Sujet"
 
-#: src/lang.c:1079
+#: src/lang.c:1099
 msgid	"References"
 msgstr	"Références"
 
-#: src/lang.c:1080
+#: src/lang.c:1100
 msgid	"Both Subject and References"
-msgstr	"Sujet & Références"
+msgstr	"Sujet et Références"
 
-#: src/lang.c:1081
+#: src/lang.c:1101
 msgid	"Multipart Subject"
 msgstr	"Sujet multiparties"
 
-#: src/lang.c:1093 src/lang.c:1204
+# TRANSLATION MISSING
+#: src/lang.c:1102
+msgid	"Percentage Match"
+msgstr	""
+
+#: src/lang.c:1114 src/lang.c:1225
 msgid	"No"
 msgstr	"Non"
 
-#: src/lang.c:1094 src/lang.c:1206
+#: src/lang.c:1115 src/lang.c:1227
 msgid	"Yes"
 msgstr	"Oui"
 
-#: src/lang.c:1095
+#: src/lang.c:1116
 msgid	"Hide All"
 msgstr	"Tout masquer"
 
-#: src/lang.c:1103
+#: src/lang.c:1124
 msgid	"Address"
 msgstr	"Adresse"
 
-#: src/lang.c:1104
+#: src/lang.c:1125
 msgid	"Full Name"
 msgstr	"Nom complet"
 
-#: src/lang.c:1105
+#: src/lang.c:1126
 msgid	"Address and Name"
 msgstr	"Adresse et Nom"
 
-#: src/lang.c:1112
+#: src/lang.c:1133
 msgid	"Max"
 msgstr	"Max"
 
-#: src/lang.c:1113
+#: src/lang.c:1134
 msgid	"Sum"
-msgstr	"Sum"
+msgstr	"Addition"
 
-#: src/lang.c:1114
+#: src/lang.c:1135
 msgid	"Average"
 msgstr	"Moyenne"
 
-#: src/lang.c:1119
+#: src/lang.c:1140
 msgid	"Lines"
 msgstr	"Lignes"
 
-#: src/lang.c:1120
+#: src/lang.c:1141
 msgid	"Score"
 msgstr	"Score"
 
-#: src/lang.c:1121
+#: src/lang.c:1142
 msgid	"Lines & Score"
 msgstr	"Lignes & Score"
 
-#: src/lang.c:1130
+#: src/lang.c:1151
 msgid	"Black"
 msgstr	"Noir"
 
-#: src/lang.c:1131
+#: src/lang.c:1152
 msgid	"Red"
 msgstr	"Rouge"
 
-#: src/lang.c:1132
+#: src/lang.c:1153
 msgid	"Green"
 msgstr	"Vert"
 
-#: src/lang.c:1133
+#: src/lang.c:1154
 msgid	"Brown"
 msgstr	"Marron"
 
-#: src/lang.c:1134
+#: src/lang.c:1155
 msgid	"Blue"
 msgstr	"Bleu"
 
-#: src/lang.c:1135
+#: src/lang.c:1156
 msgid	"Pink"
 msgstr	"Rose"
 
-#: src/lang.c:1136
+#: src/lang.c:1157
 msgid	"Cyan"
 msgstr	"Cyan"
 
-#: src/lang.c:1137
+#: src/lang.c:1158
 msgid	"White"
 msgstr	"Blanc"
 
-#: src/lang.c:1138
+#: src/lang.c:1159
 msgid	"Gray"
 msgstr	"Gris"
 
-#: src/lang.c:1139
+#: src/lang.c:1160
 msgid	"Light Red"
 msgstr	"Rouge gras"
 
-#: src/lang.c:1140
+#: src/lang.c:1161
 msgid	"Light Green"
 msgstr	"Vert gras"
 
-#: src/lang.c:1141
+#: src/lang.c:1162
 msgid	"Yellow"
 msgstr	"Jaune"
 
-#: src/lang.c:1142
+#: src/lang.c:1163
 msgid	"Light Blue"
 msgstr	"Bleu gras"
 
-#: src/lang.c:1143
+#: src/lang.c:1164
 msgid	"Light Pink"
 msgstr	"Rose gras"
 
-#: src/lang.c:1144
+#: src/lang.c:1165
 msgid	"Light Cyan"
 msgstr	"Cyan gras"
 
-#: src/lang.c:1145
+#: src/lang.c:1166
 msgid	"Light White"
 msgstr	"Blanc gras"
 
-#: src/lang.c:1153 src/lang.c:1210 src/lang.c:1224
+#: src/lang.c:1174 src/lang.c:1231 src/lang.c:1245
 msgid	"Nothing"
 msgstr	"Rien"
 
-#: src/lang.c:1154
+#: src/lang.c:1175
 msgid	"Mark"
 msgstr	"Marque"
 
-#: src/lang.c:1155
+#: src/lang.c:1176
 msgid	"Space"
 msgstr	"Espace"
 
-#: src/lang.c:1162
+#: src/lang.c:1183
 msgid	"Normal"
 msgstr	"Normal"
 
-#: src/lang.c:1163
+#: src/lang.c:1184
 msgid	"Best highlighting"
 msgstr	"Meilleure surbrillance"
 
-#: src/lang.c:1164
+#: src/lang.c:1185
 msgid	"Underline"
 msgstr	"Souligné"
 
-#: src/lang.c:1165
+#: src/lang.c:1186
 msgid	"Reverse video"
 msgstr	"Vidéo inversée"
 
-#: src/lang.c:1166
+#: src/lang.c:1187
 msgid	"Blinking"
 msgstr	"Clignotement"
 
-#: src/lang.c:1167
+#: src/lang.c:1188
 msgid	"Half bright"
 msgstr	"Moins lumineux"
 
-#: src/lang.c:1168
+#: src/lang.c:1189
 msgid	"Bold"
 msgstr	"Gras"
 
-#: src/lang.c:1173
+#: src/lang.c:1194
 msgid	"none"
 msgstr	"aucun"
 
-#: src/lang.c:1174
+#: src/lang.c:1195
 msgid	"commands"
 msgstr	"commandes"
 
-#: src/lang.c:1175
+#: src/lang.c:1196
 msgid	"select"
 msgstr	"sélection"
 
-#: src/lang.c:1177
+#: src/lang.c:1198
 msgid	"commands & quit"
 msgstr	"commandes & quitter"
 
-#: src/lang.c:1178
+#: src/lang.c:1199
 msgid	"commands & select"
 msgstr	"commandes & sélection"
 
-#: src/lang.c:1179
+#: src/lang.c:1200
 msgid	"quit & select"
 msgstr	"quitter & sélection"
 
-#: src/lang.c:1180
+#: src/lang.c:1201
 msgid	"commands & quit & select"
 msgstr	"commandes, quitter & sélection"
 
-#: src/lang.c:1205
+#: src/lang.c:1226
 msgid	"Shell archive"
 msgstr	"Archive shell"
 
-#: src/lang.c:1211
+#: src/lang.c:1232
 msgid	"Subject: (descending)"
-msgstr	"Sujet : (descendant)"
+msgstr	"Subject : (descendant)"
 
-#: src/lang.c:1212
+#: src/lang.c:1233
 msgid	"Subject: (ascending)"
-msgstr	"Sujet : (ascendant)"
+msgstr	"Subject : (ascendant)"
 
-#: src/lang.c:1213
+#: src/lang.c:1234
 msgid	"From: (descending)"
-msgstr	"De : (descendant)"
+msgstr	"From: (descendant)"
 
-#: src/lang.c:1214
+#: src/lang.c:1235
 msgid	"From: (ascending)"
-msgstr	"De : (ascendant)"
+msgstr	"From: (ascendant)"
 
-#: src/lang.c:1215
+#: src/lang.c:1236
 msgid	"Date: (descending)"
-msgstr	"Date : (descendant)"
+msgstr	"Date: (descendant)"
 
-#: src/lang.c:1216
+#: src/lang.c:1237
 msgid	"Date: (ascending)"
-msgstr	"Date : (ascendant)"
+msgstr	"Date: (ascendant)"
 
-#: src/lang.c:1217 src/lang.c:1225
+#: src/lang.c:1238 src/lang.c:1246
 msgid	"Score (descending)"
 msgstr	"Score (descendant)"
 
-#: src/lang.c:1218 src/lang.c:1226
+#: src/lang.c:1239 src/lang.c:1247
 msgid	"Score (ascending)"
 msgstr	"Score (ascendant)"
 
-#: src/lang.c:1219
+#: src/lang.c:1240
 msgid	"Lines: (descending)"
-msgstr	"Lignes : (descendant)"
+msgstr	"Lines: (descendant)"
 
-#: src/lang.c:1220
+#: src/lang.c:1241
 msgid	"Lines: (ascending)"
-msgstr	"Lignes : (ascendant)"
+msgstr	"Lines: (ascendant)"
 
-#: src/lang.c:1231
+#: src/lang.c:1252
 msgid	"Always Keep"
 msgstr	"Toujours garder"
 
-#: src/lang.c:1232
+#: src/lang.c:1253
 msgid	"Always Remove"
 msgstr	"Toujours effacer"
 
-#: src/lang.c:1233
+#: src/lang.c:1254
 msgid	"Mark with D on selection screen"
 msgstr	"Marquer avec un D dans la vue sélection"
 
-#: src/lang.c:1238
+#: src/lang.c:1259
 msgid	"Kill only unread arts"
 msgstr	"Filtrer uniquement les articles non lus"
 
-#: src/lang.c:1239
+#: src/lang.c:1260
 msgid	"Kill all arts & show with K"
 msgstr	"Filtrer tous les articles & afficher avec un K"
 
 #. TODO: s/K/art_marked_killed/
-#: src/lang.c:1240
+#: src/lang.c:1261
 msgid	"Kill all arts and never show"
 msgstr	"Filtrer tous les articles et ne jamais afficher"
 
-#: src/lang.c:1245
+#: src/lang.c:1266
 msgid	"Nothing special"
 msgstr	"Rien de spécial"
 
-#: src/lang.c:1246
+#: src/lang.c:1267
 msgid	"Compress quotes"
 msgstr	"Citations compressées"
 
-#: src/lang.c:1247
+#: src/lang.c:1268
 msgid	"Quote signatures"
 msgstr	"Citer les signatures"
 
-#: src/lang.c:1248
+#: src/lang.c:1269
 msgid	"Compress quotes, quote sigs"
 msgstr	"Compresser les citations, citer les signatures"
 
-#: src/lang.c:1249
+#: src/lang.c:1270
 msgid	"Quote empty lines"
 msgstr	"Citer les lignes vides"
 
-#: src/lang.c:1250
+#: src/lang.c:1271
 msgid	"Compress quotes, quote empty lines"
 msgstr	"Compresser les citations, citer les lignes vides"
 
-#: src/lang.c:1251
+#: src/lang.c:1272
 msgid	"Quote sigs & empty lines"
 msgstr	"Citer les signatures & les lignes vides"
 
-#: src/lang.c:1252
+#: src/lang.c:1273
 msgid	"Comp. q., quote sigs & empty lines"
-msgstr	"Compr. les citations, citer les signatures & les lignes vides"
+msgstr	"Citations compr., signatures et lignes vides citées"
+
+#: src/lang.c:1311
+msgid	"no"
+msgstr	"non"
+
+#: src/lang.c:1312
+msgid	"with headers"
+msgstr	"avec les en-têtes"
+
+#: src/lang.c:1313
+msgid	"without headers"
+msgstr	"sans les en-têtes"
+
+#: src/lang.c:1320 src/lang.c:1326
+msgid	"NFKC"
+msgstr	"NFKC"
+
+#: src/lang.c:1321
+msgid	"NFKD"
+msgstr	"NFKD"
+
+#: src/lang.c:1322
+msgid	"NFC"
+msgstr	"NFC"
+
+#: src/lang.c:1323
+msgid	"NFD"
+msgstr	"NFD"
 
-#: src/lang.c:1290
+#: src/lang.c:1334
 msgid	"Display Options"
 msgstr	"Options d'affichage"
 
-#: src/lang.c:1296
+#: src/lang.c:1341
 msgid	"Color Options"
 msgstr	"Options des couleurs"
 
-#: src/lang.c:1302
+#: src/lang.c:1348
 msgid	"Article-Limiting Options"
 msgstr	"Options des articles"
 
-#: src/lang.c:1308
+#: src/lang.c:1354
 msgid	"Posting/Mailing Options"
 msgstr	"Options de postage/messagerie"
 
-#: src/lang.c:1314
+#: src/lang.c:1360
 msgid	"Saving/Printing Options"
 msgstr	"Options d'enregistrement/d'impression"
 
-#: src/lang.c:1320
+#: src/lang.c:1366
 msgid	"Expert Options"
 msgstr	"Options avancées"
 
-#: src/lang.c:1326
+#: src/lang.c:1372
 msgid	"Filtering Options"
 msgstr	"Options de filtrage"
 
-#: src/lang.c:1331 src/lang.c:1357 src/lang.c:1363 src/lang.c:1370 src/lang.c:1402
-#: src/lang.c:1408 src/lang.c:1416 src/lang.c:1436 src/lang.c:1511 src/lang.c:1673
-#: src/lang.c:1679 src/lang.c:1685 src/lang.c:1691 src/lang.c:1703 src/lang.c:1710
-#: src/lang.c:1761 src/lang.c:1770 src/lang.c:1776 src/lang.c:1782 src/lang.c:1788
-#: src/lang.c:1794 src/lang.c:1800 src/lang.c:1806 src/lang.c:1812 src/lang.c:1818
-#: src/lang.c:1824 src/lang.c:1830 src/lang.c:1836 src/lang.c:1842 src/lang.c:1848
-#: src/lang.c:1854 src/lang.c:1860 src/lang.c:1866 src/lang.c:1872 src/lang.c:1878
-#: src/lang.c:1884 src/lang.c:1891 src/lang.c:1897 src/lang.c:1903 src/lang.c:1910
-#: src/lang.c:1921 src/lang.c:1927 src/lang.c:1933 src/lang.c:1939 src/lang.c:1945
-#: src/lang.c:1959 src/lang.c:1971 src/lang.c:2005 src/lang.c:2057 src/lang.c:2064
-#: src/lang.c:2070 src/lang.c:2095 src/lang.c:2112 src/lang.c:2165 src/lang.c:2198
-#: src/lang.c:2218 src/lang.c:2253 src/lang.c:2261 src/lang.c:2286 src/lang.c:2298
+#: src/lang.c:1377 src/lang.c:1408 src/lang.c:1414 src/lang.c:1440 src/lang.c:1490
+#: src/lang.c:1496 src/lang.c:1506 src/lang.c:1526 src/lang.c:1601 src/lang.c:1771
+#: src/lang.c:1777 src/lang.c:1783 src/lang.c:1789 src/lang.c:1801 src/lang.c:1808
+#: src/lang.c:1862 src/lang.c:1871 src/lang.c:1877 src/lang.c:1884 src/lang.c:1891
+#: src/lang.c:1898 src/lang.c:1905 src/lang.c:1912 src/lang.c:1919 src/lang.c:1926
+#: src/lang.c:1933 src/lang.c:1940 src/lang.c:1947 src/lang.c:1954 src/lang.c:1961
+#: src/lang.c:1968 src/lang.c:1975 src/lang.c:1982 src/lang.c:1989 src/lang.c:1996
+#: src/lang.c:2003 src/lang.c:2010 src/lang.c:2017 src/lang.c:2024 src/lang.c:2031
+#: src/lang.c:2039 src/lang.c:2055 src/lang.c:2062 src/lang.c:2069 src/lang.c:2076
+#: src/lang.c:2082 src/lang.c:2088 src/lang.c:2105 src/lang.c:2117 src/lang.c:2151
+#: src/lang.c:2204 src/lang.c:2211 src/lang.c:2217 src/lang.c:2242 src/lang.c:2259
+#: src/lang.c:2312 src/lang.c:2348 src/lang.c:2368 src/lang.c:2403 src/lang.c:2413
+#: src/lang.c:2438 src/lang.c:2454 src/lang.c:2473 src/lang.c:2486
 msgid	"<SPACE> toggles, <CR> sets, <ESC> cancels."
-msgstr	"<ESPACE> changer, <CR> régler, <ESC> annuler."
+msgstr	"<ESPACE> change, <RETOUR> valide, <ESC> annule."
 
-#: src/lang.c:1332
-msgid	"Show mini menu & posting etiquette :"
-msgstr	"Afficher menu & intitulé du postage:"
+#: src/lang.c:1378
+msgid	"Show mini menu & posting etiquette"
+msgstr	"Afficher le menu & l'intitulé du postage"
 
-#: src/lang.c:1333
+#: src/lang.c:1379
 msgid	"# If ON show a mini menu of useful commands at each level\n"
 	"# and posting etiquette after composing an article\n"
-msgstr	"# Si ON affiche un mini menu des commandes utiles pour chaque\n"
+msgstr	"# Si ON, affiche un mini menu des commandes utiles pour chaque\n"
 	"# niveaux et affiche les détails après la composition d'un article\n"
 
-#: src/lang.c:1338
+#: src/lang.c:1384
 msgid	"Show short description for each newsgroup. <SPACE> toggles & <CR> sets."
-msgstr	"Afficher une brève description pour chaque groupe. <ESPACE> changer & <CR> "
-	"régler."
+msgstr	"Afficher une brève description pour chaque groupe. <ESPACE> change & <RETOUR> "
+	"valide."
 
-#: src/lang.c:1339
-msgid	"Show description of each newsgroup :"
-msgstr	"Voir description de chaque groupe  :"
+#: src/lang.c:1385
+msgid	"Show description of each newsgroup"
+msgstr	"Voir description de chaque groupe"
 
-#: src/lang.c:1340
+#: src/lang.c:1386
 msgid	"# If ON show group description text after newsgroup name at\n"
 	"# group selection level\n"
-msgstr	"# Si ON affiche une description du groupe après son nom dans\n"
+msgstr	"# Si ON, affiche une description du groupe après son nom dans\n"
 	"# la vue de sélection des groupes\n"
 
-#: src/lang.c:1345
+#: src/lang.c:1391
 msgid	"Show Subject & From (author) fields in group menu. <SPACE> toggles & <CR> "
 	"sets."
-msgstr	"Afficher les champs Sujet & De (auteur) dans le menu groupe. <ESPACE> change "
-	"& <CR> règle."
+msgstr	"Affiche le sujet & l'auteur dans le menu groupe. <ESPACE> change & <RETOUR> "
+	"valide."
+
+#: src/lang.c:1392
+msgid	"In group menu, show author by"
+msgstr	"Dans vue groupe, voir auteur par"
 
-#: src/lang.c:1346
-msgid	"In group menu, show author by      :"
-msgstr	"Dans vue groupe, voir auteur par   :"
-
-#: src/lang.c:1347
-msgid	"# Part of from field to display 0) none 1) address 2) full name 3) both\n"
-msgstr	"# Partie du champ from à afficher 0) aucun 1) adresse 2) nom complet\n"
-	"# 3) les deux\n"
+#: src/lang.c:1393
+msgid	"# Part of from field to display\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = none\n"
+	"#   1 = address\n"
+	"# * 2 = full name\n"
+	"#   3 = both\n"
+msgstr	"# Partie du champ from à afficher\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"#   0 = aucune\n"
+	"#   1 = adresse\n"
+	"# * 2 = nom complet\n"
+	"#   3 les deux\n"
 
-#: src/lang.c:1351
+#: src/lang.c:1402
 msgid	"Draw -> or highlighted bar for selection. <SPACE> toggles & <CR> sets."
-msgstr	"Afficher -> ou une ligne pour la sélection. <ESPACE> change & <CR> règle."
+msgstr	"Affiche -> ou une barre de sélection. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:1352
-msgid	"Draw -> instead of highlighted bar :"
-msgstr	"Afficher -> plutôt qu'une ligne    :"
+#: src/lang.c:1403
+msgid	"Draw -> instead of highlighted bar"
+msgstr	"Afficher -> plutôt qu'une barre"
 
-#: src/lang.c:1353
+#: src/lang.c:1404
 msgid	"# If ON use -> otherwise highlighted bar for selection\n"
-msgstr	"# Si ON utilise -> sinon barre en surbrillance pour la sélection\n"
+msgstr	"# Si ON, utilise -> sinon barre en surbrillance pour la sélection\n"
 
-#: src/lang.c:1358
-msgid	"Use inverse video for page headers :"
-msgstr	"Vidéo inversée pour les en-têtes   :"
+#: src/lang.c:1409
+msgid	"Use inverse video for page headers"
+msgstr	"Vidéo inversée pour les en-têtes"
 
-#: src/lang.c:1359
+#: src/lang.c:1410
 msgid	"# If ON use inverse video for page headers at different levels\n"
-msgstr	"# Si ON utilise la vidéo inversée pour les en-têtes dans les différentes "
-	"vues\n"
+msgstr	"# Si ON, utilise la vidéo inversée pour les en-têtes dans les différentes\n"
+	"# vues\n"
 
-#: src/lang.c:1364
-msgid	"Thread articles by                 :"
-msgstr	"Regrouper les articles par         :"
-
-#: src/lang.c:1365
-msgid	"# Thread articles on 0=(nothing) 1=(Subject) 2=(References) 3=(Both)\n"
-	"# 4=(Multipart Subject).\n"
-msgstr	"# Regrouper les articles sur 0=(rien) 1=(Sujet) 2=(Références) 3=(Les deux)\n"
-	"# 4=(Sujet multi-parties).\n"
-
-#: src/lang.c:1371
-msgid	"Score of a thread                  :"
-msgstr	"Score d'un fil                     :"
+#: src/lang.c:1415
+msgid	"Thread articles by"
+msgstr	"Regrouper les articles par"
+
+# TRANSLATION OUTDATED
+#: src/lang.c:1416
+#, fuzzy
+msgid	"# Thread articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject\n"
+	"#   2 = References\n"
+	"# * 3 = Both (Subject and References)\n"
+	"#   4 = Multipart Subject\n"
+	"#   5 = Percentage Match\n"
+msgstr	"# Regrouper les articles par...\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"#   0 = aucun\n"
+	"#   1 = Sujet\n"
+	"#   2 = References\n"
+	"# * 3 = Les deux (Sujet et References)\n"
+	"#   4 = Sujet multipartie\n"
 
-#: src/lang.c:1372
-msgid	"# Thread score 0=(Max) 1=(Sum) 2=(Average)\n"
-msgstr	"# Score d'un fil 0=(Max) 1=(Sum) 2=(Moyen)\n"
+# TRANSLATION MISSING
+#: src/lang.c:1427
+msgid	"Enter percentage match required to thread together. <CR> sets."
+msgstr	""
 
-#: src/lang.c:1376
-msgid	"Sort articles by Subject, From, Date or Score. <SPACE> toggles & <CR> sets."
-msgstr	"Trier les articles par Sujet, De, Date ou Score. <ESPACE> change & <CR> règle."
+# TRANSLATION MISSING
+#: src/lang.c:1428
+msgid	"Thread percentage match"
+msgstr	""
 
-#: src/lang.c:1377
-msgid	"Sort articles by                   :"
-msgstr	"Trier les articles par             :"
+# TRANSLATION MISSING
+#: src/lang.c:1429
+#, c-format
+msgid	"# Thread percentage match...\n"
+	"# the percentage of characters in the subject of an article that must match\n"
+	"# a base article for both those articles to be considered to belong to the\n"
+	"# same thread. This option is an integer percentage, eg. 80, no decimals may\n"
+	"# follow. If 80 is used here, then 80%% of the characters must match "
+	"exactly,\n"
+	"# no insertion of a character, for the two articles to be put in the same\n"
+	"# thread. eg. 'happy' and 'harpy' would match, but 'harpie', 'happie' and\n"
+	"# 'harppy' would be threaded separately from 'happy'\n"
+msgstr	""
 
-#: src/lang.c:1378
-msgid	"# Sort articles by 0=(nothing) 1=(Subject descend) 2=(Subject ascend)\n"
-	"# 3=(From descend) 4=(From ascend) 5=(Date descend) 6=(Date ascend)\n"
-	"# 7=(Score descend) 8=(Score ascend) 9=(Lines descend) 10=(Lines ascend).\n"
-msgstr	"# Trie les article par 0=(rien) 1=(Sujet descendant) 2=(Sujet ascendant)\n"
-	"# 3=(De descendant) 4=(De ascendant) 5=(Date descendant) 6=(Date ascendant)\n"
-	"# 7=(Score descendant) 8=(Score ascendant) 9=(Lignes descendant) 10=(Lignes "
-	"ascendant)\n"
+#: src/lang.c:1441
+msgid	"Score of a thread"
+msgstr	"Score d'un fil"
 
-#: src/lang.c:1384
+#: src/lang.c:1442
+msgid	"# Thread score\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = max\n"
+	"#   1 = sum\n"
+	"#   2 = average\n"
+msgstr	"# Regrouper les scores\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"# * 0 = max\n"
+	"#   1 = somme\n"
+	"#   2 = moyenne\n"
+
+#: src/lang.c:1450
+msgid	"Sort articles by Subject, From, Date or Score. <SPACE> toggles & <CR> sets."
+msgstr	"Trie les articles d'après un en-tête. <ESPACE> change & <RETOUR> valide."
+
+#: src/lang.c:1451
+msgid	"Sort articles by"
+msgstr	"Trier les articles par"
+
+#: src/lang.c:1452
+msgid	"# Sort articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject descending\n"
+	"#   2 = Subject ascending\n"
+	"#   3 = From descending\n"
+	"#   4 = From ascending\n"
+	"#   5 = Date descending\n"
+	"# * 6 = Date ascending\n"
+	"#   7 = Score descending\n"
+	"#   8 = Score ascending\n"
+	"#   9 = Lines descending\n"
+	"#  10 = Lines ascending\n"
+msgstr	"# Trie les article par...\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"#   0 = rien\n"
+	"#   1 = Sujet descendant\n"
+	"#   2 = Sujet ascendant\n"
+	"#   3 = De descendant\n"
+	"#   4 = De ascendant\n"
+	"#   5 = Date descendant\n"
+	"# * 6 = Date ascendant\n"
+	"#   7 = Score descendant\n"
+	"#   8 = Score ascendant\n"
+	"#   9 = Lignes descendant\n"
+	"#  10 = Lignes ascendant)\n"
+
+#: src/lang.c:1468
 msgid	"Sort threads by Nothing or Score. <SPACE> toggles & <CR> sets."
-msgstr	"Trier les fils par Rien ou Score. <ESPACE> change & <CR> règle."
+msgstr	"Trier les fils par Rien ou Score. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:1385
-msgid	"Sort threads by                    :"
-msgstr	"Trier les fils par                 :"
+#: src/lang.c:1469
+msgid	"Sort threads by"
+msgstr	"Trier les fils par"
 
-#: src/lang.c:1386
-msgid	"# Sort thread by 0=(nothing) 1=(Score descend) 2=(Score ascend)\n"
-msgstr	"# Trie le fil par 0=(rien) 1=(Score descendant) 2=(Score ascendant)\n"
+#: src/lang.c:1470
+msgid	"# Sort thread by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = Score descending\n"
+	"#   2 = Score ascending\n"
+msgstr	"# Trier les fils par...\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"#   0 = aucun\n"
+	"# * 1 = Score descendant\n"
+	"#   2 = Score ascendant\n"
 
-#: src/lang.c:1390
+#: src/lang.c:1478
 msgid	"Put cursor at first/last unread art in groups. <SPACE> toggles & <CR> sets."
-msgstr	"Place le curseur sur le 1er article non lu. <ESPACE> change & <CR> règle."
+msgstr	"Place le curseur sur le 1er article non lu. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:1391
-msgid	"Goto first unread article in group :"
-msgstr	"Aller au 1er art. non lu du groupe :"
+#: src/lang.c:1479
+msgid	"Goto first unread article in group"
+msgstr	"Aller au 1er article non lu du groupe"
 
-#: src/lang.c:1392
+#: src/lang.c:1480
 msgid	"# If ON put cursor at first unread art in group otherwise last art\n"
-msgstr	"# Si ON place le curseur sur le 1er article non lu sinon sur le dernier\n"
+msgstr	"# Si ON, place le curseur sur le 1er article non lu sinon sur le dernier\n"
 
-#: src/lang.c:1396
+#: src/lang.c:1484
 msgid	"Show all articles or only unread articles. <SPACE> toggles & <CR> sets."
-msgstr	"Affiche tous les articles ou seulement ceux non lus. <ESPACE> change & <CR> "
-	"règle."
+msgstr	"Affiche tous les articles ou seulement ceux non lus. <ESPACE> change & "
+	"<RETOUR> valide."
 
-#: src/lang.c:1397
-msgid	"Show only unread articles          :"
-msgstr	"Afficher articles non lus seulement:"
+#: src/lang.c:1485
+msgid	"Show only unread articles"
+msgstr	"Afficher articles non lus seulement"
 
-#: src/lang.c:1398
+#: src/lang.c:1486
 msgid	"# If ON show only new/unread articles otherwise show all.\n"
-msgstr	"# Si ON affiche seulement les articles non lus sinon les affiche tous.\n"
+msgstr	"# Si ON, affiche seulement les articles non lus sinon les affiche tous.\n"
 
-#: src/lang.c:1403
-msgid	"Show only groups with unread arts  :"
-msgstr	"Voir groupes avec articles non lus :"
+#: src/lang.c:1491
+msgid	"Show only groups with unread arts"
+msgstr	"Voir groupes avec articles non lus"
 
-#: src/lang.c:1404
+#: src/lang.c:1492
 msgid	"# If ON show only subscribed to groups that contain unread articles.\n"
-msgstr	"# Si ON affiche seulement les groupes ayant des articles non lus.\n"
+msgstr	"# Si ON, affiche seulement les groupes ayant des articles non lus.\n"
 
-#: src/lang.c:1409
-msgid	"Filter which articles              :"
-msgstr	"Filtrer quels articles             :"
+#: src/lang.c:1497
+msgid	"Filter which articles"
+msgstr	"Filtrer quel article"
 
-#: src/lang.c:1410
-msgid	"# 0=(Only kill unread articles)\n"
-	"# 1=(Kill all articles and show in threads marked with K)\n"
-	"# 2=(Kill all articles and never show them).\n"
-msgstr	"# 0=(Filtrer seulement les articles non lus)\n"
-	"# 1=(Tout filtrer et les afficher dans les fils précédés d'un K)\n"
-	"# 2=(Tout filtrer et ne pas les afficher)\n"
-
-#: src/lang.c:1417
-msgid	"Tab goes to next unread article    :"
-msgstr	"Tab va au prochain article non lu  :"
+#: src/lang.c:1498
+msgid	"# Filter which articles\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = only kill unread articles\n"
+	"#   1 = kill all articles and show in threads marked with K\n"
+	"#   2 = kill all articles and never show them\n"
+msgstr	"# Filtrer quels articles\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"# * 0 = filtrer uniquement les articles non lu\n"
+	"#   1 = filtrer tous les articles et les marquer avec un K dans les fils\n"
+	"#   2 = filtrer tous les articles et ne pas les afficher\n"
+
+#: src/lang.c:1507
+msgid	"Tab goes to next unread article"
+msgstr	"Tab va au prochain article non lu"
 
-#: src/lang.c:1418
+#: src/lang.c:1508
 msgid	"# If ON the TAB command will go to next unread article at article viewer "
 	"level\n"
-msgstr	"# Si ON TAB ira au prochain article non lu directement depuis le visual iseur "
-	"d'article\n"
+msgstr	"# Si ON, la touche TAB ira au prochain article non lu directement depuis le\n"
+	"# visualiseur d'article\n"
 
-#: src/lang.c:1422
+#: src/lang.c:1512
 msgid	"Scrolling with <SPACE> past the end of an art. jumps to the next unread one."
-msgstr	"Défiler avec <ESPACE> passera le fin d'un article et ira au prochain non lu."
+msgstr	"Naviguer avec <ESPACE> ira au prochain article non lu."
 
-#: src/lang.c:1423
-msgid	"Space goes to next unread article  :"
-msgstr	"Espace va au prochain art. non lu  :"
+#: src/lang.c:1513
+msgid	"Space goes to next unread article"
+msgstr	"Espace va au prochain article non lu"
 
-#: src/lang.c:1424
+#: src/lang.c:1514
 msgid	"# If ON the SPACE command will go to next unread article at article viewer\n"
 	"# level when the end of the article is reached (rn-style pager)\n"
-msgstr	"# Si ON ESPACE ira au prochain article non lu dans le visualiseur d'article\n"
-	"# lorsque la fin d'un article sera atteinte (page style rn)\n"
+msgstr	"# Si ON, ESPACE ira au prochain article non lu dans le visualiseur d'article\n"
+	"# lorsque la fin d'un article sera atteinte (pager style rn)\n"
 
-#: src/lang.c:1429
+#: src/lang.c:1519
 msgid	"Scrolling with <PGDN>/<DOWN> past the end of an art. jumps to the unread one."
-msgstr	"Défiler avec <PGDN>/<BAS> passera la fin d'un article et ira au prochain non "
-	"lu."
+msgstr	"Naviguer avec <PGDN>/<BAS> ira au prochain article non lu."
 
-#: src/lang.c:1430
-msgid	"PgDn goes to next unread article   :"
-msgstr	"PgDn ira au prochain article non lu:"
+#: src/lang.c:1520
+msgid	"PgDn goes to next unread article"
+msgstr	"PgDn va au prochain article non lu"
 
-#: src/lang.c:1431
+#: src/lang.c:1521
 msgid	"# If ON the PGDN or DOWN command will go to next unread article when\n"
 	"# pressed at end of message\n"
-msgstr	"# Si ON PGDN ou BAS ira au prochain article non lu lorsqu'elle sera\n"
-	"# utilisée à la fin d'un article.\n"
+msgstr	"# Si ON, les touches PGDN ou BAS iront au prochain article non lu\n"
+	"# lorsque la fin d'un article sera atteinte\n"
 
-#: src/lang.c:1437
-msgid	"List thread using right arrow key  :"
-msgstr	"Lister le fil via la flèche droite :"
+#: src/lang.c:1527
+msgid	"List thread using right arrow key"
+msgstr	"Lister le fil via la flèche droite"
 
-#: src/lang.c:1438
+#: src/lang.c:1528
 msgid	"# If ON automatically list thread when entering it using right arrow key.\n"
-msgstr	"# Si ON listera automatiquement le fil lors de l'utilisation de la flèche "
-	"droite.\n"
+msgstr	"# Si ON, listera automatiquement le fil lors de l'utilisation de la flèche\n"
+	"# droite.\n"
 
-#: src/lang.c:1442
+#: src/lang.c:1532
 msgid	"Enter character to indicate deleted articles. <CR> sets, <ESC> cancels."
-msgstr	"Caractère indiquant les articles effacés. <CR> règle, <ESC> annule."
+msgstr	"Caractère indiquant les articles effacés. <RETOUR> valide, <ESC> annule."
 
-#: src/lang.c:1443
-msgid	"Character to show deleted articles :"
-msgstr	"Caractère pour les articles effacés:"
+#: src/lang.c:1533
+msgid	"Character to show deleted articles"
+msgstr	"Caractère pour articles effacés"
 
-#: src/lang.c:1444
+#: src/lang.c:1534
 msgid	"# Character used to show that an art was deleted (default 'D')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Caractère utilisé pour indiquer qu'un article a été supprimé (défaut 'D')\n"
 	"# _ est transformé en ' '\n"
 
-#: src/lang.c:1449
+#: src/lang.c:1539
 msgid	"Enter character to indicate articles in a range. <CR> sets, <ESC> cancels."
-msgstr	"Caractère indiquant les articles inclus. <CR> règle, <ESC> annule."
+msgstr	"Caractère indiquant les articles inclus. <RETOUR> valide, <ESC> annule."
 
-#: src/lang.c:1450
-msgid	"Character to show inrange articles :"
-msgstr	"Caractère pour art. non inclus     :"
+#: src/lang.c:1540
+msgid	"Character to show inrange articles"
+msgstr	"Caractère pour articles non inclus"
 
-#: src/lang.c:1451
+#: src/lang.c:1541
 msgid	"# Character used to show that an art is in a range (default '#')\n"
 	"# _ is turned into ' '\n"
 msgstr	"# Caractère utilisé pour indiquer qu'un article est inclus (défaut '#')\n"
 	"# _ est transformé en ' '\n"
 
-#: src/lang.c:1456
+#: src/lang.c:1546
 msgid	"Enter character to indicate that article will return. <CR> sets, <ESC> "
 	"cancels."
-msgstr	""
+msgstr	"Caractère indiquant que l'article sera retourné. <RETOUR> valide, <ESC> "
+	"annule."
 
-#: src/lang.c:1457
-msgid	"Character to show returning arts   :"
-msgstr	""
+#: src/lang.c:1547
+msgid	"Character to show returning arts"
+msgstr	"Caractère pour articles retournés"
 
-#: src/lang.c:1458
+#: src/lang.c:1548
 msgid	"# Character used to show that an art will return (default '-')\n"
 	"# _ is turned into ' '\n"
-msgstr	""
+msgstr	"# Caractère utilisé pour indiquer qu'un article sera retourné (défaut '#')\n"
+	"# _ est transformé en ' '\n"
 
-#: src/lang.c:1463
+#: src/lang.c:1553
 msgid	"Enter character to indicate selected articles. <CR> sets, <ESC> cancels."
-msgstr	""
+msgstr	"Caractère indiquant les articles sélectionnés. <RETOUR> valide, <ESC> annule."
 
-#: src/lang.c:1464
-msgid	"Character to show selected articles:"
-msgstr	""
+#: src/lang.c:1554
+msgid	"Character to show selected articles"
+msgstr	"Caractère pour articles sélect."
 
-#: src/lang.c:1465
+#: src/lang.c:1555
 msgid	"# Character used to show that an art was auto-selected (default '*')\n"
 	"# _ is turned into ' '\n"
-msgstr	""
+msgstr	"# Caractère utilisé pour indiquer qu'un article fut sélectionné (defaut '*')\n"
+	"# _est transformé en ' '\n"
 
-#: src/lang.c:1470
+#: src/lang.c:1560
 msgid	"Enter character to indicate recent articles. <CR> sets, <ESC> cancels."
-msgstr	""
+msgstr	"Caractère indiquant les articles récents. <RETOUR> valide, <ESC> annule."
 
-#: src/lang.c:1471
-msgid	"Character to show recent articles  :"
-msgstr	""
+#: src/lang.c:1561
+msgid	"Character to show recent articles"
+msgstr	"Caractère pour articles récents"
 
-#: src/lang.c:1472
+#: src/lang.c:1562
 msgid	"# Character used to show that an art is recent (default 'o')\n"
 	"# _ is turned into ' '\n"
-msgstr	""
+msgstr	"# Caractère utilisé pour indiquer qu'un article est récent (defaut 'o')\n"
+	"# _est transformé en ' '\n"
 
-#: src/lang.c:1477
+#: src/lang.c:1567
 msgid	"Enter character to indicate unread articles. <CR> sets, <ESC> cancels."
-msgstr	""
+msgstr	"Caractère indiquant les articles non lus. <RETOUR> valide, <ESC> annule."
 
-#: src/lang.c:1478
-msgid	"Character to show unread articles  :"
-msgstr	""
+#: src/lang.c:1568
+msgid	"Character to show unread articles"
+msgstr	"Caractère pour articles non lus"
 
-#: src/lang.c:1479
+#: src/lang.c:1569
 msgid	"# Character used to show that an art is unread (default '+')\n"
 	"# _ is turned into ' '\n"
-msgstr	""
+msgstr	"# Caractère utilisé pour indiquer qu'un article est non lu (defaut '+')\n"
+	"# _est transformé en ' '\n"
 
-#: src/lang.c:1484
+#: src/lang.c:1574
 msgid	"Enter character to indicate read articles. <CR> sets, <ESC> cancels."
-msgstr	""
+msgstr	"Caractère indiquant les articles lus. <RETOUR> valide, <ESC> annule."
 
-#: src/lang.c:1485
-msgid	"Character to show read articles    :"
-msgstr	""
+#: src/lang.c:1575
+msgid	"Character to show read articles"
+msgstr	"Caractère pour articles lus"
 
-#: src/lang.c:1486
+#: src/lang.c:1576
 msgid	"# Character used to show that an art was read (default ' ')\n"
 	"# _ is turned into ' '\n"
-msgstr	""
+msgstr	"# Caractère utilisé pour indiquer qu'un article a été lu (defaut ' ')\n"
+	"# _est transformé en ' '\n"
 
-#: src/lang.c:1491
+#: src/lang.c:1581
 msgid	"Enter character to indicate killed articles. <CR> sets, <ESC> cancels."
-msgstr	""
+msgstr	"Caractère indiquant les articles filtrés. <RETOUR> valide, <ESC> annule."
 
-#: src/lang.c:1492
-msgid	"Character to show killed articles  :"
-msgstr	""
+#: src/lang.c:1582
+msgid	"Character to show killed articles"
+msgstr	"Caractère pour articles filtrés"
 
-#: src/lang.c:1493
+#: src/lang.c:1583
 msgid	"# Character used to show that an art was killed (default 'K')\n"
 	"# kill_level must be set accordingly, _ is turned into ' '\n"
-msgstr	""
+msgstr	"# Caractère utilisé pour indiquer qu'un article a été filtré (defaut 'K')\n"
+	"# kill_level doit être choisi en conséquence, _ est transformé en ' '\n"
 
-#: src/lang.c:1498
+#: src/lang.c:1588
 msgid	"Enter character to indicate read selected articles. <CR> sets, <ESC> cancels."
-msgstr	""
+msgstr	"Caractère indiquant les articles lus et sélectionnés. <RETOUR> valide, <ESC> "
+	"annule."
 
-#: src/lang.c:1499
-msgid	"Character to show readselected arts:"
-msgstr	""
+#: src/lang.c:1589
+msgid	"Character to show readselected arts"
+msgstr	"Caractère pour articles sélectionnés lus"
 
-#: src/lang.c:1500
+#: src/lang.c:1590
 msgid	"# Character used to show that an art was selected before read (default ':')\n"
 	"# kill_level must be set accordingly, _ is turned into ' '\n"
-msgstr	""
+msgstr	"# Caractère utilisé pour indiquer qu'un article était sélectionné avec\n"
+	"# d'être lu (defaut ':')\n"
+	"# kill_level doit être choisi en conséquence, _ est transformé en ' '\n"
 
-#: src/lang.c:1505
+#: src/lang.c:1595
 msgid	"Enter maximum length of newsgroup names displayed. <CR> sets."
-msgstr	""
+msgstr	"Largeur max. à afficher des noms des groupes. <RETOUR> valide."
 
-#: src/lang.c:1506
-msgid	"Max. length of group names shown   :"
-msgstr	""
+#: src/lang.c:1596
+msgid	"Max. length of group names shown"
+msgstr	"Largeur max. des noms des groupes"
 
-#: src/lang.c:1507
+#: src/lang.c:1597
 msgid	"# Maximum length of the names of newsgroups displayed\n"
-msgstr	""
+msgstr	"# Largeur maximum à afficher des noms des groupes.\n"
 
-#: src/lang.c:1512
-msgid	"Show lines/score in listings       :"
-msgstr	""
+#: src/lang.c:1602
+msgid	"Show lines/score in listings"
+msgstr	"Afficher dans les différentes vues"
 
-#: src/lang.c:1513
+#: src/lang.c:1603
 msgid	"# What informations should be displayed in article/thread listing\n"
-	"# 0 = nothing, 1 = lines, 2 = score, 3 = lines & score\n"
-msgstr	""
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = lines\n"
+	"#   2 = score\n"
+	"#   3 = lines & score\n"
+msgstr	"# Quelles informations doivent être affichées dans la vue article/fil\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"#   0 = rien\n"
+	"# * 1 = lignes\n"
+	"#   2 = score\n"
+	"#   3 = lignes & score\n"
+
+#: src/lang.c:1612
+msgid	"0 = full page scrolling, -1 = show previous last line as first on next page, -"
+	"2 = half page"
+msgstr	"0 = défilement page par page, -1 = afficher dernière ligne dans page "
+	"suivante, -2 = demi-page"
 
-#: src/lang.c:1518
-msgid	"0 = full page scrolling, -1 = show previous last line as first on next page, "
-	"-2 = half page"
-msgstr	""
-
-#: src/lang.c:1519
-msgid	"Number of lines to scroll in pager :"
-msgstr	""
+#: src/lang.c:1613
+msgid	"Number of lines to scroll in pager"
+msgstr	"Vitesse de défilement dans le pager"
 
-#: src/lang.c:1520
+#: src/lang.c:1614
 msgid	"# Number of lines that cursor-up/down will scroll in article pager\n"
-	"# eg, 1+ = line-by-line, 0 = page-by-page (traditional behavior),\n"
-	"# -1 = the top/bottom line is carried over onto the next page,\n"
-	"# -2 = half-page scrolling\n"
-msgstr	""
+	"# Possible values are (the default is marked with *):\n"
+	"#  -2 = half-page scrolling\n"
+	"#  -1 = the top/bottom line is carried over onto the next page\n"
+	"#   0 = page-by-page (traditional behavior)\n"
+	"# * 1 = line-by-line\n"
+	"#   2 or greater = scroll by 2 or more lines (only in the pager)\n"
+msgstr	"# Type du défilement lors de la visualisation de l'article dans le pager\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"#  -2 = demi-page\n"
+	"#  -1 = la première/dernière ligne est affichée dans dans la page suivante\n"
+	"#   0 = page par page (comportement initial)\n"
+	"# * 1 = ligne par ligne\n"
+	"#   2 ou plus = défiler 2 lignes par 2 ou plus (seulement dans le pager)\n"
 
-#: src/lang.c:1527
+#: src/lang.c:1624
 msgid	"Display signatures. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Affiche les signatures. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:1528
-msgid	"Display signatures                 :"
-msgstr	"Afficher les signatures            :"
+#: src/lang.c:1625
+msgid	"Display signatures"
+msgstr	"Afficher les signatures"
 
-#: src/lang.c:1529
+#: src/lang.c:1626
 msgid	"# If OFF don't show signatures when displaying articles\n"
-msgstr	""
+msgstr	"# Si OFF ne pas afficher les signatures lors de la visualisation des "
+	"articles.\n"
 
-#: src/lang.c:1533
+#: src/lang.c:1630
 msgid	"Display uuencoded data as tagged attachments. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Afficher les archives uue comme PJ marquées. <ESPACE> change & <RETOUR> "
+	"valide."
 
-#: src/lang.c:1534
-msgid	"Display uue data as an attachment  :"
-msgstr	"Afficher donnée uue comme PJ       :"
+#: src/lang.c:1631
+msgid	"Display uue data as an attachment"
+msgstr	"Afficher donnée uue comme PJ"
 
-#: src/lang.c:1535
+#: src/lang.c:1632
 msgid	"# Handling of uuencoded data in the pager\n"
-	"# 0 = display raw uuencoded data\n"
-	"# 1 = uuencoded data will be condensed to a single tag line showing\n"
-	"#     size and filename, similar to how MIME attachments are displayed\n"
-	"# 2 = as for 1, but any line that looks like uuencoded data will be folded\n"
-	"#     into a tag line.\n"
-msgstr	""
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no, display raw uuencoded data\n"
+	"#   1 = yes, uuencoded data will be condensed to a single tag line showing\n"
+	"#       size and filename, similar to how MIME attachments are displayed\n"
+	"#   2 = hide all, as for 1, but any line that looks like uuencoded data will\n"
+	"#       be folded into a tag line.\n"
+msgstr	"# Prise en charge des données uuencode dans le pager\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"# * 0 = aucune, affichage brut des données uuencode\n"
+	"#   1 = oui, les données uuencode seront condensée dans une seule ligne\n"
+	"#       affichant la taille et le fichier, comme sont affichées les pj MIME\n"
+	"#   2 = masquer, comme pour l'option 1, mais toute ligne qui ressemble à des\n"
+	"#       données uuencode sera condensée en une seule ligne.\n"
 
-#: src/lang.c:1544
+#: src/lang.c:1642
 msgid	"Decode German style TeX umlaut codes to ISO. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Décode les umlauts Allemands de type TeX en ISO. <ESPACE> change & <RETOUR> "
+	"valide."
 
-#: src/lang.c:1545
-msgid	"Display \"a as Umlaut-a             :"
-msgstr	""
+#: src/lang.c:1643
+msgid	"Display \"a as Umlaut-a"
+msgstr	"Afficher \"a comme Umlaut-a"
 
-#: src/lang.c:1546
+#: src/lang.c:1644
 msgid	"# If ON decode German style TeX umlaut codes to ISO and\n"
 	"# show \"a as Umlaut-a, etc.\n"
-msgstr	""
+msgstr	"# Si ON, convertit les umlauts Allemands de type TeX en codes ISO\n"
+	"# et affiche \"a comme Umlaut-a, etc.\n"
 
-#: src/lang.c:1551 src/lang.c:1561
+#: src/lang.c:1649 src/lang.c:1659
 msgid	"Space separated list of header fields"
-msgstr	""
+msgstr	"Liste des en-têtes, séparés par des espaces"
 
-#: src/lang.c:1552
-msgid	"Display these header fields (or *) :"
-msgstr	""
+#: src/lang.c:1650
+msgid	"Display these header fields (or *)"
+msgstr	"Afficher ces en-têtes (ou *)"
 
-#: src/lang.c:1553
+#: src/lang.c:1651
 msgid	"# Which news headers you wish to see. If you want to see _all_ the headers,\n"
 	"# place an '*' as this value. This is the only way a wildcard can be used.\n"
 	"# If you enter 'X-' as the value, you will see all headers beginning with\n"
 	"# 'X-' (like X-Alan or X-Pape). You can list more than one by delimiting "
 	"with\n"
 	"# spaces. Not defining anything turns off this option.\n"
-msgstr	""
+msgstr	"# Quels en-têtes voulez-vous voir. Si vous souhaitez voir _tout_ les en-"
+	"têtes,\n"
+	"# utilisez '*' comme valeur. C'est le seul moyen d'utiliser un caractère\n"
+	"# joker ici. Si vous entrez 'X-' comme valeur, vous verrez tous les en-têtes\n"
+	"# commençant par 'X-' (comme X-Alan ou X-Pape). Vous pouvez afficher "
+	"plusieurs\n"
+	"# en-têtes en les délimitant avec des espaces. Ne rien définir, désactive\n"
+	"# cette option.\n"
 
-#: src/lang.c:1562
-msgid	"Do not display these header fields :"
-msgstr	""
+#: src/lang.c:1660
+msgid	"Do not display these header fields"
+msgstr	"Ne pas afficher ces en-têtes"
 
-#: src/lang.c:1563
+#: src/lang.c:1661
 msgid	"# Same as 'news_headers_to_display' except it denotes the opposite.\n"
 	"# An example of using both options might be if you thought X- headers were\n"
 	"# A Good Thing(tm), but thought Alan and Pape were miscreants...well then "
@@ -4671,775 +5010,992 @@ msgid	"# Same as 'news_headers_to_displa
 	"# news_headers_to_display=X-\n"
 	"# news_headers_to_not_display=X-Alan X-Pape\n"
 	"# Not defining anything turns off this option.\n"
-msgstr	""
+msgstr	"# Comme l'option 'news_headers_to_display' excepté que là c'est le "
+	"contraire.\n"
+	"# Un exemple d'utilisation de ces deux options pourrait que vous trouviez "
+	"les\n"
+	"# en-têtes 'X-' intéressantes mais celles contenant 'Alan' et 'Pape'\n"
+	"# inutiles... donc voici ce que vous pourriez alors faire :\n"
+	"# news_headers_to_display=X-\n"
+	"# news_headers_to_not_display=X-Alan X-Pape\n"
+	"# Ne rien définir, désactive cette option.\n"
 
-#: src/lang.c:1573
+#: src/lang.c:1671
 msgid	"Do you want to enable automatic handling of multipart/alternative articles?"
-msgstr	""
+msgstr	"Voulez-vous activer la prise en charge automatique des articles multipart/"
+	"alternative ?"
 
-#: src/lang.c:1574
-msgid	"Skip multipart/alternative parts   :"
-msgstr	""
+#: src/lang.c:1672
+msgid	"Skip multipart/alternative parts"
+msgstr	"Ignorer parties multipart/alter."
 
-#: src/lang.c:1575
+#: src/lang.c:1673
 msgid	"# If ON strip multipart/alternative messages automatically\n"
-msgstr	""
+msgstr	"# Si ON, enlève automatiquement les messages multipart/alternative\n"
 
-#: src/lang.c:1580
+#: src/lang.c:1678
 msgid	"A regex used to decide which lines to show in col_quote."
-msgstr	""
+msgstr	"Une expression régulière pour déterminer quelles lignes afficher dans "
+	"col_quote."
 
-#: src/lang.c:1581
-msgid	"Regex used to show quoted lines    :"
-msgstr	""
+#: src/lang.c:1679
+msgid	"Regex used to show quoted lines"
+msgstr	"Regex pour afficher les citations"
 
-#: src/lang.c:1582
+#: src/lang.c:1680
 msgid	"# A regular expression that tin will use to decide which lines are\n"
 	"# quoted when viewing articles. Quoted lines are shown in col_quote.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
-msgstr	""
+msgstr	"# Une expression régulière qui permettra à tin d'afficher les citations.\n"
+	"# Les citations sont affichées dans col_quote. Si vous laissez ce champ\n"
+	"# vide, tin utilisera une valeur incluse par défaut.\n"
 
-#: src/lang.c:1588
+#: src/lang.c:1686
 msgid	"A regex used to decide which lines to show in col_quote2."
-msgstr	""
+msgstr	"Une expression régulière pour déterminer quelles lignes afficher dans "
+	"col_quote2."
 
-#: src/lang.c:1589
-msgid	"Regex used to show twice quoted l. :"
-msgstr	""
+#: src/lang.c:1687
+msgid	"Regex used to show twice quoted l."
+msgstr	"Regex pour afficher le 2nd niveau"
 
-#: src/lang.c:1590
+#: src/lang.c:1688
 msgid	"# A regular expression that tin will use to decide which lines are\n"
 	"# quoted twice. Twice quoted lines are shown in col_quote2.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
-msgstr	""
+msgstr	"# Une expression régulière qui permettra à tin d'afficher les citations de\n"
+	"# second niveau. Ces citations sont affichées dans col_quote2. Si vous\n"
+	"# laissez ce champ vide, tin utilisera une valeur incluse par défaut.\n"
 
-#: src/lang.c:1596
+#: src/lang.c:1694
 msgid	"A regex used to decide which lines to show in col_quote3."
-msgstr	""
+msgstr	"Une expression régulière pour déterminer quelles lignes afficher dans "
+	"col_quote3."
 
-#: src/lang.c:1597
-msgid	"Regex used to show >= 3 times q.l. :"
-msgstr	""
+#: src/lang.c:1695
+msgid	"Regex used to show >= 3 times q.l."
+msgstr	"Regex pour afficher niveau >= 3"
 
-#: src/lang.c:1598
+#: src/lang.c:1696
 msgid	"# A regular expression that tin will use to decide which lines are\n"
 	"# quoted >=3 times. >=3 times quoted lines are shown in col_quote3.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
-msgstr	""
+msgstr	"# Une expression régulière qui permettra à tin d'afficher les citations de\n"
+	"# troisième niveau et supérieur. Ces citations sont affichées dans "
+	"col_quote3.\n"
+	"# Si vous laissez ce champ vide, tin utilisera une valeur incluse par "
+	"défaut.\n"
 
-#: src/lang.c:1605
+#: src/lang.c:1703
 msgid	"A regex used to decide which words to show in col_markslashes."
-msgstr	""
+msgstr	"Une expression régulière pour déterminer quels mots afficher dans "
+	"col_markslashes."
 
-#: src/lang.c:1606
-msgid	"Regex used to highlight /slashes/  :"
-msgstr	""
+#: src/lang.c:1704
+msgid	"Regex used to highlight /slashes/"
+msgstr	"Regex pour les mots entre /slash/"
 
-#: src/lang.c:1607
+#: src/lang.c:1705
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '/' are to be shown in col_markslashes.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
-msgstr	""
+msgstr	"# Une expression régulière qui permettra à tin d'afficher les mots\n"
+	"# placés entre des '/' dans col_markslashes.\n"
+	"# Si vous laissez ce champ vide, tin utilisera une valeur incluse par "
+	"défaut.\n"
 
-#: src/lang.c:1613
+#: src/lang.c:1711
 msgid	"A regex used to decide which words to show in col_markstars."
-msgstr	""
+msgstr	"Une expression régulière pour déterminer quels mots afficher dans "
+	"col_markstars."
 
-#: src/lang.c:1614
-msgid	"Regex used to highlight *stars*    :"
-msgstr	""
+#: src/lang.c:1712
+msgid	"Regex used to highlight *stars*"
+msgstr	"Regex pour les mots entre *astérisques*"
 
-#: src/lang.c:1615
+#: src/lang.c:1713
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '*' are to be shown in col_markstars.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
-msgstr	""
+msgstr	"# Une expression régulière qui permettra à tin d'afficher les mots\n"
+	"# placés entre des '*' dans col_markstars.\n"
+	"# Si vous laissez ce champ vide, tin utilisera une valeur incluse par "
+	"défaut.\n"
 
-#: src/lang.c:1621
+#: src/lang.c:1719
 msgid	"A regex used to decide which words to show in col_markstroke."
-msgstr	""
+msgstr	"Une expression régulière pour déterminer quels mots afficher dans "
+	"col_markstroke."
 
-#: src/lang.c:1622
-msgid	"Regex used to highlight -strokes-  :"
-msgstr	""
+#: src/lang.c:1720
+msgid	"Regex used to highlight -strokes-"
+msgstr	"Regex pour les mots entre -tirets-"
 
-#: src/lang.c:1623
+#: src/lang.c:1721
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '-' are to be shown in col_markstroke.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
-msgstr	""
+msgstr	"# Une expression régulière qui permettra à tin d'afficher les mots\n"
+	"# placés entre des '-' dans col_markstroke.\n"
+	"# Si vous laissez ce champ vide, tin utilisera une valeur incluse par "
+	"défaut.\n"
 
-#: src/lang.c:1629
+#: src/lang.c:1727
 msgid	"A regex used to decide which words to show in col_markdash."
-msgstr	""
+msgstr	"Une expression régulière pour déterminer quels mots afficher dans "
+	"col_markdash."
 
-#: src/lang.c:1630
-msgid	"Regex used to highlight _underline_:"
-msgstr	""
+#: src/lang.c:1728
+msgid	"Regex used to highlight _underline_"
+msgstr	"Regex pour les mots entre _underscore_"
 
-#: src/lang.c:1631
+#: src/lang.c:1729
 msgid	"# A regular expression that tin will use to decide which words\n"
 	"# bounded by '_' are to be shown in col_markdash.\n"
 	"# If you leave this blank, tin will use a built in default.\n"
-msgstr	""
+msgstr	"# Une expression régulière qui permettra à tin d'afficher les mots\n"
+	"# placés entre des '_' dans col_markdash.\n"
+	"# Si vous laissez ce champ vide, tin utilisera une valeur incluse par "
+	"défaut.\n"
 
-#: src/lang.c:1637
+#: src/lang.c:1735
 msgid	"A regex used to find Subject prefixes to remove.  Use '|' as separator."
-msgstr	""
+msgstr	"Une expression régulière pour trouver les préfixes dans le sujet. '|' est un "
+	"séparateur."
 
-#: src/lang.c:1638
-msgid	"Regex with Subject prefixes        :"
-msgstr	""
+#: src/lang.c:1736
+msgid	"Regex with Subject prefixes"
+msgstr	"Regex pour les préfixes dans le sujet"
 
-#: src/lang.c:1639
+#: src/lang.c:1737
 msgid	"# A regular expression that tin will use to find Subject prefixes\n"
 	"# which will be removed before showing the header.\n"
-msgstr	""
+msgstr	"# Une expression régulière qui permettra à tin de trouver les préfixes\n"
+	"# dans le sujet et qui seront effacés avant d'afficher l'en-tête.\n"
 
-#: src/lang.c:1644
+#: src/lang.c:1742
 msgid	"A regex used to find Subject suffixes to remove.  Use '|' as separator."
-msgstr	""
+msgstr	"Une expression régulière pour trouver les suffixes dans le sujet. '|' est un "
+	"séparateur."
 
-#: src/lang.c:1645
-msgid	"Regex with Subject suffixes        :"
-msgstr	""
+#: src/lang.c:1743
+msgid	"Regex with Subject suffixes"
+msgstr	"Regex pour les suffixes dans le sujet"
 
-#: src/lang.c:1646
+#: src/lang.c:1744
 msgid	"# A regular expression that tin will use to find Subject suffixes\n"
 	"# which will be removed when replying or posting followup.\n"
-msgstr	""
+msgstr	"# Une expression régulière qui permettra à tin de trouver les suffixes\n"
+	"# dans le sujet et qui seront effacés avant d'afficher l'en-tête.\n"
 
-#: src/lang.c:1651
+#: src/lang.c:1749
 msgid	"Enter name and options for external MIME viewer, --internal for built-in "
 	"viewer"
-msgstr	""
+msgstr	"Nom et options pour le visualisateur MIME externe, --internal pour celui "
+	"inclus"
 
-#: src/lang.c:1652
-msgid	"MIME binary content viewer         :"
-msgstr	""
+#: src/lang.c:1750
+msgid	"MIME binary content viewer"
+msgstr	"Visualisateur de contenu MIME"
 
-#: src/lang.c:1653
+#: src/lang.c:1751
 msgid	"# If --internal automatically use the built in MIME viewer for non-text\n"
 	"# parts of articles.\n"
 	"# Otherwise specify an external viewer program (eg, metamail) or leave blank\n"
 	"# for no automatic viewing\n"
-msgstr	""
+msgstr	"# Utilisation du visualisateur MIME inclus pour les parties non textuelles\n"
+	"# si l'option '--internal' est utilisée.\n"
+	"# Sinon, spécifiez un logiciel externe (pe. metamail) ou laissez ce champ\n"
+	"# vide pour ne pas activer la prévisualisation automatique.\n"
 
-#: src/lang.c:1660
+#: src/lang.c:1758
 msgid	"Confirm before starting non-text viewing program"
-msgstr	""
+msgstr	"Confirmation avant le lancement d'un visualisateur externe"
 
-#: src/lang.c:1661
-msgid	"Ask before using MIME viewer       :"
-msgstr	""
+#: src/lang.c:1759
+msgid	"Ask before using MIME viewer"
+msgstr	"Demander avant d'utiliser le visualisateur"
 
-#: src/lang.c:1662
+#: src/lang.c:1760
 msgid	"# If ON tin will ask before using metamail to display MIME messages\n"
 	"# this only happens if metamail_prog is set to something\n"
-msgstr	""
+msgstr	"# Si ON, tin demandera avant d'utiliser metamail pour afficher les\n"
+	"# messages MIME\n"
+	"# Cela ne se produit que lorsque 'metamail_prog' contient une valeur\n"
 
-#: src/lang.c:1667
+#: src/lang.c:1765
 msgid	"Ask to mark groups read when quitting. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Marquer lu les groupes à la fermeture ? <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:1668
-msgid	"Catchup read groups when quitting  :"
-msgstr	""
+#: src/lang.c:1766
+msgid	"Catchup read groups when quitting"
+msgstr	"Marquer lu les groupes à la fermeture"
 
-#: src/lang.c:1669
+#: src/lang.c:1767
 msgid	"# If ON ask user if read groups should all be marked read\n"
-msgstr	""
+msgstr	"# Si ON, demande à l'utilisateur si les groupes consultés\n"
+	"# doivent être marqués lus\n"
 
-#: src/lang.c:1674
-msgid	"Catchup group using left key       :"
-msgstr	""
+#: src/lang.c:1772
+msgid	"Catchup group using left key"
+msgstr	"Marquer lu le groupe via la flèche gauche"
 
-#: src/lang.c:1675
+#: src/lang.c:1773
 msgid	"# If ON catchup group/thread when leaving with the left arrow key.\n"
-msgstr	""
+msgstr	"# Si ON, marque lu avec <- le groupe/fil.\n"
 
-#: src/lang.c:1680
-msgid	"Catchup thread by using left key   :"
-msgstr	""
+#: src/lang.c:1778
+msgid	"Catchup thread by using left key"
+msgstr	"Marquer lu le fil via la flèche gauche"
 
-#: src/lang.c:1686
-msgid	"Which actions require confirmation :"
-msgstr	""
+#: src/lang.c:1784
+msgid	"Which actions require confirmation"
+msgstr	"Quelles actions requièrent confirmation"
 
-#: src/lang.c:1687
+#: src/lang.c:1785
 msgid	"# What should we ask confirmation for.\n"
-msgstr	""
+msgstr	"# Demande de confirmation pour...\n"
 
-#: src/lang.c:1692
-msgid	"'Mark article read' ignores tags   :"
-msgstr	""
+#: src/lang.c:1790
+msgid	"'Mark article read' ignores tags"
+msgstr	"'Marquer lu l'article' ignore les marques"
 
-#: src/lang.c:1693
+#: src/lang.c:1791
 msgid	"# If ON the 'Mark article read' function marks only the current article.\n"
-msgstr	""
+msgstr	"# Si ON, la fonction 'Marquer lu l'article' agit uniquement sur l'article\n"
+	"# actuel.\n"
 
-#: src/lang.c:1697
+#: src/lang.c:1795
 msgid	"Program to run to open URL's, <CR> sets, <ESC> cancels."
-msgstr	""
+msgstr	"Logiciel utilisé pour lancer les URLs, <RETOUR> valide, <ESC> annule."
 
-#: src/lang.c:1698
-msgid	"Program that opens URL's           :"
-msgstr	""
+#: src/lang.c:1796
+msgid	"Program that opens URL's"
+msgstr	"Logiciel lançant les URLs"
 
-#: src/lang.c:1699
+#: src/lang.c:1797
 msgid	"# The program used to open URL's. The actual URL will be appended\n"
-msgstr	""
+msgstr	"# Commande ou script ouvrant les URLs. L'URL sera ajoutée\n"
 
-#: src/lang.c:1704
-msgid	"Use mouse in xterm                 :"
-msgstr	""
+#: src/lang.c:1802
+msgid	"Use mouse in xterm"
+msgstr	"Utiliser la souris dans l'xterm"
 
-#: src/lang.c:1705
+#: src/lang.c:1803
 msgid	"# If ON enable mouse key support on xterm terminals\n"
-msgstr	""
+msgstr	"# Si ON, active le support de la souris dans xterm\n"
 
-#: src/lang.c:1711
-msgid	"Use scroll keys on keypad          :"
-msgstr	""
+#: src/lang.c:1809
+msgid	"Use scroll keys on keypad"
+msgstr	"Utiliser les flèches du pavé numérique"
 
-#: src/lang.c:1712
+#: src/lang.c:1810
 msgid	"# If ON enable scroll keys on terminals that support it\n"
-msgstr	""
+msgstr	"# Si ON, active les flèches de défilement pour les terminaux\n"
+	"# les supportant\n"
 
-#: src/lang.c:1717
+#: src/lang.c:1815
 msgid	"Enter maximum number of article to get. <CR> sets."
-msgstr	""
+msgstr	"Nombre max d'articles à récupérer. <RETOUR> valide."
 
-#: src/lang.c:1718
-msgid	"Number of articles to get          :"
-msgstr	""
+#: src/lang.c:1816
+msgid	"Number of articles to get"
+msgstr	"Nombre d'articles à récupérer"
 
-#: src/lang.c:1719
+# AMBIGUOUS
+#: src/lang.c:1817
 msgid	"# Number of articles to get (0=no limit), if negative sets maximum number\n"
 	"# of already read articles to be read before first unread one\n"
-msgstr	""
+msgstr	"# Nombre d'articles à récupérer (0=pas de limite); si le nombre est négatif\n"
+	"# détermine le nombre max d'articles déjà lus à relire avant le premier non "
+	"lu\n"
 
-#: src/lang.c:1724
+#: src/lang.c:1822
 msgid	"Enter number of days article is considered recent. <CR> sets."
-msgstr	""
+msgstr	"Nombre de jours un article est considéré comme récent. <RETOUR> valide."
 
-#: src/lang.c:1725
-msgid	"Article recentness time limit      :"
-msgstr	""
+#: src/lang.c:1823
+msgid	"Article recentness time limit"
+msgstr	"Durée des articles considérés comme récents"
 
-#: src/lang.c:1726
+#: src/lang.c:1824
 msgid	"# Number of days in which article is considered recent, (0=OFF)\n"
-msgstr	""
+msgstr	"# Nombre de jours un article est considéré comme récent; (0=OFF)\n"
 
-#: src/lang.c:1730
+#: src/lang.c:1828
 msgid	"WILDMAT for normal wildcards, REGEX for full regular expression matching."
-msgstr	""
-
-#: src/lang.c:1731
-msgid	"Wildcard matching                  :"
-msgstr	""
+msgstr	"WILDMAT pour les wildcards normaux, REGEX pour expressions régulières."
 
-#: src/lang.c:1732
-msgid	"# Wildcard matching 0=(wildmat) 1=(regex)\n"
-msgstr	""
+#: src/lang.c:1829
+msgid	"Wildcard matching"
+msgstr	"Concordance wildcard"
+
+#: src/lang.c:1830
+msgid	"# Wildcard matching\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = wildmat\n"
+	"#   1 = regex\n"
+msgstr	"# Concordances Wildcard\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"# * 0 = wildmat\n"
+	"#   1 = regex\n"
 
-#: src/lang.c:1736
+#: src/lang.c:1837
 msgid	"Enter minimal score before an article is marked killed. <CR> sets."
-msgstr	""
+msgstr	"Score minimal avant qu'un article soit filtré. <RETOUR> valide."
 
-#: src/lang.c:1737
-msgid	"Score limit (kill)                 :"
-msgstr	""
+#: src/lang.c:1838
+msgid	"Score limit (kill)"
+msgstr	"Score minimum (filtre)"
 
-#: src/lang.c:1738
+#: src/lang.c:1839
 msgid	"# Score limit before an article is marked killed\n"
-msgstr	""
+msgstr	"# Score minimal avant qu'un article soit filtré\n"
 
-#: src/lang.c:1742
+#: src/lang.c:1843
 msgid	"Enter default score to kill articles. <CR> sets."
-msgstr	""
+msgstr	"Score par défaut pour filtrer les articles. <RETOUR> valide."
 
-#: src/lang.c:1743
-msgid	"Default score to kill articles     :"
-msgstr	""
+#: src/lang.c:1844
+msgid	"Default score to kill articles"
+msgstr	"Score par déf. pour filtrer les articles"
 
-#: src/lang.c:1744
+#: src/lang.c:1845
 msgid	"# Default score to kill articles\n"
-msgstr	""
+msgstr	"# Score par défaut pour filtrer les articles\n"
 
-#: src/lang.c:1748
+#: src/lang.c:1849
 msgid	"Enter minimal score before an article is marked hot. <CR> sets."
-msgstr	""
+msgstr	"Score minimal avant qu'un article soit sélectionné. <RETOUR> valide."
 
-#: src/lang.c:1749
-msgid	"Score limit (select)               :"
-msgstr	""
+#: src/lang.c:1850
+msgid	"Score limit (select)"
+msgstr	"Score minimum (sélection)"
 
-#: src/lang.c:1750
+#: src/lang.c:1851
 msgid	"# Score limit before an article is marked hot\n"
-msgstr	""
+msgstr	"# Score minimal avant qu'un article soit sélectionné\n"
 
-#: src/lang.c:1754
+#: src/lang.c:1855
 msgid	"Enter default score to select articles. <CR> sets."
-msgstr	""
+msgstr	"Score par défaut pour la sélection des articles. <RETOUR> valide."
 
-#: src/lang.c:1755
-msgid	"Default score to select articles   :"
-msgstr	""
+#: src/lang.c:1856
+msgid	"Default score to select articles"
+msgstr	"Score par défaut pour sél. les articles"
 
-#: src/lang.c:1756
+#: src/lang.c:1857
 msgid	"# Default score to select articles\n"
-msgstr	""
+msgstr	"# Score par défaut pour sélectionner les articles\n"
 
-#: src/lang.c:1762
-msgid	"Use slrnface to show ''X-Face:''s  :"
-msgstr	""
+#: src/lang.c:1863
+msgid	"Use slrnface to show ''X-Face:''s"
+msgstr	"Utiliser slrnface pour afficher les 'X-Face:'"
 
-#: src/lang.c:1763
+#: src/lang.c:1864
 msgid	"# If ON using slrnface(1) to interpret the ''X-Face:'' header.\n"
 	"# Only useful when running in an xterm.\n"
-msgstr	""
+msgstr	"# Si ON, utiliser slrnface(1) pour interpréter l'en-tête 'X-Face:'\n"
+	"# Seulement utile lors de l'utilisation de tin dans un xterm.\n"
 
-#: src/lang.c:1771
-msgid	"Use ANSI color                     :"
-msgstr	""
+#: src/lang.c:1872
+msgid	"Use ANSI color"
+msgstr	"Utiliser les couleurs ANSI"
 
-#: src/lang.c:1772
+#: src/lang.c:1873
 msgid	"# If ON using ANSI-color\n"
-msgstr	""
+msgstr	"# Si ON, utiliser les couleurs ANSI\n"
 
-#: src/lang.c:1777
-msgid	"Standard foreground color          :"
-msgstr	""
+#: src/lang.c:1878
+msgid	"Standard foreground color"
+msgstr	"Couleur standard de l'avant-plan"
 
-#: src/lang.c:1778
+#: src/lang.c:1879
 msgid	"# Standard foreground color\n"
-msgstr	""
+	"# Default: -1 (default color)\n"
+msgstr	"# Couleur standard de l'avant-plan\n"
+	"# Défaut : -1 (défaut couleur)\n"
 
-#: src/lang.c:1783
-msgid	"Standard background color          :"
-msgstr	""
+#: src/lang.c:1885
+msgid	"Standard background color"
+msgstr	"Couleur standard de l'arrière-plan"
 
-#: src/lang.c:1784
-msgid	"# Standard-Background-Color\n"
-msgstr	""
+#: src/lang.c:1886
+msgid	"# Standard background color\n"
+	"# Default: -1 (default color)\n"
+msgstr	"# Couleur standard de l'arrière-plan\n"
+	"# Défaut : -1 (défaut couleur)\n"
 
-#: src/lang.c:1789
-msgid	"Color for inverse text (background):"
-msgstr	""
+#: src/lang.c:1892
+msgid	"Color for inverse text (background)"
+msgstr	"Couleur du texte inversé (arrière-plan)"
 
-#: src/lang.c:1790
+#: src/lang.c:1893
 msgid	"# Color of background for inverse text\n"
-msgstr	""
+	"# Default: 4 (blue)\n"
+msgstr	"# Couleur de l'arrière-plan pour le texte inversé\n"
+	"# Défaut : 4 (bleu)\n"
+
+#: src/lang.c:1899
+msgid	"Color for inverse text (foreground)"
+msgstr	"Couleur du texte inversé (avant-plan)"
 
-#: src/lang.c:1795
-msgid	"Color for inverse text (foreground):"
-msgstr	""
-
-#: src/lang.c:1796
+#: src/lang.c:1900
 msgid	"# Color of foreground for inverse text\n"
-msgstr	""
-
-#: src/lang.c:1801
-msgid	"Color of text lines                :"
-msgstr	""
-
-#: src/lang.c:1802
-msgid	"# Color of text-lines\n"
-msgstr	""
-
-#: src/lang.c:1807
-msgid	"Color of mini help menu            :"
-msgstr	""
+	"# Default: 7 (white)\n"
+msgstr	"# Couleur de l'avant-plan du texte inversé\n"
+	"# Défaut : 7 (blanc)\n"
+
+#: src/lang.c:1906
+msgid	"Color of text lines"
+msgstr	"Couleur du texte"
+
+#: src/lang.c:1907
+msgid	"# Color of text lines\n"
+	"# Default: -1 (default color)\n"
+msgstr	"# Couleur du texte\n"
+	"# Défaut : -1 (défaut couleur)\n"
+
+#: src/lang.c:1913
+msgid	"Color of mini help menu"
+msgstr	"Couleur du petit menu d'aide"
 
-#: src/lang.c:1808
+#: src/lang.c:1914
 msgid	"# Color of mini help menu\n"
-msgstr	""
-
-#: src/lang.c:1813
-msgid	"Color of help text                 :"
-msgstr	""
+	"# Default: 3 (brown)\n"
+msgstr	"# Couleur du petit menu d'aide\n"
+	"# Défaut : 3 (marron)\n"
+
+#: src/lang.c:1920
+msgid	"Color of help text"
+msgstr	"Couleur de l'aide"
 
-#: src/lang.c:1814
+#: src/lang.c:1921
 msgid	"# Color of help pages\n"
-msgstr	""
-
-#: src/lang.c:1819
-msgid	"Color of status messages           :"
-msgstr	""
+	"# Default: -1 (default color)\n"
+msgstr	"# Couleur des pages d'aide\n"
+	"# Défaut : -1 (couleur par défaut)\n"
+
+#: src/lang.c:1927
+msgid	"Color of status messages"
+msgstr	"Couleur des messages de statut"
 
-#: src/lang.c:1820
+#: src/lang.c:1928
 msgid	"# Color of messages in last line\n"
-msgstr	""
+	"# Default: 6 (cyan)\n"
+msgstr	"# Couleur des messages de statut\n"
+	"# Défaut : 6 (cyan)\n"
 
-#: src/lang.c:1825
-msgid	"Color of quoted lines              :"
-msgstr	""
+#: src/lang.c:1934
+msgid	"Color of quoted lines"
+msgstr	"Couleur de citation de 1er niveau"
 
-#: src/lang.c:1826
+#: src/lang.c:1935
 msgid	"# Color of quote-lines\n"
-msgstr	""
+	"# Default: 2 (green)\n"
+msgstr	"# Couleur de citation de premier niveau\n"
+	"# Défaut : 2 (vert)\n"
 
-#: src/lang.c:1831
-msgid	"Color of twice quoted line         :"
-msgstr	""
+#: src/lang.c:1941
+msgid	"Color of twice quoted line"
+msgstr	"Couleur de citation de 2nd niveau"
 
-#: src/lang.c:1832
+#: src/lang.c:1942
 msgid	"# Color of twice quoted lines\n"
-msgstr	""
-
-#: src/lang.c:1837
-msgid	"Color of =>3 times quoted line     :"
-msgstr	""
+	"# Default: 3 (brown)\n"
+msgstr	"# Couleur de citation de second niveau\n"
+	"# Défaut : 3 (marron)\n"
+
+#: src/lang.c:1948
+msgid	"Color of =>3 times quoted line"
+msgstr	"Couleur de citation de 3e niveau ou sup."
 
-#: src/lang.c:1838
+#: src/lang.c:1949
 msgid	"# Color of >=3 times quoted lines\n"
-msgstr	""
+	"# Default: 4 (blue)\n"
+msgstr	"# Couleur de citation de 3e niveau ou supérieur\n"
+	"# Défaut : 4 (bleu)\n"
 
-#: src/lang.c:1843
-msgid	"Color of article header lines      :"
-msgstr	""
+#: src/lang.c:1955
+msgid	"Color of article header lines"
+msgstr	"Couleur des en-têtes de l'article"
 
-#: src/lang.c:1844
+#: src/lang.c:1956
 msgid	"# Color of header-lines\n"
-msgstr	""
-
-#: src/lang.c:1849
-msgid	"Color of actual news header fields :"
-msgstr	""
+	"# Default: 2 (green)\n"
+msgstr	"# Couleur des en-têtes de l'article\n"
+	"# Défaut : 2 (vert)\n"
+
+#: src/lang.c:1962
+msgid	"Color of actual news header fields"
+msgstr	"Couleur des champs d'en-tête actuels"
 
-#: src/lang.c:1850
+#: src/lang.c:1963
 msgid	"# Color of actual news header fields\n"
-msgstr	""
-
-#: src/lang.c:1855
-msgid	"Color of article subject lines     :"
-msgstr	""
+	"# Default: 9 (light red)\n"
+msgstr	"# Couleur des champs d'en-têtes actuels\n"
+	"# Défaut : 9 (rouge gras)\n"
+
+#: src/lang.c:1969
+msgid	"Color of article subject lines"
+msgstr	"Couleur du sujet"
 
-#: src/lang.c:1856
+#: src/lang.c:1970
 msgid	"# Color of article subject\n"
-msgstr	""
+	"# Default: 6 (cyan)\n"
+msgstr	"# Couleur du sujet\n"
+	"# Défaut : 6 (cyan)\n"
+
+#: src/lang.c:1976
+msgid	"Color of response counter"
+msgstr	"Couleur du compteur de réponse"
 
-#: src/lang.c:1861
-msgid	"Color of response counter          :"
-msgstr	""
-
-#: src/lang.c:1862
+#: src/lang.c:1977
 msgid	"# Color of response counter\n"
-msgstr	""
-
-#: src/lang.c:1867
-msgid	"Color of sender (From:)            :"
-msgstr	""
+	"# Default: 2 (green)\n"
+msgstr	"# Couleur du compteur de réponse\n"
+	"# Défaut : 2 (vert)\n"
+
+#: src/lang.c:1983
+msgid	"Color of sender (From:)"
+msgstr	"Couleur de l'expéditeur (From:)"
 
-#: src/lang.c:1868
+#: src/lang.c:1984
 msgid	"# Color of sender (From:)\n"
-msgstr	""
+	"# Default: 2 (green)\n"
+msgstr	"# Couleur de l'expéditeur (From:)\n"
+	"# Défaut : 2 (vert)\n"
+
+#: src/lang.c:1990
+msgid	"Color of help/mail sign"
+msgstr	"Couleur de l'aide/signature email"
 
-#: src/lang.c:1873
-msgid	"Color of help/mail sign            :"
-msgstr	""
-
-#: src/lang.c:1874
-msgid	"# Color of Help/Mail-Sign\n"
-msgstr	""
-
-#: src/lang.c:1879
-msgid	"Color of signatures                :"
-msgstr	""
-
-#: src/lang.c:1880
-msgid	"# Color of signature\n"
-msgstr	""
-
-#: src/lang.c:1885
-msgid	"Color of highlighting with *stars* :"
-msgstr	""
-
-#: src/lang.c:1886
-msgid	"# Color of word highlighting. There are four possibilities\n"
-	"# in articles: *stars*, /slashes/, _underdashes_ and -strokes-.\n"
-msgstr	""
-
-#: src/lang.c:1892
-msgid	"Color of highlighting with _dash_  :"
-msgstr	""
-
-#: src/lang.c:1898
-msgid	"Color of highlighting with /slash/ :"
-msgstr	""
-
-#: src/lang.c:1904
-msgid	"Color of highlighting with -stroke-:"
-msgstr	""
-
-#: src/lang.c:1911
-msgid	"Attr. of highlighting with *stars* :"
-msgstr	""
+#: src/lang.c:1991
+msgid	"# Color of Help/Mail-Sign\n"
+	"# Default: 4 (blue)\n"
+msgstr	"# Couleur de l'aide/signature email\n"
+	"# Défaut : 4 (bleu)\n"
+
+#: src/lang.c:1997
+msgid	"Color of signatures"
+msgstr	"Couleur des signatures"
 
-#: src/lang.c:1912
-msgid	"# Attribute of word highlighting on mono terminals.\n"
-	"# There are four possibilities in articles:\n"
-	"# *stars*, /slashes/, _underdashes_ and -strokes-.\n"
-	"# The possible values are:\n"
-	"# 0 - Normal, 1 - Underline, 2 - Best highlighting,\n"
-	"# 3 - Reverse video, 4 - Blinking, 5 - Half bright, 6 - Bold\n"
-msgstr	""
+#: src/lang.c:1998
+msgid	"# Color of signature\n"
+	"# Default: 4 (blue)\n"
+msgstr	"# Couleur des signatures\n"
+	"# Défaut : 4 (bleu)\n"
+
+#: src/lang.c:2004
+msgid	"Color of highlighted URLs"
+msgstr	"Couleur des URLs en surbrillance"
+
+#: src/lang.c:2005
+msgid	"# Color of highlighted URLs\n"
+	"# Default: -1 (default color)\n"
+msgstr	"# Couleur des URLs en surbrillance\n"
+	"# Défaut : -1 (défaut couleur)\n"
+
+#: src/lang.c:2011
+msgid	"Color of highlighting with *stars*"
+msgstr	"Couleur des mots entre *astérisques*"
+
+#: src/lang.c:2012
+msgid	"# Color of word highlighting with *stars*\n"
+	"# Default: 11 (yellow)\n"
+msgstr	"# Couleur des mots entre *astérisques*\n"
+	"# Défaut : 11 (jaune)\n"
+
+#: src/lang.c:2018
+msgid	"Color of highlighting with _dash_"
+msgstr	"Couleur des mots entre _underscore_"
+
+#: src/lang.c:2019
+msgid	"# Color of word highlighting with _dash_\n"
+	"# Default: 13 (light pink)\n"
+msgstr	"# Couleur des mots entre _underscore_\n"
+	"# Défaut : 13 (rose gras)\n"
+
+#: src/lang.c:2025
+msgid	"Color of highlighting with /slash/"
+msgstr	"Couleur des mots entre /slash/"
+
+#: src/lang.c:2026
+msgid	"# Color of word highlighting with /slash/\n"
+	"# Default: 14 (light cyan)\n"
+msgstr	"# Couleur des mots entre /slash/\n"
+	"# Défaut : 14 (cyan gras)\n"
+
+#: src/lang.c:2032
+msgid	"Color of highlighting with -stroke-"
+msgstr	"Couleur des mots entre -tirets-"
+
+#: src/lang.c:2033
+msgid	"# Color of word highlighting with -stroke-\n"
+	"# Default: 12 (light blue)\n"
+msgstr	"# Couleur des mots entre -tirets-\n"
+	"# Défaut : 12 (bleu gras)\n"
 
-#: src/lang.c:1922
-msgid	"Attr. of highlighting with _dash_  :"
-msgstr	""
+#: src/lang.c:2040
+msgid	"Attr. of highlighting with *stars*"
+msgstr	"Style des mots entre *astérisques*"
 
-#: src/lang.c:1928
-msgid	"Attr. of highlighting with /slash/ :"
-msgstr	""
+#: src/lang.c:2041
+msgid	"# Attributes of word highlighting on mono terminals\n"
+	"# Possible values are:\n"
+	"#   0 = Normal\n"
+	"#   1 = Underline\n"
+	"#   2 = Best highlighting\n"
+	"#   3 = Reverse video\n"
+	"#   4 = Blinking\n"
+	"#   5 = Half bright\n"
+	"#   6 = Bold\n"
+	"\n"
+	"# Attribute of word highlighting with *stars*\n"
+	"# Default: 6 (bold)\n"
+msgstr	"# Style des mots mis en évidence pour les terminaux mono\n"
+	"# Les valeurs possibles sont :\n"
+	"#   0 = Normal\n"
+	"#   1 = Souligné\n"
+	"#   2 = Mise en évidence accrue\n"
+	"#   3 = Vidéo inversée\n"
+	"#   4 = Clignotement\n"
+	"#   5 = Contrasté\n"
+	"#   6 = Gras\n"
+	"\n"
+	"# Style des mots entre *astérisques*\n"
+	"# Défaut : 6 (gras)\n"
 
-#: src/lang.c:1934
-msgid	"Attr. of highlighting with -stroke-:"
-msgstr	""
+#: src/lang.c:2056
+msgid	"Attr. of highlighting with _dash_"
+msgstr	"Style des mots entre _underscore_"
+
+#: src/lang.c:2057
+msgid	"# Attribute of word highlighting with _dash_\n"
+	"# Default: 2 (best highlighting)\n"
+msgstr	"# Style des mots entre _tirets_\n"
+	"# Défaut : 2 (misé en évidence accrue)\n"
+
+#: src/lang.c:2063
+msgid	"Attr. of highlighting with /slash/"
+msgstr	"Style des mots entre /slash/"
+
+#: src/lang.c:2064
+msgid	"# Attribute of word highlighting with /slash/\n"
+	"# Default: 5 (half bright)\n"
+msgstr	"# Style des mots entre /slash/\n"
+	"# Défaut : 5 (contrasté)\n"
+
+#: src/lang.c:2070
+msgid	"Attr. of highlighting with -stroke-"
+msgstr	"Style des mots entre -tirets-"
 
-#: src/lang.c:1940
-msgid	"Word highlighting in message body  :"
-msgstr	""
+#: src/lang.c:2071
+msgid	"# Attribute of word highlighting with -stroke-\n"
+	"# Default: 3 (reverse video)\n"
+msgstr	"# Style des mots entre -tirets-\n"
+	"# Défaut : 3 (vidéo inversée)\n"
+
+#: src/lang.c:2077
+msgid	"URL highlighting in message body"
+msgstr	"Mise en évidence des URLs dans les articles"
+
+#: src/lang.c:2078
+msgid	"# Enable URL highlighting?\n"
+msgstr	"# Mettre en évidence les URLs ?\n"
+
+#: src/lang.c:2083
+msgid	"Word highlighting in message body"
+msgstr	"Mise en évidence des mots dans les articles"
 
-#: src/lang.c:1941
+#: src/lang.c:2084
 msgid	"# Enable word highlighting?\n"
-msgstr	""
+msgstr	"# Mettre en évidence les mots ?\n"
 
-#: src/lang.c:1946
-msgid	"What to display instead of mark    :"
-msgstr	""
+#: src/lang.c:2089
+msgid	"What to display instead of mark"
+msgstr	"Afficher ça plutôt qu'une marque"
 
-#: src/lang.c:1947
+#: src/lang.c:2090
 msgid	"# Should the leading and ending stars and dashes also be displayed,\n"
 	"# even when they are highlighting marks?\n"
-	"# 0 - no    1 - yes, display mark    2 - print a space instead\n"
-msgstr	""
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = no\n"
+	"#   1 = yes, display mark\n"
+	"# * 2 = print a space instead\n"
+msgstr	"# Est-ce que les astérisques et tirets doivent être affichés,\n"
+	"# même s'ils mettent en évidence des marques ?\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"#   0 = non\n"
+	"#   1 = oui, afficher la marque\n"
+	"# * 2 = plutôt afficher un espace\n"
 
-#: src/lang.c:1953
+#: src/lang.c:2099
 msgid	"Enter column number to wrap article lines to in the pager. <CR> sets."
-msgstr	""
+msgstr	"Largeur du pager. <RETOUR> valide."
 
-#: src/lang.c:1954
-msgid	"Page line wrap column              :"
-msgstr	""
+#: src/lang.c:2100
+msgid	"Page line wrap column"
+msgstr	"Largeur du pager"
 
-#: src/lang.c:1955
+#: src/lang.c:2101
 msgid	"# Wrap article lines at column\n"
-msgstr	""
+msgstr	"# Justifier les lignes des articles à la colonne indiquée\n"
 
-#: src/lang.c:1960
-msgid	"Wrap around threads on next unread :"
-msgstr	""
+#: src/lang.c:2106
+msgid	"Wrap around threads on next unread"
+msgstr	"Englober les fils pour le non lu suivant"
 
-#: src/lang.c:1961
+#: src/lang.c:2107
 msgid	"# If ON wrap around threads on searching next unread article\n"
-msgstr	""
+msgstr	"# Si ON, englober les fils lors de la recherche de l'article suivant non lu\n"
 
-#: src/lang.c:1965
+#: src/lang.c:2111
 msgid	"Enter default mail address (and fullname). <CR> sets."
-msgstr	""
+msgstr	"Adresse mail par défaut (et nom complet). <RETOUR> valide."
 
-#: src/lang.c:1966
-msgid	"Mail address (and fullname)        :"
-msgstr	""
+#: src/lang.c:2112
+msgid	"Mail address (and fullname)"
+msgstr	"Adresse mail (et nom complet)"
 
-#: src/lang.c:1967
+#: src/lang.c:2113
 msgid	"# User's mail address (and fullname), if not username@host (fullname)\n"
-msgstr	""
+msgstr	"# Adresse mail (et nom complet) si ce n'est pas utilisateur@hôte\n"
+	"# (nom complet)\n"
 
-#: src/lang.c:1972
-msgid	"Show empty Followup-To in editor   :"
-msgstr	""
+#: src/lang.c:2118
+msgid	"Show empty Followup-To in editor"
+msgstr	"Inclure en-tête Followup-To dans l'éditeur"
 
-#: src/lang.c:1973
+#: src/lang.c:2119
 msgid	"# If ON show empty Followup-To header when editing an article\n"
-msgstr	""
+msgstr	"# Si ON, inclure l'en-tête Followup-To lors de la composition\n"
+	"# des articles\n"
 
-#: src/lang.c:1977
+#: src/lang.c:2123
 msgid	"Enter path/! command/--none to create your default signature. <CR> sets."
-msgstr	""
+msgstr	"Chemin/! commande/--aucune pour la création de votre signature. <RETOUR> "
+	"valide."
 
-#: src/lang.c:1978
-msgid	"Create signature from path/command :"
-msgstr	""
+#: src/lang.c:2124
+msgid	"Create signature from path/command"
+msgstr	"Signature depuis fichier/commande"
 
-#: src/lang.c:1979
+#: src/lang.c:2125
 msgid	"# Signature path (random sigs)/file to be used when posting/replying\n"
 	"# default_sigfile=file       appends file as signature\n"
 	"# default_sigfile=!command   executes external command to generate a "
 	"signature\n"
 	"# default_sigfile=--none     don't append a signature\n"
-msgstr	""
+msgstr	"# Fichier de signature à utiliser lors de la composition/réponse à un "
+	"article.\n"
+	"# default_sigfile=fichier\tutilise le contenu du fichier comme signature\n"
+	"# default_sigfile=!commande\texécute une commande externe comme signature\n"
 
-#: src/lang.c:1986
+#: src/lang.c:2132
 msgid	"Prepend signature with \"-- \" on own line. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Précéder la signature avec \"-- \". <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:1987
-msgid	"Prepend signature with \"-- \"       :"
-msgstr	""
+#: src/lang.c:2133
+msgid	"Prepend signature with \"-- \""
+msgstr	"Précéder la signature avec \"-- \""
 
-#: src/lang.c:1988
+#: src/lang.c:2134
 msgid	"# If ON prepend the signature with dashes '\\n-- \\n'\n"
-msgstr	""
+msgstr	"# Si ON, précéde la signature avec le délimiteur standard\n"
+	"# '\\n-- \\'\n"
 
-#: src/lang.c:1992
+#: src/lang.c:2138
 msgid	"Add signature when reposting articles. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Rajouter la signature lors du repostage. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:1993
-msgid	"Add signature when reposting       :"
-msgstr	""
+#: src/lang.c:2139
+msgid	"Add signature when reposting"
+msgstr	"Rajouter la signature lors du repostage"
 
-#: src/lang.c:1994
+#: src/lang.c:2140
 msgid	"# If ON add signature to reposted articles\n"
-msgstr	""
+msgstr	"# Si ON, rajoute la signature aux articles repostés\n"
 
-#: src/lang.c:1998
+#: src/lang.c:2144
+#, c-format
 msgid	"Enter quotation marks, %s or %S for author's initials."
-msgstr	""
+msgstr	"Caractère de citation, %s ou %S  pour les initiales de l'auteur."
 
-#: src/lang.c:1999
-msgid	"Characters used as quote-marks     :"
-msgstr	""
+#: src/lang.c:2145
+msgid	"Characters used as quote-marks"
+msgstr	"Caractère de citation"
 
-#: src/lang.c:2000
+#: src/lang.c:2146
+#, c-format
 msgid	"# Characters used in quoting to followups and replies.\n"
 	"# '_' is replaced by ' ', %%s, %%S are replaced by author's initials.\n"
-msgstr	""
+msgstr	"# Caractères utilisés pour les citations.\n"
+	"# '_' est remplacé par ' ', %%s, %%S sont remplacés par les intiales\n"
+	"# de l'auteur auquel vous répondez.\n"
+
+#: src/lang.c:2152
+msgid	"Quoting behavior"
+msgstr	"Type de citations"
 
-#: src/lang.c:2006
-msgid	"Quoting behavior                   :"
-msgstr	""
-
-#: src/lang.c:2007
+#: src/lang.c:2153
 msgid	"# How quoting should be handled when following up or replying.\n"
-	"# 0 = Nothing special\n"
-	"# 1 = Compress quotes\n"
-	"# 2 = Quote signatures\n"
-	"# 3 = Compress quotes, quote signatures\n"
-	"# 4 = Quote empty lines\n"
-	"# 5 = Compress quotes, quote empty lines\n"
-	"# 6 = Quote signatures, quote empty lines\n"
-	"# 7 = Compress quotes, quote signatures, quote empty lines\n"
-msgstr	""
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = Nothing special\n"
+	"#   1 = Compress quotes\n"
+	"#   2 = Quote signatures\n"
+	"#   3 = Compress quotes, quote signatures\n"
+	"#   4 = Quote empty lines\n"
+	"# * 5 = Compress quotes, quote empty lines\n"
+	"#   6 = Quote signatures, quote empty lines\n"
+	"#   7 = Compress quotes, quote signatures, quote empty lines\n"
+msgstr	"# Type de citations lors des réponses ou des suivis.\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"#   0 = Rien de spécial\n"
+	"#   1 = Citations compressées\n"
+	"#   2 = Citer les signatures\n"
+	"#   3 = Compresser les citations, citer les signatures\n"
+	"#   4 = Citer les lignes vides\n"
+	"# * 5 = Compresser les citations, citer les lignes vides\n"
+	"#   6 = Citer les signatures, citer les lignes vides\n"
+	"#   7 = Citations compr., signatures et lignes vides citées\n"
 
-#: src/lang.c:2019 src/lang.c:2027 src/lang.c:2033
+#: src/lang.c:2166 src/lang.c:2174 src/lang.c:2180
 msgid	"%A Addr %D Date %F Addr+Name %G Groupname %M Message-ID %N Name %C First Name"
-msgstr	""
+msgstr	"%A Adresse %D Date %F Adresse+Nom %G groupe %M Message-ID %N Nom %C Prénom"
 
-#: src/lang.c:2020
-msgid	"Quote line when following up       :"
-msgstr	""
+#: src/lang.c:2167
+msgid	"Quote line when following up"
+msgstr	"Citation lors d'un suivi"
 
-#: src/lang.c:2021
+#: src/lang.c:2168
+#, c-format
 msgid	"# Format of quote line when mailing/posting/following-up an article\n"
 	"# %%A Address    %%D Date   %%F Addr+Name   %%G Groupname   %%M Message-ID\n"
 	"# %%N Full Name  %%C First Name   %%I Initials\n"
-msgstr	""
-
-#: src/lang.c:2028
-msgid	"Quote line when cross-posting      :"
-msgstr	""
-
-#: src/lang.c:2034
-msgid	"Quote line when mailing            :"
-msgstr	""
+msgstr	"# Format de la citation lors de l'envoi/postage/suivi d'un article\n"
+	"# %%A Adresse\t\t%%D Date\t%%F Adresse+Nom\t%%G groupe\n"
+	"# %%M Message-ID\t%%N Nom complet\t%%C Prénom\t%%I Initiales\n"
+
+#: src/lang.c:2175
+msgid	"Quote line when cross-posting"
+msgstr	"Citation lors d'un cross-post"
+
+#: src/lang.c:2181
+msgid	"Quote line when mailing"
+msgstr	"Citation lors d'un envoi par mail"
 
-#: src/lang.c:2039
+#: src/lang.c:2186
 msgid	"If ON, include User-Agent: header. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Si ON, inclus l'en-tête 'User-Agent:'. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:2040
-msgid	"Insert 'User-Agent:'-header        :"
-msgstr	""
+#: src/lang.c:2187
+msgid	"Insert 'User-Agent:'-header"
+msgstr	"Insérer l'en-tête 'User-Agent'"
 
-#: src/lang.c:2041
+#: src/lang.c:2188
 msgid	"# If ON include advertising User-Agent: header\n"
-msgstr	""
+msgstr	"# Si ON inclus l'en-tête 'User-Agent:'\n"
 
-#: src/lang.c:2045
+#: src/lang.c:2193
 msgid	"Enter charset name for MIME (e.g. US-ASCII, ISO-8859-1, EUC-KR), <CR> to set."
-msgstr	""
+msgstr	"Jeu d'encodage pour MIME (p.e. US-ASCII, ISO_8859_1, EUC_KR), <RETOUR> valide."
 
-#: src/lang.c:2046
-msgid	"MM_CHARSET                         :"
-msgstr	""
+#: src/lang.c:2194
+msgid	"MM_CHARSET"
+msgstr	"MM_CHARSET"
 
-#: src/lang.c:2047
+#: src/lang.c:2195
 msgid	"# Charset supported locally which is also used for MIME header and\n"
 	"# Content-Type header.\n"
 	"# If not set, the value of the environment variable MM_CHARSET is used.\n"
 	"# Set to US-ASCII or compile time default if neither of them is defined.\n"
 	"# If MIME_STRICT_CHARSET is defined at compile-time, charset other than\n"
 	"# mm_charset is considered not displayable and represented as '?'.\n"
-msgstr	""
+msgstr	"# Jeu d'encodage supporté localement qui est également utilisé pour les\n"
+	"# en-têtes MIME ainsi que l'en-tête 'Content-Type'.\n"
+	"# Si rien n'est déclaré, la valeur de la variable d'environnement MM_CHARSET\n"
+	"# est utilisée.\n"
+	"# Utilisez US-ASCII ou utilisez la valeur par défaut lors de la compilation\n"
+	"# de tin si aucunes des deux n'est définie.\n"
+	"# Si MIME_STRICT_CHARSET est déclarée au moment de la compilation, le jeu\n"
+	"# d'encodage autre que mm_charset est considéré comme non disponible et\n"
+	"# représenté par '?'.\n"
 
-#: src/lang.c:2058
-msgid	"MM_NETWORK_CHARSET                 :"
-msgstr	""
+#: src/lang.c:2205
+msgid	"MM_NETWORK_CHARSET"
+msgstr	"MM_NETWORK_CHARSET"
 
-#: src/lang.c:2059
+#: src/lang.c:2206
 msgid	"# Charset used for MIME (Content-Type) header in postings.\n"
-msgstr	""
+msgstr	"# Jeu d'encodage utilisé par l'en-tête MIME (Content-Type).\n"
 
-#: src/lang.c:2065
-msgid	"Mailbox format                     :"
-msgstr	""
+#: src/lang.c:2212
+msgid	"Mailbox format"
+msgstr	"Format de la boîte à lettres"
 
-#: src/lang.c:2066
+#: src/lang.c:2213
 msgid	"# Format of the mailbox.\n"
-msgstr	""
+msgstr	"# Format de la boîte à lettres\n"
 
-#: src/lang.c:2071
-msgid	"MIME encoding in news messages     :"
-msgstr	""
+#: src/lang.c:2218
+msgid	"MIME encoding in news messages"
+msgstr	"Encodage MIME dans les messages usenet"
 
-#: src/lang.c:2072
+#: src/lang.c:2219
 msgid	"# MIME encoding (8bit, base64, quoted-printable, 7bit) of the body\n"
 	"# for mails and posts, if necessary. QP is efficient for most European\n"
 	"# character sets (ISO-8859-X) with small fraction of non-US-ASCII chars,\n"
 	"# while Base64 is more efficient for most 8bit East Asian, Greek, and\n"
 	"# Russian charsets with a lot of 8bit characters.\n"
-msgstr	""
+msgstr	"# Si nécessaire, encodage MIME (8bit, base64, quoted-printable, 7bit) du\n"
+	"# corps du message pour les mails et les arrticles. QP est suffisant pour\n"
+	"# la plupart des jeux d'encodage Européens (ISO-8859-X) avec une petite\n"
+	"# fraction de caractères non-US-ASCII; alors que le Base64 est plus indiqué\n"
+	"# pour les jeux d'encodage 8bit Est Asiatique, Grec et Russe, car contenant\n"
+	"# un plus grand nombre de caractères 8bit.\n"
 
-#: src/lang.c:2080 src/lang.c:2101
+#: src/lang.c:2227 src/lang.c:2248
 msgid	"Don't change unless you know what you are doing. <ESC> cancels."
-msgstr	""
+msgstr	"Ne pas changer sauf si vous savez ce que vous faites. <ESC> annule."
 
-#: src/lang.c:2081
-msgid	"Use 8bit characters in news headers:"
-msgstr	""
+#: src/lang.c:2228
+msgid	"Use 8bit characters in news headers"
+msgstr	"Caractères 8bit dans les en-têtes usenet"
 
-#: src/lang.c:2082
+#: src/lang.c:2229
 msgid	"# If ON, 8bit characters in news headers are NOT encoded.\n"
 	"# default is OFF. Thus 8bit characters are encoded by default.\n"
 	"# 8bit chars in header are encoded regardless of the value of this\n"
 	"# parameter unless post_mime_encoding is 8bit as well.\n"
-msgstr	""
+msgstr	"# Si ON, les caractères 8bit dans les en-têtes ne sont PAS encodés.\n"
+	"# OFF par défaut. Donc les caractères 8bit sont encodés par défaut.\n"
+	"# Les caractères 8bit dans les en-têtes sont encodés indépendamment\n"
+	"# de la valeur de cette option sauf si post_mime_encoding a comme\n"
+	"# valeur 8bit.\n"
 
-#: src/lang.c:2089
+#: src/lang.c:2236
 msgid	"Auto-view post-processed files <SPACE> toggles, <CR> sets, <ESC> cancels."
-msgstr	""
+msgstr	"Visualiser automatiquement les fichiers traités. <ESPACE> change, <RETOUR> "
+	"valide, <ESC> annule."
 
-#: src/lang.c:2090
-msgid	"View post-processed files          :"
-msgstr	""
+#: src/lang.c:2237
+msgid	"View post-processed files"
+msgstr	"Voir les fichiers traités"
 
-#: src/lang.c:2091
+#: src/lang.c:2238
 msgid	"# If set, post processed files will be opened in a viewer\n"
-msgstr	""
+msgstr	"# Si ON, les fichiers traités seront ouverts\n"
 
-#: src/lang.c:2096
-msgid	"MIME encoding in mail messages     :"
-msgstr	""
+#: src/lang.c:2243
+msgid	"MIME encoding in mail messages"
+msgstr	"Encodage MIME pour les mails"
 
-#: src/lang.c:2102
-msgid	"Use 8bit characters in mail headers:"
-msgstr	""
+#: src/lang.c:2249
+msgid	"Use 8bit characters in mail headers"
+msgstr	"Caractères 8bits dans en-têtes mail"
 
-#: src/lang.c:2103
+#: src/lang.c:2250
 msgid	"# If ON, 8bit characters in mail headers are NOT encoded.\n"
 	"# default is OFF. Thus 8bit characters are encoded by default.\n"
 	"# 8bit chars in headers are encoded regardless of the value of this "
@@ -5447,669 +6003,584 @@ msgid	"# If ON, 8bit characters in mail 
 	"# unless mail_mime_encoding is 8bit as well. Note that RFC 2822\n"
 	"# prohibits 8bit characters in mail headers so that you are advised NOT to\n"
 	"# turn it ON unless you have some compelling reason.\n"
-msgstr	""
+msgstr	"# Si ON, les caractères 8bit dans les en-têtes des mails ne sont PAS "
+	"encodés.\n"
+	"# OFF par défaut. Donc les caractères 8bit sont encodés par défaut.\n"
+	"# Les caractères 8bit dans les en-têtes sont encodés indépendamment\n"
+	"# de la valeur de cette option sauf si mail_mime_encoding a comme valeur\n"
+	"# 8bit.\n"
+	"# Notez que la RFC 2822 interdit les caractères 8bit dans les en-têtes des\n"
+	"# mails donc nous vous conseillons de ne PAS activer cette option sauf si\n"
+	"# vous avez une bonne raison.\n"
+
+#: src/lang.c:2260
+msgid	"Strip blanks from ends of lines"
+msgstr	"Nettoyer les fins de lignes"
 
-#: src/lang.c:2113
-msgid	"Strip blanks from ends of lines    :"
-msgstr	""
-
-#: src/lang.c:2114
+#: src/lang.c:2261
 msgid	"# If ON strip blanks from ends of lines for faster display on slow "
 	"terminals.\n"
-msgstr	""
+msgstr	"# Si ON, enlève les blancs présents aux fins de lignes pour un affichage \n"
+	"# plus rapide sur les terminaux lents.\n"
 
-#: src/lang.c:2119
+#: src/lang.c:2266
 msgid	"If ON, use transliteration. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Si ON, utilise 'translit' pour iconv_open(3). <ESPACE> change & <RETOUR> "
+	"valide."
 
-#: src/lang.c:2120
-msgid	"Transliteration                    :"
-msgstr	""
+#: src/lang.c:2267
+msgid	"Transliteration"
+msgstr	"Translitération (conversion)"
 
-#: src/lang.c:2121
+#: src/lang.c:2268
 msgid	"# If ON, use //TRANSLIT extension. This means that when a character cannot\n"
 	"# be represented in the in the target character set, it can be approximated\n"
 	"# through one or several similarly looking characters.\n"
-msgstr	""
+msgstr	"# Si ON, utilise l'extension //TRANSLIT. Cela veut dire que lorsqu'un\n"
+	"# caractère n'est pas disponible dans l'encodage choisi, il peut être\n"
+	"# remplacé par un ou plusieurs autres caractères similaires.\n"
 
-#: src/lang.c:2128
+#: src/lang.c:2275
 msgid	"Send you a carbon copy automatically. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Vous envoie automatiquement une copie (CC). <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:2129
-msgid	"Send you a cc automatically        :"
-msgstr	""
+#: src/lang.c:2276
+msgid	"Send you a cc automatically"
+msgstr	"Envoyer automatiquement une copie"
 
-#: src/lang.c:2130
+#: src/lang.c:2277
 msgid	"# If ON automatically put your name in the Cc: field when mailing an article\n"
-msgstr	""
+msgstr	"# Si ON, inclus automatiquement votre nom dans le champ Cc: lors d'un envoi\n"
+	"# par mail d'un article.\n"
 
-#: src/lang.c:2134
+#: src/lang.c:2281
 msgid	"Send you a blind carbon copy automatically. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Vous envoie automatiquement une copie privée (BCC). <ESPACE> change & "
+	"<RETOUR> valide."
 
-#: src/lang.c:2135
-msgid	"Send you a blind cc automatically  :"
-msgstr	""
+#: src/lang.c:2282
+msgid	"Send you a blind cc automatically"
+msgstr	"Envoi automatique d'une copie privée"
 
-#: src/lang.c:2136
+#: src/lang.c:2283
 msgid	"# If ON automatically put your name in the Bcc: field when mailing an "
 	"article\n"
-msgstr	""
+msgstr	"# Si ON, inclus automatiquement votre nom dans le champ Bcc: lors d'un envoi\n"
+	"# par mail d'un article.\n"
 
-#: src/lang.c:2140
+#: src/lang.c:2287
 msgid	"Enter address elements about which you want to be warned. <CR> sets."
-msgstr	""
+msgstr	"Être averti de ces éléments. <RETOUR> valide."
 
-#: src/lang.c:2141
-msgid	"Spamtrap warning address parts     :"
-msgstr	""
+#: src/lang.c:2288
+msgid	"Spamtrap warning address parts"
+msgstr	"Pièges à spam dans les adresses"
 
-#: src/lang.c:2142
+#: src/lang.c:2289
 msgid	"# A comma-delimited list of address-parts you want to be warned\n"
 	"# about when trying to reply by email.\n"
-msgstr	""
+msgstr	"# Une liste des parties dans les adresses, délimitées par des virgules,\n"
+	"# que vous souhaitez connaître lors d'une réponse par mail.\n"
 
-#: src/lang.c:2147
+#: src/lang.c:2294
 msgid	"Enter default number of days a filter entry will be valid. <CR> sets."
-msgstr	""
+msgstr	"Entrer la durée d'un filtre (en nombre de jours). <RETOUR> valide."
 
-#: src/lang.c:2148
-msgid	"No. of days a filter entry is valid:"
-msgstr	""
+#: src/lang.c:2295
+msgid	"No. of days a filter entry is valid"
+msgstr	"Durée de validité d'un filtre"
 
-#: src/lang.c:2149
+#: src/lang.c:2296
 msgid	"# Number of days a short term filter will be active\n"
-msgstr	""
+msgstr	"# Durée (en nombre de jours) de validité d'un filtre\n"
 
-#: src/lang.c:2153
+#: src/lang.c:2300
 msgid	"Add posted articles to filter. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Créer un filtre pour les articles postés. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:2154
-msgid	"Add posted articles to filter      :"
-msgstr	""
+#: src/lang.c:2301
+msgid	"Add posted articles to filter"
+msgstr	"Créer un filtre pour les articles postés"
 
-#: src/lang.c:2155
+#: src/lang.c:2302
 msgid	"# If ON add posted articles which start a new thread to filter for\n"
 	"# highlighting follow-ups\n"
-msgstr	""
+msgstr	"# Si ON, crée un filtre pour les articles débutant un nouveau fil\n"
+	"# afin de mettre en surbrillance les suivis.\n"
 
-#: src/lang.c:2159
+#: src/lang.c:2306
 msgid	"The directory where articles/threads are to be saved in mailbox format."
-msgstr	""
+msgstr	"Le répertoire où sont enregistrés les articles/fils au format mailbox."
 
-#: src/lang.c:2160
-msgid	"Mail directory                     :"
-msgstr	""
+#: src/lang.c:2307
+msgid	"Mail directory"
+msgstr	"Répertoire mail"
 
-#: src/lang.c:2161
+#: src/lang.c:2308
 msgid	"# (-m) directory where articles/threads are saved in mailbox format\n"
-msgstr	""
+msgstr	"# (-m) répertoire où sont enregistrés les articles/fils au format mailbox\n"
 
-#: src/lang.c:2166
-msgid	"Save articles in batch mode (-S)   :"
-msgstr	""
+#: src/lang.c:2313
+msgid	"Save articles in batch mode (-S)"
+msgstr	"Enregistrer articles en arrière-plan (-S)"
 
-#: src/lang.c:2167
+#: src/lang.c:2314
 msgid	"# If ON articles/threads will be saved in batch mode when save -S\n"
 	"# or mail (-M/-N) is specified on the command line\n"
-msgstr	""
+msgstr	"# Si ON, les articles/fils seront enregistrés à l'arrière-plan lorsque\n"
+	"# l'option -S ou (-M/-N) pour les mails est spécifiée.\n"
 
-#: src/lang.c:2172
+#: src/lang.c:2319
 msgid	"The directory where you want articles/threads saved."
-msgstr	""
+msgstr	"Le répertoire où vous voulez enregistrer les articles/fils."
 
-#: src/lang.c:2173
-msgid	"Directory to save arts/threads in  :"
-msgstr	""
+#: src/lang.c:2320
+msgid	"Directory to save arts/threads in"
+msgstr	"Répertoire où enregistrer les articles/fils"
 
-#: src/lang.c:2174
+#: src/lang.c:2321
 msgid	"# Directory where articles/threads are saved\n"
-msgstr	""
+msgstr	"# Répertoire où sont enregistrés les articles/fils\n"
 
-#: src/lang.c:2178
+#: src/lang.c:2325
 msgid	"Auto save article/thread by Archive-name: header. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Enregistrement auto. basé sur l'en-tête Archive-name:. <ESPACE> change & "
+	"<RETOUR> valide."
 
-#: src/lang.c:2179
-msgid	"Use Archive-name: header for save  :"
-msgstr	""
+#: src/lang.c:2326
+msgid	"Use Archive-name: header for save"
+msgstr	"Honorer l'en-tête 'Archive-name:'"
 
-#: src/lang.c:2180
+#: src/lang.c:2327
 msgid	"# If ON articles/threads with Archive-name: in mail header will\n"
 	"# be automatically saved with the Archive-name & part/patch no.\n"
-msgstr	""
+msgstr	"# Si ON, les articles/fils avec 'Archive-name:' dans l'en-tête\n"
+	"# du mail seront enregistrés automatiquement avec l'Archive-name\n"
+	"# & le numéro de la partie et ou patch.\n"
 
-#: src/lang.c:2185
+#: src/lang.c:2332
 msgid	"Mark saved articles/threads as read. <SPACE> toggles, <CR> sets, <ESC> "
 	"cancels."
-msgstr	""
+msgstr	"Marquer lu les articles/fils enregistrés. <ESPACE> change, <RETOUR> valide, "
+	"<ESC> annule."
 
-#: src/lang.c:2186
-msgid	"Mark saved articles/threads as read:"
-msgstr	""
+#: src/lang.c:2333
+msgid	"Mark saved articles/threads as read"
+msgstr	"Marquer lu les articles/fils enregistrés"
 
-#: src/lang.c:2187
+#: src/lang.c:2334
 msgid	"# If ON mark articles that are saved as read\n"
-msgstr	""
+msgstr	"# Si ON, marque lu les articles qui sont enregistrés\n"
 
-#: src/lang.c:2191
+#: src/lang.c:2338
 msgid	"Do post processing (eg. extract attachments) for saved articles."
-msgstr	""
+msgstr	"Post-traiter (p.e. extraire les pj) les articles enregistrés."
 
-#: src/lang.c:2192
-msgid	"Post process saved articles        :"
-msgstr	""
+#: src/lang.c:2339
+msgid	"Post process saved articles"
+msgstr	"Post-traiter les articles enregistrés"
 
-#: src/lang.c:2193
+#: src/lang.c:2340
 msgid	"# Perform post processing (saving binary attachments) from saved articles.\n"
-	"# 0=(no) 1=(yes) 2=(extract shell archives (shar) only)\n"
-msgstr	""
-
-#: src/lang.c:2199
-msgid	"Process only unread articles       :"
-msgstr	""
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no\n"
+	"#   1 = extract shell archives (shar) only\n"
+	"#   2 = yes\n"
+msgstr	"# Post-traitement (enregistrement des pj) des articles enregistrés.\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"# * 0 = non\n"
+	"#   1 = extraire uniquement les *.shar (archives shell)\n"
+	"#   2 = oui\n"
+
+#: src/lang.c:2349
+msgid	"Process only unread articles"
+msgstr	"Traiter uniquement les articles non lus"
 
-#: src/lang.c:2200
+#: src/lang.c:2350
 msgid	"# If ON only save/print/pipe/mail unread articles (tagged articles excepted)\n"
-msgstr	""
+msgstr	"# Si ON, enregistre/imprime/pipe/envoi articles non lu\n"
+	"# (excepté les articles marqués)\n"
 
-#: src/lang.c:2205
+#: src/lang.c:2355
 msgid	"Print all or just part of header. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Afficher tout ou une partie des en-têtes. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:2206
-msgid	"Print all headers when printing    :"
-msgstr	""
+#: src/lang.c:2356
+msgid	"Print all headers when printing"
+msgstr	"Imprimer tous les en-têtes"
 
-#: src/lang.c:2207
+#: src/lang.c:2357
 msgid	"# If ON print all of article header otherwise just the important lines\n"
-msgstr	""
+msgstr	"# Si ON, imprimer tous les en-têtes, sinon juste les lignes importantes\n"
 
-#: src/lang.c:2211
+#: src/lang.c:2361
 msgid	"The printer program with options that is to be used to print articles/threads."
-msgstr	""
+msgstr	"Le logiciel d'impression avec options utilisées pour imprimer les articles/"
+	"fils."
 
-#: src/lang.c:2212
-msgid	"Printer program with options       :"
-msgstr	""
+#: src/lang.c:2362
+msgid	"Printer program with options"
+msgstr	"Logiciel d'impression avec options"
 
-#: src/lang.c:2213
+#: src/lang.c:2363
 msgid	"# Print program with parameters used to print articles/threads\n"
-msgstr	""
+msgstr	"# Logiciel d'impression avec options utilisées por imprimer les articles/"
+	"fils\n"
 
-#: src/lang.c:2219
-msgid	"Force redraw after certain commands:"
-msgstr	""
+#: src/lang.c:2369
+msgid	"Force redraw after certain commands"
+msgstr	"Rafraîchir l'écran après certaines actions"
 
-#: src/lang.c:2220
+#: src/lang.c:2370
 msgid	"# If ON a screen redraw will always be done after certain external commands\n"
-msgstr	""
+msgstr	"# Si ON, un rafraîchissement de l'écran sera toujours effectué après\n"
+	"# certaines commandes externes\n"
 
-#: src/lang.c:2224
+#: src/lang.c:2374
 msgid	"Start editor with line offset. <SPACE> toggles, <CR> sets, <ESC> cancels."
-msgstr	""
+msgstr	"Lancer l'éditeur avec une ligne décalée. <ESPACE> change, <RETOUR> valide, "
+	"<ESC> annule."
 
-#: src/lang.c:2225
-msgid	"Start editor with line offset      :"
-msgstr	""
+#: src/lang.c:2375
+msgid	"Start editor with line offset"
+msgstr	"Lancer l'éditeur avec une ligne décalée"
 
-#: src/lang.c:2226
+#: src/lang.c:2376
 msgid	"# If ON editor will be started with cursor offset into the file\n"
 	"# otherwise the cursor will be positioned at the first line\n"
-msgstr	""
+msgstr	"# Si ON, l'éditeur sera lancé avec le curseur décalé\n"
+	"# sinon, le curseur sera positionné sur la première ligne\n"
 
-#: src/lang.c:2231
+#: src/lang.c:2381
 msgid	"Enter %E for editor, %F for filename, %N for line-number, <CR> to set."
-msgstr	""
+msgstr	"%E pour l'éditeur, %F pour le fichier, %N pour la ligne, <RETOUR> valide."
 
-#: src/lang.c:2232
-msgid	"Invocation of your editor          :"
-msgstr	""
+#: src/lang.c:2382
+msgid	"Invocation of your editor"
+msgstr	"Lancement de votre éditeur"
 
-#: src/lang.c:2233
+#: src/lang.c:2383
+#, c-format
 msgid	"# Format of editor line including parameters\n"
 	"# %%E Editor  %%F Filename  %%N Linenumber\n"
-msgstr	""
+msgstr	"# Format des paramètres pour l'éditeur\n"
+	"# %%E Éditeur  %%F Fichier  %%N N° de ligne\n"
 
-#: src/lang.c:2238
+#: src/lang.c:2388
 msgid	"Enter name and options for external-inews, --internal for internal inews"
-msgstr	""
+msgstr	"Nom et options pour l'inews externe, --internal pour l'inews interne"
 
-#: src/lang.c:2239
-msgid	"External inews                     :"
-msgstr	""
+#: src/lang.c:2389
+msgid	"External inews"
+msgstr	"Inews externe"
 
-#: src/lang.c:2240
+#: src/lang.c:2390
 msgid	"# If --internal use the built in mini inews for posting via NNTP\n"
 	"# otherwise use an external inews program\n"
-msgstr	""
+msgstr	"# Si '--internal', utilise l'inews allégé intégré pour poster via\n"
+	"# NNTP sinon, utilise un logiciel inews externe\n"
 
-#: src/lang.c:2244
+#: src/lang.c:2394
 msgid	"Enter %M for mailer, %S for subject, %T for to, %F for filename, <CR> to set."
-msgstr	""
+msgstr	"%M pour le MUA, %S pour le sujet, %T pour 'to:', %F pour Fichier, <RETOUR> "
+	"valide."
 
-#: src/lang.c:2245
-msgid	"Invocation of your mail command    :"
-msgstr	""
+#: src/lang.c:2395
+msgid	"Invocation of your mail command"
+msgstr	"Lancement de votre client mail"
 
-#: src/lang.c:2246
+#: src/lang.c:2396
+#, c-format
 msgid	"# Format of mailer line including parameters\n"
-	"# %%M Mailer  %%S Subject  %%T To  %%F Filename  %%U User (AmigaDOS)\n"
+	"# %%M Mailer  %%S Subject  %%T To  %%F Filename\n"
 	"# ie. to use elm as your mailer:    elm -s \"%%S\" \"%%T\" < %%F\n"
 	"# ie. elm interactive          :    elm -i %%F -s \"%%S\" \"%%T\"\n"
-msgstr	""
-
-#: src/lang.c:2254
-msgid	"Use interactive mail reader        :"
-msgstr	""
-
-#: src/lang.c:2255
-msgid	"# Interactive mailreader: if ON mailreader will be invoked earlier for\n"
-	"# reply so you can use more of its features (eg. MIME, pgp, ...)\n"
-	"# this option has to suit default_mailer_format\n"
-msgstr	""
-
-#: src/lang.c:2262
-msgid	"Remove ~/.article after posting    :"
-msgstr	""
+msgstr	"# Format des paramètres pour le MUA\n"
+	"# %%M MUA  %%S Sujet  %%T 'To:'  %%F Fichier\n"
+	"# p.e. pour utiliser elm comme MUA : elm -s \"%%S\" \"%%T\" < %%F\n"
+	"# p.e. pour elm interactif         : elm -i %%F -s \"%%S\" \"%%T\"\n"
+
+#: src/lang.c:2404
+msgid	"Use interactive mail reader"
+msgstr	"Utiliser un MUA interactif"
+
+#: src/lang.c:2405
+msgid	"# Interactive mailreader\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no interactive mailreader\n"
+	"#   1 = use interactive mailreader with headers in file\n"
+	"#   2 = use interactive mailreader without headers in file\n"
+msgstr	"# MUA interactif :\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"# * 0 = pas de MUA interactif\n"
+	"#   1 = utiliser un MUA interactif avec les en-têtes du fichier\n"
+	"#   2 = utiliser un MUA interactif sans les en-têtes du fichier\n"
+
+#: src/lang.c:2414
+msgid	"Remove ~/.article after posting"
+msgstr	"Effacer ~/.article après le postage"
 
-#: src/lang.c:2263
+#: src/lang.c:2415
 msgid	"# If ON remove ~/.article after posting.\n"
-msgstr	""
+msgstr	"# Si ON, effacer ~/.article après le postage.\n"
 
-#: src/lang.c:2267
+#: src/lang.c:2419
 msgid	"Filename for all posted articles, <CR> sets, no filename=do not save."
-msgstr	""
+msgstr	"Fichier pour les articles postés, <RETOUR> valide, pas de fichier = désactive."
 
-#: src/lang.c:2268
-msgid	"Filename for posted articles       :"
-msgstr	""
+#: src/lang.c:2420
+msgid	"Filename for posted articles"
+msgstr	"Fichier pour les articles postés"
 
-#: src/lang.c:2269
+#: src/lang.c:2421
 msgid	"# Filename where to keep all postings (default posted)\n"
 	"# If no filename is set then postings will not be saved\n"
-msgstr	""
+msgstr	"# Fichier où enregistrer les articles postés ('posted' par défaut)\n"
+	"# Si aucun fichier n'est indiqué, les articles postés ne seront pas\n"
+	"# enregistrés\n"
 
-#: src/lang.c:2274
+#: src/lang.c:2426
 msgid	"Keep all failed articles in ~/dead.articles. <SPACE> toggles & <CR> sets."
-msgstr	""
+msgstr	"Garder les articles non postés dans ~/dead.articles. <ESPACE> change & "
+	"<RETOUR> valide."
 
-#: src/lang.c:2275
-msgid	"Keep failed arts in ~/dead.articles:"
-msgstr	""
+#: src/lang.c:2427
+msgid	"Keep failed arts in ~/dead.articles"
+msgstr	"Articles non postés dans ~/dead.articles"
 
-#: src/lang.c:2276
+#: src/lang.c:2428
 msgid	"# If ON keep all failed postings in ~/dead.articles\n"
-msgstr	""
+msgstr	"# Si ON, garde tous les articles non postés dans ~/dead.articles\n"
 
-#: src/lang.c:2280
+#: src/lang.c:2432
 msgid	"Do you want to strip unsubscribed groups from .newsrc"
-msgstr	""
+msgstr	"Voulez-vous effacer dans newsrc les groupes auxquels vous vous êtes désabonnés"
 
-#: src/lang.c:2281
-msgid	"No unsubscribed groups in newsrc   :"
-msgstr	""
+#: src/lang.c:2433
+msgid	"No unsubscribed groups in newsrc"
+msgstr	"Pas de groupes désabonnés dans newsrc"
 
-#: src/lang.c:2282
+#: src/lang.c:2434
 msgid	"# If ON strip unsubscribed groups from newsrc\n"
-msgstr	""
+msgstr	"# Si ON, efface dans newsrc les groupes auxquels vous vous êtes désabonnés\n"
 
-#: src/lang.c:2287
-msgid	"Remove bogus groups from newsrc    :"
-msgstr	""
+#: src/lang.c:2439
+msgid	"Remove bogus groups from newsrc"
+msgstr	"Effacer les groupes corrompus de newsrc"
 
-#: src/lang.c:2288
+#: src/lang.c:2440
 msgid	"# What to do with bogus groups in newsrc file\n"
-	"# 0=(Keep) 1=(Remove) 2=(Highlight with D on selection screen).\n"
-msgstr	""
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = keep\n"
+	"#   1 = remove\n"
+	"#   2 = highlight with D on selection screen\n"
+msgstr	"# Que faire des groupes corrompus du fichier newsrc\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"# * 0 = garder\n"
+	"#   1 = effacer\n"
+	"#   2 = marquer d'un D dans l'écran de sélection\n"
 
-#: src/lang.c:2292
+#: src/lang.c:2448
 msgid	"Enter number of seconds until active file will be reread. <CR> sets."
-msgstr	""
+msgstr	"Durée avant que le fichier active ne soit relu. <RETOUR> valide."
 
-#: src/lang.c:2293
-msgid	"Interval in secs to reread active  :"
-msgstr	""
+#: src/lang.c:2449
+msgid	"Interval in secs to reread active"
+msgstr	"Durée avant relecture du fichier active"
 
-#: src/lang.c:2294
+#: src/lang.c:2450
 msgid	"# Time interval in seconds between rereading the active file (0=never)\n"
-msgstr	""
+msgstr	"# Durée (en secondes) avant que le fichier active ne soit relu (0=jamais)\n"
 
-#: src/lang.c:2299
-msgid	"Reconnect to server automatically  :"
-msgstr	"Reconnexion automatique au serveur :"
+#: src/lang.c:2455
+msgid	"Reconnect to server automatically"
+msgstr	"Reconnexion automatique au serveur"
 
-#: src/lang.c:2300
+#: src/lang.c:2456
 msgid	"# If ON automatically reconnect to NNTP server if the connection is broken\n"
-msgstr	""
+msgstr	"# Si ON, reconnexion automatique au serveur NNTP si la connexion est rompue\n"
 
-#: src/lang.c:2304
+#: src/lang.c:2460
 msgid	"Create local copies of NNTP overview files. <SPACE> toggles & <CR> sets."
-msgstr	"Créer des copies locales des en-têtes NNTP. <ESPACE> change & <CR> choisi."
+msgstr	"Créer des copies locales des en-têtes NNTP. <ESPACE> change & <RETOUR> valide."
 
-#: src/lang.c:2305
-msgid	"Cache NNTP overview files locally  :"
-msgstr	"Cache local des en-têtes NNTP      :"
+#: src/lang.c:2461
+msgid	"Cache NNTP overview files locally"
+msgstr	"Cache local des en-têtes NNTP"
 
-#: src/lang.c:2306
+#: src/lang.c:2462
 msgid	"# If ON, create local copies of NNTP overview files.\n"
 msgstr	"# Si ON, crée une copie locale des en-têtes NNTP.\n"
 
-#: src/main.c:619
-#, c-format
-msgid	"Version: %s release %s (\"%s\") %s %s"
-msgstr	"Version : %s release %s (\"%s\") %s %s"
+#: src/lang.c:2466
+msgid	"Enter format string. <CR> sets, <ESC> cancels."
+msgstr	"Formatage des dates. <RETOUR> valide, <ESC> annule."
+
+#: src/lang.c:2467
+msgid	"Format string for display of dates"
+msgstr	"Format des dates affichées"
+
+#: src/lang.c:2468
+msgid	"# Format string for date representation\n"
+msgstr	"# Format des dates affichées\n"
+
+#: src/lang.c:2474
+msgid	"Unicode normalization form"
+msgstr	"Normalisation d'Unicode"
+
+#: src/lang.c:2475
+msgid	"# Unicode normalization form\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = None\n"
+	"# * 1 = NFKC\n"
+	"#   2 = NFKD\n"
+	"#   3 = NFC\n"
+	"#   4 = NFD\n"
+msgstr	"# Normalisation d'Unicode\n"
+	"# Les valeurs possibles sont (celle par défaut est marquée par *) :\n"
+	"#   0 = Aucune\n"
+	"# * 1 = NFKC\n"
+	"#   2 = NFKD\n"
+	"#   3 = NFC\n"
+	"#   4 = NFD\n"
+
+#: src/lang.c:2487
+msgid	"Render BiDi"
+msgstr	"Rendu BiDi"
+
+#: src/lang.c:2488
+msgid	"# If ON, bi-directional text is rendered by tin\n"
+msgstr	"# Si ON, le texte bi-directionnel est affiché par tin\n"
+
+#: src/misc.c:3750
+#, c-format
+msgid	"Version: %s %s release %s (\"%s\") %s %s\n"
+msgstr	"Version : %s %s release %s (\"%s\") %s %s\n"
 
-#: src/main.c:622
+#: src/misc.c:3753
 #, c-format
-msgid	"Version: %s release %s (\"%s\")"
-msgstr	"Version : %s release %s (\"%s\")"
+msgid	"Version: %s %s release %s (\"%s\")\n"
+msgstr	"Version : %s %s release %s (\"%s\")\n"
+
+#: src/newsrc.c:430
+msgid	"Unreachable?\n"
+msgstr	"Inacessible ?\n"
 
-#: src/nntplib.c:804
+#: src/nntplib.c:824
 #, c-format
 msgid	"\n"
 	"Server timed out, trying reconnect # %d\n"
 msgstr	"\n"
 	"Connexion au serveur expirée, reconnexion # %d\n"
 
-#: src/nntplib.c:822
+#: src/nntplib.c:842
 msgid	"Rejoin current group\n"
-msgstr	"Rejoindre l'actuel groupe\n"
+msgstr	"Rejoindre le groupe actuel\n"
 
-#: src/nntplib.c:829
+#: src/nntplib.c:849
 #, c-format
 msgid	"Read (%s)\n"
 msgstr	"Lecture (%s)\n"
 
-#: src/nntplib.c:831
+#: src/nntplib.c:851
 #, c-format
 msgid	"Resend last command (%s)\n"
 msgstr	"Réenvoyer la dernière commande (%s)\n"
 
-#: src/nntplib.c:951
-msgid	"100  Help text on way"
-msgstr	"100 L'aide arrive"
-
-#: src/nntplib.c:955
-msgid	"180  Authorization capabilities"
-msgstr	"180 Capacités d'autorisation"
-
-#: src/nntplib.c:959
-msgid	"199  Debug output"
-msgstr	"199 Sortie du déboguage"
-
-#: src/nntplib.c:963
-msgid	"200  Hello; you can post"
-msgstr	"200 Salut; vous pouvez poster"
-
-#: src/nntplib.c:967
-msgid	"201  Hello; you can't post"
-msgstr	"201 Salut; vous ne pouvez pas poster"
-
-#: src/nntplib.c:971
-msgid	"202  Slave status noted"
-msgstr	"202 Statut de l'esclave noté"
-
-#: src/nntplib.c:979
-msgid	"211  Group selected"
-msgstr	"211 Groupe sélectionné"
-
-#: src/nntplib.c:984
-msgid	"215  Newsgroups follow"
-msgstr	"215 Les groupes arrivent"
-
-#: src/nntplib.c:989
-msgid	"218  Group index file follows"
-msgstr	"218 L'index du groupe arrive"
-
-#: src/nntplib.c:994
-msgid	"220  Article (head & body) follows"
-msgstr	"220 L'article (corps & en-tête) arrive"
-
-#: src/nntplib.c:998
-msgid	"221  Head follows"
-msgstr	"221 L'en-tête arrive"
-
-#: src/nntplib.c:1002
-msgid	"222  Body follows"
-msgstr	"222 Le corps arrive"
-
-#: src/nntplib.c:1006
-msgid	"223  No text sent -- stat, next, last"
-msgstr	"223 Pas de texte envoyé -- stat, next, last"
-
-#: src/nntplib.c:1010
-msgid	"230  New articles by message-id follow"
-msgstr	"230 Les nouveaux articles pas message-id arrivent"
-
-#: src/nntplib.c:1014
-msgid	"231  New newsgroups follow"
-msgstr	"231 Les nouveaux groupes arrivent"
-
-#: src/nntplib.c:1018
-msgid	"235  Article transferred successfully"
-msgstr	"235 Article transféré avec succès"
-
-#: src/nntplib.c:1022
-msgid	"240  Article posted successfully"
-msgstr	"240 Article posté avec succès"
-
-#: src/nntplib.c:1026
-msgid	"280  Authorization system ok"
-msgstr	"280 Autorisation système ok"
-
-#: src/nntplib.c:1030
-msgid	"281  Authorization (user/pass) ok"
-msgstr	"281 Autorisation (utilisateur/mdp) ok"
-
-#: src/nntplib.c:1034
-msgid	"282  binary data follows"
-msgstr	"282 les données binaires arrivent"
-
-#: src/nntplib.c:1038
-msgid	"283  spooldir list follows"
-msgstr	"283 la liste des spooldir arrive"
-
-#: src/nntplib.c:1042
-msgid	"284  Switching to a different spooldir"
-msgstr	"284 Passage à un autre spooldir"
-
-#: src/nntplib.c:1046
-msgid	"285  Still using same spooldir"
-msgstr	"285 Utilisation du même spooldir"
-
-#: src/nntplib.c:1050
-msgid	"286  Current spooldir"
-msgstr	"286 Spooldir actuel"
-
-#: src/nntplib.c:1054
-msgid	"287  Available spooldir"
-msgstr	"287 Spooldir disponible"
-
-#: src/nntplib.c:1058
-msgid	"288  Unavailable spooldir or invalid entry"
-msgstr	"288 Spooldir indisponible ou entrée invalide"
-
-#: src/nntplib.c:1062
-msgid	"335  Continue to send article"
-msgstr	"335 Continuer l'envoi de l'article"
-
-#: src/nntplib.c:1066
-msgid	"340  Continue to post article"
-msgstr	"340 Continuer le postage de l'article"
-
-#: src/nntplib.c:1070
-msgid	"380  authorization is required"
-msgstr	"380 une autorisation est requise"
-
-#: src/nntplib.c:1074
-msgid	"381  <type> authorization data required"
-msgstr	"381 <type> données d'autorisation requises"
-
-#: src/nntplib.c:1078
-msgid	"400  Have to hang up for some reason"
-msgstr	"400 Déconnexion pour une raison quelconque"
-
-#: src/nntplib.c:1082
-msgid	"411  No such newsgroup"
-msgstr	"411 Pas de groupe de ce type"
-
-#: src/nntplib.c:1086
-msgid	"412  Not currently in newsgroup"
-msgstr	"412 N'est pas actuellement dans ce groupe"
-
-#: src/nntplib.c:1090
-msgid	"418  No index file for this group"
-msgstr	"418 Pas d'index pour ce groupe"
-
-#: src/nntplib.c:1094
-msgid	"420  No current article selected"
-msgstr	"420 Pas d'article actuellement sélectionné"
-
-#: src/nntplib.c:1098
-msgid	"421  No next article in this group"
-msgstr	"421 Pas d'article suivant dans ce groupe"
-
-#: src/nntplib.c:1102
-msgid	"422  No previous article in this group"
-msgstr	"422 Pas d'article précédent dans ce groupe"
-
-#: src/nntplib.c:1106
-msgid	"423  No such article in this group"
-msgstr	"423 Pas d'article de ce type dans ce groupe"
-
-#: src/nntplib.c:1110
-msgid	"430  No such article at all"
-msgstr	"430 Pas d'article de ce type"
-
-#: src/nntplib.c:1114
-msgid	"435  Already got that article, don't send"
-msgstr	"435 Article déjà présent, ne pas réenvoyer"
-
-#: src/nntplib.c:1118
-msgid	"436  Transfer failed"
-msgstr	"436 Échec du transfert"
-
-#: src/nntplib.c:1122
-msgid	"437  Article rejected, don't resend"
-msgstr	"437 Article rejeté, ne pas réenvoyer"
-
-#: src/nntplib.c:1126
-msgid	"440  Posting not allowed"
-msgstr	"440 Postage non autorisé"
-
-#: src/nntplib.c:1130
-msgid	"441  Posting failed"
-msgstr	"441 Échec du postage"
-
-#: src/nntplib.c:1134
-msgid	"480  authorization required for command"
-msgstr	"480 autorisation requise pour la commande"
-
-#: src/nntplib.c:1138
-msgid	"481  Authorization system invalid"
-msgstr	"481 Autorisation système invalide"
-
-#: src/nntplib.c:1142
-msgid	"482  Authorization data rejected"
-msgstr	"482 Données de l'autorisation rejetées"
-
-#: src/nntplib.c:1146
-msgid	"483  Invalid alias on spooldir cmd"
-msgstr	"483 Alias invalide de la commande spooldir"
-
-#: src/nntplib.c:1150
-msgid	"484  No spooldir file found"
-msgstr	"484 Fichier du spooldir introuvable"
-
-#: src/nntplib.c:1154
-msgid	"500  Command not recognized"
-msgstr	"500 Commande non reconnue"
-
-#: src/nntplib.c:1158
-msgid	"501  Command syntax error"
-msgstr	"501 Erreur sur la syntaxe de la commande"
-
-#: src/nntplib.c:1162
-msgid	"502  Access to server denied"
-msgstr	"502 Accès au serveur refusé"
-
-#: src/nntplib.c:1167
-msgid	"503  Program fault, command not performed"
-msgstr	"503 Faute du programme, commande non exécutée"
-
-#: src/nntplib.c:1171
-msgid	"580  Authorization Failed"
-msgstr	"580 Échec de l'autorisation"
-
-#: src/nntplib.c:1175
-msgid	"Unknown NNTP response code"
-msgstr	"Code NNTP donné inconnu"
+# TRANSLATION MISSING
+#.
+#. * TODO: - store a hash value of the entire motd in the server-rc
+#. *         and only if it differs from the old value display the
+#. *         motd?
+#. *       - use some sort of pager?
+#. *       - -> lang.c
+#.
+#: src/nntplib.c:1759
+msgid	"MOTD: "
+msgstr	""
 
-#: src/nrctbl.c:172
+#: src/nrctbl.c:170
 #, c-format
 msgid	"couldn't expand %s\n"
 msgstr	"impossible de décompacter %s\n"
 
-#: src/open.c:1032
-msgid	"Unreachable?\n"
-msgstr	"Inacessible ?\n"
-
-#: src/post.c:1749
+# TRANSLATION MISSING
+#: src/post.c:1171
 #, c-format
-msgid	"%s is bogus"
-msgstr	"%s pose problème"
+msgid	"Line %d is longer than 998 octets and should be folded, but\n"
+	"encoding is neither set to %s nor to %s\n"
+msgstr	""
 
-#: src/post.c:1940
+# TRANSLATION MISSING
+#: src/post.c:1176
 #, c-format
-msgid	"Posting: %.*s ..."
-msgstr	"Postage : %.*s ..."
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is set to %s without enabling MIME_BREAK_LONG_LINES or\n"
+	"posting doesn't contain any 8bit chars and thus folding won't happen\n"
+msgstr	""
 
 # TRANSLATION MISSING
-#. TODO: -> lang.c
-#: src/post.c:4038
+#: src/post.c:1178
 #, c-format
-msgid	"Rereading %s..."
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is not set to %s\n"
 msgstr	""
 
-#. fp
+#: src/post.c:1993
+#, c-format
+msgid	"Posting: %.*s ..."
+msgstr	"Postage : %.*s ..."
+
 #. Check if okay to read
-#: src/read.c:219
+#: src/read.c:211
 msgid	"Aborting read, please wait..."
 msgstr	"Annulation de la lecture, un moment svp..."
 
-#: src/read.c:366
+#: src/read.c:358
 msgid	"Aborted read\n"
 msgstr	"Lecture annulée\n"
 
-#: src/read.c:422
+#: src/read.c:414
 msgid	"Draining\n"
 msgstr	"Purge\n"
 
 #. Don't hash the initial '<'
-#: src/refs.c:220
+#: src/refs.c:251
 msgid	"unchanged"
 msgstr	"non changé"
 
-#: src/refs.c:573
+#: src/refs.c:609
 msgid	"[- Unavailable -]"
 msgstr	"[- Indisponible -]"
 
-#: src/save.c:975
+#.
+#. * preamble
+#. * TODO: -> lang.c
+#.
+#: src/rfc2047.c:1201
+#, c-format
+msgid	"This message has been composed in the 'multipart/mixed' MIME-format. If you\n"
+	"are reading this prefix, your mail reader probably has not yet been modified\n"
+	"to understand the new format, and some of what follows may look strange.\n"
+	"\n"
+msgstr	"Ce message a été composé avec le format MIME 'multipart/mixed'. Si vous\n"
+	"lisez ceci, votre MUA ne peut probablement pas lire ce nouveau format, donc\n"
+	"ce qui suit peut paraître assez bizarre.\n"
+	"\n"
+
+#: src/save.c:972
 msgid	"bytes"
 msgstr	"octets"
 
-#: src/select.c:351
+#: src/select.c:379
 msgid	"unread"
 msgstr	"non lu(s)"
 
-#: src/select.c:351
+#: src/select.c:379
 msgid	"all"
 msgstr	"tout"
 
-#: src/select.c:525 src/select.c:527
+#: src/select.c:549 src/select.c:551
 msgid	" R"
 msgstr	" R"
 
@@ -6117,12 +6588,12 @@ msgstr	" R"
 #: src/xface.c:91
 #, c-format
 msgid	"Can't run slrnface: Environment variable %s not found."
-msgstr	""
+msgstr	"Lancement de slrnface impossible : Variable %s introuvable."
 
 #: src/xface.c:99 src/xface.c:131
 #, c-format
 msgid	"Can't run slrnface: failed to create %s"
-msgstr	""
+msgstr	"Lancement de slrnface impossible : échec de la création de %s"
 
 #: src/xface.c:109
 msgid	"This directory is used to create named pipes for communication between\n"
@@ -6135,7 +6606,10 @@ msgid	"This directory is used to create 
 	"However, if the directory is mounted from an NFS server, you might see\n"
 	"special files created by your NFS server while slrnface is running.\n"
 	"Do not try to remove them.\n"
-msgstr	""
+msgstr	"Ce répertoire est utilisé pour créer les pipes de communication entre\n"
+	"slrnface et ses processus pères. Il devrait être normalement vide car\n"
+	"le pipe est effacé juste après son ouverture entre les processus.\n"
+	"\n"
 
 #: src/xface.c:123
 msgid	"Can't run slrnface: couldn't construct fifo name."
Binary files tin-1.6.2/po/ru.gmo and tin-1.8.0/po/ru.gmo differ
diff -Nurp tin-1.6.2/po/ru.po tin-1.8.0/po/ru.po
--- tin-1.6.2/po/ru.po	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/po/ru.po	2005-12-24 19:09:52.093529764 +0100
@@ -0,0 +1,6163 @@
+# Russian translations for tin package
+# áÎÇÌÉÊÓËÉÅ ÐÅÒÅ×ÏÄÙ ÄÌÑ ÐÁËÅÔÁ tin.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+# Andrei Emeltchenko <andrei.emeltchenko@finik.org>, 2005.
+#
+msgid	""
+msgstr	"Project-Id-Version: tin 1.7.9\n"
+	"Report-Msgid-Bugs-To: \n"
+	"POT-Creation-Date: 2005-12-24 19:09+0100\n"
+	"PO-Revision-Date: 2005-03-23 15:39+0200\n"
+	"Last-Translator: Andrei Emeltchenko <andrei.emeltchenko@finik.org>\n"
+	"Language-Team: Russian <ru@li.org>\n"
+	"MIME-Version: 1.0\n"
+	"Content-Type: text/plain; charset=KOI8-R\n"
+	"Content-Transfer-Encoding: 8bit\n"
+	"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+	"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: src/art.c:1533
+#, c-format
+msgid	"%d Bad overview record (%d fields) '%s'"
+msgstr	""
+
+#: src/attrib.c:649
+#, c-format
+msgid	"# Do not edit this comment block\n"
+	"#\n"
+msgstr	"# îÅ ÒÅÄÁËÔÉÒÕÊÔÅ ÜÔÏÔ ÂÌÏË ËÏÍÍÅÎÔÁÒÉÅ×#\n"
+
+#: src/attrib.c:650
+#, c-format
+msgid	"#  scope=STRING (ie. alt.*,!alt.bin*) [mandatory]\n"
+msgstr	""
+
+#: src/attrib.c:651
+#, c-format
+msgid	"#  maildir=STRING (ie. ~/Mail)\n"
+msgstr	""
+
+#: src/attrib.c:652
+#, c-format
+msgid	"#  savedir=STRING (ie. ~user/News)\n"
+msgstr	""
+
+#: src/attrib.c:653
+#, c-format
+msgid	"#  savefile=STRING (ie. =linux)\n"
+msgstr	""
+
+#: src/attrib.c:654
+#, c-format
+msgid	"#  sigfile=STRING (ie. $var/sig)\n"
+msgstr	""
+
+#: src/attrib.c:655
+#, c-format
+msgid	"#  organization=STRING (if beginning with '/' read from file)\n"
+msgstr	""
+
+#: src/attrib.c:656
+#, c-format
+msgid	"#  followup_to=STRING\n"
+msgstr	""
+
+#: src/attrib.c:657
+#, c-format
+msgid	"#  mailing_list=STRING (ie. majordomo@example.org)\n"
+msgstr	""
+
+#: src/attrib.c:658
+#, c-format
+msgid	"#  x_headers=STRING (ie. ~/.tin/extra-headers)\n"
+msgstr	""
+
+#: src/attrib.c:659
+#, c-format
+msgid	"#  x_body=STRING (ie. ~/.tin/extra-body-text)\n"
+msgstr	""
+
+#: src/attrib.c:660
+#, c-format
+msgid	"#  from=STRING (just append wanted From:-line, don't use quotes)\n"
+msgstr	""
+
+#: src/attrib.c:661
+#, c-format
+msgid	"#  news_quote_format=STRING\n"
+msgstr	""
+
+#: src/attrib.c:662
+#, c-format
+msgid	"#  quote_chars=STRING (%%s, %%S for initials)\n"
+msgstr	""
+
+#: src/attrib.c:663
+#, c-format
+msgid	"#  mime_types_to_save=STRING (eg. image/*,!image/bmp)\n"
+msgstr	""
+
+#: src/attrib.c:665
+#, c-format
+msgid	"#  ispell=STRING\n"
+msgstr	""
+
+#: src/attrib.c:667
+#, c-format
+msgid	"#  auto_select=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:668
+#, c-format
+msgid	"#  auto_save=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:669
+#, c-format
+msgid	"#  batch_save=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:670
+#, c-format
+msgid	"#  delete_tmp_files=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:671
+#, c-format
+msgid	"#  show_only_unread=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:672
+#, c-format
+msgid	"#  thread_arts=NUM"
+msgstr	""
+
+#: src/attrib.c:679
+#, c-format
+msgid	"#  thread_perc=NUM\n"
+msgstr	""
+
+#: src/attrib.c:680
+#, c-format
+msgid	"#  show_author=NUM\n"
+msgstr	""
+
+#: src/attrib.c:686
+#, c-format
+msgid	"#  show_info=NUM\n"
+msgstr	""
+
+#: src/attrib.c:692
+#, c-format
+msgid	"#  sort_art_type=NUM\n"
+msgstr	""
+
+#: src/attrib.c:710
+#, c-format
+msgid	"#  sort_threads_type=NUM\n"
+msgstr	""
+
+#: src/attrib.c:715
+#, c-format
+msgid	"#  post_proc_type=NUM\n"
+msgstr	""
+
+#: src/attrib.c:720
+#, c-format
+msgid	"#  quick_kill_scope=STRING (ie. talk.*)\n"
+msgstr	""
+
+#: src/attrib.c:721
+#, c-format
+msgid	"#  quick_kill_expire=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:722
+#, c-format
+msgid	"#  quick_kill_case=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:723
+#, c-format
+msgid	"#  quick_kill_header=NUM\n"
+msgstr	""
+
+#: src/attrib.c:724 src/attrib.c:731
+#, c-format
+msgid	"#    0=subj (case sensitive) 1=subj (ignore case)\n"
+msgstr	""
+
+#: src/attrib.c:725 src/attrib.c:732
+#, c-format
+msgid	"#    2=from (case sensitive) 3=from (ignore case)\n"
+msgstr	""
+
+#: src/attrib.c:726 src/attrib.c:733
+#, c-format
+msgid	"#    4=msgid 5=lines\n"
+msgstr	""
+
+#: src/attrib.c:727
+#, c-format
+msgid	"#  quick_select_scope=STRING\n"
+msgstr	""
+
+#: src/attrib.c:728
+#, c-format
+msgid	"#  quick_select_expire=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:729
+#, c-format
+msgid	"#  quick_select_case=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:730
+#, c-format
+msgid	"#  quick_select_header=NUM\n"
+msgstr	""
+
+#: src/attrib.c:734
+#, c-format
+msgid	"#  x_comment_to=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:735
+#, c-format
+msgid	"#  fcc=STRING (eg. =mailbox)\n"
+msgstr	""
+
+#: src/attrib.c:736
+#, c-format
+msgid	"#  tex2iso_conv=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:737
+#, c-format
+msgid	"#  mime_forward=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:739
+#, c-format
+msgid	"#  mm_network_charset=supported_charset"
+msgstr	""
+
+#: src/attrib.c:746
+#, c-format
+msgid	"#  undeclared_charset=STRING (default is US-ASCII)\n"
+msgstr	""
+
+#: src/attrib.c:748
+#, c-format
+msgid	"#\n"
+	"# Note that it is best to put general (global scoping)\n"
+msgstr	""
+
+#: src/attrib.c:749
+#, c-format
+msgid	"# entries first followed by group specific entries.\n"
+	"#\n"
+msgstr	""
+
+#: src/attrib.c:750
+#, c-format
+msgid	"############################################################################\n"
+	"\n"
+msgstr	""
+
+#: src/attrib.c:756
+#, c-format
+msgid	"# include extra headers\n"
+msgstr	""
+
+#: src/attrib.c:764
+#, c-format
+msgid	"# in *sources* set post process type to shar only\n"
+msgstr	""
+
+#: src/attrib.c:768
+#, c-format
+msgid	"# in *binaries* do full post processing but no TeX2ISO conversion,\n"
+msgstr	""
+
+#: src/attrib.c:769
+#, c-format
+msgid	"# remove tmp files and set Followup-To: poster\n"
+msgstr	""
+
+#: src/cook.c:499
+msgid	"(unknown)"
+msgstr	"(ÎÅÉÚ×ÅÓÔÎÏ)"
+
+#.
+#. * TODO: add to the right rule, give better explanation, -> lang.c
+#.
+#: src/filter.c:597 src/filter.c:605
+msgid	"Removed from the previous rule: "
+msgstr	"õÄÁÌÅÎ ÉÚ ÐÒÅÄÙÄÕÝÅÇÏ ÐÒÁ×ÉÌÁ: "
+
+#: src/keymap.c:271
+msgid	"NULL"
+msgstr	""
+
+#: src/lang.c:42
+msgid	"1 Response"
+msgstr	"1 ïÔ×ÅÔ"
+
+#: src/lang.c:46
+#, c-format
+msgid	"\n"
+	"%s contains no newsgroups. Exiting."
+msgstr	"\n"
+	"%s ÎÅ ÓÏÄÅÒÖÉÔ newsgroup. ÷ÙÈÏÄ."
+
+#: src/lang.c:47
+msgid	"all "
+msgstr	"×ÓÅ "
+
+#: src/lang.c:48
+msgid	"All groups"
+msgstr	"÷ÓÅ ÇÒÕÐÐÙ"
+
+#: src/lang.c:49
+#, c-format
+msgid	"File %s exists. %s=append, %s=overwrite, %s=quit: "
+msgstr	"æÁÊÌ %s ÓÕÝÅÓÔ×ÕÅÔ. %s=ÄÏÂÁ×ÉÔØ, %s=ÐÅÒÅÐÉÓÁÔØ, %s=×ÙÊÔÉ: "
+
+#: src/lang.c:50
+msgid	"Article cancelled (deleted)."
+msgstr	"óÔÁÔØÑ ÏÔÍÅÎÅÎÁ (ÕÄÁÌÅÎÁ)."
+
+#: src/lang.c:51
+msgid	"Article cannot be cancelled (deleted)."
+msgstr	"óÔÁÔØÑ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÏÔÍÅÎÅÎÁ (ÕÄÁÌÅÎÁ)."
+
+#: src/lang.c:52
+msgid	"Article deleted."
+msgstr	"óÔÁÔØÑ ÕÄÁÌÅÎÁ."
+
+#: src/lang.c:53
+#, c-format
+msgid	"\n"
+	"Your article:\n"
+	"  \"%s\"\n"
+	"will be posted to the following %s:\n"
+msgstr	"\n"
+	"÷ÁÛÁ ÓÔÁÔØÑ:\n"
+	"  \"%s\"\n"
+	"ÂÕÄÅÔ ÏÔÐÒÁ×ÌÅÎÁ × %s:\n"
+
+#: src/lang.c:54
+msgid	"Article not posted!"
+msgstr	"óÔÁÔØÑ ÎÅ ÏÔÐÒÁ×ÌÅÎÁ!"
+
+#: src/lang.c:55
+msgid	"Article not saved"
+msgstr	"óÔÁÔØÑ ÎÅ ÓÏÈÒÁÎÅÎÁ"
+
+#: src/lang.c:56
+msgid	"Article Level Commands"
+msgstr	"ëÏÍÁÎÄÙ õÒÏ×ÎÑ óÔÁÔØÉ"
+
+#: src/lang.c:57
+msgid	"Article has no parent"
+msgstr	"óÔÁÔØÑ ÎÅ ÉÍÅÅÔ ÒÏÄÉÔÅÌÅÊ"
+
+#: src/lang.c:58
+msgid	"Parent article has been killed"
+msgstr	"òÏÄÉÔÅÌØÓËÁÑ ÓÔÁÔØÑ ÂÙÌÁ ÕÎÉÞÔÏÖÅÎÁ"
+
+#: src/lang.c:59
+msgid	"Parent article is unavailable"
+msgstr	"òÏÄÉÔÅÌØÓËÁÑ ÓÔÁÔØÑ ÎÅÄÏÓÔÕÐÎÁ"
+
+#: src/lang.c:60
+#, c-format
+msgid	"Article posted: %s"
+msgstr	"óÔÁÔØÑ ÏÔÐÒÁ×ÌÅÎÁ: %s"
+
+#: src/lang.c:61
+#, c-format
+msgid	"Article rejected (saved to %s)"
+msgstr	"óÔÁÔØÑ ÏÔ×ÅÒÇÎÕÔÁ (ÓÏÈÒÁÎÅÎÁ × %s)"
+
+#: src/lang.c:62
+#, c-format
+msgid	"%s=article, %s=thread, %s=hot, %s=pattern, %s=tagged articles, %s=quit: "
+msgstr	"%s=ÓÔÁÔØÑ, %s=ÄÉÓË., %s=hot, %s=ÛÁÂÌÏÎ, %s=ÏÔÍÅÞÅÎÎÙÅ ÓÔÁÔØÉ, %s=×ÙÈÏÄ: "
+
+#: src/lang.c:63
+msgid	"Article unavailable"
+msgstr	"óÔÁÔØÑ ÎÅÄÏÓÔÕÐÎÁ"
+
+#: src/lang.c:64
+msgid	"Article undeleted."
+msgstr	"óÔÁÔØÑ ×ÏÓÓÔÁÎÏ×ÌÅÎÁ."
+
+#: src/lang.c:66
+msgid	"articles"
+msgstr	"ÓÔÁÔØÉ"
+
+#: src/lang.c:67
+msgid	"This is a repost of the following article:"
+msgstr	"üÔÏ ÐÅÒÅÏÔÐÒÁ×ÌÅÎÉÅ ÓÌÅÄ. ÓÔÁÔØÉ:"
+
+#: src/lang.c:68
+msgid	"article"
+msgstr	"ÓÔÁÔØÑ"
+
+#: src/lang.c:69
+msgid	"Article"
+msgstr	"óÔÁÔØÑ"
+
+#: src/lang.c:70
+#, c-format
+msgid	"-- %d %s mailed --"
+msgstr	"-- %d %s ÐÏÓÌÁÎÏ ÐÏ e-mail --"
+
+#: src/lang.c:71
+#, c-format
+msgid	" at %s"
+msgstr	" × %s"
+
+#: src/lang.c:72
+#, c-format
+msgid	"%*s[-- %s/%s, encoding %s%s%s, %d lines%s%s --]\n"
+msgstr	"%*s[-- %s/%s, ËÏÄÉÒÏ×ËÁ %s%s%s, %d ÓÔÒÏË%s%s --]\n"
+
+#: src/lang.c:73
+msgid	", charset: "
+msgstr	", ËÏÄÉÒÏ×ËÁ: "
+
+#: src/lang.c:74
+#, c-format
+msgid	"%*s[-- Description: %s --]\n"
+msgstr	"%*s[-- ïÐÉÓÁÎÉÅ: %s --]\n"
+
+#: src/lang.c:75
+#, c-format
+msgid	"%d Authentication failed"
+msgstr	"%d á×ÔÏÒÉÚÁÃÉÑ ÎÅ ÕÄÁÌÁÓØ"
+
+#: src/lang.c:76
+msgid	"Server expects authentication.\n"
+msgstr	"óÅÒ×ÅÒ ÏÖÉÄÁÅÔ Á×ÔÏÒÉÚÁÃÉÀ. \n"
+
+#: src/lang.c:77
+msgid	"    Please enter password: "
+msgstr	"    ðÏÖÁÌÕÊÓÔÁ ××ÅÄÉÔÅ ÐÁÒÏÌØ: "
+
+#: src/lang.c:78
+msgid	"    Please enter username: "
+msgstr	"    ðÏÖÁÌÕÊÓÔÁ ××ÅÄÉÔÅ ÉÍÑ: "
+
+#: src/lang.c:79
+#, c-format
+msgid	"Author search backwards [%s]> "
+msgstr	"ðÏÉÓË ÐÏ á×ÔÏÒÕ ÎÁÚÁÄ [%s]> "
+
+#: src/lang.c:80
+#, c-format
+msgid	"Author search forwards [%s]> "
+msgstr	"ðÏÉÓË ÐÏ á×ÔÏÒÕ ×ÐÅÒÅÄ [%s]> "
+
+#: src/lang.c:81
+#, c-format
+msgid	"Authorized for user: %s\n"
+msgstr	"á×ÔÏÒÉÚÉÒÏ×ÁÎÏ ÄÌÑ ÐÏÌØÚÏ×ÁÔÅÌÑ: %s\n"
+
+#: src/lang.c:82
+#, c-format
+msgid	"Authorization failed for user: %s\n"
+msgstr	"á×ÔÏÒÉÚÁÃÉÑ ÎÅ ÕÄÁÌÁÓØ ÄÌÑ ÐÏÌØÚÏ×ÁÔÅÌÑ: %s\n"
+
+#: src/lang.c:83
+#, c-format
+msgid	"\n"
+	"Autosubscribed to %s"
+msgstr	"\n"
+	"ðÏÄÐÉÓÁÎ Á×ÔÏÍÁÔÉÞÅÓËÉ ÎÁ %s"
+
+#: src/lang.c:84
+msgid	"Autosubscribing groups...\n"
+msgstr	"á×ÔÏÍÁÔ. ÐÏÄÐÉÓËÁ ÎÁ ÇÒÕÐÐÙ...\n"
+
+#: src/lang.c:85
+#, c-format
+msgid	"Autoselecting articles (use '%s' to see all unread) ..."
+msgstr	"á×ÔÏÍÁÔ. ×ÙÂÏÒ ÓÔÁÔÅÊ (ÉÓÐÏÌØÚÕÊÔÅ '%s' ÄÌÑ ÐÒÏÓÍÏÔÒÁ ÎÅÐÒÏÞÉÔÁÎÎÙÈ) ..."
+
+#: src/lang.c:87
+#, c-format
+msgid	"Active file corrupt - %s"
+msgstr	"áËÔÉ×ÎÙÊ ÆÁÊÌ ÐÏ×ÒÅÖÄÅÎ - %s"
+
+#: src/lang.c:88
+#, c-format
+msgid	"Article to be posted resulted in errors/warnings. %s=quit, %s=Menu, %s=edit: "
+msgstr	"óÔÁÔØÑ Ó ÏÛÉÂËÁÍÉ/ÐÒÅÄÕÐÒÅÖÄÅÎÉÑÍÉ. %s=×ÙÈÏÄ, %s=íÅÎÀ, %s=ÒÅÄÁËÔ.: "
+
+#: src/lang.c:89
+#, c-format
+msgid	"Unrecognized attribute: %s"
+msgstr	"îÅÒÁÓÐÏÚÎÁÎÎÙÊ ÁÔÒÉÂÕÔ: %s"
+
+#: src/lang.c:90
+#, c-format
+msgid	"Bad command. Type '%s' for help."
+msgstr	"ïÛÉÂÏÞÎÁÑ ËÏÍÁÎÄÁ. îÁÂÅÒÉÔÅ '%s' ÄÌÑ ÐÏÍÏÝÉ."
+
+#: src/lang.c:92
+msgid	"Base article"
+msgstr	"ïÓÎÏ×ÎÁÑ ÓÔÁÔØÑ"
+
+#: src/lang.c:93
+msgid	"Base article range"
+msgstr	"äÉÁÐÁÚÏÎ ÏÓÎ. ÓÔÁÔØÉ"
+
+#: src/lang.c:94
+#, c-format
+msgid	"%s: Updating of index files not supported\n"
+msgstr	"%s: ïÂÎÏ×ÌÅÎÉÅ ÉÎÄÅËÓÁ ÎÅÐÏÄÄÅÒÖÉ×ÁÅÍÙÈ ÆÁÊÌÏ×\n"
+
+#: src/lang.c:95
+msgid	"*** Beginning of article ***"
+msgstr	"*** îÁÞÁÌÏ ÓÔÁÔØÉ ***"
+
+#: src/lang.c:97
+#, c-format
+msgid	"Cancel (delete) or supersede (overwrite) article [%%s]? (%s/%s/%s): "
+msgstr	"ïÔÍÅÎÉÔØ (ÕÄÁÌÉÔØ) ÉÌÉ ÚÁÍÅÎÉÔØ (ÐÅÒÅÐÉÓÁÔØ) ÓÔÁÔØÀ [%%s]? (%s/%s/%s): "
+
+#: src/lang.c:98
+msgid	"Cancelling article..."
+msgstr	"ïÔÍÅÎÁ ÓÔÁÔØÉ..."
+
+#: src/lang.c:100
+#, c-format
+msgid	"Cannot create %s"
+msgstr	"îÅ ÍÏÇÕ ÓÏÚÄÁÔØ %s"
+
+#: src/lang.c:101
+#, c-format
+msgid	"Can't find base article %d"
+msgstr	"îÅ ÍÏÇÕ ÎÁÊÔÉ ÏÓÎ. ÓÔÁÔØÀ %d"
+
+#: src/lang.c:102
+#, c-format
+msgid	"Can't open %s"
+msgstr	"îÅ ÍÏÇÕ ÏÔËÒÙÔØ %s"
+
+#: src/lang.c:103
+#, c-format
+msgid	"Couldn't open %s for saving"
+msgstr	"îÅ ÍÏÇÕ ÏÔËÒÙÔØ %s ÄÌÑ ÚÁÐÉÓÉ"
+
+#: src/lang.c:104
+msgid	"*** Posting not allowed ***"
+msgstr	"*** ïÔÐÒÁ×ËÁ ÚÁÐÒÅÝÅÎÁ ***"
+
+#: src/lang.c:105
+#, c-format
+msgid	"Posting is not allowed to %s"
+msgstr	"ïÔÐÒÁ×ËÁ ÚÁÐÒÅÝÅÎÁ ÎÁ %s"
+
+#: src/lang.c:106
+#, c-format
+msgid	"Can't retrieve %s"
+msgstr	"îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ %s"
+
+#: src/lang.c:107
+#, c-format
+msgid	"%s is a directory"
+msgstr	"%s - ÄÉÒÅËÔÏÒÉÑ"
+
+#: src/lang.c:108
+msgid	"Catchup"
+msgstr	"úÁÈ×ÁÔ"
+
+#: src/lang.c:109
+#, c-format
+msgid	"Catchup %s..."
+msgstr	"úÁÈ×ÁÔ %s..."
+
+#: src/lang.c:110
+msgid	"Catchup all groups entered during this session?"
+msgstr	"úÁÈ×ÁÔÉÔØ ×ÓÅ ÇÒÕÐÐÙ ÐÏÓÅÝÅÎÎÙÅ × ÜÔÏÊ ÓÅÓÓÉÉ?"
+
+#: src/lang.c:111
+msgid	"You have tagged articles in this group - catchup anyway?"
+msgstr	"÷Ù ÐÏÍÅÔÉÌÉ ÓÔÁÔØÉ × ÇÒÕÐÐÅ - ÚÁÈ×ÁÔÉÔØ ÎÅÓÍÏÔÒÑ ÎÁ ÜÔÏ?"
+
+#: src/lang.c:112
+#, c-format
+msgid	"%s %d %s in %lu seconds\n"
+msgstr	"%s %d %s × %lu ÓÅËÕÎÄ\n"
+
+#: src/lang.c:113
+msgid	"Caughtup"
+msgstr	"úÁÈ×ÁÞÅÎÏ"
+
+#: src/lang.c:114
+msgid	"Check Prepared Article"
+msgstr	"ðÒÏ×ÅÒÉÔØ ÐÒÉÇÏÔÏ×ÌÅÎÎÕÀ ÓÔÁÔØÀ"
+
+#: src/lang.c:115
+msgid	"Checking for new groups... "
+msgstr	"ðÏÉÓË ÎÏ×ÙÈ ÇÒÕÐÐ... "
+
+#: src/lang.c:116
+msgid	"Checking for news..."
+msgstr	"ðÒÏ×ÅÒËÁ ÎÏ×ÏÓÔÅÊ..."
+
+#: src/lang.c:117
+#, c-format
+msgid	"Post-process %s=no, %s=yes, %s=shar, %s=quit: "
+msgstr	""
+
+#: src/lang.c:119
+msgid	"ANSI color disabled"
+msgstr	"ANSI Ã×ÅÔÁ ×ËÌÀÞÉÔØ"
+
+#: src/lang.c:120
+msgid	"ANSI color enabled"
+msgstr	"ANSI Ã×ÅÔÁ ×ÙËÌÀÞÉÔØ"
+
+#: src/lang.c:122
+#, c-format
+msgid	"Command failed: %s"
+msgstr	"ïÛÉÂËÁ ÐÒÉ ÉÓÐÏÌÎÅÎÉÉ: %s"
+
+#: src/lang.c:123
+msgid	"Mark not selected articles read?"
+msgstr	"ðÏÍÅÔÉÔØ ÎÅÏÔÍÅÞÅÎÎÙÅ ÓÔÁÔØÉ ËÁË ÐÒÏÞÉÔÁÎÎÙÅ?"
+
+#: src/lang.c:124
+#, c-format
+msgid	"Connecting to %s..."
+msgstr	"óÏÅÄÉÎÑÅÍÓÑ Ó %s..."
+
+#: src/lang.c:125
+msgid	"<CR>"
+msgstr	""
+
+#: src/lang.c:126
+msgid	"Creating active file for saved groups...\n"
+msgstr	"óÏÚÄÁÎÉÅ active ÆÁÊÌÁ ÄÌÑ ÓÏÈÒ. ÇÒÕÐÐ...\n"
+
+#: src/lang.c:127
+msgid	"Creating newsrc file...\n"
+msgstr	"óÏÚÄÁÎÉÅ newsrc ÆÁÊÌÁ...\n"
+
+#: src/lang.c:129 src/lang.c:1150
+msgid	"Default"
+msgstr	"ðÏ ÕÍÏÌÞÁÎÉÀ"
+
+#: src/lang.c:130
+msgid	"Delete saved files that have been post processed?"
+msgstr	"õÄÁÌÉÔØ ÓÏÈÒÁÎÅÎÎÙÅ ÏÂÒÁÂÏÔÁÎÎÙÅ ÆÁÊÌÙ?"
+
+#: src/lang.c:131
+msgid	"Deleting temporary files..."
+msgstr	"õÄÁÌÅÎÉÅ ×ÒÅÍÅÎÎÙÈ ÆÁÊÌÏ×..."
+
+#: src/lang.c:133
+msgid	"*** End of article ***"
+msgstr	"*** ëÏÎÅÃ ÓÔÁÔØÉ ***"
+
+#: src/lang.c:134
+msgid	"*** End of articles ***"
+msgstr	"*** ëÏÎÅÃ ÓÔÁÔÅÊ ***"
+
+#: src/lang.c:135
+msgid	"*** End of groups ***"
+msgstr	"*** ëÏÎÅÃ ÇÒÕÐÐ ***"
+
+#: src/lang.c:136
+msgid	"*** End of thread ***"
+msgstr	"*** ëÏÎÅÃ ÄÉÓËÕÓÓÉÉ ***"
+
+#: src/lang.c:137
+msgid	"Enter limit of articles to get> "
+msgstr	"÷×ÅÄÉÔÅ ÐÒÅÄÅÌ ÐÏÌÕÞÁÅÍÙÈ ÓÔÁÔÅÊ> "
+
+#: src/lang.c:138
+msgid	"Enter Message-ID to go to> "
+msgstr	"÷×ÅÄÉÔÅ Message-ID ÄÌÑ ÐÅÒÅÈÏÄÁ> "
+
+#: src/lang.c:139
+msgid	" and enter next unread thread"
+msgstr	" É ××ÅÄÉÔÅ ÓÌÅÄ. ÎÅÐÒÏÞÉÔÁÎÎÕÀ ÄÉÓËÕÓÓÉÀ"
+
+#: src/lang.c:140
+msgid	" and enter next unread group"
+msgstr	" É ××ÅÄÉÔÅ ÓÌÅÄ. ÎÅÐÒÏÞÉÔÁÎÎÕÀ ÇÒÕÐÐÕ"
+
+#: src/lang.c:141
+msgid	"Enter option number> "
+msgstr	"÷×ÅÄÉÔÅ ÎÅÏÂÑÚÁÔ. ÎÏÍÅÒ> "
+
+#: src/lang.c:142
+#, c-format
+msgid	"Enter range [%s]> "
+msgstr	"÷×ÅÄÉÔÅ ÄÉÁÐÁÚÏÎ [%s]> "
+
+#: src/lang.c:143
+msgid	"\n"
+	"Warning: Approved: header used.\n"
+msgstr	"\n"
+	"ðÒÅÄÕÐÒÅÖÄÅÎÉÅ: Approved: header ÉÓÐÏÌØÚÏ×ÁÎ.\n"
+
+#: src/lang.c:145
+msgid	"\n"
+	"Error: Bad address in Approved: header.\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: îÅ×ÅÒÎÙÊ ÁÄÒÅÓ × Approved: header.\n"
+
+#: src/lang.c:146
+msgid	"\n"
+	"Error: Bad address in From: header.\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: îÅ×ÅÒÎÙÊ ÁÄÒÅÓ × From: header.\n"
+
+#: src/lang.c:147
+msgid	"\n"
+	"Error: Bad address in Reply-To: header.\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: îÅ×ÅÒÎÙÊ ÁÄÒÅÓ × Reply-To: header.\n"
+
+#: src/lang.c:148
+msgid	"\n"
+	"Error: Bad FQDN in Message-ID: header.\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: îÅ×ÅÒÎÙÊ FQDN × Message-ID: header.\n"
+
+#: src/lang.c:149
+#, c-format
+msgid	"Can't unlock %s"
+msgstr	"îÅ ÍÏÇÕ ÒÁÚÂÌÏËÉÒÏ×ÁÔØ %s"
+
+#: src/lang.c:151
+#, c-format
+msgid	"Corrupted file %s"
+msgstr	"ðÏ×ÒÅÖÄÅÎÎÙÊ ÆÁÊÌ %s"
+
+#: src/lang.c:152
+#, c-format
+msgid	"Couldn't dotlock %s - article not appended!"
+msgstr	""
+
+#: src/lang.c:153
+#, c-format
+msgid	"Couldn't lock %s - article not appended!"
+msgstr	"îÅ ÍÏÇÕ ÚÁÂÌÏËÉÒÏ×ÁÔØ %s - ÓÔÁÔØÑ ÎÅ ÐÒÉËÒÅÐÌÅÎÁ!"
+
+#: src/lang.c:155
+msgid	"Internal error in GNKSA routine - send bug report.\n"
+msgstr	"÷ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ × ÆÕÎËÃÉÉ GNKSA - ÐÏÛÌÉÔÅ bugreport.\n"
+
+#: src/lang.c:156
+msgid	"Left angle bracket missing in route address.\n"
+msgstr	"ìÅ×ÁÑ ÕÇÌÏ×ÁÑ ÓËÏÂËÁ ÐÒÏÐÕÝÅÎÁ × ÁÄÒÅÓÅ.\n"
+
+#: src/lang.c:157
+msgid	"Left parenthesis missing in old-style address.\n"
+msgstr	"ìÅ×ÁÑ ËÒÕÇÌÁÑ ÓËÏÂËÁ ÐÒÏÐÕÝÅÎÁ × ÁÄÒÅÓÅ ÓÔÁÒÏÇÏ ÓÔÉÌÑ.\n"
+
+#: src/lang.c:158
+msgid	"Right parenthesis missing in old-style address.\n"
+msgstr	"ðÒÁ×ÁÑ ËÒÕÇÌÁÑ ÓËÏÂËÁ ÐÒÏÐÕÝÅÎÁ × ÁÄÒÅÓÅ ÓÔÁÒÏÇÏ ÓÔÉÌÑ.\n"
+
+#: src/lang.c:159
+msgid	"At-sign missing in mail address.\n"
+msgstr	"úÎÁË AT ÐÒÏÐÕÝÅÎ × ÁÄÒÅÓÅ e-mail.\n"
+
+#: src/lang.c:160
+msgid	"Single component FQDN is not allowed. Add your domain.\n"
+msgstr	"åÄÉÎÓÔ×. ËÏÍÐÏÎÅÎÔ FQDN ÎÅÄÏÐÕÓÔÉÍ. äÏÂÁ×ÔÅ ÄÏÍÅÎ.\n"
+
+#: src/lang.c:161
+msgid	"Invalid domain. Send bug report if your top level domain really exists.\n"
+	"Use .invalid as top level domain for munged addresses.\n"
+msgstr	"îÅÐÒÁ×ÉÌØÎÙÊ ÄÏÍÅÎ. ðÏÛÌÉÔÅ bugreport ÅÓÌÉ ÄÏÍÅÎ ÓÕÝÅÓÔ×ÕÅÔ.\n"
+	"éÓÐÏÌØÚÕÊÔÅ .invalid ËÁË ÄÏÍÅÎ 1 ÕÒÏ×ÎÑ ÄÌÑ ÉÓÐÏÒÞÅÎÎÙÈ ÁÄÒÅÓÏ×.\n"
+
+#: src/lang.c:162
+msgid	"Illegal domain. Send bug report if your top level domain really exists.\n"
+	"Use .invalid as top level domain for munged addresses.\n"
+msgstr	"îÅÄÏÐÕÓÔÉÍÙÊ ÄÏÍÅÎ. ðÏÛÌÉÔÅ bugreport ÅÓÌÉ ÄÏÍÅÎ ÓÕÝÅÓÔ×ÕÅÔ.\n"
+	"éÓÐÏÌØÚÕÊÔÅ .invalid ËÁË ÄÏÍÅÎ 1 ÕÒÏ×ÎÑ ÄÌÑ ÉÓÐÏÒÞÅÎÎÙÈ ÁÄÒÅÓÏ×.\n"
+
+#: src/lang.c:163
+msgid	"Unknown domain. Send bug report if your top level domain really exists.\n"
+	"Use .invalid as top level domain for munged addresses.\n"
+msgstr	"îÅÉÚ×ÅÓÔÎÙÊ ÄÏÍÅÎ. ðÏÛÌÉÔÅ bugreport ÅÓÌÉ ÄÏÍÅÎ ÓÕÝÅÓÔ×ÕÅÔ.\n"
+	"éÓÐÏÌØÚÕÊÔÅ .invalid ËÁË ÄÏÍÅÎ 1 ÕÒÏ×ÎÑ ÄÌÑ ÉÓÐÏÒÞÅÎÎÙÈ ÁÄÒÅÓÏ×.\n"
+
+#: src/lang.c:164
+msgid	"Illegal character in FQDN.\n"
+msgstr	"îÅÄÏÐÕÓÔÉÍÙÊ ÚÎÁË × FQDN.\n"
+
+#: src/lang.c:165
+msgid	"Zero length FQDN component not allowed.\n"
+msgstr	"îÕÌÅ×ÁÑ ÄÌÉÎÁ ËÏÍÐÏÎÅÎÔÁ FQDN ÎÅÄÏÐÕÓÔÉÍÁ.\n"
+
+#: src/lang.c:166
+msgid	"FQDN component exceeds maximum allowed length (63 chars).\n"
+msgstr	"ëÏÍÐÏÎÅÎÔ FQDN ÐÒÅ×ÙÛÁÅÔ ÍÁËÓ. ÄÏÐÕÓÔÉÍÕÀ ÄÌÉÎÕ (63 ÚÎÁËÁ).\n"
+
+#: src/lang.c:167
+msgid	"FQDN component may not start or end with hyphen.\n"
+msgstr	"ëÏÍÐÏÎÅÎÔ FQDN ÎÅ ÍÏÖÅÔ ÎÁÞÉÎÁÔØÓÑ ÉÌÉ ÚÁËÁÎÞÉ×ÁÔØÓÑ ÄÅÆÉÓÏÍ.\n"
+
+#: src/lang.c:168
+msgid	"FQDN component may not start with digit.\n"
+msgstr	"ëÏÍÐÏÎÅÎÔ FQDN ÎÅ ÍÏÖÅÔ ÎÁÞÉÎÁÔØÓÑ Ó ÃÉÆÒÙ.\n"
+
+#: src/lang.c:169
+msgid	"Domain literal has impossible numeric value.\n"
+msgstr	"÷ ÚÎÁËÅ ÄÏÍÅÎÁ ÎÅÄÏÐÕÓÔÉÍÙÊ ÃÉÆÒ. ÚÎÁË.\n"
+
+#: src/lang.c:170
+msgid	"Domain literal is for private use only and not allowed for global use.\n"
+msgstr	"úÎÁË ÄÏÍÅÎÁ ÔÏÌØËÏ ÄÌÑ ÞÁÓÔÎÏÇÏ ÉÓÐÏÌØÚÏ×ÁÎÉÑ É ÎÅÄÏÐÕÓÔÉÍ.\n"
+
+#: src/lang.c:171
+msgid	"Right bracket missing in domain literal.\n"
+msgstr	"ðÒÁ×ÁÑ ÓËÏÂËÁ ÐÒÏÐÕÝÅÎÁ × ÚÎÁËÅ ÄÏÍÅÎÁ.\n"
+
+#: src/lang.c:172
+msgid	"Missing localpart of mail address.\n"
+msgstr	"ðÒÏÐÕÝÅÎÁ ÌÏËÁÌØÎÁÑ ÞÁÓÔØ e-mail.\n"
+
+#: src/lang.c:173
+msgid	"Illegal character in localpart of mail address.\n"
+msgstr	"îÅÄÏÐÕÓÔÉÍÙÊ ÚÎÁË × ÌÏËÁÌØÎÏÊ ÞÁÓÔÉ e-mail.\n"
+
+#: src/lang.c:174
+msgid	"Zero length localpart component not allowed.\n"
+msgstr	"îÕÌÅ×ÁÑ ÄÌÉÎÁ ÌÏËÁÌØÎÏÊ ÞÁÓÔÉ e-mail ÎÅÄÏÐÕÓÔÉÍÁ.\n"
+
+#: src/lang.c:175
+msgid	"Illegal character in realname.\n"
+	"Unquoted words may not contain '!()<>@,;:\\.[]' in route addresses.\n"
+msgstr	"îÅÄÏÐÕÓÔÉÍÙÊ ÚÎÁË × realname.\n"
+	"óÌÏ×Á ÂÅÚ ËÁ×ÙÞÅË ÎÅ ÍÏÇÕÔ ÓÏÄÅÒÖÁÔØ '!()<>@,;:\\.[]' × ÁÄÒÅÓÅ ÏÔÐÒÁ×ÌÅÎÉÑ.\n"
+
+#: src/lang.c:176
+msgid	"Illegal character in realname.\n"
+	"Quoted words may not contain '()<>\\'.\n"
+msgstr	"îÅÄÏÐÕÓÔÉÍÙÊ ÚÎÁË × realname.\n"
+	"óÌÏ×Á × ËÁ×ÙÞËÁÈ ÎÅ ÍÏÇÕÔ ÓÏÄÅÒÖÁÔØ '()<>\\'.\n"
+
+#: src/lang.c:177
+msgid	"Illegal character in realname.\n"
+	"Encoded words may not contain '!()<>@,;:\"\\.[]/=' in parameter.\n"
+msgstr	"îÅÄÏÐÕÓÔÉÍÙÊ ÚÎÁË × realname.\n"
+	"ëÏÄÉÒÏ×ÁÎÎÙÅ ÓÌÏ×Á ÎÅ ÍÏÇÕÔ ÓÏÄÅÒÖÁÔØ '!()<>@,;:\"\\.[]/=' × ÐÁÒÁÍÅÔÒÅ.\n"
+
+#: src/lang.c:178
+msgid	"Bad syntax in encoded word used in realname.\n"
+msgstr	"îÅ×ÅÒÎÙÊ ÓÉÎÔÁËÓÉÓ × ËÏÄÉÒÏ×ÁÎÎÏÍ ÓÌÏ×Å, ÉÓÐÏÌØÚÏ×ÁÎÎÏÍ × realname.\n"
+
+#: src/lang.c:179
+msgid	"Illegal character in realname.\n"
+	"Unquoted words may not contain '()<>\\' in old-style addresses.\n"
+msgstr	"îÅÄÏÐÕÓÔÉÍÙÊ ÚÎÁË × realname.\n"
+	"óÌÏ×Á ÂÅÚ ËÁ×ÙÞÅË ÎÅ ÍÏÇÕÔ ÓÏÄÅÒÖÁÔØ '()<>\\' × ÁÄÒÅÓÁÈ ÓÔÁÒÏÇÏ ÓÔÉÌÑ.\n"
+
+#: src/lang.c:180
+msgid	"Illegal character in realname.\n"
+	"Control characters and unencoded 8bit characters > 127 are not allowed.\n"
+msgstr	"îÅÄÏÐÕÓÔÉÍÙÊ ÚÎÁË × realname.\n"
+	"õÐÒÁ×ÌÑÀÝÉÅ ÓÉÍ×ÏÌÙ É ÎÅËÏÄ. 8-ÂÉÔÎÙÅ ÓÉÍ×. > 127 ÎÅÄÏÐÕÓÔÉÍÙ.\n"
+
+#: src/lang.c:181
+msgid	"\n"
+	"Error: No blank line found after header.\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: îÅ ÎÁÊÄÅÎÁ ÐÕÓÔÁÑ ÓÔÒÏËÁ ÐÏÓÌÅ ÚÁÇÏÌÏ×ËÁ.\n"
+
+#. TODO: fixme, US-ASCII is not the only 7bit charset we know about
+#: src/lang.c:183
+msgid	"\n"
+	"Error: Posting contains non-ASCII characters but MM_CHARSET is set to\n"
+	"       US-ASCII  - please change this setting to a suitable value for\n"
+	"       your language  using the  M)enu of configurable  options or by\n"
+	"       editing tinrc.\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: óÏÏÂÝÅÎÉÅ ÓÏÄÅÒÖÉÔ ÎÅ-ASCII ÓÉÍ×ÏÌÙ ÎÏ MM_CHARSET ÕÓÔÁÎÏ×ÌÅÎ\n"
+	"        US-ASCII - ÐÏÖÁÌÕÊÓÔÁ ÓÍÅÎÉÔÅ ÚÎÁÞÅÎÉÅ ÎÁ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÅ\n"
+	"        ×ÁÛÅÍÕ ÑÚÙËÕ, ÉÓÐÏÌØÚÕÑ M)ÍÅÎÀ ËÏÎÆÉÇÕÒÉÒÕÅÍÙÈ ÚÎÁÞÅÎÉÊ ÉÌÉ\n"
+	"        ÏÔÒÅÄÁËÔÉÒÕÊÔÅ tinrc.\n"
+
+#: src/lang.c:188
+msgid	"\n"
+	"Error: Posting contains  non-ASCII characters  but the  MIME encoding\n"
+	"       for news  messages  is set  to \"7bit\"  -  please change this\n"
+	"       setting to \"8bit\" or \"quoted-printable\" depending  on what\n"
+	"       is more common  in your part  of the world.  This can  be done\n"
+	"       using the M)enu of configurable options or by editing tinrc.\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: óÏÏÂÝÅÎÉÅ ÓÏÄÅÒÖÉÔ ÎÅ-ASCII ÓÉÍ×ÏÌÙ ÎÏ ËÏÄÉÒÏ×ËÁ MIME ÕÓÔÁÎÏ×ÌÅÎÁ\n"
+	"        × \"7bit\" - ÐÏÖÁÌÕÊÓÔÁ ÓÍÅÎÉÔÅ ÚÎÁÞÅÎÉÅ ÎÁ \"8bit\" ÉÌÉ\n"
+	"        \"quoted-printable\" × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÷ÁÛÅÇÏ ÕÄÏÂÓÔ×Á. éÓÐÏÌØÚÕÊÔÅ\n"
+	"        M)ÍÅÎÀ  ËÏÎÆÉÇÕÒÉÒÕÅÍÙÈ ÚÎÁÞÅÎÉÊ ÉÌÉ ÏÔÒÅÄÁËÔÉÒÕÊÔÅ tinrc.\n"
+
+#: src/lang.c:194
+msgid	"\n"
+	"Error: Article starts with blank line instead of header\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: óÏÏÂÝÅÎÉÅ ÎÁÞÉÎÁÅÔÓÑ Ó ÐÕÓÔÏÊ ÓÔÒÏËÉ ×ÍÅÓÔÏ ÚÁÇÏÌÏ×ËÁ\n"
+
+#: src/lang.c:195
+#, c-format
+msgid	"\n"
+	"Error: Header on line %d does not have a colon after the header name:\n"
+	"%s\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: úÁÇÏÌÏ×ÏË × ÓÔÒÏËÅ %d ÎÅ ÉÍÅÅÔ Ä×ÏÅÔÏÞÉÑ ÐÏÓÌÅ ÉÍÅÎÉ:\n"
+	"%s\n"
+
+#: src/lang.c:196
+#, c-format
+msgid	"\n"
+	"Error: The \"%s:\" line is empty.\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: óÔÒÏËÁ  \"%s:\" ÐÕÓÔÁÑ.\n"
+
+#: src/lang.c:197
+#, c-format
+msgid	"\n"
+	"Error: The \"%s:\" line is missing from the article header.\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: óÔÒÏËÁ  \"%s:\" ÐÒÏÐÕÝÅÎÁ × ÚÁÌÏ×ËÅ ÓÔÁÔØÉ.\n"
+
+#: src/lang.c:198
+#, c-format
+msgid	"\n"
+	"Error: Header on line %d does not have a space after the colon:\n"
+	"%s\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: úÁÇÏÌÏ×ÏË × ÓÔÒÏËÅ %d ÎÅ ÉÍÅÅÔ ÐÒÏÂÅÌÁ ÐÏÓÌÅ Ä×ÏÅÔÏÞÉÑ:\n"
+	"%s\n"
+
+#: src/lang.c:199
+#, c-format
+msgid	"\n"
+	"Error: There are multiple (%d) \"%s:\" lines in the header.\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: îÅÓËÏÌØËÏ ÓÔÒÏË (%d) \"%s:\" × ÚÁÇÏÌÏ×ËÅ.\n"
+
+#: src/lang.c:200
+#, c-format
+msgid	"Insecure permissions of %s (%o)"
+msgstr	"îÅÂÅÚÏÐÁÓÎÙÅ ÐÒÁ×Á ÄÏÓÔÕÐÁ %s (%o)"
+
+#: src/lang.c:201
+#, c-format
+msgid	"Invalid response to GROUP command, %s"
+msgstr	"îÅÄÏÐÕÓÔÉÍÙÊ ÏÔ×ÅÔ ÎÁ ËÏÍÁÎÄÕ GROUP, %s"
+
+#: src/lang.c:203
+#, c-format
+msgid	"MIME parse error: Unexpected end of %s/%s article"
+msgstr	"ïÛÉÂËÁ ÏÂÒÁÂÏÔËÉ MIME: îÅÏÖÉÄÁÎÎÏÅ ÏËÏÎÞÁÎÉÅ ÓÔÁÔØÉ %s/%s"
+
+#: src/lang.c:204
+msgid	"MIME parse error: Start boundary whilst reading headers"
+msgstr	"ïÛÉÂËÁ ÏÂÒÁÂÏÔËÉ MIME: îÁÞÁÌÏ ÇÒÁÎÉÃÙ × ÚÁÇÏÌÏ×ËÅ"
+
+#: src/lang.c:205
+msgid	"Can't get a (fully-qualified) domain-name!"
+msgstr	"îÅ ÕÄÁÅÔÓÑ ÐÏÌÕÞÉÔØ (fully-qualified) ÄÏÍÅÎ!"
+
+#: src/lang.c:206
+#, c-format
+msgid	"No permissions to go into %s\n"
+msgstr	"îÅÔ ÄÏÓÔÕÐÁ ÄÌÑ  %s\n"
+
+#: src/lang.c:207
+msgid	"\n"
+	"Error: From: line missing.\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: From: ÐÒÏÐÕÝÅÎÁ.\n"
+
+#: src/lang.c:208
+#, c-format
+msgid	"No read permissions for %s\n"
+msgstr	"îÅÔ ÐÒÁ× ÄÏÓÔÕÐÁ ÄÌÑ ÞÔÅÎÉÑ ÄÌÑ %s\n"
+
+#: src/lang.c:209
+#, c-format
+msgid	"File %s does not exist\n"
+msgstr	"æÁÊÌ %s ÎÅ ÓÕÝÅÓÔ×ÕÅÔ\n"
+
+#: src/lang.c:210
+#, c-format
+msgid	"No write permissions for %s\n"
+msgstr	"îÅÔ ÐÒÁ× ÄÏÓÔÕÐÁ ÄÌÑ ÚÁÐÉÓÉ ÄÌÑ %s\n"
+
+#: src/lang.c:211
+msgid	"Can't get user information (/etc/passwd missing?)"
+msgstr	"îÅ ÕÄÁÅÔÓÑ ÐÏÌÕÞÉÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ÐÏÌØÚÏ×ÁÔÅÌÅ (/etc/passwd ÎÅ ÓÕÝ. ?)"
+
+#: src/lang.c:212
+msgid	"errors"
+msgstr	"ÏÛÉÂËÉ"
+
+#: src/lang.c:213
+#, c-format
+msgid	"\n"
+	"Error on line %d: \"Sender:\" header not allowed (it will be added for you)\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ × ÓÔÒÏËÅ %d: \"Sender:\" ÚÁÇÏÌÏ×ÏË ÎÅÄÏÐÕÓÔÉÍ (ÂÕÄÅÔ ÄÏÂÁ×ÌÅÎ ÓÁÍ)\n"
+
+#: src/lang.c:214
+#, c-format
+msgid	"Server has non of the groups listed in %s"
+msgstr	"îÁ ÓÅÒ×ÅÒÅ ÎÅÔ ÎÉ ÏÄÎÏÊ ÇÒÕÐÐÙ ÕËÁÚÁÎÎÙÈ × %s"
+
+#: src/lang.c:215
+msgid	"error"
+msgstr	"ÏÛÉÂËÁ"
+
+#: src/lang.c:216
+msgid	"Unknown display level"
+msgstr	"îÅÉÚ×ÅÓÔÎÙÊ ÕÒÏ×ÅÎØ ÄÉÓÐÌÅÑ"
+
+#: src/lang.c:217
+msgid	"<ESC>"
+msgstr	""
+
+#: src/lang.c:218
+msgid	"Exiting..."
+msgstr	"÷ÙÈÏÄ..."
+
+#: src/lang.c:219
+msgid	"leaving external mail-reader"
+msgstr	"ÏÓÔÁ×ÌÑÅÍ ×ÎÅÛÎÉÊ e-mail ËÌÉÅÎÔ"
+
+#: src/lang.c:220
+#, c-format
+msgid	"Extracting %s..."
+msgstr	"éÚ×ÌÅËÁÅÍ %s..."
+
+#: src/lang.c:222
+#, c-format
+msgid	"Error writing %s file. Filesystem full? File reset to previous state."
+msgstr	"ïÛÉÂËÁ ÚÁÐÉÓÉ %s ÆÁÊÌÁ. îÅÔ ÍÅÓÔÁ? æÁÊÌ ÓÂÒÏÛÅÎ × ÐÒÅÄÙÄ. ÓÏÓÔÏÑÎÉÅ."
+
+#: src/lang.c:223
+#, c-format
+msgid	"Error making backup of %s file. Filesystem full?"
+msgstr	"ïÛÉÂËÁ backup %s ÆÁÊÌÁ. îÅÔ ÍÅÓÔÁ?"
+
+#: src/lang.c:224
+#, c-format
+msgid	"Filtering global rules (%d/%d)..."
+msgstr	"æÉÌØÔÒÁÃÉÀ ÇÌÏÂÁÌØÎÙÈ ÐÒÁ×ÉÌ (%d/%d)..."
+
+#: src/lang.c:225
+msgid	"Rule created by: "
+msgstr	"ðÒÁ×ÉÌÏ ÓÏÚÄÁÎÏ: "
+
+#: src/lang.c:226
+#, c-format
+msgid	"Enter pattern [%s]> "
+msgstr	"÷×ÅÄÉÔÅ ÛÁÂÌÏÎ [%s]> "
+
+#: src/lang.c:227
+#, c-format
+msgid	"\n"
+	"You requested followups to your article to go to the following %s:\n"
+msgstr	"\n"
+	"÷Ù ÚÁÐÒÁÛÉ×ÁÌÉ followups ÎÁ ×ÁÛÕ ÓÔÁÔØÀ × %s:\n"
+
+#: src/lang.c:228
+#, c-format
+msgid	"  %s\t Answers will be directed to you by mail.\n"
+msgstr	"  %s\t ïÔ×ÅÔÙ ÂÕÄÕÔ ÎÁÐÒÁ×ÌÅÎÙ Ë ÷ÁÍ ÐÏ e-mail.\n"
+
+#: src/lang.c:229
+msgid	"-- forwarded message --\n"
+msgstr	"-- ÐÅÒÅÓÌÁÎÎÏÅ ÓÏÏÂÝÅÎÉÅ --\n"
+
+#: src/lang.c:230
+msgid	"-- end of forwarded message --\n"
+msgstr	"-- ËÏÎÅÃ ÐÅÒÅÓÌÁÎÎÏÇÏ ÓÏÏÂÝÅÎÉÑ --\n"
+
+#: src/lang.c:231
+msgid	"# Format:\n"
+	"#   comment=STRING    Optional. Multiple lines allowed. Comments must be "
+	"placed\n"
+	"#                     at the beginning of a rule, or they will be moved to "
+	"the\n"
+	"#                     next rule. '#' is not a valid keyword for a comment!\n"
+	"#   group=STRING      Mandatory. Newsgroups list (e.g. comp.*,!*sources*).\n"
+	"#   case=NUM          Mandatory. Compare=0 / ignore=1 case when filtering.\n"
+	"#   score=NUM|STRING  Mandatory. Score to give. Either:\n"
+	"#     score=NUM         A number (e.g. 70). Or:\n"
+	"#     score=STRING      One of the two keywords: 'hot' or 'kill'.\n"
+	"#   subj=STRING       Optional. Subject: line (e.g. How to be a wizard).\n"
+	"#   from=STRING       Optional. From: line (e.g. *Craig Shergold*).\n"
+	"#   msgid=STRING      Optional. Message-ID: line (e.g. <123@ether.net>) with\n"
+	"#                     full references.\n"
+	"#   msgid_last=STRING Optional. Like above, but with last reference only.\n"
+	"#   msgid_only=STRING Optional. Like above, but without references.\n"
+	"#   refs_only=STRING  Optional. References: line (e.g. <123@ether.net>) "
+	"without\n"
+	"#                     Message-ID:\n"
+	"#   lines=[<>]?NUM    Optional. Lines: line. '<' or '>' are optional.\n"
+	"#   gnksa=[<>]?NUM    Optional. GNKSA parse_from() return code. '<' or '>' "
+	"opt.\n"
+	"#   xref=PATTERN      Optional. Kill pattern (e.g. alt.flame*)\n"
+	"#   time=NUM          Optional. time_t value when rule expires\n"
+	"#\n"
+msgstr	""
+
+#: src/lang.c:252
+#, c-format
+msgid	"Enter score for rule (default=%d): "
+msgstr	"÷×ÅÄÉÔÅ score ÄÌÑ ÐÒÁ×ÉÌÁ (ÐÏ ÕÍÏÌÞÁÎÉÀ=%d): "
+
+#: src/lang.c:253
+#, c-format
+msgid	"Enter the score weight (range 0 < score <= %d)"
+msgstr	"÷×ÅÄÉÔÅ ×ÅÓ score (× ÐÒÅÄÅÌÁÈ 0 < score <= %d)"
+
+#. SCORE_MAX
+#: src/lang.c:254
+msgid	"Full"
+msgstr	"ðÏÌÎÙÊ"
+
+#: src/lang.c:255
+msgid	"Comment (optional)  : "
+msgstr	"ëÏÍÍÅÎÔÁÒÉÉ (ÎÅÏÂÑÚÁÔÅÌØÎÙÅ)  : "
+
+#: src/lang.c:256
+msgid	"Apply pattern to    : "
+msgstr	"ðÒÉÍÅÎÉÔØ ÛÁÂÌÏÎ Ë    : "
+
+#: src/lang.c:257
+msgid	"From: line (ignore case)      "
+msgstr	"From: ÓÔÒÏËÁ (ÉÇÎÏÒÉÒ. ÒÅÇÉÓÔÒ)    "
+
+#: src/lang.c:258
+msgid	"From: line (case sensitive)   "
+msgstr	"From: ÓÔÒÏËÁ (ÎÅÉÇÎÏÒÉÒ. ÒÅÇÉÓÔÒ)    "
+
+#: src/lang.c:260
+#, c-format
+msgid	"%s%s: Unknown host.\n"
+msgstr	"%s%s: îÅÉÚ×ÅÓÔÎÙÊ ËÏÍÐØÀÔÅÒ.\n"
+
+#: src/lang.c:261
+msgid	"global "
+msgstr	"ÇÌÏÂÁÌØÎÙÊ "
+
+#: src/lang.c:262
+#, c-format
+msgid	"Please use %.100s instead"
+msgstr	"ðÏÖÁÌÕÊÓÔÁ ÉÓÐÏÌØÚÕÊÔÅ ×ÍÅÓÔÏ ÜÔÏÇÏ %.100s"
+
+#: src/lang.c:263
+#, c-format
+msgid	"%s is bogus"
+msgstr	"%s ÆÉËÔÉ×ÎÁ(bogus)"
+
+#: src/lang.c:264
+#, c-format
+msgid	"Group %s is moderated. Continue?"
+msgstr	"çÒÕÐÐÁ %s ÍÏÄÅÒÉÒÕÅÔÓÑ. ðÒÏÄÏÌÖÉÔØ?"
+
+#: src/lang.c:265
+msgid	"groups"
+msgstr	"ÇÒÕÐÐÙ"
+
+#: src/lang.c:266
+#, c-format
+msgid	"Rereading %s..."
+msgstr	"ðÅÒÅÞÉÔÙ×ÁÎÉÅ %s..."
+
+#: src/lang.c:267
+msgid	"Top Level Commands"
+msgstr	"ëÏÍÁÎÄÙ ×ÅÒÈÎÅÇÏ ÕÒÏ×ÎÑ"
+
+#: src/lang.c:268
+msgid	"Group Selection"
+msgstr	"÷ÙÂÏÒ ÇÒÕÐÐÙ"
+
+#: src/lang.c:269
+msgid	"group"
+msgstr	"ÇÒÕÐÐÁ"
+
+#: src/lang.c:271
+msgid	"One or more lines of comment. <CR> to add a line or proceed if line is empty."
+msgstr	"ïÄÎÁ ÉÌÉ ÂÏÌÅÅ ÌÉÎÉÊ ËÏÍÍÅÎÔÁÒÉÅ×. <÷÷ïä> ÎÏ×ÁÑ ÓÔÒÏËÁ ÉÌÉ ÄÁÌØÛÅ ÅÓÌÉ ÓÔÒÏËÁ "
+	"ÐÕÓÔÁ."
+
+#: src/lang.c:272
+msgid	"From: line to add to filter file. <SPACE> toggles & <CR> sets."
+msgstr	"From: ÓÔÒÏËÁ ÄÌÑ ÄÏÂ. × ÆÉÌØÔÒ. <ðòïâåì> ÉÚÍÅÎÉÔØ Á <÷÷ïä> ÕÓÔÁÎÏ×ÉÔØ."
+
+#: src/lang.c:273
+msgid	"Linecount of articles to be filtered. < for less, > for more, = for equal."
+msgstr	"äÌÉÎÁ ÆÉÌØÔÒÕÅÍÙÈ ÓÔÁÔÅÊ. < ÍÅÎØÛÅ, > ÂÏÌØÛÅ, = ÒÏ×ÎÏ."
+
+#: src/lang.c:274
+msgid	"Message-ID: line to add to filter file. <SPACE> toggles & <CR> sets."
+msgstr	"Message-ID: ÓÔÒÏËÁ ÄÌÑ ÄÏÂ. × ÆÉÌØÔÒ. <ðòïâåì> ÉÚÍÅÎÉÔØ Á <÷÷ïä> ÕÓÔÁÎÏ×ÉÔØ."
+
+#: src/lang.c:275
+msgid	"Subject: line to add to filter file. <SPACE> toggles & <CR> sets."
+msgstr	"Subject: ÓÔÒÏËÁ ÄÌÑ ÄÏÂ. × ÆÉÌØÔÒ. <ðòïâåì> ÉÚÍÅÎÉÔØ Á <÷÷ïä> ÕÓÔÁÎÏ×ÉÔØ."
+
+#: src/lang.c:276
+msgid	"Enter text pattern to filter if Subject: & From: lines are not what you want."
+msgstr	"÷×ÅÄÉÔÅ ÛÁÂÌÏÎ ÄÌÑ ÆÉÌØÔÒÁÃÉÉ ÅÓÌÉ Subject: É From: ÓÔÒÏËÉ ÎÅÖÅÌÁÎÎÙ."
+
+#: src/lang.c:277
+msgid	"Select where text pattern should be applied. <SPACE> toggles & <CR> sets."
+msgstr	"÷ÙÂÒÁÔØ ÇÄÅ ÛÁÂÌÏÎ ÂÕÄÅÔ ÐÒÉÍÅÎÅÎ. <ðòïâåì> ÉÚÍÅÎÉÔØ Á <÷÷ïä> ÕÓÔÁÎÏ×ÉÔØ."
+
+#: src/lang.c:278
+msgid	"Expiration time in days for the entered filter. <SPACE> toggles & <CR> sets."
+msgstr	"÷ÒÅÍÑ ÄÅÊÓÔ×ÉÑ ÆÉÌØÔÒÁ × ÄÎÑÈ. <ðòïâåì> ÉÚÍÅÎÉÔØ Á <÷÷ïä> ÕÓÔÁÎÏ×ÉÔØ."
+
+#: src/lang.c:279
+msgid	"Apply kill only to current group or all groups. <SPACE> toggles & <CR> sets."
+msgstr	"ðÒÉÍÅÎÉÔØ ÕÎÉÞ. ÔÏÌØËÏ Ë ÔÅËÕÝÅÊ ÉÌÉ ËÏ ×ÓÅÍ ÇÒÕÐÐÁÍ. <ðòïâåì> ÉÚÍÅÎÉÔØ Á "
+	"<÷÷ïä> ÕÓÔÁÎÏ×ÉÔØ."
+
+#: src/lang.c:280
+msgid	"Apply select to current group or all groups. <SPACE> toggles & <CR> sets."
+msgstr	"ðÒÉÍÅÎÉÔØ ×ÙÂÏÒ Ë ÔÅËÕÝÅÊ ÉÌÉ ËÏ ×ÓÅÍ ÇÒÕÐÐÁÍ. <ðòïâåì> ÉÚÍÅÎÉÔØ Á <÷÷ïä> "
+	"ÕÓÔÁÎÏ×ÉÔØ."
+
+#: src/lang.c:281
+msgid	"kill an article via a menu"
+msgstr	"õÎÉÞÔÏÖÉÔØ ÓÔÁÔØÀ ÞÅÒÅÚ ÍÅÎÀ"
+
+#: src/lang.c:282
+msgid	"auto-select (hot) an article via a menu"
+msgstr	"Á×ÔÏ-×ÙÂÏÒ (hot) ÓÔÁÔØÉ ÞÅÒÅÚ ÍÅÎÀ"
+
+#: src/lang.c:283
+msgid	"Browse URLs in article"
+msgstr	"ðÒÏÓÍÏÔÒ URL × ÓÔÁÔØÅ"
+
+#: src/lang.c:284
+msgid	"0 - 9\t  display article by number in current thread"
+msgstr	"0 - 9\t  ÐÏËÁÚÁÔØ ÓÔÁÔØÀ ÐÏ ÎÏÍÅÒÕ × ÄÉÓËÕÓÓÉÉ"
+
+#: src/lang.c:285
+msgid	"cancel (delete) or supersede (overwrite) current article"
+msgstr	"ÏÔÍÅÎÉÔØ (ÕÄÁÌÉÔØ) ÉÌÉ ÚÁÍÅÎÉÔØ (ÐÅÒÅÐÉÓÁÔØ) ÔÅËÕÝÕÀ ÓÔÁÔØÀ"
+
+#: src/lang.c:286
+msgid	"edit article (mail-groups only)"
+msgstr	"ÒÅÄÁËÔÉÒÏ×ÁÔØ ÓÔÁÔØÀ (ÔÏÌØËÏ ÄÌÑ ÇÒÕÐÐ mail)"
+
+#: src/lang.c:287
+msgid	"display first article in current thread"
+msgstr	"ÐÏËÁÚÁÔØ ÐÅÒ×ÕÀ ÓÔÁÔØÀ × ÔÅËÕÝÅÊ ÄÉÓËÕÓÓÉÉ"
+
+#: src/lang.c:288
+msgid	"display first page of article"
+msgstr	"ÐÏËÁÚÁÔØ ÐÅÒ×ÕÀ ÓÔÒÁÎÉÃÕ ÓÔÁÔØÉ"
+
+#: src/lang.c:289
+msgid	"post followup to current article"
+msgstr	"ÏÔÐÒÁ×ÉÔØ followup ÎÁ ÔÅËÕÝÕÀ ÓÔÁÔØÀ"
+
+#: src/lang.c:290
+msgid	"post followup (don't copy text) to current article"
+msgstr	"ÏÔÐÒÁ×ÉÔØ followup (ÎÅ ËÏÐÉÒÕÑ ÔÅËÓÔ) ÎÁ ÔÅËÕÝÕÀ ÓÔÁÔØÀ"
+
+#: src/lang.c:291
+msgid	"post followup to current article quoting complete headers"
+msgstr	"ÏÔÐÒÁ×ÉÔØ followup ÎÁ ÔÅËÕÝÕÀ ÓÔÁÔØÀ, ÃÉÔÉÒÕÑ ÐÏÌÎÙÅ ÚÁÇÏÌÏ×ËÉ"
+
+#: src/lang.c:292
+msgid	"display last article in current thread"
+msgstr	"ÐÏËÁÚÁÔØ ÐÏÓÌÅÄÎÀÀ ÓÔÁÔØÀ × ÔÅËÕÝÅÊ ÄÉÓËÕÓÓÉÉ"
+
+#: src/lang.c:293
+msgid	"display last page of article"
+msgstr	"ÐÏËÁÚÁÔØ ÐÏÓÌÅÄÎÀÀ ÓÔÒÁÎÉÃÕ ÓÔÁÔØÉ"
+
+#: src/lang.c:294
+msgid	"mark rest of thread as read and advance to next unread"
+msgstr	"ÐÏÍÅÔÉÔØ ÏÓÔÁÔÏË ÄÉÓË. ËÁË ÐÒÏÞÉÔÁÎÏ É ÐÅÒÅÎÅÓÔÉÓØ ÎÁ ÓÌÅÄ. ÎÅÐÒÏÞÉÔ."
+
+#: src/lang.c:295
+msgid	"display next article"
+msgstr	"ÐÏËÁÚÁÔØ ÓÌÅÄÕÀÝÕÀ ÓÔÁÔØÀ"
+
+#: src/lang.c:296
+msgid	"display first article in next thread"
+msgstr	"ÐÏËÁÚÁÔØ ÐÅÒ×ÕÀ ÓÔÁÔØÀ × ÓÌÅÄ. ÄÉÓËÕÓÓÉÉ"
+
+#: src/lang.c:297
+msgid	"display next unread article"
+msgstr	"ÐÏËÁÚÁÔØ ÓÌÅÄÕÀÝÕÀ ÎÅÐÒÏÞÉÔÁÎÎÕÀ ÓÔÁÔØÀ"
+
+#: src/lang.c:298
+msgid	"go to the article that this one followed up"
+msgstr	"ÐÅÒÅÊÔÅ ÎÁ ÓÔÁÔØÀ ÚÁ ËÏÔÏÒÏÊ ÓÌÅÄÕÅÔ ÜÔÁ ÓÔÁÔØÑ"
+
+#: src/lang.c:299
+msgid	"display previous article"
+msgstr	"ÐÏËÁÚÁÔØ ÐÒÅÄÙÄÕÝÕÀ ÓÔÁÔØÀ"
+
+#: src/lang.c:300
+msgid	"display previous unread article"
+msgstr	"ÐÏËÁÚÁÔØ ÐÒÅÄÙÄÕÝÕÀ ÎÅÐÒÏÞÉÔÁÎÎÕÀ ÓÔÁÔØÀ"
+
+#: src/lang.c:301
+msgid	"quickly kill an article using defaults"
+msgstr	"ÂÙÓÔÒÏ ÕÎÉÞÔÏÖÉÔØ ÓÔÁÔØÀ ÉÓÐÏÌØÚÕÑ ÕÍÏÌÞÁÎÉÑ"
+
+#: src/lang.c:302
+msgid	"quickly auto-select (hot) an article using defaults"
+msgstr	"ÂÙÓÔÒÙÊ Á×ÔÏ-×ÙÂÏÒ (hot) ÓÔÁÔØÉ ÉÓÐÏÌØÚÕÑ ÕÍÏÌÞÁÎÉÑ"
+
+#: src/lang.c:303
+msgid	"return to group selection level"
+msgstr	"×ÅÒÎÕÔØÓÑ × ÕÒÏ×ÅÎØ ×ÙÂÏÒÁ ÇÒÕÐÐ"
+
+#: src/lang.c:304
+msgid	"reply through mail to author"
+msgstr	"ÏÔ×ÅÔÉÔØ ÐÏ e-mail Á×ÔÏÒÕ"
+
+#: src/lang.c:305
+msgid	"reply through mail (don't copy text) to author"
+msgstr	"ÏÔ×ÅÔÉÔØ ÐÏ e-mail (ÎÅ ×ÓÔÁ×ÌÑÑ ÔÅËÓÔ) Á×ÔÏÒÕ"
+
+#: src/lang.c:306
+msgid	"reply through mail to author quoting complete headers"
+msgstr	"ÏÔ×ÅÔÉÔØ ÐÏ e-mail Á×ÔÏÒÕ ÃÉÔÉÒÕÑ ÐÏÌÎÏÓÔØÀ ÚÁÇÏÌÏ×ËÉ"
+
+#: src/lang.c:307
+msgid	"repost chosen article to another group"
+msgstr	"ÏÔÐÒÁ×ÉÔØ ÓÎÏ×Á ÓÔÁÔØÀ × ÄÒÕÇÕÀ ÇÒÕÐÐÕ"
+
+#: src/lang.c:308
+msgid	"search backwards within this article"
+msgstr	"ÐÏÉÓË ÎÁÚÁÄ ×ÎÕÔÒÉ ÓÔÁÔØÉ"
+
+#: src/lang.c:309
+msgid	"search forwards within this article"
+msgstr	"ÐÏÉÓË ×ÐÅÒÅÄ ×ÎÕÔÒÉ ÓÔÁÔØÉ"
+
+#: src/lang.c:310
+msgid	"show article in raw-mode (including all headers)"
+msgstr	"ÐÏËÁÚÁÔØ ÓÔÁÔØÀ × raw ÒÅÖÉÍÅ (×ËÌ. ×ÓÅ ÚÁÇÏÌÏ×ËÉ)"
+
+#: src/lang.c:311
+msgid	"skip next block of included text"
+msgstr	"ÐÒÏÐÕÓÔÉÔØ ÓÌÅÄ. ÂÌÏË ×ËÌÀÞÅÎÎÏÇÏ ÔÅËÓÔÁ"
+
+#: src/lang.c:312
+msgid	"toggle display of sections hidden by a form-feed (^L) on/off"
+msgstr	"ÉÚÍÅÎÉÔØ ÐÏËÁÚ ÓÅËÃÉÊ ÓËÒÙÔÙÈ Ó ÐÏÍÏÝØÀ form-feed (^L) ÷ëì/÷ùëì"
+
+#: src/lang.c:313
+msgid	"toggle word highlighting on/off"
+msgstr	"ÉÚÍÅÎÉÔØ ÐÏÄÓ×ÅÔËÕ ÓÌÏ× ÷ëì/÷ùëì"
+
+#: src/lang.c:314
+msgid	"toggle ROT-13 (basic decode) for current article"
+msgstr	"ÉÚÍÅÎÉÔØ ROT-13 (ÄÅËÏÄÉÒÏ×ÁÎÉÅ) ÄÌÑ ÔÅËÕÝÅÊ ÓÔÁÔØÉ"
+
+#: src/lang.c:315
+msgid	"toggle tabwidth 4 <-> 8"
+msgstr	"ÉÚÍÅÎÉÔØ ÛÉÒÉÎÕ TAB 4 <-> 8"
+
+#: src/lang.c:316
+msgid	"toggle german TeX style decoding for current article"
+msgstr	"ÉÚÍÅÎÉÔØ ÎÅÍÅÃËÉÊ TeX ÓÔÉÌØ ÄÅËÏÄÉÒÏ×ÁÎÉÑ ÄÌÑ ÔÅËÕÝÅÊ ÓÔÁÔØÉ"
+
+#: src/lang.c:317
+msgid	"toggle display of uuencoded sections"
+msgstr	"ÉÚÍÅÎÉÔØ ÐÏËÁÚ uuencoded ÓÅËÃÉÉ"
+
+#: src/lang.c:318
+msgid	"View/save multimedia attachments"
+msgstr	"ðÒÏÓÍÏÔÒÅÔØ/óÏÈÒÁÎÉÔØ ÍÕÌØÔÉÍÅÄÉÑ-×ÌÏÖÅÎÉÅ"
+
+#: src/lang.c:319
+#, c-format
+msgid	"report bug or comment via mail to %s"
+msgstr	"ÐÏÓÌÁÔØ ÏÛÉÂËÕ ÉÌÉ ËÏÍÍÅÎÔÁÒÉÉ ÐÏ e-mail: %s"
+
+#: src/lang.c:320
+msgid	"choose range of articles to be affected by next command"
+msgstr	"×ÙÂÒÁÔØ ÄÉÁÐÁÚÏÎ ÓÔÁÔÅÊ ÐÏÄ×ÅÒÖÅÎÎÙÈ ÓÌÅÄ. ËÏÍÁÎÄÏÊ"
+
+#: src/lang.c:321
+msgid	"escape from command prompt"
+msgstr	"×ÙÊÔÉ ÉÚ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ"
+
+#: src/lang.c:322
+msgid	"edit filter file"
+msgstr	"ÒÅÄÁËÔÉÒÏ×ÁÔØ ÆÁÊÌ ÆÉÌØÔÒÁ"
+
+#: src/lang.c:323
+msgid	"get help"
+msgstr	"ÐÏÌÕÞÉÔØ ÐÏÍÏÝØ"
+
+#: src/lang.c:324
+msgid	"display last article viewed"
+msgstr	"ÐÏËÁÚÁÔØ ÐÏÓÌÅÄÎÀÀ ÐÒÏÓÍÏÔÒÅÎÎÕÀ ÓÔÁÔØÀ"
+
+#: src/lang.c:325
+msgid	"down one line"
+msgstr	"×ÎÉÚ ÏÄÎÕ ÓÔÒÏËÕ"
+
+#: src/lang.c:326
+msgid	"up one line"
+msgstr	"××ÅÒÈ ÏÄÎÕ ÓÔÒÏËÕ"
+
+#: src/lang.c:327
+msgid	"go to article chosen by Message-ID"
+msgstr	"ÐÅÒÅÊÔÉ ÎÁ ÓÔÁÔØÀ ÐÏ Message-ID"
+
+#: src/lang.c:328
+msgid	"mail article/thread/hot/pattern/tagged articles to someone"
+msgstr	"ÐÏÓÌÁÔØ ÓÔÁÔØÀ/ÄÉÓË./hot/ÛÁÂÌÏÎ/ÏÔÍÅÞÅÎÎÙÅ ÓÔÁÔØÉ ÐÏ e-mail"
+
+#: src/lang.c:329
+msgid	"menu of configurable options"
+msgstr	"ÍÅÎÀ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÈ ÏÐÃÉÊ"
+
+#: src/lang.c:330
+msgid	"down one page"
+msgstr	"×ÎÉÚ ÏÄÎÕ ÓÔÒÁÎÉÃÕ"
+
+#: src/lang.c:331
+msgid	"up one page"
+msgstr	"××ÅÒÈ ÏÄÎÕ ÓÔÒÁÎÉÃÕ"
+
+#: src/lang.c:332
+msgid	"post (write) article to current group"
+msgstr	"ÏÔÐÒÁ×ÉÔØ (ÎÁÐÉÓÁÔØ) ÓÔÁÔØÀ × ÔÅËÕÝÕÀ ÇÒÕÐÐÕ"
+
+#: src/lang.c:333
+msgid	"post postponed articles"
+msgstr	"ÏÔÐÒÁ×ÉÔØ ÏÔÌÏÖÅÎÎÙÅ ÓÔÁÔØÉ"
+
+#: src/lang.c:334
+msgid	"list articles posted by you (from posted file)"
+msgstr	"ÓÐÉÓÏË ÓÔÁÔÅÊ ÏÔÐÒÁ×ÌÅÎÎÙÈ ÷ÁÍÉ (ÉÚ ÆÁÊÌÁ posted)"
+
+#: src/lang.c:335
+msgid	"return to previous menu"
+msgstr	"×ÏÚ×ÒÁÔ × ÐÒÅÄÙÄÕÝÅÅ ÍÅÎÀ"
+
+#: src/lang.c:336
+msgid	"quit tin immediately"
+msgstr	"×ÙÈÏÄ ÉÚ tin ÎÅÍÅÄÌÅÎÎÏ"
+
+#: src/lang.c:337
+msgid	"redraw page"
+msgstr	"ÐÅÒÅÒÉÓÏ×ÁÔØ ÓÔÒÁÎÉÃÕ"
+
+#: src/lang.c:338
+msgid	"save article/thread/hot/pattern/tagged articles to file"
+msgstr	"ÓÏÈÒÁÎÉÔØ ÓÔÁÔØÀ/ÄÉÓË./hot/ÛÁÂÌÏÎ/ÏÔÍÅÞÅÎÎÙÅ ÓÔÁÔØÉ × ÆÁÊÌ"
+
+#: src/lang.c:339
+msgid	"save marked articles automatically without user prompts"
+msgstr	"ÓÏÈÒÁÎÑÔØ ÏÔÍÅÞÅÎÎÙÅ ÓÔÁÔØÉ Á×ÔÏÍÁÔÉÞÅÓËÉ ÂÅÚ ÐÏÄÔ×ÅÒÖÄÅÎÉÑ"
+
+#: src/lang.c:340
+msgid	"scroll the screen one line down"
+msgstr	"ÐÒÏËÒÕÔÉÔØ ÜËÒÁÎ ÎÁ ÏÄÎÕ ÌÉÎÉÀ ×ÎÉÚ"
+
+#: src/lang.c:341
+msgid	"scroll the screen one line up"
+msgstr	"ÐÒÏËÒÕÔÉÔØ ÜËÒÁÎ ÎÁ ÏÄÎÕ ÌÉÎÉÀ ××ÅÒÈ"
+
+#: src/lang.c:342
+msgid	"search for articles by author backwards"
+msgstr	"ÐÏÉÓË ÓÔÁÔÅÊ ÐÏ Á×ÔÏÒÕ ÎÁÚÁÄ"
+
+#: src/lang.c:343
+msgid	"search for articles by author forwards"
+msgstr	"ÐÏÉÓË ÓÔÁÔÅÊ ÐÏ Á×ÔÏÒÕ ×ÐÅÒÅÄ"
+
+#: src/lang.c:344
+msgid	"search all articles for a given string (this may take some time)"
+msgstr	"ÐÏÉÓË ×ÓÅÈ ÓÔÁÔÅÊ ÐÏ ÚÁÄÁÎÎÏÊ ÓÔÒÏËÅ (ÍÏÖÅÔ ÚÁÎÑÔØ ÎÅËÏÔÏÒÏÅ ×ÒÅÍÑ)"
+
+#: src/lang.c:345
+msgid	" \t  (searches are case-insensitive and wrap around to all articles)"
+msgstr	" \t  (ÐÏÉÓË ÉÇÎÏÒÉÒÕÅÔ ÒÅÇÉÓÔÒ É ÏÈ×ÁÔÙ×ÁÅÔ ×ÓÅ ÓÔÁÔØÉ)"
+
+#: src/lang.c:346
+msgid	"search for articles by Subject line backwards"
+msgstr	"ÐÏÉÓË ÓÔÁÔÅÊ ÐÏ ÓÔÒÏËÅ Subject ÎÁÚÁÄ"
+
+#: src/lang.c:347
+msgid	"search for articles by Subject line forwards"
+msgstr	"ÐÏÉÓË ÓÔÁÔÅÊ ÐÏ ÓÔÒÏËÅ Subject ×ÐÅÒÅÄ"
+
+#: src/lang.c:348
+msgid	"repeat last search"
+msgstr	"ÐÏ×ÔÏÒÉÔØ ÐÏÓÌÅÄÎÉÊ ÐÏÉÓË"
+
+#: src/lang.c:349
+msgid	"tag current article for reposting/mailing/piping/printing/saving"
+msgstr	"ÏÔÍÅÔÉÔØ ÔÅËÕÝÕÀ ÓÔÁÔØÀ ÄÌÑ ÐÅÒÅÏÔÐÒÁ×ËÉ/ÏÔÐÒÁ×ËÉ ÐÏ e-mail/piping/ÐÅÞÁÔÉ/"
+	"ÓÏÈÒÁÎÅÎÉÑ"
+
+#: src/lang.c:350
+msgid	"toggle info message in last line (subject/description)"
+msgstr	"ÉÚÍÅÎÉÔØ ÉÎÆÏÓÏÏÂÝÅÎÉÅ × ÐÏÓÌÅÄÎÅÊ ÓÔÒÏËÅ (ÔÅÍÁ/ÏÐÉÓÁÎÉÅ)"
+
+#: src/lang.c:351
+msgid	"toggle inverse video"
+msgstr	"ÉÚÍÅÎÉÔØ ÉÎ×ÅÒÓÉÀ ×ÉÄÅÏ"
+
+#: src/lang.c:352
+msgid	"toggle mini help menu display"
+msgstr	"ÉÚÍÅÎÉÔØ ÍÉÎÉÐÏÄÓËÁÚËÕ (÷ëì/÷ùëì)"
+
+#: src/lang.c:353
+msgid	"cycle the display of authors email address, real name, both or neither"
+msgstr	"ÓÍÅÎÉÔØ ÐÏËÁÚ ÁÄÒÅÓÏ× e-mail, realname, ÏÂÏÉÈ, ÎÉÞÅÇÏ"
+
+#: src/lang.c:354
+msgid	"show version information"
+msgstr	"ÐÏËÁÚÁÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ×ÅÒÓÉÉ"
+
+#: src/lang.c:355
+msgid	"mark all articles as read and return to group selection menu"
+msgstr	"ÐÏÍÅÔÉÔØ ×ÓÅ ÓÔÁÔØÉ ËÁË ÐÒÏÞÉÔÁÎÏ É ×ÏÚ×ÒÁÔ × ÍÅÎÀ ×ÙÂÏÒÁ ÇÒÕÐÐ"
+
+#: src/lang.c:356
+msgid	"mark all articles as read and enter next group with unread articles"
+msgstr	"ÐÏÍÅÔÉÔØ ×ÓÅ ÓÔÁÔØÉ ËÁË ÐÒÏÞÉÔÁÎÏ É ×ÏÊÔÉ × ÓÌÅÄ. ÇÒÕÐÐÕ Ó ÎÅÐÒÏÞÉÔ. ÓÔÁÔØÑÍÉ"
+
+#: src/lang.c:357
+msgid	"choose first thread in list"
+msgstr	"×ÙÂÒÁÔØ ÐÅÒ×ÕÀ ÄÉÓËÕÓÓÉÀ × ÓÐÉÓËÅ"
+
+#: src/lang.c:358
+msgid	"choose last thread in list"
+msgstr	"×ÙÂÒÁÔØ ÐÏÓÌÅÄÎÀÀ ÄÉÓËÕÓÓÉÀ × ÓÐÉÓËÅ"
+
+#: src/lang.c:359
+msgid	"list articles within current thread (bring up Thread sub-menu)"
+msgstr	"ÓÐÉÓÏË ÓÔÁÔÅÊ × ÄÉÓËÕÓÉÉ (×ÙÚ×ÁÔØ ÐÏÄÍÅÎÀ äÉÓËÕÓÓÉÑ)"
+
+#: src/lang.c:360
+msgid	"mark article as unread"
+msgstr	"ÐÏÍÅÔÉÔØ ÓÔÁÔØÀ ËÁË ÐÒÏÞÉÔÁÎÎÕÀ"
+
+#: src/lang.c:361
+msgid	"mark current thread or tagged threads as read"
+msgstr	"ÐÏÍÅÔÉÔØ ÔÅËÕÝÕÀ ÄÉÓË. ÉÌÉ ÏÔÍÅÞÅÎÎÙÅ ÄÉÓË. ËÁË ÐÒÏÞÉÔÁÎÎÙÅ"
+
+#: src/lang.c:362
+msgid	"mark thread as unread"
+msgstr	"ÐÏÍÅÔÉÔØ ÄÉÓËÕÓÓÉÀ ËÁË ÎÅÐÒÏÞÉÔÁÎÎÕÀ"
+
+#: src/lang.c:363
+msgid	"toggle display of all/selected articles"
+msgstr	"ðÏËÁÚÙ×ÁÔØ: ×ÓÅ/×ÙÂÒÁÎÎÙÅ ÓÔÁÔØÉ"
+
+#: src/lang.c:364
+msgid	"display next group"
+msgstr	"ÐÏËÁÚÁÔØ ÓÌÅÄÕÀÝÕÀ ÇÒÕÐÐÕ"
+
+#: src/lang.c:365
+msgid	"display previous group"
+msgstr	"ÐÏËÁÚÁÔØ ÐÒÅÄÙÄÕÝÕÀ ÇÒÕÐÐÕ"
+
+#: src/lang.c:366
+msgid	"toggle all selections (all articles)"
+msgstr	"éÚÍÅÎÉÔØ ×ÓÅ ÐÏÍÅÔËÉ (×ÓÅ ÓÔÁÔØÉ)"
+
+#: src/lang.c:367
+msgid	"select group (make \"hot\")"
+msgstr	"×ÙÂÒÁÔØ ÇÒÕÐÐÕ (make \"hot\")"
+
+#: src/lang.c:368
+msgid	"select thread"
+msgstr	"×ÙÂÒÁÔØ ÄÉÓËÕÓÓÉÀ"
+
+#: src/lang.c:369
+msgid	"select threads if at least one unread article is selected"
+msgstr	"×ÙÂÒÁÔØ ÄÉÓË. ÅÓÌÉ ÈÏÔÑ ÂÙ ÏÄÎÁ ÎÅÐÒÏÞÉÔ. ÓÔÁÔØÑ ÐÏÍÅÞÅÎÁ"
+
+#: src/lang.c:370
+msgid	"select threads that match user specified pattern"
+msgstr	"×ÙÂÒÁÔØ ÄÉÓË. ËÏÔÏÒÙÅ ÐÏÄÐÁÄÁÀÔ ÐÏÄ ÕËÁÚÁÎÎÙÊ ÛÁÂÌÏÎ"
+
+#: src/lang.c:371
+msgid	"tag all parts of current multipart-message in order"
+msgstr	"ÐÏÍÅÔÉÔØ ×Ó£ ÞÁÓÔÉ ÔÅËÕÝÅÇÏ multipart-ÓÏÏÂÝÅÎÉÑ ÐÏ ÐÏÒÑÄËÕ"
+
+#: src/lang.c:372
+msgid	"0 - 9\t  choose thread by number"
+msgstr	"0 - 9\t  ×ÙÂÒÁÔØ ÄÉÓËÕÓÓÉÀ ÐÏ ÎÏÍÅÒÕ"
+
+#: src/lang.c:373
+msgid	"toggle limit number of articles to get, and reload"
+msgstr	"ÉÚÍÅÎÉÔØ ÐÒÅÄÅÌ ÞÉÓÌÁ ÐÏÌÕÞÁÅÍÙÈ É ÐÅÒÅÞÉÔÁÎÎÙÈ ÓÔÁÔÅÊ"
+
+#: src/lang.c:374
+msgid	"toggle display of all/unread articles"
+msgstr	"ðÏËÁÚÙ×ÁÔØ: ×ÓÅ/ÎÅÐÒÏÞÉÔÁÎÎÙÅ ÓÔÁÔØÉ"
+
+#: src/lang.c:375
+msgid	"toggle selection of thread"
+msgstr	"éÚÍÅÎÉÔØ ÐÏÍÅÔËÉ ÄÉÓËÕÓÓÉÊ"
+
+#: src/lang.c:376
+msgid	"cycle through threading options available"
+msgstr	"ðÅÒÅÂÏÒ ÄÏÓÔÕÐÎÙÈ ÏÐÃÉÊ ÄÉÓËÕÓÓÉÊ"
+
+#: src/lang.c:377
+msgid	"undo all selections (all articles)"
+msgstr	"ïÔÍÅÎÉÔØ ×ÓÅ ÐÏÍÅÔËÉ (×ÓÅÈ ÓÔÁÔÅÊ)"
+
+#: src/lang.c:378
+msgid	"untag all tagged threads"
+msgstr	"óÎÑÔØ ÍÅÔËÉ Ó ÏÔÍÅÞÅÎÎÙÈ ÄÉÓËÕÓÓÉÊ"
+
+#: src/lang.c:379
+msgid	"mark all articles in group as read"
+msgstr	"ÐÏÍÅÔÉÔØ ×ÓÅ ÓÔÁÔØÉ × ÇÒÕÐÐÅ ËÁË ÐÒÏÞÉÔÁÎÎÙÅ"
+
+#: src/lang.c:380
+msgid	"mark all articles in group as read and move to next unread group"
+msgstr	"ÐÏÍÅÔÉÔØ ×ÓÅ ÓÔÁÔØÉ × ÇÒÕÐÐÅ ËÁË ÐÒÏÞÉÔÁÎÎÙÅ É ÐÅÒÅÊÔÉ Ë ÓÌÅÄ. ÎÅÐÒÏÞÉÔ. "
+	"ÇÒÕÐÐÅ"
+
+#: src/lang.c:381
+msgid	"choose first group in list"
+msgstr	"×ÙÂÒÁÔØ ÐÅÒ×ÕÀ ÇÒÕÐÐÕ × ÓÐÉÓËÅ"
+
+#: src/lang.c:382
+msgid	"choose group by name"
+msgstr	"×ÙÂÒÁÔØ ÇÒÕÐÐÕ ÐÏ ÉÍÅÎÉ"
+
+#: src/lang.c:383
+msgid	"0 - 9\t  choose group by number"
+msgstr	"0 - 9\t  ×ÙÂÒÁÔØ ÇÒÕÐÐÕ ÐÏ ÎÏÍÅÒÕ"
+
+#: src/lang.c:384
+msgid	"choose range of groups to be affected by next command"
+msgstr	"×ÙÂÒÁÔØ ÄÉÁÐÁÚÏÎ ÇÒÕÐÐ ÐÏÄ×ÅÒÖÅÎÎÙÈ ÓÌÅÄ. ËÏÍÁÎÄÅ"
+
+#: src/lang.c:385
+msgid	"choose last group in list"
+msgstr	"×ÙÂÒÁÔØ ÐÏÓÌÅÄÎÀÀ ÇÒÕÐÐÕ × ÓÐÉÓËÅ"
+
+#: src/lang.c:386
+msgid	"mark all articles in chosen group unread"
+msgstr	"ÐÏÍÅÔÉÔØ ×ÓÅ ÓÔÁÔØÉ × ÇÒÕÐÐÅ ËÁË ÎÅÐÒÏÞÉÔÁÎÎÙÅ"
+
+#: src/lang.c:387
+msgid	"move chosen group within list"
+msgstr	"ÐÅÒÅÍÅÓÔÉÔØ ÇÒÕÐÐÕ × ÓÐÉÓËÅ"
+
+#: src/lang.c:388
+msgid	"choose next group with unread news"
+msgstr	"×ÙÂÒÁÔØ ÓÌÅÄ. ÇÒÕÐÐÕ Ó ÎÅÐÒÏÞÉÔÁÎÎÙÍÉ ÎÏ×ÏÓÔÑÍÉ"
+
+#: src/lang.c:389 src/lang.c:1197
+msgid	"quit"
+msgstr	"×ÙÈÏÄ"
+
+#: src/lang.c:390
+msgid	"quit without saving configuration changes"
+msgstr	"×ÙÈÏÄ ÂÅÚ ÓÏÈÒÁÎÅÎÉÑ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÈ ÉÚÍÅÎÅÎÉÊ"
+
+#: src/lang.c:391
+msgid	"read chosen group"
+msgstr	"ÐÒÏÞÉÔÁÔØ ×ÙÂÒÁÎÎÕÀ ÇÒÕÐÐÕ"
+
+#: src/lang.c:392
+msgid	"reset .newsrc (all available articles in groups marked unread)"
+msgstr	"ÓÂÒÏÓÉÔØ .newsrc (×ÓÅ ÓÔÁÔØÉ × ÇÒÕÐÐÅ ÐÏÍÅÔÑÔÓÑ ÎÅÐÒÏÞÉÔÁÎÎÙÍÉ)"
+
+#: src/lang.c:393
+msgid	"search backwards for a group name"
+msgstr	"ÐÏÉÓË ÎÁÚÁÄ ÐÏ ÉÍÅÎÉ ÇÒÕÐÐÙ"
+
+#: src/lang.c:394
+msgid	" \t  (all searches are case-insensitive and wrap around)"
+msgstr	" \t  (×ÓÅ ÐÏÉÓËÉ ÒÅÇÉÓÔÒÏ-ÎÅÚÁ×ÉÓÉÍÙ É ÏÈ×ÁÔÙ×ÁÀÔ ×ÓÅ ÓÔÁÔØÉ/ÇÒÕÐÐÙ)"
+
+#: src/lang.c:395
+msgid	"search forwards for a group name"
+msgstr	"ÐÏÉÓË ×ÐÅÒÅÄ ÐÏ ÉÍÅÎÉ ÇÒÕÐÐÙ"
+
+#: src/lang.c:396
+msgid	"subscribe to chosen group"
+msgstr	"ÐÏÄÐÉÓÁÔØÓÑ ÎÁ ×ÙÂÒÁÎÎÕÀ ÇÒÕÐÐÕ"
+
+#: src/lang.c:397
+msgid	"subscribe to groups that match pattern"
+msgstr	"ÐÏÄÐÉÓÁÔØÓÑ ÎÁ ÇÒÕÐÐÙ, ÐÏÄÐÁÄÁÀÝÕÀ ÐÏÄ ÛÁÂÌÏÎ"
+
+#: src/lang.c:398
+msgid	"reread active file to check for any new news"
+msgstr	"ÐÅÒÅÞÉÔÁÔØ active ÆÁÊÌ ÄÌÑ ÐÒÏ×ÅÒËÉ ÎÏ×ÙÈ ÎÏ×ÏÓÔÅÊ"
+
+#: src/lang.c:399
+msgid	"toggle display of group name only or group name plus description"
+msgstr	"ÐÅÒÅËÌÀÞÉÔØ ÐÏËÁÚ: ÉÍÑ ÇÒÕÐÐÙ ÉÌÉ ÉÍÑ ÇÒÕÐÐÙ + ÏÐÉÓÁÎÉÅ"
+
+#: src/lang.c:400
+msgid	"toggle display to show all/unread subscribed groups"
+msgstr	"ÐÅÒÅËÌÀÞÉÔØ ÐÏËÁÚ: ×ÓÅ ÇÒÕÐÐÙ / ÎÅÐÒÏÞÉÔÁÎÎÙÅ ÐÏÄÐÉÓÁÎÎÙÅ ÇÒÕÐÐÙ"
+
+#: src/lang.c:401
+msgid	"unsubscribe from chosen group"
+msgstr	"ÏÔÐÉÓÁÔØÓÑ ÏÔ ×ÙÂÒÁÎÎÏÊ ÇÒÕÐÐÙ"
+
+#: src/lang.c:402
+msgid	"unsubscribe from groups that match pattern"
+msgstr	"ÏÔÐÉÓÁÔØÓÑ ÏÔ ÇÒÕÐÐ, ÐÏÄÐÁÄÁÀÝÉÈ ÐÏÄ ÛÁÂÌÏÎ"
+
+#: src/lang.c:403
+msgid	"sort the list of groups"
+msgstr	"ÓÏÒÔÉÒÏ×ÁÔØ ÓÐÉÓÏË ÇÒÕÐÐ"
+
+#: src/lang.c:404
+msgid	"toggle display to show all/subscribed groups"
+msgstr	"ÐÅÒÅËÌÀÞÉÔØ ÐÏËÁÚ: ×ÓÅ / ÐÏÄÐÉÓÁÎÎÙÅ ÇÒÕÐÐÙ"
+
+#: src/lang.c:405
+msgid	"0 - 9\t  choose article by number"
+msgstr	"0 - 9\t  ×ÙÂÒÁÔØ ÓÔÁÔØÀ ÐÏ ÎÏÍÅÒÕ"
+
+#: src/lang.c:406
+msgid	"mark thread as read and return to group index page"
+msgstr	"ÐÏÍÅÔÉÔØ ÎÉÔØ ËÁË ÐÒÏÞÉÔÁÎÎÕÀ É ×ÅÒÎÕÔØÓÑ ÎÁ ÓÔÒÁÎÉÃÕ ÉÎÄÅËÓÁ ÇÒÕÐÐ"
+
+#: src/lang.c:407
+msgid	"mark thread as read and enter next unread thread or group"
+msgstr	"ÐÏÍÅÔÉÔØ ÎÉÔØ ËÁË ÐÒÏÞÉÔÁÎÎÕÀ É ÐÅÒÅÊÔÉ × ÓÌÅÄ. ÎÅÐÒÏÞÉÔ. ÎÉÔØ ÉÌÉ ÇÒÕÐÐÕ"
+
+#: src/lang.c:408
+msgid	"choose first article in list"
+msgstr	"×ÙÂÒÁÔØ ÐÅÒ×ÕÀ ÓÔÁÔØÀ × ÓÐÉÓËÅ"
+
+#: src/lang.c:409
+msgid	"choose last article in list"
+msgstr	"×ÙÂÒÁÔØ ÐÏÓÌÅÄÎÀÀ ÓÔÁÔØÀ × ÓÐÉÓËÅ"
+
+#: src/lang.c:410
+msgid	"mark article or tagged articles as read and move cursor to next unread article"
+msgstr	"ÐÏÍÅÔÉÔØ ÓÔÁÔØÀ ÉÌÉ ÏÔÍÅÞÅÎÎÙÅ ÓÔÁÔØÉ ËÁË ÐÒÏÞÉÔÁÎÎÙÅ É ÐÅÒÅÍÅÓÔÉÔØ ËÕÒÓÏÒ Ë "
+	"ÓÌÅÄ. ÎÅÐÒÏÞÉÔÁÎÎÏÊ ÓÔÁÔØÅ"
+
+#: src/lang.c:411
+msgid	"read chosen article"
+msgstr	"ÐÒÏÞÉÔÁÔØ ×ÙÂÒÁÎÎÕÀ ÓÔÁÔØÀ"
+
+#: src/lang.c:412
+msgid	"Display properties\n"
+	"------------------"
+msgstr	"ðÏËÁÚÁÔØ Ó×ÏÊÓÔ×Á\n"
+	"------------------"
+
+#: src/lang.c:413
+msgid	"Miscellaneous\n"
+	"-------------"
+msgstr	"óÍÅÛÁÎÎÙÅ ...\n"
+	"-------------"
+
+#: src/lang.c:414
+msgid	"Moving around\n"
+	"-------------"
+msgstr	"  ä×ÉÖÅÎÉÅ \n"
+	"----------"
+
+#: src/lang.c:415
+msgid	"Group/thread/article operations\n"
+	"-------------------------------"
+msgstr	"ïÐÅÒÁÃÉÉ Ó ÇÒÕÐÐÁÍÉ/ÎÉÔÑÍÉ/ÓÔÁÔØÑÍÉ\n"
+	"-----------------------------------"
+
+#: src/lang.c:417
+msgid	"Group Level Commands"
+msgstr	"ëÏÍÁÎÄÙ õÒÏ×ÎÑ çÒÕÐÐ"
+
+#: src/lang.c:418
+msgid	"Kill filter added"
+msgstr	"õÎÉÞÔÏÖÉÔØ ÄÏÂÁ×ÌÅÎÎÙÊ ÆÉÌØÔÒ"
+
+#: src/lang.c:419
+msgid	"Auto-selection filter added"
+msgstr	"æÉÌØÔÒ Á×ÔÏ-×ÙÂÏÒ ÄÏÂÁ×ÌÅÎ"
+
+#: src/lang.c:420
+msgid	"All parts tagged"
+msgstr	"÷ÓÅ ÞÁÓÔÉ ÐÏÍÅÞÅÎÙ"
+
+#: src/lang.c:421
+msgid	"Storing article for later posting"
+msgstr	"óÏÈÒÁÎÉÅ ÓÔÁÔØÉ ÄÌÑ ÏÔÐÒÁ×ÌÅÎÉÑ ÐÏÚÖÅ"
+
+#: src/lang.c:422
+msgid	"Please enter a valid character"
+msgstr	"ðÏÖÁÌÕÊÓÔÁ ××ÅÄÉÔÅ ÄÏÐÕÓÔÉÍÙÊ ÓÉÍ×ÏÌ"
+
+#: src/lang.c:423
+#, c-format
+msgid	"Missing part #%d"
+msgstr	"ðÒÏÐÕÝÅÎÁ ÞÁÓÔØ #%d"
+
+#: src/lang.c:424
+msgid	"*** No postponed articles ***"
+msgstr	"*** îÅÔ ÏÔÌÏÖÅÎÎÙÈ ÓÔÁÔÅÊ ***"
+
+#: src/lang.c:425
+msgid	"Not a multi-part message"
+msgstr	"îÅ multi-part ÓÏÏÂÝÅÎÉÅ"
+
+#: src/lang.c:426
+msgid	"You are not subscribed to this group"
+msgstr	"÷Ù ÎÅ ÐÏÄÐÉÓÁÎÙ ÎÁ ÜÔÕ ÇÒÕÐÐÕ"
+
+#: src/lang.c:427
+msgid	"No previous expression"
+msgstr	"îÅÔ ÐÒÅÄÙÄÕÝÅÇÏ ×ÙÒÁÖÅÎÉÑ"
+
+#: src/lang.c:428
+msgid	"Operation disabled in no-overwrite mode"
+msgstr	"ïÐÅÒÁÃÉÑ ÚÁÐÒÅÝÅÎÁ × ÒÅÖÉÍÅ ÚÁÐÒÅÝÅÎÉÑ ÐÅÒÅÚÁÐÉÓÉ"
+
+#. TODO: replace hardcoded key-name in txt_info_postponed
+#: src/lang.c:430
+#, c-format
+msgid	"%d postponed %s, reuse with ^O...\n"
+msgstr	"%d ÏÔÌÏÖÅÎÁ %s, ×ÏÚÏÂÎÏ×ÉÔØ Ó ^O...\n"
+
+#: src/lang.c:431
+msgid	"X-Conversion-Note: multipart/alternative contents have been removed.\n"
+	"  To get the whole article, turn alternative handling OFF in the Option Menu\n"
+msgstr	"X-Conversion-Note: ÓÏÄÅÒÖÁÎÉÅ multipart/alternative ÂÙÌÏ ÕÄÁÌÅÎÏ.\n"
+	"  äÌÑ ÐÏÌÕÞÅÎÉÑ ×ÓÅÊ ÓÔÁÔØÉ, ÉÚÍÅÎÉÔÅ alternative handling ÎÁ OFF × íÅÎÀ "
+	"ïÐÃÉÊ\n"
+
+#: src/lang.c:433
+#, c-format
+msgid	"Save filename for %s/%s is a mailbox. Attachment not saved"
+msgstr	"æÁÊÌ ÄÌÑ ÓÏÈÒÁÎÅÎÉÑ  %s/%s - mailbox. ÷ÌÏÖÅÎÉÅ ÎÅ ÓÏÈÒÁÎÅÎÏ"
+
+#: src/lang.c:434
+msgid	"TeX2Iso encoded article"
+msgstr	"TeX2Iso ËÏÄÉÒÏ×ÁÎÎÁÑ ÓÔÁÔØÑ"
+
+#: src/lang.c:435
+msgid	"incomplete "
+msgstr	"ÎÅÐÏÌÎÙÊ "
+
+#. TODO: replace hardcoded key-names
+#: src/lang.c:437
+#, c-format
+msgid	"\n"
+	"Welcome to %s, a full screen threaded Netnews reader. It can read news "
+	"locally\n"
+	"(ie. <spool>/news) or remotely (-r option)  from a NNTP (Network News "
+	"Transport\n"
+	"Protocol) server. -h lists the available command line options.\n"
+	"\n"
+	"%s  has four newsreading levels, the newsgroup selection page, the group "
+	"index\n"
+	"page, the thread listing page and the article viewer. Help is available at "
+	"each\n"
+	"level by pressing the 'h' command.\n"
+	"\n"
+	"Move up/down by using the terminal arrow keys or 'j' and 'k'.  Use PgUp/PgDn "
+	"or\n"
+	"Ctrl-U and Ctrl-D to page up/down. Enter a newsgroup by pressing RETURN/TAB.\n"
+	"\n"
+	"Articles, threads, tagged articles or articles matching a pattern can be "
+	"mailed\n"
+	"('m' command), printed ('o' command), saved ('s' command), piped ('|' "
+	"command).\n"
+	"Use  the 'w' command  to post a  news article,  the 'f'/'F' commands  to post "
+	"a\n"
+	"follow-up to  an existing  news article  and the 'r'/'R' commands  to reply "
+	"via\n"
+	"mail to an  existing news article author.  The 'M' command allows the "
+	"operation\n"
+	"of %s to be configured via a menu.\n"
+	"\n"
+	"For more information read the manual page, README, INSTALL, TODO and FTP "
+	"files.\n"
+	"Please send bug-reports/comments to %s with the 'R' command.\n"
+msgstr	"\n"
+	"äÏÂÒÏ ÐÏÖÁÌÏ×ÁÔØ × %s, ÐÏÌÎÏÜËÒÁÎÎÙÊ newsreader. tin ÍÏÖÅÔ ÞÉÔÁÔØ ÎÏ×ÏÓÔÉ Ó \n"
+	"ÌÏËÁÌØÎÏÊ ÍÁÛÉÎÙ (ÎÁÐÒÉÍÅÒ Ó <spool>/news) ÉÌÉ ÕÄÁÌÅÎÎÏ (Ó ÏÐÃÉÅÊ -r) Ó NNTP\n"
+	"(Network News Transport Protocol) ÓÅÒ×ÅÒÁ. -h ÐÏËÁÚÙ×ÁÅÔ ÄÏÓÔÕÐÎÙÅ ÏÐÃÉÉ \n"
+	"ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ.\n"
+	"\n"
+	"÷ %s ÞÅÔÙÒÅ ÕÒÏ×ÎÑ: óÔÒÁÎÉÃÁ ×ÙÂÏÒÁ ÇÒÕÐÐÙ, óÔÒÁÎÉÃÁ ÉÎÄÅËÓÁ ÇÒÕÐÐÙ, "
+	"óÔÒÁÎÉÃÁ\n"
+	"ÎÉÔÉ É óÔÒÁÎÉÃÁ ÐÒÏÓÍÏÔÒÁ ÓÔÁÔØÉ. ðÏÄÓËÁÚËÁ ÄÏÓÔÕÐÎÁ ÄÌÑ ËÁÖÄÏÇÏ ÕÒÏ×ÎÑ\n"
+	"ÎÁÖÁÔÉÅÍ 'h'\n"
+	"\n"
+	"ðÅÒÅÍÅÝÁÔØÓÑ ××ÅÒÈ/×ÎÉÚ ÍÏÖÎÏ ÎÁÖÁÔÉÅÍ ÓÔÒÅÌÏË ÉÌÉ 'j' É 'k'. äÌÑ\n"
+	"ÐÒÏÌÉÓÔÙ×ÁÎÉÑ ÓÔÒÁÎÉÃÙ ××ÅÒÈ/×ÎÉÚ ÎÁÖÍÉÔÅ PgUp / PgDn ÉÌÉ Ctrl-U / Ctrl-D\n"
+	"÷ÈÏÄ × ÇÒÕÐÐÕ ÎÁÖÁÔÉÅÍ <÷÷ïä>/<ôáâ>\n"
+	"\n"
+	"óÔÁÔØÉ, ÎÉÔÉ, ÐÏÍÅÞÅÎÎÙÅ ÉÌÉ ÐÏÄÐÁÄÁÀÝÉÅ ÐÏÄ ÛÁÂÌÏÎ ÓÔÁÔØÉ ÍÏÇÕÔ ÂÙÔØ\n"
+	"ÏÔÐÒÁ×ÌÅÎÙ ÐÏ e-mail (ËÏÍÁÎÄÁ 'm'), ÎÁÐÅÞÁÔÁÎÙ (ËÏÍÁÎÄÁ 'o'), ÓÏÈÒÁÎÅÎÙ\n"
+	"(ËÏÍÁÎÄÁ 's') ÉÌÉ ÏÔÐÒÁ×ÌÅÎÙ × pipe (ËÏÍÁÎÄÁ '|')\n"
+	"'w' - ÏÔÐÒÁ×ÉÔØ ÎÏ×ÕÀ ÓÔÁÔØÀ, 'f'/'F' - ÏÔÐÒÁ×ÉÔØ follow-up ÎÁ ÓÕÝÅÓÔ×ÕÀÝÕÀ\n"
+	"ÓÔÁÔØÀ É 'r'/'R' - ÏÔ×ÅÔÉÔØ ÐÏ e-mail Á×ÔÏÒÕ ÓÔÁÔØÉ. ëÏÍÁÎÄÁ 'M' ÐÏÚ×ÏÌÑÅÔ\n"
+	"ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÔØ %s ÐÏÓÒÅÄÓÔ×ÏÍ ÕÄÏÂÎÏÇÏ ÍÅÎÀ.\n"
+	"\n"
+	"äÌÑ ÄÏÐÏÌÎÉÔÅÌØÎÏÊ ÉÎÆÏÒÍÁÃÉÉ ÞÉÔÁÊÔÅ man, README, INSTALL, TODO É FTP ÆÁÊÌÙ\n"
+	"ðÏÓÙÌÁÊÔÅ bug-reports/comments ÎÁ %s ËÏÍÁÎÄÏÊ 'R'.\n"
+
+#: src/lang.c:453
+#, c-format
+msgid	"Invalid  From: %s  line. Read the INSTALL file again."
+msgstr	"îÅÄÏÐÕÓÔÉÍÁÑ ÓÔÒÏËÁ From: %s. ðÒÏÞÉÔÁÊÔÅ INSTALL ÓÎÏ×Á."
+
+#: src/lang.c:455
+msgid	"Invalid multibyte sequence found\n"
+msgstr	""
+
+#: src/lang.c:457
+#, c-format
+msgid	"Invalid  Sender:-header %s"
+msgstr	"îÅÄÏÐÕÓÔÉÍÙÊ ÚÁÇÏÌÏ×ÏË Sender: %s"
+
+#: src/lang.c:458
+msgid	"Inverse video disabled"
+msgstr	"éÎ×ÅÒÓÎÏÅ ×ÉÄÅÏ ÚÁÐÒÅÝÅÎÏ"
+
+#: src/lang.c:459
+msgid	"Inverse video enabled"
+msgstr	"éÎ×ÅÒÓÎÏÅ ×ÉÄÅÏ ÒÁÚÒÅÛÅÎÏ"
+
+#: src/lang.c:461
+#, c-format
+msgid	"Missing definition for %s\n"
+msgstr	"ðÒÏÐÕÝÅÎÏ ÏÐÒÅÄÅÌÅÎÉÅ ÄÌÑ %s\n"
+
+#: src/lang.c:462
+#, c-format
+msgid	"Invalid key definition '%s'\n"
+msgstr	"îÅÐÒÁ×ÉÌØÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ ËÌÁ×ÉÛÉ '%s'\n"
+
+#: src/lang.c:463
+#, c-format
+msgid	"Invalid keyname '%s'\n"
+msgstr	"îÅÐÒÁ×ÉÌØÎÏÅ ÎÁÚ×ÁÎÉÅ ËÌÁ×ÉÛÉ '%s'\n"
+
+#: src/lang.c:464
+#, c-format
+msgid	"Keymap file was upgraded to version %s\n"
+msgstr	"Keymap ÆÁÊÌ ÏÂÎÏ×ÌÅÎ ÄÏ ×ÅÒÓÉÉ %s\n"
+
+#: src/lang.c:465
+#, c-format
+msgid	"Kill From:     [%s] (y/n): "
+msgstr	"õÎÉÞÔÏÖÉÔØ From:     [%s] (y/n): "
+
+#: src/lang.c:466
+msgid	"Kill Lines: (</>num): "
+msgstr	"õÎÉÞÔÏÖÉÔØ óÔÒÏËÉ: (</>num): "
+
+#: src/lang.c:467
+msgid	"Kill Article Menu"
+msgstr	"õÎÉÞÔÏÖÉÔØ íÅÎÀ óÔÁÔØÉ"
+
+#: src/lang.c:468
+#, c-format
+msgid	"Kill Msg-Id:   [%s] (f/l/o/n): "
+msgstr	"õÎÉÞÔÏÖÉÔØ Msg-Id:   [%s] (f/l/o/n): "
+
+#: src/lang.c:469
+msgid	"Kill pattern scope  : "
+msgstr	"õÎÉÞÔÏÖÉÔØ ÛÁÂÌÏÎ ÏÂÚÏÒÁ  : "
+
+#: src/lang.c:470
+#, c-format
+msgid	"Kill Subject:  [%s] (y/n): "
+msgstr	"õÎÉÞÔÏÖÉÔØ Subject:  [%s] (y/n): "
+
+#: src/lang.c:471
+msgid	"Kill text pattern   : "
+msgstr	"õÎÉÞÔÏÖÉÔØ ÛÁÂÌÏÎ    : "
+
+#: src/lang.c:472
+msgid	"Kill time in days   : "
+msgstr	"õÎÉÞÔÏÖÉÔØ ×ÒÅÍÑ × ÄÎÑÈ   : "
+
+#: src/lang.c:474
+msgid	"Last"
+msgstr	"ðÏÓÌÅÄÎÉÊ"
+
+#: src/lang.c:475
+msgid	"-- Last response --"
+msgstr	"-- ðÏÓÌÅÄÎÉÊ ÏÔ×ÅÔ --"
+
+#: src/lang.c:476
+#, c-format
+msgid	"Lines %s  "
+msgstr	"ìÉÎÉÊ %s  "
+
+#: src/lang.c:478
+msgid	"Message-ID: line              "
+msgstr	"Message-ID: ÓÔÒÏË              "
+
+#: src/lang.c:479
+msgid	"Mail"
+msgstr	""
+
+#: src/lang.c:480
+msgid	"mailbox "
+msgstr	""
+
+#: src/lang.c:481
+#, c-format
+msgid	"Mail article(s) to [%.*s]> "
+msgstr	"ðÏÓÌÁÔØ ÐÏ e-mail ÓÔÁÔØÀ(É) ÐÏ [%.*s]> "
+
+#: src/lang.c:482
+#, c-format
+msgid	"Mailing log to %s\n"
+msgstr	"ïÔÐÒÁ×ÉÔØ log %s\n"
+
+#: src/lang.c:483
+msgid	"Mail bug report..."
+msgstr	"ïÔÐÒÁ×ÌÑÅÔÓÑ bugreport ..."
+
+#: src/lang.c:484
+#, c-format
+msgid	"Mail BUG REPORT to %s?"
+msgstr	"ïÔÐÒÁ×ÉÔØ bugreport  %s?"
+
+#: src/lang.c:485
+msgid	"Mailed"
+msgstr	"ïÔÐÒÁ×ÌÅÎÏ ÐÏ e-mail"
+
+#: src/lang.c:486
+#, c-format
+msgid	"Mailing to %s..."
+msgstr	"ïÔÐÒÁ×ÌÑÅÔÓÑ ÐÏ e-mail %s..."
+
+#: src/lang.c:487
+msgid	"# [Mail/Save] active file. Format is like news active file:\n"
+	"#   groupname  max.artnum  min.artnum  /dir\n"
+	"# The 4th field is the basedir (ie. ~/Mail or ~/News)\n"
+	"#\n"
+msgstr	""
+
+#: src/lang.c:490
+#, c-format
+msgid	"%s marked as unread"
+msgstr	"%s ÐÏÍÅÞÅÎÏ ËÁË ÎÅÐÒÏÞÉÔÁÎÏ"
+
+#: src/lang.c:491
+#, c-format
+msgid	"Marked %d of %d tagged %s as read"
+msgstr	"ðÏÍÅÞÅÎÏ %d ÉÚ %d ÏÔÍÅÞÅÎÎÙÈ %s ËÁË ÐÒÏÞÉÔÁÎÏ"
+
+#: src/lang.c:492
+#, c-format
+msgid	"Mark all articles as read%s?"
+msgstr	"ðÏÍÅÔÉÔØ ×ÓÅ ÓÔÁÔØÉ ËÁË ÐÒÏÞÉÔÁÎÏ%s?"
+
+#: src/lang.c:493
+#, c-format
+msgid	"Mark %s=tagged articles, %s=current article, %s=quit: "
+msgstr	"íÁÒËÉÒÏ×ÁÔØ %s=ÐÏÍÅÞÅÎÎÙÅ ÓÔÁÔØÉ, %s=ÔÅËÕÝÕÀ ÓÔÁÔØÀ, %s=×ÙÈÏÄ: "
+
+#: src/lang.c:494
+#, c-format
+msgid	"Mark group %s as read?"
+msgstr	"ðÏÍÅÔÉÔØ ÇÒÕÐÐÕ %s ËÁË ÐÒÏÞÉÔÁÎÎÕÀ?"
+
+#: src/lang.c:495
+#, c-format
+msgid	"Mark thread as read%s?"
+msgstr	"ðÏÍÅÔÉÔØ ÎÉÔØ ËÁË ÐÒÏÞÉÔÁÎÎÕÀ %s?"
+
+#: src/lang.c:496
+#, c-format
+msgid	"Mark %s=tagged articles/threads, %s=current thread, %s=quit: "
+msgstr	"íÁÒËÉÒÏ×ÁÔØ %s=ÏÔÍÅÞÅÎÎÙÅ ÓÔÁÔØÉ/ÎÉÔÉ, %s=ÔÅËÕÝÕÀ ÎÉÔØ, %s=×ÙÈÏÄ: "
+
+#: src/lang.c:497
+#, c-format
+msgid	"Matching %s groups..."
+msgstr	"ðÒÏ×ÅÒËÁ %s ÇÒÕÐÐ..."
+
+#: src/lang.c:498 src/lang.c:502
+#, c-format
+msgid	"<n>=set current to n; %s=next unread; %s=search pattern; %s=kill/select"
+msgstr	"<n>=ÐÅÒÅÊÔÉ Ë n; %s=ÓÌÅÄ.ÎÅÐÒÏÞ.; %s=ÐÏÉÓË ÐÏ ÛÁÂÌÏÎÕ; %s=ÕÎÉÞÔ./×ÙÂÒÁÔØ"
+
+#: src/lang.c:499
+#, c-format
+msgid	"%s=author search; %s=catchup; %s=line down; %s=line up; %s=mark read; %s=list "
+	"thread"
+msgstr	"%s=ÐÏÉÓË Á×ÔÏÒ.; %s=catchup; %s=ÓÔÒ.×ÎÉÚ; %s=ÓÔÒ.××ÅÒÈ; %s=ÍÁÒË.ÐÒÏÞ.; %"
+	"s=ÓÐÉÓÏË ÄÉÓË."
+
+#: src/lang.c:500
+#, c-format
+msgid	"%s=line up; %s=line down; %s=page up; %s=page down; %s=top; %s=bottom"
+msgstr	"%s=ÓÔÒ.××ÅÒÈ; %s=ÓÔÒ.×ÎÉÚ; %s=ÓÔÒÁÎ.××ÅÒÈ; %s=ÓÔÒÁÎ.×ÎÉÚ; %s=ÎÁÞÁÌÏ; %s=ËÏÎÅÃ"
+
+#: src/lang.c:501
+#, c-format
+msgid	"%s=search forwards; %s=search backwards; %s=quit"
+msgstr	"%s=ÐÏÉÓË ×ÐÅÒÅÄ; %s=ÐÏÉÓË ÎÁÚÁÄ; %s=×ÙÈÏÄ"
+
+#: src/lang.c:503
+#, c-format
+msgid	"%s=author search; %s=body search; %s=catchup; %s=followup; %s=mark read"
+msgstr	"%s=ÐÏÉË Á×ÔÏÒ.; %s=ÐÏÉÓË ÔÅÌ.; %s=catchup; %s=followup; %s=ÍÁÒË.ÐÒÏÞ."
+
+#: src/lang.c:504
+#, c-format
+msgid	"<n>=set current to n; %s=next unread; %s,%s=search pattern; %s=catchup"
+msgstr	"<n>=ÐÅÒÅÊÔÉ Ë n; %s=ÓÌÅÄ.ÎÅÐÒÏÞ.; %s,%s=ÐÏÉÓË ÐÏ ÛÁÂÌÏÎÕ; %s=catchup"
+
+#: src/lang.c:505
+#, c-format
+msgid	"%s=line down; %s=line up; %s=help; %s=move; %s=quit; %s=toggle all/unread"
+msgstr	"%s=ÓÔÒ.×ÎÉÚ; %s=ÓÔÒ.××ÅÒÈ; %s=ÐÏÍÏÝØ; %s=ÐÅÒÅÍ.; %s=×ÙÈÏÄ; %s=[×ÓÅ|ÎÅÐÒÏÞ.]"
+
+#: src/lang.c:506
+#, c-format
+msgid	"%s=subscribe; %s=sub pattern; %s=unsubscribe; %s=unsub pattern; %s=yank in/out"
+msgstr	"%s=ÐÏÄÐÉÓÁÔØÓÑ; %s=ÐÏÄÐ.ÛÁÂÌÏÎ; %s=ÏÔÐÉÓÁÔØÓÑ; %s=ÏÔÐÉÓ.ÛÁÂÌÏÎ; %s=yank in/out"
+
+#: src/lang.c:507
+#, c-format
+msgid	"<n>=set current to n; %s=next unread; %s=catchup; %s=display toggle"
+msgstr	"<n>=ÐÅÒÅÊÔÉ Ë n; %s=ÓÌÅÄ.ÎÅÐÒÏÞ.; %s=catchup; %s=ÉÚÍÅÎ.ÐÏËÁÚ"
+
+#: src/lang.c:508
+#, c-format
+msgid	"%s=help; %s=line down; %s=line up; %s=quit; %s=tag; %s=mark unread"
+msgstr	"%s=ÐÏÍÏÝØ; %s=ÓÔÒ.×ÎÉÚ; %s=ÓÔÒ.××ÅÒÈ; %s=×ÙÈÏÄ; %s=ÍÁÒË.; %s=ÍÁÒË.ÎÅÐÒ."
+
+#: src/lang.c:509
+msgid	"--More--"
+msgstr	"--äÁÌÅÅ--"
+
+#: src/lang.c:510
+#, c-format
+msgid	"Moving %s..."
+msgstr	"ðÅÒÅÍÅÝÅÎÉÅ %s..."
+
+#: src/lang.c:512
+msgid	", name: "
+msgstr	", ÉÍÑ: "
+
+#: src/lang.c:513
+#, c-format
+msgid	"Goto newsgroup [%s]> "
+msgstr	"ðÅÒÅÊÔÉ Ë ÇÒÕÐÐÅ [%s]> "
+
+#: src/lang.c:514
+msgid	"newsgroups"
+msgstr	"ÇÒÕÐÐÙ"
+
+#: src/lang.c:515
+#, c-format
+msgid	"Position %s in group list (1,2,..,$) [%d]> "
+msgstr	"ðÏÚÉÃÉÑ %s × ÓÐÉÓËÅ ÇÒÕÐÐ (1,2,..,$) [%d]> "
+
+#: src/lang.c:516
+msgid	"newsgroup"
+msgstr	"ÇÒÕÐÐÁ"
+
+#: src/lang.c:517
+msgid	"Try and save newsrc file again?"
+msgstr	"ðÏÐÒÏÂÏ×ÁÔØ É ÓÏÈÒÁÎÉÔØ newsrc ÓÎÏ×Á?"
+
+#: src/lang.c:518
+msgid	"Warning: No newsgroups were written to your newsrc file. Save aborted."
+msgstr	"÷ÎÉÍÁÎÉÅ: çÒÕÐÐÙ ÎÅ ÂÙÌÉ ÚÁÐÉÓÁÎÙ × newsrc. óÏÈÒÁÎÅÎÉÅ ÐÒÅÒ×ÁÎÏ."
+
+#: src/lang.c:519
+msgid	"newsrc file saved successfully.\n"
+msgstr	"newsrc ÆÁÊÌ ÕÓÐÅÛÎÏ ÓÏÈÒÁÎÅÎ.\n"
+
+#: src/lang.c:520
+msgid	"-- Next response --"
+msgstr	"-- óÌÅÄÕÀÝÉÊ ÏÔ×ÅÔ --"
+
+#: src/lang.c:521
+#, c-format
+msgid	"NNTP authorization password not found for %s"
+msgstr	"NNTP ÐÁÒÏÌØ ÎÅ ÎÁÊÄÅÎ ÄÌÑ %s"
+
+#: src/lang.c:522
+msgid	"No  "
+msgstr	"îÅÔ  "
+
+#: src/lang.c:523
+msgid	"*** No articles ***"
+msgstr	"*** îÅÔ ÓÔÁÔÅÊ ***"
+
+#: src/lang.c:524
+msgid	"No articles have been posted"
+msgstr	"îÉ ÏÄÎÁ ÓÔÁÔØÑ ÎÅ ÂÙÌÁ ÏÔÐÒÁ×ÌÅÎÁ"
+
+#: src/lang.c:525
+msgid	"*** No description ***"
+msgstr	"*** îÅÔ ÏÐÉÓÁÎÉÑ ***"
+
+#: src/lang.c:526
+msgid	"No filename"
+msgstr	"îÅÔ ÉÍÅÎÉ ÆÁÊÌÁ"
+
+#: src/lang.c:527
+msgid	"No group"
+msgstr	"îÅÔ ÇÒÕÐÐÙ"
+
+#: src/lang.c:528
+msgid	"*** No groups ***"
+msgstr	"*** îÅÔ ÇÒÕÐÐ ***"
+
+#: src/lang.c:529
+msgid	"No more groups to read"
+msgstr	"îÅÔ ÂÏÌØÛÅ ÇÒÕÐÐ"
+
+#: src/lang.c:530
+msgid	"No last message"
+msgstr	"îÅÔ ÐÏÓÌÅÄÎÅÇÏ ÓÏÏÂÝÅÎÉÑ"
+
+#: src/lang.c:531
+msgid	"No mail address"
+msgstr	"îÅÔ ÁÄÒÅÓÁ e-mail"
+
+#: src/lang.c:532
+msgid	"No articles marked for saving"
+msgstr	"îÅÔ ÍÁÒËÉÒÏ×ÁÎÎÙÈ ÄÌÑ ÓÏÈÒÁÎÅÎÉÑ ÓÔÁÔÅÊ"
+
+#: src/lang.c:533
+msgid	"No match"
+msgstr	"îÅÔ ÓÏ×ÐÁÄÅÎÉÑ"
+
+#: src/lang.c:534
+msgid	"No more groups"
+msgstr	"âÏÌØÛÅ ÎÅÔ ÇÒÕÐÐ"
+
+#: src/lang.c:535
+msgid	"No newsgroups"
+msgstr	"îÅÔ ÇÒÕÐÐ"
+
+#: src/lang.c:536
+msgid	"No next unread article"
+msgstr	"îÅÔ ÓÌÅÄÕÀÝÅÊ ÎÅÐÒÏÞÉÔÁÎÎÏÊ ÓÔÁÔØÉ"
+
+#: src/lang.c:537
+msgid	"No previous group"
+msgstr	"îÅÔ ÐÒÅÄÙÄÕÝÅÊ ÇÒÕÐÐÙ"
+
+#: src/lang.c:538
+msgid	"No previous unread article"
+msgstr	"îÅÔ ÐÒÅÄÙÄÕÝÅÊ ÎÅÐÒÏÞÉÔÁÎÎÏÊ ÓÔÁÔØÉ"
+
+#: src/lang.c:539
+msgid	"No responses"
+msgstr	"îÅÔ ÏÔËÌÉËÏ×"
+
+#: src/lang.c:540
+msgid	"No responses to list in current thread"
+msgstr	"îÅÔ ÏÔ×ÅÔÏ× ÎÁ ÓÐÉÓÏË × ÔÅËÕÝÅÊ ÎÉÔÉ"
+
+#: src/lang.c:541
+msgid	"No search string"
+msgstr	"îÅÔ ÓÔÒÏËÉ ÐÏÉÓËÁ"
+
+#: src/lang.c:542
+msgid	"No subject"
+msgstr	"îÅÔ ÔÅÍÙ"
+
+#: src/lang.c:544
+#, c-format
+msgid	"%s: Terminal must have clear to end-of-line (ce)\n"
+msgstr	""
+
+#: src/lang.c:545
+#, c-format
+msgid	"%s: Terminal must have clear to end-of-screen (cd)\n"
+msgstr	""
+
+#: src/lang.c:546
+#, c-format
+msgid	"%s: Terminal must have clearscreen (cl) capability\n"
+msgstr	"%s: ôÅÒÍÉÎÁÌ ÄÏÌÖÅÎ ÉÍÅÔØ clearscreen (cl) ÆÕÎËÃÉÀ\n"
+
+#: src/lang.c:547
+#, c-format
+msgid	"%s: Terminal must have cursor motion (cm)\n"
+msgstr	"%s: ôÅÒÍÉÎÁÌ ÄÏÌÖÅÎ ÉÍÅÔØ cursor motion (cm)\n"
+
+#: src/lang.c:548
+#, c-format
+msgid	"%s: TERM variable must be set to use screen capabilities\n"
+msgstr	"%s: ÐÅÒÅÍÅÎÎÁÑ ÏËÒÕÖÅÎÉÑ TERM ÄÏÌÖÎÁ ÂÙÔØ ÕÓÔÁÎÏ×ÌÅÎÁ ÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ "
+	"ÓÐÏÓÏÂÎÏÓÔÅÊ ÜËÒÁÎÁ\n"
+
+#: src/lang.c:550
+#, c-format
+msgid	"No viewer found for %s/%s\n"
+msgstr	"îÅ ÎÁÊÄÅÎ ÐÒÏÓÍÏÔÏÒÝÉË ÄÌÑ %s/%s\n"
+
+#: src/lang.c:551
+msgid	"Newsgroup does not exist on this server"
+msgstr	"çÒÕÐÐÁ ÎÅ ÓÕÝÅÓÔ×ÕÅÔ ÎÁ ÜÔÏÍ ÓÅÒ×ÅÒÅ"
+
+#: src/lang.c:552
+#, c-format
+msgid	"Group %s not found in active file"
+msgstr	"çÒÕÐÐÁ %s ÎÅ ÎÁÊÄÅÎÁ × ÆÁÊÌÅ active"
+
+#: src/lang.c:553
+msgid	"c)reate it, use a)lternative name, use d)efault .newsrc, q)uit tin: "
+msgstr	"c)ÓÏÚÄÁÔØ, a)ÉÓÐ.ÄÒÕÇÏÅ ÉÍÑ, d)ÉÓÐ.ÓÔÁÎÄ. .newsrc, q)×ÙÈÏÄ ÉÚ tin: "
+
+#: src/lang.c:554
+msgid	"use a)lternative name, use d)efault .newsrc, q)uit tin: "
+msgstr	"a)ÉÓÐ.ÄÒÕÇÏÅ ÉÍÑ, ÉÓÐ.ÓÔÁÎÄ. .newsrc, q)×ÙÈÏÄ ÉÚ tin: "
+
+#: src/lang.c:555
+#, c-format
+msgid	"# NNTP-server -> newsrc translation table and NNTP-server\n"
+	"# shortname list for %s %s\n"
+	"#\n"
+	"# the format of this file is\n"
+	"#   <FQDN of NNTP-server> <newsrc file> <shortname> ...\n"
+	"#\n"
+	"# if <newsrc file> is given without path, $HOME is assumed as its location\n"
+	"#\n"
+	"# examples:\n"
+	"#   news.tin.org  .newsrc-tin.org  tinorg\n"
+	"#   news.ka.nu    /tmp/nrc-nu      kanu    nu\n"
+	"#\n"
+msgstr	""
+
+#: src/lang.c:562
+msgid	"Only"
+msgstr	"ôÏÌØËÏ"
+
+#: src/lang.c:563
+#, c-format
+msgid	"Option not enabled. Recompile with %s."
+msgstr	"ïÐÃÉÑ ÎÅ ×ËÌÀÞÅÎÁ. ðÅÒÅÓÏÂÅÒÉÔÅ ÐÁËÅÔ Ó %s."
+
+#: src/lang.c:564
+msgid	"Options Menu"
+msgstr	"íÅÎÀ ïÐÃÉÊ"
+
+#: src/lang.c:567
+#, c-format
+msgid	"Error in regex: %s at pos. %d '%s'"
+msgstr	"ïÛÉÂËÁ × regex: %s × ÐÏÚ. %d '%s'"
+
+#: src/lang.c:568
+#, c-format
+msgid	"Error in regex: pcre internal error %d"
+msgstr	"ïÛÉÂËÁ × regex: pcre ×ÎÕÔÒ. ÏÛÉÂËÁ %d"
+
+#: src/lang.c:569
+#, c-format
+msgid	"Error in regex: study - pcre internal error %s"
+msgstr	"ïÛÉÂËÁ × regex: study - pcre ×ÎÕÔÒ. ÏÛÉÂËÁ %s"
+
+#: src/lang.c:570
+msgid	"Post a followup..."
+msgstr	"ïÔÐÒÁ×ÌÅÎÉÅ ÏÔ×ÅÔÁ × ÇÒÕÐÐÕ..."
+
+#. TODO: replace hardcoded key-name in txt_post_error_ask_postpone
+#: src/lang.c:572
+msgid	"An error has occurred while posting the article. If you think that this\n"
+	"error is temporary or otherwise correctable, you can postpone the article\n"
+	"and pick it up again with ^O later.\n"
+msgstr	"ïÛÉÂËÁ ×Ï ×ÒÅÍÑ ÏÔÐÒÁ×ÌÅÎÉÑ ÓÔÁÔØÉ. åÓÌÉ ÷Ù ÄÕÍÁÅÔÅ, ÞÔÏ ÏÛÉÂËÁ ×ÒÅÍÅÎÎÁÑ\n"
+	"É ËÏÒÒÅËÔÉÒÕÅÍÁÑ, ÷Ù ÍÏÖÅÔÅ ÏÔÌÏÖÉÔØ ÓÔÁÔØÀ É ÏÔÐÒÁ×ÉÔØ ÐÏÚÖÅ Ó ÐÏÍÏÝØÀ ^O\n"
+
+#: src/lang.c:575
+msgid	"Posted articles history"
+msgstr	"ïÔÐÒÁ×ÌÅÎÁ ÉÓÔÏÒÉÑ ÓÔÁÔÅÊ"
+
+#: src/lang.c:576
+#, c-format
+msgid	"Post to newsgroup(s) [%s]> "
+msgstr	"ïÔÐÒÁ×ÉÔØ × ÇÒÕÐÐÕ(Ù) [%s]> "
+
+#: src/lang.c:577
+msgid	"-- post processing started --"
+msgstr	"-- ÏÂÒÁÂÏÔËÁ ÎÁÞÁÔÁ --"
+
+#: src/lang.c:578
+msgid	"-- post processing completed --"
+msgstr	"-- ÏÂÒÁÂÏÔËÁ ÚÁËÏÎÞÅÎÁ --"
+
+#: src/lang.c:579
+#, c-format
+msgid	"Post subject [%s]> "
+msgstr	"ôÅÍÁ ÓÏÏÂÝÅÎÉÑ [%s]> "
+
+#: src/lang.c:580
+msgid	"# Summary of mailed/posted messages viewable by 'W' command from within tin.\n"
+msgstr	"# ó×ÏÄËÁ ÏÔÐÒÁ×ÌÅÎÎÙÈ × ÇÒÕÐÐÕ/ÐÏ e-mail ÓÏÏÂÝÅÎÉÊ ×ÙÚÙ×ÁÅÔÓÑ ËÏÍÁÎÄÏÊ  'W' "
+	"ÉÚtin.\n"
+
+#: src/lang.c:581
+msgid	"Posting article..."
+msgstr	"ïÔÐÒÁ×ÌÅÎÉÅ × ÇÒÕÐÐÕ ÓÔÁÔØÉ..."
+
+#: src/lang.c:582
+#, c-format
+msgid	"Post postponed articles [%%s]? (%s/%s/%s/%s/%s): "
+msgstr	"ïÔÐÒÁ×ÉÔØ ÏÔÌÏÖÅÎÎÙÅ ÓÔÁÔØÉ [%%s]? (%s/%s/%s/%s/%s): "
+
+#: src/lang.c:583
+#, c-format
+msgid	"Hot %s"
+msgstr	""
+
+#: src/lang.c:584
+#, c-format
+msgid	"Tagged %s"
+msgstr	"ðÏÍÅÞÅÎÙ %s"
+
+#: src/lang.c:585
+#, c-format
+msgid	"Untagged %s"
+msgstr	"óÎÑÔÙ ÏÔÍÅÔËÉ %s"
+
+#: src/lang.c:586
+msgid	"Processing mail messages marked for deletion."
+msgstr	"ïÂÒÁÂÏÔËÁ e-mail ÐÏÍÅÞÅÎÎÙÈ ÄÌÑ ÕÄÁÌÅÎÉÑ."
+
+#: src/lang.c:587
+msgid	"Processing saved articles marked for deletion."
+msgstr	"ïÂÒÁÂÏÔËÁ ÓÏÈÒ. ÓÔÁÔÅÊ ÐÏÍÅÞÅÎÎÙÈ ÄÌÑ ÕÄÁÌÅÎÉÑ."
+
+#: src/lang.c:588
+#, c-format
+msgid	"Accept Followup-To? %s=post, %s=ignore, %s=quit: "
+msgstr	"ðÒÉÎÑÔØ Followup-To? %s=ÏÔÐÒÁ×ÉÔØ, %s=ÉÇÎÏÒ., %s=×ÙÈÏÄ: "
+
+#: src/lang.c:589
+msgid	"Article unchanged, abort mailing?"
+msgstr	"óÔÁÔØÑ ÎÅ ÉÚÍÅÎÉÌÁÓØ, ÐÒÅÒ×ÁÔØ ÏÔÐÒÁ×ËÕ?"
+
+#: src/lang.c:590
+#, c-format
+msgid	"Do you want to see postponed articles (%d)?"
+msgstr	"èÏÔÉÔÅ ÐÏÓÍÏÔÒÅÔØ ÏÔÌÏÖÅÎÎÙÅ ÓÔÁÔØÉ (%d)?"
+
+#: src/lang.c:592
+msgid	"Add quick kill filter?"
+msgstr	"äÏÂÁ×ÉÔØ ÂÙÓÔÒÙÊ ÕÎÉÞÔ. ÆÉÌØÔÒ?"
+
+#: src/lang.c:593
+msgid	"Add quick selection filter?"
+msgstr	"äÏÂÁ×ÉÔØ ÂÙÓÔÒ. ÓÅÌÅË. ÆÉÌØÔÒ?"
+
+#: src/lang.c:594
+msgid	"Do you really want to quit?"
+msgstr	"÷Ù ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÈÏÔÉÔÅ ×ÙÊÔÉ?"
+
+#: src/lang.c:595
+#, c-format
+msgid	"%s=edit cancel message, %s=quit, %s=delete (cancel) [%%s]: "
+msgstr	"%s=ÒÅÄÁËÔ.ÏÔÍÅÎ.ÓÏÏÂÝÅÎÉÅ , %s=×ÙÈÏÄ, %s=ÕÄÁÌÉÔØ (ÏÔÍÅÎÉÔØ) [%%s]: "
+
+#: src/lang.c:596
+msgid	"You have tagged articles in this group - quit anyway?"
+msgstr	"ïÓÔÁÌÉÓØ ÐÏÍÅÞÅÎÎÙÅ ÓÔÁÔØÉ × ÇÒÕÐÐÅ - ×ÙÊÔÉ ×ÓÅ ÒÁ×ÎÏ?"
+
+#: src/lang.c:597
+#, c-format
+msgid	"%s=quit, %s=edit, %s=postpone: "
+msgstr	"%s=×ÙÈÏÄ, %s=ÒÅÄÁËÔÉÒÏ×ÁÔØ, %s=ÏÔÌÏÖÉÔØ: "
+
+#: src/lang.c:598
+#, c-format
+msgid	"%s=quit %s=edit %s=save kill description: "
+msgstr	"%s=×ÙÈÏÄ %s=ÒÅÄÁËÔÉÒÏ×ÁÔØ %s=ÓÏÈÒ.ÕÎÉÞÔ. ÏÐÉÓÁÎÉÅ: "
+
+#: src/lang.c:599
+#, c-format
+msgid	"%s=quit %s=edit %s=save select description: "
+msgstr	"%s=×ÙÈÏÄ %s=ÒÅÄÁËÔÉÒÏ×ÁÔØ %s=ÓÏÈÒ.×ÙÂÒ. ÏÐÉÓÁÎÉÅ: "
+
+#: src/lang.c:600
+msgid	"Do you really want to quit without saving your configuration?"
+msgstr	"÷Ù ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÈÏÔÉÔÅ ×ÙÊÔÉ ÂÅÚ ÓÏÈÒÁÎÅÎÉÑ ËÏÎÆÉÇÕÒÁÃÉÉ?"
+
+#: src/lang.c:603
+msgid	"Invalid range - valid are '0-9.$' eg. 1-$"
+msgstr	"îÅÄÏÐÕÓÔÉÍÙÊ ÄÉÁÐÁÚÏÎ - ÐÒÁ×ÉÌØÎÏ: '0-9.$' ÎÁÐÒÉÍÅÒ 1-$"
+
+#: src/lang.c:604
+msgid	"Do you want to abort this operation?"
+msgstr	"÷Ù ÈÏÔÉÔÅ ÐÒÅÒ×ÁÔØ ÏÐÅÒÁÃÉÀ?"
+
+#: src/lang.c:605
+msgid	"Do you want to exit tin immediately?"
+msgstr	"÷Ù ÈÏÔÉÔÅ ×ÙÊÔÉ ÉÚ tin ÎÅÍÅÄÌÅÎÎÏ?"
+
+#: src/lang.c:606
+msgid	"Read response> "
+msgstr	"ðÒÏÞÉÔÁÔØ ÏÔ×ÅÔ> "
+
+#: src/lang.c:607
+msgid	"Reading ('q' to quit)..."
+msgstr	"þÔÅÎÉÅ ('q' - ×ÙÈÏÄ)..."
+
+#: src/lang.c:608
+#, c-format
+msgid	"Reading %sarticles..."
+msgstr	"þÔÅÎÉÅ %sÓÔÁÔÅÊ..."
+
+#: src/lang.c:609
+#, c-format
+msgid	"Reading %sattributes file...\n"
+msgstr	"þÔÅÎÉÅ %sattributes ÆÁÊÌÁ...\n"
+
+#: src/lang.c:610
+#, c-format
+msgid	"Reading %sconfig file...\n"
+msgstr	"þÔÅÎÉÅ %sconfig ÆÁÊÌÁ...\n"
+
+#: src/lang.c:611
+msgid	"Reading filter file...\n"
+msgstr	"þÔÅÎÉÅ filter ÆÁÊÌÁ...\n"
+
+#: src/lang.c:612
+#, c-format
+msgid	"Reading %s groups..."
+msgstr	"þÔÅÎÉÅ %s ÇÒÕÐÐ..."
+
+#: src/lang.c:613
+msgid	"Reading input history file...\n"
+msgstr	"þÔÅÎÉÅ ÆÁÊÌÁ ÉÓÔÏÒÉÉ...\n"
+
+#: src/lang.c:614
+msgid	"Reading keymap file...\n"
+msgstr	"þÔÅÎÉÅ keymap ÆÁÊÌÁ...\n"
+
+#: src/lang.c:615
+msgid	"Reading groups from active file... "
+msgstr	"þÔÅÎÉÅ ÇÒÕÐÐ ÉÚ active ÆÁÊÌÁ... "
+
+#: src/lang.c:616
+msgid	"Reading groups from newsrc file... "
+msgstr	"þÔÅÎÉÅ ÇÒÕÐÐ ÉÚ ÆÁÊÌÁ newsrc... "
+
+#: src/lang.c:617
+msgid	"Reading newsgroups file... "
+msgstr	"þÔÁÎÉÅ ÆÁÊÌÁ ÇÒÕÐÐ... "
+
+#: src/lang.c:618
+msgid	"Reading newsrc file..."
+msgstr	"þÔÅÎÉÅ ÆÁÊÌÁ newsrc..."
+
+#: src/lang.c:620
+#, c-format
+msgid	"(%d:%02d remaining)"
+msgstr	"(%d:%02d ÏÓÔÁÌÏÓØ)"
+
+#: src/lang.c:622
+#, c-format
+msgid	"Bogus group %s removed."
+msgstr	"ïÛÉÂ. ÇÒÕÐÐÁ %s ÕÄÁÌÅÎÁ."
+
+#: src/lang.c:623
+#, c-format
+msgid	"Error: rename %s to %s"
+msgstr	"ïÛÉÂËÁ: ÐÅÒÅÉÍÅÎÏ×ÁÔØ %s × %s"
+
+#: src/lang.c:624
+msgid	"Reply to author..."
+msgstr	"ïÔ×ÅÞÁÅÍ Á×ÔÏÒÕ..."
+
+#: src/lang.c:625
+msgid	"Repost"
+msgstr	"ðÅÒÅÏÔÐÒÁ×ÉÔØ"
+
+#: src/lang.c:626
+msgid	"Reposting article..."
+msgstr	"ðÅÒÅÏÔÐÒÁ×ÌÅÎÉÅ ÓÔÁÔØÉ..."
+
+#: src/lang.c:627
+#, c-format
+msgid	"Repost article(s) to group(s) [%s]> "
+msgstr	"ïÔÐÒÁ×ÉÔØ ÓÎÏ×Á ÓÔÁÔØÀ(É) × ÇÒÕÐÐÕ(Ù) [%s]> "
+
+#: src/lang.c:628
+msgid	"Reset newsrc?"
+msgstr	"óÂÒÏÓÉÔØ newsrc?"
+
+#: src/lang.c:629
+msgid	"Responses have been directed to the following newsgroups"
+msgstr	"ïÔ×ÅÔÙ ÂÙÌÉ ÐÅÒÅÎÁÐÒÁ×ÌÅÎÙ × ÓÌÅÄÕÀÝÉÅ ÇÒÕÐÐÙ"
+
+#: src/lang.c:630
+#, c-format
+msgid	"Responses have been directed to poster. %s=mail, %s=post, %s=quit: "
+msgstr	"ïÔ×ÅÔÙ ÂÙÌÉ ÐÅÒÅÎÁÐÒÁ×ÌÅÎÙ ÏÔÐÒÁ×ÉÔÅÌÀ. %s=e-mail, %s=ÏÔÐÒÁ×ÉÔØ, %s=×ÙÈÏÄ: "
+
+#: src/lang.c:631
+#, c-format
+msgid	"RespNo %4d of %4d"
+msgstr	""
+
+#: src/lang.c:632
+msgid	"Press <RETURN> to continue..."
+msgstr	"îÁÖÍÉÔÅ <÷÷ïä> ÄÌÑ ÐÒÏÄÏÌÖÅÎÉÑ..."
+
+#: src/lang.c:634
+#, c-format
+msgid	"Select From    [%s] (y/n): "
+msgstr	"÷ÙÂÒÁÔØ ÉÚ    [%s] (y/n): "
+
+#: src/lang.c:635
+msgid	"Select Lines: (</>num): "
+msgstr	"÷ÙÂÒÁÔØ ÓÔÒÏËÉ: (</>num): "
+
+#: src/lang.c:636
+msgid	"Auto-select Article Menu"
+msgstr	"á×ÔÏ-×ÙÂÏÒ íÅÎÀ óÔÁÔÅÊ"
+
+#: src/lang.c:637
+#, c-format
+msgid	"Select Msg-Id  [%s] (f/l/o/n): "
+msgstr	"÷ÙÂÒÁÔØ Msg-Id  [%s] (f/l/o/n): "
+
+#: src/lang.c:638
+msgid	"Select pattern scope: "
+msgstr	"÷ÙÂÒÁÔØ ÏÂÌÁÓÔØ ÛÁÂÌÏÎÁ: "
+
+#: src/lang.c:639
+#, c-format
+msgid	"Select Subject [%s] (y/n): "
+msgstr	"÷ÙÂÒÁÔØ ôÅÍÕ [%s] (y/n): "
+
+#: src/lang.c:640
+msgid	"Select text pattern : "
+msgstr	"÷ÙÂÒÁÔØ ÛÁÂÌÏÎ : "
+
+#: src/lang.c:641
+msgid	"Select time in days   : "
+msgstr	"÷ÙÂÒÁÔØ ×ÒÅÍÑ  : "
+
+#: src/lang.c:642
+#, c-format
+msgid	"# %s server configuration file\n"
+	"# This file was automatically saved by %s %s %s (\"%s\")\n"
+	"#\n"
+	"# Do not edit while %s is running, since all your changes to this file\n"
+	"# will be overwritten when you leave %s.\n"
+	"# Do not edit at all if you don't know what you do.\n"
+	"############################################################################\n"
+	"\n"
+msgstr	""
+
+#: src/lang.c:648
+msgid	"Showing unread groups only"
+msgstr	"ðÏËÁÚ ÔÏÌØËÏ ÎÅÐÒÏÞÉÔÁÎÎÙÈ ÇÒÕÐÐ"
+
+#: src/lang.c:649
+msgid	"Subject: line (ignore case)   "
+msgstr	"ôÅÍÁ: ÓÔÒÏËÁ (ÉÇÎÏÒÉÒÏ×ÁÔØ ÒÅÇÉÓÔÒ)   "
+
+#: src/lang.c:650
+msgid	"Subject: line (case sensitive)"
+msgstr	"ôÅÍÁ: ÓÔÒÏËÁ (ÎÅ ÉÇÎÏÒÉÒÏ×ÁÔØ ÒÅÇÉÓÔÒ)   "
+
+#: src/lang.c:651
+msgid	"Save"
+msgstr	"óÏÈÒÁÎÉÔØ"
+
+#: src/lang.c:652
+#, c-format
+msgid	"Save '%s' (%s/%s)?"
+msgstr	"óÏÈÒÁÎÉÔØ '%s' (%s/%s)?"
+
+#: src/lang.c:653
+msgid	"Save configuration before continuing?"
+msgstr	"óÏÈÒÁÎÉÔØ ËÏÎÆÉÇÕÒÁÃÉÀ ÐÅÒÅÄ ÐÒÏÄÏÌÖÅÎÉÅÍ?"
+
+#: src/lang.c:654
+msgid	"Save filename> "
+msgstr	"óÏÈÒ. × ÆÁÊÌ> "
+
+#: src/lang.c:655
+msgid	"Saved"
+msgstr	"óÏÈÒÁÎÅÎÏ"
+
+#: src/lang.c:656
+#, c-format
+msgid	"%4d unread (%4d hot) %s in %s\n"
+msgstr	"%4d ÎÅÐÒÏÞÉÔÁÎÏ (%4d hot) %s × %s\n"
+
+#: src/lang.c:657
+#, c-format
+msgid	"Saved %s...\n"
+msgstr	"óÏÈÒÁÎÅÎÏ %s...\n"
+
+#: src/lang.c:658
+msgid	"Nothing was saved"
+msgstr	"îÉÞÅÇÏ ÎÅ ÂÙÌÏ ÓÏÈÒÁÎÅÎÏ"
+
+#: src/lang.c:659
+#, c-format
+msgid	"\n"
+	"%s %d %s from %d %s\n"
+msgstr	"\n"
+	"%s %d %s ÉÚ %d %s\n"
+
+#: src/lang.c:660
+#, c-format
+msgid	"-- %s saved to %s%s --"
+msgstr	"-- %s ÓÏÈÒÁÎÅÎÏ × %s%s --"
+
+#: src/lang.c:661
+#, c-format
+msgid	"-- %s saved to %s - %s --"
+msgstr	"-- %s ÓÏÈÒÁÎÅÎÏ × %s - %s --"
+
+#: src/lang.c:662
+msgid	"Saving..."
+msgstr	"úÁÐÉÓØ..."
+
+#: src/lang.c:663
+#, c-format
+msgid	"%s: Screen initialization failed"
+msgstr	"%s: îÅÕÄÁÞÎÁÑ ÉÎÉÃÉÁÌÉÚÁÃÉÑ ÜËÒÁÎÁ"
+
+#: src/lang.c:665
+#, c-format
+msgid	"%s: screen is too small\n"
+msgstr	"%s: ÜËÒÁÎ ÓÌÉÛËÏÍ ÍÁÌÅÎØËÉÊ\n"
+
+#: src/lang.c:667
+#, c-format
+msgid	"screen is too small, %s is exiting\n"
+msgstr	"ÜËÒÁÎ ÓÌÉÛËÏÍ ÍÁÌÅÎØËÉÊ, %s ×ÙÈÏÄ\n"
+
+#: src/lang.c:668
+#, c-format
+msgid	"Search backwards [%s]> "
+msgstr	"ðÏÉÓË ÎÁÚÁÄ [%s]> "
+
+#: src/lang.c:669
+#, c-format
+msgid	"Search body [%s]> "
+msgstr	"ðÏÉÓË ÐÏ ÔÅÌÕ [%s]> "
+
+#: src/lang.c:670
+#, c-format
+msgid	"Search forwards [%s]> "
+msgstr	"ðÏÉÓË ×ÐÅÒÅÄ [%s]> "
+
+#: src/lang.c:671
+msgid	"Searching..."
+msgstr	"ðÏÉÓË..."
+
+#: src/lang.c:672
+#, c-format
+msgid	"Searching article %d of %d ('q' to abort)..."
+msgstr	"ðÏÉÓË ÓÔÁÔØÉ %d ÉÚ %d ('q' - ×ÙÈÏÄ)..."
+
+#: src/lang.c:673
+msgid	"Select article> "
+msgstr	"÷ÙÂÅÒÉÔÅ ÓÔÁÔØÀ> "
+
+#: src/lang.c:674
+msgid	"Select option number before text or use arrow keys and <CR>. 'q' to quit."
+msgstr	"÷ÙÂÅÒÉÔÅ ÎÏÍÅÒ ÏÐÃÉÉ ÉÌÉ ÐÅÒÅÊÄÉÔÅ ÓÔÒÅÌÏÞËÁÍÉ É ÎÁÖÍÉÔÅ <÷÷ïä>. 'q'-×ÙÈÏÄ."
+
+#: src/lang.c:675
+msgid	"Select group> "
+msgstr	"÷ÙÂÅÒÉÔÅ ÇÒÕÐÐÕ> "
+
+#: src/lang.c:676
+#, c-format
+msgid	"Enter selection pattern [%s]> "
+msgstr	"÷×ÅÄÉÔÅ ÛÁÂÌÏÎ ÄÌÑ ×ÙÂÏÒÁ [%s]> "
+
+#: src/lang.c:677
+msgid	"Select thread > "
+msgstr	"÷ÙÂÅÒÉÔÅ ÄÉÓËÕÓÓÉÀ > "
+
+#: src/lang.c:678
+#, c-format
+msgid	"%s %s %s (\"%s\") [%s]: send a DETAILED bug report to %s\n"
+msgstr	"%s %s %s (\"%s\") [%s]: ÐÏÛÌÉÔÅ ðïìîùê bugreport ÎÁ %s\n"
+
+#: src/lang.c:679
+msgid	"servers active-file"
+msgstr	"active-ÆÁÊÌ ÓÅÒ×ÅÒÏ×"
+
+#: src/lang.c:680
+msgid	"Cannot move into new newsgroups. Subscribe first..."
+msgstr	"îÅ ÍÏÇÕ ÐÅÒÅÊÔÉ × ÎÏ×ÕÀ ÇÒÕÐÐÕ. óÎÁÞÁÌÁ ÐÏÄÐÉÛÉÔÅÓØ..."
+
+#: src/lang.c:681
+msgid	"<SPACE>"
+msgstr	"<ðòïâåì>"
+
+#: src/lang.c:682
+#, c-format
+msgid	"Starting: (%s)"
+msgstr	"óÔÁÒÔÕÀ: (%s)"
+
+#: src/lang.c:683
+#, c-format
+msgid	"List Thread (%d of %d)"
+msgstr	"ðÏËÁÚ äÉÓËÕÓÓÉÊ (%d of %d)"
+
+#: src/lang.c:684
+#, c-format
+msgid	"Thread (%.*s)"
+msgstr	"äÉÓËÕÓÓÉÑ (%.*s)"
+
+#: src/lang.c:685
+msgid	"Enter wildcard subscribe pattern> "
+msgstr	"÷×ÅÄÉÔÅ wildcard - ÛÁÂÌÏÎ ÄÌÑ ÐÏÄÐÉÓËÉ> "
+
+#: src/lang.c:686
+#, c-format
+msgid	"subscribed to %d groups"
+msgstr	"ÐÏÄÐÉÓÁÌÉÓØ ÎÁ %d ÇÒÕÐÐ"
+
+#: src/lang.c:687
+#, c-format
+msgid	"Subscribed to %s"
+msgstr	"ðÏÄÐÉÓÁÌÉÓØ ÎÁ %s"
+
+#: src/lang.c:688
+msgid	"Subscribing... "
+msgstr	"ðÏÄÐÉÓÙ×ÁÅÍÓÑ... "
+
+#: src/lang.c:689
+#, c-format
+msgid	"Repost or supersede article(s) [%%s]? (%s/%s/%s): "
+msgstr	"ïÔÐÒÁ×ÉÔØ ÓÎÏ×Á ÉÌÉ ÚÁÍÅÎÉÔØ ÓÔÁÔØÀ(É) [%%s]? (%s/%s/%s): "
+
+#: src/lang.c:690
+#, c-format
+msgid	"Supersede article(s) to group(s) [%s]> "
+msgstr	"úÁÍÅÎÉÔØ ÓÔÁÔØÀ(É) × ÇÒÕÐÐÕ(Ù) [%s]> "
+
+#: src/lang.c:691
+msgid	"Superseding article ..."
+msgstr	"úÁÍÅÎÁ ÓÔÁÔØÉ ..."
+
+#: src/lang.c:692
+#, c-format
+msgid	"\n"
+	"Stopped. Type 'fg' to restart %s\n"
+msgstr	"\n"
+	"ïÓÔÁÎÏ×ÌÅÎÏ. îÁÂÅÒÉÔÅ 'fg' ÄÌÑ ÐÅÒÅÚÁÐÕÓËÁ %s\n"
+
+#: src/lang.c:694
+#, c-format
+msgid	"%d days"
+msgstr	"%d ÄÎÅÊ"
+
+#: src/lang.c:695
+msgid	"<TAB>"
+msgstr	"<TAâ>"
+
+#: src/lang.c:696
+msgid	"TeX "
+msgstr	""
+
+#: src/lang.c:697
+msgid	"# Default action/prompt strings\n"
+msgstr	""
+
+#: src/lang.c:698
+msgid	"# Defaults for quick (1 key) kill & auto-selection filters\n"
+	"# header=NUM  0,1=Subject: 2,3=From: 4=Message-ID: & full References: line\n"
+	"#             5=Message-ID: & last References: entry only\n"
+	"#             6=Message-ID: entry only 7=Lines:\n"
+	"# global=ON/OFF  ON=apply to all groups OFF=apply to current group\n"
+	"# case=ON/OFF    ON=filter case sensitive OFF=ignore case\n"
+	"# expire=ON/OFF  ON=limit to default_filter_days OFF=don't ever expire\n"
+msgstr	""
+
+#: src/lang.c:711
+msgid	"# If ON use print current subject or newsgroup description in the last line\n"
+msgstr	""
+
+#: src/lang.c:712
+msgid	"# Host & time info used for detecting new groups (don't touch)\n"
+msgstr	""
+
+#: src/lang.c:713
+msgid	"There is no news\n"
+msgstr	"îÅÔ ÎÏ×ÏÓÔÅÊ\n"
+
+#: src/lang.c:714
+msgid	"Thread"
+msgstr	"äÉÓËÕÓÓÉÑ"
+
+#: src/lang.c:715
+msgid	"Thread Level Commands"
+msgstr	"ëÏÍÁÎÄÙ õÒÏ×ÎÑ äÉÓËÕÓÓÉÊ"
+
+#: src/lang.c:716
+msgid	"Thread deselected"
+msgstr	"ó ÄÉÓËÕÓÓÉÉ ÓÎÑÔÁ ÏÔÍÅÔËÁ"
+
+#: src/lang.c:717
+msgid	"Thread selected"
+msgstr	"äÉÓËÕÓÓÉÑ ×ÙÂÒÁÎÁ"
+
+#: src/lang.c:719
+msgid	"threads"
+msgstr	"ÄÉÓËÕÓÓÉÊ"
+
+#: src/lang.c:721
+msgid	"Thread range"
+msgstr	"äÉÁÐÁÚÏÎ ÄÉÓËÕÓÓÉÉ"
+
+#: src/lang.c:722
+msgid	"thread"
+msgstr	"ÄÉÓËÕÓÓÉÑ"
+
+#: src/lang.c:723
+#, c-format
+msgid	"Thread %4s of %4s"
+msgstr	"äÉÓËÕÓÓÉÑ %4s ÉÚ %4s"
+
+#: src/lang.c:724
+msgid	"Threading articles..."
+msgstr	"òÁÚÂÏÒ ÄÉÓËÕÓÓÉÊ..."
+
+#: src/lang.c:725
+#, c-format
+msgid	"Toggled word highlighting %s"
+msgstr	"ðÅÒÅËÌÀÞÅÎÉÅ ÐÏÄÓ×ÅÔËÉ ÓÌÏ× %s"
+
+#: src/lang.c:726
+msgid	"Toggled rot13 encoding"
+msgstr	"ðÅÒÅËÌÀÞÅÎÉÅ rot13 ËÏÄÉÒÏ×ËÉ"
+
+#: src/lang.c:727
+#, c-format
+msgid	"Toggled german TeX encoding %s"
+msgstr	"ðÅÒÅËÌÀÞÅÎÉÅ ÎÅÍÅÃËÏÊ TeX ËÏÄÉÒÏ×ËÉ %s"
+
+#: src/lang.c:728
+#, c-format
+msgid	"Toggled tab-width to %d"
+msgstr	"ðÅÒÅËÌÀÞÅÎÉÅ ÛÉÒÉÎÙ TAâ ÎÁ %d"
+
+#: src/lang.c:729
+#, c-format
+msgid	"%d Trying to dotlock %s"
+msgstr	""
+
+#: src/lang.c:730
+#, c-format
+msgid	"%d Trying to lock %s"
+msgstr	"%d ðÏÐÙÔËÁ ÚÁÂÌÏËÉÒÏ×ÁÔØ %s"
+
+#: src/lang.c:731
+msgid	"           h=help\n"
+msgstr	"           h=ÐÏÍÏÝØ\n"
+
+#: src/lang.c:733
+msgid	"Unlimited"
+msgstr	"îÅÏÇÒÁÎÉÞÅÎ"
+
+#: src/lang.c:734
+msgid	"Enter wildcard unsubscribe pattern> "
+msgstr	"÷×ÅÄÉÔÅ wildcard ÏÔÐÉÓÎÏÊ ÛÁÂÌÏÎ> "
+
+#: src/lang.c:735
+#, c-format
+msgid	"Error decoding %s : %s"
+msgstr	"ïÛÉÂËÁ ÒÁÓËÏÄÉÒÏ×ÁÎÉÑ %s : %s"
+
+#: src/lang.c:736
+msgid	"No end."
+msgstr	"îÅÔ ËÏÎÃÁ."
+
+#: src/lang.c:737
+#, c-format
+msgid	"%s successfully decoded."
+msgstr	"%s ÕÓÐÅÛÎÏ ÒÁÓËÏÄÉÒÏ×ÁÎ."
+
+#: src/lang.c:738
+#, c-format
+msgid	"%*s[-- %s/%s, %suuencoded file, %d lines, name: %s --]\n"
+	"\n"
+msgstr	"%*s[-- %s/%s, %suuencoded ÆÁÊÌ, %d ÓÔÒÏË, ÉÍÑ: %s --]\n"
+	"\n"
+
+#: src/lang.c:739
+msgid	"unread "
+msgstr	"ÎÅÐÒÏÞÉÔÁÎÏ "
+
+#: src/lang.c:740
+#, c-format
+msgid	"unsubscribed from %d groups"
+msgstr	"ÏÔÐÉÓÁÌÉÓØ ÉÚ %d ÇÒÕÐÐ"
+
+#: src/lang.c:741
+#, c-format
+msgid	"Unsubscribed from %s"
+msgstr	"ïÔÐÉÓÁÌÉÓØ ÏÔ %s"
+
+#: src/lang.c:742
+msgid	"Unsubscribing... "
+msgstr	"ïÔÐÉÓÙ×ÁÅÍÓÑ... "
+
+#: src/lang.c:743
+msgid	"Unthreading articles..."
+msgstr	""
+
+#: src/lang.c:744
+msgid	"Updated"
+msgstr	"ïÂÎÏ×ÌÅÎÏ"
+
+#: src/lang.c:745
+msgid	"Updating"
+msgstr	"ïÂÎÏ×ÌÅÎÉÅ"
+
+#: src/lang.c:746
+#, c-format
+msgid	"Opening %s\n"
+msgstr	"ïÔËÏÙÔÉÅ %s\n"
+
+#: src/lang.c:747
+msgid	"No more URL's in this article"
+msgstr	"îÅÔ ÂÏÌØÛÅ URL × ÓÔÁÔØÅ"
+
+#: src/lang.c:748
+msgid	"Use MIME display program for this message?"
+msgstr	"÷ÙÚ×ÁÔØ ÐÒÏÇÒÁÍÍÕ, ÐÏËÁÚÙ×ÁÀÝÕÀ MIME ÄÌÑ ÓÔÁÔØÉ?"
+
+#: src/lang.c:749
+msgid	"  -c       mark all news as read in subscribed newsgroups (batch mode)"
+msgstr	"  -c       ÍÁÒË. ×ÓÅ ÎÏ×ÏÓÔÉ ËÁË ÐÒÏÞ. × ÐÏÄÐÉÓÁÎÎÙÈ ÇÒÕÐÐÁÈ(ÐÁËÅÔÎÙÊ ÒÅÖÉÍ)"
+
+#: src/lang.c:750
+msgid	"  -Z       return status indicating if any unread news (batch mode)"
+msgstr	"  -Z       ×ÏÚ×ÒÁÔ ÓÔÁÔÕÓÁ Ï ÎÅÐÒÏÞÉÔÁÎÎÙÈ ÎÏ×ÏÓÔÑÈ (ÐÁËÅÔÎÙÊ ÒÅÖÉÍ)"
+
+#: src/lang.c:751
+msgid	"  -q       don't check for new newsgroups"
+msgstr	"  -q       ÎÅ ÐÒÏ×ÅÒÑÔØ ÎÁ ÎÏ×ÙÅ ÇÒÕÐÐÙ ÎÏ×ÏÓÔÅÊ"
+
+#: src/lang.c:752
+msgid	"  -X       don't save any files on quit"
+msgstr	"  -X       ÎÅ ÓÏÈÒÁÎÑÔØ ÆÁÊÌÙ ÐÒÉ ×ÙÈÏÄÅ"
+
+#: src/lang.c:753
+msgid	"  -d       don't show newsgroup descriptions"
+msgstr	"  -d       ÎÅ ÐÏËÁÚÙ×ÁÔØ ÏÐÉÓÁÎÉÅ ÇÒÕÐÐÙ"
+
+#: src/lang.c:754
+msgid	"  -G limit get only limit articles/group"
+msgstr	"  -G limit ÐÏÌÕÞÉÔØ ÔÏÌØËÏ limit ÓÔÁÔÅÊ/ÇÒÕÐÐ"
+
+#: src/lang.c:755
+#, c-format
+msgid	"  -H       help information about %s"
+msgstr	"  -H       ÐÏÄÓËÁÚËÁ Ï %s"
+
+#: src/lang.c:756
+msgid	"  -h       this help message"
+msgstr	"  -h       ÜÔÁ ÐÏÄÓËÁÚËÁ"
+
+#: src/lang.c:757
+#, c-format
+msgid	"  -I dir   news index file directory [default=%s]"
+msgstr	"  -I dir   ÐÁÐËÁ ÉÎÄÅËÓÎÏÇÏ ÆÁÊÌÁ [ÐÏ ÕÍÏÌÞÁÎÉÀ=%s]"
+
+#: src/lang.c:758
+msgid	"  -u       update index files (batch mode)"
+msgstr	"  -u       ÏÂÎÏ×ÉÔØ ÉÎÄÅËÓÎÙÅ ÆÁÊÌÙ (ÐÁËÅÔÎÙÊ ÒÅÖÉÍ)"
+
+#: src/lang.c:759
+#, c-format
+msgid	"  -m dir   mailbox directory [default=%s]"
+msgstr	"  -m dir   ÐÁÐËÁ mailbox [ÐÏ ÕÍÏÌÞÁÎÉÀ=%s]"
+
+#: src/lang.c:760
+#, c-format
+msgid	"\n"
+	"Mail bug reports/comments to %s"
+msgstr	"\n"
+	"ïÔÐÒÁ×ÌÑÊÔÅ ÏÛÉÂËÉ/ËÏÍÍÅÎÔÁÒÉÉ ÎÁ %s"
+
+#: src/lang.c:761
+msgid	"  -N       mail new news to your posts (batch mode)"
+msgstr	"  -N       e-mail ÎÏ×ÙÅ ÎÏ×ÏÓÔÉ ÎÁ ×ÁÛÅ ÓÏÏÂÝÅÎÉÅ (ÐÁËÅÔÎÙÊ ÒÅÖÉÍ)"
+
+#: src/lang.c:762
+msgid	"  -M user  mail new news to specified user (batch mode)"
+msgstr	"  -M user  e-mail ÎÏ×ÙÅ ÎÏ×ÏÓÔÉ ÁÄÒÅÓÁÔÕ (ÐÁËÅÔÎÙÊ ÒÅÖÉÍ)"
+
+#: src/lang.c:763
+#, c-format
+msgid	"  -f file  subscribed to newsgroups file [default=%s]"
+msgstr	"  -f file  ÆÁÊÌ ÐÏÄÐÉÓËÉ [ÐÏ ÕÍÏÌÞÁÎÉÀ=%s]"
+
+#: src/lang.c:764
+msgid	"  -x       no posting mode"
+msgstr	"  -x       ÒÅÖÉÍ ÚÁÐÒÅÔ ÏÔÐÒÁ×ÌÅÎÉÑ"
+
+#: src/lang.c:765
+msgid	"  -w       post an article and exit"
+msgstr	"  -w       ÏÔÐÒÁ×ÉÔØ ÓÔÁÔØÀ É ×ÙÊÔÉ"
+
+#: src/lang.c:766
+msgid	"  -o       post all postponed articles and exit"
+msgstr	"  -o       ÏÔÐÒÁ×ÉÔØ ×ÓÅ ÏÔÌÏÖÅÎÎÙÅ ÓÔÁÔØÉ É ×ÙÊÔÉ"
+
+#: src/lang.c:767
+msgid	"  -r       read news remotely from default NNTP server"
+msgstr	"  -r       ÞÉÔÁÔØ ÎÏ×ÏÓÔÉ ÕÄÁÌÅÎÎÏ Ó NNTP ÓÅÒ×ÅÒÁ (ÓÅÒ×ÅÒ ÐÏ ÕÍÏÌÞÁÎÉÀ)"
+
+#: src/lang.c:768
+msgid	"  -R       read news saved by -S option"
+msgstr	"  -R       ÞÉÔÁÔØ ÎÏ×ÏÓÔÉ, ÓÏÈÒÁÎÅÎÎÙÅ -S ÏÐÃÉÅÊ"
+
+#: src/lang.c:769
+#, c-format
+msgid	"  -s dir   save news directory [default=%s]"
+msgstr	"  -s dir   ÐÁÐËÁ ÓÏÈÒ. ÎÏ×ÏÓÔÅÊ [ÐÏ ÕÍÏÌÞÁÎÉÀ=%s]"
+
+#: src/lang.c:770
+msgid	"  -S       save new news for later reading (batch mode)"
+msgstr	"  -S       ÓÏÈÒÁÎÅÎÉÅ ÄÌÑ ÐÏÓÌÅÄÕÀÝÅÇÏ ÐÒÏÞÔÅÎÉÑ (ÐÁËÅÔÎÙÊ ÒÅÖÉÍ)"
+
+#: src/lang.c:771
+msgid	"  -z       start if any unread news"
+msgstr	"  -z       ÚÁÐÕÓÔÉÔØ ÅÓÌÉ ÅÓÔØ ÎÅÐÒÏÞÉÔÁÎÎÙÅ ÎÏ×ÏÓÔÉ"
+
+#: src/lang.c:772
+#, c-format
+msgid	"A Usenet reader.\n"
+	"\n"
+	"Usage: %s [options] [newsgroup[,...]]"
+msgstr	"ðÒÏÇÒÁÍÍÁ ÞÔÅÎÉÑ ÎÏ×ÏÓÔÅÊ Usenet.\n"
+	"\n"
+	"éÓÐÏÌØÚÏ×ÁÎÉÅ: %s [ÏÐÃÉÉ] [ÇÒÕÐÐÁ ÎÏ×ÏÓÔÅÊ[,...]]"
+
+#: src/lang.c:773
+msgid	"  -v       verbose output for batch mode options"
+msgstr	"  -v       ÄÅÔÁÌØÎÙÊ ×Ù×ÏÄ ÄÌÑ ÐÁËÅÔÎÏÇÏ ÒÅÖÉÍÁ"
+
+#: src/lang.c:774
+msgid	"  -V       print version & date information"
+msgstr	"  -V       ÎÁÐÅÞÁÔÁÔØ ×ÅÒÓÉÀ É ÄÁÔÕ"
+
+#: src/lang.c:775
+#, c-format
+msgid	"%s only useful without batch mode operations\n"
+msgstr	"%s ÏÐÃÉÑ ÐÏÌÅÚÎÁ ÔÏÌØËÏ ÂÅÚ ÐÁËÅÔÎÏÇÏ ÒÅÖÉÍÁ\n"
+
+#: src/lang.c:776
+#, c-format
+msgid	"%s only useful for batch mode operations\n"
+msgstr	"%s ÏÐÃÉÑ ÐÏÌÅÚÎÁ ÔÏÌØËÏ × ÐÁËÅÔÎÏÍ ÒÅÖÉÍÅ\n"
+
+#: src/lang.c:778
+#, c-format
+msgid	"\n"
+	"%s%d out of range (0 - %d). Reset to 0"
+msgstr	"\n"
+	"%s%d ×ÎÅ ÄÉÁÐÁÚÏÎÁ (0 - %d). óÂÒÏÓ × 0"
+
+#: src/lang.c:779
+#, c-format
+msgid	"View '%s' (%s/%s)?"
+msgstr	"ðÒÏÓÍÏÔÒ '%s' (%s/%s)?"
+
+#: src/lang.c:781
+#, c-format
+msgid	"\n"
+	"Warning: posting exceeds %d columns. Line %d is the first long one:\n"
+	"%-100s\n"
+msgstr	"\n"
+	"÷ÎÉÍÁÎÉÅ: ÓÏÏÂÝÅÎÉÅ ÐÒÅ×ÙÓÉÌÏ %d ÓÉÍ×ÏÌÏ× × ÓÔÒÏËÅ. óÔÒÏËÁ %d - ÐÅÒ×ÁÑ "
+	"ÄÌÉÎÎÁÑ:\n"
+	"%-100s\n"
+
+#: src/lang.c:782
+msgid	"\n"
+	"Warning: article unchanged after editing\n"
+msgstr	"\n"
+	"÷ÎÉÍÁÎÉÅ: ÓÔÁÔØÑ ÎÅ ÉÚÍÅÎÉÌÁÓØ ÐÏÓÌÅ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ\n"
+
+#: src/lang.c:783
+msgid	"\n"
+	"Warning: \"Subject:\" contains only whitespaces.\n"
+msgstr	"\n"
+	"÷ÎÉÍÁÎÉÅ: \"Subject:\" ÓÏÄÅÒÖÉÔ ÏÄÎÉ ÐÒÏÂÅÌÙ.\n"
+
+#: src/lang.c:784
+msgid	"\n"
+	"Warning: \"Subject:\" begins with \"Re: \" but there are no \"References:\".\n"
+msgstr	"\n"
+	"÷ÎÉÍÁÎÉÅ: \"Subject:\" ÎÁÞÉÎÁÅÔÓÑ Ó  \"Re: \" ÎÏ ÎÅÔ \"References:\".\n"
+
+#: src/lang.c:786
+msgid	"\n"
+	"Warning: Article has \"References:\" but \"Subject:\" does not begin\n"
+	"         with \"Re: \" and does not contain \"(was:\".\n"
+msgstr	"\n"
+	"÷ÎÉÍÁÎÉÅ: ÷ ÓÔÁÔØÅ ÅÓÔØ \"References:\" ÎÏ \"Subject:\" ÎÅ ÎÁÞÉÎÁÅÔÓÑ\n"
+	"         Ó \"Re: \" É ÎÅ ÓÏÄÅÒÖÉÔ \"(was:\".\n"
+
+#: src/lang.c:789
+msgid	"Read carefully!\n"
+	"\n"
+	"  You are about to cancel an article seemingly written by you. This will "
+	"wipe\n"
+	"  the article from most  news servers  throughout the world,  but there is "
+	"no\n"
+	"  guarantee that it will work.\n"
+	"\n"
+	"This is the article you are about to cancel:\n"
+	"\n"
+msgstr	"ðÒÏÞÉÔÁÊÔÅ ×ÎÉÍÁÔÅÌØÎÏ!\n"
+	"\n"
+	"  ÷Ù ÈÏÔÉÔÅ \"cancel\" ÓÔÁÔØÀ, ÎÁÐÉÓÁÎÎÕÀ ÐÏÈÏÖÅ ÷ÁÍÉ. üÔÏ ÕÎÉÞÔÏÖÉÔ "
+	"ÓÔÁÔØÀÓ \n"
+	"  ÂÏÌØÛÉÎÓÔ×Á ÓÅÒ×ÅÒÏ× ÐÏ ×ÓÅÍÕ ÍÉÒÕ, ÎÏ ÎÅ ÓÕÝÅÓÔ×ÕÅÔ ÇÁÒÁÎÔÉÉ, ÞÔÏ ÜÔÏ "
+	"ÂÕÄÅÔ\n"
+	"  ÒÁÂÏÔÁÔØ.\n"
+	"\n"
+	"üÔÏ ÓÔÁÔØÑ ×Ù ÈÏÔÉÔÅ \"cancel\":\n"
+	"\n"
+
+#: src/lang.c:793
+msgid	"\n"
+	"Warning: You are using a non-plain transfer encoding (such as base64 or\n"
+	"         quoted-printable) and an external inews program to submit your\n"
+	"         article. If a signature is appended by that inews program it will\n"
+	"         not be encoded properly.\n"
+msgstr	"\n"
+	"÷ÎÉÍÁÎÉÅ: ÷Ù ÉÓÐÏÌØÚÕÅÔÅ ËÏÄÉÒÏ×ÁÎÉÅ ÓÏÏÂÝÅÎÉÑ (base64 ÉÌÉ quoted-printable)\n"
+	"          É ×ÎÅÛÎÀÀ inews ÐÒÏÇÒÁÍÍÕ ÄÌÑ ÐÏÓÙÌËÉ ÎÏ×ÏÓÔÅÊ. åÓÌÉ ÐÏÄÐÉÓØ\n"
+	"          ÂÕÄÅÔ ÄÏÂÁ×ÌÅÎÁ ÜÔÏÊ ÐÒÏÇÒÁÍÍÏÊ, ÏÎÁ ÎÅ ÂÕÄÅÔ ËÏÄÉÒÏ×ÁÎÁ!\n"
+
+#: src/lang.c:798
+#, c-format
+msgid	"\n"
+	"\n"
+	"You are upgrading to tin %s from an earlier version.\n"
+	"Some values in your %s file have changed!\n"
+	"Read WHATSNEW, etc...\n"
+msgstr	"\n"
+	"\n"
+	"÷Ù ÏÂÎÏ×ÌÑÅÔÅÓØ ÄÏ tin %s Ó ÐÒÅÄÙÄÕÝÅÊ ×ÅÒÓÉÉ.\n"
+	"îÅËÏÔÏÒÙÅ ÚÎÁÞÅÎÉÑ × ×ÁÛÅÍ %s ÆÁÊÌÅ ÉÚÍÅÎÉÌÉÓØ!\n"
+	"ðÒÏÞÉÔÁÊÔÅ WHATSNEW, ÉÔÄ...\n"
+
+#: src/lang.c:800
+#, c-format
+msgid	"\n"
+	"\n"
+	"You are downgrading to tin %s from a more recent version!\n"
+	"Some values in your %s file may be ignored, others might have changed!\n"
+msgstr	""
+
+#: src/lang.c:803
+#, c-format
+msgid	"Warning: tin wrote fewer groups to your\n"
+	"\t%s\n"
+	"than it read at startup. If you didn't unsubscribe from %ld %s during\n"
+	"this session this indicates an error and you should backup your %s\n"
+	"before you start tin once again!\n"
+msgstr	""
+
+#: src/lang.c:807
+#, c-format
+msgid	"\n"
+	"Warning: Found %d '-- \\n' lines, this may confuse some people.\n"
+msgstr	""
+
+#: src/lang.c:808
+#, c-format
+msgid	"Warning: Only %d out of %d articles were saved"
+msgstr	"÷ÎÉÍÁÎÉÅ: ôÏÌØËÏ %d ÉÚ %d ÓÔÁÔÅÊ ÓÏÈÒÁÎÅÎÙ"
+
+#: src/lang.c:809
+#, c-format
+msgid	"\n"
+	"Warning: Your signature  is longer than %d lines.  Since signatures usually "
+	"do\n"
+	"         not  transport any  useful information,  they should be as  short "
+	"as\n"
+	"         possible.\n"
+msgstr	"\n"
+	"÷ÎÉÍÁÎÉÅ: ÷ÁÛÁ ÐÏÄÐÉÓØ ÄÌÉÎÎÅÅ %d ÓÔÒÏË. ôÁË ËÁË ÐÏÄÐÉÓÉ ÏÂÙÞÎÏ ÎÅ ÐÅÒÅÄÁÀÔ\n"
+	"         ÐÏÌÅÚÎÕÀ ÉÎÆÏÒÍÁÃÉÀ, ÏÎÉ ÄÏÌÖÎÙ ÂÙÔØ ËÏÒÏÔËÉÍÉ ÎÁÓÔÏÌØËÏ, ÎÁÓËÏÌØËÏ\n"
+	"         ÜÔÏ ×ÏÚÍÏÖÎÏ.\n"
+
+#: src/lang.c:813
+#, c-format
+msgid	"Warning: this mail address may contain a spamtrap. %s=continue, %s=abort? "
+msgstr	"÷ÎÉÍÁÎÉÅ: ÁÄÒÅÓ e-mail ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØ spamtrap. %s=ÐÒÏÄÏÌÖÉÔØ, %s=ÓÔÏÐ? "
+
+#: src/lang.c:814
+msgid	"\n"
+	"Warning: Signatures should start with '-- \\n' not with '--\\n'.\n"
+msgstr	"\n"
+	"÷ÎÉÍÁÎÉÅ: ðÏÄÐÉÓÉ ÄÏÌÖÎÙ ÎÁÞÉÎÁÔØÓÑ Ó '-- \\n' ÎÅ Ó '--\\n'.\n"
+
+#: src/lang.c:815
+msgid	"Writing attributes file..."
+msgstr	"úÁÐÉÓØ ÆÁÊÌÁ attributes..."
+
+#: src/lang.c:817
+#, c-format
+msgid	"%d Responses"
+msgstr	"%d ïÔ×ÅÔÁ(Ï×)"
+
+#: src/lang.c:819
+#, c-format
+msgid	"Added %d %s"
+msgstr	"äÏÂÁ×ÌÅÎÏ %d %s"
+
+#: src/lang.c:820
+msgid	"No unsubscribed groups to show"
+msgstr	"îÅÔ ÏÔÐÉÓÁÎÎÙÈ ÇÒÕÐÐ"
+
+#: src/lang.c:821
+msgid	"Showing subscribed to groups only"
+msgstr	"ðÏËÁÚ ÔÏÌØËÏ ÐÏÄÐÉÓÁÎÎÙÈ ÎÁ ÛÒÕÐÐÕ"
+
+#: src/lang.c:822
+msgid	"Yes "
+msgstr	"äÁ "
+
+#: src/lang.c:823
+msgid	"    You have mail\n"
+msgstr	"    õ ÷ÁÓ ÎÏ×ÏÅ ÐÉÓØÍÏ\n"
+
+#: src/lang.c:828
+#, c-format
+msgid	"\n"
+	"Warning: Posting is in %s and contains characters which are not\n"
+	"         in your selected MM_NETWORK_CHARSET: %s.\n"
+	"         These characters will be replaced by '?' if you post this\n"
+	"         article unchanged. To avoid garbling your article please either\n"
+	"         edit it and remove those characters or change the setting of\n"
+	"         MM_NETWORK_CHARSET to a suitable value for your posting via the\n"
+	"         M)enu option.\n"
+msgstr	""
+
+#: src/lang.c:839
+msgid	"  -D       debug mode 1=NNTP 2=ALL"
+msgstr	"  -D       debug ÒÅÖÉÍ 1=NNTP 2=÷óå"
+
+#: src/lang.c:843
+msgid	"Read carefully!\n"
+	"\n"
+	"  You are about to cancel an article seemingly not written by you.  This "
+	"will\n"
+	"  wipe the article from lots of news servers throughout the world;\n"
+	"  Usenet's majority  considers this  rather inappropriate,  to say the "
+	"least.\n"
+	"  Only press 'd'  if you are  absolutely positive  that you are ready to "
+	"take\n"
+	"  the rap.\n"
+	"\n"
+	"This is the article you are about to cancel:\n"
+	"\n"
+msgstr	""
+
+#: src/lang.c:852
+msgid	"toggle color"
+msgstr	"ÉÚÍÅÎÉÔØ Ã×ÅÔ"
+
+#: src/lang.c:853
+msgid	"# Changing colors of several screen parts\n"
+	"# Possible values are:\n"
+	"#  -1 = default (white for foreground and black for background)\n"
+	"#   0 = black\n"
+	"#   1 = red\n"
+	"#   2 = green\n"
+	"#   3 = brown\n"
+	"#   4 = blue\n"
+	"#   5 = pink\n"
+	"#   6 = cyan\n"
+	"#   7 = white\n"
+	"# These are *only* for foreground:\n"
+	"#   8 = gray\n"
+	"#   9 = light red\n"
+	"#  10 = light green\n"
+	"#  11 = yellow\n"
+	"#  12 = light blue\n"
+	"#  13 = light pink\n"
+	"#  14 = light cyan\n"
+	"#  15 = light white\n"
+	"\n"
+msgstr	""
+
+#: src/lang.c:873
+msgid	"  -a       toggle color flag"
+msgstr	"  -a       ÉÚÍÅÎÉÔØ Ã×ÅÔ"
+
+#: src/lang.c:877
+msgid	"\n"
+	"Error: Followup-To set to more than one newsgroup!\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: Followup-To ÕÓÔÁÎÏ×ÌÅÎ ÎÁ ÂÏÌØÛÅ ÞÅÍ ÏÄÎÕ ÇÒÕÐÐÕ!\n"
+
+#: src/lang.c:878
+#, c-format
+msgid	"\n"
+	"Error: cross-posting to %d newsgroups and no Followup-To line!\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: cross-posting × %d ÇÒÕÐÐÙ ÂÅÚ Followup-To ÓÔÒÏËÉ!\n"
+
+#: src/lang.c:879
+#, c-format
+msgid	"\n"
+	"Error: \"%s\" is not a valid newsgroup!\n"
+msgstr	"\n"
+	"ïÛÉÂËÁ: \"%s\" - ÎÅÄÏÐÕÓÔÉÍÁÑ ÇÒÕÐÐÁ!\n"
+
+#: src/lang.c:881
+msgid	"\n"
+	"Warning: Followup-To set to more than one newsgroup!\n"
+msgstr	"\n"
+	"÷ÎÉÍÁÎÉÅ: Followup-To ÕÓÔÁÎÏ×ÌÅÎ ÎÁ ÂÏÌØÛÅ ÞÅÍ ÏÄÎÕ ÇÒÕÐÐÕ!\n"
+
+#: src/lang.c:882
+#, c-format
+msgid	"\n"
+	"Warning: cross-posting to %d newsgroups and no Followup-To line!\n"
+msgstr	"\n"
+	"÷ÎÉÍÁÎÉÅ: cross-posting × %d ÇÒÕÐÐÙ ÂÅÚ Followup-To ÓÔÒÏËÉ!\n"
+
+#: src/lang.c:883
+#, c-format
+msgid	"\n"
+	"Warning: \"%s\" is not in your newsrc, it may be invalid at this site!\n"
+msgstr	"\n"
+	"÷ÎÉÍÁÎÉÅ: \"%s\" ÎÅ × newsrc É ÍÏÖÅÔ ÂÙÔØ ÏÛÉÂÏÞÎÁ ÎÁ ÜÔÏÍ ÍÅÓÔÅ!\n"
+
+#: src/lang.c:884
+#, c-format
+msgid	"\n"
+	"Warning: \"%s\" is not a valid newsgroup at this site!\n"
+msgstr	"\n"
+	"÷ÎÉÍÁÎÉÅ: \"%s\" - ÎÅÄÏÐÕÓÔÉÍÁÑ ÎÁ ÜÔÏÍ ÍÅÓÔÅ ÇÒÕÐÐÁ ÎÏ×ÏÓÔÅÊ!\n"
+
+#: src/lang.c:888
+#, c-format
+msgid	"%d files successfully written from %d articles. %d %s occurred."
+msgstr	"%d ÆÁÊÌÏ× ÕÓÐÅÛÎÏ ÚÁÐÉÓÁÎÙ ÉÚ %d ÓÔÁÔÅÊ. %d %s ÓÌÕÞÉÌÏÓØ."
+
+#: src/lang.c:889
+msgid	"Missing parts."
+msgstr	"ðÒÏÐÕÝÅÎÙ ÞÁÓÔÉ."
+
+#: src/lang.c:890
+msgid	"No beginning."
+msgstr	"îÅÔ ÎÁÞÁÌÁ."
+
+#: src/lang.c:891
+msgid	"No data."
+msgstr	"îÅÔ ÄÁÎÎÙÈ."
+
+#: src/lang.c:892
+msgid	"Unknown error."
+msgstr	"îÅÉÚ×ÅÓÔÎÁÑ ÏÛÉÂËÁ."
+
+#: src/lang.c:895
+#, c-format
+msgid	"\tChecksum of %s (%ld %s)"
+msgstr	"\tëÏÎÔÒÏÌØÎÁÑ ÓÕÍÍÁ %s (%ld %s)"
+
+#: src/lang.c:900
+msgid	"Reading mail active file... "
+msgstr	"þÔÅÎÉÅ e-mail active ÆÁÊÌÁ... "
+
+#: src/lang.c:901
+msgid	"Reading mailgroups file... "
+msgstr	"þÔÅÎÉÅ mailgroups ÆÁÊÌÁ... "
+
+#: src/lang.c:905
+msgid	"perform PGP operations on article"
+msgstr	"×ÙÐÏÌÎÉÔØ PGP ÏÐÅÒÁÃÉÑ ÓÏ ÓÔÁÔØÅÊ"
+
+#: src/lang.c:906
+msgid	"Add key(s) to public keyring?"
+msgstr	"äÏÂÁ×ÉÔØ ËÌÀÞ(É) Ë ÏÔËÒÙÔÙÍ ËÌÀÞÁÍ?"
+
+#: src/lang.c:907
+#, c-format
+msgid	"%s=encrypt, %s=sign, %s=both, %s=quit: "
+msgstr	"%s=ÛÉÆÒÏ×ÁÔØ, %s=ÐÏÄÐÉÓÁÔØ, %s=ÏÂÁ, %s=×ÙÈÏÄ: "
+
+#: src/lang.c:908
+#, c-format
+msgid	"%s=sign, %s=sign & include public key, %s=quit: "
+msgstr	"%s=ÛÉÆÒÏ×ÁÔØ, %s=ÐÏÄÐÉÓÁÔØ É ×ÌÏÖÉÔØ ÏÔËÒÙÔÙÊ ËÌÀÞ, %s=×ÙÈÏÄ: "
+
+#: src/lang.c:909
+#, c-format
+msgid	"PGP has not been set up (can't open %s)"
+msgstr	"PGP ÎÅ ÕÓÔÁÎÏ×ÌÅÎ (ÎÅ ÍÏÇÕ ÏÔËÒÙÔØ %s)"
+
+#: src/lang.c:910
+msgid	"Article not signed and no public keys found"
+msgstr	"óÔÁÔØÑ ÎÅ ÐÏÄÐÉÓÁÎÁ É ÏÔËÒÙÔÙÊ ËÌÀÞ ÎÅ ÎÁÊÄÅÎ"
+
+#: src/lang.c:912
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=×ÙÈÏÄ, %s=ÒÅÄ., %s=ispell, %s=pgp, %s=ÍÅÎÀ, %s=ÏÔÐÒÁ×ÉÔØ, %s=ÏÔÌÏÖÉÔØ: "
+
+#: src/lang.c:913
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%s]: "
+msgstr	"%s=×ÙÈÏÄ, %s=ÒÅÄ., %s=ispell, %s=pgp, %s=ÐÏÓÌÁÔØ [%%s]: "
+
+#: src/lang.c:914
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=×ÙÈÏÄ, %s=ÒÅÄ., %s=ispell, %s=pgp, %s=ÍÅÎÀ, %s=ÏÔÐÒ., %s=ÏÔÌÏÖÉÔØ [%%s]: "
+
+#: src/lang.c:916
+#, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=×ÙÈÏÄ, %s=ÒÅÄ., %s=pgp, %s=ÍÅÎÀ, %s=ÏÔÐÒÁ×ÉÔØ, %s=ÏÔÌÏÖÉÔØ: "
+
+#: src/lang.c:917
+#, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=send [%%s]: "
+msgstr	"%s=×ÙÈÏÄ, %s=ÒÅÄ., %s=pgp, %s=ÏÔÐÒÁ×ÉÔØ [%%s]: "
+
+#: src/lang.c:918
+#, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=×ÙÈÏÄ, %s=ÒÅÄ., %s=pgp, %s=ÍÅÎÀ, %s=ÏÔÐÒÁ×ÉÔØ, %s=ÏÔÌÏÖÉÔØ [%%s]: "
+
+#: src/lang.c:922
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=×ÙÈÏÄ, %s=ÒÅÄ., %s=ispell, %s=ÍÅÎÀ, %s=ÏÔÐÒ., %s=ÏÔÌÏÖÉÔØ: "
+
+#: src/lang.c:923
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=send [%%s]: "
+msgstr	"%s=×ÙÈÏÄ, %s=ÒÅÄ., %s=ispell, %s=ÏÔÐÒÁ×ÉÔØ [%%s]: "
+
+#: src/lang.c:924
+#, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	""
+
+#: src/lang.c:926
+#, c-format
+msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=×ÙÈÏÄ, %s=ÒÅÄ., %s=ÍÅÎÀ, %s=ÏÔÐÒÁ×ÉÔØ, %s=ÏÔÌÏÖÉÔØ: "
+
+#: src/lang.c:927
+#, c-format
+msgid	"%s=quit, %s=edit, %s=send [%%s]: "
+msgstr	"%s=×ÙÈÏÄ, %s=ÒÅÄ., %s=ÏÔÐÒÁ×ÉÔØ [%%s]: "
+
+#: src/lang.c:928
+#, c-format
+msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=×ÙÈÏÄ, %s=ÒÅÄ., %s=ÍÅÎÀ, %s=ÏÔÐÒÁ×ÉÔØ, %s=ÏÔÌÏÖÉÔØ [%%s]: "
+
+#: src/lang.c:937
+msgid	"Try cache_overview_files to speed up things.\n"
+msgstr	"ðÏÐÒÏÂÕÊÔÅ cache_overview_files ÄÌÑ ÕÓËÏÒÅÎÉÑ.\n"
+
+#: src/lang.c:938
+msgid	"Tin will use local index files instead.\n"
+msgstr	"tin ÂÕÄÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÆÁÊÌÙ ÌÏËÁÌØÎÏÇÏ ÉÎÄÅËÓÁ ×ÍÅÓÔÏ ÜÔÏÇÏ.\n"
+
+#: src/lang.c:939
+msgid	"Cannot find NNTP server name"
+msgstr	"îÅ ÍÏÇÕ ÎÁÊÔÉ ÉÍÑ NNTP ÓÅÒ×ÅÒÁ"
+
+#: src/lang.c:940
+#, c-format
+msgid	"Connecting to %s:%d..."
+msgstr	"óÏÅÄÉÎÅÎÉÅ Ó %s:%d..."
+
+#: src/lang.c:941
+msgid	"Disconnecting from server...\n"
+msgstr	"ïÔÓÏÅÄÉÎÅÎÉÅ ÏÔ ÓÅÒ×ÅÒÁ...\n"
+
+#: src/lang.c:942
+#, c-format
+msgid	"Wrong newsgroup name in response of GROUP command, %s for %s"
+msgstr	"îÅÐÒÁ×ÉÌØÎÏÅ ÉÍÑ ÇÒÕÐÐÙ × ÏÔ×ÅÔÅ ÎÁ ËÏÍÁÎÄÕ GROUP, %s ÄÌÑ %s"
+
+#: src/lang.c:943
+#, c-format
+msgid	"Failed to connect to NNTP server %s. Exiting..."
+msgstr	"îÅ ÕÄÁÌÏÓØ ÓÏÅÄÉÎÉÔØÓÑ Ó NNTP ÓÅÒ×ÅÒÏÍ %s. ÷ÙÈÏÄ..."
+
+#: src/lang.c:944
+msgid	"205  Closing connection"
+msgstr	"205 úÁËÒÙÔÉÅ ÓÏÅÄÉÎÅÎÉÑ"
+
+#: src/lang.c:945
+msgid	"Your server does not support the NNTP XOVER or OVER command.\n"
+msgstr	"óÅÒ×ÅÒ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔ NNTP XOVER ÉÌÉ OVER ËÏÍÁÎÄÙ.\n"
+
+#: src/lang.c:946
+msgid	"Connection to news server has timed out. Reconnect?"
+msgstr	"÷ÒÅÍÑ ÓÏÅÄÉÎÅÎÉÑ Ë ÓÅÒ×ÅÒÕ ÐÒÅ×ÙÓÉÌÏ ÌÉÍÉÔ. ðÅÒÅÓÏÅÄÉÎÉÔØÓÑ?"
+
+#: src/lang.c:947
+#, c-format
+msgid	"Put the server name in the file %s,\n"
+	"or set the environment variable NNTPSERVER"
+msgstr	"ðÏÍÅÓÔÉÔØ ÉÍÑ ÓÅÒ×ÅÒÁ × ÆÁÊÌ %s,\n"
+	"ÉÌÉ ÕÓÔÁÎÏ×ÉÔØ ÐÅÒÅÍÅÎÎÕÀ ÏËÒÕÖÅÎÉÑ NNTPSERVER"
+
+#: src/lang.c:948
+msgid	"  -A       force authentication on connect"
+msgstr	"  -A       ÐÒÉÎÕÄÉÔÅÌØÎÁÑ ÁÕÔÅÎÔÉÆÉËÁÃÉÑ ÐÒÉ ÓÏÅÄÉÎÅÎÉÉ"
+
+#: src/lang.c:949
+#, c-format
+msgid	"  -g serv  read news from NNTP server serv [default=%s]"
+msgstr	"  -g serv  ÞÔÅÎÉÅ ÎÏ×ÏÓÔÅÊ Ó NNTP ÓÅÒ×ÅÒÁ serv [ÐÏ ÕÍÏÌÞÁÎÉÀ=%s]"
+
+#: src/lang.c:950
+#, c-format
+msgid	"  -p port  use port as NNTP port [default=%d]"
+msgstr	"  -p port  ÉÓÐÏÌØÚÏ×ÁÔØ port ËÁË NNTP ÐÏÒÔ [ÐÏ ÕÍÏÌÞÁÎÉÀ=%d]"
+
+#: src/lang.c:951
+msgid	"  -Q       quick start. Same as -nqd"
+msgstr	"  -Q       ÂÙÓÔÒÙÊ ÚÁÐÕÓË. ëÁË Ó ÏÐÃÉÑÍÉ -nqd"
+
+#: src/lang.c:952
+msgid	"  -l       use only LIST instead of GROUP (-n) command"
+msgstr	"  -l       ÉÓÐÏÌØÚÏ×ÁÔØ LIST ×ÍÅÓÔÏ GROUP (-n) ËÏÍÁÎÄ"
+
+#: src/lang.c:953
+msgid	"  -n       only read subscribed .newsrc groups from NNTP server"
+msgstr	"  -n       ÞÉÔÁÔØ ÔÏÌØËÏ ÐÏÄÐÉÓÁÎÎÙÅ .newsrc ÇÒÕÐÐÙ Ó NNTP ÓÅÒ×ÅÒÁ"
+
+#: src/lang.c:955
+#, c-format
+msgid	"%s/tcp: Unknown service.\n"
+msgstr	"%s/tcp: îÅÉÚ×ÅÓÔÎÙÊ ÓÅÒ×ÉÓ.\n"
+
+#: src/lang.c:958
+msgid	"\n"
+	"socket or connect problem\n"
+msgstr	"\n"
+	"ÐÒÏÂÌÅÍÁ Ó ÓÏËÅÔÏÍ ÉÌÉ ÓÏÅÄÉÎÅÎÉÅÍ\n"
+
+#: src/lang.c:960
+#, c-format
+msgid	"\n"
+	"Connection to %s: "
+msgstr	"\n"
+	"óÏÅÄÉÎÅÎÉÅ Ó %s: "
+
+#: src/lang.c:961
+msgid	"Giving up...\n"
+msgstr	"õÓÔÕÐÁÅÍ...\n"
+
+#: src/lang.c:964
+msgid	"Your server does not have Xref: in its XOVER information.\n"
+	"Tin will try to use XHDR XREF instead (slows down things a bit).\n"
+msgstr	""
+
+#: src/lang.c:967
+msgid	"Your server does not have Xref: in its XOVER information.\n"
+msgstr	"óÅÒ×ÅÒ ÎÅ ÓÏÄÅÒÖÉÔ Xref: × XOVER.\n"
+
+#: src/lang.c:970
+#, c-format
+msgid	"Can't open %s. Try %s -r to read news via NNTP.\n"
+msgstr	"îÅ ÍÏÇÕ ÏÔËÒÙÔØ %s. ðÏÐÒÏÂÕÊÔÅ %s -r ÄÌÑ ÞÔÅÎÉÑ ÎÏ×ÏÓÔÅÊ ÐÏ NNTP.\n"
+
+#: src/lang.c:973
+msgid	"  -Q       quick start. Same as -qd"
+msgstr	"  -Q       ÂÙÓÔÒÙÊ ÚÁÐÕÓË. ôÏ ÖÅ ÓÁÍÏÅ ËÁË Ó ÏÐÃÉÑÍÉ -qd"
+
+#: src/lang.c:974
+msgid	"  -l       read only active file instead of scanning spool (-n) command"
+msgstr	"  -l       ÞÉÔÁÔØ ÔÏÌØËÏ active file ×ÍÅÓÔÏ ÓËÁÎÉÒÏ×ÁÎÉÑ spool (-n) ËÏÍÁÎÄÁ"
+
+#: src/lang.c:975
+msgid	"  -n       only read subscribed .newsrc groups from spool"
+msgstr	"  -n       ÞÉÔÁÔØ ÔÏÌØËÏ ÐÏÄÐÉÓÁÎÎÙÅ .newsrc ÇÒÕÐÐÙ ÉÚ spool"
+
+#: src/lang.c:976
+msgid	"Your server does not have Xref: in its NOV-files.\n"
+msgstr	"÷ÁÛ ÓÅÒ×ÅÒ ÎÅ ÉÍÅÅÔ  Xref: × NOV-ÆÁÊÌÁÈ.\n"
+
+#: src/lang.c:980
+msgid	"Posting using external inews failed. Use built in inews instead?"
+msgstr	"ïÔÐÒÁ×ÌÅÎÉÅ Ó ×ÎÅÛÎÉÍ inews ÐÒÏ×ÁÌÉÌÏÓØ. éÓÐÏÌØÚÏ×ÁÔØ ×ÓÔÒÏÅÎÎÙÊ inews"
+
+#: src/lang.c:981
+msgid	"It worked! Should I always use my built in inews from now on?"
+msgstr	"úÁÒÁÂÏÔÁÌÏ! éÓÐÏÌØÚÏ×ÁÔØ ×ÓÅÇÄÁ ÓÄÅÌÁÎÎÙÊ inews?"
+
+#: src/lang.c:989
+#, c-format
+msgid	"%d %s printed"
+msgstr	"%d %s ÎÁÐÅÞÁÔÁÎÏ"
+
+#: src/lang.c:990
+msgid	"output article/thread/hot/pattern/tagged articles to printer"
+msgstr	"×Ù×ÏÄ ÓÔÁÔØÉ/ÄÉÓËÕÓÓÉÉ/hot/ÛÁÂÌÏÎÁ/ÐÏÍÅÞÅÎÎÙÈ ÓÔÁÔÅÊ ÎÁ ÐÅÞÁÔØ"
+
+#: src/lang.c:991
+msgid	"Print"
+msgstr	"ðÅÞÁÔØ"
+
+#: src/lang.c:992
+msgid	"Printing..."
+msgstr	"ðÅÞÁÔÁÀ..."
+
+#: src/lang.c:996
+msgid	"pipe article/thread/hot/pattern/tagged articles into command"
+msgstr	"pipe ÓÔÁÔØÀ/ÄÉÓËÕÓÓÉÀ/hot/ÛÁÂÌÏÎ/ÐÏÍÅÞÅÎÎÙÅ ÓÔÁÔØÉ × ËÏÍÁÎÄÕ"
+
+#: src/lang.c:997
+msgid	"No command"
+msgstr	"îÅÔ ËÏÍÁÎÄÙ"
+
+#: src/lang.c:998
+msgid	"Pipe"
+msgstr	""
+
+#: src/lang.c:999
+#, c-format
+msgid	"Pipe to command [%.*s]> "
+msgstr	"Pipe × ËÏÍÁÎÄÕ [%.*s]> "
+
+#: src/lang.c:1000
+msgid	"Piping..."
+msgstr	""
+
+#: src/lang.c:1002
+msgid	"Piping not enabled."
+msgstr	"Piping ÎÅ ×ËÌÀÞÅÎÏ."
+
+#: src/lang.c:1006
+#, c-format
+msgid	"\n"
+	"Error: The \"%s:\" line has spaces  in it that MUST be removed.\n"
+	"       The only allowable  space is the one  separating the colon (:)\n"
+	"       from  the  contents.  Use a  comma  (,)  to separate  multiple\n"
+	"       newsgroup names.\n"
+msgstr	""
+
+#: src/lang.c:1011
+#, c-format
+msgid	"\n"
+	"Error: The \"%s:\" line is  continued in  the next line.  Since\n"
+	"       the line  may not  contain  whitespace,  this is  not allowed.\n"
+	"       Please write all newsgroups into a single line.\n"
+msgstr	""
+
+#: src/lang.c:1016
+#, c-format
+msgid	"\n"
+	"Warning: The \"%s:\" line is continued in the next line.\n"
+	"         This is a very new feature and may not be accepted by all servers.\n"
+	"         To avoid trouble please write all newsgroups into a single line.\n"
+msgstr	""
+
+#: src/lang.c:1020
+#, c-format
+msgid	"\n"
+	"Warning: The \"%s:\" line has spaces in it that SHOULD be removed.\n"
+msgstr	""
+
+#: src/lang.c:1025
+msgid	"\n"
+	"  If your article contains quoted text  please take some time to pare it "
+	"down\n"
+	"  to just the  key points to which you are  responding,  or people will "
+	"think\n"
+	"  you are a dweeb!  Many people have the habit of skipping any article  "
+	"whose\n"
+	"  first page is largely  quoted material.  Format your article to fit in "
+	"less\n"
+	"  then 80 chars,  since that's the conventional size  (72 is a good choice "
+	"as\n"
+	"  it allows quoting without exceeding the limit).  If your lines are too "
+	"long\n"
+	"  they'll wrap  around  ugly and  people won't  read what you  write.  If "
+	"you\n"
+	"  aren't  careful  and considerate  in  formatting  your posting, people  "
+	"are\n"
+	"  likely to ignore it completely.  It's a crowded net out there.\n"
+msgstr	""
+
+#: src/lang.c:1038
+msgid	"shell escape"
+msgstr	""
+
+#: src/lang.c:1039
+#, c-format
+msgid	"Shell Command (%s)"
+msgstr	""
+
+#: src/lang.c:1040
+#, c-format
+msgid	"Enter shell command [%s]> "
+msgstr	""
+
+#: src/lang.c:1044
+#, c-format
+msgid	"%s: Can't get entry for TERM\n"
+msgstr	""
+
+#: src/lang.c:1048
+#, c-format
+msgid	"Group %.*s ('q' to quit)..."
+msgstr	""
+
+#: src/lang.c:1050
+#, c-format
+msgid	"Group %.*s..."
+msgstr	""
+
+#: src/lang.c:1054
+msgid	"Server unavailable\n"
+msgstr	""
+
+#: src/lang.c:1060
+#, c-format
+msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %"
+	"s=post"
+msgstr	""
+
+#: src/lang.c:1061
+#, c-format
+msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
+msgstr	""
+
+#: src/lang.c:1063
+#, c-format
+msgid	"%s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
+msgstr	""
+
+#: src/lang.c:1064
+#, c-format
+msgid	"%s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
+msgstr	""
+
+#: src/lang.c:1068
+#, c-format
+msgid	"%s=pipe; %s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
+msgstr	""
+
+#: src/lang.c:1069
+#, c-format
+msgid	"%s=pipe; %s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
+msgstr	""
+
+#: src/lang.c:1071
+#, c-format
+msgid	"%s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
+msgstr	""
+
+#: src/lang.c:1072
+#, c-format
+msgid	"%s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
+msgstr	""
+
+#: src/lang.c:1078
+msgid	"Terminal does not support color"
+msgstr	""
+
+#: src/lang.c:1083
+#, c-format
+msgid	"Trying %s"
+msgstr	""
+
+#: src/lang.c:1097 src/lang.c:1123 src/lang.c:1139 src/lang.c:1318 src/refs.c:296
+msgid	"None"
+msgstr	""
+
+#: src/lang.c:1098
+msgid	"Subject"
+msgstr	""
+
+#: src/lang.c:1099
+msgid	"References"
+msgstr	""
+
+#: src/lang.c:1100
+msgid	"Both Subject and References"
+msgstr	""
+
+#: src/lang.c:1101
+msgid	"Multipart Subject"
+msgstr	""
+
+#: src/lang.c:1102
+msgid	"Percentage Match"
+msgstr	""
+
+#: src/lang.c:1114 src/lang.c:1225
+msgid	"No"
+msgstr	""
+
+#: src/lang.c:1115 src/lang.c:1227
+msgid	"Yes"
+msgstr	""
+
+#: src/lang.c:1116
+msgid	"Hide All"
+msgstr	""
+
+#: src/lang.c:1124
+msgid	"Address"
+msgstr	""
+
+#: src/lang.c:1125
+msgid	"Full Name"
+msgstr	""
+
+#: src/lang.c:1126
+msgid	"Address and Name"
+msgstr	""
+
+#: src/lang.c:1133
+msgid	"Max"
+msgstr	""
+
+#: src/lang.c:1134
+msgid	"Sum"
+msgstr	""
+
+#: src/lang.c:1135
+msgid	"Average"
+msgstr	""
+
+#: src/lang.c:1140
+msgid	"Lines"
+msgstr	""
+
+#: src/lang.c:1141
+msgid	"Score"
+msgstr	""
+
+#: src/lang.c:1142
+msgid	"Lines & Score"
+msgstr	""
+
+#: src/lang.c:1151
+msgid	"Black"
+msgstr	""
+
+#: src/lang.c:1152
+msgid	"Red"
+msgstr	""
+
+#: src/lang.c:1153
+msgid	"Green"
+msgstr	""
+
+#: src/lang.c:1154
+msgid	"Brown"
+msgstr	""
+
+#: src/lang.c:1155
+msgid	"Blue"
+msgstr	""
+
+#: src/lang.c:1156
+msgid	"Pink"
+msgstr	""
+
+#: src/lang.c:1157
+msgid	"Cyan"
+msgstr	""
+
+#: src/lang.c:1158
+msgid	"White"
+msgstr	""
+
+#: src/lang.c:1159
+msgid	"Gray"
+msgstr	""
+
+#: src/lang.c:1160
+msgid	"Light Red"
+msgstr	""
+
+#: src/lang.c:1161
+msgid	"Light Green"
+msgstr	""
+
+#: src/lang.c:1162
+msgid	"Yellow"
+msgstr	""
+
+#: src/lang.c:1163
+msgid	"Light Blue"
+msgstr	""
+
+#: src/lang.c:1164
+msgid	"Light Pink"
+msgstr	""
+
+#: src/lang.c:1165
+msgid	"Light Cyan"
+msgstr	""
+
+#: src/lang.c:1166
+msgid	"Light White"
+msgstr	""
+
+#: src/lang.c:1174 src/lang.c:1231 src/lang.c:1245
+msgid	"Nothing"
+msgstr	""
+
+#: src/lang.c:1175
+msgid	"Mark"
+msgstr	""
+
+#: src/lang.c:1176
+msgid	"Space"
+msgstr	""
+
+#: src/lang.c:1183
+msgid	"Normal"
+msgstr	""
+
+#: src/lang.c:1184
+msgid	"Best highlighting"
+msgstr	""
+
+#: src/lang.c:1185
+msgid	"Underline"
+msgstr	""
+
+#: src/lang.c:1186
+msgid	"Reverse video"
+msgstr	""
+
+#: src/lang.c:1187
+msgid	"Blinking"
+msgstr	""
+
+#: src/lang.c:1188
+msgid	"Half bright"
+msgstr	""
+
+#: src/lang.c:1189
+msgid	"Bold"
+msgstr	""
+
+#: src/lang.c:1194
+msgid	"none"
+msgstr	""
+
+#: src/lang.c:1195
+msgid	"commands"
+msgstr	""
+
+#: src/lang.c:1196
+msgid	"select"
+msgstr	""
+
+#: src/lang.c:1198
+msgid	"commands & quit"
+msgstr	""
+
+#: src/lang.c:1199
+msgid	"commands & select"
+msgstr	""
+
+#: src/lang.c:1200
+msgid	"quit & select"
+msgstr	""
+
+#: src/lang.c:1201
+msgid	"commands & quit & select"
+msgstr	""
+
+#: src/lang.c:1226
+msgid	"Shell archive"
+msgstr	""
+
+#: src/lang.c:1232
+msgid	"Subject: (descending)"
+msgstr	""
+
+#: src/lang.c:1233
+msgid	"Subject: (ascending)"
+msgstr	""
+
+#: src/lang.c:1234
+msgid	"From: (descending)"
+msgstr	""
+
+#: src/lang.c:1235
+msgid	"From: (ascending)"
+msgstr	""
+
+#: src/lang.c:1236
+msgid	"Date: (descending)"
+msgstr	""
+
+#: src/lang.c:1237
+msgid	"Date: (ascending)"
+msgstr	""
+
+#: src/lang.c:1238 src/lang.c:1246
+msgid	"Score (descending)"
+msgstr	""
+
+#: src/lang.c:1239 src/lang.c:1247
+msgid	"Score (ascending)"
+msgstr	""
+
+#: src/lang.c:1240
+msgid	"Lines: (descending)"
+msgstr	""
+
+#: src/lang.c:1241
+msgid	"Lines: (ascending)"
+msgstr	""
+
+#: src/lang.c:1252
+msgid	"Always Keep"
+msgstr	""
+
+#: src/lang.c:1253
+msgid	"Always Remove"
+msgstr	""
+
+#: src/lang.c:1254
+msgid	"Mark with D on selection screen"
+msgstr	""
+
+#: src/lang.c:1259
+msgid	"Kill only unread arts"
+msgstr	""
+
+#: src/lang.c:1260
+msgid	"Kill all arts & show with K"
+msgstr	""
+
+#. TODO: s/K/art_marked_killed/
+#: src/lang.c:1261
+msgid	"Kill all arts and never show"
+msgstr	""
+
+#: src/lang.c:1266
+msgid	"Nothing special"
+msgstr	""
+
+#: src/lang.c:1267
+msgid	"Compress quotes"
+msgstr	""
+
+#: src/lang.c:1268
+msgid	"Quote signatures"
+msgstr	""
+
+#: src/lang.c:1269
+msgid	"Compress quotes, quote sigs"
+msgstr	""
+
+#: src/lang.c:1270
+msgid	"Quote empty lines"
+msgstr	""
+
+#: src/lang.c:1271
+msgid	"Compress quotes, quote empty lines"
+msgstr	""
+
+#: src/lang.c:1272
+msgid	"Quote sigs & empty lines"
+msgstr	""
+
+#: src/lang.c:1273
+msgid	"Comp. q., quote sigs & empty lines"
+msgstr	""
+
+#: src/lang.c:1311
+msgid	"no"
+msgstr	""
+
+#: src/lang.c:1312
+msgid	"with headers"
+msgstr	""
+
+#: src/lang.c:1313
+msgid	"without headers"
+msgstr	""
+
+#: src/lang.c:1320 src/lang.c:1326
+msgid	"NFKC"
+msgstr	""
+
+#: src/lang.c:1321
+msgid	"NFKD"
+msgstr	""
+
+#: src/lang.c:1322
+msgid	"NFC"
+msgstr	""
+
+#: src/lang.c:1323
+msgid	"NFD"
+msgstr	""
+
+#: src/lang.c:1334
+msgid	"Display Options"
+msgstr	""
+
+#: src/lang.c:1341
+msgid	"Color Options"
+msgstr	""
+
+#: src/lang.c:1348
+msgid	"Article-Limiting Options"
+msgstr	""
+
+#: src/lang.c:1354
+msgid	"Posting/Mailing Options"
+msgstr	""
+
+#: src/lang.c:1360
+msgid	"Saving/Printing Options"
+msgstr	""
+
+#: src/lang.c:1366
+msgid	"Expert Options"
+msgstr	""
+
+#: src/lang.c:1372
+msgid	"Filtering Options"
+msgstr	""
+
+#: src/lang.c:1377 src/lang.c:1408 src/lang.c:1414 src/lang.c:1440 src/lang.c:1490
+#: src/lang.c:1496 src/lang.c:1506 src/lang.c:1526 src/lang.c:1601 src/lang.c:1771
+#: src/lang.c:1777 src/lang.c:1783 src/lang.c:1789 src/lang.c:1801 src/lang.c:1808
+#: src/lang.c:1862 src/lang.c:1871 src/lang.c:1877 src/lang.c:1884 src/lang.c:1891
+#: src/lang.c:1898 src/lang.c:1905 src/lang.c:1912 src/lang.c:1919 src/lang.c:1926
+#: src/lang.c:1933 src/lang.c:1940 src/lang.c:1947 src/lang.c:1954 src/lang.c:1961
+#: src/lang.c:1968 src/lang.c:1975 src/lang.c:1982 src/lang.c:1989 src/lang.c:1996
+#: src/lang.c:2003 src/lang.c:2010 src/lang.c:2017 src/lang.c:2024 src/lang.c:2031
+#: src/lang.c:2039 src/lang.c:2055 src/lang.c:2062 src/lang.c:2069 src/lang.c:2076
+#: src/lang.c:2082 src/lang.c:2088 src/lang.c:2105 src/lang.c:2117 src/lang.c:2151
+#: src/lang.c:2204 src/lang.c:2211 src/lang.c:2217 src/lang.c:2242 src/lang.c:2259
+#: src/lang.c:2312 src/lang.c:2348 src/lang.c:2368 src/lang.c:2403 src/lang.c:2413
+#: src/lang.c:2438 src/lang.c:2454 src/lang.c:2473 src/lang.c:2486
+msgid	"<SPACE> toggles, <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:1378
+msgid	"Show mini menu & posting etiquette"
+msgstr	""
+
+#: src/lang.c:1379
+msgid	"# If ON show a mini menu of useful commands at each level\n"
+	"# and posting etiquette after composing an article\n"
+msgstr	""
+
+#: src/lang.c:1384
+msgid	"Show short description for each newsgroup. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1385
+msgid	"Show description of each newsgroup"
+msgstr	""
+
+#: src/lang.c:1386
+msgid	"# If ON show group description text after newsgroup name at\n"
+	"# group selection level\n"
+msgstr	""
+
+#: src/lang.c:1391
+msgid	"Show Subject & From (author) fields in group menu. <SPACE> toggles & <CR> "
+	"sets."
+msgstr	""
+
+#: src/lang.c:1392
+msgid	"In group menu, show author by"
+msgstr	""
+
+#: src/lang.c:1393
+msgid	"# Part of from field to display\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = none\n"
+	"#   1 = address\n"
+	"# * 2 = full name\n"
+	"#   3 = both\n"
+msgstr	""
+
+#: src/lang.c:1402
+msgid	"Draw -> or highlighted bar for selection. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1403
+msgid	"Draw -> instead of highlighted bar"
+msgstr	""
+
+#: src/lang.c:1404
+msgid	"# If ON use -> otherwise highlighted bar for selection\n"
+msgstr	""
+
+#: src/lang.c:1409
+msgid	"Use inverse video for page headers"
+msgstr	""
+
+#: src/lang.c:1410
+msgid	"# If ON use inverse video for page headers at different levels\n"
+msgstr	""
+
+#: src/lang.c:1415
+msgid	"Thread articles by"
+msgstr	""
+
+#: src/lang.c:1416
+msgid	"# Thread articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject\n"
+	"#   2 = References\n"
+	"# * 3 = Both (Subject and References)\n"
+	"#   4 = Multipart Subject\n"
+	"#   5 = Percentage Match\n"
+msgstr	""
+
+#: src/lang.c:1427
+msgid	"Enter percentage match required to thread together. <CR> sets."
+msgstr	""
+
+#: src/lang.c:1428
+msgid	"Thread percentage match"
+msgstr	""
+
+#: src/lang.c:1429
+#, c-format
+msgid	"# Thread percentage match...\n"
+	"# the percentage of characters in the subject of an article that must match\n"
+	"# a base article for both those articles to be considered to belong to the\n"
+	"# same thread. This option is an integer percentage, eg. 80, no decimals may\n"
+	"# follow. If 80 is used here, then 80%% of the characters must match "
+	"exactly,\n"
+	"# no insertion of a character, for the two articles to be put in the same\n"
+	"# thread. eg. 'happy' and 'harpy' would match, but 'harpie', 'happie' and\n"
+	"# 'harppy' would be threaded separately from 'happy'\n"
+msgstr	""
+
+#: src/lang.c:1441
+msgid	"Score of a thread"
+msgstr	""
+
+#: src/lang.c:1442
+msgid	"# Thread score\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = max\n"
+	"#   1 = sum\n"
+	"#   2 = average\n"
+msgstr	""
+
+#: src/lang.c:1450
+msgid	"Sort articles by Subject, From, Date or Score. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1451
+msgid	"Sort articles by"
+msgstr	""
+
+#: src/lang.c:1452
+msgid	"# Sort articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject descending\n"
+	"#   2 = Subject ascending\n"
+	"#   3 = From descending\n"
+	"#   4 = From ascending\n"
+	"#   5 = Date descending\n"
+	"# * 6 = Date ascending\n"
+	"#   7 = Score descending\n"
+	"#   8 = Score ascending\n"
+	"#   9 = Lines descending\n"
+	"#  10 = Lines ascending\n"
+msgstr	""
+
+#: src/lang.c:1468
+msgid	"Sort threads by Nothing or Score. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1469
+msgid	"Sort threads by"
+msgstr	""
+
+#: src/lang.c:1470
+msgid	"# Sort thread by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = Score descending\n"
+	"#   2 = Score ascending\n"
+msgstr	""
+
+#: src/lang.c:1478
+msgid	"Put cursor at first/last unread art in groups. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1479
+msgid	"Goto first unread article in group"
+msgstr	""
+
+#: src/lang.c:1480
+msgid	"# If ON put cursor at first unread art in group otherwise last art\n"
+msgstr	""
+
+#: src/lang.c:1484
+msgid	"Show all articles or only unread articles. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1485
+msgid	"Show only unread articles"
+msgstr	""
+
+#: src/lang.c:1486
+msgid	"# If ON show only new/unread articles otherwise show all.\n"
+msgstr	""
+
+#: src/lang.c:1491
+msgid	"Show only groups with unread arts"
+msgstr	""
+
+#: src/lang.c:1492
+msgid	"# If ON show only subscribed to groups that contain unread articles.\n"
+msgstr	""
+
+#: src/lang.c:1497
+msgid	"Filter which articles"
+msgstr	""
+
+#: src/lang.c:1498
+msgid	"# Filter which articles\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = only kill unread articles\n"
+	"#   1 = kill all articles and show in threads marked with K\n"
+	"#   2 = kill all articles and never show them\n"
+msgstr	""
+
+#: src/lang.c:1507
+msgid	"Tab goes to next unread article"
+msgstr	""
+
+#: src/lang.c:1508
+msgid	"# If ON the TAB command will go to next unread article at article viewer "
+	"level\n"
+msgstr	""
+
+#: src/lang.c:1512
+msgid	"Scrolling with <SPACE> past the end of an art. jumps to the next unread one."
+msgstr	""
+
+#: src/lang.c:1513
+msgid	"Space goes to next unread article"
+msgstr	""
+
+#: src/lang.c:1514
+msgid	"# If ON the SPACE command will go to next unread article at article viewer\n"
+	"# level when the end of the article is reached (rn-style pager)\n"
+msgstr	""
+
+#: src/lang.c:1519
+msgid	"Scrolling with <PGDN>/<DOWN> past the end of an art. jumps to the unread one."
+msgstr	""
+
+#: src/lang.c:1520
+msgid	"PgDn goes to next unread article"
+msgstr	""
+
+#: src/lang.c:1521
+msgid	"# If ON the PGDN or DOWN command will go to next unread article when\n"
+	"# pressed at end of message\n"
+msgstr	""
+
+#: src/lang.c:1527
+msgid	"List thread using right arrow key"
+msgstr	""
+
+#: src/lang.c:1528
+msgid	"# If ON automatically list thread when entering it using right arrow key.\n"
+msgstr	""
+
+#: src/lang.c:1532
+msgid	"Enter character to indicate deleted articles. <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:1533
+msgid	"Character to show deleted articles"
+msgstr	""
+
+#: src/lang.c:1534
+msgid	"# Character used to show that an art was deleted (default 'D')\n"
+	"# _ is turned into ' '\n"
+msgstr	""
+
+#: src/lang.c:1539
+msgid	"Enter character to indicate articles in a range. <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:1540
+msgid	"Character to show inrange articles"
+msgstr	""
+
+#: src/lang.c:1541
+msgid	"# Character used to show that an art is in a range (default '#')\n"
+	"# _ is turned into ' '\n"
+msgstr	""
+
+#: src/lang.c:1546
+msgid	"Enter character to indicate that article will return. <CR> sets, <ESC> "
+	"cancels."
+msgstr	""
+
+#: src/lang.c:1547
+msgid	"Character to show returning arts"
+msgstr	""
+
+#: src/lang.c:1548
+msgid	"# Character used to show that an art will return (default '-')\n"
+	"# _ is turned into ' '\n"
+msgstr	""
+
+#: src/lang.c:1553
+msgid	"Enter character to indicate selected articles. <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:1554
+msgid	"Character to show selected articles"
+msgstr	""
+
+#: src/lang.c:1555
+msgid	"# Character used to show that an art was auto-selected (default '*')\n"
+	"# _ is turned into ' '\n"
+msgstr	""
+
+#: src/lang.c:1560
+msgid	"Enter character to indicate recent articles. <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:1561
+msgid	"Character to show recent articles"
+msgstr	""
+
+#: src/lang.c:1562
+msgid	"# Character used to show that an art is recent (default 'o')\n"
+	"# _ is turned into ' '\n"
+msgstr	""
+
+#: src/lang.c:1567
+msgid	"Enter character to indicate unread articles. <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:1568
+msgid	"Character to show unread articles"
+msgstr	""
+
+#: src/lang.c:1569
+msgid	"# Character used to show that an art is unread (default '+')\n"
+	"# _ is turned into ' '\n"
+msgstr	""
+
+#: src/lang.c:1574
+msgid	"Enter character to indicate read articles. <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:1575
+msgid	"Character to show read articles"
+msgstr	""
+
+#: src/lang.c:1576
+msgid	"# Character used to show that an art was read (default ' ')\n"
+	"# _ is turned into ' '\n"
+msgstr	""
+
+#: src/lang.c:1581
+msgid	"Enter character to indicate killed articles. <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:1582
+msgid	"Character to show killed articles"
+msgstr	""
+
+#: src/lang.c:1583
+msgid	"# Character used to show that an art was killed (default 'K')\n"
+	"# kill_level must be set accordingly, _ is turned into ' '\n"
+msgstr	""
+
+#: src/lang.c:1588
+msgid	"Enter character to indicate read selected articles. <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:1589
+msgid	"Character to show readselected arts"
+msgstr	""
+
+#: src/lang.c:1590
+msgid	"# Character used to show that an art was selected before read (default ':')\n"
+	"# kill_level must be set accordingly, _ is turned into ' '\n"
+msgstr	""
+
+#: src/lang.c:1595
+msgid	"Enter maximum length of newsgroup names displayed. <CR> sets."
+msgstr	""
+
+#: src/lang.c:1596
+msgid	"Max. length of group names shown"
+msgstr	""
+
+#: src/lang.c:1597
+msgid	"# Maximum length of the names of newsgroups displayed\n"
+msgstr	""
+
+#: src/lang.c:1602
+msgid	"Show lines/score in listings"
+msgstr	""
+
+#: src/lang.c:1603
+msgid	"# What informations should be displayed in article/thread listing\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = lines\n"
+	"#   2 = score\n"
+	"#   3 = lines & score\n"
+msgstr	""
+
+#: src/lang.c:1612
+msgid	"0 = full page scrolling, -1 = show previous last line as first on next page, -"
+	"2 = half page"
+msgstr	""
+
+#: src/lang.c:1613
+msgid	"Number of lines to scroll in pager"
+msgstr	""
+
+#: src/lang.c:1614
+msgid	"# Number of lines that cursor-up/down will scroll in article pager\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#  -2 = half-page scrolling\n"
+	"#  -1 = the top/bottom line is carried over onto the next page\n"
+	"#   0 = page-by-page (traditional behavior)\n"
+	"# * 1 = line-by-line\n"
+	"#   2 or greater = scroll by 2 or more lines (only in the pager)\n"
+msgstr	""
+
+#: src/lang.c:1624
+msgid	"Display signatures. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1625
+msgid	"Display signatures"
+msgstr	""
+
+#: src/lang.c:1626
+msgid	"# If OFF don't show signatures when displaying articles\n"
+msgstr	""
+
+#: src/lang.c:1630
+msgid	"Display uuencoded data as tagged attachments. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1631
+msgid	"Display uue data as an attachment"
+msgstr	""
+
+#: src/lang.c:1632
+msgid	"# Handling of uuencoded data in the pager\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no, display raw uuencoded data\n"
+	"#   1 = yes, uuencoded data will be condensed to a single tag line showing\n"
+	"#       size and filename, similar to how MIME attachments are displayed\n"
+	"#   2 = hide all, as for 1, but any line that looks like uuencoded data will\n"
+	"#       be folded into a tag line.\n"
+msgstr	""
+
+#: src/lang.c:1642
+msgid	"Decode German style TeX umlaut codes to ISO. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1643
+msgid	"Display \"a as Umlaut-a"
+msgstr	""
+
+#: src/lang.c:1644
+msgid	"# If ON decode German style TeX umlaut codes to ISO and\n"
+	"# show \"a as Umlaut-a, etc.\n"
+msgstr	""
+
+#: src/lang.c:1649 src/lang.c:1659
+msgid	"Space separated list of header fields"
+msgstr	""
+
+#: src/lang.c:1650
+msgid	"Display these header fields (or *)"
+msgstr	""
+
+#: src/lang.c:1651
+msgid	"# Which news headers you wish to see. If you want to see _all_ the headers,\n"
+	"# place an '*' as this value. This is the only way a wildcard can be used.\n"
+	"# If you enter 'X-' as the value, you will see all headers beginning with\n"
+	"# 'X-' (like X-Alan or X-Pape). You can list more than one by delimiting "
+	"with\n"
+	"# spaces. Not defining anything turns off this option.\n"
+msgstr	""
+
+#: src/lang.c:1660
+msgid	"Do not display these header fields"
+msgstr	""
+
+#: src/lang.c:1661
+msgid	"# Same as 'news_headers_to_display' except it denotes the opposite.\n"
+	"# An example of using both options might be if you thought X- headers were\n"
+	"# A Good Thing(tm), but thought Alan and Pape were miscreants...well then "
+	"you\n"
+	"# would do something like this:\n"
+	"# news_headers_to_display=X-\n"
+	"# news_headers_to_not_display=X-Alan X-Pape\n"
+	"# Not defining anything turns off this option.\n"
+msgstr	""
+
+#: src/lang.c:1671
+msgid	"Do you want to enable automatic handling of multipart/alternative articles?"
+msgstr	""
+
+#: src/lang.c:1672
+msgid	"Skip multipart/alternative parts"
+msgstr	""
+
+#: src/lang.c:1673
+msgid	"# If ON strip multipart/alternative messages automatically\n"
+msgstr	""
+
+#: src/lang.c:1678
+msgid	"A regex used to decide which lines to show in col_quote."
+msgstr	""
+
+#: src/lang.c:1679
+msgid	"Regex used to show quoted lines"
+msgstr	""
+
+#: src/lang.c:1680
+msgid	"# A regular expression that tin will use to decide which lines are\n"
+	"# quoted when viewing articles. Quoted lines are shown in col_quote.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1686
+msgid	"A regex used to decide which lines to show in col_quote2."
+msgstr	""
+
+#: src/lang.c:1687
+msgid	"Regex used to show twice quoted l."
+msgstr	""
+
+#: src/lang.c:1688
+msgid	"# A regular expression that tin will use to decide which lines are\n"
+	"# quoted twice. Twice quoted lines are shown in col_quote2.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1694
+msgid	"A regex used to decide which lines to show in col_quote3."
+msgstr	""
+
+#: src/lang.c:1695
+msgid	"Regex used to show >= 3 times q.l."
+msgstr	""
+
+#: src/lang.c:1696
+msgid	"# A regular expression that tin will use to decide which lines are\n"
+	"# quoted >=3 times. >=3 times quoted lines are shown in col_quote3.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1703
+msgid	"A regex used to decide which words to show in col_markslashes."
+msgstr	""
+
+#: src/lang.c:1704
+msgid	"Regex used to highlight /slashes/"
+msgstr	""
+
+#: src/lang.c:1705
+msgid	"# A regular expression that tin will use to decide which words\n"
+	"# bounded by '/' are to be shown in col_markslashes.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1711
+msgid	"A regex used to decide which words to show in col_markstars."
+msgstr	""
+
+#: src/lang.c:1712
+msgid	"Regex used to highlight *stars*"
+msgstr	""
+
+#: src/lang.c:1713
+msgid	"# A regular expression that tin will use to decide which words\n"
+	"# bounded by '*' are to be shown in col_markstars.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1719
+msgid	"A regex used to decide which words to show in col_markstroke."
+msgstr	""
+
+#: src/lang.c:1720
+msgid	"Regex used to highlight -strokes-"
+msgstr	""
+
+#: src/lang.c:1721
+msgid	"# A regular expression that tin will use to decide which words\n"
+	"# bounded by '-' are to be shown in col_markstroke.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1727
+msgid	"A regex used to decide which words to show in col_markdash."
+msgstr	""
+
+#: src/lang.c:1728
+msgid	"Regex used to highlight _underline_"
+msgstr	""
+
+#: src/lang.c:1729
+msgid	"# A regular expression that tin will use to decide which words\n"
+	"# bounded by '_' are to be shown in col_markdash.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1735
+msgid	"A regex used to find Subject prefixes to remove.  Use '|' as separator."
+msgstr	""
+
+#: src/lang.c:1736
+msgid	"Regex with Subject prefixes"
+msgstr	""
+
+#: src/lang.c:1737
+msgid	"# A regular expression that tin will use to find Subject prefixes\n"
+	"# which will be removed before showing the header.\n"
+msgstr	""
+
+#: src/lang.c:1742
+msgid	"A regex used to find Subject suffixes to remove.  Use '|' as separator."
+msgstr	""
+
+#: src/lang.c:1743
+msgid	"Regex with Subject suffixes"
+msgstr	""
+
+#: src/lang.c:1744
+msgid	"# A regular expression that tin will use to find Subject suffixes\n"
+	"# which will be removed when replying or posting followup.\n"
+msgstr	""
+
+#: src/lang.c:1749
+msgid	"Enter name and options for external MIME viewer, --internal for built-in "
+	"viewer"
+msgstr	""
+
+#: src/lang.c:1750
+msgid	"MIME binary content viewer"
+msgstr	""
+
+#: src/lang.c:1751
+msgid	"# If --internal automatically use the built in MIME viewer for non-text\n"
+	"# parts of articles.\n"
+	"# Otherwise specify an external viewer program (eg, metamail) or leave blank\n"
+	"# for no automatic viewing\n"
+msgstr	""
+
+#: src/lang.c:1758
+msgid	"Confirm before starting non-text viewing program"
+msgstr	""
+
+#: src/lang.c:1759
+msgid	"Ask before using MIME viewer"
+msgstr	""
+
+#: src/lang.c:1760
+msgid	"# If ON tin will ask before using metamail to display MIME messages\n"
+	"# this only happens if metamail_prog is set to something\n"
+msgstr	""
+
+#: src/lang.c:1765
+msgid	"Ask to mark groups read when quitting. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1766
+msgid	"Catchup read groups when quitting"
+msgstr	""
+
+#: src/lang.c:1767
+msgid	"# If ON ask user if read groups should all be marked read\n"
+msgstr	""
+
+#: src/lang.c:1772
+msgid	"Catchup group using left key"
+msgstr	""
+
+#: src/lang.c:1773
+msgid	"# If ON catchup group/thread when leaving with the left arrow key.\n"
+msgstr	""
+
+#: src/lang.c:1778
+msgid	"Catchup thread by using left key"
+msgstr	""
+
+#: src/lang.c:1784
+msgid	"Which actions require confirmation"
+msgstr	""
+
+#: src/lang.c:1785
+msgid	"# What should we ask confirmation for.\n"
+msgstr	""
+
+#: src/lang.c:1790
+msgid	"'Mark article read' ignores tags"
+msgstr	""
+
+#: src/lang.c:1791
+msgid	"# If ON the 'Mark article read' function marks only the current article.\n"
+msgstr	""
+
+#: src/lang.c:1795
+msgid	"Program to run to open URL's, <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:1796
+msgid	"Program that opens URL's"
+msgstr	""
+
+#: src/lang.c:1797
+msgid	"# The program used to open URL's. The actual URL will be appended\n"
+msgstr	""
+
+#: src/lang.c:1802
+msgid	"Use mouse in xterm"
+msgstr	""
+
+#: src/lang.c:1803
+msgid	"# If ON enable mouse key support on xterm terminals\n"
+msgstr	""
+
+#: src/lang.c:1809
+msgid	"Use scroll keys on keypad"
+msgstr	""
+
+#: src/lang.c:1810
+msgid	"# If ON enable scroll keys on terminals that support it\n"
+msgstr	""
+
+#: src/lang.c:1815
+msgid	"Enter maximum number of article to get. <CR> sets."
+msgstr	""
+
+#: src/lang.c:1816
+msgid	"Number of articles to get"
+msgstr	""
+
+#: src/lang.c:1817
+msgid	"# Number of articles to get (0=no limit), if negative sets maximum number\n"
+	"# of already read articles to be read before first unread one\n"
+msgstr	""
+
+#: src/lang.c:1822
+msgid	"Enter number of days article is considered recent. <CR> sets."
+msgstr	""
+
+#: src/lang.c:1823
+msgid	"Article recentness time limit"
+msgstr	""
+
+#: src/lang.c:1824
+msgid	"# Number of days in which article is considered recent, (0=OFF)\n"
+msgstr	""
+
+#: src/lang.c:1828
+msgid	"WILDMAT for normal wildcards, REGEX for full regular expression matching."
+msgstr	""
+
+#: src/lang.c:1829
+msgid	"Wildcard matching"
+msgstr	""
+
+#: src/lang.c:1830
+msgid	"# Wildcard matching\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = wildmat\n"
+	"#   1 = regex\n"
+msgstr	""
+
+#: src/lang.c:1837
+msgid	"Enter minimal score before an article is marked killed. <CR> sets."
+msgstr	""
+
+#: src/lang.c:1838
+msgid	"Score limit (kill)"
+msgstr	""
+
+#: src/lang.c:1839
+msgid	"# Score limit before an article is marked killed\n"
+msgstr	""
+
+#: src/lang.c:1843
+msgid	"Enter default score to kill articles. <CR> sets."
+msgstr	""
+
+#: src/lang.c:1844
+msgid	"Default score to kill articles"
+msgstr	""
+
+#: src/lang.c:1845
+msgid	"# Default score to kill articles\n"
+msgstr	""
+
+#: src/lang.c:1849
+msgid	"Enter minimal score before an article is marked hot. <CR> sets."
+msgstr	""
+
+#: src/lang.c:1850
+msgid	"Score limit (select)"
+msgstr	""
+
+#: src/lang.c:1851
+msgid	"# Score limit before an article is marked hot\n"
+msgstr	""
+
+#: src/lang.c:1855
+msgid	"Enter default score to select articles. <CR> sets."
+msgstr	""
+
+#: src/lang.c:1856
+msgid	"Default score to select articles"
+msgstr	""
+
+#: src/lang.c:1857
+msgid	"# Default score to select articles\n"
+msgstr	""
+
+#: src/lang.c:1863
+msgid	"Use slrnface to show ''X-Face:''s"
+msgstr	""
+
+#: src/lang.c:1864
+msgid	"# If ON using slrnface(1) to interpret the ''X-Face:'' header.\n"
+	"# Only useful when running in an xterm.\n"
+msgstr	""
+
+#: src/lang.c:1872
+msgid	"Use ANSI color"
+msgstr	""
+
+#: src/lang.c:1873
+msgid	"# If ON using ANSI-color\n"
+msgstr	""
+
+#: src/lang.c:1878
+msgid	"Standard foreground color"
+msgstr	""
+
+#: src/lang.c:1879
+msgid	"# Standard foreground color\n"
+	"# Default: -1 (default color)\n"
+msgstr	""
+
+#: src/lang.c:1885
+msgid	"Standard background color"
+msgstr	""
+
+#: src/lang.c:1886
+msgid	"# Standard background color\n"
+	"# Default: -1 (default color)\n"
+msgstr	""
+
+#: src/lang.c:1892
+msgid	"Color for inverse text (background)"
+msgstr	""
+
+#: src/lang.c:1893
+msgid	"# Color of background for inverse text\n"
+	"# Default: 4 (blue)\n"
+msgstr	""
+
+#: src/lang.c:1899
+msgid	"Color for inverse text (foreground)"
+msgstr	""
+
+#: src/lang.c:1900
+msgid	"# Color of foreground for inverse text\n"
+	"# Default: 7 (white)\n"
+msgstr	""
+
+#: src/lang.c:1906
+msgid	"Color of text lines"
+msgstr	""
+
+#: src/lang.c:1907
+msgid	"# Color of text lines\n"
+	"# Default: -1 (default color)\n"
+msgstr	""
+
+#: src/lang.c:1913
+msgid	"Color of mini help menu"
+msgstr	""
+
+#: src/lang.c:1914
+msgid	"# Color of mini help menu\n"
+	"# Default: 3 (brown)\n"
+msgstr	""
+
+#: src/lang.c:1920
+msgid	"Color of help text"
+msgstr	""
+
+#: src/lang.c:1921
+msgid	"# Color of help pages\n"
+	"# Default: -1 (default color)\n"
+msgstr	""
+
+#: src/lang.c:1927
+msgid	"Color of status messages"
+msgstr	""
+
+#: src/lang.c:1928
+msgid	"# Color of messages in last line\n"
+	"# Default: 6 (cyan)\n"
+msgstr	""
+
+#: src/lang.c:1934
+msgid	"Color of quoted lines"
+msgstr	""
+
+#: src/lang.c:1935
+msgid	"# Color of quote-lines\n"
+	"# Default: 2 (green)\n"
+msgstr	""
+
+#: src/lang.c:1941
+msgid	"Color of twice quoted line"
+msgstr	""
+
+#: src/lang.c:1942
+msgid	"# Color of twice quoted lines\n"
+	"# Default: 3 (brown)\n"
+msgstr	""
+
+#: src/lang.c:1948
+msgid	"Color of =>3 times quoted line"
+msgstr	""
+
+#: src/lang.c:1949
+msgid	"# Color of >=3 times quoted lines\n"
+	"# Default: 4 (blue)\n"
+msgstr	""
+
+#: src/lang.c:1955
+msgid	"Color of article header lines"
+msgstr	""
+
+#: src/lang.c:1956
+msgid	"# Color of header-lines\n"
+	"# Default: 2 (green)\n"
+msgstr	""
+
+#: src/lang.c:1962
+msgid	"Color of actual news header fields"
+msgstr	""
+
+#: src/lang.c:1963
+msgid	"# Color of actual news header fields\n"
+	"# Default: 9 (light red)\n"
+msgstr	""
+
+#: src/lang.c:1969
+msgid	"Color of article subject lines"
+msgstr	""
+
+#: src/lang.c:1970
+msgid	"# Color of article subject\n"
+	"# Default: 6 (cyan)\n"
+msgstr	""
+
+#: src/lang.c:1976
+msgid	"Color of response counter"
+msgstr	""
+
+#: src/lang.c:1977
+msgid	"# Color of response counter\n"
+	"# Default: 2 (green)\n"
+msgstr	""
+
+#: src/lang.c:1983
+msgid	"Color of sender (From:)"
+msgstr	""
+
+#: src/lang.c:1984
+msgid	"# Color of sender (From:)\n"
+	"# Default: 2 (green)\n"
+msgstr	""
+
+#: src/lang.c:1990
+msgid	"Color of help/mail sign"
+msgstr	""
+
+#: src/lang.c:1991
+msgid	"# Color of Help/Mail-Sign\n"
+	"# Default: 4 (blue)\n"
+msgstr	""
+
+#: src/lang.c:1997
+msgid	"Color of signatures"
+msgstr	""
+
+#: src/lang.c:1998
+msgid	"# Color of signature\n"
+	"# Default: 4 (blue)\n"
+msgstr	""
+
+#: src/lang.c:2004
+msgid	"Color of highlighted URLs"
+msgstr	""
+
+#: src/lang.c:2005
+msgid	"# Color of highlighted URLs\n"
+	"# Default: -1 (default color)\n"
+msgstr	""
+
+#: src/lang.c:2011
+msgid	"Color of highlighting with *stars*"
+msgstr	""
+
+#: src/lang.c:2012
+msgid	"# Color of word highlighting with *stars*\n"
+	"# Default: 11 (yellow)\n"
+msgstr	""
+
+#: src/lang.c:2018
+msgid	"Color of highlighting with _dash_"
+msgstr	""
+
+#: src/lang.c:2019
+msgid	"# Color of word highlighting with _dash_\n"
+	"# Default: 13 (light pink)\n"
+msgstr	""
+
+#: src/lang.c:2025
+msgid	"Color of highlighting with /slash/"
+msgstr	""
+
+#: src/lang.c:2026
+msgid	"# Color of word highlighting with /slash/\n"
+	"# Default: 14 (light cyan)\n"
+msgstr	""
+
+#: src/lang.c:2032
+msgid	"Color of highlighting with -stroke-"
+msgstr	""
+
+#: src/lang.c:2033
+msgid	"# Color of word highlighting with -stroke-\n"
+	"# Default: 12 (light blue)\n"
+msgstr	""
+
+#: src/lang.c:2040
+msgid	"Attr. of highlighting with *stars*"
+msgstr	""
+
+#: src/lang.c:2041
+msgid	"# Attributes of word highlighting on mono terminals\n"
+	"# Possible values are:\n"
+	"#   0 = Normal\n"
+	"#   1 = Underline\n"
+	"#   2 = Best highlighting\n"
+	"#   3 = Reverse video\n"
+	"#   4 = Blinking\n"
+	"#   5 = Half bright\n"
+	"#   6 = Bold\n"
+	"\n"
+	"# Attribute of word highlighting with *stars*\n"
+	"# Default: 6 (bold)\n"
+msgstr	""
+
+#: src/lang.c:2056
+msgid	"Attr. of highlighting with _dash_"
+msgstr	""
+
+#: src/lang.c:2057
+msgid	"# Attribute of word highlighting with _dash_\n"
+	"# Default: 2 (best highlighting)\n"
+msgstr	""
+
+#: src/lang.c:2063
+msgid	"Attr. of highlighting with /slash/"
+msgstr	""
+
+#: src/lang.c:2064
+msgid	"# Attribute of word highlighting with /slash/\n"
+	"# Default: 5 (half bright)\n"
+msgstr	""
+
+#: src/lang.c:2070
+msgid	"Attr. of highlighting with -stroke-"
+msgstr	""
+
+#: src/lang.c:2071
+msgid	"# Attribute of word highlighting with -stroke-\n"
+	"# Default: 3 (reverse video)\n"
+msgstr	""
+
+#: src/lang.c:2077
+msgid	"URL highlighting in message body"
+msgstr	""
+
+#: src/lang.c:2078
+msgid	"# Enable URL highlighting?\n"
+msgstr	""
+
+#: src/lang.c:2083
+msgid	"Word highlighting in message body"
+msgstr	""
+
+#: src/lang.c:2084
+msgid	"# Enable word highlighting?\n"
+msgstr	""
+
+#: src/lang.c:2089
+msgid	"What to display instead of mark"
+msgstr	""
+
+#: src/lang.c:2090
+msgid	"# Should the leading and ending stars and dashes also be displayed,\n"
+	"# even when they are highlighting marks?\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = no\n"
+	"#   1 = yes, display mark\n"
+	"# * 2 = print a space instead\n"
+msgstr	""
+
+#: src/lang.c:2099
+msgid	"Enter column number to wrap article lines to in the pager. <CR> sets."
+msgstr	""
+
+#: src/lang.c:2100
+msgid	"Page line wrap column"
+msgstr	""
+
+#: src/lang.c:2101
+msgid	"# Wrap article lines at column\n"
+msgstr	""
+
+#: src/lang.c:2106
+msgid	"Wrap around threads on next unread"
+msgstr	""
+
+#: src/lang.c:2107
+msgid	"# If ON wrap around threads on searching next unread article\n"
+msgstr	""
+
+#: src/lang.c:2111
+msgid	"Enter default mail address (and fullname). <CR> sets."
+msgstr	""
+
+#: src/lang.c:2112
+msgid	"Mail address (and fullname)"
+msgstr	""
+
+#: src/lang.c:2113
+msgid	"# User's mail address (and fullname), if not username@host (fullname)\n"
+msgstr	""
+
+#: src/lang.c:2118
+msgid	"Show empty Followup-To in editor"
+msgstr	""
+
+#: src/lang.c:2119
+msgid	"# If ON show empty Followup-To header when editing an article\n"
+msgstr	""
+
+#: src/lang.c:2123
+msgid	"Enter path/! command/--none to create your default signature. <CR> sets."
+msgstr	""
+
+#: src/lang.c:2124
+msgid	"Create signature from path/command"
+msgstr	""
+
+#: src/lang.c:2125
+msgid	"# Signature path (random sigs)/file to be used when posting/replying\n"
+	"# default_sigfile=file       appends file as signature\n"
+	"# default_sigfile=!command   executes external command to generate a "
+	"signature\n"
+	"# default_sigfile=--none     don't append a signature\n"
+msgstr	""
+
+#: src/lang.c:2132
+msgid	"Prepend signature with \"-- \" on own line. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2133
+msgid	"Prepend signature with \"-- \""
+msgstr	""
+
+#: src/lang.c:2134
+msgid	"# If ON prepend the signature with dashes '\\n-- \\n'\n"
+msgstr	""
+
+#: src/lang.c:2138
+msgid	"Add signature when reposting articles. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2139
+msgid	"Add signature when reposting"
+msgstr	""
+
+#: src/lang.c:2140
+msgid	"# If ON add signature to reposted articles\n"
+msgstr	""
+
+#: src/lang.c:2144
+#, c-format
+msgid	"Enter quotation marks, %s or %S for author's initials."
+msgstr	""
+
+#: src/lang.c:2145
+msgid	"Characters used as quote-marks"
+msgstr	""
+
+#: src/lang.c:2146
+#, c-format
+msgid	"# Characters used in quoting to followups and replies.\n"
+	"# '_' is replaced by ' ', %%s, %%S are replaced by author's initials.\n"
+msgstr	""
+
+#: src/lang.c:2152
+msgid	"Quoting behavior"
+msgstr	""
+
+#: src/lang.c:2153
+msgid	"# How quoting should be handled when following up or replying.\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = Nothing special\n"
+	"#   1 = Compress quotes\n"
+	"#   2 = Quote signatures\n"
+	"#   3 = Compress quotes, quote signatures\n"
+	"#   4 = Quote empty lines\n"
+	"# * 5 = Compress quotes, quote empty lines\n"
+	"#   6 = Quote signatures, quote empty lines\n"
+	"#   7 = Compress quotes, quote signatures, quote empty lines\n"
+msgstr	""
+
+#: src/lang.c:2166 src/lang.c:2174 src/lang.c:2180
+msgid	"%A Addr %D Date %F Addr+Name %G Groupname %M Message-ID %N Name %C First Name"
+msgstr	""
+
+#: src/lang.c:2167
+msgid	"Quote line when following up"
+msgstr	""
+
+#: src/lang.c:2168
+#, c-format
+msgid	"# Format of quote line when mailing/posting/following-up an article\n"
+	"# %%A Address    %%D Date   %%F Addr+Name   %%G Groupname   %%M Message-ID\n"
+	"# %%N Full Name  %%C First Name   %%I Initials\n"
+msgstr	""
+
+#: src/lang.c:2175
+msgid	"Quote line when cross-posting"
+msgstr	""
+
+#: src/lang.c:2181
+msgid	"Quote line when mailing"
+msgstr	""
+
+#: src/lang.c:2186
+msgid	"If ON, include User-Agent: header. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2187
+msgid	"Insert 'User-Agent:'-header"
+msgstr	""
+
+#: src/lang.c:2188
+msgid	"# If ON include advertising User-Agent: header\n"
+msgstr	""
+
+#: src/lang.c:2193
+msgid	"Enter charset name for MIME (e.g. US-ASCII, ISO-8859-1, EUC-KR), <CR> to set."
+msgstr	""
+
+#: src/lang.c:2194
+msgid	"MM_CHARSET"
+msgstr	""
+
+#: src/lang.c:2195
+msgid	"# Charset supported locally which is also used for MIME header and\n"
+	"# Content-Type header.\n"
+	"# If not set, the value of the environment variable MM_CHARSET is used.\n"
+	"# Set to US-ASCII or compile time default if neither of them is defined.\n"
+	"# If MIME_STRICT_CHARSET is defined at compile-time, charset other than\n"
+	"# mm_charset is considered not displayable and represented as '?'.\n"
+msgstr	""
+
+#: src/lang.c:2205
+msgid	"MM_NETWORK_CHARSET"
+msgstr	""
+
+#: src/lang.c:2206
+msgid	"# Charset used for MIME (Content-Type) header in postings.\n"
+msgstr	""
+
+#: src/lang.c:2212
+msgid	"Mailbox format"
+msgstr	""
+
+#: src/lang.c:2213
+msgid	"# Format of the mailbox.\n"
+msgstr	""
+
+#: src/lang.c:2218
+msgid	"MIME encoding in news messages"
+msgstr	""
+
+#: src/lang.c:2219
+msgid	"# MIME encoding (8bit, base64, quoted-printable, 7bit) of the body\n"
+	"# for mails and posts, if necessary. QP is efficient for most European\n"
+	"# character sets (ISO-8859-X) with small fraction of non-US-ASCII chars,\n"
+	"# while Base64 is more efficient for most 8bit East Asian, Greek, and\n"
+	"# Russian charsets with a lot of 8bit characters.\n"
+msgstr	""
+
+#: src/lang.c:2227 src/lang.c:2248
+msgid	"Don't change unless you know what you are doing. <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:2228
+msgid	"Use 8bit characters in news headers"
+msgstr	""
+
+#: src/lang.c:2229
+msgid	"# If ON, 8bit characters in news headers are NOT encoded.\n"
+	"# default is OFF. Thus 8bit characters are encoded by default.\n"
+	"# 8bit chars in header are encoded regardless of the value of this\n"
+	"# parameter unless post_mime_encoding is 8bit as well.\n"
+msgstr	""
+
+#: src/lang.c:2236
+msgid	"Auto-view post-processed files <SPACE> toggles, <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:2237
+msgid	"View post-processed files"
+msgstr	""
+
+#: src/lang.c:2238
+msgid	"# If set, post processed files will be opened in a viewer\n"
+msgstr	""
+
+#: src/lang.c:2243
+msgid	"MIME encoding in mail messages"
+msgstr	""
+
+#: src/lang.c:2249
+msgid	"Use 8bit characters in mail headers"
+msgstr	""
+
+#: src/lang.c:2250
+msgid	"# If ON, 8bit characters in mail headers are NOT encoded.\n"
+	"# default is OFF. Thus 8bit characters are encoded by default.\n"
+	"# 8bit chars in headers are encoded regardless of the value of this "
+	"parameter\n"
+	"# unless mail_mime_encoding is 8bit as well. Note that RFC 2822\n"
+	"# prohibits 8bit characters in mail headers so that you are advised NOT to\n"
+	"# turn it ON unless you have some compelling reason.\n"
+msgstr	""
+
+#: src/lang.c:2260
+msgid	"Strip blanks from ends of lines"
+msgstr	""
+
+#: src/lang.c:2261
+msgid	"# If ON strip blanks from ends of lines for faster display on slow "
+	"terminals.\n"
+msgstr	""
+
+#: src/lang.c:2266
+msgid	"If ON, use transliteration. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2267
+msgid	"Transliteration"
+msgstr	""
+
+#: src/lang.c:2268
+msgid	"# If ON, use //TRANSLIT extension. This means that when a character cannot\n"
+	"# be represented in the in the target character set, it can be approximated\n"
+	"# through one or several similarly looking characters.\n"
+msgstr	""
+
+#: src/lang.c:2275
+msgid	"Send you a carbon copy automatically. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2276
+msgid	"Send you a cc automatically"
+msgstr	""
+
+#: src/lang.c:2277
+msgid	"# If ON automatically put your name in the Cc: field when mailing an article\n"
+msgstr	""
+
+#: src/lang.c:2281
+msgid	"Send you a blind carbon copy automatically. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2282
+msgid	"Send you a blind cc automatically"
+msgstr	""
+
+#: src/lang.c:2283
+msgid	"# If ON automatically put your name in the Bcc: field when mailing an "
+	"article\n"
+msgstr	""
+
+#: src/lang.c:2287
+msgid	"Enter address elements about which you want to be warned. <CR> sets."
+msgstr	""
+
+#: src/lang.c:2288
+msgid	"Spamtrap warning address parts"
+msgstr	""
+
+#: src/lang.c:2289
+msgid	"# A comma-delimited list of address-parts you want to be warned\n"
+	"# about when trying to reply by email.\n"
+msgstr	""
+
+#: src/lang.c:2294
+msgid	"Enter default number of days a filter entry will be valid. <CR> sets."
+msgstr	""
+
+#: src/lang.c:2295
+msgid	"No. of days a filter entry is valid"
+msgstr	""
+
+#: src/lang.c:2296
+msgid	"# Number of days a short term filter will be active\n"
+msgstr	""
+
+#: src/lang.c:2300
+msgid	"Add posted articles to filter. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2301
+msgid	"Add posted articles to filter"
+msgstr	""
+
+#: src/lang.c:2302
+msgid	"# If ON add posted articles which start a new thread to filter for\n"
+	"# highlighting follow-ups\n"
+msgstr	""
+
+#: src/lang.c:2306
+msgid	"The directory where articles/threads are to be saved in mailbox format."
+msgstr	""
+
+#: src/lang.c:2307
+msgid	"Mail directory"
+msgstr	""
+
+#: src/lang.c:2308
+msgid	"# (-m) directory where articles/threads are saved in mailbox format\n"
+msgstr	""
+
+#: src/lang.c:2313
+msgid	"Save articles in batch mode (-S)"
+msgstr	""
+
+#: src/lang.c:2314
+msgid	"# If ON articles/threads will be saved in batch mode when save -S\n"
+	"# or mail (-M/-N) is specified on the command line\n"
+msgstr	""
+
+#: src/lang.c:2319
+msgid	"The directory where you want articles/threads saved."
+msgstr	""
+
+#: src/lang.c:2320
+msgid	"Directory to save arts/threads in"
+msgstr	""
+
+#: src/lang.c:2321
+msgid	"# Directory where articles/threads are saved\n"
+msgstr	""
+
+#: src/lang.c:2325
+msgid	"Auto save article/thread by Archive-name: header. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2326
+msgid	"Use Archive-name: header for save"
+msgstr	""
+
+#: src/lang.c:2327
+msgid	"# If ON articles/threads with Archive-name: in mail header will\n"
+	"# be automatically saved with the Archive-name & part/patch no.\n"
+msgstr	""
+
+#: src/lang.c:2332
+msgid	"Mark saved articles/threads as read. <SPACE> toggles, <CR> sets, <ESC> "
+	"cancels."
+msgstr	""
+
+#: src/lang.c:2333
+msgid	"Mark saved articles/threads as read"
+msgstr	""
+
+#: src/lang.c:2334
+msgid	"# If ON mark articles that are saved as read\n"
+msgstr	""
+
+#: src/lang.c:2338
+msgid	"Do post processing (eg. extract attachments) for saved articles."
+msgstr	""
+
+#: src/lang.c:2339
+msgid	"Post process saved articles"
+msgstr	""
+
+#: src/lang.c:2340
+msgid	"# Perform post processing (saving binary attachments) from saved articles.\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no\n"
+	"#   1 = extract shell archives (shar) only\n"
+	"#   2 = yes\n"
+msgstr	""
+
+#: src/lang.c:2349
+msgid	"Process only unread articles"
+msgstr	""
+
+#: src/lang.c:2350
+msgid	"# If ON only save/print/pipe/mail unread articles (tagged articles excepted)\n"
+msgstr	""
+
+#: src/lang.c:2355
+msgid	"Print all or just part of header. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2356
+msgid	"Print all headers when printing"
+msgstr	""
+
+#: src/lang.c:2357
+msgid	"# If ON print all of article header otherwise just the important lines\n"
+msgstr	""
+
+#: src/lang.c:2361
+msgid	"The printer program with options that is to be used to print articles/threads."
+msgstr	""
+
+#: src/lang.c:2362
+msgid	"Printer program with options"
+msgstr	""
+
+#: src/lang.c:2363
+msgid	"# Print program with parameters used to print articles/threads\n"
+msgstr	""
+
+#: src/lang.c:2369
+msgid	"Force redraw after certain commands"
+msgstr	""
+
+#: src/lang.c:2370
+msgid	"# If ON a screen redraw will always be done after certain external commands\n"
+msgstr	""
+
+#: src/lang.c:2374
+msgid	"Start editor with line offset. <SPACE> toggles, <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:2375
+msgid	"Start editor with line offset"
+msgstr	""
+
+#: src/lang.c:2376
+msgid	"# If ON editor will be started with cursor offset into the file\n"
+	"# otherwise the cursor will be positioned at the first line\n"
+msgstr	""
+
+#: src/lang.c:2381
+msgid	"Enter %E for editor, %F for filename, %N for line-number, <CR> to set."
+msgstr	""
+
+#: src/lang.c:2382
+msgid	"Invocation of your editor"
+msgstr	""
+
+#: src/lang.c:2383
+#, c-format
+msgid	"# Format of editor line including parameters\n"
+	"# %%E Editor  %%F Filename  %%N Linenumber\n"
+msgstr	""
+
+#: src/lang.c:2388
+msgid	"Enter name and options for external-inews, --internal for internal inews"
+msgstr	""
+
+#: src/lang.c:2389
+msgid	"External inews"
+msgstr	""
+
+#: src/lang.c:2390
+msgid	"# If --internal use the built in mini inews for posting via NNTP\n"
+	"# otherwise use an external inews program\n"
+msgstr	""
+
+#: src/lang.c:2394
+msgid	"Enter %M for mailer, %S for subject, %T for to, %F for filename, <CR> to set."
+msgstr	""
+
+#: src/lang.c:2395
+msgid	"Invocation of your mail command"
+msgstr	""
+
+#: src/lang.c:2396
+#, c-format
+msgid	"# Format of mailer line including parameters\n"
+	"# %%M Mailer  %%S Subject  %%T To  %%F Filename\n"
+	"# ie. to use elm as your mailer:    elm -s \"%%S\" \"%%T\" < %%F\n"
+	"# ie. elm interactive          :    elm -i %%F -s \"%%S\" \"%%T\"\n"
+msgstr	""
+
+#: src/lang.c:2404
+msgid	"Use interactive mail reader"
+msgstr	""
+
+#: src/lang.c:2405
+msgid	"# Interactive mailreader\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no interactive mailreader\n"
+	"#   1 = use interactive mailreader with headers in file\n"
+	"#   2 = use interactive mailreader without headers in file\n"
+msgstr	""
+
+#: src/lang.c:2414
+msgid	"Remove ~/.article after posting"
+msgstr	""
+
+#: src/lang.c:2415
+msgid	"# If ON remove ~/.article after posting.\n"
+msgstr	""
+
+#: src/lang.c:2419
+msgid	"Filename for all posted articles, <CR> sets, no filename=do not save."
+msgstr	""
+
+#: src/lang.c:2420
+msgid	"Filename for posted articles"
+msgstr	"éÍÑ ÆÁÊÌÁ ÄÌÑ ÏÔÐÒÁ×ÌÅÎÎÙÈ ÓÔÁÔÅÊ"
+
+#: src/lang.c:2421
+msgid	"# Filename where to keep all postings (default posted)\n"
+	"# If no filename is set then postings will not be saved\n"
+msgstr	""
+
+#: src/lang.c:2426
+msgid	"Keep all failed articles in ~/dead.articles. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2427
+msgid	"Keep failed arts in ~/dead.articles"
+msgstr	""
+
+#: src/lang.c:2428
+msgid	"# If ON keep all failed postings in ~/dead.articles\n"
+msgstr	""
+
+#: src/lang.c:2432
+msgid	"Do you want to strip unsubscribed groups from .newsrc"
+msgstr	""
+
+#: src/lang.c:2433
+msgid	"No unsubscribed groups in newsrc"
+msgstr	""
+
+#: src/lang.c:2434
+msgid	"# If ON strip unsubscribed groups from newsrc\n"
+msgstr	""
+
+#: src/lang.c:2439
+msgid	"Remove bogus groups from newsrc"
+msgstr	""
+
+#: src/lang.c:2440
+msgid	"# What to do with bogus groups in newsrc file\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = keep\n"
+	"#   1 = remove\n"
+	"#   2 = highlight with D on selection screen\n"
+msgstr	""
+
+#: src/lang.c:2448
+msgid	"Enter number of seconds until active file will be reread. <CR> sets."
+msgstr	""
+
+#: src/lang.c:2449
+msgid	"Interval in secs to reread active"
+msgstr	""
+
+#: src/lang.c:2450
+msgid	"# Time interval in seconds between rereading the active file (0=never)\n"
+msgstr	""
+
+#: src/lang.c:2455
+msgid	"Reconnect to server automatically"
+msgstr	"óÏÅÄÉÎÉÔØÓÑ ÓÎÏ×Á Ó ÓÅÒ×ÅÒÏÍ Á×ÔÏÍÁÔÉÞÅÓËÉ"
+
+#: src/lang.c:2456
+msgid	"# If ON automatically reconnect to NNTP server if the connection is broken\n"
+msgstr	""
+
+#: src/lang.c:2460
+msgid	"Create local copies of NNTP overview files. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2461
+msgid	"Cache NNTP overview files locally"
+msgstr	""
+
+#: src/lang.c:2462
+msgid	"# If ON, create local copies of NNTP overview files.\n"
+msgstr	""
+
+#: src/lang.c:2466
+msgid	"Enter format string. <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:2467
+msgid	"Format string for display of dates"
+msgstr	""
+
+#: src/lang.c:2468
+msgid	"# Format string for date representation\n"
+msgstr	""
+
+#: src/lang.c:2474
+msgid	"Unicode normalization form"
+msgstr	""
+
+#: src/lang.c:2475
+msgid	"# Unicode normalization form\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = None\n"
+	"# * 1 = NFKC\n"
+	"#   2 = NFKD\n"
+	"#   3 = NFC\n"
+	"#   4 = NFD\n"
+msgstr	""
+
+#: src/lang.c:2487
+msgid	"Render BiDi"
+msgstr	""
+
+#: src/lang.c:2488
+msgid	"# If ON, bi-directional text is rendered by tin\n"
+msgstr	""
+
+#: src/misc.c:3750
+#, c-format
+msgid	"Version: %s %s release %s (\"%s\") %s %s\n"
+msgstr	""
+
+#: src/misc.c:3753
+#, c-format
+msgid	"Version: %s %s release %s (\"%s\")\n"
+msgstr	""
+
+#: src/newsrc.c:430
+msgid	"Unreachable?\n"
+msgstr	"îÅÄÏÓÔÕÐÎÏ?\n"
+
+#: src/nntplib.c:824
+#, c-format
+msgid	"\n"
+	"Server timed out, trying reconnect # %d\n"
+msgstr	"\n"
+	"óÅÒ×ÅÒ timed out, ÐÏÐÙÔËÁ ÓÏÅÄÉÎÉÔØÓÑ ÓÎÏ×Á # %d\n"
+
+#: src/nntplib.c:842
+msgid	"Rejoin current group\n"
+msgstr	"÷ÓÔÕÐÉÔØ ÓÎÏ×Á × ÔÅËÕÝÕÀ ÇÒÕÐÐÕ\n"
+
+#: src/nntplib.c:849
+#, c-format
+msgid	"Read (%s)\n"
+msgstr	"þÔÅÎÉÅ (%s)\n"
+
+#: src/nntplib.c:851
+#, c-format
+msgid	"Resend last command (%s)\n"
+msgstr	"ðÅÒÅÓÌÁÔØ ÐÏÓÌÅÄÎÀÀ ËÏÍÁÎÄÕ (%s)\n"
+
+#.
+#. * TODO: - store a hash value of the entire motd in the server-rc
+#. *         and only if it differs from the old value display the
+#. *         motd?
+#. *       - use some sort of pager?
+#. *       - -> lang.c
+#.
+#: src/nntplib.c:1759
+msgid	"MOTD: "
+msgstr	""
+
+#: src/nrctbl.c:170
+#, c-format
+msgid	"couldn't expand %s\n"
+msgstr	"ÎÅ ÐÏÌÕÞÉÌÏÓØ ÒÁÓËÒÙÔØ %s\n"
+
+#: src/post.c:1171
+#, c-format
+msgid	"Line %d is longer than 998 octets and should be folded, but\n"
+	"encoding is neither set to %s nor to %s\n"
+msgstr	""
+
+#: src/post.c:1176
+#, c-format
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is set to %s without enabling MIME_BREAK_LONG_LINES or\n"
+	"posting doesn't contain any 8bit chars and thus folding won't happen\n"
+msgstr	""
+
+#: src/post.c:1178
+#, c-format
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is not set to %s\n"
+msgstr	""
+
+#: src/post.c:1993
+#, c-format
+msgid	"Posting: %.*s ..."
+msgstr	"ïÔÐÒÁ×ÌÅÎÉÅ × ÇÒÕÐÐÕ %.*s ..."
+
+#. Check if okay to read
+#: src/read.c:211
+msgid	"Aborting read, please wait..."
+msgstr	"ðÒÅÒÙ×ÁÎÉÅ ÞÔÅÎÉÑ, ÐÏÄÏÖÄÉÔÅ..."
+
+#: src/read.c:358
+msgid	"Aborted read\n"
+msgstr	"þÔÅÎÉÅ ÐÒÅÒ×ÁÎÏ\n"
+
+#: src/read.c:414
+msgid	"Draining\n"
+msgstr	"ïÓÕÛÅÎÉÅ\n"
+
+#. Don't hash the initial '<'
+#: src/refs.c:251
+msgid	"unchanged"
+msgstr	"ÎÅÉÚÍÅÎÅÎÏ"
+
+#: src/refs.c:609
+msgid	"[- Unavailable -]"
+msgstr	"[- îÅÄÏÓÔÕÐÎÏ -]"
+
+#.
+#. * preamble
+#. * TODO: -> lang.c
+#.
+#: src/rfc2047.c:1201
+#, c-format
+msgid	"This message has been composed in the 'multipart/mixed' MIME-format. If you\n"
+	"are reading this prefix, your mail reader probably has not yet been modified\n"
+	"to understand the new format, and some of what follows may look strange.\n"
+	"\n"
+msgstr	""
+
+#: src/save.c:972
+msgid	"bytes"
+msgstr	"ÂÁÊÔ"
+
+#: src/select.c:379
+msgid	"unread"
+msgstr	"ÎÅÐÒÏÞÉÔÁÎÎÙÅ"
+
+#: src/select.c:379
+msgid	"all"
+msgstr	"×ÓÅ"
+
+#: src/select.c:549 src/select.c:551
+msgid	" R"
+msgstr	""
+
+#. TODO: use tin global 'homedir' instead? or even rcdir?
+#: src/xface.c:91
+#, c-format
+msgid	"Can't run slrnface: Environment variable %s not found."
+msgstr	"îÅ ÍÏÇÕ ÚÁÐÕÓÔÉÔØ slrnface: ðÅÒÅÍÅÎÎÁÑ ÏËÒÕÖÅÎÉÑ %s ÎÅ ÎÁÊÄÅÎÁ."
+
+#: src/xface.c:99 src/xface.c:131
+#, c-format
+msgid	"Can't run slrnface: failed to create %s"
+msgstr	"îÅ ÍÏÇÕ ÚÁÐÕÓÔÉÔØ slrnface: ÏÛÉÂËÁ ÓÏÚÄÁÎÉÑ %s"
+
+#: src/xface.c:109
+msgid	"This directory is used to create named pipes for communication between\n"
+	"slrnface and its parent process. It should normally be empty because\n"
+	"the pipe is deleted right after it has been opened by both processes.\n"
+	"\n"
+	"File names generated by slrnface have the form \"hostname.pid\". It is\n"
+	"probably an error if they linger here longer than a fraction of a second.\n"
+	"\n"
+	"However, if the directory is mounted from an NFS server, you might see\n"
+	"special files created by your NFS server while slrnface is running.\n"
+	"Do not try to remove them.\n"
+msgstr	""
+
+#: src/xface.c:123
+msgid	"Can't run slrnface: couldn't construct fifo name."
+msgstr	"îÅ ÍÏÇÕ ÚÁÐÕÓÔÉÔØ slrnface: ÎÅ ÕÄÁÅÔÓÑ ÓÄÅÌÁÔØ ÉÍÑ fifo."
+
+#: src/xface.c:162
+#, c-format
+msgid	"Slrnface abnormally exited, code %d."
+msgstr	"Slrnface ÎÅÐÒÁ×ÉÌØÎÏ ÚÁ×ÅÒÛÅÎÏ Ó ËÏÄÏÍ %d."
+
+#: src/xface.c:206
+#, c-format
+msgid	"Slrnface failed: %s."
+msgstr	"Slrnface ÐÒÏ×ÁÌÉÌÏÓØ: %s."
Binary files tin-1.6.2/po/rw.gmo and tin-1.8.0/po/rw.gmo differ
diff -Nurp tin-1.6.2/po/rw.po tin-1.8.0/po/rw.po
--- tin-1.6.2/po/rw.po	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/po/rw.po	2005-12-24 19:09:52.414469375 +0100
@@ -0,0 +1,6964 @@
+# translation of tin to Kinyarwanda.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+# This file is distributed under the same license as the tin package.
+# Steve Murphy <murf@e-tools.com>, 2005
+# Steve performed initial rough translation from compendium built from translations provided by the following translators:
+# Philibert Ndandali  <ndandali@yahoo.fr>, 2005.
+# Viateur MUGENZI <muvia1@yahoo.fr>, 2005.
+# Noëlla Mupole <s24211045@tuks.co.za>, 2005.
+# Carole Karema <karemacarole@hotmail.com>, 2005.
+# JEAN BAPTISTE NGENDAHAYO <ngenda_denis@yahoo.co.uk>, 2005.
+# Augustin KIBERWA  <akiberwa@yahoo.co.uk>, 2005.
+# Donatien NSENGIYUMVA <ndonatienuk@yahoo.co.uk>, 2005.
+# Antoine Bigirimana <antoine@e-tools.com>, 2005.
+#
+msgid	""
+msgstr	"Project-Id-Version: tin 1.7.8\n"
+	"Report-Msgid-Bugs-To: \n"
+	"POT-Creation-Date: 2005-12-24 19:09+0100\n"
+	"PO-Revision-Date: 2005-04-03 10:55-0700\n"
+	"Last-Translator: Steven Michael Murphy <murf@e-tools.com>\n"
+	"Language-Team: Kinyarwanda <translation-team-rw@lists.sourceforge.net>\n"
+	"MIME-Version: 1.0\n"
+	"Content-Type: text/plain; charset=ISO-8859-1\n"
+	"Content-Transfer-Encoding: 8bit\n"
+
+#: src/art.c:1533
+#, fuzzy, c-format
+msgid	"%d Bad overview record (%d fields) '%s'"
+msgstr	"%d Incamake Icyabitswe Imyanya"
+
+#: src/attrib.c:649
+#, fuzzy, c-format
+msgid	"# Do not edit this comment block\n"
+	"#\n"
+msgstr	"# O YA Guhindura iyi Icyo wongeraho\n"
+	"#\n"
+
+#: src/attrib.c:650
+#, fuzzy, c-format
+msgid	"#  scope=STRING (ie. alt.*,!alt.bin*) [mandatory]\n"
+msgstr	"#  Alt. Alt.\n"
+
+#: src/attrib.c:651
+#, c-format
+msgid	"#  maildir=STRING (ie. ~/Mail)\n"
+msgstr	""
+
+#: src/attrib.c:652
+#, fuzzy, c-format
+msgid	"#  savedir=STRING (ie. ~user/News)\n"
+msgstr	"#  Ukoresha:\n"
+
+#: src/attrib.c:653
+#, c-format
+msgid	"#  savefile=STRING (ie. =linux)\n"
+msgstr	""
+
+#: src/attrib.c:654
+#, fuzzy, c-format
+msgid	"#  sigfile=STRING (ie. $var/sig)\n"
+msgstr	"#  VAR\n"
+
+#: src/attrib.c:655
+#, fuzzy, c-format
+msgid	"#  organization=STRING (if beginning with '/' read from file)\n"
+msgstr	"#  Ihuzagahunda NIBA Itangiriro Na: Gusoma Bivuye IDOSIYE\n"
+
+#: src/attrib.c:656
+#, c-format
+msgid	"#  followup_to=STRING\n"
+msgstr	""
+
+#: src/attrib.c:657
+#, fuzzy, c-format
+msgid	"#  mailing_list=STRING (ie. majordomo@example.org)\n"
+msgstr	"#  Urutonde rwa Imeli Urugero org\n"
+
+#: src/attrib.c:658
+#, c-format
+msgid	"#  x_headers=STRING (ie. ~/.tin/extra-headers)\n"
+msgstr	""
+
+#: src/attrib.c:659
+#, c-format
+msgid	"#  x_body=STRING (ie. ~/.tin/extra-body-text)\n"
+msgstr	""
+
+#: src/attrib.c:660
+#, fuzzy, c-format
+msgid	"#  from=STRING (just append wanted From:-line, don't use quotes)\n"
+msgstr	"#  Bivuye Kongeraho... Umurongo Gukoresha\n"
+
+#: src/attrib.c:661
+#, c-format
+msgid	"#  news_quote_format=STRING\n"
+msgstr	""
+
+#: src/attrib.c:662
+#, fuzzy, c-format
+msgid	"#  quote_chars=STRING (%%s, %%S for initials)\n"
+msgstr	"#  kugirango Izibanza\n"
+
+#: src/attrib.c:663
+#, fuzzy, c-format
+msgid	"#  mime_types_to_save=STRING (eg. image/*,!image/bmp)\n"
+msgstr	"#  Ishusho Ishusho bmp\n"
+
+#: src/attrib.c:665
+#, c-format
+msgid	"#  ispell=STRING\n"
+msgstr	""
+
+#: src/attrib.c:667
+#, c-format
+msgid	"#  auto_select=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:668
+#, fuzzy, c-format
+msgid	"#  auto_save=ON/OFF\n"
+msgstr	"#  NyaMwishyingura\n"
+
+#: src/attrib.c:669
+#, c-format
+msgid	"#  batch_save=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:670
+#, c-format
+msgid	"#  delete_tmp_files=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:671
+#, c-format
+msgid	"#  show_only_unread=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:672
+#, c-format
+msgid	"#  thread_arts=NUM"
+msgstr	""
+
+#: src/attrib.c:679
+#, c-format
+msgid	"#  thread_perc=NUM\n"
+msgstr	""
+
+#: src/attrib.c:680
+#, c-format
+msgid	"#  show_author=NUM\n"
+msgstr	""
+
+#: src/attrib.c:686
+#, c-format
+msgid	"#  show_info=NUM\n"
+msgstr	""
+
+#: src/attrib.c:692
+#, c-format
+msgid	"#  sort_art_type=NUM\n"
+msgstr	""
+
+#: src/attrib.c:710
+#, c-format
+msgid	"#  sort_threads_type=NUM\n"
+msgstr	""
+
+#: src/attrib.c:715
+#, c-format
+msgid	"#  post_proc_type=NUM\n"
+msgstr	""
+
+#: src/attrib.c:720
+#, c-format
+msgid	"#  quick_kill_scope=STRING (ie. talk.*)\n"
+msgstr	""
+
+#: src/attrib.c:721
+#, c-format
+msgid	"#  quick_kill_expire=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:722
+#, c-format
+msgid	"#  quick_kill_case=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:723
+#, c-format
+msgid	"#  quick_kill_header=NUM\n"
+msgstr	""
+
+#: src/attrib.c:724 src/attrib.c:731
+#, fuzzy, c-format
+msgid	"#    0=subj (case sensitive) 1=subj (ignore case)\n"
+msgstr	"#    0 1. Kwirengagiza\n"
+
+#: src/attrib.c:725 src/attrib.c:732
+#, fuzzy, c-format
+msgid	"#    2=from (case sensitive) 3=from (ignore case)\n"
+msgstr	"#    2. Bivuye 3. Bivuye Kwirengagiza\n"
+
+#: src/attrib.c:726 src/attrib.c:733
+#, c-format
+msgid	"#    4=msgid 5=lines\n"
+msgstr	""
+
+#: src/attrib.c:727
+#, c-format
+msgid	"#  quick_select_scope=STRING\n"
+msgstr	""
+
+#: src/attrib.c:728
+#, c-format
+msgid	"#  quick_select_expire=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:729
+#, c-format
+msgid	"#  quick_select_case=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:730
+#, c-format
+msgid	"#  quick_select_header=NUM\n"
+msgstr	""
+
+#: src/attrib.c:734
+#, c-format
+msgid	"#  x_comment_to=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:735
+#, c-format
+msgid	"#  fcc=STRING (eg. =mailbox)\n"
+msgstr	""
+
+#: src/attrib.c:736
+#, c-format
+msgid	"#  tex2iso_conv=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:737
+#, c-format
+msgid	"#  mime_forward=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:739
+#, c-format
+msgid	"#  mm_network_charset=supported_charset"
+msgstr	""
+
+#: src/attrib.c:746
+#, fuzzy, c-format
+msgid	"#  undeclared_charset=STRING (default is US-ASCII)\n"
+msgstr	"#  Mburabuzi ni\n"
+
+#: src/attrib.c:748
+#, fuzzy, c-format
+msgid	"#\n"
+	"# Note that it is best to put general (global scoping)\n"
+msgstr	"#\n"
+	"# ni Kuri Gushyira Rusange\n"
+
+#: src/attrib.c:749
+#, fuzzy, c-format
+msgid	"# entries first followed by group specific entries.\n"
+	"#\n"
+msgstr	"# Ibyinjijwe Itangira ku Itsinda Ibyinjijwe\n"
+	"#\n"
+
+#: src/attrib.c:750
+#, c-format
+msgid	"############################################################################\n"
+	"\n"
+msgstr	""
+
+#: src/attrib.c:756
+#, fuzzy, c-format
+msgid	"# include extra headers\n"
+msgstr	"# Gushyiramo Birenga\n"
+
+#: src/attrib.c:764
+#, fuzzy, c-format
+msgid	"# in *sources* set post process type to shar only\n"
+msgstr	"# in Gushyiraho Iposita Ubwoko Kuri\n"
+
+#: src/attrib.c:768
+#, fuzzy, c-format
+msgid	"# in *binaries* do full post processing but no TeX2ISO conversion,\n"
+msgstr	"# in Iposita Inonosora Gukuraho...\n"
+
+#: src/attrib.c:769
+#, fuzzy, c-format
+msgid	"# remove tmp files and set Followup-To: poster\n"
+msgstr	"# Na Gushyiraho\n"
+
+#: src/cook.c:499
+#, fuzzy
+msgid	"(unknown)"
+msgstr	"(Itazwi)"
+
+#.
+#. * TODO: add to the right rule, give better explanation, -> lang.c
+#.
+#: src/filter.c:597 src/filter.c:605
+#, fuzzy
+msgid	"Removed from the previous rule: "
+msgstr	"Bivuye i Ibanjirije"
+
+#: src/keymap.c:271
+msgid	"NULL"
+msgstr	""
+
+#: src/lang.c:42
+#, fuzzy
+msgid	"1 Response"
+msgstr	"1."
+
+#: src/lang.c:46
+#, fuzzy, c-format
+msgid	"\n"
+	"%s contains no newsgroups. Exiting."
+msgstr	"\n"
+	"%sKirimo Oya Imbuga z'amakuru"
+
+#: src/lang.c:47
+#, fuzzy
+msgid	"all "
+msgstr	"Byose"
+
+#: src/lang.c:48
+msgid	"All groups"
+msgstr	"amatsinda yose"
+
+#: src/lang.c:49
+#, fuzzy, c-format
+msgid	"File %s exists. %s=append, %s=overwrite, %s=quit: "
+msgstr	"Idosiye Kongeraho... Guhindura Kuvamo"
+
+#: src/lang.c:50
+#, fuzzy
+msgid	"Article cancelled (deleted)."
+msgstr	"Kureka Cyasibwe"
+
+#: src/lang.c:51
+#, fuzzy
+msgid	"Article cannot be cancelled (deleted)."
+msgstr	"Kureka Cyasibwe"
+
+#: src/lang.c:52
+#, fuzzy
+msgid	"Article deleted."
+msgstr	"Cyasibwe"
+
+#: src/lang.c:53
+#, fuzzy, c-format
+msgid	"\n"
+	"Your article:\n"
+	"  \"%s\"\n"
+	"will be posted to the following %s:\n"
+msgstr	"Ingingo Kuri i"
+
+#: src/lang.c:54
+#, fuzzy
+msgid	"Article not posted!"
+msgstr	"OYA"
+
+#: src/lang.c:55
+#, fuzzy
+msgid	"Article not saved"
+msgstr	"OYA"
+
+#: src/lang.c:56
+msgid	"Article Level Commands"
+msgstr	""
+
+#: src/lang.c:57
+#, fuzzy
+msgid	"Article has no parent"
+msgstr	"Oya"
+
+#: src/lang.c:58
+#, fuzzy
+msgid	"Parent article has been killed"
+msgstr	"Ingingo"
+
+#: src/lang.c:59
+#, fuzzy
+msgid	"Parent article is unavailable"
+msgstr	"Ingingo ni"
+
+#: src/lang.c:60
+#, c-format
+msgid	"Article posted: %s"
+msgstr	""
+
+#: src/lang.c:61
+#, fuzzy, c-format
+msgid	"Article rejected (saved to %s)"
+msgstr	"Byanzwe Kuri"
+
+#: src/lang.c:62
+#, fuzzy, c-format
+msgid	"%s=article, %s=thread, %s=hot, %s=pattern, %s=tagged articles, %s=quit: "
+msgstr	"%s=Ingingo Urudodo Ishusho Kuvamo"
+
+#: src/lang.c:63
+msgid	"Article unavailable"
+msgstr	""
+
+#: src/lang.c:64
+msgid	"Article undeleted."
+msgstr	""
+
+#: src/lang.c:66
+msgid	"articles"
+msgstr	""
+
+#: src/lang.c:67
+#, fuzzy
+msgid	"This is a repost of the following article:"
+msgstr	"ni a Bya i Ingingo"
+
+#: src/lang.c:68
+#, fuzzy
+msgid	"article"
+msgstr	"Ingingo"
+
+#: src/lang.c:69
+msgid	"Article"
+msgstr	"Ingingo"
+
+#: src/lang.c:70
+#, c-format
+msgid	"-- %d %s mailed --"
+msgstr	""
+
+# 345
+#: src/lang.c:71
+#, fuzzy, c-format
+msgid	" at %s"
+msgstr	" ku %s"
+
+#: src/lang.c:72
+#, fuzzy, c-format
+msgid	"%*s[-- %s/%s, encoding %s%s%s, %d lines%s%s --]\n"
+msgstr	"%*s[--%s/%s,Imisobekere: Imirongo"
+
+#: src/lang.c:73
+msgid	", charset: "
+msgstr	""
+
+#: src/lang.c:74
+#, c-format
+msgid	"%*s[-- Description: %s --]\n"
+msgstr	""
+
+#: src/lang.c:75
+#, fuzzy, c-format
+msgid	"%d Authentication failed"
+msgstr	"%dByanze"
+
+#: src/lang.c:76
+msgid	"Server expects authentication.\n"
+msgstr	""
+
+#: src/lang.c:77
+#, fuzzy
+msgid	"    Please enter password: "
+msgstr	"Injiza Ijambobanga..."
+
+#: src/lang.c:78
+#, fuzzy
+msgid	"    Please enter username: "
+msgstr	"Injiza Izina ry'ukoresha"
+
+#: src/lang.c:79
+#, fuzzy, c-format
+msgid	"Author search backwards [%s]> "
+msgstr	"Gushaka Inyuma"
+
+#: src/lang.c:80
+#, fuzzy, c-format
+msgid	"Author search forwards [%s]> "
+msgstr	"Gushaka"
+
+#: src/lang.c:81
+#, fuzzy, c-format
+msgid	"Authorized for user: %s\n"
+msgstr	"kugirango Ukoresha:"
+
+#: src/lang.c:82
+#, fuzzy, c-format
+msgid	"Authorization failed for user: %s\n"
+msgstr	"Byanze kugirango Ukoresha:"
+
+#: src/lang.c:83
+#, fuzzy, c-format
+msgid	"\n"
+	"Autosubscribed to %s"
+msgstr	"Kuri"
+
+#: src/lang.c:84
+#, fuzzy
+msgid	"Autosubscribing groups...\n"
+msgstr	"Amatsinda"
+
+#: src/lang.c:85
+#, fuzzy, c-format
+msgid	"Autoselecting articles (use '%s' to see all unread) ..."
+msgstr	"Gukoresha Kuri Byose Bidasomye"
+
+#: src/lang.c:87
+#, fuzzy, c-format
+msgid	"Active file corrupt - %s"
+msgstr	"IDOSIYE"
+
+#: src/lang.c:88
+#, fuzzy, c-format
+msgid	"Article to be posted resulted in errors/warnings. %s=quit, %s=Menu, %s=edit: "
+msgstr	"Kuri in Amakosa Iburira Kuvamo Guhindura"
+
+#: src/lang.c:89
+#, fuzzy, c-format
+msgid	"Unrecognized attribute: %s"
+msgstr	"Ikiranga"
+
+#: src/lang.c:90
+#, fuzzy, c-format
+msgid	"Bad command. Type '%s' for help."
+msgstr	"Komandi: kugirango Ifashayobora"
+
+#: src/lang.c:92
+#, fuzzy
+msgid	"Base article"
+msgstr	"Base Ingingo"
+
+#: src/lang.c:93
+#, fuzzy
+msgid	"Base article range"
+msgstr	"Base Ingingo Urutonde"
+
+#: src/lang.c:94
+#, fuzzy, c-format
+msgid	"%s: Updating of index files not supported\n"
+msgstr	"%s:Bya Umubarendanga Idosiye OYA"
+
+#: src/lang.c:95
+#, fuzzy
+msgid	"*** Beginning of article ***"
+msgstr	"***Bya Ingingo"
+
+#: src/lang.c:97
+#, fuzzy, c-format
+msgid	"Cancel (delete) or supersede (overwrite) article [%%s]? (%s/%s/%s): "
+msgstr	"Gusiba Cyangwa Guhindura Ingingo"
+
+#: src/lang.c:98
+#, fuzzy
+msgid	"Cancelling article..."
+msgstr	"Ingingo"
+
+#: src/lang.c:100
+#, fuzzy, c-format
+msgid	"Cannot create %s"
+msgstr	"Kurema"
+
+#: src/lang.c:101
+#, fuzzy, c-format
+msgid	"Can't find base article %d"
+msgstr	"Gushaka SHINGIRO Ingingo"
+
+#: src/lang.c:102
+#, fuzzy, c-format
+msgid	"Can't open %s"
+msgstr	"Gufungura"
+
+#: src/lang.c:103
+#, fuzzy, c-format
+msgid	"Couldn't open %s for saving"
+msgstr	"Gufungura kugirango Mu kubika"
+
+#: src/lang.c:104
+#, fuzzy
+msgid	"*** Posting not allowed ***"
+msgstr	"***OYA"
+
+#: src/lang.c:105
+#, fuzzy, c-format
+msgid	"Posting is not allowed to %s"
+msgstr	"ni OYA Kuri"
+
+#: src/lang.c:106
+#, c-format
+msgid	"Can't retrieve %s"
+msgstr	""
+
+#: src/lang.c:107
+#, fuzzy, c-format
+msgid	"%s is a directory"
+msgstr	"%sni a bushyinguro"
+
+#: src/lang.c:108
+msgid	"Catchup"
+msgstr	""
+
+#: src/lang.c:109
+#, c-format
+msgid	"Catchup %s..."
+msgstr	""
+
+#: src/lang.c:110
+#, fuzzy
+msgid	"Catchup all groups entered during this session?"
+msgstr	"Byose Amatsinda iyi Umukoro"
+
+#: src/lang.c:111
+#, fuzzy
+msgid	"You have tagged articles in this group - catchup anyway?"
+msgstr	"in iyi Itsinda"
+
+#: src/lang.c:112
+#, fuzzy, c-format
+msgid	"%s %d %s in %lu seconds\n"
+msgstr	"%s%d%sin"
+
+#: src/lang.c:113
+msgid	"Caughtup"
+msgstr	""
+
+#: src/lang.c:114
+msgid	"Check Prepared Article"
+msgstr	""
+
+#: src/lang.c:115
+#, fuzzy
+msgid	"Checking for new groups... "
+msgstr	"kugirango Gishya Amatsinda"
+
+#: src/lang.c:116
+#, fuzzy
+msgid	"Checking for news..."
+msgstr	"kugirango Amakuru"
+
+#: src/lang.c:117
+#, fuzzy, c-format
+msgid	"Post-process %s=no, %s=yes, %s=shar, %s=quit: "
+msgstr	"Oya Yego Kuvamo"
+
+#: src/lang.c:119
+#, fuzzy
+msgid	"ANSI color disabled"
+msgstr	"Ibara Yahagaritswe"
+
+#: src/lang.c:120
+#, fuzzy
+msgid	"ANSI color enabled"
+msgstr	"Ibara Bikora"
+
+#: src/lang.c:122
+#, fuzzy, c-format
+msgid	"Command failed: %s"
+msgstr	"Byanze"
+
+#: src/lang.c:123
+#, fuzzy
+msgid	"Mark not selected articles read?"
+msgstr	"OYA Byahiswemo Gusoma"
+
+#: src/lang.c:124
+#, fuzzy, c-format
+msgid	"Connecting to %s..."
+msgstr	"Kwihuza na %s..."
+
+#: src/lang.c:125
+msgid	"<CR>"
+msgstr	""
+
+#: src/lang.c:126
+#, fuzzy
+msgid	"Creating active file for saved groups...\n"
+msgstr	"Gikora IDOSIYE kugirango Amatsinda"
+
+#: src/lang.c:127
+#, fuzzy
+msgid	"Creating newsrc file...\n"
+msgstr	"IDOSIYE"
+
+#: src/lang.c:129 src/lang.c:1150
+msgid	"Default"
+msgstr	"Mburabuzi"
+
+#: src/lang.c:130
+#, fuzzy
+msgid	"Delete saved files that have been post processed?"
+msgstr	"Idosiye Iposita"
+
+#: src/lang.c:131
+#, fuzzy
+msgid	"Deleting temporary files..."
+msgstr	"By'igihe gito Idosiye"
+
+#: src/lang.c:133
+#, fuzzy
+msgid	"*** End of article ***"
+msgstr	"***Impera Bya Ingingo"
+
+#: src/lang.c:134
+#, fuzzy
+msgid	"*** End of articles ***"
+msgstr	"***Impera Bya"
+
+#: src/lang.c:135
+#, fuzzy
+msgid	"*** End of groups ***"
+msgstr	"***Impera Bya Amatsinda"
+
+#: src/lang.c:136
+#, fuzzy
+msgid	"*** End of thread ***"
+msgstr	"***Impera Bya Urudodo"
+
+#: src/lang.c:137
+#, fuzzy
+msgid	"Enter limit of articles to get> "
+msgstr	"Bya Kuri Kubona"
+
+#: src/lang.c:138
+#, fuzzy
+msgid	"Enter Message-ID to go to> "
+msgstr	"Kuri Gyayo Kuri"
+
+#: src/lang.c:139
+#, fuzzy
+msgid	" and enter next unread thread"
+msgstr	"Na Injiza Komeza>> Bidasomye Urudodo"
+
+#: src/lang.c:140
+#, fuzzy
+msgid	" and enter next unread group"
+msgstr	"Na Injiza Komeza>> Bidasomye Itsinda"
+
+#: src/lang.c:141
+#, fuzzy
+msgid	"Enter option number> "
+msgstr	"Ihitamo Umubare"
+
+#: src/lang.c:142
+#, fuzzy, c-format
+msgid	"Enter range [%s]> "
+msgstr	"Urutonde"
+
+#: src/lang.c:143
+#, fuzzy
+msgid	"\n"
+	"Warning: Approved: header used.\n"
+msgstr	"Umutwempangano"
+
+#: src/lang.c:145
+#, fuzzy
+msgid	"\n"
+	"Error: Bad address in Approved: header.\n"
+msgstr	"Aderesi in Umutwempangano"
+
+#: src/lang.c:146
+#, fuzzy
+msgid	"\n"
+	"Error: Bad address in From: header.\n"
+msgstr	"Aderesi in Umutwempangano"
+
+#: src/lang.c:147
+#, fuzzy
+msgid	"\n"
+	"Error: Bad address in Reply-To: header.\n"
+msgstr	"Aderesi in Umutwempangano"
+
+#: src/lang.c:148
+#, fuzzy
+msgid	"\n"
+	"Error: Bad FQDN in Message-ID: header.\n"
+msgstr	"in Umutwempangano"
+
+#: src/lang.c:149
+#, c-format
+msgid	"Can't unlock %s"
+msgstr	""
+
+#: src/lang.c:151
+#, fuzzy, c-format
+msgid	"Corrupted file %s"
+msgstr	"IDOSIYE"
+
+#: src/lang.c:152
+#, fuzzy, c-format
+msgid	"Couldn't dotlock %s - article not appended!"
+msgstr	"Ingingo OYA"
+
+#: src/lang.c:153
+#, fuzzy, c-format
+msgid	"Couldn't lock %s - article not appended!"
+msgstr	"Ingingo OYA"
+
+#: src/lang.c:155
+#, fuzzy
+msgid	"Internal error in GNKSA routine - send bug report.\n"
+msgstr	"Ikosa in Kohereza Icyegeranyo"
+
+#: src/lang.c:156
+#, fuzzy
+msgid	"Left angle bracket missing in route address.\n"
+msgstr	"Imfuruka Ibuze in Aderesi"
+
+#: src/lang.c:157
+#, fuzzy
+msgid	"Left parenthesis missing in old-style address.\n"
+msgstr	"Ibuze in ki/ bishaje IMISUSIRE Aderesi"
+
+#: src/lang.c:158
+#, fuzzy
+msgid	"Right parenthesis missing in old-style address.\n"
+msgstr	"Ibuze in ki/ bishaje IMISUSIRE Aderesi"
+
+#: src/lang.c:159
+#, fuzzy
+msgid	"At-sign missing in mail address.\n"
+msgstr	"IKIMENYETSO Ibuze in Ubutumwa Aderesi"
+
+#: src/lang.c:160
+#, fuzzy
+msgid	"Single component FQDN is not allowed. Add your domain.\n"
+msgstr	"ni OYA Urwego"
+
+#: src/lang.c:161
+#, fuzzy
+msgid	"Invalid domain. Send bug report if your top level domain really exists.\n"
+	"Use .invalid as top level domain for munged addresses.\n"
+msgstr	"Urwego Icyegeranyo NIBA Hejuru: urwego Urwego Sibyo Nka Hejuru: urwego Urwego "
+	"kugirango Amaderesi"
+
+#: src/lang.c:162
+#, fuzzy
+msgid	"Illegal domain. Send bug report if your top level domain really exists.\n"
+	"Use .invalid as top level domain for munged addresses.\n"
+msgstr	"Urwego Icyegeranyo NIBA Hejuru: urwego Urwego Sibyo Nka Hejuru: urwego Urwego "
+	"kugirango Amaderesi"
+
+#: src/lang.c:163
+#, fuzzy
+msgid	"Unknown domain. Send bug report if your top level domain really exists.\n"
+	"Use .invalid as top level domain for munged addresses.\n"
+msgstr	"Urwego Icyegeranyo NIBA Hejuru: urwego Urwego Sibyo Nka Hejuru: urwego Urwego "
+	"kugirango Amaderesi"
+
+#: src/lang.c:164
+#, fuzzy
+msgid	"Illegal character in FQDN.\n"
+msgstr	"Inyuguti in"
+
+#: src/lang.c:165
+#, fuzzy
+msgid	"Zero length FQDN component not allowed.\n"
+msgstr	"Uburebure OYA"
+
+#: src/lang.c:166
+#, fuzzy
+msgid	"FQDN component exceeds maximum allowed length (63 chars).\n"
+msgstr	"Kinini Uburebure"
+
+#: src/lang.c:167
+#, fuzzy
+msgid	"FQDN component may not start or end with hyphen.\n"
+msgstr	"Gicurasi OYA Gutangira Cyangwa Impera Na:"
+
+#: src/lang.c:168
+#, fuzzy
+msgid	"FQDN component may not start with digit.\n"
+msgstr	"Gicurasi OYA Gutangira Na:"
+
+#: src/lang.c:169
+#, fuzzy
+msgid	"Domain literal has impossible numeric value.\n"
+msgstr	"Bikurikije umubare Agaciro"
+
+#: src/lang.c:170
+#, fuzzy
+msgid	"Domain literal is for private use only and not allowed for global use.\n"
+msgstr	"ni kugirango By'umwihariko Gukoresha Na OYA kugirango Gukoresha"
+
+#: src/lang.c:171
+#, fuzzy
+msgid	"Right bracket missing in domain literal.\n"
+msgstr	"Ibuze in Urwego"
+
+#: src/lang.c:172
+#, fuzzy
+msgid	"Missing localpart of mail address.\n"
+msgstr	"Bya Ubutumwa Aderesi"
+
+#: src/lang.c:173
+#, fuzzy
+msgid	"Illegal character in localpart of mail address.\n"
+msgstr	"Inyuguti in Bya Ubutumwa Aderesi"
+
+#: src/lang.c:174
+#, fuzzy
+msgid	"Zero length localpart component not allowed.\n"
+msgstr	"Uburebure OYA"
+
+#: src/lang.c:175
+#, fuzzy
+msgid	"Illegal character in realname.\n"
+	"Unquoted words may not contain '!()<>@,;:\\.[]' in route addresses.\n"
+msgstr	"Inyuguti in Amagambo Gicurasi OYA in Amaderesi"
+
+#: src/lang.c:176
+#, fuzzy
+msgid	"Illegal character in realname.\n"
+	"Quoted words may not contain '()<>\\'.\n"
+msgstr	"Inyuguti in Amagambo Gicurasi OYA"
+
+#: src/lang.c:177
+#, fuzzy
+msgid	"Illegal character in realname.\n"
+	"Encoded words may not contain '!()<>@,;:\"\\.[]/=' in parameter.\n"
+msgstr	"Inyuguti in Amagambo Gicurasi OYA in"
+
+#: src/lang.c:178
+#, fuzzy
+msgid	"Bad syntax in encoded word used in realname.\n"
+msgstr	"in ijambo in"
+
+#: src/lang.c:179
+#, fuzzy
+msgid	"Illegal character in realname.\n"
+	"Unquoted words may not contain '()<>\\' in old-style addresses.\n"
+msgstr	"Inyuguti in Amagambo Gicurasi OYA in ki/ bishaje IMISUSIRE Amaderesi"
+
+#: src/lang.c:180
+#, fuzzy
+msgid	"Illegal character in realname.\n"
+	"Control characters and unencoded 8bit characters > 127 are not allowed.\n"
+msgstr	"Inyuguti in Inyuguti Na Inyuguti OYA"
+
+#: src/lang.c:181
+#, fuzzy
+msgid	"\n"
+	"Error: No blank line found after header.\n"
+msgstr	"Ahatanditseho Umurongo Byabonetse Nyuma Umutwempangano"
+
+#. TODO: fixme, US-ASCII is not the only 7bit charset we know about
+#: src/lang.c:183
+#, fuzzy
+msgid	"\n"
+	"Error: Posting contains non-ASCII characters but MM_CHARSET is set to\n"
+	"       US-ASCII  - please change this setting to a suitable value for\n"
+	"       your language  using the  M)enu of configurable  options or by\n"
+	"       editing tinrc.\n"
+msgstr	"Kirimo Inyuguti ni Gushyiraho Guhindura>> iyi Igenamiterere Kuri a Agaciro "
+	"Ururimi ikoresha i Bya Amahitamo Cyangwa"
+
+#: src/lang.c:188
+#, fuzzy
+msgid	"\n"
+	"Error: Posting contains  non-ASCII characters  but the  MIME encoding\n"
+	"       for news  messages  is set  to \"7bit\"  -  please change this\n"
+	"       setting to \"8bit\" or \"quoted-printable\" depending  on what\n"
+	"       is more common  in your part  of the world.  This can  be done\n"
+	"       using the M)enu of configurable options or by editing tinrc.\n"
+msgstr	"Kirimo Inyuguti i kugirango Amakuru Ubutumwa ni Gushyiraho Kuri Guhindura>> "
+	"Igenamiterere Kuri Cyangwa Gicapika ku ni Birenzeho in Bya i ikoresha i Bya "
+	"Amahitamo Cyangwa ku"
+
+#: src/lang.c:194
+#, fuzzy
+msgid	"\n"
+	"Error: Article starts with blank line instead of header\n"
+msgstr	"Na: Ahatanditseho Umurongo Bya"
+
+#: src/lang.c:195
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: Header on line %d does not have a colon after the header name:\n"
+	"%s\n"
+msgstr	"ku Umurongo OYA a Nyuma i Umutwempangano Izina:"
+
+#: src/lang.c:196
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: The \"%s:\" line is empty.\n"
+msgstr	"Umurongo ni ubusa"
+
+#: src/lang.c:197
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: The \"%s:\" line is missing from the article header.\n"
+msgstr	"Umurongo ni Ibuze Bivuye i Ingingo Umutwempangano"
+
+#: src/lang.c:198
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: Header on line %d does not have a space after the colon:\n"
+	"%s\n"
+msgstr	"ku Umurongo OYA a Umwanya Nyuma i"
+
+#: src/lang.c:199
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: There are multiple (%d) \"%s:\" lines in the header.\n"
+msgstr	"Igikubo Imirongo in i Umutwempangano"
+
+#: src/lang.c:200
+#, fuzzy, c-format
+msgid	"Insecure permissions of %s (%o)"
+msgstr	"Uruhushya Bya"
+
+#: src/lang.c:201
+#, fuzzy, c-format
+msgid	"Invalid response to GROUP command, %s"
+msgstr	"Kuri Komandi:"
+
+#: src/lang.c:203
+#, fuzzy, c-format
+msgid	"MIME parse error: Unexpected end of %s/%s article"
+msgstr	"Ikosa Impera Bya Ingingo"
+
+#: src/lang.c:204
+#, fuzzy
+msgid	"MIME parse error: Start boundary whilst reading headers"
+msgstr	"Ikosa Gutangira Imitwe"
+
+#: src/lang.c:205
+#, fuzzy
+msgid	"Can't get a (fully-qualified) domain-name!"
+msgstr	"Kubona a Urwego Izina:"
+
+#: src/lang.c:206
+#, fuzzy, c-format
+msgid	"No permissions to go into %s\n"
+msgstr	"Uruhushya Kuri Gyayo"
+
+#: src/lang.c:207
+#, fuzzy
+msgid	"\n"
+	"Error: From: line missing.\n"
+msgstr	"Umurongo Ibuze"
+
+#: src/lang.c:208
+#, fuzzy, c-format
+msgid	"No read permissions for %s\n"
+msgstr	"Gusoma Uruhushya kugirango"
+
+#: src/lang.c:209
+#, fuzzy, c-format
+msgid	"File %s does not exist\n"
+msgstr	"Idosiye OYA"
+
+#: src/lang.c:210
+#, fuzzy, c-format
+msgid	"No write permissions for %s\n"
+msgstr	"Kwandika Uruhushya kugirango"
+
+#: src/lang.c:211
+#, fuzzy
+msgid	"Can't get user information (/etc/passwd missing?)"
+msgstr	"Kubona Ukoresha: Ibisobanuro Ibuze"
+
+#: src/lang.c:212
+#, fuzzy
+msgid	"errors"
+msgstr	"Amakosa"
+
+#: src/lang.c:213
+#, fuzzy, c-format
+msgid	"\n"
+	"Error on line %d: \"Sender:\" header not allowed (it will be added for you)\n"
+msgstr	"ku Umurongo Umutwempangano OYA Kyongewe kugirango"
+
+#: src/lang.c:214
+#, fuzzy, c-format
+msgid	"Server has non of the groups listed in %s"
+msgstr	"Bya i Amatsinda in"
+
+#: src/lang.c:215
+#, fuzzy
+msgid	"error"
+msgstr	"Ikosa"
+
+#: src/lang.c:216
+#, fuzzy
+msgid	"Unknown display level"
+msgstr	"Kugaragaza urwego"
+
+#: src/lang.c:217
+msgid	"<ESC>"
+msgstr	""
+
+#: src/lang.c:218
+msgid	"Exiting..."
+msgstr	""
+
+#: src/lang.c:219
+#, fuzzy
+msgid	"leaving external mail-reader"
+msgstr	"external Ubutumwa"
+
+#: src/lang.c:220
+#, c-format
+msgid	"Extracting %s..."
+msgstr	""
+
+#: src/lang.c:222
+#, fuzzy, c-format
+msgid	"Error writing %s file. Filesystem full? File reset to previous state."
+msgstr	"IDOSIYE Idosiye Kugarura Kuri Ibanjirije Leta"
+
+#: src/lang.c:223
+#, fuzzy, c-format
+msgid	"Error making backup of %s file. Filesystem full?"
+msgstr	"Inyibutsa Bya IDOSIYE"
+
+#: src/lang.c:224
+#, c-format
+msgid	"Filtering global rules (%d/%d)..."
+msgstr	""
+
+#: src/lang.c:225
+#, fuzzy
+msgid	"Rule created by: "
+msgstr	"Byaremwe ku"
+
+#: src/lang.c:226
+#, fuzzy, c-format
+msgid	"Enter pattern [%s]> "
+msgstr	"Ishusho"
+
+#: src/lang.c:227
+#, fuzzy, c-format
+msgid	"\n"
+	"You requested followups to your article to go to the following %s:\n"
+msgstr	"Kuri Ingingo Kuri Gyayo Kuri i"
+
+#: src/lang.c:228
+#, fuzzy, c-format
+msgid	"  %s\t Answers will be directed to you by mail.\n"
+msgstr	"%sKuri ku Ubutumwa"
+
+#: src/lang.c:229
+#, fuzzy
+msgid	"-- forwarded message --\n"
+msgstr	"--Ubutumwa"
+
+#: src/lang.c:230
+#, fuzzy
+msgid	"-- end of forwarded message --\n"
+msgstr	"--Impera Bya Ubutumwa"
+
+#: src/lang.c:231
+#, fuzzy
+msgid	"# Format:\n"
+	"#   comment=STRING    Optional. Multiple lines allowed. Comments must be "
+	"placed\n"
+	"#                     at the beginning of a rule, or they will be moved to "
+	"the\n"
+	"#                     next rule. '#' is not a valid keyword for a comment!\n"
+	"#   group=STRING      Mandatory. Newsgroups list (e.g. comp.*,!*sources*).\n"
+	"#   case=NUM          Mandatory. Compare=0 / ignore=1 case when filtering.\n"
+	"#   score=NUM|STRING  Mandatory. Score to give. Either:\n"
+	"#     score=NUM         A number (e.g. 70). Or:\n"
+	"#     score=STRING      One of the two keywords: 'hot' or 'kill'.\n"
+	"#   subj=STRING       Optional. Subject: line (e.g. How to be a wizard).\n"
+	"#   from=STRING       Optional. From: line (e.g. *Craig Shergold*).\n"
+	"#   msgid=STRING      Optional. Message-ID: line (e.g. <123@ether.net>) with\n"
+	"#                     full references.\n"
+	"#   msgid_last=STRING Optional. Like above, but with last reference only.\n"
+	"#   msgid_only=STRING Optional. Like above, but without references.\n"
+	"#   refs_only=STRING  Optional. References: line (e.g. <123@ether.net>) "
+	"without\n"
+	"#                     Message-ID:\n"
+	"#   lines=[<>]?NUM    Optional. Lines: line. '<' or '>' are optional.\n"
+	"#   gnksa=[<>]?NUM    Optional. GNKSA parse_from() return code. '<' or '>' "
+	"opt.\n"
+	"#   xref=PATTERN      Optional. Kill pattern (e.g. alt.flame*)\n"
+	"#   time=NUM          Optional. time_t value when rule expires\n"
+	"#\n"
+msgstr	"#g. g. g. g. g. g. g. Alt."
+
+#: src/lang.c:252
+#, fuzzy, c-format
+msgid	"Enter score for rule (default=%d): "
+msgstr	"kugirango Mburabuzi"
+
+#: src/lang.c:253
+#, fuzzy, c-format
+msgid	"Enter the score weight (range 0 < score <= %d)"
+msgstr	"i Uburemere Urutonde 0"
+
+#. SCORE_MAX
+#: src/lang.c:254
+msgid	"Full"
+msgstr	""
+
+#: src/lang.c:255
+#, fuzzy
+msgid	"Comment (optional)  : "
+msgstr	"Bitari ngombwa"
+
+#: src/lang.c:256
+#, fuzzy
+msgid	"Apply pattern to    : "
+msgstr	"Ishusho Kuri"
+
+#: src/lang.c:257
+#, fuzzy
+msgid	"From: line (ignore case)      "
+msgstr	"Umurongo Kwirengagiza"
+
+#: src/lang.c:258
+#, fuzzy
+msgid	"From: line (case sensitive)   "
+msgstr	"Umurongo"
+
+#: src/lang.c:260
+#, fuzzy, c-format
+msgid	"%s%s: Unknown host.\n"
+msgstr	"%s%s:Ubuturo"
+
+#: src/lang.c:261
+msgid	"global "
+msgstr	""
+
+#: src/lang.c:262
+#, fuzzy, c-format
+msgid	"Please use %.100s instead"
+msgstr	"Gukoresha"
+
+#: src/lang.c:263
+#, fuzzy, c-format
+msgid	"%s is bogus"
+msgstr	"%sni"
+
+#: src/lang.c:264
+#, fuzzy, c-format
+msgid	"Group %s is moderated. Continue?"
+msgstr	"Dukomeza."
+
+#: src/lang.c:265
+#, fuzzy
+msgid	"groups"
+msgstr	"Amatsinda"
+
+#: src/lang.c:266
+#, c-format
+msgid	"Rereading %s..."
+msgstr	""
+
+#: src/lang.c:267
+msgid	"Top Level Commands"
+msgstr	""
+
+#: src/lang.c:268
+msgid	"Group Selection"
+msgstr	""
+
+#: src/lang.c:269
+#, fuzzy
+msgid	"group"
+msgstr	"Itsinda"
+
+#: src/lang.c:271
+#, fuzzy
+msgid	"One or more lines of comment. <CR> to add a line or proceed if line is empty."
+msgstr	"Cyangwa Birenzeho Imirongo Bya Icyo wongeraho Kuri Kongeramo a Umurongo "
+	"Cyangwa NIBA Umurongo ni ubusa"
+
+#: src/lang.c:272
+#, fuzzy
+msgid	"From: line to add to filter file. <SPACE> toggles & <CR> sets."
+msgstr	"Umurongo Kuri Kongeramo Kuri Muyunguruzi... IDOSIYE"
+
+#: src/lang.c:273
+#, fuzzy
+msgid	"Linecount of articles to be filtered. < for less, > for more, = for equal."
+msgstr	"Bya Kuri kugirango Birutwa kugirango Birenzeho kugirango bingana"
+
+#: src/lang.c:274
+#, fuzzy
+msgid	"Message-ID: line to add to filter file. <SPACE> toggles & <CR> sets."
+msgstr	"Umurongo Kuri Kongeramo Kuri Muyunguruzi... IDOSIYE"
+
+#: src/lang.c:275
+#, fuzzy
+msgid	"Subject: line to add to filter file. <SPACE> toggles & <CR> sets."
+msgstr	"Umurongo Kuri Kongeramo Kuri Muyunguruzi... IDOSIYE"
+
+#: src/lang.c:276
+#, fuzzy
+msgid	"Enter text pattern to filter if Subject: & From: lines are not what you want."
+msgstr	"Umwandiko Ishusho Kuri Muyunguruzi... NIBA Imirongo OYA"
+
+#: src/lang.c:277
+#, fuzzy
+msgid	"Select where text pattern should be applied. <SPACE> toggles & <CR> sets."
+msgstr	"Umwandiko Ishusho Byashyizweho"
+
+#: src/lang.c:278
+#, fuzzy
+msgid	"Expiration time in days for the entered filter. <SPACE> toggles & <CR> sets."
+msgstr	"Igihe in Iminsi kugirango i Muyunguruzi..."
+
+#: src/lang.c:279
+#, fuzzy
+msgid	"Apply kill only to current group or all groups. <SPACE> toggles & <CR> sets."
+msgstr	"Kuri KIGEZWEHO Itsinda Cyangwa Byose Amatsinda"
+
+#: src/lang.c:280
+#, fuzzy
+msgid	"Apply select to current group or all groups. <SPACE> toggles & <CR> sets."
+msgstr	"Guhitamo Kuri KIGEZWEHO Itsinda Cyangwa Byose Amatsinda"
+
+#: src/lang.c:281
+#, fuzzy
+msgid	"kill an article via a menu"
+msgstr	"Ingingo Biturutse a Ibikubiyemo"
+
+#: src/lang.c:282
+#, fuzzy
+msgid	"auto-select (hot) an article via a menu"
+msgstr	"Ikiyega Guhitamo Ingingo Biturutse a Ibikubiyemo"
+
+#: src/lang.c:283
+#, fuzzy
+msgid	"Browse URLs in article"
+msgstr	"in Ingingo"
+
+#: src/lang.c:284
+#, fuzzy
+msgid	"0 - 9\t  display article by number in current thread"
+msgstr	"0 Kugaragaza Ingingo ku Umubare in KIGEZWEHO Urudodo"
+
+#: src/lang.c:285
+#, fuzzy
+msgid	"cancel (delete) or supersede (overwrite) current article"
+msgstr	"Kureka Gusiba Cyangwa Guhindura KIGEZWEHO Ingingo"
+
+#: src/lang.c:286
+#, fuzzy
+msgid	"edit article (mail-groups only)"
+msgstr	"Guhindura Ingingo Ubutumwa Amatsinda"
+
+#: src/lang.c:287
+#, fuzzy
+msgid	"display first article in current thread"
+msgstr	"Kugaragaza Itangira Ingingo in KIGEZWEHO Urudodo"
+
+#: src/lang.c:288
+#, fuzzy
+msgid	"display first page of article"
+msgstr	"Kugaragaza Itangira Ipaji Bya Ingingo"
+
+#: src/lang.c:289
+#, fuzzy
+msgid	"post followup to current article"
+msgstr	"Iposita Kuri KIGEZWEHO Ingingo"
+
+#: src/lang.c:290
+#, fuzzy
+msgid	"post followup (don't copy text) to current article"
+msgstr	"Iposita Gukoporora Umwandiko Kuri KIGEZWEHO Ingingo"
+
+#: src/lang.c:291
+#, fuzzy
+msgid	"post followup to current article quoting complete headers"
+msgstr	"Iposita Kuri KIGEZWEHO Ingingo Byuzuye Imitwe"
+
+#: src/lang.c:292
+#, fuzzy
+msgid	"display last article in current thread"
+msgstr	"Kugaragaza Iheruka Ingingo in KIGEZWEHO Urudodo"
+
+#: src/lang.c:293
+#, fuzzy
+msgid	"display last page of article"
+msgstr	"Kugaragaza Iheruka Ipaji Bya Ingingo"
+
+#: src/lang.c:294
+#, fuzzy
+msgid	"mark rest of thread as read and advance to next unread"
+msgstr	"Ikimenyetso Bya Urudodo Nka Gusoma Na Kuri Komeza>> Bidasomye"
+
+#: src/lang.c:295
+#, fuzzy
+msgid	"display next article"
+msgstr	"Kugaragaza Komeza>> Ingingo"
+
+#: src/lang.c:296
+#, fuzzy
+msgid	"display first article in next thread"
+msgstr	"Kugaragaza Itangira Ingingo in Komeza>> Urudodo"
+
+#: src/lang.c:297
+#, fuzzy
+msgid	"display next unread article"
+msgstr	"Kugaragaza Komeza>> Bidasomye Ingingo"
+
+#: src/lang.c:298
+#, fuzzy
+msgid	"go to the article that this one followed up"
+msgstr	"Gyayo Kuri i Ingingo iyi Hejuru"
+
+#: src/lang.c:299
+#, fuzzy
+msgid	"display previous article"
+msgstr	"Kugaragaza Ibanjirije Ingingo"
+
+#: src/lang.c:300
+#, fuzzy
+msgid	"display previous unread article"
+msgstr	"Kugaragaza Ibanjirije Bidasomye Ingingo"
+
+#: src/lang.c:301
+#, fuzzy
+msgid	"quickly kill an article using defaults"
+msgstr	"Ingingo ikoresha"
+
+#: src/lang.c:302
+#, fuzzy
+msgid	"quickly auto-select (hot) an article using defaults"
+msgstr	"Ikiyega Guhitamo Ingingo ikoresha"
+
+#: src/lang.c:303
+#, fuzzy
+msgid	"return to group selection level"
+msgstr	"Garuka Kuri Itsinda Ihitamo urwego"
+
+#: src/lang.c:304
+#, fuzzy
+msgid	"reply through mail to author"
+msgstr	"Subiza Gihinguranya Ubutumwa Kuri Umwanditsi"
+
+#: src/lang.c:305
+#, fuzzy
+msgid	"reply through mail (don't copy text) to author"
+msgstr	"Subiza Gihinguranya Ubutumwa Gukoporora Umwandiko Kuri Umwanditsi"
+
+#: src/lang.c:306
+#, fuzzy
+msgid	"reply through mail to author quoting complete headers"
+msgstr	"Subiza Gihinguranya Ubutumwa Kuri Umwanditsi Byuzuye Imitwe"
+
+#: src/lang.c:307
+#, fuzzy
+msgid	"repost chosen article to another group"
+msgstr	"Ingingo Kuri Itsinda"
+
+#: src/lang.c:308
+#, fuzzy
+msgid	"search backwards within this article"
+msgstr	"Gushaka Inyuma muri iyi Ingingo"
+
+#: src/lang.c:309
+#, fuzzy
+msgid	"search forwards within this article"
+msgstr	"Gushaka muri iyi Ingingo"
+
+#: src/lang.c:310
+#, fuzzy
+msgid	"show article in raw-mode (including all headers)"
+msgstr	"Garagaza Ingingo in Ubwoko Byose Imitwe"
+
+#: src/lang.c:311
+#, fuzzy
+msgid	"skip next block of included text"
+msgstr	"Komeza>> Funga Bya Umwandiko"
+
+#: src/lang.c:312
+#, fuzzy
+msgid	"toggle display of sections hidden by a form-feed (^L) on/off"
+msgstr	"Mukomatanya Kugaragaza Bya Ibyatoranyijwe gihishwe ku a Ifishi ku Bidakora"
+
+#: src/lang.c:313
+#, fuzzy
+msgid	"toggle word highlighting on/off"
+msgstr	"Mukomatanya ijambo Igaragaza cyane ku Bidakora"
+
+#: src/lang.c:314
+#, fuzzy
+msgid	"toggle ROT-13 (basic decode) for current article"
+msgstr	"Mukomatanya BASIC kugirango KIGEZWEHO Ingingo"
+
+#: src/lang.c:315
+#, fuzzy
+msgid	"toggle tabwidth 4 <-> 8"
+msgstr	"Mukomatanya 4. 8"
+
+#: src/lang.c:316
+#, fuzzy
+msgid	"toggle german TeX style decoding for current article"
+msgstr	"Mukomatanya Ikidage IMISUSIRE kugirango KIGEZWEHO Ingingo"
+
+#: src/lang.c:317
+#, fuzzy
+msgid	"toggle display of uuencoded sections"
+msgstr	"Mukomatanya Kugaragaza Bya Ibyatoranyijwe"
+
+#: src/lang.c:318
+#, fuzzy
+msgid	"View/save multimedia attachments"
+msgstr	"Kubika Imigereka"
+
+#: src/lang.c:319
+#, fuzzy, c-format
+msgid	"report bug or comment via mail to %s"
+msgstr	"Icyegeranyo Cyangwa Icyo wongeraho Biturutse Ubutumwa Kuri"
+
+#: src/lang.c:320
+#, fuzzy
+msgid	"choose range of articles to be affected by next command"
+msgstr	"Guhitamo Urutonde Bya Kuri ku Komeza>> Komandi:"
+
+#: src/lang.c:321
+#, fuzzy
+msgid	"escape from command prompt"
+msgstr	"Bivuye Komandi: Urwinjiriro"
+
+#: src/lang.c:322
+#, fuzzy
+msgid	"edit filter file"
+msgstr	"Guhindura Muyunguruzi... IDOSIYE"
+
+#: src/lang.c:323
+#, fuzzy
+msgid	"get help"
+msgstr	"Kubona Ifashayobora"
+
+#: src/lang.c:324
+#, fuzzy
+msgid	"display last article viewed"
+msgstr	"Kugaragaza Iheruka Ingingo"
+
+#: src/lang.c:325
+#, fuzzy
+msgid	"down one line"
+msgstr	"Hasi Umurongo"
+
+#: src/lang.c:326
+#, fuzzy
+msgid	"up one line"
+msgstr	"Hejuru Umurongo"
+
+#: src/lang.c:327
+#, fuzzy
+msgid	"go to article chosen by Message-ID"
+msgstr	"Gyayo Kuri Ingingo ku"
+
+#: src/lang.c:328
+#, fuzzy
+msgid	"mail article/thread/hot/pattern/tagged articles to someone"
+msgstr	"Ubutumwa Ingingo Urudodo Ishusho Kuri"
+
+#: src/lang.c:329
+#, fuzzy
+msgid	"menu of configurable options"
+msgstr	"Ibikubiyemo Bya Amahitamo"
+
+#: src/lang.c:330
+#, fuzzy
+msgid	"down one page"
+msgstr	"Hasi Ipaji"
+
+#: src/lang.c:331
+#, fuzzy
+msgid	"up one page"
+msgstr	"Hejuru Ipaji"
+
+#: src/lang.c:332
+#, fuzzy
+msgid	"post (write) article to current group"
+msgstr	"Iposita Kwandika Ingingo Kuri KIGEZWEHO Itsinda"
+
+#: src/lang.c:333
+#, fuzzy
+msgid	"post postponed articles"
+msgstr	"Iposita"
+
+#: src/lang.c:334
+#, fuzzy
+msgid	"list articles posted by you (from posted file)"
+msgstr	"Urutonde ku Bivuye IDOSIYE"
+
+#: src/lang.c:335
+#, fuzzy
+msgid	"return to previous menu"
+msgstr	"Garuka Kuri Ibanjirije Ibikubiyemo"
+
+#: src/lang.c:336
+#, fuzzy
+msgid	"quit tin immediately"
+msgstr	"Kuvamo Ako kanya"
+
+#: src/lang.c:337
+#, fuzzy
+msgid	"redraw page"
+msgstr	"Kongera Gushushanya Ipaji"
+
+#: src/lang.c:338
+#, fuzzy
+msgid	"save article/thread/hot/pattern/tagged articles to file"
+msgstr	"Kubika Ingingo Urudodo Ishusho Kuri IDOSIYE"
+
+#: src/lang.c:339
+#, fuzzy
+msgid	"save marked articles automatically without user prompts"
+msgstr	"Kubika cy/ byagarajwe ku buryo bwikora Ukoresha:"
+
+#: src/lang.c:340
+#, fuzzy
+msgid	"scroll the screen one line down"
+msgstr	"i Mugaragaza Umurongo Hasi"
+
+#: src/lang.c:341
+#, fuzzy
+msgid	"scroll the screen one line up"
+msgstr	"i Mugaragaza Umurongo Hejuru"
+
+#: src/lang.c:342
+#, fuzzy
+msgid	"search for articles by author backwards"
+msgstr	"Gushaka kugirango ku Umwanditsi Inyuma"
+
+#: src/lang.c:343
+#, fuzzy
+msgid	"search for articles by author forwards"
+msgstr	"Gushaka kugirango ku Umwanditsi"
+
+#: src/lang.c:344
+#, fuzzy
+msgid	"search all articles for a given string (this may take some time)"
+msgstr	"Gushaka Byose kugirango a Ikurikiranyanyuguti iyi Gicurasi Igihe"
+
+#: src/lang.c:345
+#, fuzzy
+msgid	" \t  (searches are case-insensitive and wrap around to all articles)"
+msgstr	"(Na Gufunika Kuri Byose"
+
+#: src/lang.c:346
+#, fuzzy
+msgid	"search for articles by Subject line backwards"
+msgstr	"Gushaka kugirango ku Umurongo Inyuma"
+
+#: src/lang.c:347
+#, fuzzy
+msgid	"search for articles by Subject line forwards"
+msgstr	"Gushaka kugirango ku Umurongo"
+
+#: src/lang.c:348
+#, fuzzy
+msgid	"repeat last search"
+msgstr	"Gusubiramo Iheruka Gushaka"
+
+#: src/lang.c:349
+#, fuzzy
+msgid	"tag current article for reposting/mailing/piping/printing/saving"
+msgstr	"Itagi: KIGEZWEHO Ingingo kugirango Icapa... Mu kubika"
+
+#: src/lang.c:350
+#, fuzzy
+msgid	"toggle info message in last line (subject/description)"
+msgstr	"Mukomatanya Ibisobanuro Ubutumwa in Iheruka Umurongo Ikivugwaho "
+	"Isobanuramiterere"
+
+#: src/lang.c:351
+#, fuzzy
+msgid	"toggle inverse video"
+msgstr	"Mukomatanya Videwo..."
+
+#: src/lang.c:352
+#, fuzzy
+msgid	"toggle mini help menu display"
+msgstr	"Mukomatanya Ifashayobora Ibikubiyemo Kugaragaza"
+
+#: src/lang.c:353
+#, fuzzy
+msgid	"cycle the display of authors email address, real name, both or neither"
+msgstr	"Uruziga i Kugaragaza Bya Abahanzi imeli Aderesi Izina: Byombi Cyangwa"
+
+#: src/lang.c:354
+#, fuzzy
+msgid	"show version information"
+msgstr	"Garagaza Verisiyo Ibisobanuro"
+
+#: src/lang.c:355
+#, fuzzy
+msgid	"mark all articles as read and return to group selection menu"
+msgstr	"Ikimenyetso Byose Nka Gusoma Na Garuka Kuri Itsinda Ihitamo Ibikubiyemo"
+
+#: src/lang.c:356
+#, fuzzy
+msgid	"mark all articles as read and enter next group with unread articles"
+msgstr	"Ikimenyetso Byose Nka Gusoma Na Injiza Komeza>> Itsinda Na: Bidasomye"
+
+#: src/lang.c:357
+#, fuzzy
+msgid	"choose first thread in list"
+msgstr	"Guhitamo Itangira Urudodo in Urutonde"
+
+#: src/lang.c:358
+#, fuzzy
+msgid	"choose last thread in list"
+msgstr	"Guhitamo Iheruka Urudodo in Urutonde"
+
+#: src/lang.c:359
+#, fuzzy
+msgid	"list articles within current thread (bring up Thread sub-menu)"
+msgstr	"Urutonde muri KIGEZWEHO Urudodo Hejuru Ibikubiyemo"
+
+#: src/lang.c:360
+#, fuzzy
+msgid	"mark article as unread"
+msgstr	"Ikimenyetso Ingingo Nka Bidasomye"
+
+#: src/lang.c:361
+#, fuzzy
+msgid	"mark current thread or tagged threads as read"
+msgstr	"Ikimenyetso KIGEZWEHO Urudodo Cyangwa Nka Gusoma"
+
+#: src/lang.c:362
+#, fuzzy
+msgid	"mark thread as unread"
+msgstr	"Ikimenyetso Urudodo Nka Bidasomye"
+
+#: src/lang.c:363
+#, fuzzy
+msgid	"toggle display of all/selected articles"
+msgstr	"Mukomatanya Kugaragaza Bya Byose Byahiswemo"
+
+#: src/lang.c:364
+#, fuzzy
+msgid	"display next group"
+msgstr	"Kugaragaza Komeza>> Itsinda"
+
+#: src/lang.c:365
+#, fuzzy
+msgid	"display previous group"
+msgstr	"Kugaragaza Ibanjirije Itsinda"
+
+#: src/lang.c:366
+#, fuzzy
+msgid	"toggle all selections (all articles)"
+msgstr	"Mukomatanya Byose Byose"
+
+#: src/lang.c:367
+#, fuzzy
+msgid	"select group (make \"hot\")"
+msgstr	"Guhitamo Itsinda Ubwoko"
+
+#: src/lang.c:368
+#, fuzzy
+msgid	"select thread"
+msgstr	"Guhitamo Urudodo"
+
+#: src/lang.c:369
+#, fuzzy
+msgid	"select threads if at least one unread article is selected"
+msgstr	"Guhitamo NIBA ku Bidasomye Ingingo ni Byahiswemo"
+
+#: src/lang.c:370
+#, fuzzy
+msgid	"select threads that match user specified pattern"
+msgstr	"Guhitamo BIHUYE Ukoresha: Ishusho"
+
+#: src/lang.c:371
+#, fuzzy
+msgid	"tag all parts of current multipart-message in order"
+msgstr	"Itagi: Byose Bya KIGEZWEHO Ubutumwa in Itondekanya"
+
+#: src/lang.c:372
+#, fuzzy
+msgid	"0 - 9\t  choose thread by number"
+msgstr	"0 Guhitamo Urudodo ku Umubare"
+
+#: src/lang.c:373
+#, fuzzy
+msgid	"toggle limit number of articles to get, and reload"
+msgstr	"Mukomatanya Umubare Bya Kuri Kubona Na Kongera Gutangiza"
+
+#: src/lang.c:374
+#, fuzzy
+msgid	"toggle display of all/unread articles"
+msgstr	"Mukomatanya Kugaragaza Bya Byose Bidasomye"
+
+#: src/lang.c:375
+#, fuzzy
+msgid	"toggle selection of thread"
+msgstr	"Mukomatanya Ihitamo Bya Urudodo"
+
+#: src/lang.c:376
+#, fuzzy
+msgid	"cycle through threading options available"
+msgstr	"Uruziga Gihinguranya Amahitamo Bihari"
+
+#: src/lang.c:377
+#, fuzzy
+msgid	"undo all selections (all articles)"
+msgstr	"Isubiranyuma Byose Byose"
+
+#: src/lang.c:378
+#, fuzzy
+msgid	"untag all tagged threads"
+msgstr	"Byose"
+
+#: src/lang.c:379
+#, fuzzy
+msgid	"mark all articles in group as read"
+msgstr	"Ikimenyetso Byose in Itsinda Nka Gusoma"
+
+#: src/lang.c:380
+#, fuzzy
+msgid	"mark all articles in group as read and move to next unread group"
+msgstr	"Ikimenyetso Byose in Itsinda Nka Gusoma Na Kwimura Kuri Komeza>> Bidasomye "
+	"Itsinda"
+
+#: src/lang.c:381
+#, fuzzy
+msgid	"choose first group in list"
+msgstr	"Guhitamo Itangira Itsinda in Urutonde"
+
+#: src/lang.c:382
+#, fuzzy
+msgid	"choose group by name"
+msgstr	"Guhitamo Itsinda ku Izina:"
+
+#: src/lang.c:383
+#, fuzzy
+msgid	"0 - 9\t  choose group by number"
+msgstr	"0 Guhitamo Itsinda ku Umubare"
+
+#: src/lang.c:384
+#, fuzzy
+msgid	"choose range of groups to be affected by next command"
+msgstr	"Guhitamo Urutonde Bya Amatsinda Kuri ku Komeza>> Komandi:"
+
+#: src/lang.c:385
+#, fuzzy
+msgid	"choose last group in list"
+msgstr	"Guhitamo Iheruka Itsinda in Urutonde"
+
+#: src/lang.c:386
+#, fuzzy
+msgid	"mark all articles in chosen group unread"
+msgstr	"Ikimenyetso Byose in Itsinda Bidasomye"
+
+#: src/lang.c:387
+#, fuzzy
+msgid	"move chosen group within list"
+msgstr	"Kwimura Itsinda muri Urutonde"
+
+#: src/lang.c:388
+#, fuzzy
+msgid	"choose next group with unread news"
+msgstr	"Guhitamo Komeza>> Itsinda Na: Bidasomye Amakuru"
+
+#: src/lang.c:389 src/lang.c:1197
+#, fuzzy
+msgid	"quit"
+msgstr	"Kuvamo"
+
+#: src/lang.c:390
+#, fuzzy
+msgid	"quit without saving configuration changes"
+msgstr	"Kuvamo Mu kubika Iboneza Amahinduka"
+
+#: src/lang.c:391
+#, fuzzy
+msgid	"read chosen group"
+msgstr	"Gusoma Itsinda"
+
+#: src/lang.c:392
+#, fuzzy
+msgid	"reset .newsrc (all available articles in groups marked unread)"
+msgstr	"Kugarura."
+
+#: src/lang.c:393
+#, fuzzy
+msgid	"search backwards for a group name"
+msgstr	"Gushaka Inyuma kugirango a Itsinda Izina:"
+
+#: src/lang.c:394
+#, fuzzy
+msgid	" \t  (all searches are case-insensitive and wrap around)"
+msgstr	"(Byose Na Gufunika"
+
+#: src/lang.c:395
+#, fuzzy
+msgid	"search forwards for a group name"
+msgstr	"Gushaka kugirango a Itsinda Izina:"
+
+#: src/lang.c:396
+#, fuzzy
+msgid	"subscribe to chosen group"
+msgstr	"Kwiyandikisha Kuri Itsinda"
+
+#: src/lang.c:397
+#, fuzzy
+msgid	"subscribe to groups that match pattern"
+msgstr	"Kwiyandikisha Kuri Amatsinda BIHUYE Ishusho"
+
+#: src/lang.c:398
+#, fuzzy
+msgid	"reread active file to check for any new news"
+msgstr	"Gikora IDOSIYE Kuri Kugenzura... kugirango Gishya Amakuru"
+
+#: src/lang.c:399
+#, fuzzy
+msgid	"toggle display of group name only or group name plus description"
+msgstr	"Mukomatanya Kugaragaza Bya Itsinda Izina: Cyangwa Itsinda Izina: Guteranya "
+	"Isobanuramiterere"
+
+#: src/lang.c:400
+#, fuzzy
+msgid	"toggle display to show all/unread subscribed groups"
+msgstr	"Mukomatanya Kugaragaza Kuri Garagaza Byose Bidasomye yanditswe/ byemewe "
+	"Amatsinda"
+
+#: src/lang.c:401
+#, fuzzy
+msgid	"unsubscribe from chosen group"
+msgstr	"Kwivana aho wiyandikishe Bivuye Itsinda"
+
+#: src/lang.c:402
+#, fuzzy
+msgid	"unsubscribe from groups that match pattern"
+msgstr	"Kwivana aho wiyandikishe Bivuye Amatsinda BIHUYE Ishusho"
+
+#: src/lang.c:403
+#, fuzzy
+msgid	"sort the list of groups"
+msgstr	"Ishungura i Urutonde Bya Amatsinda"
+
+#: src/lang.c:404
+#, fuzzy
+msgid	"toggle display to show all/subscribed groups"
+msgstr	"Mukomatanya Kugaragaza Kuri Garagaza Byose yanditswe/ byemewe Amatsinda"
+
+#: src/lang.c:405
+#, fuzzy
+msgid	"0 - 9\t  choose article by number"
+msgstr	"0 Guhitamo Ingingo ku Umubare"
+
+#: src/lang.c:406
+#, fuzzy
+msgid	"mark thread as read and return to group index page"
+msgstr	"Ikimenyetso Urudodo Nka Gusoma Na Garuka Kuri Itsinda Umubarendanga Ipaji"
+
+#: src/lang.c:407
+#, fuzzy
+msgid	"mark thread as read and enter next unread thread or group"
+msgstr	"Ikimenyetso Urudodo Nka Gusoma Na Injiza Komeza>> Bidasomye Urudodo Cyangwa "
+	"Itsinda"
+
+#: src/lang.c:408
+#, fuzzy
+msgid	"choose first article in list"
+msgstr	"Guhitamo Itangira Ingingo in Urutonde"
+
+#: src/lang.c:409
+#, fuzzy
+msgid	"choose last article in list"
+msgstr	"Guhitamo Iheruka Ingingo in Urutonde"
+
+#: src/lang.c:410
+#, fuzzy
+msgid	"mark article or tagged articles as read and move cursor to next unread article"
+msgstr	"Ikimenyetso Ingingo Cyangwa Nka Gusoma Na Kwimura indanga Kuri Komeza>> "
+	"Bidasomye Ingingo"
+
+#: src/lang.c:411
+#, fuzzy
+msgid	"read chosen article"
+msgstr	"Gusoma Ingingo"
+
+#: src/lang.c:412
+msgid	"Display properties\n"
+	"------------------"
+msgstr	""
+
+#: src/lang.c:413
+msgid	"Miscellaneous\n"
+	"-------------"
+msgstr	""
+
+#: src/lang.c:414
+msgid	"Moving around\n"
+	"-------------"
+msgstr	""
+
+#: src/lang.c:415
+#, fuzzy
+msgid	"Group/thread/article operations\n"
+	"-------------------------------"
+msgstr	"Urudodo Ingingo"
+
+#: src/lang.c:417
+msgid	"Group Level Commands"
+msgstr	""
+
+#: src/lang.c:418
+#, fuzzy
+msgid	"Kill filter added"
+msgstr	"Muyunguruzi... Kyongewe"
+
+#: src/lang.c:419
+#, fuzzy
+msgid	"Auto-selection filter added"
+msgstr	"Ihitamo Muyunguruzi... Kyongewe"
+
+#: src/lang.c:420
+msgid	"All parts tagged"
+msgstr	""
+
+#: src/lang.c:421
+#, fuzzy
+msgid	"Storing article for later posting"
+msgstr	"Ingingo kugirango"
+
+#: src/lang.c:422
+#, fuzzy
+msgid	"Please enter a valid character"
+msgstr	"Injiza a Byemewe Inyuguti"
+
+#: src/lang.c:423
+#, c-format
+msgid	"Missing part #%d"
+msgstr	""
+
+#: src/lang.c:424
+msgid	"*** No postponed articles ***"
+msgstr	""
+
+#: src/lang.c:425
+#, fuzzy
+msgid	"Not a multi-part message"
+msgstr	"a Ubutumwa"
+
+#: src/lang.c:426
+#, fuzzy
+msgid	"You are not subscribed to this group"
+msgstr	"OYA yanditswe/ byemewe Kuri iyi Itsinda"
+
+#: src/lang.c:427
+#, fuzzy
+msgid	"No previous expression"
+msgstr	"Ibanjirije imvugo"
+
+#: src/lang.c:428
+#, fuzzy
+msgid	"Operation disabled in no-overwrite mode"
+msgstr	"Yahagaritswe in Oya Guhindura Ubwoko"
+
+#. TODO: replace hardcoded key-name in txt_info_postponed
+#: src/lang.c:430
+#, fuzzy, c-format
+msgid	"%d postponed %s, reuse with ^O...\n"
+msgstr	"%dNa:"
+
+#: src/lang.c:431
+#, fuzzy
+msgid	"X-Conversion-Note: multipart/alternative contents have been removed.\n"
+	"  To get the whole article, turn alternative handling OFF in the Option Menu\n"
+msgstr	"Ibigize Cyavanyweho Kubona i Ingingo in i"
+
+#: src/lang.c:433
+#, fuzzy, c-format
+msgid	"Save filename for %s/%s is a mailbox. Attachment not saved"
+msgstr	"Kubika Izina ry'idosiye: kugirango ni a OYA"
+
+#: src/lang.c:434
+#, fuzzy
+msgid	"TeX2Iso encoded article"
+msgstr	"Ingingo"
+
+#: src/lang.c:435
+msgid	"incomplete "
+msgstr	""
+
+#. TODO: replace hardcoded key-names
+#: src/lang.c:437
+#, fuzzy, c-format
+msgid	"\n"
+	"Welcome to %s, a full screen threaded Netnews reader. It can read news "
+	"locally\n"
+	"(ie. <spool>/news) or remotely (-r option)  from a NNTP (Network News "
+	"Transport\n"
+	"Protocol) server. -h lists the available command line options.\n"
+	"\n"
+	"%s  has four newsreading levels, the newsgroup selection page, the group "
+	"index\n"
+	"page, the thread listing page and the article viewer. Help is available at "
+	"each\n"
+	"level by pressing the 'h' command.\n"
+	"\n"
+	"Move up/down by using the terminal arrow keys or 'j' and 'k'.  Use PgUp/PgDn "
+	"or\n"
+	"Ctrl-U and Ctrl-D to page up/down. Enter a newsgroup by pressing RETURN/TAB.\n"
+	"\n"
+	"Articles, threads, tagged articles or articles matching a pattern can be "
+	"mailed\n"
+	"('m' command), printed ('o' command), saved ('s' command), piped ('|' "
+	"command).\n"
+	"Use  the 'w' command  to post a  news article,  the 'f'/'F' commands  to post "
+	"a\n"
+	"follow-up to  an existing  news article  and the 'r'/'R' commands  to reply "
+	"via\n"
+	"mail to an  existing news article author.  The 'M' command allows the "
+	"operation\n"
+	"of %s to be configured via a menu.\n"
+	"\n"
+	"For more information read the manual page, README, INSTALL, TODO and FTP "
+	"files.\n"
+	"Please send bug-reports/comments to %s with the 'R' command.\n"
+msgstr	"Kuri a Mugaragaza Gusoma Amakuru Amakuru Cyangwa R Ihitamo Bivuye a Seriveri "
+	"h Intonde i Bihari Komandi: Umurongo Amahitamo Intera i Urubuga rw'amakuru "
+	"Ihitamo Ipaji i Itsinda i Urudodo Ipaji Na i Ingingo ni Bihari ku ku i "
+	"Komandi: Hejuru Hasi ku ikoresha i Akambi Utubuto Cyangwa Na U Na Kuri Ipaji "
+	"Hejuru Hasi a Urubuga rw'amakuru ku Cyangwa a Ishusho Komandi: Byacapwe "
+	"Komandi: Komandi: Komandi: i Komandi: Kuri Iposita a Amakuru Ingingo i "
+	"Amabwiriza Kuri Iposita Hejuru Kuri Amakuru Ingingo Na i Amabwiriza Kuri "
+	"Subiza Kuri Amakuru Ingingo Umwanditsi Komandi: i Kuri Biturutse a "
+	"Ibikubiyemo Birenzeho Ibisobanuro Gusoma i Bikorwa Ipaji Na Idosiye Kohereza "
+	"Raporo Ibisobanuro Kuri Na: i Komandi:"
+
+#: src/lang.c:453
+#, fuzzy, c-format
+msgid	"Invalid  From: %s  line. Read the INSTALL file again."
+msgstr	"Umurongo i IDOSIYE"
+
+#: src/lang.c:455
+msgid	"Invalid multibyte sequence found\n"
+msgstr	""
+
+#: src/lang.c:457
+#, fuzzy, c-format
+msgid	"Invalid  Sender:-header %s"
+msgstr	"Umutwempangano"
+
+#: src/lang.c:458
+#, fuzzy
+msgid	"Inverse video disabled"
+msgstr	"Videwo... Yahagaritswe"
+
+#: src/lang.c:459
+#, fuzzy
+msgid	"Inverse video enabled"
+msgstr	"Videwo... Bikora"
+
+#: src/lang.c:461
+#, fuzzy, c-format
+msgid	"Missing definition for %s\n"
+msgstr	"Insobanuro kugirango"
+
+#: src/lang.c:462
+#, fuzzy, c-format
+msgid	"Invalid key definition '%s'\n"
+msgstr	"Urufunguzo Insobanuro"
+
+#: src/lang.c:463
+#, c-format
+msgid	"Invalid keyname '%s'\n"
+msgstr	""
+
+#: src/lang.c:464
+#, fuzzy, c-format
+msgid	"Keymap file was upgraded to version %s\n"
+msgstr	"IDOSIYE Kuri Verisiyo"
+
+#: src/lang.c:465
+#, c-format
+msgid	"Kill From:     [%s] (y/n): "
+msgstr	""
+
+#: src/lang.c:466
+msgid	"Kill Lines: (</>num): "
+msgstr	""
+
+#: src/lang.c:467
+msgid	"Kill Article Menu"
+msgstr	""
+
+#: src/lang.c:468
+#, c-format
+msgid	"Kill Msg-Id:   [%s] (f/l/o/n): "
+msgstr	""
+
+#: src/lang.c:469
+#, fuzzy
+msgid	"Kill pattern scope  : "
+msgstr	"Ishusho Ingano:"
+
+#: src/lang.c:470
+#, c-format
+msgid	"Kill Subject:  [%s] (y/n): "
+msgstr	""
+
+#: src/lang.c:471
+#, fuzzy
+msgid	"Kill text pattern   : "
+msgstr	"Umwandiko Ishusho"
+
+#: src/lang.c:472
+#, fuzzy
+msgid	"Kill time in days   : "
+msgstr	"Igihe in Iminsi"
+
+#: src/lang.c:474
+msgid	"Last"
+msgstr	"Iheruka"
+
+#: src/lang.c:475
+msgid	"-- Last response --"
+msgstr	""
+
+#: src/lang.c:476
+#, fuzzy, c-format
+msgid	"Lines %s  "
+msgstr	"Imirongo."
+
+#: src/lang.c:478
+#, fuzzy
+msgid	"Message-ID: line              "
+msgstr	"Umurongo"
+
+# sfx2/source\appl\app.src:STR_MAIL.text
+#: src/lang.c:479
+msgid	"Mail"
+msgstr	"Ubutumwa"
+
+#: src/lang.c:480
+msgid	"mailbox "
+msgstr	""
+
+#: src/lang.c:481
+#, fuzzy, c-format
+msgid	"Mail article(s) to [%.*s]> "
+msgstr	"Ingingo S Kuri S"
+
+#: src/lang.c:482
+#, fuzzy, c-format
+msgid	"Mailing log to %s\n"
+msgstr	"LOG Kuri %s\n"
+
+#: src/lang.c:483
+#, fuzzy
+msgid	"Mail bug report..."
+msgstr	"Icyegeranyo"
+
+#: src/lang.c:484
+#, fuzzy, c-format
+msgid	"Mail BUG REPORT to %s?"
+msgstr	"Kuri"
+
+#: src/lang.c:485
+msgid	"Mailed"
+msgstr	""
+
+#: src/lang.c:486
+#, fuzzy, c-format
+msgid	"Mailing to %s..."
+msgstr	"Kuri %s"
+
+#: src/lang.c:487
+#, fuzzy
+msgid	"# [Mail/Save] active file. Format is like news active file:\n"
+	"#   groupname  max.artnum  min.artnum  /dir\n"
+	"# The 4th field is the basedir (ie. ~/Mail or ~/News)\n"
+	"#\n"
+msgstr	"#[Kubika Gikora IDOSIYE ni nka Amakuru Gikora IDOSIYE KININI GITO Umwanya ni "
+	"i Cyangwa"
+
+#: src/lang.c:490
+#, fuzzy, c-format
+msgid	"%s marked as unread"
+msgstr	"%scy/ byagarajwe Nka Bidasomye"
+
+#: src/lang.c:491
+#, fuzzy, c-format
+msgid	"Marked %d of %d tagged %s as read"
+msgstr	"Bya Nka Gusoma"
+
+#: src/lang.c:492
+#, fuzzy, c-format
+msgid	"Mark all articles as read%s?"
+msgstr	"Byose Nka Gusoma"
+
+#: src/lang.c:493
+#, fuzzy, c-format
+msgid	"Mark %s=tagged articles, %s=current article, %s=quit: "
+msgstr	"KIGEZWEHO Ingingo Kuvamo"
+
+#: src/lang.c:494
+#, fuzzy, c-format
+msgid	"Mark group %s as read?"
+msgstr	"Itsinda Nka Gusoma"
+
+#: src/lang.c:495
+#, fuzzy, c-format
+msgid	"Mark thread as read%s?"
+msgstr	"Urudodo Nka Gusoma"
+
+#: src/lang.c:496
+#, fuzzy, c-format
+msgid	"Mark %s=tagged articles/threads, %s=current thread, %s=quit: "
+msgstr	"KIGEZWEHO Urudodo Kuvamo"
+
+#: src/lang.c:497
+#, fuzzy, c-format
+msgid	"Matching %s groups..."
+msgstr	"Amatsinda"
+
+#: src/lang.c:498 src/lang.c:502
+#, fuzzy, c-format
+msgid	"<n>=set current to n; %s=next unread; %s=search pattern; %s=kill/select"
+msgstr	"<N Gushyiraho KIGEZWEHO Kuri N Komeza>> Bidasomye Gushaka Ishusho Guhitamo"
+
+#: src/lang.c:499
+#, fuzzy, c-format
+msgid	"%s=author search; %s=catchup; %s=line down; %s=line up; %s=mark read; %s=list "
+	"thread"
+msgstr	"%s=Umwanditsi Gushaka Umurongo Hasi Umurongo Hejuru Ikimenyetso Gusoma "
+	"Urutonde Urudodo"
+
+#: src/lang.c:500
+#, fuzzy, c-format
+msgid	"%s=line up; %s=line down; %s=page up; %s=page down; %s=top; %s=bottom"
+msgstr	"%s=Umurongo Hejuru Umurongo Hasi Ipaji Hejuru Ipaji Hasi Hejuru: Hasi:"
+
+#: src/lang.c:501
+#, fuzzy, c-format
+msgid	"%s=search forwards; %s=search backwards; %s=quit"
+msgstr	"%s=Gushaka Gushaka Inyuma Kuvamo"
+
+#: src/lang.c:503
+#, fuzzy, c-format
+msgid	"%s=author search; %s=body search; %s=catchup; %s=followup; %s=mark read"
+msgstr	"%s=Umwanditsi Gushaka Umubiri Gushaka Ikimenyetso Gusoma"
+
+#: src/lang.c:504
+#, fuzzy, c-format
+msgid	"<n>=set current to n; %s=next unread; %s,%s=search pattern; %s=catchup"
+msgstr	"<N Gushyiraho KIGEZWEHO Kuri N Komeza>> Bidasomye Gushaka Ishusho"
+
+#: src/lang.c:505
+#, fuzzy, c-format
+msgid	"%s=line down; %s=line up; %s=help; %s=move; %s=quit; %s=toggle all/unread"
+msgstr	"%s=Umurongo Hasi Umurongo Hejuru Ifashayobora Kwimura Kuvamo Mukomatanya "
+	"Byose Bidasomye"
+
+#: src/lang.c:506
+#, fuzzy, c-format
+msgid	"%s=subscribe; %s=sub pattern; %s=unsubscribe; %s=unsub pattern; %s=yank in/out"
+msgstr	"%s=Kwiyandikisha Ishusho Kwivana aho wiyandikishe Ishusho in Inyuma"
+
+#: src/lang.c:507
+#, fuzzy, c-format
+msgid	"<n>=set current to n; %s=next unread; %s=catchup; %s=display toggle"
+msgstr	"<N Gushyiraho KIGEZWEHO Kuri N Komeza>> Bidasomye Kugaragaza Mukomatanya"
+
+#: src/lang.c:508
+#, fuzzy, c-format
+msgid	"%s=help; %s=line down; %s=line up; %s=quit; %s=tag; %s=mark unread"
+msgstr	"%s=Ifashayobora Umurongo Hasi Umurongo Hejuru Kuvamo Itagi: Ikimenyetso "
+	"Bidasomye"
+
+#: src/lang.c:509
+msgid	"--More--"
+msgstr	""
+
+#: src/lang.c:510
+#, c-format
+msgid	"Moving %s..."
+msgstr	""
+
+#: src/lang.c:512
+#, fuzzy
+msgid	", name: "
+msgstr	",IZINA! "
+
+#: src/lang.c:513
+#, fuzzy, c-format
+msgid	"Goto newsgroup [%s]> "
+msgstr	"Urubuga rw'amakuru"
+
+# svtools/source\misc\mediatyp.src:STR_SVT_MIMETYPE_CNT_BBBOX.text
+#: src/lang.c:514
+#, fuzzy
+msgid	"newsgroups"
+msgstr	"Imbuga z'amakuru"
+
+#: src/lang.c:515
+#, c-format
+msgid	"Position %s in group list (1,2,..,$) [%d]> "
+msgstr	""
+
+#: src/lang.c:516
+#, fuzzy
+msgid	"newsgroup"
+msgstr	"Urubuga rw'amakuru"
+
+#: src/lang.c:517
+#, fuzzy
+msgid	"Try and save newsrc file again?"
+msgstr	"Na Kubika IDOSIYE"
+
+#: src/lang.c:518
+#, fuzzy
+msgid	"Warning: No newsgroups were written to your newsrc file. Save aborted."
+msgstr	"Imbuga z'amakuru Kuri IDOSIYE Kubika"
+
+#: src/lang.c:519
+#, fuzzy
+msgid	"newsrc file saved successfully.\n"
+msgstr	"IDOSIYE"
+
+#: src/lang.c:520
+msgid	"-- Next response --"
+msgstr	""
+
+#: src/lang.c:521
+#, fuzzy, c-format
+msgid	"NNTP authorization password not found for %s"
+msgstr	"Ijambobanga... OYA Byabonetse kugirango"
+
+#: src/lang.c:522
+#, fuzzy
+msgid	"No  "
+msgstr	"Oya"
+
+#: src/lang.c:523
+msgid	"*** No articles ***"
+msgstr	""
+
+#: src/lang.c:524
+msgid	"No articles have been posted"
+msgstr	""
+
+#: src/lang.c:525
+#, fuzzy
+msgid	"*** No description ***"
+msgstr	"*** Isobanuramiterere ***"
+
+#: src/lang.c:526
+#, fuzzy
+msgid	"No filename"
+msgstr	"Izina ry'idosiye:"
+
+#: src/lang.c:527
+#, fuzzy
+msgid	"No group"
+msgstr	"Itsinda"
+
+#: src/lang.c:528
+#, fuzzy
+msgid	"*** No groups ***"
+msgstr	"*** Amatsinda ***"
+
+#: src/lang.c:529
+#, fuzzy
+msgid	"No more groups to read"
+msgstr	"Birenzeho Amatsinda Kuri Gusoma"
+
+#: src/lang.c:530
+#, fuzzy
+msgid	"No last message"
+msgstr	"Iheruka Ubutumwa"
+
+#: src/lang.c:531
+#, fuzzy
+msgid	"No mail address"
+msgstr	"Ubutumwa Aderesi"
+
+#: src/lang.c:532
+#, fuzzy
+msgid	"No articles marked for saving"
+msgstr	"cy/ byagarajwe kugirango Mu kubika"
+
+#: src/lang.c:533
+#, fuzzy
+msgid	"No match"
+msgstr	"BIHUYE"
+
+#: src/lang.c:534
+#, fuzzy
+msgid	"No more groups"
+msgstr	"Birenzeho Amatsinda"
+
+#: src/lang.c:535
+#, fuzzy
+msgid	"No newsgroups"
+msgstr	"Imbuga z'amakuru"
+
+#: src/lang.c:536
+#, fuzzy
+msgid	"No next unread article"
+msgstr	"Komeza>> Bidasomye Ingingo"
+
+#: src/lang.c:537
+#, fuzzy
+msgid	"No previous group"
+msgstr	"Ibanjirije Itsinda"
+
+#: src/lang.c:538
+#, fuzzy
+msgid	"No previous unread article"
+msgstr	"Ibanjirije Bidasomye Ingingo"
+
+#: src/lang.c:539
+msgid	"No responses"
+msgstr	""
+
+#: src/lang.c:540
+#, fuzzy
+msgid	"No responses to list in current thread"
+msgstr	"Kuri Urutonde in KIGEZWEHO Urudodo"
+
+#: src/lang.c:541
+#, fuzzy
+msgid	"No search string"
+msgstr	"Gushaka Ikurikiranyanyuguti"
+
+#: src/lang.c:542
+msgid	"No subject"
+msgstr	"Nta kivugwaho"
+
+#: src/lang.c:544
+#, fuzzy, c-format
+msgid	"%s: Terminal must have clear to end-of-line (ce)\n"
+msgstr	"%s:Gusiba Kuri Impera Bya Umurongo"
+
+#: src/lang.c:545
+#, fuzzy, c-format
+msgid	"%s: Terminal must have clear to end-of-screen (cd)\n"
+msgstr	"%s:Gusiba Kuri Impera Bya Mugaragaza"
+
+#: src/lang.c:546
+#, c-format
+msgid	"%s: Terminal must have clearscreen (cl) capability\n"
+msgstr	""
+
+#: src/lang.c:547
+#, fuzzy, c-format
+msgid	"%s: Terminal must have cursor motion (cm)\n"
+msgstr	"%s:indanga cm"
+
+#: src/lang.c:548
+#, fuzzy, c-format
+msgid	"%s: TERM variable must be set to use screen capabilities\n"
+msgstr	"%s:IMPINDURAGACIRO Gushyiraho Kuri Gukoresha Mugaragaza"
+
+#: src/lang.c:550
+#, fuzzy, c-format
+msgid	"No viewer found for %s/%s\n"
+msgstr	"Byabonetse kugirango"
+
+#: src/lang.c:551
+#, fuzzy
+msgid	"Newsgroup does not exist on this server"
+msgstr	"OYA ku iyi Seriveri"
+
+#: src/lang.c:552
+#, fuzzy, c-format
+msgid	"Group %s not found in active file"
+msgstr	"OYA Byabonetse in Gikora IDOSIYE"
+
+#: src/lang.c:553
+#, fuzzy
+msgid	"c)reate it, use a)lternative name, use d)efault .newsrc, q)uit tin: "
+msgstr	"C Gukoresha a Izina: Gukoresha D Q"
+
+#: src/lang.c:554
+#, fuzzy
+msgid	"use a)lternative name, use d)efault .newsrc, q)uit tin: "
+msgstr	"Gukoresha a Izina: Gukoresha D Q"
+
+#: src/lang.c:555
+#, c-format
+msgid	"# NNTP-server -> newsrc translation table and NNTP-server\n"
+	"# shortname list for %s %s\n"
+	"#\n"
+	"# the format of this file is\n"
+	"#   <FQDN of NNTP-server> <newsrc file> <shortname> ...\n"
+	"#\n"
+	"# if <newsrc file> is given without path, $HOME is assumed as its location\n"
+	"#\n"
+	"# examples:\n"
+	"#   news.tin.org  .newsrc-tin.org  tinorg\n"
+	"#   news.ka.nu    /tmp/nrc-nu      kanu    nu\n"
+	"#\n"
+msgstr	""
+
+#: src/lang.c:562
+msgid	"Only"
+msgstr	""
+
+#: src/lang.c:563
+#, fuzzy, c-format
+msgid	"Option not enabled. Recompile with %s."
+msgstr	"OYA Bikora Na:"
+
+#: src/lang.c:564
+msgid	"Options Menu"
+msgstr	""
+
+#: src/lang.c:567
+#, fuzzy, c-format
+msgid	"Error in regex: %s at pos. %d '%s'"
+msgstr	"in ku"
+
+#: src/lang.c:568
+#, fuzzy, c-format
+msgid	"Error in regex: pcre internal error %d"
+msgstr	"in By'imbere Ikosa"
+
+#: src/lang.c:569
+#, fuzzy, c-format
+msgid	"Error in regex: study - pcre internal error %s"
+msgstr	"in By'imbere Ikosa"
+
+#: src/lang.c:570
+msgid	"Post a followup..."
+msgstr	""
+
+#. TODO: replace hardcoded key-name in txt_post_error_ask_postpone
+#: src/lang.c:572
+#, fuzzy
+msgid	"An error has occurred while posting the article. If you think that this\n"
+	"error is temporary or otherwise correctable, you can postpone the article\n"
+	"and pick it up again with ^O later.\n"
+msgstr	"Ikosa i Ingingo ni By'igihe gito Cyangwa i Hejuru Na:"
+
+#: src/lang.c:575
+#, fuzzy
+msgid	"Posted articles history"
+msgstr	"Urutonde"
+
+#: src/lang.c:576
+#, fuzzy, c-format
+msgid	"Post to newsgroup(s) [%s]> "
+msgstr	"Kuri Urubuga rw'amakuru S"
+
+#: src/lang.c:577
+#, fuzzy
+msgid	"-- post processing started --"
+msgstr	"--Iposita Inonosora--"
+
+#: src/lang.c:578
+#, fuzzy
+msgid	"-- post processing completed --"
+msgstr	"--Iposita Inonosora--"
+
+#: src/lang.c:579
+#, fuzzy, c-format
+msgid	"Post subject [%s]> "
+msgstr	"Ikivugwaho"
+
+#: src/lang.c:580
+#, fuzzy
+msgid	"# Summary of mailed/posted messages viewable by 'W' command from within tin.\n"
+msgstr	"# Bya Ubutumwa ku Komandi: Bivuye muri"
+
+#: src/lang.c:581
+#, fuzzy
+msgid	"Posting article..."
+msgstr	"Ingingo"
+
+#: src/lang.c:582
+#, c-format
+msgid	"Post postponed articles [%%s]? (%s/%s/%s/%s/%s): "
+msgstr	""
+
+#: src/lang.c:583
+#, c-format
+msgid	"Hot %s"
+msgstr	""
+
+#: src/lang.c:584
+#, c-format
+msgid	"Tagged %s"
+msgstr	""
+
+#: src/lang.c:585
+#, c-format
+msgid	"Untagged %s"
+msgstr	""
+
+#: src/lang.c:586
+#, fuzzy
+msgid	"Processing mail messages marked for deletion."
+msgstr	"Ubutumwa Ubutumwa cy/ byagarajwe kugirango Isibwa"
+
+#: src/lang.c:587
+#, fuzzy
+msgid	"Processing saved articles marked for deletion."
+msgstr	"cy/ byagarajwe kugirango Isibwa"
+
+#: src/lang.c:588
+#, fuzzy, c-format
+msgid	"Accept Followup-To? %s=post, %s=ignore, %s=quit: "
+msgstr	"Iposita Kwirengagiza Kuvamo"
+
+#: src/lang.c:589
+#, fuzzy
+msgid	"Article unchanged, abort mailing?"
+msgstr	"Kureka"
+
+#: src/lang.c:590
+#, fuzzy, c-format
+msgid	"Do you want to see postponed articles (%d)?"
+msgstr	"Kuri"
+
+#: src/lang.c:592
+#, fuzzy
+msgid	"Add quick kill filter?"
+msgstr	"Muyunguruzi..."
+
+#: src/lang.c:593
+#, fuzzy
+msgid	"Add quick selection filter?"
+msgstr	"Ihitamo Muyunguruzi..."
+
+#: src/lang.c:594
+#, fuzzy
+msgid	"Do you really want to quit?"
+msgstr	"Kuri Kuvamo"
+
+#: src/lang.c:595
+#, fuzzy, c-format
+msgid	"%s=edit cancel message, %s=quit, %s=delete (cancel) [%%s]: "
+msgstr	"%s=Guhindura Kureka Ubutumwa Kuvamo Gusiba Kureka"
+
+#: src/lang.c:596
+#, fuzzy
+msgid	"You have tagged articles in this group - quit anyway?"
+msgstr	"in iyi Itsinda Kuvamo"
+
+#: src/lang.c:597
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=postpone: "
+msgstr	"%s=Kuvamo Guhindura"
+
+#: src/lang.c:598
+#, fuzzy, c-format
+msgid	"%s=quit %s=edit %s=save kill description: "
+msgstr	"%s=Kuvamo Guhindura Kubika Isobanuramiterere"
+
+#: src/lang.c:599
+#, fuzzy, c-format
+msgid	"%s=quit %s=edit %s=save select description: "
+msgstr	"%s=Kuvamo Guhindura Kubika Guhitamo Isobanuramiterere"
+
+#: src/lang.c:600
+#, fuzzy
+msgid	"Do you really want to quit without saving your configuration?"
+msgstr	"Kuri Kuvamo Mu kubika Iboneza"
+
+#: src/lang.c:603
+#, fuzzy
+msgid	"Invalid range - valid are '0-9.$' eg. 1-$"
+msgstr	"Urutonde Byemewe 0 9 1."
+
+#: src/lang.c:604
+#, fuzzy
+msgid	"Do you want to abort this operation?"
+msgstr	"Kuri Kureka iyi"
+
+#: src/lang.c:605
+#, fuzzy
+msgid	"Do you want to exit tin immediately?"
+msgstr	"Kuri Gusohoka Ako kanya"
+
+#: src/lang.c:606
+msgid	"Read response> "
+msgstr	""
+
+#: src/lang.c:607
+#, fuzzy
+msgid	"Reading ('q' to quit)..."
+msgstr	"Kuri Kuvamo"
+
+#: src/lang.c:608
+#, c-format
+msgid	"Reading %sarticles..."
+msgstr	""
+
+#: src/lang.c:609
+#, fuzzy, c-format
+msgid	"Reading %sattributes file...\n"
+msgstr	"IDOSIYE"
+
+#: src/lang.c:610
+#, fuzzy, c-format
+msgid	"Reading %sconfig file...\n"
+msgstr	"IDOSIYE"
+
+#: src/lang.c:611
+#, fuzzy
+msgid	"Reading filter file...\n"
+msgstr	"Muyunguruzi... IDOSIYE"
+
+#: src/lang.c:612
+#, fuzzy, c-format
+msgid	"Reading %s groups..."
+msgstr	"Amatsinda"
+
+#: src/lang.c:613
+#, fuzzy
+msgid	"Reading input history file...\n"
+msgstr	"Iyinjiza Urutonde IDOSIYE"
+
+#: src/lang.c:614
+#, fuzzy
+msgid	"Reading keymap file...\n"
+msgstr	"IDOSIYE"
+
+#: src/lang.c:615
+#, fuzzy
+msgid	"Reading groups from active file... "
+msgstr	"Amatsinda Bivuye Gikora IDOSIYE"
+
+#: src/lang.c:616
+#, fuzzy
+msgid	"Reading groups from newsrc file... "
+msgstr	"Amatsinda Bivuye IDOSIYE"
+
+#: src/lang.c:617
+#, fuzzy
+msgid	"Reading newsgroups file... "
+msgstr	"Imbuga z'amakuru IDOSIYE"
+
+#: src/lang.c:618
+#, fuzzy
+msgid	"Reading newsrc file..."
+msgstr	"IDOSIYE"
+
+#: src/lang.c:620
+#, c-format
+msgid	"(%d:%02d remaining)"
+msgstr	""
+
+#: src/lang.c:622
+#, fuzzy, c-format
+msgid	"Bogus group %s removed."
+msgstr	"Itsinda Cyavanyweho"
+
+#: src/lang.c:623
+#, fuzzy, c-format
+msgid	"Error: rename %s to %s"
+msgstr	"Guhindura izina Kuri"
+
+#: src/lang.c:624
+#, fuzzy
+msgid	"Reply to author..."
+msgstr	"Kuri Umwanditsi"
+
+#: src/lang.c:625
+msgid	"Repost"
+msgstr	""
+
+#: src/lang.c:626
+#, fuzzy
+msgid	"Reposting article..."
+msgstr	"Ingingo"
+
+#: src/lang.c:627
+#, fuzzy, c-format
+msgid	"Repost article(s) to group(s) [%s]> "
+msgstr	"Ingingo S Kuri Itsinda S"
+
+#: src/lang.c:628
+msgid	"Reset newsrc?"
+msgstr	""
+
+#: src/lang.c:629
+#, fuzzy
+msgid	"Responses have been directed to the following newsgroups"
+msgstr	"Kuri i Imbuga z'amakuru"
+
+#: src/lang.c:630
+#, fuzzy, c-format
+msgid	"Responses have been directed to poster. %s=mail, %s=post, %s=quit: "
+msgstr	"Kuri Umuteguro Ubutumwa Iposita Kuvamo"
+
+#: src/lang.c:631
+#, fuzzy, c-format
+msgid	"RespNo %4d of %4d"
+msgstr	"Bya"
+
+#: src/lang.c:632
+#, fuzzy
+msgid	"Press <RETURN> to continue..."
+msgstr	"Kuri urifuzagukomeza"
+
+#: src/lang.c:634
+#, fuzzy, c-format
+msgid	"Select From    [%s] (y/n): "
+msgstr	"Y N"
+
+#: src/lang.c:635
+msgid	"Select Lines: (</>num): "
+msgstr	""
+
+#: src/lang.c:636
+#, fuzzy
+msgid	"Auto-select Article Menu"
+msgstr	"Guhitamo"
+
+#: src/lang.c:637
+#, fuzzy, c-format
+msgid	"Select Msg-Id  [%s] (f/l/o/n): "
+msgstr	"F L o N"
+
+#: src/lang.c:638
+#, fuzzy
+msgid	"Select pattern scope: "
+msgstr	"Ishusho Ingano:"
+
+#: src/lang.c:639
+#, fuzzy, c-format
+msgid	"Select Subject [%s] (y/n): "
+msgstr	"Y N"
+
+#: src/lang.c:640
+#, fuzzy
+msgid	"Select text pattern : "
+msgstr	"Umwandiko Ishusho"
+
+#: src/lang.c:641
+#, fuzzy
+msgid	"Select time in days   : "
+msgstr	"Igihe in Iminsi"
+
+#: src/lang.c:642
+#, fuzzy, c-format
+msgid	"# %s server configuration file\n"
+	"# This file was automatically saved by %s %s %s (\"%s\")\n"
+	"#\n"
+	"# Do not edit while %s is running, since all your changes to this file\n"
+	"# will be overwritten when you leave %s.\n"
+	"# Do not edit at all if you don't know what you do.\n"
+	"############################################################################\n"
+	"\n"
+msgstr	"#%sSeriveri Iboneza IDOSIYE ku buryo bwikora ku OYA Guhindura ni guhera Byose "
+	"Amahinduka Kuri iyi Ryari: OYA Guhindura ku Byose NIBA"
+
+#: src/lang.c:648
+#, fuzzy
+msgid	"Showing unread groups only"
+msgstr	"Bidasomye Amatsinda"
+
+#: src/lang.c:649
+#, fuzzy
+msgid	"Subject: line (ignore case)   "
+msgstr	"Umurongo Kwirengagiza"
+
+#: src/lang.c:650
+#, fuzzy
+msgid	"Subject: line (case sensitive)"
+msgstr	"Umurongo"
+
+#: src/lang.c:651
+msgid	"Save"
+msgstr	"Kubika"
+
+#: src/lang.c:652
+#, fuzzy, c-format
+msgid	"Save '%s' (%s/%s)?"
+msgstr	"Kubika"
+
+#: src/lang.c:653
+#, fuzzy
+msgid	"Save configuration before continuing?"
+msgstr	"Kubika Iboneza Mbere"
+
+#: src/lang.c:654
+#, fuzzy
+msgid	"Save filename> "
+msgstr	"Kubika Izina ry'idosiye:"
+
+#: src/lang.c:655
+msgid	"Saved"
+msgstr	""
+
+#: src/lang.c:656
+#, fuzzy, c-format
+msgid	"%4d unread (%4d hot) %s in %s\n"
+msgstr	"%4dBidasomye in"
+
+#: src/lang.c:657
+#, c-format
+msgid	"Saved %s...\n"
+msgstr	""
+
+#: src/lang.c:658
+msgid	"Nothing was saved"
+msgstr	""
+
+#: src/lang.c:659
+#, fuzzy, c-format
+msgid	"\n"
+	"%s %d %s from %d %s\n"
+msgstr	"%s%d%sBivuye"
+
+#: src/lang.c:660
+#, fuzzy, c-format
+msgid	"-- %s saved to %s%s --"
+msgstr	"--%sKuri"
+
+#: src/lang.c:661
+#, fuzzy, c-format
+msgid	"-- %s saved to %s - %s --"
+msgstr	"--%sKuri"
+
+#: src/lang.c:662
+#, fuzzy
+msgid	"Saving..."
+msgstr	"Kubika%S"
+
+#: src/lang.c:663
+#, fuzzy, c-format
+msgid	"%s: Screen initialization failed"
+msgstr	"%s:Byanze"
+
+#: src/lang.c:665
+#, fuzzy, c-format
+msgid	"%s: screen is too small\n"
+msgstr	"%s:Mugaragaza ni"
+
+#: src/lang.c:667
+#, fuzzy, c-format
+msgid	"screen is too small, %s is exiting\n"
+msgstr	"Mugaragaza ni Gitoya ni"
+
+# svx/source\form\fmsearch.src:RID_SVXDLG_SEARCHFORM.CB_BACKWARD.text
+#: src/lang.c:668
+#, fuzzy, c-format
+msgid	"Search backwards [%s]> "
+msgstr	"Gushakisha inyuma"
+
+#: src/lang.c:669
+#, fuzzy, c-format
+msgid	"Search body [%s]> "
+msgstr	"Umubiri"
+
+#: src/lang.c:670
+#, c-format
+msgid	"Search forwards [%s]> "
+msgstr	""
+
+# 5374
+#: src/lang.c:671
+msgid	"Searching..."
+msgstr	"Gushakisha..."
+
+#: src/lang.c:672
+#, fuzzy, c-format
+msgid	"Searching article %d of %d ('q' to abort)..."
+msgstr	"Ingingo Bya Kuri Kureka"
+
+#: src/lang.c:673
+#, fuzzy
+msgid	"Select article> "
+msgstr	"Ingingo"
+
+#: src/lang.c:674
+#, fuzzy
+msgid	"Select option number before text or use arrow keys and <CR>. 'q' to quit."
+msgstr	"Ihitamo Umubare Mbere Umwandiko Cyangwa Gukoresha Akambi Utubuto Na Kuri "
+	"Kuvamo"
+
+#: src/lang.c:675
+#, fuzzy
+msgid	"Select group> "
+msgstr	"Itsinda"
+
+#: src/lang.c:676
+#, fuzzy, c-format
+msgid	"Enter selection pattern [%s]> "
+msgstr	"Ihitamo Ishusho"
+
+#: src/lang.c:677
+#, fuzzy
+msgid	"Select thread > "
+msgstr	"Urudodo"
+
+#: src/lang.c:678
+#, fuzzy, c-format
+msgid	"%s %s %s (\"%s\") [%s]: send a DETAILED bug report to %s\n"
+msgstr	"%s%s%s(\"%s\")[%s]:Kohereza a Icyegeranyo Kuri"
+
+#: src/lang.c:679
+#, fuzzy
+msgid	"servers active-file"
+msgstr	"Gikora IDOSIYE"
+
+#: src/lang.c:680
+#, fuzzy
+msgid	"Cannot move into new newsgroups. Subscribe first..."
+msgstr	"Kwimura Gishya Imbuga z'amakuru Itangira"
+
+#: src/lang.c:681
+msgid	"<SPACE>"
+msgstr	""
+
+#: src/lang.c:682
+#, c-format
+msgid	"Starting: (%s)"
+msgstr	""
+
+#: src/lang.c:683
+#, fuzzy, c-format
+msgid	"List Thread (%d of %d)"
+msgstr	"Bya"
+
+#: src/lang.c:684
+#, fuzzy, c-format
+msgid	"Thread (%.*s)"
+msgstr	"S"
+
+#: src/lang.c:685
+#, fuzzy
+msgid	"Enter wildcard subscribe pattern> "
+msgstr	"Kwiyandikisha Ishusho"
+
+#: src/lang.c:686
+#, fuzzy, c-format
+msgid	"subscribed to %d groups"
+msgstr	"yanditswe/ byemewe Kuri Amatsinda"
+
+#: src/lang.c:687
+#, fuzzy, c-format
+msgid	"Subscribed to %s"
+msgstr	"Kuri"
+
+#: src/lang.c:688
+msgid	"Subscribing... "
+msgstr	""
+
+#: src/lang.c:689
+#, fuzzy, c-format
+msgid	"Repost or supersede article(s) [%%s]? (%s/%s/%s): "
+msgstr	"Cyangwa Ingingo S"
+
+#: src/lang.c:690
+#, fuzzy, c-format
+msgid	"Supersede article(s) to group(s) [%s]> "
+msgstr	"Ingingo S Kuri Itsinda S"
+
+#: src/lang.c:691
+#, fuzzy
+msgid	"Superseding article ..."
+msgstr	"Ingingo"
+
+#: src/lang.c:692
+#, fuzzy, c-format
+msgid	"\n"
+	"Stopped. Type 'fg' to restart %s\n"
+msgstr	"Kuri Ongera utangire"
+
+#: src/lang.c:694
+#, fuzzy, c-format
+msgid	"%d days"
+msgstr	"%dIminsi"
+
+#: src/lang.c:695
+msgid	"<TAB>"
+msgstr	""
+
+#: src/lang.c:696
+msgid	"TeX "
+msgstr	""
+
+#: src/lang.c:697
+#, fuzzy
+msgid	"# Default action/prompt strings\n"
+msgstr	"#Igikorwa Urwinjiriro"
+
+#: src/lang.c:698
+#, fuzzy
+msgid	"# Defaults for quick (1 key) kill & auto-selection filters\n"
+	"# header=NUM  0,1=Subject: 2,3=From: 4=Message-ID: & full References: line\n"
+	"#             5=Message-ID: & last References: entry only\n"
+	"#             6=Message-ID: entry only 7=Lines:\n"
+	"# global=ON/OFF  ON=apply to all groups OFF=apply to current group\n"
+	"# case=ON/OFF    ON=filter case sensitive OFF=ignore case\n"
+	"# expire=ON/OFF  ON=limit to default_filter_days OFF=don't ever expire\n"
+msgstr	"#kugirango 1. Urufunguzo Ikiyega Ihitamo Umutwempangano 0 1. 2. 3. 4. 5 "
+	"Iheruka Icyinjijwe 6 Icyinjijwe 7 Gukurikiza Kuri Byose Amatsinda Gukurikiza "
+	"Kuri KIGEZWEHO Muyunguruzi... Kwirengagiza Kuri"
+
+#: src/lang.c:711
+#, fuzzy
+msgid	"# If ON use print current subject or newsgroup description in the last line\n"
+msgstr	"#Gukoresha Gucapa KIGEZWEHO Ikivugwaho Cyangwa Urubuga rw'amakuru "
+	"Isobanuramiterere in i Iheruka"
+
+#: src/lang.c:712
+#, fuzzy
+msgid	"# Host & time info used for detecting new groups (don't touch)\n"
+msgstr	"#Igihe Ibisobanuro kugirango Gishya Amatsinda"
+
+#: src/lang.c:713
+#, fuzzy
+msgid	"There is no news\n"
+msgstr	"ni Oya"
+
+#: src/lang.c:714
+msgid	"Thread"
+msgstr	"Urudodo"
+
+#: src/lang.c:715
+msgid	"Thread Level Commands"
+msgstr	""
+
+#: src/lang.c:716
+msgid	"Thread deselected"
+msgstr	""
+
+#: src/lang.c:717
+#, fuzzy
+msgid	"Thread selected"
+msgstr	"Byahiswemo"
+
+#: src/lang.c:719
+msgid	"threads"
+msgstr	""
+
+#: src/lang.c:721
+#, fuzzy
+msgid	"Thread range"
+msgstr	"Urutonde"
+
+#: src/lang.c:722
+#, fuzzy
+msgid	"thread"
+msgstr	"Urudodo"
+
+#: src/lang.c:723
+#, fuzzy, c-format
+msgid	"Thread %4s of %4s"
+msgstr	"Bya"
+
+#: src/lang.c:724
+msgid	"Threading articles..."
+msgstr	""
+
+#: src/lang.c:725
+#, fuzzy, c-format
+msgid	"Toggled word highlighting %s"
+msgstr	"ijambo Igaragaza cyane"
+
+#: src/lang.c:726
+#, fuzzy
+msgid	"Toggled rot13 encoding"
+msgstr	"ROT13 Imisobekere:"
+
+#: src/lang.c:727
+#, fuzzy, c-format
+msgid	"Toggled german TeX encoding %s"
+msgstr	"Ikidage Imisobekere:"
+
+#: src/lang.c:728
+#, fuzzy, c-format
+msgid	"Toggled tab-width to %d"
+msgstr	"Isunika Ubugari Kuri"
+
+#: src/lang.c:729
+#, fuzzy, c-format
+msgid	"%d Trying to dotlock %s"
+msgstr	"%dKuri"
+
+#: src/lang.c:730
+#, fuzzy, c-format
+msgid	"%d Trying to lock %s"
+msgstr	"%dKuri"
+
+#: src/lang.c:731
+#, fuzzy
+msgid	"           h=help\n"
+msgstr	"h"
+
+#: src/lang.c:733
+msgid	"Unlimited"
+msgstr	""
+
+#: src/lang.c:734
+#, fuzzy
+msgid	"Enter wildcard unsubscribe pattern> "
+msgstr	"Kwivana aho wiyandikishe Ishusho"
+
+#: src/lang.c:735
+#, c-format
+msgid	"Error decoding %s : %s"
+msgstr	""
+
+#: src/lang.c:736
+#, fuzzy
+msgid	"No end."
+msgstr	"Impera"
+
+#: src/lang.c:737
+#, c-format
+msgid	"%s successfully decoded."
+msgstr	""
+
+#: src/lang.c:738
+#, fuzzy, c-format
+msgid	"%*s[-- %s/%s, %suuencoded file, %d lines, name: %s --]\n"
+	"\n"
+msgstr	"%*s[--%s/%s,%suuencodedIDOSIYE Imirongo Izina:"
+
+#: src/lang.c:739
+#, fuzzy
+msgid	"unread "
+msgstr	"Bidasomye"
+
+#: src/lang.c:740
+#, fuzzy, c-format
+msgid	"unsubscribed from %d groups"
+msgstr	"Bivuye Amatsinda"
+
+#: src/lang.c:741
+#, fuzzy, c-format
+msgid	"Unsubscribed from %s"
+msgstr	"Bivuye"
+
+#: src/lang.c:742
+msgid	"Unsubscribing... "
+msgstr	""
+
+#: src/lang.c:743
+msgid	"Unthreading articles..."
+msgstr	""
+
+#: src/lang.c:744
+msgid	"Updated"
+msgstr	""
+
+#: src/lang.c:745
+msgid	"Updating"
+msgstr	"Ivugurura"
+
+#: src/lang.c:746
+#, fuzzy, c-format
+msgid	"Opening %s\n"
+msgstr	"Gufungura %s%S"
+
+#: src/lang.c:747
+#, fuzzy
+msgid	"No more URL's in this article"
+msgstr	"Birenzeho in iyi Ingingo"
+
+#: src/lang.c:748
+#, fuzzy
+msgid	"Use MIME display program for this message?"
+msgstr	"Kugaragaza Porogaramu kugirango iyi Ubutumwa"
+
+#: src/lang.c:749
+#, fuzzy
+msgid	"  -c       mark all news as read in subscribed newsgroups (batch mode)"
+msgstr	"-C Ikimenyetso Byose Amakuru Nka Gusoma in yanditswe/ byemewe Imbuga "
+	"z'amakuru Ubwoko"
+
+#: src/lang.c:750
+#, fuzzy
+msgid	"  -Z       return status indicating if any unread news (batch mode)"
+msgstr	"-Garuka Imimerere NIBA Bidasomye Amakuru Ubwoko"
+
+#: src/lang.c:751
+#, fuzzy
+msgid	"  -q       don't check for new newsgroups"
+msgstr	"-Q Kugenzura... kugirango Gishya Imbuga z'amakuru"
+
+#: src/lang.c:752
+#, fuzzy
+msgid	"  -X       don't save any files on quit"
+msgstr	"-Kubika Idosiye ku Kuvamo"
+
+#: src/lang.c:753
+#, fuzzy
+msgid	"  -d       don't show newsgroup descriptions"
+msgstr	"-D Garagaza Urubuga rw'amakuru"
+
+#: src/lang.c:754
+#, fuzzy
+msgid	"  -G limit get only limit articles/group"
+msgstr	"-Kubona Itsinda"
+
+#: src/lang.c:755
+#, fuzzy, c-format
+msgid	"  -H       help information about %s"
+msgstr	"-H Ifashayobora Ibisobanuro Ibyerekeye"
+
+#: src/lang.c:756
+#, fuzzy
+msgid	"  -h       this help message"
+msgstr	"-h iyi Ifashayobora Ubutumwa"
+
+#: src/lang.c:757
+#, fuzzy, c-format
+msgid	"  -I dir   news index file directory [default=%s]"
+msgstr	"-Amakuru Umubarendanga IDOSIYE bushyinguro Mburabuzi"
+
+#: src/lang.c:758
+#, fuzzy
+msgid	"  -u       update index files (batch mode)"
+msgstr	"-u Kuvugurura Umubarendanga Idosiye Ubwoko"
+
+#: src/lang.c:759
+#, fuzzy, c-format
+msgid	"  -m dir   mailbox directory [default=%s]"
+msgstr	"-M bushyinguro Mburabuzi"
+
+#: src/lang.c:760
+#, fuzzy, c-format
+msgid	"\n"
+	"Mail bug reports/comments to %s"
+msgstr	"Raporo Ibisobanuro Kuri"
+
+#: src/lang.c:761
+#, fuzzy
+msgid	"  -N       mail new news to your posts (batch mode)"
+msgstr	"-Ubutumwa Gishya Amakuru Kuri Ubwoko"
+
+#: src/lang.c:762
+#, fuzzy
+msgid	"  -M user  mail new news to specified user (batch mode)"
+msgstr	"-Ukoresha: Ubutumwa Gishya Amakuru Kuri Ukoresha: Ubwoko"
+
+#: src/lang.c:763
+#, fuzzy, c-format
+msgid	"  -f file  subscribed to newsgroups file [default=%s]"
+msgstr	"-F IDOSIYE yanditswe/ byemewe Kuri Imbuga z'amakuru IDOSIYE Mburabuzi"
+
+#: src/lang.c:764
+#, fuzzy
+msgid	"  -x       no posting mode"
+msgstr	"-X Oya Ubwoko"
+
+#: src/lang.c:765
+#, fuzzy
+msgid	"  -w       post an article and exit"
+msgstr	"-W Iposita Ingingo Na Gusohoka"
+
+#: src/lang.c:766
+#, fuzzy
+msgid	"  -o       post all postponed articles and exit"
+msgstr	"-o Iposita Byose Na Gusohoka"
+
+#: src/lang.c:767
+#, fuzzy
+msgid	"  -r       read news remotely from default NNTP server"
+msgstr	"-R Gusoma Amakuru Bivuye Mburabuzi Seriveri"
+
+#: src/lang.c:768
+#, fuzzy
+msgid	"  -R       read news saved by -S option"
+msgstr	"-Gusoma Amakuru ku Ihitamo"
+
+#: src/lang.c:769
+#, fuzzy, c-format
+msgid	"  -s dir   save news directory [default=%s]"
+msgstr	"-S Kubika Amakuru bushyinguro Mburabuzi"
+
+#: src/lang.c:770
+#, fuzzy
+msgid	"  -S       save new news for later reading (batch mode)"
+msgstr	"-Kubika Gishya Amakuru kugirango Ubwoko"
+
+#: src/lang.c:771
+#, fuzzy
+msgid	"  -z       start if any unread news"
+msgstr	"-Z Gutangira NIBA Bidasomye Amakuru"
+
+#: src/lang.c:772
+#, fuzzy, c-format
+msgid	"A Usenet reader.\n"
+	"\n"
+	"Usage: %s [options] [newsgroup[,...]]"
+msgstr	"A Amahitamo Urubuga rw'amakuru"
+
+#: src/lang.c:773
+#, fuzzy
+msgid	"  -v       verbose output for batch mode options"
+msgstr	"-v Ibisohoka kugirango Ubwoko Amahitamo"
+
+#: src/lang.c:774
+#, fuzzy
+msgid	"  -V       print version & date information"
+msgstr	"-V Gucapa Verisiyo Itariki Ibisobanuro"
+
+#: src/lang.c:775
+#, fuzzy, c-format
+msgid	"%s only useful without batch mode operations\n"
+msgstr	"%sUbwoko"
+
+#: src/lang.c:776
+#, fuzzy, c-format
+msgid	"%s only useful for batch mode operations\n"
+msgstr	"%skugirango Ubwoko"
+
+#: src/lang.c:778
+#, fuzzy, c-format
+msgid	"\n"
+	"%s%d out of range (0 - %d). Reset to 0"
+msgstr	"%s%dInyuma Bya Urutonde 0 Kuri 0"
+
+#: src/lang.c:779
+#, fuzzy, c-format
+msgid	"View '%s' (%s/%s)?"
+msgstr	"Kureba"
+
+#: src/lang.c:781
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: posting exceeds %d columns. Line %d is the first long one:\n"
+	"%-100s\n"
+msgstr	"Inkingi ni i Itangira"
+
+#: src/lang.c:782
+#, fuzzy
+msgid	"\n"
+	"Warning: article unchanged after editing\n"
+msgstr	"Ingingo Nyuma"
+
+#: src/lang.c:783
+#, fuzzy
+msgid	"\n"
+	"Warning: \"Subject:\" contains only whitespaces.\n"
+msgstr	"Kirimo"
+
+#: src/lang.c:784
+#, fuzzy
+msgid	"\n"
+	"Warning: \"Subject:\" begins with \"Re: \" but there are no \"References:\".\n"
+msgstr	"Na: Oya"
+
+#: src/lang.c:786
+#, fuzzy
+msgid	"\n"
+	"Warning: Article has \"References:\" but \"Subject:\" does not begin\n"
+	"         with \"Re: \" and does not contain \"(was:\".\n"
+msgstr	"OYA Na: Na OYA"
+
+#: src/lang.c:789
+#, fuzzy
+msgid	"Read carefully!\n"
+	"\n"
+	"  You are about to cancel an article seemingly written by you. This will "
+	"wipe\n"
+	"  the article from most  news servers  throughout the world,  but there is "
+	"no\n"
+	"  guarantee that it will work.\n"
+	"\n"
+	"This is the article you are about to cancel:\n"
+	"\n"
+msgstr	"Ibyerekeye Kuri Kureka Ingingo ku i Ingingo Bivuye Amakuru i ni Akazi ni i "
+	"Ingingo Ibyerekeye Kuri Kureka"
+
+#: src/lang.c:793
+#, fuzzy
+msgid	"\n"
+	"Warning: You are using a non-plain transfer encoding (such as base64 or\n"
+	"         quoted-printable) and an external inews program to submit your\n"
+	"         article. If a signature is appended by that inews program it will\n"
+	"         not be encoded properly.\n"
+msgstr	"ikoresha a Byuzuye Imisobekere: Nka Gicapika Na external Porogaramu Kuri "
+	"Tanga Ingingo a Isinya ni ku Porogaramu OYA"
+
+#: src/lang.c:798
+#, fuzzy, c-format
+msgid	"\n"
+	"\n"
+	"You are upgrading to tin %s from an earlier version.\n"
+	"Some values in your %s file have changed!\n"
+	"Read WHATSNEW, etc...\n"
+msgstr	"Kuri Bivuye Verisiyo Uduciro in IDOSIYE Byahinduwe"
+
+#: src/lang.c:800
+#, fuzzy, c-format
+msgid	"\n"
+	"\n"
+	"You are downgrading to tin %s from a more recent version!\n"
+	"Some values in your %s file may be ignored, others might have changed!\n"
+msgstr	"Kuri Bivuye a Birenzeho Verisiyo Uduciro in IDOSIYE Gicurasi Ibindi Byahinduwe"
+
+#: src/lang.c:803
+#, fuzzy, c-format
+msgid	"Warning: tin wrote fewer groups to your\n"
+	"\t%s\n"
+	"than it read at startup. If you didn't unsubscribe from %ld %s during\n"
+	"this session this indicates an error and you should backup your %s\n"
+	"before you start tin once again!\n"
+msgstr	"Bike Amatsinda Kuri Gusoma ku Kwivana aho wiyandikishe Bivuye Umukoro iyi "
+	"Ikosa Na Inyibutsa Mbere Gutangira Rimwe"
+
+#: src/lang.c:807
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: Found %d '-- \\n' lines, this may confuse some people.\n"
+msgstr	"Imirongo iyi Gicurasi Abantu"
+
+#: src/lang.c:808
+#, fuzzy, c-format
+msgid	"Warning: Only %d out of %d articles were saved"
+msgstr	"Inyuma Bya"
+
+#: src/lang.c:809
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: Your signature  is longer than %d lines.  Since signatures usually "
+	"do\n"
+	"         not  transport any  useful information,  they should be as  short "
+	"as\n"
+	"         possible.\n"
+msgstr	"Isinya ni Imirongo OYA Ibisobanuro Nka"
+
+#: src/lang.c:813
+#, fuzzy, c-format
+msgid	"Warning: this mail address may contain a spamtrap. %s=continue, %s=abort? "
+msgstr	"iyi Ubutumwa Aderesi Gicurasi a urifuzagukomeza Kureka"
+
+#: src/lang.c:814
+#, fuzzy
+msgid	"\n"
+	"Warning: Signatures should start with '-- \\n' not with '--\\n'.\n"
+msgstr	"Gutangira Na: OYA Na:"
+
+#: src/lang.c:815
+#, fuzzy
+msgid	"Writing attributes file..."
+msgstr	"Ibiranga IDOSIYE"
+
+#: src/lang.c:817
+#, c-format
+msgid	"%d Responses"
+msgstr	""
+
+#: src/lang.c:819
+#, fuzzy, c-format
+msgid	"Added %d %s"
+msgstr	"Kyongewe"
+
+#: src/lang.c:820
+#, fuzzy
+msgid	"No unsubscribed groups to show"
+msgstr	"Amatsinda Kuri Garagaza"
+
+#: src/lang.c:821
+#, fuzzy
+msgid	"Showing subscribed to groups only"
+msgstr	"yanditswe/ byemewe Kuri Amatsinda"
+
+#: src/lang.c:822
+#, fuzzy
+msgid	"Yes "
+msgstr	"Yego"
+
+#: src/lang.c:823
+msgid	"    You have mail\n"
+msgstr	""
+
+#: src/lang.c:828
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: Posting is in %s and contains characters which are not\n"
+	"         in your selected MM_NETWORK_CHARSET: %s.\n"
+	"         These characters will be replaced by '?' if you post this\n"
+	"         article unchanged. To avoid garbling your article please either\n"
+	"         edit it and remove those characters or change the setting of\n"
+	"         MM_NETWORK_CHARSET to a suitable value for your posting via the\n"
+	"         M)enu option.\n"
+msgstr	"ni in Na Kirimo Inyuguti in Byahiswemo Inyuguti ku NIBA Iposita Ingingo "
+	"Ingingo Guhindura Na Gukuraho... Inyuguti Cyangwa Guhindura>> i Igenamiterere "
+	"Kuri a Agaciro kugirango Biturutse Ihitamo"
+
+#: src/lang.c:839
+#, fuzzy
+msgid	"  -D       debug mode 1=NNTP 2=ALL"
+msgstr	"-Kosora amakosa Ubwoko 1. 2."
+
+#: src/lang.c:843
+#, fuzzy
+msgid	"Read carefully!\n"
+	"\n"
+	"  You are about to cancel an article seemingly not written by you.  This "
+	"will\n"
+	"  wipe the article from lots of news servers throughout the world;\n"
+	"  Usenet's majority  considers this  rather inappropriate,  to say the "
+	"least.\n"
+	"  Only press 'd'  if you are  absolutely positive  that you are ready to "
+	"take\n"
+	"  the rap.\n"
+	"\n"
+	"This is the article you are about to cancel:\n"
+	"\n"
+msgstr	"Ibyerekeye Kuri Kureka Ingingo OYA ku Guhanagura i Ingingo Bivuye Bya Amakuru "
+	"i iyi Kuri i Kanda NIBA Cyiteguye Kuri i ni i Ingingo Ibyerekeye Kuri Kureka"
+
+#: src/lang.c:852
+#, fuzzy
+msgid	"toggle color"
+msgstr	"Mukomatanya Ibara"
+
+#: src/lang.c:853
+#, fuzzy
+msgid	"# Changing colors of several screen parts\n"
+	"# Possible values are:\n"
+	"#  -1 = default (white for foreground and black for background)\n"
+	"#   0 = black\n"
+	"#   1 = red\n"
+	"#   2 = green\n"
+	"#   3 = brown\n"
+	"#   4 = blue\n"
+	"#   5 = pink\n"
+	"#   6 = cyan\n"
+	"#   7 = white\n"
+	"# These are *only* for foreground:\n"
+	"#   8 = gray\n"
+	"#   9 = light red\n"
+	"#  10 = light green\n"
+	"#  11 = yellow\n"
+	"#  12 = light blue\n"
+	"#  13 = light pink\n"
+	"#  14 = light cyan\n"
+	"#  15 = light white\n"
+	"\n"
+msgstr	"#Amabara Bya Mugaragaza Uduciro 1. Mburabuzi Umweru kugirango Na umukara "
+	"kugirango Mbuganyuma 0 1. 2. 3. 4. 5 6 7 kugirango 8 9 kimurika 10 kimurika "
+	"12 kimurika kimurika 14 kimurika 15 kimurika"
+
+#: src/lang.c:873
+#, fuzzy
+msgid	"  -a       toggle color flag"
+msgstr	"-a Mukomatanya Ibara Ibendera"
+
+#: src/lang.c:877
+#, fuzzy
+msgid	"\n"
+	"Error: Followup-To set to more than one newsgroup!\n"
+msgstr	"Gushyiraho Kuri Birenzeho Urubuga rw'amakuru"
+
+#: src/lang.c:878
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: cross-posting to %d newsgroups and no Followup-To line!\n"
+msgstr	"Kwambukiranya Kuri Imbuga z'amakuru Na Oya Umurongo"
+
+#: src/lang.c:879
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: \"%s\" is not a valid newsgroup!\n"
+msgstr	"ni OYA a Byemewe Urubuga rw'amakuru"
+
+#: src/lang.c:881
+#, fuzzy
+msgid	"\n"
+	"Warning: Followup-To set to more than one newsgroup!\n"
+msgstr	"Gushyiraho Kuri Birenzeho Urubuga rw'amakuru"
+
+#: src/lang.c:882
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: cross-posting to %d newsgroups and no Followup-To line!\n"
+msgstr	"Kwambukiranya Kuri Imbuga z'amakuru Na Oya Umurongo"
+
+#: src/lang.c:883
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: \"%s\" is not in your newsrc, it may be invalid at this site!\n"
+msgstr	"ni OYA in Gicurasi Sibyo ku iyi Ipaji"
+
+#: src/lang.c:884
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: \"%s\" is not a valid newsgroup at this site!\n"
+msgstr	"ni OYA a Byemewe Urubuga rw'amakuru ku iyi Ipaji"
+
+#: src/lang.c:888
+#, fuzzy, c-format
+msgid	"%d files successfully written from %d articles. %d %s occurred."
+msgstr	"%dIdosiye Bivuye"
+
+#: src/lang.c:889
+msgid	"Missing parts."
+msgstr	""
+
+#: src/lang.c:890
+#, fuzzy
+msgid	"No beginning."
+msgstr	"Itangiriro"
+
+#: src/lang.c:891
+#, fuzzy
+msgid	"No data."
+msgstr	"Ibyatanzwe"
+
+# # @name OTHER
+# # @loc none
+#: src/lang.c:892
+#, fuzzy
+msgid	"Unknown error."
+msgstr	"Ikosa itazwi"
+
+#: src/lang.c:895
+#, fuzzy, c-format
+msgid	"\tChecksum of %s (%ld %s)"
+msgstr	"Bya"
+
+#: src/lang.c:900
+#, fuzzy
+msgid	"Reading mail active file... "
+msgstr	"Ubutumwa Gikora IDOSIYE"
+
+#: src/lang.c:901
+#, fuzzy
+msgid	"Reading mailgroups file... "
+msgstr	"IDOSIYE"
+
+#: src/lang.c:905
+#, fuzzy
+msgid	"perform PGP operations on article"
+msgstr	"Ibikorwa: ku Ingingo"
+
+#: src/lang.c:906
+#, fuzzy
+msgid	"Add key(s) to public keyring?"
+msgstr	"Urufunguzo S Kuri Rusange"
+
+#: src/lang.c:907
+#, fuzzy, c-format
+msgid	"%s=encrypt, %s=sign, %s=both, %s=quit: "
+msgstr	"%s=Shyiraho Umutekano IKIMENYETSO Byombi Kuvamo"
+
+#: src/lang.c:908
+#, fuzzy, c-format
+msgid	"%s=sign, %s=sign & include public key, %s=quit: "
+msgstr	"%s=IKIMENYETSO IKIMENYETSO Gushyiramo Rusange Urufunguzo Kuvamo"
+
+#: src/lang.c:909
+#, fuzzy, c-format
+msgid	"PGP has not been set up (can't open %s)"
+msgstr	"OYA Gushyiraho Hejuru Gufungura"
+
+#: src/lang.c:910
+#, fuzzy
+msgid	"Article not signed and no public keys found"
+msgstr	"OYA Na Oya Rusange Utubuto Byabonetse"
+
+#: src/lang.c:912
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=Kuvamo Guhindura Ibikubiyemo Iposita"
+
+#: src/lang.c:913
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%s]: "
+msgstr	"%s=Kuvamo Guhindura Kohereza"
+
+#: src/lang.c:914
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=Kuvamo Guhindura Ibikubiyemo Iposita"
+
+#: src/lang.c:916
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=Kuvamo Guhindura Ibikubiyemo Iposita"
+
+#: src/lang.c:917
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=send [%%s]: "
+msgstr	"%s=Kuvamo Guhindura Kohereza"
+
+#: src/lang.c:918
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=Kuvamo Guhindura Ibikubiyemo Iposita"
+
+#: src/lang.c:922
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=Kuvamo Guhindura Ibikubiyemo Iposita"
+
+#: src/lang.c:923
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=send [%%s]: "
+msgstr	"%s=Kuvamo Guhindura Kohereza"
+
+#: src/lang.c:924
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=Kuvamo Guhindura Ibikubiyemo Iposita"
+
+#: src/lang.c:926
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=Kuvamo Guhindura Ibikubiyemo Iposita"
+
+#: src/lang.c:927
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=send [%%s]: "
+msgstr	"%s=Kuvamo Guhindura Kohereza"
+
+#: src/lang.c:928
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=Kuvamo Guhindura Ibikubiyemo Iposita"
+
+#: src/lang.c:937
+#, fuzzy
+msgid	"Try cache_overview_files to speed up things.\n"
+msgstr	"Kuri Umuvuduko Hejuru"
+
+#: src/lang.c:938
+#, fuzzy
+msgid	"Tin will use local index files instead.\n"
+msgstr	"Gukoresha Umubarendanga Idosiye"
+
+#: src/lang.c:939
+#, fuzzy
+msgid	"Cannot find NNTP server name"
+msgstr	"Gushaka Seriveri Izina:"
+
+#: src/lang.c:940
+#, fuzzy, c-format
+msgid	"Connecting to %s:%d..."
+msgstr	"Kwihuza na\"\"..."
+
+#: src/lang.c:941
+#, fuzzy
+msgid	"Disconnecting from server...\n"
+msgstr	"Bivuye Seriveri"
+
+#: src/lang.c:942
+#, fuzzy, c-format
+msgid	"Wrong newsgroup name in response of GROUP command, %s for %s"
+msgstr	"Urubuga rw'amakuru Izina: in Bya Komandi: kugirango"
+
+#: src/lang.c:943
+#, fuzzy, c-format
+msgid	"Failed to connect to NNTP server %s. Exiting..."
+msgstr	"Kuri Kwihuza Kuri Seriveri"
+
+#: src/lang.c:944
+#, fuzzy
+msgid	"205  Closing connection"
+msgstr	"Ukwihuza"
+
+#: src/lang.c:945
+#, fuzzy
+msgid	"Your server does not support the NNTP XOVER or OVER command.\n"
+msgstr	"Seriveri OYA Gushigikira i Cyangwa Komandi:"
+
+#: src/lang.c:946
+#, fuzzy
+msgid	"Connection to news server has timed out. Reconnect?"
+msgstr	"Kongerakwihuza."
+
+#: src/lang.c:947
+#, fuzzy, c-format
+msgid	"Put the server name in the file %s,\n"
+	"or set the environment variable NNTPSERVER"
+msgstr	"i Seriveri Izina: in i IDOSIYE Cyangwa Gushyiraho i IMPINDURAGACIRO"
+
+#: src/lang.c:948
+#, fuzzy
+msgid	"  -A       force authentication on connect"
+msgstr	"-A ku Kwihuza"
+
+#: src/lang.c:949
+#, fuzzy, c-format
+msgid	"  -g serv  read news from NNTP server serv [default=%s]"
+msgstr	"-g Gusoma Amakuru Bivuye Seriveri Mburabuzi"
+
+#: src/lang.c:950
+#, fuzzy, c-format
+msgid	"  -p port  use port as NNTP port [default=%d]"
+msgstr	"-P Umuyoboro Gukoresha Umuyoboro Nka Umuyoboro Mburabuzi"
+
+#: src/lang.c:951
+#, fuzzy
+msgid	"  -Q       quick start. Same as -nqd"
+msgstr	"-Gutangira Nka"
+
+#: src/lang.c:952
+#, fuzzy
+msgid	"  -l       use only LIST instead of GROUP (-n) command"
+msgstr	"-L Gukoresha Bya N Komandi:"
+
+#: src/lang.c:953
+#, fuzzy
+msgid	"  -n       only read subscribed .newsrc groups from NNTP server"
+msgstr	"-N Gusoma yanditswe/ byemewe Amatsinda Bivuye Seriveri"
+
+#: src/lang.c:955
+#, fuzzy, c-format
+msgid	"%s/tcp: Unknown service.\n"
+msgstr	"%s/Serivisi"
+
+#: src/lang.c:958
+#, fuzzy
+msgid	"\n"
+	"socket or connect problem\n"
+msgstr	"Cyangwa Kwihuza"
+
+#: src/lang.c:960
+#, fuzzy, c-format
+msgid	"\n"
+	"Connection to %s: "
+msgstr	"Kuri"
+
+#: src/lang.c:961
+#, fuzzy
+msgid	"Giving up...\n"
+msgstr	"Hejuru"
+
+#: src/lang.c:964
+#, fuzzy
+msgid	"Your server does not have Xref: in its XOVER information.\n"
+	"Tin will try to use XHDR XREF instead (slows down things a bit).\n"
+msgstr	"Seriveri OYA in Ibisobanuro Kuri Gukoresha Hasi a"
+
+#: src/lang.c:967
+#, fuzzy
+msgid	"Your server does not have Xref: in its XOVER information.\n"
+msgstr	"Seriveri OYA in Ibisobanuro"
+
+#: src/lang.c:970
+#, fuzzy, c-format
+msgid	"Can't open %s. Try %s -r to read news via NNTP.\n"
+msgstr	"Gufungura R Kuri Gusoma Amakuru Biturutse"
+
+#: src/lang.c:973
+#, fuzzy
+msgid	"  -Q       quick start. Same as -qd"
+msgstr	"-Gutangira Nka"
+
+#: src/lang.c:974
+#, fuzzy
+msgid	"  -l       read only active file instead of scanning spool (-n) command"
+msgstr	"-L Gusoma Gikora IDOSIYE Bya N Komandi:"
+
+#: src/lang.c:975
+#, fuzzy
+msgid	"  -n       only read subscribed .newsrc groups from spool"
+msgstr	"-N Gusoma yanditswe/ byemewe Amatsinda Bivuye"
+
+#: src/lang.c:976
+#, fuzzy
+msgid	"Your server does not have Xref: in its NOV-files.\n"
+msgstr	"Seriveri OYA in Idosiye"
+
+#: src/lang.c:980
+#, fuzzy
+msgid	"Posting using external inews failed. Use built in inews instead?"
+msgstr	"ikoresha external Byanze in"
+
+#: src/lang.c:981
+#, fuzzy
+msgid	"It worked! Should I always use my built in inews from now on?"
+msgstr	"Buri gihe Gukoresha in Bivuye NONEAHA ku"
+
+#: src/lang.c:989
+#, fuzzy, c-format
+msgid	"%d %s printed"
+msgstr	"%d%sByacapwe"
+
+#: src/lang.c:990
+#, fuzzy
+msgid	"output article/thread/hot/pattern/tagged articles to printer"
+msgstr	"Ibisohoka Ingingo Urudodo Ishusho Kuri Mucapyi"
+
+#: src/lang.c:991
+msgid	"Print"
+msgstr	"Gucapa"
+
+#: src/lang.c:992
+msgid	"Printing..."
+msgstr	"Icapa..."
+
+#: src/lang.c:996
+#, fuzzy
+msgid	"pipe article/thread/hot/pattern/tagged articles into command"
+msgstr	"Ingingo Urudodo Ishusho Komandi:"
+
+#: src/lang.c:997
+#, fuzzy
+msgid	"No command"
+msgstr	"Komandi:"
+
+#: src/lang.c:998
+msgid	"Pipe"
+msgstr	""
+
+#: src/lang.c:999
+#, fuzzy, c-format
+msgid	"Pipe to command [%.*s]> "
+msgstr	"Kuri Komandi: S"
+
+#: src/lang.c:1000
+msgid	"Piping..."
+msgstr	""
+
+#: src/lang.c:1002
+#, fuzzy
+msgid	"Piping not enabled."
+msgstr	"OYA Bikora"
+
+#: src/lang.c:1006
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: The \"%s:\" line has spaces  in it that MUST be removed.\n"
+	"       The only allowable  space is the one  separating the colon (:)\n"
+	"       from  the  contents.  Use a  comma  (,)  to separate  multiple\n"
+	"       newsgroup names.\n"
+msgstr	"Umurongo Imyanya in Cyavanyweho Umwanya ni i i Bivuye i Ibigize a Akitso Kuri "
+	"Urubuga rw'amakuru Amazina"
+
+#: src/lang.c:1011
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: The \"%s:\" line is  continued in  the next line.  Since\n"
+	"       the line  may not  contain  whitespace,  this is  not allowed.\n"
+	"       Please write all newsgroups into a single line.\n"
+msgstr	"Umurongo ni in i Komeza>> Umurongo i Umurongo Gicurasi OYA iyi ni OYA "
+	"Kwandika Byose Imbuga z'amakuru a UMWE Umurongo"
+
+#: src/lang.c:1016
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: The \"%s:\" line is continued in the next line.\n"
+	"         This is a very new feature and may not be accepted by all servers.\n"
+	"         To avoid trouble please write all newsgroups into a single line.\n"
+msgstr	"Umurongo ni in i Komeza>> Umurongo ni a Gishya Na Gicurasi OYA Byemewe ku "
+	"Byose Kwandika Byose Imbuga z'amakuru a UMWE Umurongo"
+
+#: src/lang.c:1020
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: The \"%s:\" line has spaces in it that SHOULD be removed.\n"
+msgstr	"Umurongo Imyanya in Cyavanyweho"
+
+#: src/lang.c:1025
+#, fuzzy
+msgid	"\n"
+	"  If your article contains quoted text  please take some time to pare it "
+	"down\n"
+	"  to just the  key points to which you are  responding,  or people will "
+	"think\n"
+	"  you are a dweeb!  Many people have the habit of skipping any article  "
+	"whose\n"
+	"  first page is largely  quoted material.  Format your article to fit in "
+	"less\n"
+	"  then 80 chars,  since that's the conventional size  (72 is a good choice "
+	"as\n"
+	"  it allows quoting without exceeding the limit).  If your lines are too "
+	"long\n"
+	"  they'll wrap  around  ugly and  people won't  read what you  write.  If "
+	"you\n"
+	"  aren't  careful  and considerate  in  formatting  your posting, people  "
+	"are\n"
+	"  likely to ignore it completely.  It's a crowded net out there.\n"
+msgstr	"Ingingo Kirimo Umwandiko Igihe Kuri Kuri i Urufunguzo Utudomo Kuri Cyangwa "
+	"Abantu a Abantu i Bya Gusimbuka:%s Ingingo Itangira Ipaji ni Ibikoresho "
+	"Ingingo Kuri in Hanyuma guhera i Ingano ni a i Imirongo Gufunika Na Abantu "
+	"Gusoma Kwandika Na in Ihinduramiterere Abantu Kuri Kwirengagiza a Cyuzuye "
+	"Inyuma"
+
+#: src/lang.c:1038
+#, fuzzy
+msgid	"shell escape"
+msgstr	"Igikonoshwa"
+
+#: src/lang.c:1039
+#, c-format
+msgid	"Shell Command (%s)"
+msgstr	""
+
+#: src/lang.c:1040
+#, fuzzy, c-format
+msgid	"Enter shell command [%s]> "
+msgstr	"Igikonoshwa Komandi:"
+
+#: src/lang.c:1044
+#, fuzzy, c-format
+msgid	"%s: Can't get entry for TERM\n"
+msgstr	"%s:Kubona Icyinjijwe kugirango"
+
+#: src/lang.c:1048
+#, fuzzy, c-format
+msgid	"Group %.*s ('q' to quit)..."
+msgstr	"S Kuri Kuvamo"
+
+#: src/lang.c:1050
+#, fuzzy, c-format
+msgid	"Group %.*s..."
+msgstr	"S"
+
+#: src/lang.c:1054
+msgid	"Server unavailable\n"
+msgstr	""
+
+#: src/lang.c:1060
+#, fuzzy, c-format
+msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %"
+	"s=post"
+msgstr	"%s=Ubutumwa Gucapa Kuvamo Mukomatanya Byose Bidasomye Kubika Itagi: Iposita"
+
+#: src/lang.c:1061
+#, fuzzy, c-format
+msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
+msgstr	"%s=Ubutumwa Gucapa Kuvamo Subiza Ubutumwa Kubika Itagi: Iposita"
+
+#: src/lang.c:1063
+#, fuzzy, c-format
+msgid	"%s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
+msgstr	"%s=Ubutumwa Gucapa Kuvamo Mukomatanya Byose Bidasomye Kubika Itagi: Iposita"
+
+#: src/lang.c:1064
+#, fuzzy, c-format
+msgid	"%s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
+msgstr	"%s=Ubutumwa Gucapa Kuvamo Subiza Ubutumwa Kubika Itagi: Iposita"
+
+#: src/lang.c:1068
+#, fuzzy, c-format
+msgid	"%s=pipe; %s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
+msgstr	"%s=Ubutumwa Kuvamo Mukomatanya Byose Bidasomye Kubika Itagi: Iposita"
+
+#: src/lang.c:1069
+#, fuzzy, c-format
+msgid	"%s=pipe; %s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
+msgstr	"%s=Ubutumwa Kuvamo Subiza Ubutumwa Kubika Itagi: Iposita"
+
+#: src/lang.c:1071
+#, fuzzy, c-format
+msgid	"%s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
+msgstr	"%s=Ubutumwa Kuvamo Mukomatanya Byose Bidasomye Kubika Itagi: Iposita"
+
+#: src/lang.c:1072
+#, fuzzy, c-format
+msgid	"%s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
+msgstr	"%s=Ubutumwa Kuvamo Subiza Ubutumwa Kubika Itagi: Iposita"
+
+#: src/lang.c:1078
+#, fuzzy
+msgid	"Terminal does not support color"
+msgstr	"OYA Gushigikira Ibara"
+
+#: src/lang.c:1083
+#, c-format
+msgid	"Trying %s"
+msgstr	""
+
+# goodies/source\filter.vcl\eps\dlgeps.src:DLG_EXPORT_EPS.RB_COMPRESSION_NONE.text
+#: src/lang.c:1097 src/lang.c:1123 src/lang.c:1139 src/lang.c:1318 src/refs.c:296
+msgid	"None"
+msgstr	"Nta na kimwe"
+
+#: src/lang.c:1098
+msgid	"Subject"
+msgstr	"Ikivugwaho"
+
+#: src/lang.c:1099
+msgid	"References"
+msgstr	"Indango"
+
+#: src/lang.c:1100
+#, fuzzy
+msgid	"Both Subject and References"
+msgstr	"Na"
+
+#: src/lang.c:1101
+msgid	"Multipart Subject"
+msgstr	""
+
+#: src/lang.c:1102
+msgid	"Percentage Match"
+msgstr	""
+
+#: src/lang.c:1114 src/lang.c:1225
+msgid	"No"
+msgstr	"Oya"
+
+#: src/lang.c:1115 src/lang.c:1227
+msgid	"Yes"
+msgstr	"Yego"
+
+#: src/lang.c:1116
+#, fuzzy
+msgid	"Hide All"
+msgstr	"Guhisha byose"
+
+#: src/lang.c:1124
+msgid	"Address"
+msgstr	"Aderesi"
+
+#: src/lang.c:1125
+msgid	"Full Name"
+msgstr	""
+
+#: src/lang.c:1126
+#, fuzzy
+msgid	"Address and Name"
+msgstr	"Na"
+
+#: src/lang.c:1133
+msgid	"Max"
+msgstr	"Kinini"
+
+#: src/lang.c:1134
+msgid	"Sum"
+msgstr	"Igiteranyo"
+
+#: src/lang.c:1135
+msgid	"Average"
+msgstr	"Impuzandengo"
+
+#: src/lang.c:1140
+msgid	"Lines"
+msgstr	"Imirongo"
+
+#: src/lang.c:1141
+msgid	"Score"
+msgstr	""
+
+#: src/lang.c:1142
+msgid	"Lines & Score"
+msgstr	""
+
+#: src/lang.c:1151
+msgid	"Black"
+msgstr	"Umukara"
+
+#: src/lang.c:1152
+msgid	"Red"
+msgstr	"Umutuku"
+
+#: src/lang.c:1153
+msgid	"Green"
+msgstr	"Icyatsi"
+
+#: src/lang.c:1154
+msgid	"Brown"
+msgstr	"Igihogo"
+
+#: src/lang.c:1155
+msgid	"Blue"
+msgstr	"Ubururu"
+
+#: src/lang.c:1156
+msgid	"Pink"
+msgstr	""
+
+#: src/lang.c:1157
+msgid	"Cyan"
+msgstr	"Ubururu bukeye"
+
+#: src/lang.c:1158
+msgid	"White"
+msgstr	"Umweru"
+
+#: src/lang.c:1159
+msgid	"Gray"
+msgstr	"Ikigina"
+
+#: src/lang.c:1160
+msgid	"Light Red"
+msgstr	"Umutuku Werurutse"
+
+#: src/lang.c:1161
+msgid	"Light Green"
+msgstr	"Icyatsi Cyerurutse"
+
+#: src/lang.c:1162
+msgid	"Yellow"
+msgstr	"Umuhondo"
+
+#: src/lang.c:1163
+msgid	"Light Blue"
+msgstr	"Ubururu Bwerurutse"
+
+#: src/lang.c:1164
+msgid	"Light Pink"
+msgstr	""
+
+#: src/lang.c:1165
+msgid	"Light Cyan"
+msgstr	"Ubururu Bwerurutse"
+
+#: src/lang.c:1166
+msgid	"Light White"
+msgstr	""
+
+#: src/lang.c:1174 src/lang.c:1231 src/lang.c:1245
+msgid	"Nothing"
+msgstr	""
+
+# 3737
+#: src/lang.c:1175
+msgid	"Mark"
+msgstr	"garagaza"
+
+#: src/lang.c:1176
+msgid	"Space"
+msgstr	"Umwanya"
+
+#: src/lang.c:1183
+msgid	"Normal"
+msgstr	"Bisanzwe"
+
+#: src/lang.c:1184
+#, fuzzy
+msgid	"Best highlighting"
+msgstr	"Igaragaza cyane"
+
+#: src/lang.c:1185
+msgid	"Underline"
+msgstr	"Gucaho umurongo"
+
+#: src/lang.c:1186
+#, fuzzy
+msgid	"Reverse video"
+msgstr	"Videwo..."
+
+#: src/lang.c:1187
+msgid	"Blinking"
+msgstr	"Kinyoteera"
+
+#: src/lang.c:1188
+#, fuzzy
+msgid	"Half bright"
+msgstr	"Bibonerana"
+
+#: src/lang.c:1189
+msgid	"Bold"
+msgstr	"Bitsindagiye"
+
+#: src/lang.c:1194
+msgid	"none"
+msgstr	"ntacyo"
+
+# sfx2/source\doc\docvor.src:DLG_ORGANIZE.BTN_EDIT.text
+#: src/lang.c:1195
+#, fuzzy
+msgid	"commands"
+msgstr	"Amabwiriza"
+
+#: src/lang.c:1196
+msgid	"select"
+msgstr	"guhitamo"
+
+#: src/lang.c:1198
+#, fuzzy
+msgid	"commands & quit"
+msgstr	"Amabwiriza Kuvamo"
+
+#: src/lang.c:1199
+#, fuzzy
+msgid	"commands & select"
+msgstr	"Amabwiriza Guhitamo"
+
+#: src/lang.c:1200
+#, fuzzy
+msgid	"quit & select"
+msgstr	"Kuvamo Guhitamo"
+
+#: src/lang.c:1201
+#, fuzzy
+msgid	"commands & quit & select"
+msgstr	"Amabwiriza Kuvamo Guhitamo"
+
+#: src/lang.c:1226
+msgid	"Shell archive"
+msgstr	""
+
+#: src/lang.c:1232
+#, fuzzy
+msgid	"Subject: (descending)"
+msgstr	"Ubujyesi"
+
+#: src/lang.c:1233
+#, fuzzy
+msgid	"Subject: (ascending)"
+msgstr	"Ubujyejuru"
+
+#: src/lang.c:1234
+#, fuzzy
+msgid	"From: (descending)"
+msgstr	"Ubujyesi"
+
+#: src/lang.c:1235
+#, fuzzy
+msgid	"From: (ascending)"
+msgstr	"Ubujyejuru"
+
+#: src/lang.c:1236
+#, fuzzy
+msgid	"Date: (descending)"
+msgstr	"Ubujyesi"
+
+#: src/lang.c:1237
+#, fuzzy
+msgid	"Date: (ascending)"
+msgstr	"Ubujyejuru"
+
+#: src/lang.c:1238 src/lang.c:1246
+#, fuzzy
+msgid	"Score (descending)"
+msgstr	"Ubujyesi"
+
+#: src/lang.c:1239 src/lang.c:1247
+#, fuzzy
+msgid	"Score (ascending)"
+msgstr	"Ubujyejuru"
+
+#: src/lang.c:1240
+#, fuzzy
+msgid	"Lines: (descending)"
+msgstr	"Ubujyesi"
+
+#: src/lang.c:1241
+#, fuzzy
+msgid	"Lines: (ascending)"
+msgstr	"Ubujyejuru"
+
+#: src/lang.c:1252
+msgid	"Always Keep"
+msgstr	""
+
+#: src/lang.c:1253
+msgid	"Always Remove"
+msgstr	""
+
+#: src/lang.c:1254
+#, fuzzy
+msgid	"Mark with D on selection screen"
+msgstr	"Na: ku Ihitamo Mugaragaza"
+
+#: src/lang.c:1259
+#, fuzzy
+msgid	"Kill only unread arts"
+msgstr	"Bidasomye"
+
+#: src/lang.c:1260
+#, fuzzy
+msgid	"Kill all arts & show with K"
+msgstr	"Byose Garagaza Na:"
+
+#. TODO: s/K/art_marked_killed/
+#: src/lang.c:1261
+#, fuzzy
+msgid	"Kill all arts and never show"
+msgstr	"Byose Na Nta narimwe Garagaza"
+
+#: src/lang.c:1266
+#, fuzzy
+msgid	"Nothing special"
+msgstr	"Bidasanzwe"
+
+#: src/lang.c:1267
+msgid	"Compress quotes"
+msgstr	""
+
+#: src/lang.c:1268
+msgid	"Quote signatures"
+msgstr	""
+
+#: src/lang.c:1269
+#, fuzzy
+msgid	"Compress quotes, quote sigs"
+msgstr	"Gushyiraho akugarizo"
+
+#: src/lang.c:1270
+#, fuzzy
+msgid	"Quote empty lines"
+msgstr	"ubusa Imirongo"
+
+#: src/lang.c:1271
+#, fuzzy
+msgid	"Compress quotes, quote empty lines"
+msgstr	"Gushyiraho akugarizo ubusa Imirongo"
+
+#: src/lang.c:1272
+#, fuzzy
+msgid	"Quote sigs & empty lines"
+msgstr	"ubusa Imirongo"
+
+#: src/lang.c:1273
+#, fuzzy
+msgid	"Comp. q., quote sigs & empty lines"
+msgstr	"Q."
+
+#: src/lang.c:1311
+#, fuzzy
+msgid	"no"
+msgstr	"Oya"
+
+#: src/lang.c:1312
+#, fuzzy
+msgid	"with headers"
+msgstr	"Na: Imitwe"
+
+#: src/lang.c:1313
+#, fuzzy
+msgid	"without headers"
+msgstr	"Imitwe"
+
+#: src/lang.c:1320 src/lang.c:1326
+msgid	"NFKC"
+msgstr	""
+
+#: src/lang.c:1321
+msgid	"NFKD"
+msgstr	""
+
+#: src/lang.c:1322
+msgid	"NFC"
+msgstr	""
+
+#: src/lang.c:1323
+msgid	"NFD"
+msgstr	""
+
+#: src/lang.c:1334
+msgid	"Display Options"
+msgstr	""
+
+#: src/lang.c:1341
+msgid	"Color Options"
+msgstr	""
+
+#: src/lang.c:1348
+msgid	"Article-Limiting Options"
+msgstr	""
+
+#: src/lang.c:1354
+msgid	"Posting/Mailing Options"
+msgstr	""
+
+#: src/lang.c:1360
+msgid	"Saving/Printing Options"
+msgstr	""
+
+#: src/lang.c:1366
+msgid	"Expert Options"
+msgstr	""
+
+#: src/lang.c:1372
+msgid	"Filtering Options"
+msgstr	""
+
+#: src/lang.c:1377 src/lang.c:1408 src/lang.c:1414 src/lang.c:1440 src/lang.c:1490
+#: src/lang.c:1496 src/lang.c:1506 src/lang.c:1526 src/lang.c:1601 src/lang.c:1771
+#: src/lang.c:1777 src/lang.c:1783 src/lang.c:1789 src/lang.c:1801 src/lang.c:1808
+#: src/lang.c:1862 src/lang.c:1871 src/lang.c:1877 src/lang.c:1884 src/lang.c:1891
+#: src/lang.c:1898 src/lang.c:1905 src/lang.c:1912 src/lang.c:1919 src/lang.c:1926
+#: src/lang.c:1933 src/lang.c:1940 src/lang.c:1947 src/lang.c:1954 src/lang.c:1961
+#: src/lang.c:1968 src/lang.c:1975 src/lang.c:1982 src/lang.c:1989 src/lang.c:1996
+#: src/lang.c:2003 src/lang.c:2010 src/lang.c:2017 src/lang.c:2024 src/lang.c:2031
+#: src/lang.c:2039 src/lang.c:2055 src/lang.c:2062 src/lang.c:2069 src/lang.c:2076
+#: src/lang.c:2082 src/lang.c:2088 src/lang.c:2105 src/lang.c:2117 src/lang.c:2151
+#: src/lang.c:2204 src/lang.c:2211 src/lang.c:2217 src/lang.c:2242 src/lang.c:2259
+#: src/lang.c:2312 src/lang.c:2348 src/lang.c:2368 src/lang.c:2403 src/lang.c:2413
+#: src/lang.c:2438 src/lang.c:2454 src/lang.c:2473 src/lang.c:2486
+msgid	"<SPACE> toggles, <CR> sets, <ESC> cancels."
+msgstr	""
+
+#: src/lang.c:1378
+#, fuzzy
+msgid	"Show mini menu & posting etiquette"
+msgstr	"Ibikubiyemo"
+
+#: src/lang.c:1379
+#, fuzzy
+msgid	"# If ON show a mini menu of useful commands at each level\n"
+	"# and posting etiquette after composing an article\n"
+msgstr	"#Garagaza a Ibikubiyemo Bya Amabwiriza ku Na Nyuma"
+
+#: src/lang.c:1384
+#, fuzzy
+msgid	"Show short description for each newsgroup. <SPACE> toggles & <CR> sets."
+msgstr	"Isobanuramiterere kugirango Urubuga rw'amakuru"
+
+#: src/lang.c:1385
+#, fuzzy
+msgid	"Show description of each newsgroup"
+msgstr	"Isobanuramiterere Bya Urubuga rw'amakuru"
+
+#: src/lang.c:1386
+#, fuzzy
+msgid	"# If ON show group description text after newsgroup name at\n"
+	"# group selection level\n"
+msgstr	"#Garagaza Itsinda Isobanuramiterere Umwandiko Nyuma Urubuga rw'amakuru Izina: "
+	"Itsinda Ihitamo"
+
+#: src/lang.c:1391
+#, fuzzy
+msgid	"Show Subject & From (author) fields in group menu. <SPACE> toggles & <CR> "
+	"sets."
+msgstr	"Umwanditsi Imyanya in Itsinda Ibikubiyemo"
+
+#: src/lang.c:1392
+#, fuzzy
+msgid	"In group menu, show author by"
+msgstr	"Itsinda Ibikubiyemo Garagaza Umwanditsi ku"
+
+#: src/lang.c:1393
+#, fuzzy
+msgid	"# Part of from field to display\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = none\n"
+	"#   1 = address\n"
+	"# * 2 = full name\n"
+	"#   3 = both\n"
+msgstr	"#Bya Bivuye Umwanya Kuri Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 1. 2. 3."
+
+#: src/lang.c:1402
+#, fuzzy
+msgid	"Draw -> or highlighted bar for selection. <SPACE> toggles & <CR> sets."
+msgstr	"Cyangwa kugirango Ihitamo"
+
+#: src/lang.c:1403
+#, fuzzy
+msgid	"Draw -> instead of highlighted bar"
+msgstr	"Bya"
+
+#: src/lang.c:1404
+#, fuzzy
+msgid	"# If ON use -> otherwise highlighted bar for selection\n"
+msgstr	"#Gukoresha kugirango"
+
+#: src/lang.c:1409
+#, fuzzy
+msgid	"Use inverse video for page headers"
+msgstr	"Videwo... kugirango Ipaji Imitwe"
+
+#: src/lang.c:1410
+#, fuzzy
+msgid	"# If ON use inverse video for page headers at different levels\n"
+msgstr	"#Gukoresha Videwo... kugirango Ipaji Imitwe ku"
+
+#: src/lang.c:1415
+#, fuzzy
+msgid	"Thread articles by"
+msgstr	"ku"
+
+#: src/lang.c:1416
+#, fuzzy
+msgid	"# Thread articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject\n"
+	"#   2 = References\n"
+	"# * 3 = Both (Subject and References)\n"
+	"#   4 = Multipart Subject\n"
+	"#   5 = Percentage Match\n"
+msgstr	"# ku Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 1. 2. 3. Na 4."
+
+#: src/lang.c:1427
+msgid	"Enter percentage match required to thread together. <CR> sets."
+msgstr	""
+
+#: src/lang.c:1428
+msgid	"Thread percentage match"
+msgstr	""
+
+#: src/lang.c:1429
+#, c-format
+msgid	"# Thread percentage match...\n"
+	"# the percentage of characters in the subject of an article that must match\n"
+	"# a base article for both those articles to be considered to belong to the\n"
+	"# same thread. This option is an integer percentage, eg. 80, no decimals may\n"
+	"# follow. If 80 is used here, then 80%% of the characters must match "
+	"exactly,\n"
+	"# no insertion of a character, for the two articles to be put in the same\n"
+	"# thread. eg. 'happy' and 'harpy' would match, but 'harpie', 'happie' and\n"
+	"# 'harppy' would be threaded separately from 'happy'\n"
+msgstr	""
+
+#: src/lang.c:1441
+#, fuzzy
+msgid	"Score of a thread"
+msgstr	"Bya a Urudodo"
+
+#: src/lang.c:1442
+#, fuzzy
+msgid	"# Thread score\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = max\n"
+	"#   1 = sum\n"
+	"#   2 = average\n"
+msgstr	"#Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 1. 2."
+
+#: src/lang.c:1450
+#, fuzzy
+msgid	"Sort articles by Subject, From, Date or Score. <SPACE> toggles & <CR> sets."
+msgstr	"ku Cyangwa"
+
+#: src/lang.c:1451
+#, fuzzy
+msgid	"Sort articles by"
+msgstr	"ku"
+
+#: src/lang.c:1452
+#, fuzzy
+msgid	"# Sort articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject descending\n"
+	"#   2 = Subject ascending\n"
+	"#   3 = From descending\n"
+	"#   4 = From ascending\n"
+	"#   5 = Date descending\n"
+	"# * 6 = Date ascending\n"
+	"#   7 = Score descending\n"
+	"#   8 = Score ascending\n"
+	"#   9 = Lines descending\n"
+	"#  10 = Lines ascending\n"
+msgstr	"#ku Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 1. 2. 3. 4. 5 6 7 8 9 10"
+
+#: src/lang.c:1468
+#, fuzzy
+msgid	"Sort threads by Nothing or Score. <SPACE> toggles & <CR> sets."
+msgstr	"ku Cyangwa"
+
+#: src/lang.c:1469
+#, fuzzy
+msgid	"Sort threads by"
+msgstr	"ku"
+
+#: src/lang.c:1470
+#, fuzzy
+msgid	"# Sort thread by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = Score descending\n"
+	"#   2 = Score ascending\n"
+msgstr	"#Urudodo ku Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 1. 2."
+
+#: src/lang.c:1478
+#, fuzzy
+msgid	"Put cursor at first/last unread art in groups. <SPACE> toggles & <CR> sets."
+msgstr	"indanga ku Itangira Iheruka Bidasomye in Amatsinda"
+
+#: src/lang.c:1479
+#, fuzzy
+msgid	"Goto first unread article in group"
+msgstr	"Itangira Bidasomye Ingingo in Itsinda"
+
+#: src/lang.c:1480
+#, fuzzy
+msgid	"# If ON put cursor at first unread art in group otherwise last art\n"
+msgstr	"#Gushyira indanga ku Itangira Bidasomye in Itsinda Iheruka"
+
+#: src/lang.c:1484
+#, fuzzy
+msgid	"Show all articles or only unread articles. <SPACE> toggles & <CR> sets."
+msgstr	"Byose Cyangwa Bidasomye"
+
+#: src/lang.c:1485
+#, fuzzy
+msgid	"Show only unread articles"
+msgstr	"Bidasomye"
+
+#: src/lang.c:1486
+#, fuzzy
+msgid	"# If ON show only new/unread articles otherwise show all.\n"
+msgstr	"#Garagaza Gishya Bidasomye Garagaza Byose"
+
+#: src/lang.c:1491
+#, fuzzy
+msgid	"Show only groups with unread arts"
+msgstr	"Amatsinda Na: Bidasomye"
+
+#: src/lang.c:1492
+#, fuzzy
+msgid	"# If ON show only subscribed to groups that contain unread articles.\n"
+msgstr	"#Garagaza yanditswe/ byemewe Kuri Amatsinda Bidasomye"
+
+#: src/lang.c:1497
+msgid	"Filter which articles"
+msgstr	""
+
+#: src/lang.c:1498
+#, fuzzy
+msgid	"# Filter which articles\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = only kill unread articles\n"
+	"#   1 = kill all articles and show in threads marked with K\n"
+	"#   2 = kill all articles and never show them\n"
+msgstr	"#Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 Bidasomye 1. Byose Na Garagaza "
+	"in cy/ byagarajwe Na: 2. Byose Na Nta narimwe Garagaza"
+
+#: src/lang.c:1507
+#, fuzzy
+msgid	"Tab goes to next unread article"
+msgstr	"Kuri Komeza>> Bidasomye Ingingo"
+
+#: src/lang.c:1508
+#, fuzzy
+msgid	"# If ON the TAB command will go to next unread article at article viewer "
+	"level\n"
+msgstr	"#i Komandi: Gyayo Kuri Komeza>> Bidasomye Ingingo ku Ingingo"
+
+#: src/lang.c:1512
+#, fuzzy
+msgid	"Scrolling with <SPACE> past the end of an art. jumps to the next unread one."
+msgstr	"Na: i Impera Bya Kuri i Komeza>> Bidasomye"
+
+#: src/lang.c:1513
+#, fuzzy
+msgid	"Space goes to next unread article"
+msgstr	"Kuri Komeza>> Bidasomye Ingingo"
+
+#: src/lang.c:1514
+#, fuzzy
+msgid	"# If ON the SPACE command will go to next unread article at article viewer\n"
+	"# level when the end of the article is reached (rn-style pager)\n"
+msgstr	"#i Komandi: Gyayo Kuri Komeza>> Bidasomye Ingingo ku Ingingo urwego Ryari: i "
+	"Impera Bya i Ingingo ni IMISUSIRE Peja"
+
+#: src/lang.c:1519
+#, fuzzy
+msgid	"Scrolling with <PGDN>/<DOWN> past the end of an art. jumps to the unread one."
+msgstr	"Na: i Impera Bya Kuri i Bidasomye"
+
+#: src/lang.c:1520
+#, fuzzy
+msgid	"PgDn goes to next unread article"
+msgstr	"Kuri Komeza>> Bidasomye Ingingo"
+
+#: src/lang.c:1521
+#, fuzzy
+msgid	"# If ON the PGDN or DOWN command will go to next unread article when\n"
+	"# pressed at end of message\n"
+msgstr	"#i Cyangwa Komandi: Gyayo Kuri Komeza>> Bidasomye Ingingo ku Impera Bya"
+
+#: src/lang.c:1527
+#, fuzzy
+msgid	"List thread using right arrow key"
+msgstr	"Urudodo ikoresha Iburyo: Akambi Urufunguzo"
+
+#: src/lang.c:1528
+#, fuzzy
+msgid	"# If ON automatically list thread when entering it using right arrow key.\n"
+msgstr	"#ku buryo bwikora Urutonde Urudodo Ryari: ikoresha Iburyo: Akambi Urufunguzo"
+
+#: src/lang.c:1532
+#, fuzzy
+msgid	"Enter character to indicate deleted articles. <CR> sets, <ESC> cancels."
+msgstr	"Inyuguti Kuri Cyasibwe"
+
+#: src/lang.c:1533
+#, fuzzy
+msgid	"Character to show deleted articles"
+msgstr	"Kuri Garagaza Cyasibwe"
+
+#: src/lang.c:1534
+#, fuzzy
+msgid	"# Character used to show that an art was deleted (default 'D')\n"
+	"# _ is turned into ' '\n"
+msgstr	"#Kuri Garagaza Cyasibwe Mburabuzi ni"
+
+#: src/lang.c:1539
+#, fuzzy
+msgid	"Enter character to indicate articles in a range. <CR> sets, <ESC> cancels."
+msgstr	"Inyuguti Kuri in a Urutonde"
+
+#: src/lang.c:1540
+#, fuzzy
+msgid	"Character to show inrange articles"
+msgstr	"Kuri Garagaza"
+
+#: src/lang.c:1541
+#, fuzzy
+msgid	"# Character used to show that an art is in a range (default '#')\n"
+	"# _ is turned into ' '\n"
+msgstr	"#Kuri Garagaza ni in a Urutonde Mburabuzi ni"
+
+#: src/lang.c:1546
+#, fuzzy
+msgid	"Enter character to indicate that article will return. <CR> sets, <ESC> "
+	"cancels."
+msgstr	"Inyuguti Kuri Ingingo Garuka"
+
+#: src/lang.c:1547
+#, fuzzy
+msgid	"Character to show returning arts"
+msgstr	"Kuri Garagaza"
+
+#: src/lang.c:1548
+#, fuzzy
+msgid	"# Character used to show that an art will return (default '-')\n"
+	"# _ is turned into ' '\n"
+msgstr	"#Kuri Garagaza Garuka Mburabuzi ni"
+
+#: src/lang.c:1553
+#, fuzzy
+msgid	"Enter character to indicate selected articles. <CR> sets, <ESC> cancels."
+msgstr	"Inyuguti Kuri Byahiswemo"
+
+#: src/lang.c:1554
+#, fuzzy
+msgid	"Character to show selected articles"
+msgstr	"Kuri Garagaza Byahiswemo"
+
+#: src/lang.c:1555
+#, fuzzy
+msgid	"# Character used to show that an art was auto-selected (default '*')\n"
+	"# _ is turned into ' '\n"
+msgstr	"#Kuri Garagaza Ikiyega Byahiswemo Mburabuzi ni"
+
+#: src/lang.c:1560
+#, fuzzy
+msgid	"Enter character to indicate recent articles. <CR> sets, <ESC> cancels."
+msgstr	"Inyuguti Kuri"
+
+#: src/lang.c:1561
+#, fuzzy
+msgid	"Character to show recent articles"
+msgstr	"Kuri Garagaza"
+
+#: src/lang.c:1562
+#, fuzzy
+msgid	"# Character used to show that an art is recent (default 'o')\n"
+	"# _ is turned into ' '\n"
+msgstr	"#Kuri Garagaza ni Mburabuzi ni"
+
+#: src/lang.c:1567
+#, fuzzy
+msgid	"Enter character to indicate unread articles. <CR> sets, <ESC> cancels."
+msgstr	"Inyuguti Kuri Bidasomye"
+
+#: src/lang.c:1568
+#, fuzzy
+msgid	"Character to show unread articles"
+msgstr	"Kuri Garagaza Bidasomye"
+
+#: src/lang.c:1569
+#, fuzzy
+msgid	"# Character used to show that an art is unread (default '+')\n"
+	"# _ is turned into ' '\n"
+msgstr	"#Kuri Garagaza ni Bidasomye Mburabuzi ni"
+
+#: src/lang.c:1574
+#, fuzzy
+msgid	"Enter character to indicate read articles. <CR> sets, <ESC> cancels."
+msgstr	"Inyuguti Kuri Gusoma"
+
+#: src/lang.c:1575
+#, fuzzy
+msgid	"Character to show read articles"
+msgstr	"Kuri Garagaza Gusoma"
+
+#: src/lang.c:1576
+#, fuzzy
+msgid	"# Character used to show that an art was read (default ' ')\n"
+	"# _ is turned into ' '\n"
+msgstr	"#Kuri Garagaza Gusoma Mburabuzi ni"
+
+#: src/lang.c:1581
+#, fuzzy
+msgid	"Enter character to indicate killed articles. <CR> sets, <ESC> cancels."
+msgstr	"Inyuguti Kuri"
+
+#: src/lang.c:1582
+#, fuzzy
+msgid	"Character to show killed articles"
+msgstr	"Kuri Garagaza"
+
+#: src/lang.c:1583
+#, fuzzy
+msgid	"# Character used to show that an art was killed (default 'K')\n"
+	"# kill_level must be set accordingly, _ is turned into ' '\n"
+msgstr	"#Kuri Garagaza Mburabuzi Gushyiraho ni"
+
+#: src/lang.c:1588
+#, fuzzy
+msgid	"Enter character to indicate read selected articles. <CR> sets, <ESC> cancels."
+msgstr	"Inyuguti Kuri Gusoma Byahiswemo"
+
+#: src/lang.c:1589
+#, fuzzy
+msgid	"Character to show readselected arts"
+msgstr	"Kuri Garagaza"
+
+#: src/lang.c:1590
+#, fuzzy
+msgid	"# Character used to show that an art was selected before read (default ':')\n"
+	"# kill_level must be set accordingly, _ is turned into ' '\n"
+msgstr	"#Kuri Garagaza Byahiswemo Mbere Gusoma Mburabuzi Gushyiraho ni"
+
+#: src/lang.c:1595
+#, fuzzy
+msgid	"Enter maximum length of newsgroup names displayed. <CR> sets."
+msgstr	"Kinini Uburebure Bya Urubuga rw'amakuru Amazina"
+
+#: src/lang.c:1596
+#, fuzzy
+msgid	"Max. length of group names shown"
+msgstr	"Uburebure Bya Itsinda Amazina"
+
+#: src/lang.c:1597
+#, fuzzy
+msgid	"# Maximum length of the names of newsgroups displayed\n"
+msgstr	"#Uburebure Bya i Amazina Bya Imbuga z'amakuru"
+
+#: src/lang.c:1602
+#, fuzzy
+msgid	"Show lines/score in listings"
+msgstr	"Imirongo in"
+
+#: src/lang.c:1603
+#, fuzzy
+msgid	"# What informations should be displayed in article/thread listing\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = lines\n"
+	"#   2 = score\n"
+	"#   3 = lines & score\n"
+msgstr	"#in Ingingo Urudodo Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 1. 2. 3. "
+	"Imirongo"
+
+#: src/lang.c:1612
+#, fuzzy
+msgid	"0 = full page scrolling, -1 = show previous last line as first on next page, -"
+	"2 = half page"
+msgstr	"0 Ipaji 1. Garagaza Ibanjirije Iheruka Umurongo Nka Itangira ku Komeza>> "
+	"Ipaji 2. Ipaji"
+
+#: src/lang.c:1613
+#, fuzzy
+msgid	"Number of lines to scroll in pager"
+msgstr	"Bya Imirongo Kuri in Peja"
+
+#: src/lang.c:1614
+#, fuzzy
+msgid	"# Number of lines that cursor-up/down will scroll in article pager\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#  -2 = half-page scrolling\n"
+	"#  -1 = the top/bottom line is carried over onto the next page\n"
+	"#   0 = page-by-page (traditional behavior)\n"
+	"# * 1 = line-by-line\n"
+	"#   2 or greater = scroll by 2 or more lines (only in the pager)\n"
+msgstr	"#Bya Imirongo indanga Hejuru Hasi in Ingingo Uduciro i Mburabuzi ni cy/ "
+	"byagarajwe Na: 2. Ipaji 1. i Hejuru: Hasi: Umurongo ni KURI i Komeza>> 0 "
+	"Ipaji ku Ipaji imyitwarire 1. Umurongo ku 2. Cyangwa Biruta ku 2. Cyangwa "
+	"Birenzeho Imirongo in i Peja"
+
+#: src/lang.c:1624
+msgid	"Display signatures. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1625
+msgid	"Display signatures"
+msgstr	""
+
+#: src/lang.c:1626
+#, fuzzy
+msgid	"# If OFF don't show signatures when displaying articles\n"
+msgstr	"#Garagaza Ryari:"
+
+#: src/lang.c:1630
+#, fuzzy
+msgid	"Display uuencoded data as tagged attachments. <SPACE> toggles & <CR> sets."
+msgstr	"Ibyatanzwe Nka Imigereka"
+
+#: src/lang.c:1631
+#, fuzzy
+msgid	"Display uue data as an attachment"
+msgstr	"Ibyatanzwe Nka umugereka"
+
+#: src/lang.c:1632
+#, fuzzy
+msgid	"# Handling of uuencoded data in the pager\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no, display raw uuencoded data\n"
+	"#   1 = yes, uuencoded data will be condensed to a single tag line showing\n"
+	"#       size and filename, similar to how MIME attachments are displayed\n"
+	"#   2 = hide all, as for 1, but any line that looks like uuencoded data will\n"
+	"#       be folded into a tag line.\n"
+msgstr	"#Bya Ibyatanzwe in i Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 Oya "
+	"Kugaragaza 1. Yego Ibyatanzwe Cyegeranye Kuri a UMWE Itagi: Umurongo Ingano "
+	"Na Izina ry'idosiye: Kuri Imigereka 2. Gushisha Byose Nka kugirango 1. "
+	"Umurongo nka Ibyatanzwe a Itagi: Umurongo"
+
+#: src/lang.c:1642
+#, fuzzy
+msgid	"Decode German style TeX umlaut codes to ISO. <SPACE> toggles & <CR> sets."
+msgstr	"IMISUSIRE Kuri"
+
+#: src/lang.c:1643
+#, fuzzy
+msgid	"Display \"a as Umlaut-a"
+msgstr	"a Nka a"
+
+#: src/lang.c:1644
+#, fuzzy
+msgid	"# If ON decode German style TeX umlaut codes to ISO and\n"
+	"# show \"a as Umlaut-a, etc.\n"
+msgstr	"#IMISUSIRE Kuri Garagaza a Nka a"
+
+#: src/lang.c:1649 src/lang.c:1659
+#, fuzzy
+msgid	"Space separated list of header fields"
+msgstr	"Urutonde Bya Umutwempangano Imyanya"
+
+#: src/lang.c:1650
+#, fuzzy
+msgid	"Display these header fields (or *)"
+msgstr	"Umutwempangano Imyanya Cyangwa"
+
+#: src/lang.c:1651
+#, fuzzy
+msgid	"# Which news headers you wish to see. If you want to see _all_ the headers,\n"
+	"# place an '*' as this value. This is the only way a wildcard can be used.\n"
+	"# If you enter 'X-' as the value, you will see all headers beginning with\n"
+	"# 'X-' (like X-Alan or X-Pape). You can list more than one by delimiting "
+	"with\n"
+	"# spaces. Not defining anything turns off this option.\n"
+msgstr	"#Amakuru Imitwe Kuri Kuri Byose i Imitwe Nka iyi Agaciro ni i a Injiza Nka i "
+	"Agaciro Byose Imitwe Itangiriro nka Cyangwa Urutonde Birenzeho ku Imyanya "
+	"Bidakora iyi Ihitamo"
+
+#: src/lang.c:1660
+#, fuzzy
+msgid	"Do not display these header fields"
+msgstr	"OYA Kugaragaza Umutwempangano Imyanya"
+
+#: src/lang.c:1661
+#, fuzzy
+msgid	"# Same as 'news_headers_to_display' except it denotes the opposite.\n"
+	"# An example of using both options might be if you thought X- headers were\n"
+	"# A Good Thing(tm), but thought Alan and Pape were miscreants...well then "
+	"you\n"
+	"# would do something like this:\n"
+	"# news_headers_to_display=X-\n"
+	"# news_headers_to_not_display=X-Alan X-Pape\n"
+	"# Not defining anything turns off this option.\n"
+msgstr	"#Nka i Urugero Bya ikoresha Byombi Amahitamo NIBA Imitwe A Na Hanyuma nka iyi "
+	"Bidakora iyi Ihitamo"
+
+#: src/lang.c:1671
+#, fuzzy
+msgid	"Do you want to enable automatic handling of multipart/alternative articles?"
+msgstr	"Kuri Gushoboza Byikoresha Bya"
+
+#: src/lang.c:1672
+msgid	"Skip multipart/alternative parts"
+msgstr	""
+
+#: src/lang.c:1673
+#, fuzzy
+msgid	"# If ON strip multipart/alternative messages automatically\n"
+msgstr	"#Ubutumwa"
+
+#: src/lang.c:1678
+#, fuzzy
+msgid	"A regex used to decide which lines to show in col_quote."
+msgstr	"A Kuri Imirongo Kuri Garagaza in"
+
+#: src/lang.c:1679
+#, fuzzy
+msgid	"Regex used to show quoted lines"
+msgstr	"Kuri Garagaza Imirongo"
+
+#: src/lang.c:1680
+#, fuzzy
+msgid	"# A regular expression that tin will use to decide which lines are\n"
+	"# quoted when viewing articles. Quoted lines are shown in col_quote.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	"#A Ibisanzwe imvugo Gukoresha Kuri Imirongo Ryari: Imirongo in iyi "
+	"Ahatanditseho Gukoresha a in Mburabuzi"
+
+#: src/lang.c:1686
+#, fuzzy
+msgid	"A regex used to decide which lines to show in col_quote2."
+msgstr	"A Kuri Imirongo Kuri Garagaza in"
+
+#: src/lang.c:1687
+#, fuzzy
+msgid	"Regex used to show twice quoted l."
+msgstr	"Kuri Garagaza L"
+
+#: src/lang.c:1688
+#, fuzzy
+msgid	"# A regular expression that tin will use to decide which lines are\n"
+	"# quoted twice. Twice quoted lines are shown in col_quote2.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	"#A Ibisanzwe imvugo Gukoresha Kuri Imirongo Imirongo in iyi Ahatanditseho "
+	"Gukoresha a in Mburabuzi"
+
+#: src/lang.c:1694
+#, fuzzy
+msgid	"A regex used to decide which lines to show in col_quote3."
+msgstr	"A Kuri Imirongo Kuri Garagaza in"
+
+#: src/lang.c:1695
+#, fuzzy
+msgid	"Regex used to show >= 3 times q.l."
+msgstr	"L."
+
+#: src/lang.c:1696
+#, fuzzy
+msgid	"# A regular expression that tin will use to decide which lines are\n"
+	"# quoted >=3 times. >=3 times quoted lines are shown in col_quote3.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	"#A Ibisanzwe imvugo Gukoresha Kuri Imirongo 3. Times 3. Times Imirongo in iyi "
+	"Ahatanditseho Gukoresha a in Mburabuzi"
+
+#: src/lang.c:1703
+#, fuzzy
+msgid	"A regex used to decide which words to show in col_markslashes."
+msgstr	"A Kuri Amagambo Kuri Garagaza in"
+
+#: src/lang.c:1704
+#, fuzzy
+msgid	"Regex used to highlight /slashes/"
+msgstr	"Kuri garagaza cyane"
+
+#: src/lang.c:1705
+#, fuzzy
+msgid	"# A regular expression that tin will use to decide which words\n"
+	"# bounded by '/' are to be shown in col_markslashes.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	"#A Ibisanzwe imvugo Gukoresha Kuri ku Kuri in iyi Ahatanditseho Gukoresha a "
+	"in Mburabuzi"
+
+#: src/lang.c:1711
+#, fuzzy
+msgid	"A regex used to decide which words to show in col_markstars."
+msgstr	"A Kuri Amagambo Kuri Garagaza in"
+
+#: src/lang.c:1712
+#, fuzzy
+msgid	"Regex used to highlight *stars*"
+msgstr	"Kuri garagaza cyane Inyenyeri"
+
+#: src/lang.c:1713
+#, fuzzy
+msgid	"# A regular expression that tin will use to decide which words\n"
+	"# bounded by '*' are to be shown in col_markstars.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	"#A Ibisanzwe imvugo Gukoresha Kuri ku Kuri in iyi Ahatanditseho Gukoresha a "
+	"in Mburabuzi"
+
+#: src/lang.c:1719
+#, fuzzy
+msgid	"A regex used to decide which words to show in col_markstroke."
+msgstr	"A Kuri Amagambo Kuri Garagaza in"
+
+#: src/lang.c:1720
+#, fuzzy
+msgid	"Regex used to highlight -strokes-"
+msgstr	"Kuri garagaza cyane"
+
+#: src/lang.c:1721
+#, fuzzy
+msgid	"# A regular expression that tin will use to decide which words\n"
+	"# bounded by '-' are to be shown in col_markstroke.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	"#A Ibisanzwe imvugo Gukoresha Kuri ku Kuri in iyi Ahatanditseho Gukoresha a "
+	"in Mburabuzi"
+
+#: src/lang.c:1727
+#, fuzzy
+msgid	"A regex used to decide which words to show in col_markdash."
+msgstr	"A Kuri Amagambo Kuri Garagaza in"
+
+#: src/lang.c:1728
+#, fuzzy
+msgid	"Regex used to highlight _underline_"
+msgstr	"Kuri garagaza cyane Gucaho umurongo"
+
+#: src/lang.c:1729
+#, fuzzy
+msgid	"# A regular expression that tin will use to decide which words\n"
+	"# bounded by '_' are to be shown in col_markdash.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	"#A Ibisanzwe imvugo Gukoresha Kuri ku Kuri in iyi Ahatanditseho Gukoresha a "
+	"in Mburabuzi"
+
+#: src/lang.c:1735
+#, fuzzy
+msgid	"A regex used to find Subject prefixes to remove.  Use '|' as separator."
+msgstr	"A Kuri Gushaka Kuri Gukuraho... Nka Mutandukanya"
+
+#: src/lang.c:1736
+#, fuzzy
+msgid	"Regex with Subject prefixes"
+msgstr	"Na:"
+
+#: src/lang.c:1737
+#, fuzzy
+msgid	"# A regular expression that tin will use to find Subject prefixes\n"
+	"# which will be removed before showing the header.\n"
+msgstr	"#A Ibisanzwe imvugo Gukoresha Kuri Gushaka Cyavanyweho Mbere i Umutwempangano"
+
+#: src/lang.c:1742
+#, fuzzy
+msgid	"A regex used to find Subject suffixes to remove.  Use '|' as separator."
+msgstr	"A Kuri Gushaka Imigereka Kuri Gukuraho... Nka Mutandukanya"
+
+#: src/lang.c:1743
+#, fuzzy
+msgid	"Regex with Subject suffixes"
+msgstr	"Na: Imigereka"
+
+#: src/lang.c:1744
+#, fuzzy
+msgid	"# A regular expression that tin will use to find Subject suffixes\n"
+	"# which will be removed when replying or posting followup.\n"
+msgstr	"#A Ibisanzwe imvugo Gukoresha Kuri Gushaka Cyavanyweho Ryari: Cyangwa"
+
+#: src/lang.c:1749
+#, fuzzy
+msgid	"Enter name and options for external MIME viewer, --internal for built-in "
+	"viewer"
+msgstr	"Izina: Na Amahitamo kugirango external By'imbere kugirango in"
+
+#: src/lang.c:1750
+#, fuzzy
+msgid	"MIME binary content viewer"
+msgstr	"Nyabibiri Ibikubiyemo"
+
+#: src/lang.c:1751
+#, fuzzy
+msgid	"# If --internal automatically use the built in MIME viewer for non-text\n"
+	"# parts of articles.\n"
+	"# Otherwise specify an external viewer program (eg, metamail) or leave blank\n"
+	"# for no automatic viewing\n"
+msgstr	"#By'imbere ku buryo bwikora Gukoresha i in kugirango Bya external Porogaramu "
+	"Cyangwa kugirango Oya Byikoresha"
+
+#: src/lang.c:1758
+#, fuzzy
+msgid	"Confirm before starting non-text viewing program"
+msgstr	"Mbere Umwandiko Porogaramu"
+
+#: src/lang.c:1759
+#, fuzzy
+msgid	"Ask before using MIME viewer"
+msgstr	"Mbere ikoresha"
+
+#: src/lang.c:1760
+#, fuzzy
+msgid	"# If ON tin will ask before using metamail to display MIME messages\n"
+	"# this only happens if metamail_prog is set to something\n"
+msgstr	"#Mbere ikoresha Kuri Kugaragaza iyi NIBA ni Gushyiraho Kuri"
+
+#: src/lang.c:1765
+#, fuzzy
+msgid	"Ask to mark groups read when quitting. <SPACE> toggles & <CR> sets."
+msgstr	"Kuri Ikimenyetso Amatsinda Gusoma Ryari:"
+
+#: src/lang.c:1766
+#, fuzzy
+msgid	"Catchup read groups when quitting"
+msgstr	"Gusoma Amatsinda Ryari:"
+
+#: src/lang.c:1767
+#, fuzzy
+msgid	"# If ON ask user if read groups should all be marked read\n"
+msgstr	"#Ukoresha: NIBA Gusoma Amatsinda Byose cy/ byagarajwe"
+
+#: src/lang.c:1772
+#, fuzzy
+msgid	"Catchup group using left key"
+msgstr	"Itsinda ikoresha Ibumoso: Urufunguzo"
+
+#: src/lang.c:1773
+#, fuzzy
+msgid	"# If ON catchup group/thread when leaving with the left arrow key.\n"
+msgstr	"#Itsinda Urudodo Ryari: Na: i Ibumoso: Akambi Urufunguzo"
+
+#: src/lang.c:1778
+#, fuzzy
+msgid	"Catchup thread by using left key"
+msgstr	"Urudodo ku ikoresha Ibumoso: Urufunguzo"
+
+#: src/lang.c:1784
+#, fuzzy
+msgid	"Which actions require confirmation"
+msgstr	"Iyemeza"
+
+#: src/lang.c:1785
+#, fuzzy
+msgid	"# What should we ask confirmation for.\n"
+msgstr	"#Twebwe Iyemeza kugirango"
+
+#: src/lang.c:1790
+#, fuzzy
+msgid	"'Mark article read' ignores tags"
+msgstr	"'Ingingo"
+
+#: src/lang.c:1791
+#, fuzzy
+msgid	"# If ON the 'Mark article read' function marks only the current article.\n"
+msgstr	"#i Ingingo Umumaro i KIGEZWEHO Ingingo"
+
+#: src/lang.c:1795
+#, fuzzy
+msgid	"Program to run to open URL's, <CR> sets, <ESC> cancels."
+msgstr	"Kuri Gukoresha Kuri Gufungura"
+
+#: src/lang.c:1796
+msgid	"Program that opens URL's"
+msgstr	""
+
+#: src/lang.c:1797
+#, fuzzy
+msgid	"# The program used to open URL's. The actual URL will be appended\n"
+msgstr	"#Porogaramu Kuri Gufungura"
+
+#: src/lang.c:1802
+#, fuzzy
+msgid	"Use mouse in xterm"
+msgstr	"Imbeba in"
+
+#: src/lang.c:1803
+#, fuzzy
+msgid	"# If ON enable mouse key support on xterm terminals\n"
+msgstr	"#Gushoboza Imbeba Urufunguzo Gushigikira ku"
+
+#: src/lang.c:1809
+#, fuzzy
+msgid	"Use scroll keys on keypad"
+msgstr	"Utubuto ku"
+
+#: src/lang.c:1810
+#, fuzzy
+msgid	"# If ON enable scroll keys on terminals that support it\n"
+msgstr	"#Gushoboza Utubuto ku Gushigikira"
+
+#: src/lang.c:1815
+#, fuzzy
+msgid	"Enter maximum number of article to get. <CR> sets."
+msgstr	"Kinini Umubare Bya Ingingo Kuri Kubona"
+
+#: src/lang.c:1816
+#, fuzzy
+msgid	"Number of articles to get"
+msgstr	"Bya Kuri Kubona"
+
+#: src/lang.c:1817
+#, fuzzy
+msgid	"# Number of articles to get (0=no limit), if negative sets maximum number\n"
+	"# of already read articles to be read before first unread one\n"
+msgstr	"#Bya Kuri Kubona 0 Oya NIBA Kinini Bya Gusoma Kuri Gusoma Mbere Itangira "
+	"Bidasomye"
+
+#: src/lang.c:1822
+#, fuzzy
+msgid	"Enter number of days article is considered recent. <CR> sets."
+msgstr	"Umubare Bya Iminsi Ingingo ni"
+
+#: src/lang.c:1823
+#, fuzzy
+msgid	"Article recentness time limit"
+msgstr	"Igihe"
+
+#: src/lang.c:1824
+#, fuzzy
+msgid	"# Number of days in which article is considered recent, (0=OFF)\n"
+msgstr	"#Bya Iminsi in Ingingo ni 0"
+
+#: src/lang.c:1828
+#, fuzzy
+msgid	"WILDMAT for normal wildcards, REGEX for full regular expression matching."
+msgstr	"kugirango Bisanzwe kugirango Ibisanzwe imvugo"
+
+#: src/lang.c:1829
+msgid	"Wildcard matching"
+msgstr	""
+
+#: src/lang.c:1830
+#, fuzzy
+msgid	"# Wildcard matching\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = wildmat\n"
+	"#   1 = regex\n"
+msgstr	"#Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 1."
+
+#: src/lang.c:1837
+#, fuzzy
+msgid	"Enter minimal score before an article is marked killed. <CR> sets."
+msgstr	"Mbere Ingingo ni cy/ byagarajwe"
+
+#: src/lang.c:1838
+msgid	"Score limit (kill)"
+msgstr	""
+
+#: src/lang.c:1839
+#, fuzzy
+msgid	"# Score limit before an article is marked killed\n"
+msgstr	"#Mbere Ingingo ni cy/ byagarajwe"
+
+#: src/lang.c:1843
+#, fuzzy
+msgid	"Enter default score to kill articles. <CR> sets."
+msgstr	"Mburabuzi Kuri"
+
+#: src/lang.c:1844
+#, fuzzy
+msgid	"Default score to kill articles"
+msgstr	"Kuri"
+
+#: src/lang.c:1845
+#, fuzzy
+msgid	"# Default score to kill articles\n"
+msgstr	"#Kuri"
+
+#: src/lang.c:1849
+#, fuzzy
+msgid	"Enter minimal score before an article is marked hot. <CR> sets."
+msgstr	"Mbere Ingingo ni cy/ byagarajwe"
+
+#: src/lang.c:1850
+#, fuzzy
+msgid	"Score limit (select)"
+msgstr	"Guhitamo"
+
+#: src/lang.c:1851
+#, fuzzy
+msgid	"# Score limit before an article is marked hot\n"
+msgstr	"#Mbere Ingingo ni cy/ byagarajwe"
+
+#: src/lang.c:1855
+#, fuzzy
+msgid	"Enter default score to select articles. <CR> sets."
+msgstr	"Mburabuzi Kuri Guhitamo"
+
+#: src/lang.c:1856
+#, fuzzy
+msgid	"Default score to select articles"
+msgstr	"Kuri Guhitamo"
+
+#: src/lang.c:1857
+#, fuzzy
+msgid	"# Default score to select articles\n"
+msgstr	"#Kuri Guhitamo"
+
+#: src/lang.c:1863
+#, fuzzy
+msgid	"Use slrnface to show ''X-Face:''s"
+msgstr	"Kuri Garagaza S"
+
+#: src/lang.c:1864
+#, fuzzy
+msgid	"# If ON using slrnface(1) to interpret the ''X-Face:'' header.\n"
+	"# Only useful when running in an xterm.\n"
+msgstr	"#ikoresha 1. Kuri i Umutwempangano Ryari: in"
+
+#: src/lang.c:1872
+#, fuzzy
+msgid	"Use ANSI color"
+msgstr	"Ibara"
+
+#: src/lang.c:1873
+#, fuzzy
+msgid	"# If ON using ANSI-color\n"
+msgstr	"#ikoresha"
+
+#: src/lang.c:1878
+#, fuzzy
+msgid	"Standard foreground color"
+msgstr	"Ibara"
+
+#: src/lang.c:1879
+#, fuzzy
+msgid	"# Standard foreground color\n"
+	"# Default: -1 (default color)\n"
+msgstr	"#1. Mburabuzi Ibara"
+
+#: src/lang.c:1885
+#, fuzzy
+msgid	"Standard background color"
+msgstr	"Mbuganyuma Ibara"
+
+#: src/lang.c:1886
+#, fuzzy
+msgid	"# Standard background color\n"
+	"# Default: -1 (default color)\n"
+msgstr	"#Mbuganyuma 1. Mburabuzi Ibara"
+
+#: src/lang.c:1892
+#, fuzzy
+msgid	"Color for inverse text (background)"
+msgstr	"kugirango Umwandiko Mbuganyuma"
+
+#: src/lang.c:1893
+#, fuzzy
+msgid	"# Color of background for inverse text\n"
+	"# Default: 4 (blue)\n"
+msgstr	"#Bya Mbuganyuma kugirango 4. Ubururu"
+
+#: src/lang.c:1899
+#, fuzzy
+msgid	"Color for inverse text (foreground)"
+msgstr	"kugirango Umwandiko"
+
+#: src/lang.c:1900
+#, fuzzy
+msgid	"# Color of foreground for inverse text\n"
+	"# Default: 7 (white)\n"
+msgstr	"#Bya kugirango 7 Umweru"
+
+#: src/lang.c:1906
+#, fuzzy
+msgid	"Color of text lines"
+msgstr	"Bya Umwandiko Imirongo"
+
+#: src/lang.c:1907
+#, fuzzy
+msgid	"# Color of text lines\n"
+	"# Default: -1 (default color)\n"
+msgstr	"#Bya Umwandiko 1. Mburabuzi Ibara"
+
+#: src/lang.c:1913
+#, fuzzy
+msgid	"Color of mini help menu"
+msgstr	"Bya Ifashayobora Ibikubiyemo"
+
+#: src/lang.c:1914
+#, fuzzy
+msgid	"# Color of mini help menu\n"
+	"# Default: 3 (brown)\n"
+msgstr	"#Bya Ifashayobora 3. Igihogo"
+
+#: src/lang.c:1920
+#, fuzzy
+msgid	"Color of help text"
+msgstr	"Bya Ifashayobora Umwandiko"
+
+#: src/lang.c:1921
+#, fuzzy
+msgid	"# Color of help pages\n"
+	"# Default: -1 (default color)\n"
+msgstr	"#Bya Ifashayobora 1. Mburabuzi Ibara"
+
+#: src/lang.c:1927
+#, fuzzy
+msgid	"Color of status messages"
+msgstr	"Bya Imimerere Ubutumwa"
+
+#: src/lang.c:1928
+#, fuzzy
+msgid	"# Color of messages in last line\n"
+	"# Default: 6 (cyan)\n"
+msgstr	"#Bya Ubutumwa in Iheruka 6 Ubururu bukeye"
+
+#: src/lang.c:1934
+#, fuzzy
+msgid	"Color of quoted lines"
+msgstr	"Bya Imirongo"
+
+#: src/lang.c:1935
+#, fuzzy
+msgid	"# Color of quote-lines\n"
+	"# Default: 2 (green)\n"
+msgstr	"#Bya Gushyiraho akugarizo 2. Icyatsi"
+
+#: src/lang.c:1941
+#, fuzzy
+msgid	"Color of twice quoted line"
+msgstr	"Bya Umurongo"
+
+#: src/lang.c:1942
+#, fuzzy
+msgid	"# Color of twice quoted lines\n"
+	"# Default: 3 (brown)\n"
+msgstr	"#Bya 3. Igihogo"
+
+#: src/lang.c:1948
+#, fuzzy
+msgid	"Color of =>3 times quoted line"
+msgstr	"Bya 3. Times Umurongo"
+
+#: src/lang.c:1949
+#, fuzzy
+msgid	"# Color of >=3 times quoted lines\n"
+	"# Default: 4 (blue)\n"
+msgstr	"#Bya 3. Times 4. Ubururu"
+
+#: src/lang.c:1955
+#, fuzzy
+msgid	"Color of article header lines"
+msgstr	"Bya Ingingo Umutwempangano Imirongo"
+
+#: src/lang.c:1956
+#, fuzzy
+msgid	"# Color of header-lines\n"
+	"# Default: 2 (green)\n"
+msgstr	"#Bya Umutwempangano 2. Icyatsi"
+
+#: src/lang.c:1962
+#, fuzzy
+msgid	"Color of actual news header fields"
+msgstr	"Bya Amakuru Umutwempangano Imyanya"
+
+#: src/lang.c:1963
+#, fuzzy
+msgid	"# Color of actual news header fields\n"
+	"# Default: 9 (light red)\n"
+msgstr	"#Bya Amakuru Umutwempangano 9 kimurika Umutuku"
+
+#: src/lang.c:1969
+#, fuzzy
+msgid	"Color of article subject lines"
+msgstr	"Bya Ingingo Ikivugwaho Imirongo"
+
+#: src/lang.c:1970
+#, fuzzy
+msgid	"# Color of article subject\n"
+	"# Default: 6 (cyan)\n"
+msgstr	"#Bya Ingingo 6 Ubururu bukeye"
+
+#: src/lang.c:1976
+#, fuzzy
+msgid	"Color of response counter"
+msgstr	"Bya"
+
+#: src/lang.c:1977
+#, fuzzy
+msgid	"# Color of response counter\n"
+	"# Default: 2 (green)\n"
+msgstr	"#Bya 2. Icyatsi"
+
+#: src/lang.c:1983
+#, fuzzy
+msgid	"Color of sender (From:)"
+msgstr	"Bya Uwohereza"
+
+#: src/lang.c:1984
+#, fuzzy
+msgid	"# Color of sender (From:)\n"
+	"# Default: 2 (green)\n"
+msgstr	"#Bya Uwohereza 2. Icyatsi"
+
+#: src/lang.c:1990
+#, fuzzy
+msgid	"Color of help/mail sign"
+msgstr	"Bya Ifashayobora Ubutumwa IKIMENYETSO"
+
+#: src/lang.c:1991
+#, fuzzy
+msgid	"# Color of Help/Mail-Sign\n"
+	"# Default: 4 (blue)\n"
+msgstr	"#Bya 4. Ubururu"
+
+#: src/lang.c:1997
+#, fuzzy
+msgid	"Color of signatures"
+msgstr	"Bya"
+
+#: src/lang.c:1998
+#, fuzzy
+msgid	"# Color of signature\n"
+	"# Default: 4 (blue)\n"
+msgstr	"#Bya 4. Ubururu"
+
+#: src/lang.c:2004
+#, fuzzy
+msgid	"Color of highlighted URLs"
+msgstr	"Bya"
+
+#: src/lang.c:2005
+#, fuzzy
+msgid	"# Color of highlighted URLs\n"
+	"# Default: -1 (default color)\n"
+msgstr	"#Bya 1. Mburabuzi Ibara"
+
+#: src/lang.c:2011
+#, fuzzy
+msgid	"Color of highlighting with *stars*"
+msgstr	"Bya Igaragaza cyane Na: Inyenyeri"
+
+#: src/lang.c:2012
+#, fuzzy
+msgid	"# Color of word highlighting with *stars*\n"
+	"# Default: 11 (yellow)\n"
+msgstr	"#Bya ijambo Igaragaza cyane Na: Inyenyeri Umuhondo"
+
+#: src/lang.c:2018
+#, fuzzy
+msgid	"Color of highlighting with _dash_"
+msgstr	"Bya Igaragaza cyane Na: AKANYEREZO"
+
+#: src/lang.c:2019
+#, fuzzy
+msgid	"# Color of word highlighting with _dash_\n"
+	"# Default: 13 (light pink)\n"
+msgstr	"#Bya ijambo Igaragaza cyane Na: kimurika"
+
+#: src/lang.c:2025
+#, fuzzy
+msgid	"Color of highlighting with /slash/"
+msgstr	"Bya Igaragaza cyane Na: AKARONGOKABERAMYE"
+
+#: src/lang.c:2026
+#, fuzzy
+msgid	"# Color of word highlighting with /slash/\n"
+	"# Default: 14 (light cyan)\n"
+msgstr	"#Bya ijambo Igaragaza cyane Na: AKARONGOKABERAMYE 14 kimurika Ubururu bukeye"
+
+#: src/lang.c:2032
+#, fuzzy
+msgid	"Color of highlighting with -stroke-"
+msgstr	"Bya Igaragaza cyane Na: Akarongo"
+
+#: src/lang.c:2033
+#, fuzzy
+msgid	"# Color of word highlighting with -stroke-\n"
+	"# Default: 12 (light blue)\n"
+msgstr	"#Bya ijambo Igaragaza cyane Na: Akarongo 12 kimurika Ubururu"
+
+#: src/lang.c:2040
+#, fuzzy
+msgid	"Attr. of highlighting with *stars*"
+msgstr	"Bya Igaragaza cyane Na: Inyenyeri"
+
+#: src/lang.c:2041
+#, fuzzy
+msgid	"# Attributes of word highlighting on mono terminals\n"
+	"# Possible values are:\n"
+	"#   0 = Normal\n"
+	"#   1 = Underline\n"
+	"#   2 = Best highlighting\n"
+	"#   3 = Reverse video\n"
+	"#   4 = Blinking\n"
+	"#   5 = Half bright\n"
+	"#   6 = Bold\n"
+	"\n"
+	"# Attribute of word highlighting with *stars*\n"
+	"# Default: 6 (bold)\n"
+msgstr	"#Bya ijambo Igaragaza cyane ku Uduciro 0 1. 2. 3. 4. 5 6 Bya ijambo Igaragaza "
+	"cyane Na: Inyenyeri 6 UTSINDAGIYE"
+
+#: src/lang.c:2056
+#, fuzzy
+msgid	"Attr. of highlighting with _dash_"
+msgstr	"Bya Igaragaza cyane Na: AKANYEREZO"
+
+#: src/lang.c:2057
+#, fuzzy
+msgid	"# Attribute of word highlighting with _dash_\n"
+	"# Default: 2 (best highlighting)\n"
+msgstr	"#Bya ijambo Igaragaza cyane Na: 2. Igaragaza cyane"
+
+#: src/lang.c:2063
+#, fuzzy
+msgid	"Attr. of highlighting with /slash/"
+msgstr	"Bya Igaragaza cyane Na: AKARONGOKABERAMYE"
+
+#: src/lang.c:2064
+#, fuzzy
+msgid	"# Attribute of word highlighting with /slash/\n"
+	"# Default: 5 (half bright)\n"
+msgstr	"#Bya ijambo Igaragaza cyane Na: AKARONGOKABERAMYE 5 Bibonerana"
+
+#: src/lang.c:2070
+#, fuzzy
+msgid	"Attr. of highlighting with -stroke-"
+msgstr	"Bya Igaragaza cyane Na: Akarongo"
+
+#: src/lang.c:2071
+#, fuzzy
+msgid	"# Attribute of word highlighting with -stroke-\n"
+	"# Default: 3 (reverse video)\n"
+msgstr	"#Bya ijambo Igaragaza cyane Na: Akarongo 3. Ihindurakerekezo Videwo..."
+
+#: src/lang.c:2077
+#, fuzzy
+msgid	"URL highlighting in message body"
+msgstr	"Igaragaza cyane in Ubutumwa Umubiri"
+
+#: src/lang.c:2078
+#, fuzzy
+msgid	"# Enable URL highlighting?\n"
+msgstr	"#Igaragaza cyane"
+
+#: src/lang.c:2083
+#, fuzzy
+msgid	"Word highlighting in message body"
+msgstr	"Igaragaza cyane in Ubutumwa Umubiri"
+
+#: src/lang.c:2084
+#, fuzzy
+msgid	"# Enable word highlighting?\n"
+msgstr	"#ijambo Igaragaza cyane"
+
+#: src/lang.c:2089
+#, fuzzy
+msgid	"What to display instead of mark"
+msgstr	"Kuri Kugaragaza Bya Ikimenyetso"
+
+#: src/lang.c:2090
+#, fuzzy
+msgid	"# Should the leading and ending stars and dashes also be displayed,\n"
+	"# even when they are highlighting marks?\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = no\n"
+	"#   1 = yes, display mark\n"
+	"# * 2 = print a space instead\n"
+msgstr	"#i Nyobora Na Inyenyeri Na Utunyerezo ATARIIGIHARWE Ryari: Igaragaza cyane "
+	"Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 1. Yego Kugaragaza 2. Gucapa a "
+	"Umwanya"
+
+#: src/lang.c:2099
+#, fuzzy
+msgid	"Enter column number to wrap article lines to in the pager. <CR> sets."
+msgstr	"Inkingi Umubare Kuri Gufunika Ingingo Imirongo Kuri in i Peja"
+
+#: src/lang.c:2100
+#, fuzzy
+msgid	"Page line wrap column"
+msgstr	"Umurongo Gufunika Inkingi"
+
+#: src/lang.c:2101
+#, fuzzy
+msgid	"# Wrap article lines at column\n"
+msgstr	"#Ingingo Imirongo ku"
+
+#: src/lang.c:2106
+#, fuzzy
+msgid	"Wrap around threads on next unread"
+msgstr	"ku Komeza>> Bidasomye"
+
+#: src/lang.c:2107
+#, fuzzy
+msgid	"# If ON wrap around threads on searching next unread article\n"
+msgstr	"#Gufunika ku Ishakisha Komeza>> Bidasomye"
+
+#: src/lang.c:2111
+#, fuzzy
+msgid	"Enter default mail address (and fullname). <CR> sets."
+msgstr	"Mburabuzi Ubutumwa Aderesi Na"
+
+#: src/lang.c:2112
+#, fuzzy
+msgid	"Mail address (and fullname)"
+msgstr	"Aderesi Na"
+
+#: src/lang.c:2113
+#, fuzzy
+msgid	"# User's mail address (and fullname), if not username@host (fullname)\n"
+msgstr	"#Ubutumwa Aderesi Na NIBA OYA Izina ry'ukoresha Ubuturo"
+
+#: src/lang.c:2118
+#, fuzzy
+msgid	"Show empty Followup-To in editor"
+msgstr	"ubusa in Muhinduzi"
+
+#: src/lang.c:2119
+#, fuzzy
+msgid	"# If ON show empty Followup-To header when editing an article\n"
+msgstr	"#Garagaza ubusa Umutwempangano Ryari:"
+
+#: src/lang.c:2123
+#, fuzzy
+msgid	"Enter path/! command/--none to create your default signature. <CR> sets."
+msgstr	"Inzira Komandi: Ntacyo Kuri Kurema Mburabuzi Isinya"
+
+#: src/lang.c:2124
+#, fuzzy
+msgid	"Create signature from path/command"
+msgstr	"Isinya Bivuye Inzira Komandi:"
+
+#: src/lang.c:2125
+#, fuzzy
+msgid	"# Signature path (random sigs)/file to be used when posting/replying\n"
+	"# default_sigfile=file       appends file as signature\n"
+	"# default_sigfile=!command   executes external command to generate a "
+	"signature\n"
+	"# default_sigfile=--none     don't append a signature\n"
+msgstr	"#Inzira IDOSIYE Kuri Ryari: IDOSIYE IDOSIYE Nka Komandi: external Komandi: "
+	"Kuri a Ntacyo Kongeraho... a"
+
+#: src/lang.c:2132
+#, fuzzy
+msgid	"Prepend signature with \"-- \" on own line. <SPACE> toggles & <CR> sets."
+msgstr	"Isinya Na: ku Umurongo"
+
+#: src/lang.c:2133
+#, fuzzy
+msgid	"Prepend signature with \"-- \""
+msgstr	"Isinya Na:"
+
+#: src/lang.c:2134
+#, fuzzy
+msgid	"# If ON prepend the signature with dashes '\\n-- \\n'\n"
+msgstr	"#i Isinya Na: Utunyerezo N"
+
+#: src/lang.c:2138
+#, fuzzy
+msgid	"Add signature when reposting articles. <SPACE> toggles & <CR> sets."
+msgstr	"Isinya Ryari:"
+
+#: src/lang.c:2139
+#, fuzzy
+msgid	"Add signature when reposting"
+msgstr	"Isinya Ryari:"
+
+#: src/lang.c:2140
+#, fuzzy
+msgid	"# If ON add signature to reposted articles\n"
+msgstr	"#Kongeramo Isinya Kuri"
+
+#: src/lang.c:2144
+#, fuzzy, c-format
+msgid	"Enter quotation marks, %s or %S for author's initials."
+msgstr	"Gusubiramo ibyavuzwe Cyangwa kugirango Izibanza"
+
+#: src/lang.c:2145
+#, fuzzy
+msgid	"Characters used as quote-marks"
+msgstr	"Nka Gushyiraho akugarizo"
+
+#: src/lang.c:2146
+#, fuzzy, c-format
+msgid	"# Characters used in quoting to followups and replies.\n"
+	"# '_' is replaced by ' ', %%s, %%S are replaced by author's initials.\n"
+msgstr	"#in Kuri Na ni ku ku Izibanza"
+
+#: src/lang.c:2152
+#, fuzzy
+msgid	"Quoting behavior"
+msgstr	"imyitwarire"
+
+#: src/lang.c:2153
+#, fuzzy
+msgid	"# How quoting should be handled when following up or replying.\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = Nothing special\n"
+	"#   1 = Compress quotes\n"
+	"#   2 = Quote signatures\n"
+	"#   3 = Compress quotes, quote signatures\n"
+	"#   4 = Quote empty lines\n"
+	"# * 5 = Compress quotes, quote empty lines\n"
+	"#   6 = Quote signatures, quote empty lines\n"
+	"#   7 = Compress quotes, quote signatures, quote empty lines\n"
+msgstr	"#Ryari: Hejuru Cyangwa Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 1. 2. 3. "
+	"Gushyiraho akugarizo 4. ubusa 5 Gushyiraho akugarizo ubusa 6 Gushyiraho "
+	"akugarizo ubusa 7 Gushyiraho akugarizo Gushyiraho akugarizo ubusa"
+
+#: src/lang.c:2166 src/lang.c:2174 src/lang.c:2180
+msgid	"%A Addr %D Date %F Addr+Name %G Groupname %M Message-ID %N Name %C First Name"
+msgstr	""
+
+#: src/lang.c:2167
+#, fuzzy
+msgid	"Quote line when following up"
+msgstr	"Umurongo Ryari: Hejuru"
+
+#: src/lang.c:2168
+#, fuzzy, c-format
+msgid	"# Format of quote line when mailing/posting/following-up an article\n"
+	"# %%A Address    %%D Date   %%F Addr+Name   %%G Groupname   %%M Message-ID\n"
+	"# %%N Full Name  %%C First Name   %%I Initials\n"
+msgstr	"#Bya Gushyiraho akugarizo Umurongo Ryari: Hejuru"
+
+#: src/lang.c:2175
+#, fuzzy
+msgid	"Quote line when cross-posting"
+msgstr	"Umurongo Ryari: Kwambukiranya"
+
+#: src/lang.c:2181
+#, fuzzy
+msgid	"Quote line when mailing"
+msgstr	"Umurongo Ryari:"
+
+#: src/lang.c:2186
+#, fuzzy
+msgid	"If ON, include User-Agent: header. <SPACE> toggles & <CR> sets."
+msgstr	"Gushyiramo Umutwempangano"
+
+#: src/lang.c:2187
+#, fuzzy
+msgid	"Insert 'User-Agent:'-header"
+msgstr	"Umutwempangano"
+
+#: src/lang.c:2188
+#, fuzzy
+msgid	"# If ON include advertising User-Agent: header\n"
+msgstr	"#Gushyiramo"
+
+#: src/lang.c:2193
+#, fuzzy
+msgid	"Enter charset name for MIME (e.g. US-ASCII, ISO-8859-1, EUC-KR), <CR> to set."
+msgstr	"g."
+
+#: src/lang.c:2194
+msgid	"MM_CHARSET"
+msgstr	""
+
+#: src/lang.c:2195
+#, fuzzy
+msgid	"# Charset supported locally which is also used for MIME header and\n"
+	"# Content-Type header.\n"
+	"# If not set, the value of the environment variable MM_CHARSET is used.\n"
+	"# Set to US-ASCII or compile time default if neither of them is defined.\n"
+	"# If MIME_STRICT_CHARSET is defined at compile-time, charset other than\n"
+	"# mm_charset is considered not displayable and represented as '?'.\n"
+msgstr	"#Project- Id- Version: basctl\n"
+	"POT- Creation- Date: 2003- 12- 07 17: 13+ 02\n"
+	"PO- Revision- Date: 2004- 11- 04 10: 13- 0700\n"
+	"Last- Translator: Language- Team:< en@ li. org> MIME- Version: 1. 0\n"
+	"Content- Type: text/ plain; charset= UTF- 8\n"
+	"Content- Transfer- Encoding: 8bit\n"
+	"X- Generator: KBabel 1. 0\n"
+	"."
+
+#: src/lang.c:2205
+msgid	"MM_NETWORK_CHARSET"
+msgstr	""
+
+#: src/lang.c:2206
+#, fuzzy
+msgid	"# Charset used for MIME (Content-Type) header in postings.\n"
+msgstr	"#kugirango Umutwempangano in"
+
+#: src/lang.c:2212
+#, fuzzy
+msgid	"Mailbox format"
+msgstr	"Imiterere"
+
+#: src/lang.c:2213
+#, fuzzy
+msgid	"# Format of the mailbox.\n"
+msgstr	"#Bya i"
+
+#: src/lang.c:2218
+#, fuzzy
+msgid	"MIME encoding in news messages"
+msgstr	"Imisobekere: in Amakuru Ubutumwa"
+
+#: src/lang.c:2219
+#, fuzzy
+msgid	"# MIME encoding (8bit, base64, quoted-printable, 7bit) of the body\n"
+	"# for mails and posts, if necessary. QP is efficient for most European\n"
+	"# character sets (ISO-8859-X) with small fraction of non-US-ASCII chars,\n"
+	"# while Base64 is more efficient for most 8bit East Asian, Greek, and\n"
+	"# Russian charsets with a lot of 8bit characters.\n"
+msgstr	"#Imisobekere: Gicapika Bya i kugirango Na NIBA ni kugirango Inyuguti Na: "
+	"Gitoya Imigabane Bya ni Birenzeho kugirango Na: a Bya Inyuguti"
+
+#: src/lang.c:2227 src/lang.c:2248
+#, fuzzy
+msgid	"Don't change unless you know what you are doing. <ESC> cancels."
+msgstr	"Guhindura>>"
+
+#: src/lang.c:2228
+#, fuzzy
+msgid	"Use 8bit characters in news headers"
+msgstr	"Inyuguti in Amakuru Imitwe"
+
+#: src/lang.c:2229
+#, fuzzy
+msgid	"# If ON, 8bit characters in news headers are NOT encoded.\n"
+	"# default is OFF. Thus 8bit characters are encoded by default.\n"
+	"# 8bit chars in header are encoded regardless of the value of this\n"
+	"# parameter unless post_mime_encoding is 8bit as well.\n"
+msgstr	"#Inyuguti in Amakuru Imitwe Mburabuzi ni Inyuguti ku Mburabuzi in "
+	"Umutwempangano Bya i Agaciro Bya ni Nka"
+
+#: src/lang.c:2236
+#, fuzzy
+msgid	"Auto-view post-processed files <SPACE> toggles, <CR> sets, <ESC> cancels."
+msgstr	"Kureba Iposita Idosiye"
+
+#: src/lang.c:2237
+#, fuzzy
+msgid	"View post-processed files"
+msgstr	"Iposita Idosiye"
+
+#: src/lang.c:2238
+#, fuzzy
+msgid	"# If set, post processed files will be opened in a viewer\n"
+msgstr	"#Gushyiraho Iposita Idosiye in a"
+
+#: src/lang.c:2243
+#, fuzzy
+msgid	"MIME encoding in mail messages"
+msgstr	"Imisobekere: in Ubutumwa Ubutumwa"
+
+#: src/lang.c:2249
+#, fuzzy
+msgid	"Use 8bit characters in mail headers"
+msgstr	"Inyuguti in Ubutumwa Imitwe"
+
+#: src/lang.c:2250
+#, fuzzy
+msgid	"# If ON, 8bit characters in mail headers are NOT encoded.\n"
+	"# default is OFF. Thus 8bit characters are encoded by default.\n"
+	"# 8bit chars in headers are encoded regardless of the value of this "
+	"parameter\n"
+	"# unless mail_mime_encoding is 8bit as well. Note that RFC 2822\n"
+	"# prohibits 8bit characters in mail headers so that you are advised NOT to\n"
+	"# turn it ON unless you have some compelling reason.\n"
+msgstr	"#Inyuguti in Ubutumwa Imitwe Mburabuzi ni Inyuguti ku Mburabuzi in Imitwe Bya "
+	"i Agaciro Bya iyi ni Nka Inyuguti in Ubutumwa Imitwe"
+
+#: src/lang.c:2260
+#, fuzzy
+msgid	"Strip blanks from ends of lines"
+msgstr	"Bivuye Bya Imirongo"
+
+#: src/lang.c:2261
+#, fuzzy
+msgid	"# If ON strip blanks from ends of lines for faster display on slow "
+	"terminals.\n"
+msgstr	"#Bivuye Bya Imirongo kugirango Kugaragaza ku Buhoro"
+
+#: src/lang.c:2266
+#, fuzzy
+msgid	"If ON, use transliteration. <SPACE> toggles & <CR> sets."
+msgstr	"Gukoresha"
+
+#: src/lang.c:2267
+msgid	"Transliteration"
+msgstr	""
+
+#: src/lang.c:2268
+#, fuzzy
+msgid	"# If ON, use //TRANSLIT extension. This means that when a character cannot\n"
+	"# be represented in the in the target character set, it can be approximated\n"
+	"# through one or several similarly looking characters.\n"
+msgstr	"#Gukoresha Umugereka Ryari: a Inyuguti in i in i Intego Inyuguti Gushyiraho "
+	"Gihinguranya Cyangwa Inyuguti"
+
+#: src/lang.c:2275
+#, fuzzy
+msgid	"Send you a carbon copy automatically. <SPACE> toggles & <CR> sets."
+msgstr	"a Gukoporora ku buryo bwikora"
+
+#: src/lang.c:2276
+#, fuzzy
+msgid	"Send you a cc automatically"
+msgstr	"a KopiKubandi ku buryo bwikora"
+
+#: src/lang.c:2277
+#, fuzzy
+msgid	"# If ON automatically put your name in the Cc: field when mailing an article\n"
+msgstr	"#ku buryo bwikora Gushyira Izina: in i Umwanya Ryari:"
+
+#: src/lang.c:2281
+#, fuzzy
+msgid	"Send you a blind carbon copy automatically. <SPACE> toggles & <CR> sets."
+msgstr	"a Gukoporora ku buryo bwikora"
+
+#: src/lang.c:2282
+#, fuzzy
+msgid	"Send you a blind cc automatically"
+msgstr	"a KopiKubandi ku buryo bwikora"
+
+#: src/lang.c:2283
+#, fuzzy
+msgid	"# If ON automatically put your name in the Bcc: field when mailing an "
+	"article\n"
+msgstr	"#ku buryo bwikora Gushyira Izina: in i Umwanya Ryari:"
+
+#: src/lang.c:2287
+#, fuzzy
+msgid	"Enter address elements about which you want to be warned. <CR> sets."
+msgstr	"Aderesi Ibintu Ibyerekeye Kuri"
+
+#: src/lang.c:2288
+#, fuzzy
+msgid	"Spamtrap warning address parts"
+msgstr	"Iburira Aderesi"
+
+#: src/lang.c:2289
+#, fuzzy
+msgid	"# A comma-delimited list of address-parts you want to be warned\n"
+	"# about when trying to reply by email.\n"
+msgstr	"#A Akitso Urutonde Bya Aderesi Kuri Ibyerekeye Ryari: Kuri Subiza ku imeli"
+
+#: src/lang.c:2294
+#, fuzzy
+msgid	"Enter default number of days a filter entry will be valid. <CR> sets."
+msgstr	"Mburabuzi Umubare Bya Iminsi a Muyunguruzi... Icyinjijwe Byemewe"
+
+#: src/lang.c:2295
+#, fuzzy
+msgid	"No. of days a filter entry is valid"
+msgstr	"Bya Iminsi a Muyunguruzi... Icyinjijwe ni Byemewe"
+
+#: src/lang.c:2296
+#, fuzzy
+msgid	"# Number of days a short term filter will be active\n"
+msgstr	"#Bya Iminsi a Ijambo Muyunguruzi..."
+
+#: src/lang.c:2300
+#, fuzzy
+msgid	"Add posted articles to filter. <SPACE> toggles & <CR> sets."
+msgstr	"Kuri Muyunguruzi..."
+
+#: src/lang.c:2301
+#, fuzzy
+msgid	"Add posted articles to filter"
+msgstr	"Kuri Muyunguruzi..."
+
+#: src/lang.c:2302
+#, fuzzy
+msgid	"# If ON add posted articles which start a new thread to filter for\n"
+	"# highlighting follow-ups\n"
+msgstr	"#Kongeramo Gutangira a Gishya Urudodo Kuri Muyunguruzi... Igaragaza cyane"
+
+#: src/lang.c:2306
+#, fuzzy
+msgid	"The directory where articles/threads are to be saved in mailbox format."
+msgstr	"bushyinguro Kuri in Imiterere"
+
+#: src/lang.c:2307
+#, fuzzy
+msgid	"Mail directory"
+msgstr	"bushyinguro"
+
+#: src/lang.c:2308
+#, fuzzy
+msgid	"# (-m) directory where articles/threads are saved in mailbox format\n"
+msgstr	"#(-M bushyinguro in"
+
+#: src/lang.c:2313
+#, fuzzy
+msgid	"Save articles in batch mode (-S)"
+msgstr	"Kubika in Ubwoko"
+
+#: src/lang.c:2314
+#, fuzzy
+msgid	"# If ON articles/threads will be saved in batch mode when save -S\n"
+	"# or mail (-M/-N) is specified on the command line\n"
+msgstr	"#in Ubwoko Ryari: Kubika Cyangwa Ubutumwa ni ku i Komandi:"
+
+#: src/lang.c:2319
+#, fuzzy
+msgid	"The directory where you want articles/threads saved."
+msgstr	"bushyinguro"
+
+#: src/lang.c:2320
+#, fuzzy
+msgid	"Directory to save arts/threads in"
+msgstr	"Kuri Kubika in"
+
+#: src/lang.c:2321
+msgid	"# Directory where articles/threads are saved\n"
+msgstr	""
+
+#: src/lang.c:2325
+#, fuzzy
+msgid	"Auto save article/thread by Archive-name: header. <SPACE> toggles & <CR> sets."
+msgstr	"Kubika Ingingo Urudodo ku Izina: Umutwempangano"
+
+#: src/lang.c:2326
+#, fuzzy
+msgid	"Use Archive-name: header for save"
+msgstr	"Izina: Umutwempangano kugirango Kubika"
+
+#: src/lang.c:2327
+#, fuzzy
+msgid	"# If ON articles/threads with Archive-name: in mail header will\n"
+	"# be automatically saved with the Archive-name & part/patch no.\n"
+msgstr	"#Na: Izina: in Ubutumwa Umutwempangano ku buryo bwikora Na: i Izina: Oya"
+
+#: src/lang.c:2332
+#, fuzzy
+msgid	"Mark saved articles/threads as read. <SPACE> toggles, <CR> sets, <ESC> "
+	"cancels."
+msgstr	"Nka Gusoma"
+
+#: src/lang.c:2333
+#, fuzzy
+msgid	"Mark saved articles/threads as read"
+msgstr	"Nka Gusoma"
+
+#: src/lang.c:2334
+#, fuzzy
+msgid	"# If ON mark articles that are saved as read\n"
+msgstr	"#Ikimenyetso Nka"
+
+#: src/lang.c:2338
+#, fuzzy
+msgid	"Do post processing (eg. extract attachments) for saved articles."
+msgstr	"Iposita Inonosora Imigereka kugirango"
+
+#: src/lang.c:2339
+msgid	"Post process saved articles"
+msgstr	""
+
+#: src/lang.c:2340
+#, fuzzy
+msgid	"# Perform post processing (saving binary attachments) from saved articles.\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no\n"
+	"#   1 = extract shell archives (shar) only\n"
+	"#   2 = yes\n"
+msgstr	"#Iposita Inonosora Mu kubika Nyabibiri Imigereka Bivuye Uduciro i Mburabuzi "
+	"ni cy/ byagarajwe Na: 0 1. Igikonoshwa Ubushyinguro 2."
+
+#: src/lang.c:2349
+#, fuzzy
+msgid	"Process only unread articles"
+msgstr	"Bidasomye"
+
+#: src/lang.c:2350
+#, fuzzy
+msgid	"# If ON only save/print/pipe/mail unread articles (tagged articles excepted)\n"
+msgstr	"#Kubika Gucapa Ubutumwa Bidasomye"
+
+#: src/lang.c:2355
+#, fuzzy
+msgid	"Print all or just part of header. <SPACE> toggles & <CR> sets."
+msgstr	"Byose Cyangwa Bya Umutwempangano"
+
+#: src/lang.c:2356
+#, fuzzy
+msgid	"Print all headers when printing"
+msgstr	"Byose Imitwe Ryari: Icapa..."
+
+#: src/lang.c:2357
+#, fuzzy
+msgid	"# If ON print all of article header otherwise just the important lines\n"
+msgstr	"#Gucapa Byose Bya Ingingo Umutwempangano i By'ingirakamaro"
+
+#: src/lang.c:2361
+#, fuzzy
+msgid	"The printer program with options that is to be used to print articles/threads."
+msgstr	"Mucapyi Porogaramu Na: Amahitamo ni Kuri Kuri Gucapa"
+
+#: src/lang.c:2362
+#, fuzzy
+msgid	"Printer program with options"
+msgstr	"Porogaramu Na: Amahitamo"
+
+#: src/lang.c:2363
+#, fuzzy
+msgid	"# Print program with parameters used to print articles/threads\n"
+msgstr	"#Porogaramu Na: Ibigenga Kuri Gucapa"
+
+#: src/lang.c:2369
+#, fuzzy
+msgid	"Force redraw after certain commands"
+msgstr	"Kongera Gushushanya Nyuma Amabwiriza"
+
+#: src/lang.c:2370
+#, fuzzy
+msgid	"# If ON a screen redraw will always be done after certain external commands\n"
+msgstr	"#a Mugaragaza Kongera Gushushanya Buri gihe Byakozwe Nyuma external"
+
+#: src/lang.c:2374
+#, fuzzy
+msgid	"Start editor with line offset. <SPACE> toggles, <CR> sets, <ESC> cancels."
+msgstr	"Gutangira Muhinduzi Na: Umurongo Nta- boneza"
+
+#: src/lang.c:2375
+#, fuzzy
+msgid	"Start editor with line offset"
+msgstr	"Gutangira Muhinduzi Na: Umurongo Nta- boneza"
+
+#: src/lang.c:2376
+#, fuzzy
+msgid	"# If ON editor will be started with cursor offset into the file\n"
+	"# otherwise the cursor will be positioned at the first line\n"
+msgstr	"#Muhinduzi Na: indanga Nta- boneza i i indanga ku i Itangira"
+
+#: src/lang.c:2381
+#, fuzzy
+msgid	"Enter %E for editor, %F for filename, %N for line-number, <CR> to set."
+msgstr	"kugirango Muhinduzi kugirango Izina ry'idosiye: kugirango Umurongo Umubare "
+	"Kuri Gushyiraho"
+
+#: src/lang.c:2382
+#, fuzzy
+msgid	"Invocation of your editor"
+msgstr	"Bya Muhinduzi"
+
+#: src/lang.c:2383
+#, fuzzy, c-format
+msgid	"# Format of editor line including parameters\n"
+	"# %%E Editor  %%F Filename  %%N Linenumber\n"
+msgstr	"#Bya Muhinduzi Umurongo"
+
+#: src/lang.c:2388
+#, fuzzy
+msgid	"Enter name and options for external-inews, --internal for internal inews"
+msgstr	"Izina: Na Amahitamo kugirango external By'imbere kugirango By'imbere"
+
+#: src/lang.c:2389
+msgid	"External inews"
+msgstr	""
+
+#: src/lang.c:2390
+#, fuzzy
+msgid	"# If --internal use the built in mini inews for posting via NNTP\n"
+	"# otherwise use an external inews program\n"
+msgstr	"#By'imbere Gukoresha i in kugirango Biturutse Gukoresha external"
+
+#: src/lang.c:2394
+#, fuzzy
+msgid	"Enter %M for mailer, %S for subject, %T for to, %F for filename, <CR> to set."
+msgstr	"kugirango Uwanditse kugirango Ikivugwaho kugirango Kuri kugirango Izina "
+	"ry'idosiye: Kuri Gushyiraho"
+
+#: src/lang.c:2395
+#, fuzzy
+msgid	"Invocation of your mail command"
+msgstr	"Bya Ubutumwa Komandi:"
+
+#: src/lang.c:2396
+#, fuzzy, c-format
+msgid	"# Format of mailer line including parameters\n"
+	"# %%M Mailer  %%S Subject  %%T To  %%F Filename\n"
+	"# ie. to use elm as your mailer:    elm -s \"%%S\" \"%%T\" < %%F\n"
+	"# ie. elm interactive          :    elm -i %%F -s \"%%S\" \"%%T\"\n"
+msgstr	"#Bya Uwanditse Umurongo Kuri Gukoresha Nka Uwanditse S Biganira i S"
+
+#: src/lang.c:2404
+#, fuzzy
+msgid	"Use interactive mail reader"
+msgstr	"Biganira Ubutumwa"
+
+#: src/lang.c:2405
+#, fuzzy
+msgid	"# Interactive mailreader\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no interactive mailreader\n"
+	"#   1 = use interactive mailreader with headers in file\n"
+	"#   2 = use interactive mailreader without headers in file\n"
+msgstr	"#Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 Oya Biganira 1. Gukoresha "
+	"Biganira Na: Imitwe in 2. Gukoresha Biganira Imitwe in"
+
+#: src/lang.c:2414
+#, fuzzy
+msgid	"Remove ~/.article after posting"
+msgstr	"Ingingo Nyuma"
+
+#: src/lang.c:2415
+#, fuzzy
+msgid	"# If ON remove ~/.article after posting.\n"
+msgstr	"#Gukuraho... Ingingo Nyuma"
+
+#: src/lang.c:2419
+#, fuzzy
+msgid	"Filename for all posted articles, <CR> sets, no filename=do not save."
+msgstr	"kugirango Byose Oya Izina ry'idosiye: OYA Kubika"
+
+#: src/lang.c:2420
+#, fuzzy
+msgid	"Filename for posted articles"
+msgstr	"kugirango"
+
+#: src/lang.c:2421
+#, fuzzy
+msgid	"# Filename where to keep all postings (default posted)\n"
+	"# If no filename is set then postings will not be saved\n"
+msgstr	"#Kuri Gumana: Byose Mburabuzi Oya Izina ry'idosiye: ni Gushyiraho Hanyuma OYA"
+
+#: src/lang.c:2426
+#, fuzzy
+msgid	"Keep all failed articles in ~/dead.articles. <SPACE> toggles & <CR> sets."
+msgstr	"Byose Byanze in"
+
+#: src/lang.c:2427
+#, fuzzy
+msgid	"Keep failed arts in ~/dead.articles"
+msgstr	"Byanze in"
+
+#: src/lang.c:2428
+#, fuzzy
+msgid	"# If ON keep all failed postings in ~/dead.articles\n"
+msgstr	"#Gumana: Byose Byanze in"
+
+#: src/lang.c:2432
+#, fuzzy
+msgid	"Do you want to strip unsubscribed groups from .newsrc"
+msgstr	"Kuri Amatsinda Bivuye"
+
+#: src/lang.c:2433
+#, fuzzy
+msgid	"No unsubscribed groups in newsrc"
+msgstr	"Amatsinda in"
+
+#: src/lang.c:2434
+#, fuzzy
+msgid	"# If ON strip unsubscribed groups from newsrc\n"
+msgstr	"#Amatsinda Bivuye"
+
+#: src/lang.c:2439
+#, fuzzy
+msgid	"Remove bogus groups from newsrc"
+msgstr	"Amatsinda Bivuye"
+
+#: src/lang.c:2440
+#, fuzzy
+msgid	"# What to do with bogus groups in newsrc file\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = keep\n"
+	"#   1 = remove\n"
+	"#   2 = highlight with D on selection screen\n"
+msgstr	"#Kuri Na: Amatsinda in Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 1. 2. "
+	"garagaza cyane Na: ku Ihitamo"
+
+#: src/lang.c:2448
+#, fuzzy
+msgid	"Enter number of seconds until active file will be reread. <CR> sets."
+msgstr	"Umubare Bya amasogonda Gikora IDOSIYE"
+
+#: src/lang.c:2449
+#, fuzzy
+msgid	"Interval in secs to reread active"
+msgstr	"in Kuri Gikora"
+
+#: src/lang.c:2450
+#, fuzzy
+msgid	"# Time interval in seconds between rereading the active file (0=never)\n"
+msgstr	"#Intera in amasogonda hagati i Gikora IDOSIYE 0 Nta narimwe"
+
+#: src/lang.c:2455
+#, fuzzy
+msgid	"Reconnect to server automatically"
+msgstr	"Kongerakwihuza Kuri Seriveri ku buryo bwikora"
+
+#: src/lang.c:2456
+#, fuzzy
+msgid	"# If ON automatically reconnect to NNTP server if the connection is broken\n"
+msgstr	"#ku buryo bwikora Kuri Seriveri NIBA i Ukwihuza ni"
+
+#: src/lang.c:2460
+#, fuzzy
+msgid	"Create local copies of NNTP overview files. <SPACE> toggles & <CR> sets."
+msgstr	"Amakopi Bya Incamake Idosiye"
+
+#: src/lang.c:2461
+#, fuzzy
+msgid	"Cache NNTP overview files locally"
+msgstr	"Incamake Idosiye"
+
+#: src/lang.c:2462
+#, fuzzy
+msgid	"# If ON, create local copies of NNTP overview files.\n"
+msgstr	"#Kurema Amakopi Bya Incamake Idosiye"
+
+#: src/lang.c:2466
+#, fuzzy
+msgid	"Enter format string. <CR> sets, <ESC> cancels."
+msgstr	"Imiterere Ikurikiranyanyuguti"
+
+#: src/lang.c:2467
+#, fuzzy
+msgid	"Format string for display of dates"
+msgstr	"Ikurikiranyanyuguti kugirango Kugaragaza Bya Amatariki"
+
+#: src/lang.c:2468
+#, fuzzy
+msgid	"# Format string for date representation\n"
+msgstr	"#Ikurikiranyanyuguti kugirango Itariki"
+
+#: src/lang.c:2474
+#, fuzzy
+msgid	"Unicode normalization form"
+msgstr	"Ifishi"
+
+#: src/lang.c:2475
+#, fuzzy
+msgid	"# Unicode normalization form\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = None\n"
+	"# * 1 = NFKC\n"
+	"#   2 = NFKD\n"
+	"#   3 = NFC\n"
+	"#   4 = NFD\n"
+msgstr	"#Uduciro i Mburabuzi ni cy/ byagarajwe Na: 0 1. 2. 3. 4."
+
+#: src/lang.c:2487
+msgid	"Render BiDi"
+msgstr	""
+
+#: src/lang.c:2488
+#, fuzzy
+msgid	"# If ON, bi-directional text is rendered by tin\n"
+msgstr	"#Umwandiko ni ku"
+
+#: src/misc.c:3750
+#, c-format
+msgid	"Version: %s %s release %s (\"%s\") %s %s\n"
+msgstr	""
+
+#: src/misc.c:3753
+#, c-format
+msgid	"Version: %s %s release %s (\"%s\")\n"
+msgstr	""
+
+#: src/newsrc.c:430
+msgid	"Unreachable?\n"
+msgstr	""
+
+#: src/nntplib.c:824
+#, fuzzy, c-format
+msgid	"\n"
+	"Server timed out, trying reconnect # %d\n"
+msgstr	"Inyuma"
+
+#: src/nntplib.c:842
+#, fuzzy
+msgid	"Rejoin current group\n"
+msgstr	"KIGEZWEHO"
+
+# svx/inc\globlmn.hrc:ITEM_FILE_MAIL_INBOX.text
+#: src/nntplib.c:849
+#, fuzzy, c-format
+msgid	"Read (%s)\n"
+msgstr	"Gusoma"
+
+#: src/nntplib.c:851
+#, fuzzy, c-format
+msgid	"Resend last command (%s)\n"
+msgstr	"Iheruka Komandi:"
+
+#.
+#. * TODO: - store a hash value of the entire motd in the server-rc
+#. *         and only if it differs from the old value display the
+#. *         motd?
+#. *       - use some sort of pager?
+#. *       - -> lang.c
+#.
+#: src/nntplib.c:1759
+msgid	"MOTD: "
+msgstr	""
+
+#: src/nrctbl.c:170
+#, fuzzy, c-format
+msgid	"couldn't expand %s\n"
+msgstr	"Kwagura"
+
+#: src/post.c:1171
+#, c-format
+msgid	"Line %d is longer than 998 octets and should be folded, but\n"
+	"encoding is neither set to %s nor to %s\n"
+msgstr	""
+
+#: src/post.c:1176
+#, c-format
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is set to %s without enabling MIME_BREAK_LONG_LINES or\n"
+	"posting doesn't contain any 8bit chars and thus folding won't happen\n"
+msgstr	""
+
+#: src/post.c:1178
+#, c-format
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is not set to %s\n"
+msgstr	""
+
+#: src/post.c:1993
+#, fuzzy, c-format
+msgid	"Posting: %.*s ..."
+msgstr	"S"
+
+#. Check if okay to read
+#: src/read.c:211
+#, fuzzy
+msgid	"Aborting read, please wait..."
+msgstr	"Gusoma Tegereza"
+
+#: src/read.c:358
+msgid	"Aborted read\n"
+msgstr	""
+
+#: src/read.c:414
+msgid	"Draining\n"
+msgstr	""
+
+#. Don't hash the initial '<'
+#: src/refs.c:251
+msgid	"unchanged"
+msgstr	""
+
+#: src/refs.c:609
+msgid	"[- Unavailable -]"
+msgstr	""
+
+#.
+#. * preamble
+#. * TODO: -> lang.c
+#.
+#: src/rfc2047.c:1201
+#, fuzzy, c-format
+msgid	"This message has been composed in the 'multipart/mixed' MIME-format. If you\n"
+	"are reading this prefix, your mail reader probably has not yet been modified\n"
+	"to understand the new format, and some of what follows may look strange.\n"
+	"\n"
+msgstr	"Ubutumwa in i Imiterere iyi Imbanziriza Ubutumwa OYA i Gishya Imiterere Na "
+	"Bya Gicurasi"
+
+#: src/save.c:972
+#, fuzzy
+msgid	"bytes"
+msgstr	"Bayite"
+
+#: src/select.c:379
+#, fuzzy
+msgid	"unread"
+msgstr	"Bidasomye"
+
+#: src/select.c:379
+#, fuzzy
+msgid	"all"
+msgstr	"Byose"
+
+#: src/select.c:549 src/select.c:551
+#, fuzzy
+msgid	" R"
+msgstr	" R"
+
+#. TODO: use tin global 'homedir' instead? or even rcdir?
+#: src/xface.c:91
+#, fuzzy, c-format
+msgid	"Can't run slrnface: Environment variable %s not found."
+msgstr	"Gukoresha IMPINDURAGACIRO OYA Byabonetse"
+
+#: src/xface.c:99 src/xface.c:131
+#, fuzzy, c-format
+msgid	"Can't run slrnface: failed to create %s"
+msgstr	"Gukoresha Byanze Kuri Kurema"
+
+#: src/xface.c:109
+#, fuzzy
+msgid	"This directory is used to create named pipes for communication between\n"
+	"slrnface and its parent process. It should normally be empty because\n"
+	"the pipe is deleted right after it has been opened by both processes.\n"
+	"\n"
+	"File names generated by slrnface have the form \"hostname.pid\". It is\n"
+	"probably an error if they linger here longer than a fraction of a second.\n"
+	"\n"
+	"However, if the directory is mounted from an NFS server, you might see\n"
+	"special files created by your NFS server while slrnface is running.\n"
+	"Do not try to remove them.\n"
+msgstr	"bushyinguro ni Kuri Kurema kugirango Itumanaho Na ubusa ni Cyasibwe Iburyo: "
+	"Nyuma ku Byombi Idosiye Amazina ku i Ifishi Izina ry'inturo: Ikosa NIBA a "
+	"Imigabane Bya a ISEGONDA NIBA i bushyinguro ni Bivuye Seriveri Idosiye "
+	"Byaremwe ku Seriveri ni OYA Kuri Gukuraho..."
+
+#: src/xface.c:123
+#, fuzzy
+msgid	"Can't run slrnface: couldn't construct fifo name."
+msgstr	"Gukoresha Izina:"
+
+#: src/xface.c:162
+#, fuzzy, c-format
+msgid	"Slrnface abnormally exited, code %d."
+msgstr	"ITEGEKONGENGA"
+
+#: src/xface.c:206
+#, fuzzy, c-format
+msgid	"Slrnface failed: %s."
+msgstr	"Byanze"
diff -Nurp tin-1.6.2/po/tin.pot tin-1.8.0/po/tin.pot
--- tin-1.6.2/po/tin.pot	2003-09-10 17:05:47.000000000 +0200
+++ tin-1.8.0/po/tin.pot	2005-12-24 19:09:58.886251067 +0100
@@ -1,233 +1,310 @@
 # SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR Free Software Foundation, Inc.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2003-09-10 17:05+0200\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-24 19:09+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=CHARSET\n"
-"Content-Transfer-Encoding: ENCODING\n"
+"Content-Transfer-Encoding: 8bit\n"
 
-#: src/attrib.c:574
+#: src/art.c:1533
+#, c-format
+msgid "%d Bad overview record (%d fields) '%s'"
+msgstr ""
+
+#: src/attrib.c:649
+#, c-format
 msgid ""
 "# Do not edit this comment block\n"
 "#\n"
 msgstr ""
 
-#: src/attrib.c:575
+#: src/attrib.c:650
+#, c-format
 msgid "#  scope=STRING (ie. alt.*,!alt.bin*) [mandatory]\n"
 msgstr ""
 
-#: src/attrib.c:576
+#: src/attrib.c:651
+#, c-format
 msgid "#  maildir=STRING (ie. ~/Mail)\n"
 msgstr ""
 
-#: src/attrib.c:577
+#: src/attrib.c:652
+#, c-format
 msgid "#  savedir=STRING (ie. ~user/News)\n"
 msgstr ""
 
-#: src/attrib.c:578
+#: src/attrib.c:653
+#, c-format
 msgid "#  savefile=STRING (ie. =linux)\n"
 msgstr ""
 
-#: src/attrib.c:579
+#: src/attrib.c:654
+#, c-format
 msgid "#  sigfile=STRING (ie. $var/sig)\n"
 msgstr ""
 
-#: src/attrib.c:580
+#: src/attrib.c:655
+#, c-format
 msgid "#  organization=STRING (if beginning with '/' read from file)\n"
 msgstr ""
 
-#: src/attrib.c:581
+#: src/attrib.c:656
+#, c-format
 msgid "#  followup_to=STRING\n"
 msgstr ""
 
-#: src/attrib.c:582
+#: src/attrib.c:657
+#, c-format
 msgid "#  mailing_list=STRING (ie. majordomo@example.org)\n"
 msgstr ""
 
-#: src/attrib.c:583
+#: src/attrib.c:658
+#, c-format
 msgid "#  x_headers=STRING (ie. ~/.tin/extra-headers)\n"
 msgstr ""
 
-#: src/attrib.c:584
+#: src/attrib.c:659
+#, c-format
 msgid "#  x_body=STRING (ie. ~/.tin/extra-body-text)\n"
 msgstr ""
 
-#: src/attrib.c:585
+#: src/attrib.c:660
+#, c-format
 msgid "#  from=STRING (just append wanted From:-line, don't use quotes)\n"
 msgstr ""
 
-#: src/attrib.c:586
+#: src/attrib.c:661
+#, c-format
 msgid "#  news_quote_format=STRING\n"
 msgstr ""
 
-#: src/attrib.c:587
+#: src/attrib.c:662
+#, c-format
 msgid "#  quote_chars=STRING (%%s, %%S for initials)\n"
 msgstr ""
 
-#: src/attrib.c:588
+#: src/attrib.c:663
+#, c-format
 msgid "#  mime_types_to_save=STRING (eg. image/*,!image/bmp)\n"
 msgstr ""
 
-#: src/attrib.c:590
+#: src/attrib.c:665
+#, c-format
 msgid "#  ispell=STRING\n"
 msgstr ""
 
-#: src/attrib.c:592
+#: src/attrib.c:667
+#, c-format
 msgid "#  auto_select=ON/OFF\n"
 msgstr ""
 
-#: src/attrib.c:593
+#: src/attrib.c:668
+#, c-format
 msgid "#  auto_save=ON/OFF\n"
 msgstr ""
 
-#: src/attrib.c:594
+#: src/attrib.c:669
+#, c-format
 msgid "#  batch_save=ON/OFF\n"
 msgstr ""
 
-#: src/attrib.c:595
+#: src/attrib.c:670
+#, c-format
 msgid "#  delete_tmp_files=ON/OFF\n"
 msgstr ""
 
-#: src/attrib.c:596
+#: src/attrib.c:671
+#, c-format
 msgid "#  show_only_unread=ON/OFF\n"
 msgstr ""
 
-#: src/attrib.c:597
+#: src/attrib.c:672
+#, c-format
 msgid "#  thread_arts=NUM"
 msgstr ""
 
-#: src/attrib.c:604
+#: src/attrib.c:679
+#, c-format
+msgid "#  thread_perc=NUM\n"
+msgstr ""
+
+#: src/attrib.c:680
+#, c-format
 msgid "#  show_author=NUM\n"
 msgstr ""
 
-#: src/attrib.c:610
+#: src/attrib.c:686
+#, c-format
+msgid "#  show_info=NUM\n"
+msgstr ""
+
+#: src/attrib.c:692
+#, c-format
 msgid "#  sort_art_type=NUM\n"
 msgstr ""
 
-#: src/attrib.c:628
+#: src/attrib.c:710
+#, c-format
 msgid "#  sort_threads_type=NUM\n"
 msgstr ""
 
-#: src/attrib.c:633
+#: src/attrib.c:715
+#, c-format
 msgid "#  post_proc_type=NUM\n"
 msgstr ""
 
-#: src/attrib.c:638
+#: src/attrib.c:720
+#, c-format
 msgid "#  quick_kill_scope=STRING (ie. talk.*)\n"
 msgstr ""
 
-#: src/attrib.c:639
+#: src/attrib.c:721
+#, c-format
 msgid "#  quick_kill_expire=ON/OFF\n"
 msgstr ""
 
-#: src/attrib.c:640
+#: src/attrib.c:722
+#, c-format
 msgid "#  quick_kill_case=ON/OFF\n"
 msgstr ""
 
-#: src/attrib.c:641
+#: src/attrib.c:723
+#, c-format
 msgid "#  quick_kill_header=NUM\n"
 msgstr ""
 
-#: src/attrib.c:642 src/attrib.c:649
+#: src/attrib.c:724 src/attrib.c:731
+#, c-format
 msgid "#    0=subj (case sensitive) 1=subj (ignore case)\n"
 msgstr ""
 
-#: src/attrib.c:643 src/attrib.c:650
+#: src/attrib.c:725 src/attrib.c:732
+#, c-format
 msgid "#    2=from (case sensitive) 3=from (ignore case)\n"
 msgstr ""
 
-#: src/attrib.c:644 src/attrib.c:651
+#: src/attrib.c:726 src/attrib.c:733
+#, c-format
 msgid "#    4=msgid 5=lines\n"
 msgstr ""
 
-#: src/attrib.c:645
+#: src/attrib.c:727
+#, c-format
 msgid "#  quick_select_scope=STRING\n"
 msgstr ""
 
-#: src/attrib.c:646
+#: src/attrib.c:728
+#, c-format
 msgid "#  quick_select_expire=ON/OFF\n"
 msgstr ""
 
-#: src/attrib.c:647
+#: src/attrib.c:729
+#, c-format
 msgid "#  quick_select_case=ON/OFF\n"
 msgstr ""
 
-#: src/attrib.c:648
+#: src/attrib.c:730
+#, c-format
 msgid "#  quick_select_header=NUM\n"
 msgstr ""
 
-#: src/attrib.c:652
+#: src/attrib.c:734
+#, c-format
 msgid "#  x_comment_to=ON/OFF\n"
 msgstr ""
 
-#: src/attrib.c:653
+#: src/attrib.c:735
+#, c-format
+msgid "#  fcc=STRING (eg. =mailbox)\n"
+msgstr ""
+
+#: src/attrib.c:736
+#, c-format
 msgid "#  tex2iso_conv=ON/OFF\n"
 msgstr ""
 
-#: src/attrib.c:655
+#: src/attrib.c:737
+#, c-format
+msgid "#  mime_forward=ON/OFF\n"
+msgstr ""
+
+#: src/attrib.c:739
+#, c-format
 msgid "#  mm_network_charset=supported_charset"
 msgstr ""
 
-#: src/attrib.c:662
+#: src/attrib.c:746
+#, c-format
 msgid "#  undeclared_charset=STRING (default is US-ASCII)\n"
 msgstr ""
 
-#: src/attrib.c:664
+#: src/attrib.c:748
+#, c-format
 msgid ""
 "#\n"
 "# Note that it is best to put general (global scoping)\n"
 msgstr ""
 
-#: src/attrib.c:665
+#: src/attrib.c:749
+#, c-format
 msgid ""
 "# entries first followed by group specific entries.\n"
 "#\n"
 msgstr ""
 
-#: src/attrib.c:666
+#: src/attrib.c:750
+#, c-format
 msgid ""
-"############################################################################"
-"\n"
+"############################################################################\n"
 "\n"
 msgstr ""
 
-#: src/attrib.c:672
+#: src/attrib.c:756
+#, c-format
 msgid "# include extra headers\n"
 msgstr ""
 
-#: src/attrib.c:680
+#: src/attrib.c:764
+#, c-format
 msgid "# in *sources* set post process type to shar only\n"
 msgstr ""
 
-#: src/attrib.c:684
-msgid "# in *binaries* do full post processing, remove tmp files\n"
+#: src/attrib.c:768
+#, c-format
+msgid "# in *binaries* do full post processing but no TeX2ISO conversion,\n"
 msgstr ""
 
-#: src/attrib.c:685
-msgid "# and set Followup-To: poster\n"
+#: src/attrib.c:769
+#, c-format
+msgid "# remove tmp files and set Followup-To: poster\n"
 msgstr ""
 
-#: src/cook.c:799
+#: src/cook.c:499
 msgid "(unknown)"
 msgstr ""
 
 #.
 #. * TODO: add to the right rule, give better explanation, -> lang.c
 #.
-#: src/filter.c:604 src/filter.c:612
+#: src/filter.c:597 src/filter.c:605
 msgid "Removed from the previous rule: "
 msgstr ""
 
+#: src/keymap.c:271
+msgid "NULL"
+msgstr ""
+
 #: src/lang.c:42
-#, c-format
-msgid "1 Response%s"
+msgid "1 Response"
 msgstr ""
 
 #: src/lang.c:46
@@ -451,7 +528,8 @@ msgid "*** Beginning of article ***"
 msgstr ""
 
 #: src/lang.c:97
-msgid "Cancel (delete) or supersede (overwrite) article [%%.*s]? (%s/%s/%s): "
+#, c-format
+msgid "Cancel (delete) or supersede (overwrite) article [%%s]? (%s/%s/%s): "
 msgstr ""
 
 #: src/lang.c:98
@@ -540,272 +618,272 @@ msgstr ""
 msgid "Post-process %s=no, %s=yes, %s=shar, %s=quit: "
 msgstr ""
 
-#: src/lang.c:118
+#: src/lang.c:119
 msgid "ANSI color disabled"
 msgstr ""
 
-#: src/lang.c:119
+#: src/lang.c:120
 msgid "ANSI color enabled"
 msgstr ""
 
-#: src/lang.c:120
+#: src/lang.c:122
 #, c-format
 msgid "Command failed: %s"
 msgstr ""
 
-#: src/lang.c:121
+#: src/lang.c:123
 msgid "Mark not selected articles read?"
 msgstr ""
 
-#: src/lang.c:122
+#: src/lang.c:124
 #, c-format
 msgid "Connecting to %s..."
 msgstr ""
 
-#: src/lang.c:123
+#: src/lang.c:125
 msgid "<CR>"
 msgstr ""
 
-#: src/lang.c:124
+#: src/lang.c:126
 msgid "Creating active file for saved groups...\n"
 msgstr ""
 
-#: src/lang.c:125
+#: src/lang.c:127
 msgid "Creating newsrc file...\n"
 msgstr ""
 
-#: src/lang.c:127 src/lang.c:1129
+#: src/lang.c:129 src/lang.c:1150
 msgid "Default"
 msgstr ""
 
-#: src/lang.c:128
+#: src/lang.c:130
 msgid "Delete saved files that have been post processed?"
 msgstr ""
 
-#: src/lang.c:129
+#: src/lang.c:131
 msgid "Deleting temporary files..."
 msgstr ""
 
-#: src/lang.c:131
+#: src/lang.c:133
 msgid "*** End of article ***"
 msgstr ""
 
-#: src/lang.c:132
+#: src/lang.c:134
 msgid "*** End of articles ***"
 msgstr ""
 
-#: src/lang.c:133
+#: src/lang.c:135
 msgid "*** End of groups ***"
 msgstr ""
 
-#: src/lang.c:134
+#: src/lang.c:136
 msgid "*** End of thread ***"
 msgstr ""
 
-#: src/lang.c:135
+#: src/lang.c:137
 msgid "Enter limit of articles to get> "
 msgstr ""
 
-#: src/lang.c:136
+#: src/lang.c:138
 msgid "Enter Message-ID to go to> "
 msgstr ""
 
-#: src/lang.c:137
+#: src/lang.c:139
 msgid " and enter next unread thread"
 msgstr ""
 
-#: src/lang.c:138
+#: src/lang.c:140
 msgid " and enter next unread group"
 msgstr ""
 
-#: src/lang.c:139
+#: src/lang.c:141
 msgid "Enter option number> "
 msgstr ""
 
-#: src/lang.c:140
+#: src/lang.c:142
 #, c-format
 msgid "Enter range [%s]> "
 msgstr ""
 
-#: src/lang.c:141
+#: src/lang.c:143
 msgid ""
 "\n"
 "Warning: Approved: header used.\n"
 msgstr ""
 
-#: src/lang.c:143
+#: src/lang.c:145
 msgid ""
 "\n"
 "Error: Bad address in Approved: header.\n"
 msgstr ""
 
-#: src/lang.c:144
+#: src/lang.c:146
 msgid ""
 "\n"
 "Error: Bad address in From: header.\n"
 msgstr ""
 
-#: src/lang.c:145
+#: src/lang.c:147
 msgid ""
 "\n"
 "Error: Bad address in Reply-To: header.\n"
 msgstr ""
 
-#: src/lang.c:146
+#: src/lang.c:148
 msgid ""
 "\n"
 "Error: Bad FQDN in Message-ID: header.\n"
 msgstr ""
 
-#: src/lang.c:147
+#: src/lang.c:149
 #, c-format
 msgid "Can't unlock %s"
 msgstr ""
 
-#: src/lang.c:149
+#: src/lang.c:151
 #, c-format
 msgid "Corrupted file %s"
 msgstr ""
 
-#: src/lang.c:150
+#: src/lang.c:152
 #, c-format
 msgid "Couldn't dotlock %s - article not appended!"
 msgstr ""
 
-#: src/lang.c:151
+#: src/lang.c:153
 #, c-format
 msgid "Couldn't lock %s - article not appended!"
 msgstr ""
 
-#: src/lang.c:153
+#: src/lang.c:155
 msgid "Internal error in GNKSA routine - send bug report.\n"
 msgstr ""
 
-#: src/lang.c:154
+#: src/lang.c:156
 msgid "Left angle bracket missing in route address.\n"
 msgstr ""
 
-#: src/lang.c:155
+#: src/lang.c:157
 msgid "Left parenthesis missing in old-style address.\n"
 msgstr ""
 
-#: src/lang.c:156
+#: src/lang.c:158
 msgid "Right parenthesis missing in old-style address.\n"
 msgstr ""
 
-#: src/lang.c:157
+#: src/lang.c:159
 msgid "At-sign missing in mail address.\n"
 msgstr ""
 
-#: src/lang.c:158
+#: src/lang.c:160
 msgid "Single component FQDN is not allowed. Add your domain.\n"
 msgstr ""
 
-#: src/lang.c:159
+#: src/lang.c:161
 msgid ""
 "Invalid domain. Send bug report if your top level domain really exists.\n"
 "Use .invalid as top level domain for munged addresses.\n"
 msgstr ""
 
-#: src/lang.c:160
+#: src/lang.c:162
 msgid ""
 "Illegal domain. Send bug report if your top level domain really exists.\n"
 "Use .invalid as top level domain for munged addresses.\n"
 msgstr ""
 
-#: src/lang.c:161
+#: src/lang.c:163
 msgid ""
 "Unknown domain. Send bug report if your top level domain really exists.\n"
 "Use .invalid as top level domain for munged addresses.\n"
 msgstr ""
 
-#: src/lang.c:162
+#: src/lang.c:164
 msgid "Illegal character in FQDN.\n"
 msgstr ""
 
-#: src/lang.c:163
+#: src/lang.c:165
 msgid "Zero length FQDN component not allowed.\n"
 msgstr ""
 
-#: src/lang.c:164
+#: src/lang.c:166
 msgid "FQDN component exceeds maximum allowed length (63 chars).\n"
 msgstr ""
 
-#: src/lang.c:165
+#: src/lang.c:167
 msgid "FQDN component may not start or end with hyphen.\n"
 msgstr ""
 
-#: src/lang.c:166
+#: src/lang.c:168
 msgid "FQDN component may not start with digit.\n"
 msgstr ""
 
-#: src/lang.c:167
+#: src/lang.c:169
 msgid "Domain literal has impossible numeric value.\n"
 msgstr ""
 
-#: src/lang.c:168
+#: src/lang.c:170
 msgid ""
 "Domain literal is for private use only and not allowed for global use.\n"
 msgstr ""
 
-#: src/lang.c:169
+#: src/lang.c:171
 msgid "Right bracket missing in domain literal.\n"
 msgstr ""
 
-#: src/lang.c:170
+#: src/lang.c:172
 msgid "Missing localpart of mail address.\n"
 msgstr ""
 
-#: src/lang.c:171
+#: src/lang.c:173
 msgid "Illegal character in localpart of mail address.\n"
 msgstr ""
 
-#: src/lang.c:172
+#: src/lang.c:174
 msgid "Zero length localpart component not allowed.\n"
 msgstr ""
 
-#: src/lang.c:173
+#: src/lang.c:175
 msgid ""
 "Illegal character in realname.\n"
 "Unquoted words may not contain '!()<>@,;:\\.[]' in route addresses.\n"
 msgstr ""
 
-#: src/lang.c:174
+#: src/lang.c:176
 msgid ""
 "Illegal character in realname.\n"
 "Quoted words may not contain '()<>\\'.\n"
 msgstr ""
 
-#: src/lang.c:175
+#: src/lang.c:177
 msgid ""
 "Illegal character in realname.\n"
 "Encoded words may not contain '!()<>@,;:\"\\.[]/=' in parameter.\n"
 msgstr ""
 
-#: src/lang.c:176
+#: src/lang.c:178
 msgid "Bad syntax in encoded word used in realname.\n"
 msgstr ""
 
-#: src/lang.c:177
+#: src/lang.c:179
 msgid ""
 "Illegal character in realname.\n"
 "Unquoted words may not contain '()<>\\' in old-style addresses.\n"
 msgstr ""
 
-#: src/lang.c:178
+#: src/lang.c:180
 msgid ""
 "Illegal character in realname.\n"
 "Control characters and unencoded 8bit characters > 127 are not allowed.\n"
 msgstr ""
 
-#: src/lang.c:179
+#: src/lang.c:181
 msgid ""
 "\n"
 "Error: No blank line found after header.\n"
 msgstr ""
 
 #. TODO: fixme, US-ASCII is not the only 7bit charset we know about
-#: src/lang.c:181
+#: src/lang.c:183
 msgid ""
 "\n"
 "Error: Posting contains non-ASCII characters but MM_CHARSET is set to\n"
@@ -814,7 +892,7 @@ msgid ""
 "       editing tinrc.\n"
 msgstr ""
 
-#: src/lang.c:186
+#: src/lang.c:188
 msgid ""
 "\n"
 "Error: Posting contains  non-ASCII characters  but the  MIME encoding\n"
@@ -824,13 +902,13 @@ msgid ""
 "       using the M)enu of configurable options or by editing tinrc.\n"
 msgstr ""
 
-#: src/lang.c:192
+#: src/lang.c:194
 msgid ""
 "\n"
 "Error: Article starts with blank line instead of header\n"
 msgstr ""
 
-#: src/lang.c:193
+#: src/lang.c:195
 #, c-format
 msgid ""
 "\n"
@@ -838,21 +916,21 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: src/lang.c:194
+#: src/lang.c:196
 #, c-format
 msgid ""
 "\n"
 "Error: The \"%s:\" line is empty.\n"
 msgstr ""
 
-#: src/lang.c:195
+#: src/lang.c:197
 #, c-format
 msgid ""
 "\n"
 "Error: The \"%s:\" line is missing from the article header.\n"
 msgstr ""
 
-#: src/lang.c:196
+#: src/lang.c:198
 #, c-format
 msgid ""
 "\n"
@@ -860,144 +938,152 @@ msgid ""
 "%s\n"
 msgstr ""
 
-#: src/lang.c:197
+#: src/lang.c:199
 #, c-format
 msgid ""
 "\n"
 "Error: There are multiple (%d) \"%s:\" lines in the header.\n"
 msgstr ""
 
-#: src/lang.c:198
+#: src/lang.c:200
 #, c-format
 msgid "Insecure permissions of %s (%o)"
 msgstr ""
 
-#: src/lang.c:199 src/open.c:1009
+#: src/lang.c:201
 #, c-format
 msgid "Invalid response to GROUP command, %s"
 msgstr ""
 
-#: src/lang.c:201
+#: src/lang.c:203
 #, c-format
 msgid "MIME parse error: Unexpected end of %s/%s article"
 msgstr ""
 
-#: src/lang.c:202
+#: src/lang.c:204
 msgid "MIME parse error: Start boundary whilst reading headers"
 msgstr ""
 
-#: src/lang.c:203
+#: src/lang.c:205
 msgid "Can't get a (fully-qualified) domain-name!"
 msgstr ""
 
-#: src/lang.c:204
+#: src/lang.c:206
 #, c-format
 msgid "No permissions to go into %s\n"
 msgstr ""
 
-#: src/lang.c:205
+#: src/lang.c:207
 msgid ""
 "\n"
 "Error: From: line missing.\n"
 msgstr ""
 
-#: src/lang.c:206
+#: src/lang.c:208
 #, c-format
 msgid "No read permissions for %s\n"
 msgstr ""
 
-#: src/lang.c:207
+#: src/lang.c:209
 #, c-format
 msgid "File %s does not exist\n"
 msgstr ""
 
-#: src/lang.c:208
+#: src/lang.c:210
 #, c-format
 msgid "No write permissions for %s\n"
 msgstr ""
 
-#: src/lang.c:209
+#: src/lang.c:211
 msgid "Can't get user information (/etc/passwd missing?)"
 msgstr ""
 
-#: src/lang.c:210
+#: src/lang.c:212
 msgid "errors"
 msgstr ""
 
-#: src/lang.c:211
+#: src/lang.c:213
 #, c-format
 msgid ""
 "\n"
 "Error on line %d: \"Sender:\" header not allowed (it will be added for you)\n"
 msgstr ""
 
-#: src/lang.c:212
+#: src/lang.c:214
 #, c-format
 msgid "Server has non of the groups listed in %s"
 msgstr ""
 
-#: src/lang.c:213
+#: src/lang.c:215
 msgid "error"
 msgstr ""
 
-#: src/lang.c:214
+#: src/lang.c:216
 msgid "Unknown display level"
 msgstr ""
 
-#: src/lang.c:215
+#: src/lang.c:217
 msgid "<ESC>"
 msgstr ""
 
-#: src/lang.c:216
+#: src/lang.c:218
 msgid "Exiting..."
 msgstr ""
 
-#: src/lang.c:217
+#: src/lang.c:219
 msgid "leaving external mail-reader"
 msgstr ""
 
-#: src/lang.c:218
+#: src/lang.c:220
 #, c-format
 msgid "Extracting %s..."
 msgstr ""
 
-#: src/lang.c:220
+#: src/lang.c:222
 #, c-format
 msgid "Error writing %s file. Filesystem full? File reset to previous state."
 msgstr ""
 
-#: src/lang.c:221
+#: src/lang.c:223
 #, c-format
 msgid "Error making backup of %s file. Filesystem full?"
 msgstr ""
 
-#: src/lang.c:222
+#: src/lang.c:224
 #, c-format
 msgid "Filtering global rules (%d/%d)..."
 msgstr ""
 
-#: src/lang.c:223
+#: src/lang.c:225
 msgid "Rule created by: "
 msgstr ""
 
-#: src/lang.c:224
+#: src/lang.c:226
 #, c-format
 msgid "Enter pattern [%s]> "
 msgstr ""
 
-#: src/lang.c:225
+#: src/lang.c:227
 #, c-format
 msgid ""
 "\n"
 "You requested followups to your article to go to the following %s:\n"
 msgstr ""
 
-#: src/lang.c:226
+#: src/lang.c:228
 #, c-format
 msgid "  %s\t Answers will be directed to you by mail.\n"
 msgstr ""
 
-#: src/lang.c:227
+#: src/lang.c:229
+msgid "-- forwarded message --\n"
+msgstr ""
+
+#: src/lang.c:230
+msgid "-- end of forwarded message --\n"
+msgstr ""
+
+#: src/lang.c:231
 msgid ""
 "# Format:\n"
 "#   comment=STRING    Optional. Multiple lines allowed. Comments must be "
@@ -1028,735 +1114,757 @@ msgid ""
 "#\n"
 msgstr ""
 
-#: src/lang.c:248
+#: src/lang.c:252
 #, c-format
 msgid "Enter score for rule (default=%d): "
 msgstr ""
 
-#: src/lang.c:249
+#: src/lang.c:253
 #, c-format
 msgid "Enter the score weight (range 0 < score <= %d)"
 msgstr ""
 
 #. SCORE_MAX
-#: src/lang.c:250
+#: src/lang.c:254
 msgid "Full"
 msgstr ""
 
-#: src/lang.c:251
+#: src/lang.c:255
 msgid "Comment (optional)  : "
 msgstr ""
 
-#: src/lang.c:252
+#: src/lang.c:256
 msgid "Apply pattern to    : "
 msgstr ""
 
-#: src/lang.c:253
+#: src/lang.c:257
 msgid "From: line (ignore case)      "
 msgstr ""
 
-#: src/lang.c:254
+#: src/lang.c:258
 msgid "From: line (case sensitive)   "
 msgstr ""
 
-#: src/lang.c:256
+#: src/lang.c:260
 #, c-format
 msgid "%s%s: Unknown host.\n"
 msgstr ""
 
-#: src/lang.c:257
+#: src/lang.c:261
 msgid "global "
 msgstr ""
 
-#: src/lang.c:258
+#: src/lang.c:262
 #, c-format
 msgid "Please use %.100s instead"
 msgstr ""
 
-#: src/lang.c:259
+#: src/lang.c:263
+#, c-format
+msgid "%s is bogus"
+msgstr ""
+
+#: src/lang.c:264
 #, c-format
 msgid "Group %s is moderated. Continue?"
 msgstr ""
 
-#: src/lang.c:260
+#: src/lang.c:265
 msgid "groups"
 msgstr ""
 
-#: src/lang.c:261
+#: src/lang.c:266
+#, c-format
+msgid "Rereading %s..."
+msgstr ""
+
+#: src/lang.c:267
 msgid "Top Level Commands"
 msgstr ""
 
-#: src/lang.c:262
+#: src/lang.c:268
 msgid "Group Selection"
 msgstr ""
 
-#: src/lang.c:263
+#: src/lang.c:269
 msgid "group"
 msgstr ""
 
-#: src/lang.c:265
+#: src/lang.c:271
 msgid ""
 "One or more lines of comment. <CR> to add a line or proceed if line is empty."
 msgstr ""
 
-#: src/lang.c:266
+#: src/lang.c:272
 msgid "From: line to add to filter file. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:267
+#: src/lang.c:273
 msgid ""
 "Linecount of articles to be filtered. < for less, > for more, = for equal."
 msgstr ""
 
-#: src/lang.c:268
+#: src/lang.c:274
 msgid "Message-ID: line to add to filter file. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:269
+#: src/lang.c:275
 msgid "Subject: line to add to filter file. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:270
+#: src/lang.c:276
 msgid ""
 "Enter text pattern to filter if Subject: & From: lines are not what you want."
 msgstr ""
 
-#: src/lang.c:271
+#: src/lang.c:277
 msgid ""
 "Select where text pattern should be applied. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:272
+#: src/lang.c:278
 msgid ""
 "Expiration time in days for the entered filter. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:273
+#: src/lang.c:279
 msgid ""
 "Apply kill only to current group or all groups. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:274
+#: src/lang.c:280
 msgid ""
 "Apply select to current group or all groups. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:275
+#: src/lang.c:281
 msgid "kill an article via a menu"
 msgstr ""
 
-#: src/lang.c:276
+#: src/lang.c:282
 msgid "auto-select (hot) an article via a menu"
 msgstr ""
 
-#: src/lang.c:277
+#: src/lang.c:283
 msgid "Browse URLs in article"
 msgstr ""
 
-#: src/lang.c:278
+#: src/lang.c:284
 msgid "0 - 9\t  display article by number in current thread"
 msgstr ""
 
-#: src/lang.c:279
-msgid "cancel (delete) current article; must have been posted by you"
+#: src/lang.c:285
+msgid "cancel (delete) or supersede (overwrite) current article"
 msgstr ""
 
-#: src/lang.c:280
+#: src/lang.c:286
 msgid "edit article (mail-groups only)"
 msgstr ""
 
-#: src/lang.c:281
+#: src/lang.c:287
 msgid "display first article in current thread"
 msgstr ""
 
-#: src/lang.c:282
+#: src/lang.c:288
 msgid "display first page of article"
 msgstr ""
 
-#: src/lang.c:283
+#: src/lang.c:289
 msgid "post followup to current article"
 msgstr ""
 
-#: src/lang.c:284
+#: src/lang.c:290
 msgid "post followup (don't copy text) to current article"
 msgstr ""
 
-#: src/lang.c:285
+#: src/lang.c:291
 msgid "post followup to current article quoting complete headers"
 msgstr ""
 
-#: src/lang.c:286
+#: src/lang.c:292
 msgid "display last article in current thread"
 msgstr ""
 
-#: src/lang.c:287
+#: src/lang.c:293
 msgid "display last page of article"
 msgstr ""
 
-#: src/lang.c:288
+#: src/lang.c:294
 msgid "mark rest of thread as read and advance to next unread"
 msgstr ""
 
-#: src/lang.c:289
+#: src/lang.c:295
 msgid "display next article"
 msgstr ""
 
-#: src/lang.c:290
+#: src/lang.c:296
 msgid "display first article in next thread"
 msgstr ""
 
-#: src/lang.c:291 src/lang.c:298 src/lang.c:357 src/lang.c:358
+#: src/lang.c:297
 msgid "display next unread article"
 msgstr ""
 
-#: src/lang.c:292
+#: src/lang.c:298
 msgid "go to the article that this one followed up"
 msgstr ""
 
-#: src/lang.c:293
+#: src/lang.c:299
 msgid "display previous article"
 msgstr ""
 
-#: src/lang.c:294 src/lang.c:360
+#: src/lang.c:300
 msgid "display previous unread article"
 msgstr ""
 
-#: src/lang.c:295
+#: src/lang.c:301
 msgid "quickly kill an article using defaults"
 msgstr ""
 
-#: src/lang.c:296
+#: src/lang.c:302
 msgid "quickly auto-select (hot) an article using defaults"
 msgstr ""
 
-#: src/lang.c:297
+#: src/lang.c:303
 msgid "return to group selection level"
 msgstr ""
 
-#: src/lang.c:299
+#: src/lang.c:304
 msgid "reply through mail to author"
 msgstr ""
 
-#: src/lang.c:300
+#: src/lang.c:305
 msgid "reply through mail (don't copy text) to author"
 msgstr ""
 
-#: src/lang.c:301
+#: src/lang.c:306
 msgid "reply through mail to author quoting complete headers"
 msgstr ""
 
-#: src/lang.c:302 src/lang.c:362
+#: src/lang.c:307
 msgid "repost chosen article to another group"
 msgstr ""
 
-#: src/lang.c:303
+#: src/lang.c:308
 msgid "search backwards within this article"
 msgstr ""
 
-#: src/lang.c:304
+#: src/lang.c:309
 msgid "search forwards within this article"
 msgstr ""
 
-#: src/lang.c:305
+#: src/lang.c:310
 msgid "show article in raw-mode (including all headers)"
 msgstr ""
 
-#: src/lang.c:306
+#: src/lang.c:311
 msgid "skip next block of included text"
 msgstr ""
 
-#: src/lang.c:307
+#: src/lang.c:312
 msgid "toggle display of sections hidden by a form-feed (^L) on/off"
 msgstr ""
 
-#: src/lang.c:308
+#: src/lang.c:313
 msgid "toggle word highlighting on/off"
 msgstr ""
 
-#: src/lang.c:309
+#: src/lang.c:314
 msgid "toggle ROT-13 (basic decode) for current article"
 msgstr ""
 
-#: src/lang.c:310
+#: src/lang.c:315
 msgid "toggle tabwidth 4 <-> 8"
 msgstr ""
 
-#: src/lang.c:311
+#: src/lang.c:316
 msgid "toggle german TeX style decoding for current article"
 msgstr ""
 
-#: src/lang.c:312
+#: src/lang.c:317
 msgid "toggle display of uuencoded sections"
 msgstr ""
 
-#: src/lang.c:313
+#: src/lang.c:318
 msgid "View/save multimedia attachments"
 msgstr ""
 
-#: src/lang.c:314
+#: src/lang.c:319
 #, c-format
 msgid "report bug or comment via mail to %s"
 msgstr ""
 
-#: src/lang.c:315
+#: src/lang.c:320
 msgid "choose range of articles to be affected by next command"
 msgstr ""
 
-#: src/lang.c:316
+#: src/lang.c:321
 msgid "escape from command prompt"
 msgstr ""
 
-#: src/lang.c:317
+#: src/lang.c:322
+msgid "edit filter file"
+msgstr ""
+
+#: src/lang.c:323
 msgid "get help"
 msgstr ""
 
-#: src/lang.c:318
+#: src/lang.c:324
 msgid "display last article viewed"
 msgstr ""
 
-#: src/lang.c:319
+#: src/lang.c:325
 msgid "down one line"
 msgstr ""
 
-#: src/lang.c:320
+#: src/lang.c:326
 msgid "up one line"
 msgstr ""
 
-#: src/lang.c:321
+#: src/lang.c:327
 msgid "go to article chosen by Message-ID"
 msgstr ""
 
-#: src/lang.c:322
+#: src/lang.c:328
 msgid "mail article/thread/hot/pattern/tagged articles to someone"
 msgstr ""
 
-#: src/lang.c:323
+#: src/lang.c:329
 msgid "menu of configurable options"
 msgstr ""
 
-#: src/lang.c:324
+#: src/lang.c:330
 msgid "down one page"
 msgstr ""
 
-#: src/lang.c:325
+#: src/lang.c:331
 msgid "up one page"
 msgstr ""
 
-#: src/lang.c:326
+#: src/lang.c:332
 msgid "post (write) article to current group"
 msgstr ""
 
-#: src/lang.c:327
+#: src/lang.c:333
 msgid "post postponed articles"
 msgstr ""
 
-#: src/lang.c:328
+#: src/lang.c:334
 msgid "list articles posted by you (from posted file)"
 msgstr ""
 
-#: src/lang.c:329
+#: src/lang.c:335
 msgid "return to previous menu"
 msgstr ""
 
-#: src/lang.c:330
+#: src/lang.c:336
 msgid "quit tin immediately"
 msgstr ""
 
-#: src/lang.c:331
+#: src/lang.c:337
 msgid "redraw page"
 msgstr ""
 
-#: src/lang.c:332
+#: src/lang.c:338
 msgid "save article/thread/hot/pattern/tagged articles to file"
 msgstr ""
 
-#: src/lang.c:333
+#: src/lang.c:339
 msgid "save marked articles automatically without user prompts"
 msgstr ""
 
-#: src/lang.c:334
+#: src/lang.c:340
+msgid "scroll the screen one line down"
+msgstr ""
+
+#: src/lang.c:341
+msgid "scroll the screen one line up"
+msgstr ""
+
+#: src/lang.c:342
 msgid "search for articles by author backwards"
 msgstr ""
 
-#: src/lang.c:335
+#: src/lang.c:343
 msgid "search for articles by author forwards"
 msgstr ""
 
-#: src/lang.c:336
+#: src/lang.c:344
 msgid "search all articles for a given string (this may take some time)"
 msgstr ""
 
-#: src/lang.c:337
+#: src/lang.c:345
 msgid " \t  (searches are case-insensitive and wrap around to all articles)"
 msgstr ""
 
-#: src/lang.c:338
+#: src/lang.c:346
 msgid "search for articles by Subject line backwards"
 msgstr ""
 
-#: src/lang.c:339
+#: src/lang.c:347
 msgid "search for articles by Subject line forwards"
 msgstr ""
 
-#: src/lang.c:340
+#: src/lang.c:348
 msgid "repeat last search"
 msgstr ""
 
-#: src/lang.c:341
+#: src/lang.c:349
 msgid "tag current article for reposting/mailing/piping/printing/saving"
 msgstr ""
 
-#: src/lang.c:342
+#: src/lang.c:350
 msgid "toggle info message in last line (subject/description)"
 msgstr ""
 
-#: src/lang.c:343
+#: src/lang.c:351
 msgid "toggle inverse video"
 msgstr ""
 
-#: src/lang.c:344
+#: src/lang.c:352
 msgid "toggle mini help menu display"
 msgstr ""
 
-#: src/lang.c:345
+#: src/lang.c:353
+msgid "cycle the display of authors email address, real name, both or neither"
+msgstr ""
+
+#: src/lang.c:354
 msgid "show version information"
 msgstr ""
 
-#: src/lang.c:346
+#: src/lang.c:355
 msgid "mark all articles as read and return to group selection menu"
 msgstr ""
 
-#: src/lang.c:347
+#: src/lang.c:356
 msgid "mark all articles as read and enter next group with unread articles"
 msgstr ""
 
-#: src/lang.c:348
+#: src/lang.c:357
 msgid "choose first thread in list"
 msgstr ""
 
-#: src/lang.c:349 src/lang.c:380
-msgid "choose group by name"
-msgstr ""
-
-#: src/lang.c:350
+#: src/lang.c:358
 msgid "choose last thread in list"
 msgstr ""
 
-#: src/lang.c:351
+#: src/lang.c:359
 msgid "list articles within current thread (bring up Thread sub-menu)"
 msgstr ""
 
-#: src/lang.c:352
+#: src/lang.c:360
 msgid "mark article as unread"
 msgstr ""
 
-#: src/lang.c:353
+#: src/lang.c:361
 msgid "mark current thread or tagged threads as read"
 msgstr ""
 
-#: src/lang.c:354
+#: src/lang.c:362
 msgid "mark thread as unread"
 msgstr ""
 
-#: src/lang.c:355
+#: src/lang.c:363
 msgid "toggle display of all/selected articles"
 msgstr ""
 
-#: src/lang.c:356
+#: src/lang.c:364
 msgid "display next group"
 msgstr ""
 
-#: src/lang.c:359
+#: src/lang.c:365
 msgid "display previous group"
 msgstr ""
 
-#: src/lang.c:361 src/lang.c:409
-msgid "read chosen article"
-msgstr ""
-
-#: src/lang.c:363
+#: src/lang.c:366
 msgid "toggle all selections (all articles)"
 msgstr ""
 
-#: src/lang.c:364
+#: src/lang.c:367
 msgid "select group (make \"hot\")"
 msgstr ""
 
-#: src/lang.c:365
+#: src/lang.c:368
 msgid "select thread"
 msgstr ""
 
-#: src/lang.c:366
+#: src/lang.c:369
 msgid "select threads if at least one unread article is selected"
 msgstr ""
 
-#: src/lang.c:367
+#: src/lang.c:370
 msgid "select threads that match user specified pattern"
 msgstr ""
 
-#: src/lang.c:368
+#: src/lang.c:371
 msgid "tag all parts of current multipart-message in order"
 msgstr ""
 
-#: src/lang.c:369
+#: src/lang.c:372
 msgid "0 - 9\t  choose thread by number"
 msgstr ""
 
-#: src/lang.c:370
+#: src/lang.c:373
 msgid "toggle limit number of articles to get, and reload"
 msgstr ""
 
-#: src/lang.c:371
+#: src/lang.c:374
 msgid "toggle display of all/unread articles"
 msgstr ""
 
-#: src/lang.c:372 src/lang.c:410
-msgid "cycle the display of authors email address, real name, both or neither"
-msgstr ""
-
-#: src/lang.c:373
+#: src/lang.c:375
 msgid "toggle selection of thread"
 msgstr ""
 
-#: src/lang.c:374
+#: src/lang.c:376
 msgid "cycle through threading options available"
 msgstr ""
 
-#: src/lang.c:375
+#: src/lang.c:377
 msgid "undo all selections (all articles)"
 msgstr ""
 
-#: src/lang.c:376
+#: src/lang.c:378
 msgid "untag all tagged threads"
 msgstr ""
 
-#: src/lang.c:377
+#: src/lang.c:379
 msgid "mark all articles in group as read"
 msgstr ""
 
-#: src/lang.c:378
+#: src/lang.c:380
 msgid "mark all articles in group as read and move to next unread group"
 msgstr ""
 
-#: src/lang.c:379
+#: src/lang.c:381
 msgid "choose first group in list"
 msgstr ""
 
-#: src/lang.c:381
+#: src/lang.c:382
+msgid "choose group by name"
+msgstr ""
+
+#: src/lang.c:383
 msgid "0 - 9\t  choose group by number"
 msgstr ""
 
-#: src/lang.c:382
+#: src/lang.c:384
 msgid "choose range of groups to be affected by next command"
 msgstr ""
 
-#: src/lang.c:383
+#: src/lang.c:385
 msgid "choose last group in list"
 msgstr ""
 
-#: src/lang.c:384
+#: src/lang.c:386
 msgid "mark all articles in chosen group unread"
 msgstr ""
 
-#: src/lang.c:385
+#: src/lang.c:387
 msgid "move chosen group within list"
 msgstr ""
 
-#: src/lang.c:386
+#: src/lang.c:388
 msgid "choose next group with unread news"
 msgstr ""
 
-#: src/lang.c:387 src/lang.c:1176
+#: src/lang.c:389 src/lang.c:1197
 msgid "quit"
 msgstr ""
 
-#: src/lang.c:388
+#: src/lang.c:390
 msgid "quit without saving configuration changes"
 msgstr ""
 
-#: src/lang.c:389
+#: src/lang.c:391
 msgid "read chosen group"
 msgstr ""
 
-#: src/lang.c:390
+#: src/lang.c:392
 msgid "reset .newsrc (all available articles in groups marked unread)"
 msgstr ""
 
-#: src/lang.c:391
+#: src/lang.c:393
 msgid "search backwards for a group name"
 msgstr ""
 
-#: src/lang.c:392
+#: src/lang.c:394
 msgid " \t  (all searches are case-insensitive and wrap around)"
 msgstr ""
 
-#: src/lang.c:393
+#: src/lang.c:395
 msgid "search forwards for a group name"
 msgstr ""
 
-#: src/lang.c:394
+#: src/lang.c:396
 msgid "subscribe to chosen group"
 msgstr ""
 
-#: src/lang.c:395
+#: src/lang.c:397
 msgid "subscribe to groups that match pattern"
 msgstr ""
 
-#: src/lang.c:396
+#: src/lang.c:398
 msgid "reread active file to check for any new news"
 msgstr ""
 
-#: src/lang.c:397
+#: src/lang.c:399
 msgid "toggle display of group name only or group name plus description"
 msgstr ""
 
-#: src/lang.c:398
+#: src/lang.c:400
 msgid "toggle display to show all/unread subscribed groups"
 msgstr ""
 
-#: src/lang.c:399
+#: src/lang.c:401
 msgid "unsubscribe from chosen group"
 msgstr ""
 
-#: src/lang.c:400
+#: src/lang.c:402
 msgid "unsubscribe from groups that match pattern"
 msgstr ""
 
-#: src/lang.c:401
+#: src/lang.c:403
 msgid "sort the list of groups"
 msgstr ""
 
-#: src/lang.c:402
+#: src/lang.c:404
 msgid "toggle display to show all/subscribed groups"
 msgstr ""
 
-#: src/lang.c:403
+#: src/lang.c:405
 msgid "0 - 9\t  choose article by number"
 msgstr ""
 
-#: src/lang.c:404
+#: src/lang.c:406
 msgid "mark thread as read and return to group index page"
 msgstr ""
 
-#: src/lang.c:405
+#: src/lang.c:407
 msgid "mark thread as read and enter next unread thread or group"
 msgstr ""
 
-#: src/lang.c:406
+#: src/lang.c:408
 msgid "choose first article in list"
 msgstr ""
 
-#: src/lang.c:407
+#: src/lang.c:409
 msgid "choose last article in list"
 msgstr ""
 
-#: src/lang.c:408
+#: src/lang.c:410
 msgid ""
 "mark article or tagged articles as read and move cursor to next unread "
 "article"
 msgstr ""
 
 #: src/lang.c:411
+msgid "read chosen article"
+msgstr ""
+
+#: src/lang.c:412
 msgid ""
 "Display properties\n"
 "------------------"
 msgstr ""
 
-#: src/lang.c:412
+#: src/lang.c:413
 msgid ""
 "Miscellaneous\n"
 "-------------"
 msgstr ""
 
-#: src/lang.c:413
+#: src/lang.c:414
 msgid ""
 "Moving around\n"
 "-------------"
 msgstr ""
 
-#: src/lang.c:414
+#: src/lang.c:415
 msgid ""
 "Group/thread/article operations\n"
 "-------------------------------"
 msgstr ""
 
-#: src/lang.c:416
+#: src/lang.c:417
 msgid "Group Level Commands"
 msgstr ""
 
-#: src/lang.c:417
+#: src/lang.c:418
 msgid "Kill filter added"
 msgstr ""
 
-#: src/lang.c:418
+#: src/lang.c:419
 msgid "Auto-selection filter added"
 msgstr ""
 
-#: src/lang.c:419
+#: src/lang.c:420
 msgid "All parts tagged"
 msgstr ""
 
-#: src/lang.c:420
+#: src/lang.c:421
 msgid "Storing article for later posting"
 msgstr ""
 
-#: src/lang.c:421
+#: src/lang.c:422
 msgid "Please enter a valid character"
 msgstr ""
 
-#: src/lang.c:422
+#: src/lang.c:423
 #, c-format
 msgid "Missing part #%d"
 msgstr ""
 
-#: src/lang.c:423
+#: src/lang.c:424
 msgid "*** No postponed articles ***"
 msgstr ""
 
-#: src/lang.c:424
+#: src/lang.c:425
 msgid "Not a multi-part message"
 msgstr ""
 
-#: src/lang.c:425
+#: src/lang.c:426
 msgid "You are not subscribed to this group"
 msgstr ""
 
-#: src/lang.c:426
+#: src/lang.c:427
 msgid "No previous expression"
 msgstr ""
 
-#: src/lang.c:427
+#: src/lang.c:428
 msgid "Operation disabled in no-overwrite mode"
 msgstr ""
 
 #. TODO: replace hardcoded key-name in txt_info_postponed
-#: src/lang.c:429
+#: src/lang.c:430
 #, c-format
 msgid "%d postponed %s, reuse with ^O...\n"
 msgstr ""
 
-#: src/lang.c:430
+#: src/lang.c:431
 msgid ""
 "X-Conversion-Note: multipart/alternative contents have been removed.\n"
 "  To get the whole article, turn alternative handling OFF in the Option "
 "Menu\n"
 msgstr ""
 
-#: src/lang.c:432
+#: src/lang.c:433
 #, c-format
 msgid "Save filename for %s/%s is a mailbox. Attachment not saved"
 msgstr ""
 
-#: src/lang.c:433
+#: src/lang.c:434
 msgid "TeX2Iso encoded article"
 msgstr ""
 
-#: src/lang.c:434
+#: src/lang.c:435
 msgid "incomplete "
 msgstr ""
 
 #. TODO: replace hardcoded key-names
-#: src/lang.c:436
+#: src/lang.c:437
 #, c-format
 msgid ""
 "\n"
@@ -1774,8 +1882,8 @@ msgid ""
 "\n"
 "Move up/down by using the terminal arrow keys or 'j' and 'k'.  Use PgUp/PgDn "
 "or\n"
-"Ctrl-U and Ctrl-D to page up/down. Enter a newsgroup by pressing "
-"RETURN/TAB.\n"
+"Ctrl-U and Ctrl-D to page up/down. Enter a newsgroup by pressing RETURN/"
+"TAB.\n"
 "\n"
 "Articles, threads, tagged articles or articles matching a pattern can be "
 "mailed\n"
@@ -1794,129 +1902,137 @@ msgid ""
 "Please send bug-reports/comments to %s with the 'R' command.\n"
 msgstr ""
 
-#: src/lang.c:452
+#: src/lang.c:453
 #, c-format
 msgid "Invalid  From: %s  line. Read the INSTALL file again."
 msgstr ""
 
-#: src/lang.c:453
+#: src/lang.c:455
+msgid "Invalid multibyte sequence found\n"
+msgstr ""
+
+#: src/lang.c:457
 #, c-format
 msgid "Invalid  Sender:-header %s"
 msgstr ""
 
-#: src/lang.c:454
+#: src/lang.c:458
 msgid "Inverse video disabled"
 msgstr ""
 
-#: src/lang.c:455
+#: src/lang.c:459
 msgid "Inverse video enabled"
 msgstr ""
 
-#: src/lang.c:457
+#: src/lang.c:461
 #, c-format
 msgid "Missing definition for %s\n"
 msgstr ""
 
-#: src/lang.c:458
+#: src/lang.c:462
 #, c-format
 msgid "Invalid key definition '%s'\n"
 msgstr ""
 
-#: src/lang.c:459
+#: src/lang.c:463
 #, c-format
 msgid "Invalid keyname '%s'\n"
 msgstr ""
 
-#: src/lang.c:460
+#: src/lang.c:464
 #, c-format
-msgid "Key '%s' is defined for both %s%s and %s%s\n"
+msgid "Keymap file was upgraded to version %s\n"
 msgstr ""
 
-#: src/lang.c:461
+#: src/lang.c:465
 #, c-format
-msgid "Kill From:     [%-*.*s] (y/n): "
+msgid "Kill From:     [%s] (y/n): "
 msgstr ""
 
-#: src/lang.c:462
+#: src/lang.c:466
 msgid "Kill Lines: (</>num): "
 msgstr ""
 
-#: src/lang.c:463
+#: src/lang.c:467
 msgid "Kill Article Menu"
 msgstr ""
 
-#: src/lang.c:464
+#: src/lang.c:468
 #, c-format
-msgid "Kill Msg-Id:   [%-*.*s] (f/l/o/n): "
+msgid "Kill Msg-Id:   [%s] (f/l/o/n): "
 msgstr ""
 
-#: src/lang.c:465
+#: src/lang.c:469
 msgid "Kill pattern scope  : "
 msgstr ""
 
-#: src/lang.c:466
+#: src/lang.c:470
 #, c-format
-msgid "Kill Subject:  [%-*.*s] (y/n): "
+msgid "Kill Subject:  [%s] (y/n): "
 msgstr ""
 
-#: src/lang.c:467
+#: src/lang.c:471
 msgid "Kill text pattern   : "
 msgstr ""
 
-#: src/lang.c:468
+#: src/lang.c:472
 msgid "Kill time in days   : "
 msgstr ""
 
-#: src/lang.c:470
+#: src/lang.c:474
 msgid "Last"
 msgstr ""
 
-#: src/lang.c:471
+#: src/lang.c:475
 msgid "-- Last response --"
 msgstr ""
 
-#: src/lang.c:472
+#: src/lang.c:476
 #, c-format
 msgid "Lines %s  "
 msgstr ""
 
-#: src/lang.c:474
+#: src/lang.c:478
 msgid "Message-ID: line              "
 msgstr ""
 
-#: src/lang.c:476
+#: src/lang.c:479
+msgid "Mail"
+msgstr ""
+
+#: src/lang.c:480
 msgid "mailbox "
 msgstr ""
 
-#: src/lang.c:477
+#: src/lang.c:481
 #, c-format
 msgid "Mail article(s) to [%.*s]> "
 msgstr ""
 
-#: src/lang.c:478
+#: src/lang.c:482
 #, c-format
 msgid "Mailing log to %s\n"
 msgstr ""
 
-#: src/lang.c:479
+#: src/lang.c:483
 msgid "Mail bug report..."
 msgstr ""
 
-#: src/lang.c:480
+#: src/lang.c:484
 #, c-format
 msgid "Mail BUG REPORT to %s?"
 msgstr ""
 
-#: src/lang.c:481
+#: src/lang.c:485
 msgid "Mailed"
 msgstr ""
 
-#: src/lang.c:482
+#: src/lang.c:486
 #, c-format
 msgid "Mailing to %s..."
 msgstr ""
 
-#: src/lang.c:483
+#: src/lang.c:487
 msgid ""
 "# [Mail/Save] active file. Format is like news active file:\n"
 "#   groupname  max.artnum  min.artnum  /dir\n"
@@ -1924,290 +2040,285 @@ msgid ""
 "#\n"
 msgstr ""
 
-#: src/lang.c:486
+#: src/lang.c:490
 #, c-format
 msgid "%s marked as unread"
 msgstr ""
 
-#: src/lang.c:487
+#: src/lang.c:491
 #, c-format
 msgid "Marked %d of %d tagged %s as read"
 msgstr ""
 
-#: src/lang.c:488
+#: src/lang.c:492
 #, c-format
 msgid "Mark all articles as read%s?"
 msgstr ""
 
-#: src/lang.c:489
+#: src/lang.c:493
 #, c-format
 msgid "Mark %s=tagged articles, %s=current article, %s=quit: "
 msgstr ""
 
-#: src/lang.c:490
+#: src/lang.c:494
 #, c-format
-msgid "Mark group %.*s as read?"
+msgid "Mark group %s as read?"
 msgstr ""
 
-#: src/lang.c:491
+#: src/lang.c:495
 #, c-format
 msgid "Mark thread as read%s?"
 msgstr ""
 
-#: src/lang.c:492
+#: src/lang.c:496
 #, c-format
 msgid "Mark %s=tagged articles/threads, %s=current thread, %s=quit: "
 msgstr ""
 
-#: src/lang.c:493
+#: src/lang.c:497
 #, c-format
 msgid "Matching %s groups..."
 msgstr ""
 
-#: src/lang.c:494 src/lang.c:498
+#: src/lang.c:498 src/lang.c:502
 #, c-format
 msgid "<n>=set current to n; %s=next unread; %s=search pattern; %s=kill/select"
 msgstr ""
 
-#: src/lang.c:495
+#: src/lang.c:499
 #, c-format
 msgid ""
-"%s=author search; %s=catchup; %s=line down; %s=line up; %s=mark read; "
-"%s=list thread"
+"%s=author search; %s=catchup; %s=line down; %s=line up; %s=mark read; %"
+"s=list thread"
 msgstr ""
 
-#: src/lang.c:496
+#: src/lang.c:500
 #, c-format
 msgid "%s=line up; %s=line down; %s=page up; %s=page down; %s=top; %s=bottom"
 msgstr ""
 
-#: src/lang.c:497
+#: src/lang.c:501
 #, c-format
 msgid "%s=search forwards; %s=search backwards; %s=quit"
 msgstr ""
 
-#: src/lang.c:499
+#: src/lang.c:503
 #, c-format
 msgid "%s=author search; %s=body search; %s=catchup; %s=followup; %s=mark read"
 msgstr ""
 
-#: src/lang.c:500
+#: src/lang.c:504
 #, c-format
 msgid "<n>=set current to n; %s=next unread; %s,%s=search pattern; %s=catchup"
 msgstr ""
 
-#: src/lang.c:501
+#: src/lang.c:505
 #, c-format
 msgid ""
 "%s=line down; %s=line up; %s=help; %s=move; %s=quit; %s=toggle all/unread"
 msgstr ""
 
-#: src/lang.c:502
+#: src/lang.c:506
 #, c-format
 msgid ""
-"%s=subscribe; %s=sub pattern; %s=unsubscribe; %s=unsub pattern; %s=yank "
-"in/out"
+"%s=subscribe; %s=sub pattern; %s=unsubscribe; %s=unsub pattern; %s=yank in/"
+"out"
 msgstr ""
 
-#: src/lang.c:503
+#: src/lang.c:507
 #, c-format
 msgid "<n>=set current to n; %s=next unread; %s=catchup; %s=display toggle"
 msgstr ""
 
-#: src/lang.c:504
+#: src/lang.c:508
 #, c-format
 msgid "%s=help; %s=line down; %s=line up; %s=quit; %s=tag; %s=mark unread"
 msgstr ""
 
-#: src/lang.c:505
+#: src/lang.c:509
 msgid "--More--"
 msgstr ""
 
-#: src/lang.c:506
+#: src/lang.c:510
 #, c-format
 msgid "Moving %s..."
 msgstr ""
 
-#: src/lang.c:508
+#: src/lang.c:512
 msgid ", name: "
 msgstr ""
 
-#: src/lang.c:509
+#: src/lang.c:513
 #, c-format
 msgid "Goto newsgroup [%s]> "
 msgstr ""
 
-#: src/lang.c:510
+#: src/lang.c:514
 msgid "newsgroups"
 msgstr ""
 
-#: src/lang.c:511
+#: src/lang.c:515
 #, c-format
 msgid "Position %s in group list (1,2,..,$) [%d]> "
 msgstr ""
 
-#: src/lang.c:512
+#: src/lang.c:516
 msgid "newsgroup"
 msgstr ""
 
-#: src/lang.c:513
+#: src/lang.c:517
 msgid "Try and save newsrc file again?"
 msgstr ""
 
-#: src/lang.c:514
+#: src/lang.c:518
 msgid "Warning: No newsgroups were written to your newsrc file. Save aborted."
 msgstr ""
 
-#: src/lang.c:515
+#: src/lang.c:519
 msgid "newsrc file saved successfully.\n"
 msgstr ""
 
-#: src/lang.c:516
+#: src/lang.c:520
 msgid "-- Next response --"
 msgstr ""
 
-#: src/lang.c:517
+#: src/lang.c:521
 #, c-format
 msgid "NNTP authorization password not found for %s"
 msgstr ""
 
-#: src/lang.c:518
+#: src/lang.c:522
 msgid "No  "
 msgstr ""
 
-#: src/lang.c:519
+#: src/lang.c:523
 msgid "*** No articles ***"
 msgstr ""
 
-#: src/lang.c:520
+#: src/lang.c:524
 msgid "No articles have been posted"
 msgstr ""
 
-#: src/lang.c:521
+#: src/lang.c:525
 msgid "*** No description ***"
 msgstr ""
 
-#: src/lang.c:522
+#: src/lang.c:526
 msgid "No filename"
 msgstr ""
 
-#: src/lang.c:523
+#: src/lang.c:527
 msgid "No group"
 msgstr ""
 
-#: src/lang.c:524
+#: src/lang.c:528
 msgid "*** No groups ***"
 msgstr ""
 
-#: src/lang.c:525
+#: src/lang.c:529
 msgid "No more groups to read"
 msgstr ""
 
-#: src/lang.c:526
+#: src/lang.c:530
 msgid "No last message"
 msgstr ""
 
-#: src/lang.c:527
+#: src/lang.c:531
 msgid "No mail address"
 msgstr ""
 
-#: src/lang.c:528
+#: src/lang.c:532
 msgid "No articles marked for saving"
 msgstr ""
 
-#: src/lang.c:529
+#: src/lang.c:533
 msgid "No match"
 msgstr ""
 
-#: src/lang.c:530
+#: src/lang.c:534
 msgid "No more groups"
 msgstr ""
 
-#: src/lang.c:531
+#: src/lang.c:535
 msgid "No newsgroups"
 msgstr ""
 
-#: src/lang.c:532
+#: src/lang.c:536
 msgid "No next unread article"
 msgstr ""
 
-#: src/lang.c:533
+#: src/lang.c:537
 msgid "No previous group"
 msgstr ""
 
-#: src/lang.c:534
+#: src/lang.c:538
 msgid "No previous unread article"
 msgstr ""
 
-#: src/lang.c:535
-#, c-format
-msgid "No responses%s"
-msgstr ""
-
-#: src/lang.c:536
+#: src/lang.c:539
 msgid "No responses"
 msgstr ""
 
-#: src/lang.c:537
+#: src/lang.c:540
 msgid "No responses to list in current thread"
 msgstr ""
 
-#: src/lang.c:538
+#: src/lang.c:541
 msgid "No search string"
 msgstr ""
 
-#: src/lang.c:539
+#: src/lang.c:542
 msgid "No subject"
 msgstr ""
 
-#: src/lang.c:540
+#: src/lang.c:544
 #, c-format
 msgid "%s: Terminal must have clear to end-of-line (ce)\n"
 msgstr ""
 
-#: src/lang.c:541
+#: src/lang.c:545
 #, c-format
 msgid "%s: Terminal must have clear to end-of-screen (cd)\n"
 msgstr ""
 
-#: src/lang.c:542
+#: src/lang.c:546
 #, c-format
 msgid "%s: Terminal must have clearscreen (cl) capability\n"
 msgstr ""
 
-#: src/lang.c:543
+#: src/lang.c:547
 #, c-format
 msgid "%s: Terminal must have cursor motion (cm)\n"
 msgstr ""
 
-#: src/lang.c:544
+#: src/lang.c:548
 #, c-format
 msgid "%s: TERM variable must be set to use screen capabilities\n"
 msgstr ""
 
-#: src/lang.c:545
+#: src/lang.c:550
 #, c-format
 msgid "No viewer found for %s/%s\n"
 msgstr ""
 
-#: src/lang.c:546
+#: src/lang.c:551
 msgid "Newsgroup does not exist on this server"
 msgstr ""
 
-#: src/lang.c:547
+#: src/lang.c:552
 #, c-format
 msgid "Group %s not found in active file"
 msgstr ""
 
-#: src/lang.c:548
+#: src/lang.c:553
 msgid "c)reate it, use a)lternative name, use d)efault .newsrc, q)uit tin: "
 msgstr ""
 
-#: src/lang.c:549
+#: src/lang.c:554
 msgid "use a)lternative name, use d)efault .newsrc, q)uit tin: "
 msgstr ""
 
-#: src/lang.c:550
+#: src/lang.c:555
 #, c-format
 msgid ""
 "# NNTP-server -> newsrc translation table and NNTP-server\n"
@@ -2224,311 +2335,318 @@ msgid ""
 "#\n"
 msgstr ""
 
-#: src/lang.c:557
+#: src/lang.c:562
 msgid "Only"
 msgstr ""
 
-#: src/lang.c:558
+#: src/lang.c:563
 #, c-format
 msgid "Option not enabled. Recompile with %s."
 msgstr ""
 
-#: src/lang.c:559
+#: src/lang.c:564
 msgid "Options Menu"
 msgstr ""
 
-#: src/lang.c:562
+#: src/lang.c:567
 #, c-format
 msgid "Error in regex: %s at pos. %d '%s'"
 msgstr ""
 
-#: src/lang.c:563
+#: src/lang.c:568
 #, c-format
 msgid "Error in regex: pcre internal error %d"
 msgstr ""
 
-#: src/lang.c:564
+#: src/lang.c:569
 #, c-format
 msgid "Error in regex: study - pcre internal error %s"
 msgstr ""
 
-#: src/lang.c:565
+#: src/lang.c:570
 msgid "Post a followup..."
 msgstr ""
 
 #. TODO: replace hardcoded key-name in txt_post_error_ask_postpone
-#: src/lang.c:567
+#: src/lang.c:572
 msgid ""
 "An error has occurred while posting the article. If you think that this\n"
 "error is temporary or otherwise correctable, you can postpone the article\n"
 "and pick it up again with ^O later.\n"
 msgstr ""
 
-#: src/lang.c:570
+#: src/lang.c:575
 msgid "Posted articles history"
 msgstr ""
 
-#: src/lang.c:571
+#: src/lang.c:576
 #, c-format
 msgid "Post to newsgroup(s) [%s]> "
 msgstr ""
 
-#: src/lang.c:572
+#: src/lang.c:577
 msgid "-- post processing started --"
 msgstr ""
 
-#: src/lang.c:573
+#: src/lang.c:578
 msgid "-- post processing completed --"
 msgstr ""
 
-#: src/lang.c:574
+#: src/lang.c:579
 #, c-format
 msgid "Post subject [%s]> "
 msgstr ""
 
-#: src/lang.c:575
+#: src/lang.c:580
 msgid ""
 "# Summary of mailed/posted messages viewable by 'W' command from within "
 "tin.\n"
 msgstr ""
 
-#: src/lang.c:576
+#: src/lang.c:581
 msgid "Posting article..."
 msgstr ""
 
-#: src/lang.c:577
-msgid "Post postponed articles [%%.*s]? (%s/%s/%s/%s/%s): "
+#: src/lang.c:582
+#, c-format
+msgid "Post postponed articles [%%s]? (%s/%s/%s/%s/%s): "
 msgstr ""
 
-#: src/lang.c:578
+#: src/lang.c:583
 #, c-format
 msgid "Hot %s"
 msgstr ""
 
-#: src/lang.c:579
+#: src/lang.c:584
 #, c-format
 msgid "Tagged %s"
 msgstr ""
 
-#: src/lang.c:580
+#: src/lang.c:585
 #, c-format
 msgid "Untagged %s"
 msgstr ""
 
-#: src/lang.c:581
+#: src/lang.c:586
 msgid "Processing mail messages marked for deletion."
 msgstr ""
 
-#: src/lang.c:582
+#: src/lang.c:587
 msgid "Processing saved articles marked for deletion."
 msgstr ""
 
-#: src/lang.c:583
+#: src/lang.c:588
 #, c-format
 msgid "Accept Followup-To? %s=post, %s=ignore, %s=quit: "
 msgstr ""
 
-#: src/lang.c:584
+#: src/lang.c:589
 msgid "Article unchanged, abort mailing?"
 msgstr ""
 
-#: src/lang.c:585
+#: src/lang.c:590
 #, c-format
 msgid "Do you want to see postponed articles (%d)?"
 msgstr ""
 
-#: src/lang.c:587
+#: src/lang.c:592
 msgid "Add quick kill filter?"
 msgstr ""
 
-#: src/lang.c:588
+#: src/lang.c:593
 msgid "Add quick selection filter?"
 msgstr ""
 
-#: src/lang.c:589
+#: src/lang.c:594
 msgid "Do you really want to quit?"
 msgstr ""
 
-#: src/lang.c:590
-msgid "%s=edit cancel message, %s=quit, %s=delete (cancel) [%%.*s]: "
+#: src/lang.c:595
+#, c-format
+msgid "%s=edit cancel message, %s=quit, %s=delete (cancel) [%%s]: "
 msgstr ""
 
-#: src/lang.c:591
+#: src/lang.c:596
 msgid "You have tagged articles in this group - quit anyway?"
 msgstr ""
 
-#: src/lang.c:592
+#: src/lang.c:597
 #, c-format
 msgid "%s=quit, %s=edit, %s=postpone: "
 msgstr ""
 
-#: src/lang.c:593
+#: src/lang.c:598
 #, c-format
 msgid "%s=quit %s=edit %s=save kill description: "
 msgstr ""
 
-#: src/lang.c:594
+#: src/lang.c:599
 #, c-format
 msgid "%s=quit %s=edit %s=save select description: "
 msgstr ""
 
-#: src/lang.c:595
+#: src/lang.c:600
 msgid "Do you really want to quit without saving your configuration?"
 msgstr ""
 
-#: src/lang.c:598
+#: src/lang.c:603
 msgid "Invalid range - valid are '0-9.$' eg. 1-$"
 msgstr ""
 
-#: src/lang.c:599
+#: src/lang.c:604
 msgid "Do you want to abort this operation?"
 msgstr ""
 
-#: src/lang.c:600
+#: src/lang.c:605
 msgid "Do you want to exit tin immediately?"
 msgstr ""
 
-#: src/lang.c:601
+#: src/lang.c:606
 msgid "Read response> "
 msgstr ""
 
-#: src/lang.c:602
+#: src/lang.c:607
 msgid "Reading ('q' to quit)..."
 msgstr ""
 
-#: src/lang.c:603
+#: src/lang.c:608
 #, c-format
 msgid "Reading %sarticles..."
 msgstr ""
 
-#: src/lang.c:604
+#: src/lang.c:609
 #, c-format
 msgid "Reading %sattributes file...\n"
 msgstr ""
 
-#: src/lang.c:605
+#: src/lang.c:610
 #, c-format
 msgid "Reading %sconfig file...\n"
 msgstr ""
 
-#: src/lang.c:606
+#: src/lang.c:611
 msgid "Reading filter file...\n"
 msgstr ""
 
-#: src/lang.c:607
+#: src/lang.c:612
 #, c-format
 msgid "Reading %s groups..."
 msgstr ""
 
-#: src/lang.c:608
+#: src/lang.c:613
 msgid "Reading input history file...\n"
 msgstr ""
 
-#: src/lang.c:609
+#: src/lang.c:614
 msgid "Reading keymap file...\n"
 msgstr ""
 
-#: src/lang.c:610
+#: src/lang.c:615
 msgid "Reading groups from active file... "
 msgstr ""
 
-#: src/lang.c:611
+#: src/lang.c:616
 msgid "Reading groups from newsrc file... "
 msgstr ""
 
-#: src/lang.c:612
+#: src/lang.c:617
 msgid "Reading newsgroups file... "
 msgstr ""
 
-#: src/lang.c:613
+#: src/lang.c:618
 msgid "Reading newsrc file..."
 msgstr ""
 
-#: src/lang.c:614
+#: src/lang.c:620
+#, c-format
+msgid "(%d:%02d remaining)"
+msgstr ""
+
+#: src/lang.c:622
 #, c-format
 msgid "Bogus group %s removed."
 msgstr ""
 
-#: src/lang.c:615
+#: src/lang.c:623
 #, c-format
 msgid "Error: rename %s to %s"
 msgstr ""
 
-#: src/lang.c:616
+#: src/lang.c:624
 msgid "Reply to author..."
 msgstr ""
 
-#: src/lang.c:617
+#: src/lang.c:625
 msgid "Repost"
 msgstr ""
 
-#: src/lang.c:618
+#: src/lang.c:626
 msgid "Reposting article..."
 msgstr ""
 
-#: src/lang.c:619
+#: src/lang.c:627
 #, c-format
 msgid "Repost article(s) to group(s) [%s]> "
 msgstr ""
 
-#: src/lang.c:620
+#: src/lang.c:628
 msgid "Reset newsrc?"
 msgstr ""
 
-#: src/lang.c:621
+#: src/lang.c:629
 msgid "Responses have been directed to the following newsgroups"
 msgstr ""
 
-#: src/lang.c:622
+#: src/lang.c:630
 #, c-format
 msgid "Responses have been directed to poster. %s=mail, %s=post, %s=quit: "
 msgstr ""
 
-#: src/lang.c:623
+#: src/lang.c:631
 #, c-format
-msgid "RespNo %4d of %4d%s"
+msgid "RespNo %4d of %4d"
 msgstr ""
 
-#: src/lang.c:624
+#: src/lang.c:632
 msgid "Press <RETURN> to continue..."
 msgstr ""
 
-#: src/lang.c:626
+#: src/lang.c:634
 #, c-format
-msgid "Select From    [%-*.*s] (y/n): "
+msgid "Select From    [%s] (y/n): "
 msgstr ""
 
-#: src/lang.c:627
+#: src/lang.c:635
 msgid "Select Lines: (</>num): "
 msgstr ""
 
-#: src/lang.c:628
+#: src/lang.c:636
 msgid "Auto-select Article Menu"
 msgstr ""
 
-#: src/lang.c:629
+#: src/lang.c:637
 #, c-format
-msgid "Select Msg-Id  [%-*.*s] (f/l/o/n): "
+msgid "Select Msg-Id  [%s] (f/l/o/n): "
 msgstr ""
 
-#: src/lang.c:630
+#: src/lang.c:638
 msgid "Select pattern scope: "
 msgstr ""
 
-#: src/lang.c:631
+#: src/lang.c:639
 #, c-format
-msgid "Select Subject [%-*.*s] (y/n): "
+msgid "Select Subject [%s] (y/n): "
 msgstr ""
 
-#: src/lang.c:632
+#: src/lang.c:640
 msgid "Select text pattern : "
 msgstr ""
 
-#: src/lang.c:633
+#: src/lang.c:641
 msgid "Select time in days   : "
 msgstr ""
 
-#: src/lang.c:634
+#: src/lang.c:642
 #, c-format
 msgid ""
 "# %s server configuration file\n"
@@ -2537,224 +2655,228 @@ msgid ""
 "# Do not edit while %s is running, since all your changes to this file\n"
 "# will be overwritten when you leave %s.\n"
 "# Do not edit at all if you don't know what you do.\n"
-"############################################################################"
-"\n"
+"############################################################################\n"
 "\n"
 msgstr ""
 
-#: src/lang.c:640
+#: src/lang.c:648
 msgid "Showing unread groups only"
 msgstr ""
 
-#: src/lang.c:641
+#: src/lang.c:649
 msgid "Subject: line (ignore case)   "
 msgstr ""
 
-#: src/lang.c:642
+#: src/lang.c:650
 msgid "Subject: line (case sensitive)"
 msgstr ""
 
-#: src/lang.c:643
+#: src/lang.c:651
 msgid "Save"
 msgstr ""
 
-#: src/lang.c:644
+#: src/lang.c:652
 #, c-format
 msgid "Save '%s' (%s/%s)?"
 msgstr ""
 
-#: src/lang.c:645
+#: src/lang.c:653
 msgid "Save configuration before continuing?"
 msgstr ""
 
-#: src/lang.c:646
+#: src/lang.c:654
 msgid "Save filename> "
 msgstr ""
 
-#: src/lang.c:647
+#: src/lang.c:655
 msgid "Saved"
 msgstr ""
 
-#: src/lang.c:648
+#: src/lang.c:656
 #, c-format
 msgid "%4d unread (%4d hot) %s in %s\n"
 msgstr ""
 
-#: src/lang.c:649
+#: src/lang.c:657
 #, c-format
 msgid "Saved %s...\n"
 msgstr ""
 
-#: src/lang.c:650
+#: src/lang.c:658
 msgid "Nothing was saved"
 msgstr ""
 
-#: src/lang.c:651
+#: src/lang.c:659
 #, c-format
 msgid ""
 "\n"
 "%s %d %s from %d %s\n"
 msgstr ""
 
-#: src/lang.c:652
+#: src/lang.c:660
 #, c-format
 msgid "-- %s saved to %s%s --"
 msgstr ""
 
-#: src/lang.c:653
+#: src/lang.c:661
 #, c-format
 msgid "-- %s saved to %s - %s --"
 msgstr ""
 
-#: src/lang.c:654
+#: src/lang.c:662
 msgid "Saving..."
 msgstr ""
 
-#: src/lang.c:655
+#: src/lang.c:663
 #, c-format
 msgid "%s: Screen initialization failed"
 msgstr ""
 
-#: src/lang.c:656
+#: src/lang.c:665
 #, c-format
 msgid "%s: screen is too small\n"
 msgstr ""
 
-#: src/lang.c:657
+#: src/lang.c:667
 #, c-format
 msgid "screen is too small, %s is exiting\n"
 msgstr ""
 
-#: src/lang.c:658
+#: src/lang.c:668
 #, c-format
 msgid "Search backwards [%s]> "
 msgstr ""
 
-#: src/lang.c:659
+#: src/lang.c:669
 #, c-format
 msgid "Search body [%s]> "
 msgstr ""
 
-#: src/lang.c:660
+#: src/lang.c:670
 #, c-format
 msgid "Search forwards [%s]> "
 msgstr ""
 
-#: src/lang.c:661
+#: src/lang.c:671
 msgid "Searching..."
 msgstr ""
 
-#: src/lang.c:662
+#: src/lang.c:672
 #, c-format
 msgid "Searching article %d of %d ('q' to abort)..."
 msgstr ""
 
-#: src/lang.c:663
+#: src/lang.c:673
 msgid "Select article> "
 msgstr ""
 
-#: src/lang.c:664
+#: src/lang.c:674
 msgid ""
 "Select option number before text or use arrow keys and <CR>. 'q' to quit."
 msgstr ""
 
-#: src/lang.c:665
+#: src/lang.c:675
 msgid "Select group> "
 msgstr ""
 
-#: src/lang.c:666
+#: src/lang.c:676
 #, c-format
 msgid "Enter selection pattern [%s]> "
 msgstr ""
 
-#: src/lang.c:667
+#: src/lang.c:677
 msgid "Select thread > "
 msgstr ""
 
-#: src/lang.c:668
+#: src/lang.c:678
 #, c-format
 msgid "%s %s %s (\"%s\") [%s]: send a DETAILED bug report to %s\n"
 msgstr ""
 
-#: src/lang.c:669
+#: src/lang.c:679
 msgid "servers active-file"
 msgstr ""
 
-#: src/lang.c:670
+#: src/lang.c:680
 msgid "Cannot move into new newsgroups. Subscribe first..."
 msgstr ""
 
-#: src/lang.c:671
+#: src/lang.c:681
 msgid "<SPACE>"
 msgstr ""
 
-#: src/lang.c:672
+#: src/lang.c:682
 #, c-format
 msgid "Starting: (%s)"
 msgstr ""
 
-#: src/lang.c:673
+#: src/lang.c:683
 #, c-format
 msgid "List Thread (%d of %d)"
 msgstr ""
 
-#: src/lang.c:674
+#: src/lang.c:684
 #, c-format
 msgid "Thread (%.*s)"
 msgstr ""
 
-#: src/lang.c:675
+#: src/lang.c:685
 msgid "Enter wildcard subscribe pattern> "
 msgstr ""
 
-#: src/lang.c:676
+#: src/lang.c:686
 #, c-format
 msgid "subscribed to %d groups"
 msgstr ""
 
-#: src/lang.c:677
+#: src/lang.c:687
 #, c-format
 msgid "Subscribed to %s"
 msgstr ""
 
-#: src/lang.c:678
+#: src/lang.c:688
 msgid "Subscribing... "
 msgstr ""
 
-#: src/lang.c:679
-msgid "Repost or supersede article(s) [%%.*s]? (%s/%s/%s): "
+#: src/lang.c:689
+#, c-format
+msgid "Repost or supersede article(s) [%%s]? (%s/%s/%s): "
 msgstr ""
 
-#: src/lang.c:680
+#: src/lang.c:690
 #, c-format
 msgid "Supersede article(s) to group(s) [%s]> "
 msgstr ""
 
-#: src/lang.c:681
+#: src/lang.c:691
 msgid "Superseding article ..."
 msgstr ""
 
-#: src/lang.c:682
+#: src/lang.c:692
 #, c-format
 msgid ""
 "\n"
 "Stopped. Type 'fg' to restart %s\n"
 msgstr ""
 
-#: src/lang.c:684
+#: src/lang.c:694
 #, c-format
 msgid "%d days"
 msgstr ""
 
-#: src/lang.c:685
+#: src/lang.c:695
 msgid "<TAB>"
 msgstr ""
 
-#: src/lang.c:686
+#: src/lang.c:696
+msgid "TeX "
+msgstr ""
+
+#: src/lang.c:697
 msgid "# Default action/prompt strings\n"
 msgstr ""
 
-#: src/lang.c:687
+#: src/lang.c:698
 msgid ""
 "# Defaults for quick (1 key) kill & auto-selection filters\n"
 "# header=NUM  0,1=Subject: 2,3=From: 4=Message-ID: & full References: line\n"
@@ -2765,262 +2887,262 @@ msgid ""
 "# expire=ON/OFF  ON=limit to default_filter_days OFF=don't ever expire\n"
 msgstr ""
 
-#: src/lang.c:700
+#: src/lang.c:711
 msgid ""
 "# If ON use print current subject or newsgroup description in the last line\n"
 msgstr ""
 
-#: src/lang.c:701
+#: src/lang.c:712
 msgid "# Host & time info used for detecting new groups (don't touch)\n"
 msgstr ""
 
-#: src/lang.c:702
+#: src/lang.c:713
 msgid "There is no news\n"
 msgstr ""
 
-#: src/lang.c:703
+#: src/lang.c:714
 msgid "Thread"
 msgstr ""
 
-#: src/lang.c:704
+#: src/lang.c:715
 msgid "Thread Level Commands"
 msgstr ""
 
-#: src/lang.c:705
+#: src/lang.c:716
 msgid "Thread deselected"
 msgstr ""
 
-#: src/lang.c:706
+#: src/lang.c:717
 msgid "Thread selected"
 msgstr ""
 
-#: src/lang.c:707
+#: src/lang.c:719
 msgid "threads"
 msgstr ""
 
-#: src/lang.c:708
+#: src/lang.c:721
 msgid "Thread range"
 msgstr ""
 
-#: src/lang.c:709
+#: src/lang.c:722
 msgid "thread"
 msgstr ""
 
-#: src/lang.c:710
+#: src/lang.c:723
 #, c-format
-msgid "%sThread %4s of %4s"
+msgid "Thread %4s of %4s"
 msgstr ""
 
-#: src/lang.c:711
+#: src/lang.c:724
 msgid "Threading articles..."
 msgstr ""
 
-#: src/lang.c:712
+#: src/lang.c:725
 #, c-format
 msgid "Toggled word highlighting %s"
 msgstr ""
 
-#: src/lang.c:713
+#: src/lang.c:726
 msgid "Toggled rot13 encoding"
 msgstr ""
 
-#: src/lang.c:714
+#: src/lang.c:727
 #, c-format
 msgid "Toggled german TeX encoding %s"
 msgstr ""
 
-#: src/lang.c:715
+#: src/lang.c:728
 #, c-format
 msgid "Toggled tab-width to %d"
 msgstr ""
 
-#: src/lang.c:716
+#: src/lang.c:729
 #, c-format
 msgid "%d Trying to dotlock %s"
 msgstr ""
 
-#: src/lang.c:717
+#: src/lang.c:730
 #, c-format
 msgid "%d Trying to lock %s"
 msgstr ""
 
-#: src/lang.c:718
+#: src/lang.c:731
 msgid "           h=help\n"
 msgstr ""
 
-#: src/lang.c:720
+#: src/lang.c:733
 msgid "Unlimited"
 msgstr ""
 
-#: src/lang.c:721
+#: src/lang.c:734
 msgid "Enter wildcard unsubscribe pattern> "
 msgstr ""
 
-#: src/lang.c:722
+#: src/lang.c:735
 #, c-format
 msgid "Error decoding %s : %s"
 msgstr ""
 
-#: src/lang.c:723
+#: src/lang.c:736
 msgid "No end."
 msgstr ""
 
-#: src/lang.c:724
+#: src/lang.c:737
 #, c-format
 msgid "%s successfully decoded."
 msgstr ""
 
-#: src/lang.c:725
+#: src/lang.c:738
 #, c-format
 msgid ""
 "%*s[-- %s/%s, %suuencoded file, %d lines, name: %s --]\n"
 "\n"
 msgstr ""
 
-#: src/lang.c:726
+#: src/lang.c:739
 msgid "unread "
 msgstr ""
 
-#: src/lang.c:727
+#: src/lang.c:740
 #, c-format
 msgid "unsubscribed from %d groups"
 msgstr ""
 
-#: src/lang.c:728
+#: src/lang.c:741
 #, c-format
 msgid "Unsubscribed from %s"
 msgstr ""
 
-#: src/lang.c:729
+#: src/lang.c:742
 msgid "Unsubscribing... "
 msgstr ""
 
-#: src/lang.c:730
+#: src/lang.c:743
 msgid "Unthreading articles..."
 msgstr ""
 
-#: src/lang.c:731
+#: src/lang.c:744
 msgid "Updated"
 msgstr ""
 
-#: src/lang.c:732
+#: src/lang.c:745
 msgid "Updating"
 msgstr ""
 
-#: src/lang.c:733
+#: src/lang.c:746
 #, c-format
 msgid "Opening %s\n"
 msgstr ""
 
-#: src/lang.c:734
+#: src/lang.c:747
 msgid "No more URL's in this article"
 msgstr ""
 
-#: src/lang.c:735
+#: src/lang.c:748
 msgid "Use MIME display program for this message?"
 msgstr ""
 
-#: src/lang.c:736
+#: src/lang.c:749
 msgid "  -c       mark all news as read in subscribed newsgroups (batch mode)"
 msgstr ""
 
-#: src/lang.c:737
+#: src/lang.c:750
 msgid "  -Z       return status indicating if any unread news (batch mode)"
 msgstr ""
 
-#: src/lang.c:738
+#: src/lang.c:751
 msgid "  -q       don't check for new newsgroups"
 msgstr ""
 
-#: src/lang.c:739
+#: src/lang.c:752
 msgid "  -X       don't save any files on quit"
 msgstr ""
 
-#: src/lang.c:740
+#: src/lang.c:753
 msgid "  -d       don't show newsgroup descriptions"
 msgstr ""
 
-#: src/lang.c:741
+#: src/lang.c:754
 msgid "  -G limit get only limit articles/group"
 msgstr ""
 
-#: src/lang.c:742
+#: src/lang.c:755
 #, c-format
 msgid "  -H       help information about %s"
 msgstr ""
 
-#: src/lang.c:743
+#: src/lang.c:756
 msgid "  -h       this help message"
 msgstr ""
 
-#: src/lang.c:744
+#: src/lang.c:757
 #, c-format
 msgid "  -I dir   news index file directory [default=%s]"
 msgstr ""
 
-#: src/lang.c:745
+#: src/lang.c:758
 msgid "  -u       update index files (batch mode)"
 msgstr ""
 
-#: src/lang.c:746
+#: src/lang.c:759
 #, c-format
 msgid "  -m dir   mailbox directory [default=%s]"
 msgstr ""
 
-#: src/lang.c:747
+#: src/lang.c:760
 #, c-format
 msgid ""
 "\n"
 "Mail bug reports/comments to %s"
 msgstr ""
 
-#: src/lang.c:748
+#: src/lang.c:761
 msgid "  -N       mail new news to your posts (batch mode)"
 msgstr ""
 
-#: src/lang.c:749
+#: src/lang.c:762
 msgid "  -M user  mail new news to specified user (batch mode)"
 msgstr ""
 
-#: src/lang.c:750
+#: src/lang.c:763
 #, c-format
 msgid "  -f file  subscribed to newsgroups file [default=%s]"
 msgstr ""
 
-#: src/lang.c:751
+#: src/lang.c:764
 msgid "  -x       no posting mode"
 msgstr ""
 
-#: src/lang.c:752
+#: src/lang.c:765
 msgid "  -w       post an article and exit"
 msgstr ""
 
-#: src/lang.c:753
+#: src/lang.c:766
 msgid "  -o       post all postponed articles and exit"
 msgstr ""
 
-#: src/lang.c:754
+#: src/lang.c:767
 msgid "  -r       read news remotely from default NNTP server"
 msgstr ""
 
-#: src/lang.c:755
+#: src/lang.c:768
 msgid "  -R       read news saved by -S option"
 msgstr ""
 
-#: src/lang.c:756
+#: src/lang.c:769
 #, c-format
 msgid "  -s dir   save news directory [default=%s]"
 msgstr ""
 
-#: src/lang.c:757
+#: src/lang.c:770
 msgid "  -S       save new news for later reading (batch mode)"
 msgstr ""
 
-#: src/lang.c:758
+#: src/lang.c:771
 msgid "  -z       start if any unread news"
 msgstr ""
 
-#: src/lang.c:759
+#: src/lang.c:772
 #, c-format
 msgid ""
 "A Usenet reader.\n"
@@ -3028,37 +3150,37 @@ msgid ""
 "Usage: %s [options] [newsgroup[,...]]"
 msgstr ""
 
-#: src/lang.c:760
+#: src/lang.c:773
 msgid "  -v       verbose output for batch mode options"
 msgstr ""
 
-#: src/lang.c:761
+#: src/lang.c:774
 msgid "  -V       print version & date information"
 msgstr ""
 
-#: src/lang.c:762
+#: src/lang.c:775
 #, c-format
 msgid "%s only useful without batch mode operations\n"
 msgstr ""
 
-#: src/lang.c:763
+#: src/lang.c:776
 #, c-format
 msgid "%s only useful for batch mode operations\n"
 msgstr ""
 
-#: src/lang.c:765
+#: src/lang.c:778
 #, c-format
 msgid ""
 "\n"
 "%s%d out of range (0 - %d). Reset to 0"
 msgstr ""
 
-#: src/lang.c:766
+#: src/lang.c:779
 #, c-format
 msgid "View '%s' (%s/%s)?"
 msgstr ""
 
-#: src/lang.c:768
+#: src/lang.c:781
 #, c-format
 msgid ""
 "\n"
@@ -3066,33 +3188,33 @@ msgid ""
 "%-100s\n"
 msgstr ""
 
-#: src/lang.c:769
+#: src/lang.c:782
 msgid ""
 "\n"
 "Warning: article unchanged after editing\n"
 msgstr ""
 
-#: src/lang.c:770
+#: src/lang.c:783
 msgid ""
 "\n"
 "Warning: \"Subject:\" contains only whitespaces.\n"
 msgstr ""
 
-#: src/lang.c:771
+#: src/lang.c:784
 msgid ""
 "\n"
-"Warning: \"Subject:\" begins with \"Re: \" but there are no "
-"\"References:\".\n"
+"Warning: \"Subject:\" begins with \"Re: \" but there are no \"References:"
+"\".\n"
 msgstr ""
 
-#: src/lang.c:773
+#: src/lang.c:786
 msgid ""
 "\n"
 "Warning: Article has \"References:\" but \"Subject:\" does not begin\n"
 "         with \"Re: \" and does not contain \"(was:\".\n"
 msgstr ""
 
-#: src/lang.c:776
+#: src/lang.c:789
 msgid ""
 "Read carefully!\n"
 "\n"
@@ -3106,7 +3228,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/lang.c:780
+#: src/lang.c:793
 msgid ""
 "\n"
 "Warning: You are using a non-plain transfer encoding (such as base64 or\n"
@@ -3115,7 +3237,7 @@ msgid ""
 "         not be encoded properly.\n"
 msgstr ""
 
-#: src/lang.c:785
+#: src/lang.c:798
 #, c-format
 msgid ""
 "\n"
@@ -3125,7 +3247,7 @@ msgid ""
 "Read WHATSNEW, etc...\n"
 msgstr ""
 
-#: src/lang.c:787
+#: src/lang.c:800
 #, c-format
 msgid ""
 "\n"
@@ -3134,7 +3256,7 @@ msgid ""
 "Some values in your %s file may be ignored, others might have changed!\n"
 msgstr ""
 
-#: src/lang.c:790
+#: src/lang.c:803
 #, c-format
 msgid ""
 "Warning: tin wrote fewer groups to your\n"
@@ -3144,19 +3266,19 @@ msgid ""
 "before you start tin once again!\n"
 msgstr ""
 
-#: src/lang.c:794
+#: src/lang.c:807
 #, c-format
 msgid ""
 "\n"
 "Warning: Found %d '-- \\n' lines, this may confuse some people.\n"
 msgstr ""
 
-#: src/lang.c:795
+#: src/lang.c:808
 #, c-format
 msgid "Warning: Only %d out of %d articles were saved"
 msgstr ""
 
-#: src/lang.c:796
+#: src/lang.c:809
 #, c-format
 msgid ""
 "\n"
@@ -3167,49 +3289,49 @@ msgid ""
 "         possible.\n"
 msgstr ""
 
-#: src/lang.c:800
+#: src/lang.c:813
 #, c-format
 msgid ""
 "Warning: this mail address may contain a spamtrap. %s=continue, %s=abort? "
 msgstr ""
 
-#: src/lang.c:801
+#: src/lang.c:814
 msgid ""
 "\n"
 "Warning: Signatures should start with '-- \\n' not with '--\\n'.\n"
 msgstr ""
 
-#: src/lang.c:802
+#: src/lang.c:815
 msgid "Writing attributes file..."
 msgstr ""
 
-#: src/lang.c:804
+#: src/lang.c:817
 #, c-format
-msgid "%d Responses%s"
+msgid "%d Responses"
 msgstr ""
 
-#: src/lang.c:806
+#: src/lang.c:819
 #, c-format
 msgid "Added %d %s"
 msgstr ""
 
-#: src/lang.c:807
+#: src/lang.c:820
 msgid "No unsubscribed groups to show"
 msgstr ""
 
-#: src/lang.c:808
+#: src/lang.c:821
 msgid "Showing subscribed to groups only"
 msgstr ""
 
-#: src/lang.c:809
+#: src/lang.c:822
 msgid "Yes "
 msgstr ""
 
-#: src/lang.c:810
+#: src/lang.c:823
 msgid "    You have mail\n"
 msgstr ""
 
-#: src/lang.c:815
+#: src/lang.c:828
 #, c-format
 msgid ""
 "\n"
@@ -3222,16 +3344,11 @@ msgid ""
 "         M)enu option.\n"
 msgstr ""
 
-#: src/lang.c:826
-#, c-format
-msgid "Redefined key %s '%s' -> '%s'\n"
-msgstr ""
-
-#: src/lang.c:827
+#: src/lang.c:839
 msgid "  -D       debug mode 1=NNTP 2=ALL"
 msgstr ""
 
-#: src/lang.c:831
+#: src/lang.c:843
 msgid ""
 "Read carefully!\n"
 "\n"
@@ -3248,377 +3365,388 @@ msgid ""
 "\n"
 msgstr ""
 
-#: src/lang.c:840
+#: src/lang.c:852
 msgid "toggle color"
 msgstr ""
 
-#: src/lang.c:841
+#: src/lang.c:853
 msgid ""
-"# For color-adjust use the following numbers\n"
-"#  0-black       1-red         2-green        3-brown\n"
-"#  4-blue        5-pink        6-cyan         7-white\n"
+"# Changing colors of several screen parts\n"
+"# Possible values are:\n"
+"#  -1 = default (white for foreground and black for background)\n"
+"#   0 = black\n"
+"#   1 = red\n"
+"#   2 = green\n"
+"#   3 = brown\n"
+"#   4 = blue\n"
+"#   5 = pink\n"
+"#   6 = cyan\n"
+"#   7 = white\n"
 "# These are *only* for foreground:\n"
-"#  8-gray        9-lightred   10-lightgreen  11-yellow\n"
-"# 12-lightblue  13-lightpink  14-lightcyan   15-lightwhite\n"
-"# A '-1' is interpreted as default (foreground normally is white, and\n"
-"# background black)\n"
+"#   8 = gray\n"
+"#   9 = light red\n"
+"#  10 = light green\n"
+"#  11 = yellow\n"
+"#  12 = light blue\n"
+"#  13 = light pink\n"
+"#  14 = light cyan\n"
+"#  15 = light white\n"
 "\n"
 msgstr ""
 
-#: src/lang.c:849
+#: src/lang.c:873
 msgid "  -a       toggle color flag"
 msgstr ""
 
-#: src/lang.c:853
+#: src/lang.c:877
 msgid ""
 "\n"
 "Error: Followup-To set to more than one newsgroup!\n"
 msgstr ""
 
-#: src/lang.c:854
+#: src/lang.c:878
 #, c-format
 msgid ""
 "\n"
 "Error: cross-posting to %d newsgroups and no Followup-To line!\n"
 msgstr ""
 
-#: src/lang.c:855
+#: src/lang.c:879
 #, c-format
 msgid ""
 "\n"
 "Error: \"%s\" is not a valid newsgroup!\n"
 msgstr ""
 
-#: src/lang.c:857
+#: src/lang.c:881
 msgid ""
 "\n"
 "Warning: Followup-To set to more than one newsgroup!\n"
 msgstr ""
 
-#: src/lang.c:858
+#: src/lang.c:882
 #, c-format
 msgid ""
 "\n"
 "Warning: cross-posting to %d newsgroups and no Followup-To line!\n"
 msgstr ""
 
-#: src/lang.c:859
+#: src/lang.c:883
 #, c-format
 msgid ""
 "\n"
 "Warning: \"%s\" is not in your newsrc, it may be invalid at this site!\n"
 msgstr ""
 
-#: src/lang.c:860
+#: src/lang.c:884
 #, c-format
 msgid ""
 "\n"
 "Warning: \"%s\" is not a valid newsgroup at this site!\n"
 msgstr ""
 
-#: src/lang.c:864
+#: src/lang.c:888
 #, c-format
 msgid "%d files successfully written from %d articles. %d %s occurred."
 msgstr ""
 
-#: src/lang.c:865
+#: src/lang.c:889
 msgid "Missing parts."
 msgstr ""
 
-#: src/lang.c:866
+#: src/lang.c:890
 msgid "No beginning."
 msgstr ""
 
-#: src/lang.c:867
+#: src/lang.c:891
 msgid "No data."
 msgstr ""
 
-#: src/lang.c:868
+#: src/lang.c:892
 msgid "Unknown error."
 msgstr ""
 
-#: src/lang.c:870
+#: src/lang.c:895
 #, c-format
 msgid "\tChecksum of %s (%ld %s)"
 msgstr ""
 
-#: src/lang.c:874
+#: src/lang.c:900
 msgid "Reading mail active file... "
 msgstr ""
 
-#: src/lang.c:875
+#: src/lang.c:901
 msgid "Reading mailgroups file... "
 msgstr ""
 
-#: src/lang.c:879
+#: src/lang.c:905
 msgid "perform PGP operations on article"
 msgstr ""
 
-#: src/lang.c:880
+#: src/lang.c:906
 msgid "Add key(s) to public keyring?"
 msgstr ""
 
-#: src/lang.c:881
+#: src/lang.c:907
 #, c-format
 msgid "%s=encrypt, %s=sign, %s=both, %s=quit: "
 msgstr ""
 
-#: src/lang.c:882
+#: src/lang.c:908
 #, c-format
 msgid "%s=sign, %s=sign & include public key, %s=quit: "
 msgstr ""
 
-#: src/lang.c:883
+#: src/lang.c:909
 #, c-format
 msgid "PGP has not been set up (can't open %s)"
 msgstr ""
 
-#: src/lang.c:884
+#: src/lang.c:910
 msgid "Article not signed and no public keys found"
 msgstr ""
 
-#: src/lang.c:886
+#: src/lang.c:912
 #, c-format
 msgid "%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone: "
 msgstr ""
 
-#: src/lang.c:887
-msgid "%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%.*s]: "
+#: src/lang.c:913
+#, c-format
+msgid "%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%s]: "
 msgstr ""
 
-#: src/lang.c:888
+#: src/lang.c:914
+#, c-format
 msgid ""
-"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%.*s]: "
+"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
 msgstr ""
 
-#: src/lang.c:890
+#: src/lang.c:916
 #, c-format
 msgid "%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone: "
 msgstr ""
 
-#: src/lang.c:891
-msgid "%s=quit, %s=edit, %s=pgp, %s=send [%%.*s]: "
+#: src/lang.c:917
+#, c-format
+msgid "%s=quit, %s=edit, %s=pgp, %s=send [%%s]: "
 msgstr ""
 
-#: src/lang.c:892
-msgid "%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%.*s]: "
+#: src/lang.c:918
+#, c-format
+msgid "%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
 msgstr ""
 
-#: src/lang.c:896
+#: src/lang.c:922
 #, c-format
 msgid "%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone: "
 msgstr ""
 
-#: src/lang.c:897
-msgid "%s=quit, %s=edit, %s=ispell, %s=send [%%.*s]: "
+#: src/lang.c:923
+#, c-format
+msgid "%s=quit, %s=edit, %s=ispell, %s=send [%%s]: "
 msgstr ""
 
-#: src/lang.c:898
-msgid "%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%.*s]: "
+#: src/lang.c:924
+#, c-format
+msgid "%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%s]: "
 msgstr ""
 
-#: src/lang.c:900
+#: src/lang.c:926
 #, c-format
 msgid "%s=quit, %s=edit, %s=menu, %s=post, %s=postpone: "
 msgstr ""
 
-#: src/lang.c:901
-msgid "%s=quit, %s=edit, %s=send [%%.*s]: "
-msgstr ""
-
-#: src/lang.c:902
-msgid "%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%.*s]: "
-msgstr ""
-
-#: src/lang.c:908
+#: src/lang.c:927
 #, c-format
-msgid "Environment variable %s not found. Set and retry..."
+msgid "%s=quit, %s=edit, %s=send [%%s]: "
 msgstr ""
 
-#: src/lang.c:909
-msgid "  -B       BBS mode. File operations limited to home directories."
+#: src/lang.c:928
+#, c-format
+msgid "%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%s]: "
 msgstr ""
 
-#: src/lang.c:917
+#: src/lang.c:937
 msgid "Try cache_overview_files to speed up things.\n"
 msgstr ""
 
-#: src/lang.c:918
+#: src/lang.c:938
 msgid "Tin will use local index files instead.\n"
 msgstr ""
 
-#: src/lang.c:919
+#: src/lang.c:939
 msgid "Cannot find NNTP server name"
 msgstr ""
 
-#: src/lang.c:920
+#: src/lang.c:940
 #, c-format
 msgid "Connecting to %s:%d..."
 msgstr ""
 
-#: src/lang.c:921
+#: src/lang.c:941
 msgid "Disconnecting from server...\n"
 msgstr ""
 
-#: src/lang.c:922
+#: src/lang.c:942
 #, c-format
 msgid "Wrong newsgroup name in response of GROUP command, %s for %s"
 msgstr ""
 
-#: src/lang.c:923
+#: src/lang.c:943
 #, c-format
 msgid "Failed to connect to NNTP server %s. Exiting..."
 msgstr ""
 
-#: src/lang.c:924 src/nntplib.c:975
+#: src/lang.c:944
 msgid "205  Closing connection"
 msgstr ""
 
-#: src/lang.c:925
+#: src/lang.c:945
 msgid "Your server does not support the NNTP XOVER or OVER command.\n"
 msgstr ""
 
-#: src/lang.c:926
+#: src/lang.c:946
 msgid "Connection to news server has timed out. Reconnect?"
 msgstr ""
 
-#: src/lang.c:927
+#: src/lang.c:947
 #, c-format
 msgid ""
 "Put the server name in the file %s,\n"
 "or set the environment variable NNTPSERVER"
 msgstr ""
 
-#: src/lang.c:928
+#: src/lang.c:948
 msgid "  -A       force authentication on connect"
 msgstr ""
 
-#: src/lang.c:929
+#: src/lang.c:949
 #, c-format
 msgid "  -g serv  read news from NNTP server serv [default=%s]"
 msgstr ""
 
-#: src/lang.c:930
+#: src/lang.c:950
 #, c-format
 msgid "  -p port  use port as NNTP port [default=%d]"
 msgstr ""
 
-#: src/lang.c:931
+#: src/lang.c:951
 msgid "  -Q       quick start. Same as -nqd"
 msgstr ""
 
-#: src/lang.c:932
+#: src/lang.c:952
 msgid "  -l       use only LIST instead of GROUP (-n) command"
 msgstr ""
 
-#: src/lang.c:933
+#: src/lang.c:953
 msgid "  -n       only read subscribed .newsrc groups from NNTP server"
 msgstr ""
 
-#: src/lang.c:935
+#: src/lang.c:955
 #, c-format
 msgid "%s/tcp: Unknown service.\n"
 msgstr ""
 
-#: src/lang.c:938
+#: src/lang.c:958
 msgid ""
 "\n"
 "socket or connect problem\n"
 msgstr ""
 
-#: src/lang.c:940
+#: src/lang.c:960
 #, c-format
 msgid ""
 "\n"
 "Connection to %s: "
 msgstr ""
 
-#: src/lang.c:941
+#: src/lang.c:961
 msgid "Giving up...\n"
 msgstr ""
 
-#: src/lang.c:944
+#: src/lang.c:964
 msgid ""
 "Your server does not have Xref: in its XOVER information.\n"
 "Tin will try to use XHDR XREF instead (slows down things a bit).\n"
 msgstr ""
 
-#: src/lang.c:947
+#: src/lang.c:967
 msgid "Your server does not have Xref: in its XOVER information.\n"
 msgstr ""
 
-#: src/lang.c:950
+#: src/lang.c:970
 #, c-format
 msgid "Can't open %s. Try %s -r to read news via NNTP.\n"
 msgstr ""
 
-#: src/lang.c:953
+#: src/lang.c:973
 msgid "  -Q       quick start. Same as -qd"
 msgstr ""
 
-#: src/lang.c:954
+#: src/lang.c:974
 msgid "  -l       read only active file instead of scanning spool (-n) command"
 msgstr ""
 
-#: src/lang.c:955
+#: src/lang.c:975
 msgid "  -n       only read subscribed .newsrc groups from spool"
 msgstr ""
 
-#: src/lang.c:956
+#: src/lang.c:976
 msgid "Your server does not have Xref: in its NOV-files.\n"
 msgstr ""
 
-#: src/lang.c:960
+#: src/lang.c:980
 msgid "Posting using external inews failed. Use built in inews instead?"
 msgstr ""
 
-#: src/lang.c:961
+#: src/lang.c:981
 msgid "It worked! Should I always use my built in inews from now on?"
 msgstr ""
 
-#: src/lang.c:969
+#: src/lang.c:989
 #, c-format
 msgid "%d %s printed"
 msgstr ""
 
-#: src/lang.c:970
+#: src/lang.c:990
 msgid "output article/thread/hot/pattern/tagged articles to printer"
 msgstr ""
 
-#: src/lang.c:971
+#: src/lang.c:991
 msgid "Print"
 msgstr ""
 
-#: src/lang.c:972
+#: src/lang.c:992
 msgid "Printing..."
 msgstr ""
 
-#: src/lang.c:976
+#: src/lang.c:996
 msgid "pipe article/thread/hot/pattern/tagged articles into command"
 msgstr ""
 
-#: src/lang.c:977
+#: src/lang.c:997
 msgid "No command"
 msgstr ""
 
-#: src/lang.c:978
+#: src/lang.c:998
 msgid "Pipe"
 msgstr ""
 
-#: src/lang.c:979
+#: src/lang.c:999
 #, c-format
 msgid "Pipe to command [%.*s]> "
 msgstr ""
 
-#: src/lang.c:980
+#: src/lang.c:1000
 msgid "Piping..."
 msgstr ""
 
-#: src/lang.c:982
+#: src/lang.c:1002
 msgid "Piping not enabled."
 msgstr ""
 
-#: src/lang.c:986
+#: src/lang.c:1006
 #, c-format
 msgid ""
 "\n"
@@ -3628,7 +3756,7 @@ msgid ""
 "       newsgroup names.\n"
 msgstr ""
 
-#: src/lang.c:991
+#: src/lang.c:1011
 #, c-format
 msgid ""
 "\n"
@@ -3637,7 +3765,7 @@ msgid ""
 "       Please write all newsgroups into a single line.\n"
 msgstr ""
 
-#: src/lang.c:996
+#: src/lang.c:1016
 #, c-format
 msgid ""
 "\n"
@@ -3646,14 +3774,14 @@ msgid ""
 "         To avoid trouble please write all newsgroups into a single line.\n"
 msgstr ""
 
-#: src/lang.c:1000
+#: src/lang.c:1020
 #, c-format
 msgid ""
 "\n"
 "Warning: The \"%s:\" line has spaces in it that SHOULD be removed.\n"
 msgstr ""
 
-#: src/lang.c:1005
+#: src/lang.c:1025
 msgid ""
 "\n"
 "  If your article contains quoted text  please take some time to pare it "
@@ -3675,864 +3803,963 @@ msgid ""
 "  likely to ignore it completely.  It's a crowded net out there.\n"
 msgstr ""
 
-#: src/lang.c:1018
+#: src/lang.c:1038
 msgid "shell escape"
 msgstr ""
 
-#: src/lang.c:1019
+#: src/lang.c:1039
 #, c-format
 msgid "Shell Command (%s)"
 msgstr ""
 
-#: src/lang.c:1020
+#: src/lang.c:1040
 #, c-format
 msgid "Enter shell command [%s]> "
 msgstr ""
 
-#: src/lang.c:1024
+#: src/lang.c:1044
 #, c-format
 msgid "%s: Can't get entry for TERM\n"
 msgstr ""
 
-#: src/lang.c:1028
+#: src/lang.c:1048
 #, c-format
 msgid "Group %.*s ('q' to quit)..."
 msgstr ""
 
-#: src/lang.c:1030
+#: src/lang.c:1050
 #, c-format
 msgid "Group %.*s..."
 msgstr ""
 
-#: src/lang.c:1034
+#: src/lang.c:1054
 msgid "Server unavailable\n"
 msgstr ""
 
-#: src/lang.c:1040
+#: src/lang.c:1060
 #, c-format
 msgid ""
-"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; "
-"%s=post"
+"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %"
+"s=post"
 msgstr ""
 
-#: src/lang.c:1041
+#: src/lang.c:1061
 #, c-format
 msgid ""
 "%s=pipe; %s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr ""
 
-#: src/lang.c:1043
+#: src/lang.c:1063
 #, c-format
 msgid ""
 "%s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
 msgstr ""
 
-#: src/lang.c:1044
+#: src/lang.c:1064
 #, c-format
 msgid "%s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr ""
 
-#: src/lang.c:1048
+#: src/lang.c:1068
 #, c-format
 msgid ""
 "%s=pipe; %s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
 msgstr ""
 
-#: src/lang.c:1049
+#: src/lang.c:1069
 #, c-format
 msgid "%s=pipe; %s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr ""
 
-#: src/lang.c:1051
+#: src/lang.c:1071
 #, c-format
 msgid "%s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
 msgstr ""
 
-#: src/lang.c:1052
+#: src/lang.c:1072
 #, c-format
 msgid "%s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
 msgstr ""
 
-#: src/lang.c:1058
+#: src/lang.c:1078
 msgid "Terminal does not support color"
 msgstr ""
 
-#: src/lang.c:1063
+#: src/lang.c:1083
 #, c-format
 msgid "Trying %s"
 msgstr ""
 
-#: src/lang.c:1077 src/lang.c:1102 src/lang.c:1118 src/refs.c:266
+#: src/lang.c:1097 src/lang.c:1123 src/lang.c:1139 src/lang.c:1318
+#: src/refs.c:296
 msgid "None"
 msgstr ""
 
-#: src/lang.c:1078
+#: src/lang.c:1098
 msgid "Subject"
 msgstr ""
 
-#: src/lang.c:1079
+#: src/lang.c:1099
 msgid "References"
 msgstr ""
 
-#: src/lang.c:1080
+#: src/lang.c:1100
 msgid "Both Subject and References"
 msgstr ""
 
-#: src/lang.c:1081
+#: src/lang.c:1101
 msgid "Multipart Subject"
 msgstr ""
 
-#: src/lang.c:1093 src/lang.c:1204
+#: src/lang.c:1102
+msgid "Percentage Match"
+msgstr ""
+
+#: src/lang.c:1114 src/lang.c:1225
 msgid "No"
 msgstr ""
 
-#: src/lang.c:1094 src/lang.c:1206
+#: src/lang.c:1115 src/lang.c:1227
 msgid "Yes"
 msgstr ""
 
-#: src/lang.c:1095
+#: src/lang.c:1116
 msgid "Hide All"
 msgstr ""
 
-#: src/lang.c:1103
+#: src/lang.c:1124
 msgid "Address"
 msgstr ""
 
-#: src/lang.c:1104
+#: src/lang.c:1125
 msgid "Full Name"
 msgstr ""
 
-#: src/lang.c:1105
+#: src/lang.c:1126
 msgid "Address and Name"
 msgstr ""
 
-#: src/lang.c:1112
+#: src/lang.c:1133
 msgid "Max"
 msgstr ""
 
-#: src/lang.c:1113
+#: src/lang.c:1134
 msgid "Sum"
 msgstr ""
 
-#: src/lang.c:1114
+#: src/lang.c:1135
 msgid "Average"
 msgstr ""
 
-#: src/lang.c:1119
+#: src/lang.c:1140
 msgid "Lines"
 msgstr ""
 
-#: src/lang.c:1120
+#: src/lang.c:1141
 msgid "Score"
 msgstr ""
 
-#: src/lang.c:1121
+#: src/lang.c:1142
 msgid "Lines & Score"
 msgstr ""
 
-#: src/lang.c:1130
+#: src/lang.c:1151
 msgid "Black"
 msgstr ""
 
-#: src/lang.c:1131
+#: src/lang.c:1152
 msgid "Red"
 msgstr ""
 
-#: src/lang.c:1132
+#: src/lang.c:1153
 msgid "Green"
 msgstr ""
 
-#: src/lang.c:1133
+#: src/lang.c:1154
 msgid "Brown"
 msgstr ""
 
-#: src/lang.c:1134
+#: src/lang.c:1155
 msgid "Blue"
 msgstr ""
 
-#: src/lang.c:1135
+#: src/lang.c:1156
 msgid "Pink"
 msgstr ""
 
-#: src/lang.c:1136
+#: src/lang.c:1157
 msgid "Cyan"
 msgstr ""
 
-#: src/lang.c:1137
+#: src/lang.c:1158
 msgid "White"
 msgstr ""
 
-#: src/lang.c:1138
+#: src/lang.c:1159
 msgid "Gray"
 msgstr ""
 
-#: src/lang.c:1139
+#: src/lang.c:1160
 msgid "Light Red"
 msgstr ""
 
-#: src/lang.c:1140
+#: src/lang.c:1161
 msgid "Light Green"
 msgstr ""
 
-#: src/lang.c:1141
+#: src/lang.c:1162
 msgid "Yellow"
 msgstr ""
 
-#: src/lang.c:1142
+#: src/lang.c:1163
 msgid "Light Blue"
 msgstr ""
 
-#: src/lang.c:1143
+#: src/lang.c:1164
 msgid "Light Pink"
 msgstr ""
 
-#: src/lang.c:1144
+#: src/lang.c:1165
 msgid "Light Cyan"
 msgstr ""
 
-#: src/lang.c:1145
+#: src/lang.c:1166
 msgid "Light White"
 msgstr ""
 
-#: src/lang.c:1153 src/lang.c:1210 src/lang.c:1224
+#: src/lang.c:1174 src/lang.c:1231 src/lang.c:1245
 msgid "Nothing"
 msgstr ""
 
-#: src/lang.c:1154
+#: src/lang.c:1175
 msgid "Mark"
 msgstr ""
 
-#: src/lang.c:1155
+#: src/lang.c:1176
 msgid "Space"
 msgstr ""
 
-#: src/lang.c:1162
+#: src/lang.c:1183
 msgid "Normal"
 msgstr ""
 
-#: src/lang.c:1163
+#: src/lang.c:1184
 msgid "Best highlighting"
 msgstr ""
 
-#: src/lang.c:1164
+#: src/lang.c:1185
 msgid "Underline"
 msgstr ""
 
-#: src/lang.c:1165
+#: src/lang.c:1186
 msgid "Reverse video"
 msgstr ""
 
-#: src/lang.c:1166
+#: src/lang.c:1187
 msgid "Blinking"
 msgstr ""
 
-#: src/lang.c:1167
+#: src/lang.c:1188
 msgid "Half bright"
 msgstr ""
 
-#: src/lang.c:1168
+#: src/lang.c:1189
 msgid "Bold"
 msgstr ""
 
-#: src/lang.c:1173
+#: src/lang.c:1194
 msgid "none"
 msgstr ""
 
-#: src/lang.c:1174
+#: src/lang.c:1195
 msgid "commands"
 msgstr ""
 
-#: src/lang.c:1175
+#: src/lang.c:1196
 msgid "select"
 msgstr ""
 
-#: src/lang.c:1177
+#: src/lang.c:1198
 msgid "commands & quit"
 msgstr ""
 
-#: src/lang.c:1178
+#: src/lang.c:1199
 msgid "commands & select"
 msgstr ""
 
-#: src/lang.c:1179
+#: src/lang.c:1200
 msgid "quit & select"
 msgstr ""
 
-#: src/lang.c:1180
+#: src/lang.c:1201
 msgid "commands & quit & select"
 msgstr ""
 
-#: src/lang.c:1205
+#: src/lang.c:1226
 msgid "Shell archive"
 msgstr ""
 
-#: src/lang.c:1211
+#: src/lang.c:1232
 msgid "Subject: (descending)"
 msgstr ""
 
-#: src/lang.c:1212
+#: src/lang.c:1233
 msgid "Subject: (ascending)"
 msgstr ""
 
-#: src/lang.c:1213
+#: src/lang.c:1234
 msgid "From: (descending)"
 msgstr ""
 
-#: src/lang.c:1214
+#: src/lang.c:1235
 msgid "From: (ascending)"
 msgstr ""
 
-#: src/lang.c:1215
+#: src/lang.c:1236
 msgid "Date: (descending)"
 msgstr ""
 
-#: src/lang.c:1216
+#: src/lang.c:1237
 msgid "Date: (ascending)"
 msgstr ""
 
-#: src/lang.c:1217 src/lang.c:1225
+#: src/lang.c:1238 src/lang.c:1246
 msgid "Score (descending)"
 msgstr ""
 
-#: src/lang.c:1218 src/lang.c:1226
+#: src/lang.c:1239 src/lang.c:1247
 msgid "Score (ascending)"
 msgstr ""
 
-#: src/lang.c:1219
+#: src/lang.c:1240
 msgid "Lines: (descending)"
 msgstr ""
 
-#: src/lang.c:1220
+#: src/lang.c:1241
 msgid "Lines: (ascending)"
 msgstr ""
 
-#: src/lang.c:1231
+#: src/lang.c:1252
 msgid "Always Keep"
 msgstr ""
 
-#: src/lang.c:1232
+#: src/lang.c:1253
 msgid "Always Remove"
 msgstr ""
 
-#: src/lang.c:1233
+#: src/lang.c:1254
 msgid "Mark with D on selection screen"
 msgstr ""
 
-#: src/lang.c:1238
+#: src/lang.c:1259
 msgid "Kill only unread arts"
 msgstr ""
 
-#: src/lang.c:1239
+#: src/lang.c:1260
 msgid "Kill all arts & show with K"
 msgstr ""
 
 #. TODO: s/K/art_marked_killed/
-#: src/lang.c:1240
+#: src/lang.c:1261
 msgid "Kill all arts and never show"
 msgstr ""
 
-#: src/lang.c:1245
+#: src/lang.c:1266
 msgid "Nothing special"
 msgstr ""
 
-#: src/lang.c:1246
+#: src/lang.c:1267
 msgid "Compress quotes"
 msgstr ""
 
-#: src/lang.c:1247
+#: src/lang.c:1268
 msgid "Quote signatures"
 msgstr ""
 
-#: src/lang.c:1248
+#: src/lang.c:1269
 msgid "Compress quotes, quote sigs"
 msgstr ""
 
-#: src/lang.c:1249
+#: src/lang.c:1270
 msgid "Quote empty lines"
 msgstr ""
 
-#: src/lang.c:1250
+#: src/lang.c:1271
 msgid "Compress quotes, quote empty lines"
 msgstr ""
 
-#: src/lang.c:1251
+#: src/lang.c:1272
 msgid "Quote sigs & empty lines"
 msgstr ""
 
-#: src/lang.c:1252
+#: src/lang.c:1273
 msgid "Comp. q., quote sigs & empty lines"
 msgstr ""
 
-#: src/lang.c:1290
+#: src/lang.c:1311
+msgid "no"
+msgstr ""
+
+#: src/lang.c:1312
+msgid "with headers"
+msgstr ""
+
+#: src/lang.c:1313
+msgid "without headers"
+msgstr ""
+
+#: src/lang.c:1320 src/lang.c:1326
+msgid "NFKC"
+msgstr ""
+
+#: src/lang.c:1321
+msgid "NFKD"
+msgstr ""
+
+#: src/lang.c:1322
+msgid "NFC"
+msgstr ""
+
+#: src/lang.c:1323
+msgid "NFD"
+msgstr ""
+
+#: src/lang.c:1334
 msgid "Display Options"
 msgstr ""
 
-#: src/lang.c:1296
+#: src/lang.c:1341
 msgid "Color Options"
 msgstr ""
 
-#: src/lang.c:1302
+#: src/lang.c:1348
 msgid "Article-Limiting Options"
 msgstr ""
 
-#: src/lang.c:1308
+#: src/lang.c:1354
 msgid "Posting/Mailing Options"
 msgstr ""
 
-#: src/lang.c:1314
+#: src/lang.c:1360
 msgid "Saving/Printing Options"
 msgstr ""
 
-#: src/lang.c:1320
+#: src/lang.c:1366
 msgid "Expert Options"
 msgstr ""
 
-#: src/lang.c:1326
+#: src/lang.c:1372
 msgid "Filtering Options"
 msgstr ""
 
-#: src/lang.c:1331 src/lang.c:1357 src/lang.c:1363 src/lang.c:1370
-#: src/lang.c:1402 src/lang.c:1408 src/lang.c:1416 src/lang.c:1436
-#: src/lang.c:1511 src/lang.c:1673 src/lang.c:1679 src/lang.c:1685
-#: src/lang.c:1691 src/lang.c:1703 src/lang.c:1710 src/lang.c:1761
-#: src/lang.c:1770 src/lang.c:1776 src/lang.c:1782 src/lang.c:1788
-#: src/lang.c:1794 src/lang.c:1800 src/lang.c:1806 src/lang.c:1812
-#: src/lang.c:1818 src/lang.c:1824 src/lang.c:1830 src/lang.c:1836
-#: src/lang.c:1842 src/lang.c:1848 src/lang.c:1854 src/lang.c:1860
-#: src/lang.c:1866 src/lang.c:1872 src/lang.c:1878 src/lang.c:1884
-#: src/lang.c:1891 src/lang.c:1897 src/lang.c:1903 src/lang.c:1910
-#: src/lang.c:1921 src/lang.c:1927 src/lang.c:1933 src/lang.c:1939
-#: src/lang.c:1945 src/lang.c:1959 src/lang.c:1971 src/lang.c:2005
-#: src/lang.c:2057 src/lang.c:2064 src/lang.c:2070 src/lang.c:2095
-#: src/lang.c:2112 src/lang.c:2165 src/lang.c:2198 src/lang.c:2218
-#: src/lang.c:2253 src/lang.c:2261 src/lang.c:2286 src/lang.c:2298
+#: src/lang.c:1377 src/lang.c:1408 src/lang.c:1414 src/lang.c:1440
+#: src/lang.c:1490 src/lang.c:1496 src/lang.c:1506 src/lang.c:1526
+#: src/lang.c:1601 src/lang.c:1771 src/lang.c:1777 src/lang.c:1783
+#: src/lang.c:1789 src/lang.c:1801 src/lang.c:1808 src/lang.c:1862
+#: src/lang.c:1871 src/lang.c:1877 src/lang.c:1884 src/lang.c:1891
+#: src/lang.c:1898 src/lang.c:1905 src/lang.c:1912 src/lang.c:1919
+#: src/lang.c:1926 src/lang.c:1933 src/lang.c:1940 src/lang.c:1947
+#: src/lang.c:1954 src/lang.c:1961 src/lang.c:1968 src/lang.c:1975
+#: src/lang.c:1982 src/lang.c:1989 src/lang.c:1996 src/lang.c:2003
+#: src/lang.c:2010 src/lang.c:2017 src/lang.c:2024 src/lang.c:2031
+#: src/lang.c:2039 src/lang.c:2055 src/lang.c:2062 src/lang.c:2069
+#: src/lang.c:2076 src/lang.c:2082 src/lang.c:2088 src/lang.c:2105
+#: src/lang.c:2117 src/lang.c:2151 src/lang.c:2204 src/lang.c:2211
+#: src/lang.c:2217 src/lang.c:2242 src/lang.c:2259 src/lang.c:2312
+#: src/lang.c:2348 src/lang.c:2368 src/lang.c:2403 src/lang.c:2413
+#: src/lang.c:2438 src/lang.c:2454 src/lang.c:2473 src/lang.c:2486
 msgid "<SPACE> toggles, <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:1332
-msgid "Show mini menu & posting etiquette :"
+#: src/lang.c:1378
+msgid "Show mini menu & posting etiquette"
 msgstr ""
 
-#: src/lang.c:1333
+#: src/lang.c:1379
 msgid ""
 "# If ON show a mini menu of useful commands at each level\n"
 "# and posting etiquette after composing an article\n"
 msgstr ""
 
-#: src/lang.c:1338
+#: src/lang.c:1384
 msgid "Show short description for each newsgroup. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:1339
-msgid "Show description of each newsgroup :"
+#: src/lang.c:1385
+msgid "Show description of each newsgroup"
 msgstr ""
 
-#: src/lang.c:1340
+#: src/lang.c:1386
 msgid ""
 "# If ON show group description text after newsgroup name at\n"
 "# group selection level\n"
 msgstr ""
 
-#: src/lang.c:1345
+#: src/lang.c:1391
 msgid ""
 "Show Subject & From (author) fields in group menu. <SPACE> toggles & <CR> "
 "sets."
 msgstr ""
 
-#: src/lang.c:1346
-msgid "In group menu, show author by      :"
+#: src/lang.c:1392
+msgid "In group menu, show author by"
 msgstr ""
 
-#: src/lang.c:1347
+#: src/lang.c:1393
 msgid ""
-"# Part of from field to display 0) none 1) address 2) full name 3) both\n"
+"# Part of from field to display\n"
+"# Possible values are (the default is marked with *):\n"
+"#   0 = none\n"
+"#   1 = address\n"
+"# * 2 = full name\n"
+"#   3 = both\n"
 msgstr ""
 
-#: src/lang.c:1351
+#: src/lang.c:1402
 msgid "Draw -> or highlighted bar for selection. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:1352
-msgid "Draw -> instead of highlighted bar :"
+#: src/lang.c:1403
+msgid "Draw -> instead of highlighted bar"
 msgstr ""
 
-#: src/lang.c:1353
+#: src/lang.c:1404
 msgid "# If ON use -> otherwise highlighted bar for selection\n"
 msgstr ""
 
-#: src/lang.c:1358
-msgid "Use inverse video for page headers :"
+#: src/lang.c:1409
+msgid "Use inverse video for page headers"
 msgstr ""
 
-#: src/lang.c:1359
+#: src/lang.c:1410
 msgid "# If ON use inverse video for page headers at different levels\n"
 msgstr ""
 
-#: src/lang.c:1364
-msgid "Thread articles by                 :"
+#: src/lang.c:1415
+msgid "Thread articles by"
 msgstr ""
 
-#: src/lang.c:1365
+#: src/lang.c:1416
 msgid ""
-"# Thread articles on 0=(nothing) 1=(Subject) 2=(References) 3=(Both)\n"
-"# 4=(Multipart Subject).\n"
+"# Thread articles by ...\n"
+"# Possible values are (the default is marked with *):\n"
+"#   0 = nothing\n"
+"#   1 = Subject\n"
+"#   2 = References\n"
+"# * 3 = Both (Subject and References)\n"
+"#   4 = Multipart Subject\n"
+"#   5 = Percentage Match\n"
 msgstr ""
 
-#: src/lang.c:1371
-msgid "Score of a thread                  :"
+#: src/lang.c:1427
+msgid "Enter percentage match required to thread together. <CR> sets."
 msgstr ""
 
-#: src/lang.c:1372
-msgid "# Thread score 0=(Max) 1=(Sum) 2=(Average)\n"
+#: src/lang.c:1428
+msgid "Thread percentage match"
+msgstr ""
+
+#: src/lang.c:1429
+#, c-format
+msgid ""
+"# Thread percentage match...\n"
+"# the percentage of characters in the subject of an article that must match\n"
+"# a base article for both those articles to be considered to belong to the\n"
+"# same thread. This option is an integer percentage, eg. 80, no decimals "
+"may\n"
+"# follow. If 80 is used here, then 80%% of the characters must match "
+"exactly,\n"
+"# no insertion of a character, for the two articles to be put in the same\n"
+"# thread. eg. 'happy' and 'harpy' would match, but 'harpie', 'happie' and\n"
+"# 'harppy' would be threaded separately from 'happy'\n"
 msgstr ""
 
-#: src/lang.c:1376
+#: src/lang.c:1441
+msgid "Score of a thread"
+msgstr ""
+
+#: src/lang.c:1442
+msgid ""
+"# Thread score\n"
+"# Possible values are (the default is marked with *):\n"
+"# * 0 = max\n"
+"#   1 = sum\n"
+"#   2 = average\n"
+msgstr ""
+
+#: src/lang.c:1450
 msgid ""
 "Sort articles by Subject, From, Date or Score. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:1377
-msgid "Sort articles by                   :"
+#: src/lang.c:1451
+msgid "Sort articles by"
 msgstr ""
 
-#: src/lang.c:1378
+#: src/lang.c:1452
 msgid ""
-"# Sort articles by 0=(nothing) 1=(Subject descend) 2=(Subject ascend)\n"
-"# 3=(From descend) 4=(From ascend) 5=(Date descend) 6=(Date ascend)\n"
-"# 7=(Score descend) 8=(Score ascend) 9=(Lines descend) 10=(Lines ascend).\n"
+"# Sort articles by ...\n"
+"# Possible values are (the default is marked with *):\n"
+"#   0 = nothing\n"
+"#   1 = Subject descending\n"
+"#   2 = Subject ascending\n"
+"#   3 = From descending\n"
+"#   4 = From ascending\n"
+"#   5 = Date descending\n"
+"# * 6 = Date ascending\n"
+"#   7 = Score descending\n"
+"#   8 = Score ascending\n"
+"#   9 = Lines descending\n"
+"#  10 = Lines ascending\n"
 msgstr ""
 
-#: src/lang.c:1384
+#: src/lang.c:1468
 msgid "Sort threads by Nothing or Score. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:1385
-msgid "Sort threads by                    :"
+#: src/lang.c:1469
+msgid "Sort threads by"
 msgstr ""
 
-#: src/lang.c:1386
-msgid "# Sort thread by 0=(nothing) 1=(Score descend) 2=(Score ascend)\n"
+#: src/lang.c:1470
+msgid ""
+"# Sort thread by ...\n"
+"# Possible values are (the default is marked with *):\n"
+"#   0 = nothing\n"
+"# * 1 = Score descending\n"
+"#   2 = Score ascending\n"
 msgstr ""
 
-#: src/lang.c:1390
+#: src/lang.c:1478
 msgid ""
 "Put cursor at first/last unread art in groups. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:1391
-msgid "Goto first unread article in group :"
+#: src/lang.c:1479
+msgid "Goto first unread article in group"
 msgstr ""
 
-#: src/lang.c:1392
+#: src/lang.c:1480
 msgid "# If ON put cursor at first unread art in group otherwise last art\n"
 msgstr ""
 
-#: src/lang.c:1396
+#: src/lang.c:1484
 msgid "Show all articles or only unread articles. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:1397
-msgid "Show only unread articles          :"
+#: src/lang.c:1485
+msgid "Show only unread articles"
 msgstr ""
 
-#: src/lang.c:1398
+#: src/lang.c:1486
 msgid "# If ON show only new/unread articles otherwise show all.\n"
 msgstr ""
 
-#: src/lang.c:1403
-msgid "Show only groups with unread arts  :"
+#: src/lang.c:1491
+msgid "Show only groups with unread arts"
 msgstr ""
 
-#: src/lang.c:1404
+#: src/lang.c:1492
 msgid "# If ON show only subscribed to groups that contain unread articles.\n"
 msgstr ""
 
-#: src/lang.c:1409
-msgid "Filter which articles              :"
+#: src/lang.c:1497
+msgid "Filter which articles"
 msgstr ""
 
-#: src/lang.c:1410
+#: src/lang.c:1498
 msgid ""
-"# 0=(Only kill unread articles)\n"
-"# 1=(Kill all articles and show in threads marked with K)\n"
-"# 2=(Kill all articles and never show them).\n"
+"# Filter which articles\n"
+"# Possible values are (the default is marked with *):\n"
+"# * 0 = only kill unread articles\n"
+"#   1 = kill all articles and show in threads marked with K\n"
+"#   2 = kill all articles and never show them\n"
 msgstr ""
 
-#: src/lang.c:1417
-msgid "Tab goes to next unread article    :"
+#: src/lang.c:1507
+msgid "Tab goes to next unread article"
 msgstr ""
 
-#: src/lang.c:1418
+#: src/lang.c:1508
 msgid ""
 "# If ON the TAB command will go to next unread article at article viewer "
 "level\n"
 msgstr ""
 
-#: src/lang.c:1422
+#: src/lang.c:1512
 msgid ""
 "Scrolling with <SPACE> past the end of an art. jumps to the next unread one."
 msgstr ""
 
-#: src/lang.c:1423
-msgid "Space goes to next unread article  :"
+#: src/lang.c:1513
+msgid "Space goes to next unread article"
 msgstr ""
 
-#: src/lang.c:1424
+#: src/lang.c:1514
 msgid ""
 "# If ON the SPACE command will go to next unread article at article viewer\n"
 "# level when the end of the article is reached (rn-style pager)\n"
 msgstr ""
 
-#: src/lang.c:1429
+#: src/lang.c:1519
 msgid ""
 "Scrolling with <PGDN>/<DOWN> past the end of an art. jumps to the unread one."
 msgstr ""
 
-#: src/lang.c:1430
-msgid "PgDn goes to next unread article   :"
+#: src/lang.c:1520
+msgid "PgDn goes to next unread article"
 msgstr ""
 
-#: src/lang.c:1431
+#: src/lang.c:1521
 msgid ""
 "# If ON the PGDN or DOWN command will go to next unread article when\n"
 "# pressed at end of message\n"
 msgstr ""
 
-#: src/lang.c:1437
-msgid "List thread using right arrow key  :"
+#: src/lang.c:1527
+msgid "List thread using right arrow key"
 msgstr ""
 
-#: src/lang.c:1438
+#: src/lang.c:1528
 msgid ""
 "# If ON automatically list thread when entering it using right arrow key.\n"
 msgstr ""
 
-#: src/lang.c:1442
+#: src/lang.c:1532
 msgid "Enter character to indicate deleted articles. <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:1443
-msgid "Character to show deleted articles :"
+#: src/lang.c:1533
+msgid "Character to show deleted articles"
 msgstr ""
 
-#: src/lang.c:1444
+#: src/lang.c:1534
 msgid ""
 "# Character used to show that an art was deleted (default 'D')\n"
 "# _ is turned into ' '\n"
 msgstr ""
 
-#: src/lang.c:1449
+#: src/lang.c:1539
 msgid ""
 "Enter character to indicate articles in a range. <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:1450
-msgid "Character to show inrange articles :"
+#: src/lang.c:1540
+msgid "Character to show inrange articles"
 msgstr ""
 
-#: src/lang.c:1451
+#: src/lang.c:1541
 msgid ""
 "# Character used to show that an art is in a range (default '#')\n"
 "# _ is turned into ' '\n"
 msgstr ""
 
-#: src/lang.c:1456
+#: src/lang.c:1546
 msgid ""
 "Enter character to indicate that article will return. <CR> sets, <ESC> "
 "cancels."
 msgstr ""
 
-#: src/lang.c:1457
-msgid "Character to show returning arts   :"
+#: src/lang.c:1547
+msgid "Character to show returning arts"
 msgstr ""
 
-#: src/lang.c:1458
+#: src/lang.c:1548
 msgid ""
 "# Character used to show that an art will return (default '-')\n"
 "# _ is turned into ' '\n"
 msgstr ""
 
-#: src/lang.c:1463
+#: src/lang.c:1553
 msgid ""
 "Enter character to indicate selected articles. <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:1464
-msgid "Character to show selected articles:"
+#: src/lang.c:1554
+msgid "Character to show selected articles"
 msgstr ""
 
-#: src/lang.c:1465
+#: src/lang.c:1555
 msgid ""
 "# Character used to show that an art was auto-selected (default '*')\n"
 "# _ is turned into ' '\n"
 msgstr ""
 
-#: src/lang.c:1470
+#: src/lang.c:1560
 msgid "Enter character to indicate recent articles. <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:1471
-msgid "Character to show recent articles  :"
+#: src/lang.c:1561
+msgid "Character to show recent articles"
 msgstr ""
 
-#: src/lang.c:1472
+#: src/lang.c:1562
 msgid ""
 "# Character used to show that an art is recent (default 'o')\n"
 "# _ is turned into ' '\n"
 msgstr ""
 
-#: src/lang.c:1477
+#: src/lang.c:1567
 msgid "Enter character to indicate unread articles. <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:1478
-msgid "Character to show unread articles  :"
+#: src/lang.c:1568
+msgid "Character to show unread articles"
 msgstr ""
 
-#: src/lang.c:1479
+#: src/lang.c:1569
 msgid ""
 "# Character used to show that an art is unread (default '+')\n"
 "# _ is turned into ' '\n"
 msgstr ""
 
-#: src/lang.c:1484
+#: src/lang.c:1574
 msgid "Enter character to indicate read articles. <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:1485
-msgid "Character to show read articles    :"
+#: src/lang.c:1575
+msgid "Character to show read articles"
 msgstr ""
 
-#: src/lang.c:1486
+#: src/lang.c:1576
 msgid ""
 "# Character used to show that an art was read (default ' ')\n"
 "# _ is turned into ' '\n"
 msgstr ""
 
-#: src/lang.c:1491
+#: src/lang.c:1581
 msgid "Enter character to indicate killed articles. <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:1492
-msgid "Character to show killed articles  :"
+#: src/lang.c:1582
+msgid "Character to show killed articles"
 msgstr ""
 
-#: src/lang.c:1493
+#: src/lang.c:1583
 msgid ""
 "# Character used to show that an art was killed (default 'K')\n"
 "# kill_level must be set accordingly, _ is turned into ' '\n"
 msgstr ""
 
-#: src/lang.c:1498
+#: src/lang.c:1588
 msgid ""
 "Enter character to indicate read selected articles. <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:1499
-msgid "Character to show readselected arts:"
+#: src/lang.c:1589
+msgid "Character to show readselected arts"
 msgstr ""
 
-#: src/lang.c:1500
+#: src/lang.c:1590
 msgid ""
 "# Character used to show that an art was selected before read (default ':')\n"
 "# kill_level must be set accordingly, _ is turned into ' '\n"
 msgstr ""
 
-#: src/lang.c:1505
+#: src/lang.c:1595
 msgid "Enter maximum length of newsgroup names displayed. <CR> sets."
 msgstr ""
 
-#: src/lang.c:1506
-msgid "Max. length of group names shown   :"
+#: src/lang.c:1596
+msgid "Max. length of group names shown"
 msgstr ""
 
-#: src/lang.c:1507
+#: src/lang.c:1597
 msgid "# Maximum length of the names of newsgroups displayed\n"
 msgstr ""
 
-#: src/lang.c:1512
-msgid "Show lines/score in listings       :"
+#: src/lang.c:1602
+msgid "Show lines/score in listings"
 msgstr ""
 
-#: src/lang.c:1513
+#: src/lang.c:1603
 msgid ""
 "# What informations should be displayed in article/thread listing\n"
-"# 0 = nothing, 1 = lines, 2 = score, 3 = lines & score\n"
+"# Possible values are (the default is marked with *):\n"
+"#   0 = nothing\n"
+"# * 1 = lines\n"
+"#   2 = score\n"
+"#   3 = lines & score\n"
 msgstr ""
 
-#: src/lang.c:1518
+#: src/lang.c:1612
 msgid ""
 "0 = full page scrolling, -1 = show previous last line as first on next page, "
 "-2 = half page"
 msgstr ""
 
-#: src/lang.c:1519
-msgid "Number of lines to scroll in pager :"
+#: src/lang.c:1613
+msgid "Number of lines to scroll in pager"
 msgstr ""
 
-#: src/lang.c:1520
+#: src/lang.c:1614
 msgid ""
 "# Number of lines that cursor-up/down will scroll in article pager\n"
-"# eg, 1+ = line-by-line, 0 = page-by-page (traditional behavior),\n"
-"# -1 = the top/bottom line is carried over onto the next page,\n"
-"# -2 = half-page scrolling\n"
+"# Possible values are (the default is marked with *):\n"
+"#  -2 = half-page scrolling\n"
+"#  -1 = the top/bottom line is carried over onto the next page\n"
+"#   0 = page-by-page (traditional behavior)\n"
+"# * 1 = line-by-line\n"
+"#   2 or greater = scroll by 2 or more lines (only in the pager)\n"
 msgstr ""
 
-#: src/lang.c:1527
+#: src/lang.c:1624
 msgid "Display signatures. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:1528
-msgid "Display signatures                 :"
+#: src/lang.c:1625
+msgid "Display signatures"
 msgstr ""
 
-#: src/lang.c:1529
+#: src/lang.c:1626
 msgid "# If OFF don't show signatures when displaying articles\n"
 msgstr ""
 
-#: src/lang.c:1533
+#: src/lang.c:1630
 msgid ""
 "Display uuencoded data as tagged attachments. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:1534
-msgid "Display uue data as an attachment  :"
+#: src/lang.c:1631
+msgid "Display uue data as an attachment"
 msgstr ""
 
-#: src/lang.c:1535
+#: src/lang.c:1632
 msgid ""
 "# Handling of uuencoded data in the pager\n"
-"# 0 = display raw uuencoded data\n"
-"# 1 = uuencoded data will be condensed to a single tag line showing\n"
-"#     size and filename, similar to how MIME attachments are displayed\n"
-"# 2 = as for 1, but any line that looks like uuencoded data will be folded\n"
-"#     into a tag line.\n"
+"# Possible values are (the default is marked with *):\n"
+"# * 0 = no, display raw uuencoded data\n"
+"#   1 = yes, uuencoded data will be condensed to a single tag line showing\n"
+"#       size and filename, similar to how MIME attachments are displayed\n"
+"#   2 = hide all, as for 1, but any line that looks like uuencoded data "
+"will\n"
+"#       be folded into a tag line.\n"
 msgstr ""
 
-#: src/lang.c:1544
+#: src/lang.c:1642
 msgid ""
 "Decode German style TeX umlaut codes to ISO. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:1545
-msgid "Display \"a as Umlaut-a             :"
+#: src/lang.c:1643
+msgid "Display \"a as Umlaut-a"
 msgstr ""
 
-#: src/lang.c:1546
+#: src/lang.c:1644
 msgid ""
 "# If ON decode German style TeX umlaut codes to ISO and\n"
 "# show \"a as Umlaut-a, etc.\n"
 msgstr ""
 
-#: src/lang.c:1551 src/lang.c:1561
+#: src/lang.c:1649 src/lang.c:1659
 msgid "Space separated list of header fields"
 msgstr ""
 
-#: src/lang.c:1552
-msgid "Display these header fields (or *) :"
+#: src/lang.c:1650
+msgid "Display these header fields (or *)"
 msgstr ""
 
-#: src/lang.c:1553
+#: src/lang.c:1651
 msgid ""
 "# Which news headers you wish to see. If you want to see _all_ the headers,\n"
 "# place an '*' as this value. This is the only way a wildcard can be used.\n"
@@ -4542,11 +4769,11 @@ msgid ""
 "# spaces. Not defining anything turns off this option.\n"
 msgstr ""
 
-#: src/lang.c:1562
-msgid "Do not display these header fields :"
+#: src/lang.c:1660
+msgid "Do not display these header fields"
 msgstr ""
 
-#: src/lang.c:1563
+#: src/lang.c:1661
 msgid ""
 "# Same as 'news_headers_to_display' except it denotes the opposite.\n"
 "# An example of using both options might be if you thought X- headers were\n"
@@ -4558,163 +4785,163 @@ msgid ""
 "# Not defining anything turns off this option.\n"
 msgstr ""
 
-#: src/lang.c:1573
+#: src/lang.c:1671
 msgid ""
 "Do you want to enable automatic handling of multipart/alternative articles?"
 msgstr ""
 
-#: src/lang.c:1574
-msgid "Skip multipart/alternative parts   :"
+#: src/lang.c:1672
+msgid "Skip multipart/alternative parts"
 msgstr ""
 
-#: src/lang.c:1575
+#: src/lang.c:1673
 msgid "# If ON strip multipart/alternative messages automatically\n"
 msgstr ""
 
-#: src/lang.c:1580
+#: src/lang.c:1678
 msgid "A regex used to decide which lines to show in col_quote."
 msgstr ""
 
-#: src/lang.c:1581
-msgid "Regex used to show quoted lines    :"
+#: src/lang.c:1679
+msgid "Regex used to show quoted lines"
 msgstr ""
 
-#: src/lang.c:1582
+#: src/lang.c:1680
 msgid ""
 "# A regular expression that tin will use to decide which lines are\n"
 "# quoted when viewing articles. Quoted lines are shown in col_quote.\n"
 "# If you leave this blank, tin will use a built in default.\n"
 msgstr ""
 
-#: src/lang.c:1588
+#: src/lang.c:1686
 msgid "A regex used to decide which lines to show in col_quote2."
 msgstr ""
 
-#: src/lang.c:1589
-msgid "Regex used to show twice quoted l. :"
+#: src/lang.c:1687
+msgid "Regex used to show twice quoted l."
 msgstr ""
 
-#: src/lang.c:1590
+#: src/lang.c:1688
 msgid ""
 "# A regular expression that tin will use to decide which lines are\n"
 "# quoted twice. Twice quoted lines are shown in col_quote2.\n"
 "# If you leave this blank, tin will use a built in default.\n"
 msgstr ""
 
-#: src/lang.c:1596
+#: src/lang.c:1694
 msgid "A regex used to decide which lines to show in col_quote3."
 msgstr ""
 
-#: src/lang.c:1597
-msgid "Regex used to show >= 3 times q.l. :"
+#: src/lang.c:1695
+msgid "Regex used to show >= 3 times q.l."
 msgstr ""
 
-#: src/lang.c:1598
+#: src/lang.c:1696
 msgid ""
 "# A regular expression that tin will use to decide which lines are\n"
 "# quoted >=3 times. >=3 times quoted lines are shown in col_quote3.\n"
 "# If you leave this blank, tin will use a built in default.\n"
 msgstr ""
 
-#: src/lang.c:1605
+#: src/lang.c:1703
 msgid "A regex used to decide which words to show in col_markslashes."
 msgstr ""
 
-#: src/lang.c:1606
-msgid "Regex used to highlight /slashes/  :"
+#: src/lang.c:1704
+msgid "Regex used to highlight /slashes/"
 msgstr ""
 
-#: src/lang.c:1607
+#: src/lang.c:1705
 msgid ""
 "# A regular expression that tin will use to decide which words\n"
 "# bounded by '/' are to be shown in col_markslashes.\n"
 "# If you leave this blank, tin will use a built in default.\n"
 msgstr ""
 
-#: src/lang.c:1613
+#: src/lang.c:1711
 msgid "A regex used to decide which words to show in col_markstars."
 msgstr ""
 
-#: src/lang.c:1614
-msgid "Regex used to highlight *stars*    :"
+#: src/lang.c:1712
+msgid "Regex used to highlight *stars*"
 msgstr ""
 
-#: src/lang.c:1615
+#: src/lang.c:1713
 msgid ""
 "# A regular expression that tin will use to decide which words\n"
 "# bounded by '*' are to be shown in col_markstars.\n"
 "# If you leave this blank, tin will use a built in default.\n"
 msgstr ""
 
-#: src/lang.c:1621
+#: src/lang.c:1719
 msgid "A regex used to decide which words to show in col_markstroke."
 msgstr ""
 
-#: src/lang.c:1622
-msgid "Regex used to highlight -strokes-  :"
+#: src/lang.c:1720
+msgid "Regex used to highlight -strokes-"
 msgstr ""
 
-#: src/lang.c:1623
+#: src/lang.c:1721
 msgid ""
 "# A regular expression that tin will use to decide which words\n"
 "# bounded by '-' are to be shown in col_markstroke.\n"
 "# If you leave this blank, tin will use a built in default.\n"
 msgstr ""
 
-#: src/lang.c:1629
+#: src/lang.c:1727
 msgid "A regex used to decide which words to show in col_markdash."
 msgstr ""
 
-#: src/lang.c:1630
-msgid "Regex used to highlight _underline_:"
+#: src/lang.c:1728
+msgid "Regex used to highlight _underline_"
 msgstr ""
 
-#: src/lang.c:1631
+#: src/lang.c:1729
 msgid ""
 "# A regular expression that tin will use to decide which words\n"
 "# bounded by '_' are to be shown in col_markdash.\n"
 "# If you leave this blank, tin will use a built in default.\n"
 msgstr ""
 
-#: src/lang.c:1637
+#: src/lang.c:1735
 msgid "A regex used to find Subject prefixes to remove.  Use '|' as separator."
 msgstr ""
 
-#: src/lang.c:1638
-msgid "Regex with Subject prefixes        :"
+#: src/lang.c:1736
+msgid "Regex with Subject prefixes"
 msgstr ""
 
-#: src/lang.c:1639
+#: src/lang.c:1737
 msgid ""
 "# A regular expression that tin will use to find Subject prefixes\n"
 "# which will be removed before showing the header.\n"
 msgstr ""
 
-#: src/lang.c:1644
+#: src/lang.c:1742
 msgid "A regex used to find Subject suffixes to remove.  Use '|' as separator."
 msgstr ""
 
-#: src/lang.c:1645
-msgid "Regex with Subject suffixes        :"
+#: src/lang.c:1743
+msgid "Regex with Subject suffixes"
 msgstr ""
 
-#: src/lang.c:1646
+#: src/lang.c:1744
 msgid ""
 "# A regular expression that tin will use to find Subject suffixes\n"
 "# which will be removed when replying or posting followup.\n"
 msgstr ""
 
-#: src/lang.c:1651
+#: src/lang.c:1749
 msgid ""
 "Enter name and options for external MIME viewer, --internal for built-in "
 "viewer"
 msgstr ""
 
-#: src/lang.c:1652
-msgid "MIME binary content viewer         :"
+#: src/lang.c:1750
+msgid "MIME binary content viewer"
 msgstr ""
 
-#: src/lang.c:1653
+#: src/lang.c:1751
 msgid ""
 "# If --internal automatically use the built in MIME viewer for non-text\n"
 "# parts of articles.\n"
@@ -4723,455 +4950,558 @@ msgid ""
 "# for no automatic viewing\n"
 msgstr ""
 
-#: src/lang.c:1660
+#: src/lang.c:1758
 msgid "Confirm before starting non-text viewing program"
 msgstr ""
 
-#: src/lang.c:1661
-msgid "Ask before using MIME viewer       :"
+#: src/lang.c:1759
+msgid "Ask before using MIME viewer"
 msgstr ""
 
-#: src/lang.c:1662
+#: src/lang.c:1760
 msgid ""
 "# If ON tin will ask before using metamail to display MIME messages\n"
 "# this only happens if metamail_prog is set to something\n"
 msgstr ""
 
-#: src/lang.c:1667
+#: src/lang.c:1765
 msgid "Ask to mark groups read when quitting. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:1668
-msgid "Catchup read groups when quitting  :"
+#: src/lang.c:1766
+msgid "Catchup read groups when quitting"
 msgstr ""
 
-#: src/lang.c:1669
+#: src/lang.c:1767
 msgid "# If ON ask user if read groups should all be marked read\n"
 msgstr ""
 
-#: src/lang.c:1674
-msgid "Catchup group using left key       :"
+#: src/lang.c:1772
+msgid "Catchup group using left key"
 msgstr ""
 
-#: src/lang.c:1675
+#: src/lang.c:1773
 msgid "# If ON catchup group/thread when leaving with the left arrow key.\n"
 msgstr ""
 
-#: src/lang.c:1680
-msgid "Catchup thread by using left key   :"
+#: src/lang.c:1778
+msgid "Catchup thread by using left key"
 msgstr ""
 
-#: src/lang.c:1686
-msgid "Which actions require confirmation :"
+#: src/lang.c:1784
+msgid "Which actions require confirmation"
 msgstr ""
 
-#: src/lang.c:1687
+#: src/lang.c:1785
 msgid "# What should we ask confirmation for.\n"
 msgstr ""
 
-#: src/lang.c:1692
-msgid "'Mark article read' ignores tags   :"
+#: src/lang.c:1790
+msgid "'Mark article read' ignores tags"
 msgstr ""
 
-#: src/lang.c:1693
+#: src/lang.c:1791
 msgid ""
 "# If ON the 'Mark article read' function marks only the current article.\n"
 msgstr ""
 
-#: src/lang.c:1697
+#: src/lang.c:1795
 msgid "Program to run to open URL's, <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:1698
-msgid "Program that opens URL's           :"
+#: src/lang.c:1796
+msgid "Program that opens URL's"
 msgstr ""
 
-#: src/lang.c:1699
+#: src/lang.c:1797
 msgid "# The program used to open URL's. The actual URL will be appended\n"
 msgstr ""
 
-#: src/lang.c:1704
-msgid "Use mouse in xterm                 :"
+#: src/lang.c:1802
+msgid "Use mouse in xterm"
 msgstr ""
 
-#: src/lang.c:1705
+#: src/lang.c:1803
 msgid "# If ON enable mouse key support on xterm terminals\n"
 msgstr ""
 
-#: src/lang.c:1711
-msgid "Use scroll keys on keypad          :"
+#: src/lang.c:1809
+msgid "Use scroll keys on keypad"
 msgstr ""
 
-#: src/lang.c:1712
+#: src/lang.c:1810
 msgid "# If ON enable scroll keys on terminals that support it\n"
 msgstr ""
 
-#: src/lang.c:1717
+#: src/lang.c:1815
 msgid "Enter maximum number of article to get. <CR> sets."
 msgstr ""
 
-#: src/lang.c:1718
-msgid "Number of articles to get          :"
+#: src/lang.c:1816
+msgid "Number of articles to get"
 msgstr ""
 
-#: src/lang.c:1719
+#: src/lang.c:1817
 msgid ""
 "# Number of articles to get (0=no limit), if negative sets maximum number\n"
 "# of already read articles to be read before first unread one\n"
 msgstr ""
 
-#: src/lang.c:1724
+#: src/lang.c:1822
 msgid "Enter number of days article is considered recent. <CR> sets."
 msgstr ""
 
-#: src/lang.c:1725
-msgid "Article recentness time limit      :"
+#: src/lang.c:1823
+msgid "Article recentness time limit"
 msgstr ""
 
-#: src/lang.c:1726
+#: src/lang.c:1824
 msgid "# Number of days in which article is considered recent, (0=OFF)\n"
 msgstr ""
 
-#: src/lang.c:1730
+#: src/lang.c:1828
 msgid ""
 "WILDMAT for normal wildcards, REGEX for full regular expression matching."
 msgstr ""
 
-#: src/lang.c:1731
-msgid "Wildcard matching                  :"
+#: src/lang.c:1829
+msgid "Wildcard matching"
 msgstr ""
 
-#: src/lang.c:1732
-msgid "# Wildcard matching 0=(wildmat) 1=(regex)\n"
+#: src/lang.c:1830
+msgid ""
+"# Wildcard matching\n"
+"# Possible values are (the default is marked with *):\n"
+"# * 0 = wildmat\n"
+"#   1 = regex\n"
 msgstr ""
 
-#: src/lang.c:1736
+#: src/lang.c:1837
 msgid "Enter minimal score before an article is marked killed. <CR> sets."
 msgstr ""
 
-#: src/lang.c:1737
-msgid "Score limit (kill)                 :"
+#: src/lang.c:1838
+msgid "Score limit (kill)"
 msgstr ""
 
-#: src/lang.c:1738
+#: src/lang.c:1839
 msgid "# Score limit before an article is marked killed\n"
 msgstr ""
 
-#: src/lang.c:1742
+#: src/lang.c:1843
 msgid "Enter default score to kill articles. <CR> sets."
 msgstr ""
 
-#: src/lang.c:1743
-msgid "Default score to kill articles     :"
+#: src/lang.c:1844
+msgid "Default score to kill articles"
 msgstr ""
 
-#: src/lang.c:1744
+#: src/lang.c:1845
 msgid "# Default score to kill articles\n"
 msgstr ""
 
-#: src/lang.c:1748
+#: src/lang.c:1849
 msgid "Enter minimal score before an article is marked hot. <CR> sets."
 msgstr ""
 
-#: src/lang.c:1749
-msgid "Score limit (select)               :"
+#: src/lang.c:1850
+msgid "Score limit (select)"
 msgstr ""
 
-#: src/lang.c:1750
+#: src/lang.c:1851
 msgid "# Score limit before an article is marked hot\n"
 msgstr ""
 
-#: src/lang.c:1754
+#: src/lang.c:1855
 msgid "Enter default score to select articles. <CR> sets."
 msgstr ""
 
-#: src/lang.c:1755
-msgid "Default score to select articles   :"
+#: src/lang.c:1856
+msgid "Default score to select articles"
 msgstr ""
 
-#: src/lang.c:1756
+#: src/lang.c:1857
 msgid "# Default score to select articles\n"
 msgstr ""
 
-#: src/lang.c:1762
-msgid "Use slrnface to show ''X-Face:''s  :"
+#: src/lang.c:1863
+msgid "Use slrnface to show ''X-Face:''s"
 msgstr ""
 
-#: src/lang.c:1763
+#: src/lang.c:1864
 msgid ""
 "# If ON using slrnface(1) to interpret the ''X-Face:'' header.\n"
 "# Only useful when running in an xterm.\n"
 msgstr ""
 
-#: src/lang.c:1771
-msgid "Use ANSI color                     :"
+#: src/lang.c:1872
+msgid "Use ANSI color"
 msgstr ""
 
-#: src/lang.c:1772
+#: src/lang.c:1873
 msgid "# If ON using ANSI-color\n"
 msgstr ""
 
-#: src/lang.c:1777
-msgid "Standard foreground color          :"
+#: src/lang.c:1878
+msgid "Standard foreground color"
+msgstr ""
+
+#: src/lang.c:1879
+msgid ""
+"# Standard foreground color\n"
+"# Default: -1 (default color)\n"
+msgstr ""
+
+#: src/lang.c:1885
+msgid "Standard background color"
+msgstr ""
+
+#: src/lang.c:1886
+msgid ""
+"# Standard background color\n"
+"# Default: -1 (default color)\n"
+msgstr ""
+
+#: src/lang.c:1892
+msgid "Color for inverse text (background)"
+msgstr ""
+
+#: src/lang.c:1893
+msgid ""
+"# Color of background for inverse text\n"
+"# Default: 4 (blue)\n"
+msgstr ""
+
+#: src/lang.c:1899
+msgid "Color for inverse text (foreground)"
+msgstr ""
+
+#: src/lang.c:1900
+msgid ""
+"# Color of foreground for inverse text\n"
+"# Default: 7 (white)\n"
+msgstr ""
+
+#: src/lang.c:1906
+msgid "Color of text lines"
+msgstr ""
+
+#: src/lang.c:1907
+msgid ""
+"# Color of text lines\n"
+"# Default: -1 (default color)\n"
+msgstr ""
+
+#: src/lang.c:1913
+msgid "Color of mini help menu"
 msgstr ""
 
-#: src/lang.c:1778
-msgid "# Standard foreground color\n"
+#: src/lang.c:1914
+msgid ""
+"# Color of mini help menu\n"
+"# Default: 3 (brown)\n"
 msgstr ""
 
-#: src/lang.c:1783
-msgid "Standard background color          :"
+#: src/lang.c:1920
+msgid "Color of help text"
 msgstr ""
 
-#: src/lang.c:1784
-msgid "# Standard-Background-Color\n"
+#: src/lang.c:1921
+msgid ""
+"# Color of help pages\n"
+"# Default: -1 (default color)\n"
 msgstr ""
 
-#: src/lang.c:1789
-msgid "Color for inverse text (background):"
+#: src/lang.c:1927
+msgid "Color of status messages"
 msgstr ""
 
-#: src/lang.c:1790
-msgid "# Color of background for inverse text\n"
+#: src/lang.c:1928
+msgid ""
+"# Color of messages in last line\n"
+"# Default: 6 (cyan)\n"
 msgstr ""
 
-#: src/lang.c:1795
-msgid "Color for inverse text (foreground):"
+#: src/lang.c:1934
+msgid "Color of quoted lines"
 msgstr ""
 
-#: src/lang.c:1796
-msgid "# Color of foreground for inverse text\n"
+#: src/lang.c:1935
+msgid ""
+"# Color of quote-lines\n"
+"# Default: 2 (green)\n"
 msgstr ""
 
-#: src/lang.c:1801
-msgid "Color of text lines                :"
+#: src/lang.c:1941
+msgid "Color of twice quoted line"
 msgstr ""
 
-#: src/lang.c:1802
-msgid "# Color of text-lines\n"
+#: src/lang.c:1942
+msgid ""
+"# Color of twice quoted lines\n"
+"# Default: 3 (brown)\n"
 msgstr ""
 
-#: src/lang.c:1807
-msgid "Color of mini help menu            :"
+#: src/lang.c:1948
+msgid "Color of =>3 times quoted line"
 msgstr ""
 
-#: src/lang.c:1808
-msgid "# Color of mini help menu\n"
+#: src/lang.c:1949
+msgid ""
+"# Color of >=3 times quoted lines\n"
+"# Default: 4 (blue)\n"
 msgstr ""
 
-#: src/lang.c:1813
-msgid "Color of help text                 :"
+#: src/lang.c:1955
+msgid "Color of article header lines"
 msgstr ""
 
-#: src/lang.c:1814
-msgid "# Color of help pages\n"
+#: src/lang.c:1956
+msgid ""
+"# Color of header-lines\n"
+"# Default: 2 (green)\n"
 msgstr ""
 
-#: src/lang.c:1819
-msgid "Color of status messages           :"
+#: src/lang.c:1962
+msgid "Color of actual news header fields"
 msgstr ""
 
-#: src/lang.c:1820
-msgid "# Color of messages in last line\n"
+#: src/lang.c:1963
+msgid ""
+"# Color of actual news header fields\n"
+"# Default: 9 (light red)\n"
 msgstr ""
 
-#: src/lang.c:1825
-msgid "Color of quoted lines              :"
+#: src/lang.c:1969
+msgid "Color of article subject lines"
 msgstr ""
 
-#: src/lang.c:1826
-msgid "# Color of quote-lines\n"
+#: src/lang.c:1970
+msgid ""
+"# Color of article subject\n"
+"# Default: 6 (cyan)\n"
 msgstr ""
 
-#: src/lang.c:1831
-msgid "Color of twice quoted line         :"
+#: src/lang.c:1976
+msgid "Color of response counter"
 msgstr ""
 
-#: src/lang.c:1832
-msgid "# Color of twice quoted lines\n"
+#: src/lang.c:1977
+msgid ""
+"# Color of response counter\n"
+"# Default: 2 (green)\n"
 msgstr ""
 
-#: src/lang.c:1837
-msgid "Color of =>3 times quoted line     :"
+#: src/lang.c:1983
+msgid "Color of sender (From:)"
 msgstr ""
 
-#: src/lang.c:1838
-msgid "# Color of >=3 times quoted lines\n"
+#: src/lang.c:1984
+msgid ""
+"# Color of sender (From:)\n"
+"# Default: 2 (green)\n"
 msgstr ""
 
-#: src/lang.c:1843
-msgid "Color of article header lines      :"
+#: src/lang.c:1990
+msgid "Color of help/mail sign"
 msgstr ""
 
-#: src/lang.c:1844
-msgid "# Color of header-lines\n"
+#: src/lang.c:1991
+msgid ""
+"# Color of Help/Mail-Sign\n"
+"# Default: 4 (blue)\n"
 msgstr ""
 
-#: src/lang.c:1849
-msgid "Color of actual news header fields :"
+#: src/lang.c:1997
+msgid "Color of signatures"
 msgstr ""
 
-#: src/lang.c:1850
-msgid "# Color of actual news header fields\n"
+#: src/lang.c:1998
+msgid ""
+"# Color of signature\n"
+"# Default: 4 (blue)\n"
 msgstr ""
 
-#: src/lang.c:1855
-msgid "Color of article subject lines     :"
+#: src/lang.c:2004
+msgid "Color of highlighted URLs"
 msgstr ""
 
-#: src/lang.c:1856
-msgid "# Color of article subject\n"
+#: src/lang.c:2005
+msgid ""
+"# Color of highlighted URLs\n"
+"# Default: -1 (default color)\n"
 msgstr ""
 
-#: src/lang.c:1861
-msgid "Color of response counter          :"
+#: src/lang.c:2011
+msgid "Color of highlighting with *stars*"
 msgstr ""
 
-#: src/lang.c:1862
-msgid "# Color of response counter\n"
+#: src/lang.c:2012
+msgid ""
+"# Color of word highlighting with *stars*\n"
+"# Default: 11 (yellow)\n"
 msgstr ""
 
-#: src/lang.c:1867
-msgid "Color of sender (From:)            :"
+#: src/lang.c:2018
+msgid "Color of highlighting with _dash_"
 msgstr ""
 
-#: src/lang.c:1868
-msgid "# Color of sender (From:)\n"
+#: src/lang.c:2019
+msgid ""
+"# Color of word highlighting with _dash_\n"
+"# Default: 13 (light pink)\n"
 msgstr ""
 
-#: src/lang.c:1873
-msgid "Color of help/mail sign            :"
+#: src/lang.c:2025
+msgid "Color of highlighting with /slash/"
 msgstr ""
 
-#: src/lang.c:1874
-msgid "# Color of Help/Mail-Sign\n"
+#: src/lang.c:2026
+msgid ""
+"# Color of word highlighting with /slash/\n"
+"# Default: 14 (light cyan)\n"
 msgstr ""
 
-#: src/lang.c:1879
-msgid "Color of signatures                :"
+#: src/lang.c:2032
+msgid "Color of highlighting with -stroke-"
 msgstr ""
 
-#: src/lang.c:1880
-msgid "# Color of signature\n"
+#: src/lang.c:2033
+msgid ""
+"# Color of word highlighting with -stroke-\n"
+"# Default: 12 (light blue)\n"
 msgstr ""
 
-#: src/lang.c:1885
-msgid "Color of highlighting with *stars* :"
+#: src/lang.c:2040
+msgid "Attr. of highlighting with *stars*"
 msgstr ""
 
-#: src/lang.c:1886
+#: src/lang.c:2041
 msgid ""
-"# Color of word highlighting. There are four possibilities\n"
-"# in articles: *stars*, /slashes/, _underdashes_ and -strokes-.\n"
+"# Attributes of word highlighting on mono terminals\n"
+"# Possible values are:\n"
+"#   0 = Normal\n"
+"#   1 = Underline\n"
+"#   2 = Best highlighting\n"
+"#   3 = Reverse video\n"
+"#   4 = Blinking\n"
+"#   5 = Half bright\n"
+"#   6 = Bold\n"
+"\n"
+"# Attribute of word highlighting with *stars*\n"
+"# Default: 6 (bold)\n"
 msgstr ""
 
-#: src/lang.c:1892
-msgid "Color of highlighting with _dash_  :"
+#: src/lang.c:2056
+msgid "Attr. of highlighting with _dash_"
 msgstr ""
 
-#: src/lang.c:1898
-msgid "Color of highlighting with /slash/ :"
+#: src/lang.c:2057
+msgid ""
+"# Attribute of word highlighting with _dash_\n"
+"# Default: 2 (best highlighting)\n"
 msgstr ""
 
-#: src/lang.c:1904
-msgid "Color of highlighting with -stroke-:"
+#: src/lang.c:2063
+msgid "Attr. of highlighting with /slash/"
 msgstr ""
 
-#: src/lang.c:1911
-msgid "Attr. of highlighting with *stars* :"
+#: src/lang.c:2064
+msgid ""
+"# Attribute of word highlighting with /slash/\n"
+"# Default: 5 (half bright)\n"
 msgstr ""
 
-#: src/lang.c:1912
-msgid ""
-"# Attribute of word highlighting on mono terminals.\n"
-"# There are four possibilities in articles:\n"
-"# *stars*, /slashes/, _underdashes_ and -strokes-.\n"
-"# The possible values are:\n"
-"# 0 - Normal, 1 - Underline, 2 - Best highlighting,\n"
-"# 3 - Reverse video, 4 - Blinking, 5 - Half bright, 6 - Bold\n"
+#: src/lang.c:2070
+msgid "Attr. of highlighting with -stroke-"
 msgstr ""
 
-#: src/lang.c:1922
-msgid "Attr. of highlighting with _dash_  :"
+#: src/lang.c:2071
+msgid ""
+"# Attribute of word highlighting with -stroke-\n"
+"# Default: 3 (reverse video)\n"
 msgstr ""
 
-#: src/lang.c:1928
-msgid "Attr. of highlighting with /slash/ :"
+#: src/lang.c:2077
+msgid "URL highlighting in message body"
 msgstr ""
 
-#: src/lang.c:1934
-msgid "Attr. of highlighting with -stroke-:"
+#: src/lang.c:2078
+msgid "# Enable URL highlighting?\n"
 msgstr ""
 
-#: src/lang.c:1940
-msgid "Word highlighting in message body  :"
+#: src/lang.c:2083
+msgid "Word highlighting in message body"
 msgstr ""
 
-#: src/lang.c:1941
+#: src/lang.c:2084
 msgid "# Enable word highlighting?\n"
 msgstr ""
 
-#: src/lang.c:1946
-msgid "What to display instead of mark    :"
+#: src/lang.c:2089
+msgid "What to display instead of mark"
 msgstr ""
 
-#: src/lang.c:1947
+#: src/lang.c:2090
 msgid ""
 "# Should the leading and ending stars and dashes also be displayed,\n"
 "# even when they are highlighting marks?\n"
-"# 0 - no    1 - yes, display mark    2 - print a space instead\n"
+"# Possible values are (the default is marked with *):\n"
+"#   0 = no\n"
+"#   1 = yes, display mark\n"
+"# * 2 = print a space instead\n"
 msgstr ""
 
-#: src/lang.c:1953
+#: src/lang.c:2099
 msgid "Enter column number to wrap article lines to in the pager. <CR> sets."
 msgstr ""
 
-#: src/lang.c:1954
-msgid "Page line wrap column              :"
+#: src/lang.c:2100
+msgid "Page line wrap column"
 msgstr ""
 
-#: src/lang.c:1955
+#: src/lang.c:2101
 msgid "# Wrap article lines at column\n"
 msgstr ""
 
-#: src/lang.c:1960
-msgid "Wrap around threads on next unread :"
+#: src/lang.c:2106
+msgid "Wrap around threads on next unread"
 msgstr ""
 
-#: src/lang.c:1961
+#: src/lang.c:2107
 msgid "# If ON wrap around threads on searching next unread article\n"
 msgstr ""
 
-#: src/lang.c:1965
+#: src/lang.c:2111
 msgid "Enter default mail address (and fullname). <CR> sets."
 msgstr ""
 
-#: src/lang.c:1966
-msgid "Mail address (and fullname)        :"
+#: src/lang.c:2112
+msgid "Mail address (and fullname)"
 msgstr ""
 
-#: src/lang.c:1967
+#: src/lang.c:2113
 msgid "# User's mail address (and fullname), if not username@host (fullname)\n"
 msgstr ""
 
-#: src/lang.c:1972
-msgid "Show empty Followup-To in editor   :"
+#: src/lang.c:2118
+msgid "Show empty Followup-To in editor"
 msgstr ""
 
-#: src/lang.c:1973
+#: src/lang.c:2119
 msgid "# If ON show empty Followup-To header when editing an article\n"
 msgstr ""
 
-#: src/lang.c:1977
+#: src/lang.c:2123
 msgid ""
 "Enter path/! command/--none to create your default signature. <CR> sets."
 msgstr ""
 
-#: src/lang.c:1978
-msgid "Create signature from path/command :"
+#: src/lang.c:2124
+msgid "Create signature from path/command"
 msgstr ""
 
-#: src/lang.c:1979
+#: src/lang.c:2125
 msgid ""
 "# Signature path (random sigs)/file to be used when posting/replying\n"
 "# default_sigfile=file       appends file as signature\n"
@@ -5180,108 +5510,112 @@ msgid ""
 "# default_sigfile=--none     don't append a signature\n"
 msgstr ""
 
-#: src/lang.c:1986
+#: src/lang.c:2132
 msgid ""
 "Prepend signature with \"-- \" on own line. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:1987
-msgid "Prepend signature with \"-- \"       :"
+#: src/lang.c:2133
+msgid "Prepend signature with \"-- \""
 msgstr ""
 
-#: src/lang.c:1988
+#: src/lang.c:2134
 msgid "# If ON prepend the signature with dashes '\\n-- \\n'\n"
 msgstr ""
 
-#: src/lang.c:1992
+#: src/lang.c:2138
 msgid "Add signature when reposting articles. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:1993
-msgid "Add signature when reposting       :"
+#: src/lang.c:2139
+msgid "Add signature when reposting"
 msgstr ""
 
-#: src/lang.c:1994
+#: src/lang.c:2140
 msgid "# If ON add signature to reposted articles\n"
 msgstr ""
 
-#: src/lang.c:1998
+#: src/lang.c:2144
+#, c-format
 msgid "Enter quotation marks, %s or %S for author's initials."
 msgstr ""
 
-#: src/lang.c:1999
-msgid "Characters used as quote-marks     :"
+#: src/lang.c:2145
+msgid "Characters used as quote-marks"
 msgstr ""
 
-#: src/lang.c:2000
+#: src/lang.c:2146
+#, c-format
 msgid ""
 "# Characters used in quoting to followups and replies.\n"
 "# '_' is replaced by ' ', %%s, %%S are replaced by author's initials.\n"
 msgstr ""
 
-#: src/lang.c:2006
-msgid "Quoting behavior                   :"
+#: src/lang.c:2152
+msgid "Quoting behavior"
 msgstr ""
 
-#: src/lang.c:2007
+#: src/lang.c:2153
 msgid ""
 "# How quoting should be handled when following up or replying.\n"
-"# 0 = Nothing special\n"
-"# 1 = Compress quotes\n"
-"# 2 = Quote signatures\n"
-"# 3 = Compress quotes, quote signatures\n"
-"# 4 = Quote empty lines\n"
-"# 5 = Compress quotes, quote empty lines\n"
-"# 6 = Quote signatures, quote empty lines\n"
-"# 7 = Compress quotes, quote signatures, quote empty lines\n"
+"# Possible values are (the default is marked with *):\n"
+"#   0 = Nothing special\n"
+"#   1 = Compress quotes\n"
+"#   2 = Quote signatures\n"
+"#   3 = Compress quotes, quote signatures\n"
+"#   4 = Quote empty lines\n"
+"# * 5 = Compress quotes, quote empty lines\n"
+"#   6 = Quote signatures, quote empty lines\n"
+"#   7 = Compress quotes, quote signatures, quote empty lines\n"
 msgstr ""
 
-#: src/lang.c:2019 src/lang.c:2027 src/lang.c:2033
+#: src/lang.c:2166 src/lang.c:2174 src/lang.c:2180
 msgid ""
 "%A Addr %D Date %F Addr+Name %G Groupname %M Message-ID %N Name %C First Name"
 msgstr ""
 
-#: src/lang.c:2020
-msgid "Quote line when following up       :"
+#: src/lang.c:2167
+msgid "Quote line when following up"
 msgstr ""
 
-#: src/lang.c:2021
+#: src/lang.c:2168
+#, c-format
 msgid ""
 "# Format of quote line when mailing/posting/following-up an article\n"
 "# %%A Address    %%D Date   %%F Addr+Name   %%G Groupname   %%M Message-ID\n"
 "# %%N Full Name  %%C First Name   %%I Initials\n"
 msgstr ""
 
-#: src/lang.c:2028
-msgid "Quote line when cross-posting      :"
+#: src/lang.c:2175
+msgid "Quote line when cross-posting"
 msgstr ""
 
-#: src/lang.c:2034
-msgid "Quote line when mailing            :"
+#: src/lang.c:2181
+msgid "Quote line when mailing"
 msgstr ""
 
-#: src/lang.c:2039
+#: src/lang.c:2186
 msgid "If ON, include User-Agent: header. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:2040
-msgid "Insert 'User-Agent:'-header        :"
+#: src/lang.c:2187
+msgid "Insert 'User-Agent:'-header"
 msgstr ""
 
-#: src/lang.c:2041
+#: src/lang.c:2188
 msgid "# If ON include advertising User-Agent: header\n"
 msgstr ""
 
-#: src/lang.c:2045
+#: src/lang.c:2193
 msgid ""
 "Enter charset name for MIME (e.g. US-ASCII, ISO-8859-1, EUC-KR), <CR> to set."
 msgstr ""
 
-#: src/lang.c:2046
-msgid "MM_CHARSET                         :"
+#: src/lang.c:2194
+msgid "MM_CHARSET"
 msgstr ""
 
-#: src/lang.c:2047
+#: src/lang.c:2195
 msgid ""
 "# Charset supported locally which is also used for MIME header and\n"
 "# Content-Type header.\n"
@@ -5291,27 +5625,27 @@ msgid ""
 "# mm_charset is considered not displayable and represented as '?'.\n"
 msgstr ""
 
-#: src/lang.c:2058
-msgid "MM_NETWORK_CHARSET                 :"
+#: src/lang.c:2205
+msgid "MM_NETWORK_CHARSET"
 msgstr ""
 
-#: src/lang.c:2059
+#: src/lang.c:2206
 msgid "# Charset used for MIME (Content-Type) header in postings.\n"
 msgstr ""
 
-#: src/lang.c:2065
-msgid "Mailbox format                     :"
+#: src/lang.c:2212
+msgid "Mailbox format"
 msgstr ""
 
-#: src/lang.c:2066
+#: src/lang.c:2213
 msgid "# Format of the mailbox.\n"
 msgstr ""
 
-#: src/lang.c:2071
-msgid "MIME encoding in news messages     :"
+#: src/lang.c:2218
+msgid "MIME encoding in news messages"
 msgstr ""
 
-#: src/lang.c:2072
+#: src/lang.c:2219
 msgid ""
 "# MIME encoding (8bit, base64, quoted-printable, 7bit) of the body\n"
 "# for mails and posts, if necessary. QP is efficient for most European\n"
@@ -5320,15 +5654,15 @@ msgid ""
 "# Russian charsets with a lot of 8bit characters.\n"
 msgstr ""
 
-#: src/lang.c:2080 src/lang.c:2101
+#: src/lang.c:2227 src/lang.c:2248
 msgid "Don't change unless you know what you are doing. <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:2081
-msgid "Use 8bit characters in news headers:"
+#: src/lang.c:2228
+msgid "Use 8bit characters in news headers"
 msgstr ""
 
-#: src/lang.c:2082
+#: src/lang.c:2229
 msgid ""
 "# If ON, 8bit characters in news headers are NOT encoded.\n"
 "# default is OFF. Thus 8bit characters are encoded by default.\n"
@@ -5336,28 +5670,28 @@ msgid ""
 "# parameter unless post_mime_encoding is 8bit as well.\n"
 msgstr ""
 
-#: src/lang.c:2089
+#: src/lang.c:2236
 msgid ""
 "Auto-view post-processed files <SPACE> toggles, <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:2090
-msgid "View post-processed files          :"
+#: src/lang.c:2237
+msgid "View post-processed files"
 msgstr ""
 
-#: src/lang.c:2091
+#: src/lang.c:2238
 msgid "# If set, post processed files will be opened in a viewer\n"
 msgstr ""
 
-#: src/lang.c:2096
-msgid "MIME encoding in mail messages     :"
+#: src/lang.c:2243
+msgid "MIME encoding in mail messages"
 msgstr ""
 
-#: src/lang.c:2102
-msgid "Use 8bit characters in mail headers:"
+#: src/lang.c:2249
+msgid "Use 8bit characters in mail headers"
 msgstr ""
 
-#: src/lang.c:2103
+#: src/lang.c:2250
 msgid ""
 "# If ON, 8bit characters in mail headers are NOT encoded.\n"
 "# default is OFF. Thus 8bit characters are encoded by default.\n"
@@ -5368,700 +5702,560 @@ msgid ""
 "# turn it ON unless you have some compelling reason.\n"
 msgstr ""
 
-#: src/lang.c:2113
-msgid "Strip blanks from ends of lines    :"
+#: src/lang.c:2260
+msgid "Strip blanks from ends of lines"
 msgstr ""
 
-#: src/lang.c:2114
+#: src/lang.c:2261
 msgid ""
 "# If ON strip blanks from ends of lines for faster display on slow "
 "terminals.\n"
 msgstr ""
 
-#: src/lang.c:2119
+#: src/lang.c:2266
 msgid "If ON, use transliteration. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:2120
-msgid "Transliteration                    :"
+#: src/lang.c:2267
+msgid "Transliteration"
 msgstr ""
 
-#: src/lang.c:2121
+#: src/lang.c:2268
 msgid ""
 "# If ON, use //TRANSLIT extension. This means that when a character cannot\n"
 "# be represented in the in the target character set, it can be approximated\n"
 "# through one or several similarly looking characters.\n"
 msgstr ""
 
-#: src/lang.c:2128
+#: src/lang.c:2275
 msgid "Send you a carbon copy automatically. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:2129
-msgid "Send you a cc automatically        :"
+#: src/lang.c:2276
+msgid "Send you a cc automatically"
 msgstr ""
 
-#: src/lang.c:2130
+#: src/lang.c:2277
 msgid ""
 "# If ON automatically put your name in the Cc: field when mailing an "
 "article\n"
 msgstr ""
 
-#: src/lang.c:2134
+#: src/lang.c:2281
 msgid ""
 "Send you a blind carbon copy automatically. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:2135
-msgid "Send you a blind cc automatically  :"
+#: src/lang.c:2282
+msgid "Send you a blind cc automatically"
 msgstr ""
 
-#: src/lang.c:2136
+#: src/lang.c:2283
 msgid ""
 "# If ON automatically put your name in the Bcc: field when mailing an "
 "article\n"
 msgstr ""
 
-#: src/lang.c:2140
+#: src/lang.c:2287
 msgid "Enter address elements about which you want to be warned. <CR> sets."
 msgstr ""
 
-#: src/lang.c:2141
-msgid "Spamtrap warning address parts     :"
+#: src/lang.c:2288
+msgid "Spamtrap warning address parts"
 msgstr ""
 
-#: src/lang.c:2142
+#: src/lang.c:2289
 msgid ""
 "# A comma-delimited list of address-parts you want to be warned\n"
 "# about when trying to reply by email.\n"
 msgstr ""
 
-#: src/lang.c:2147
+#: src/lang.c:2294
 msgid "Enter default number of days a filter entry will be valid. <CR> sets."
 msgstr ""
 
-#: src/lang.c:2148
-msgid "No. of days a filter entry is valid:"
+#: src/lang.c:2295
+msgid "No. of days a filter entry is valid"
 msgstr ""
 
-#: src/lang.c:2149
+#: src/lang.c:2296
 msgid "# Number of days a short term filter will be active\n"
 msgstr ""
 
-#: src/lang.c:2153
+#: src/lang.c:2300
 msgid "Add posted articles to filter. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:2154
-msgid "Add posted articles to filter      :"
+#: src/lang.c:2301
+msgid "Add posted articles to filter"
 msgstr ""
 
-#: src/lang.c:2155
+#: src/lang.c:2302
 msgid ""
 "# If ON add posted articles which start a new thread to filter for\n"
 "# highlighting follow-ups\n"
 msgstr ""
 
-#: src/lang.c:2159
+#: src/lang.c:2306
 msgid "The directory where articles/threads are to be saved in mailbox format."
 msgstr ""
 
-#: src/lang.c:2160
-msgid "Mail directory                     :"
+#: src/lang.c:2307
+msgid "Mail directory"
 msgstr ""
 
-#: src/lang.c:2161
+#: src/lang.c:2308
 msgid "# (-m) directory where articles/threads are saved in mailbox format\n"
 msgstr ""
 
-#: src/lang.c:2166
-msgid "Save articles in batch mode (-S)   :"
+#: src/lang.c:2313
+msgid "Save articles in batch mode (-S)"
 msgstr ""
 
-#: src/lang.c:2167
+#: src/lang.c:2314
 msgid ""
 "# If ON articles/threads will be saved in batch mode when save -S\n"
 "# or mail (-M/-N) is specified on the command line\n"
 msgstr ""
 
-#: src/lang.c:2172
+#: src/lang.c:2319
 msgid "The directory where you want articles/threads saved."
 msgstr ""
 
-#: src/lang.c:2173
-msgid "Directory to save arts/threads in  :"
+#: src/lang.c:2320
+msgid "Directory to save arts/threads in"
 msgstr ""
 
-#: src/lang.c:2174
+#: src/lang.c:2321
 msgid "# Directory where articles/threads are saved\n"
 msgstr ""
 
-#: src/lang.c:2178
+#: src/lang.c:2325
 msgid ""
 "Auto save article/thread by Archive-name: header. <SPACE> toggles & <CR> "
 "sets."
 msgstr ""
 
-#: src/lang.c:2179
-msgid "Use Archive-name: header for save  :"
+#: src/lang.c:2326
+msgid "Use Archive-name: header for save"
 msgstr ""
 
-#: src/lang.c:2180
+#: src/lang.c:2327
 msgid ""
 "# If ON articles/threads with Archive-name: in mail header will\n"
 "# be automatically saved with the Archive-name & part/patch no.\n"
 msgstr ""
 
-#: src/lang.c:2185
+#: src/lang.c:2332
 msgid ""
 "Mark saved articles/threads as read. <SPACE> toggles, <CR> sets, <ESC> "
 "cancels."
 msgstr ""
 
-#: src/lang.c:2186
-msgid "Mark saved articles/threads as read:"
+#: src/lang.c:2333
+msgid "Mark saved articles/threads as read"
 msgstr ""
 
-#: src/lang.c:2187
+#: src/lang.c:2334
 msgid "# If ON mark articles that are saved as read\n"
 msgstr ""
 
-#: src/lang.c:2191
+#: src/lang.c:2338
 msgid "Do post processing (eg. extract attachments) for saved articles."
 msgstr ""
 
-#: src/lang.c:2192
-msgid "Post process saved articles        :"
+#: src/lang.c:2339
+msgid "Post process saved articles"
 msgstr ""
 
-#: src/lang.c:2193
+#: src/lang.c:2340
 msgid ""
 "# Perform post processing (saving binary attachments) from saved articles.\n"
-"# 0=(no) 1=(yes) 2=(extract shell archives (shar) only)\n"
+"# Possible values are (the default is marked with *):\n"
+"# * 0 = no\n"
+"#   1 = extract shell archives (shar) only\n"
+"#   2 = yes\n"
 msgstr ""
 
-#: src/lang.c:2199
-msgid "Process only unread articles       :"
+#: src/lang.c:2349
+msgid "Process only unread articles"
 msgstr ""
 
-#: src/lang.c:2200
+#: src/lang.c:2350
 msgid ""
 "# If ON only save/print/pipe/mail unread articles (tagged articles "
 "excepted)\n"
 msgstr ""
 
-#: src/lang.c:2205
+#: src/lang.c:2355
 msgid "Print all or just part of header. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:2206
-msgid "Print all headers when printing    :"
+#: src/lang.c:2356
+msgid "Print all headers when printing"
 msgstr ""
 
-#: src/lang.c:2207
+#: src/lang.c:2357
 msgid ""
 "# If ON print all of article header otherwise just the important lines\n"
 msgstr ""
 
-#: src/lang.c:2211
+#: src/lang.c:2361
 msgid ""
-"The printer program with options that is to be used to print "
-"articles/threads."
+"The printer program with options that is to be used to print articles/"
+"threads."
 msgstr ""
 
-#: src/lang.c:2212
-msgid "Printer program with options       :"
+#: src/lang.c:2362
+msgid "Printer program with options"
 msgstr ""
 
-#: src/lang.c:2213
+#: src/lang.c:2363
 msgid "# Print program with parameters used to print articles/threads\n"
 msgstr ""
 
-#: src/lang.c:2219
-msgid "Force redraw after certain commands:"
+#: src/lang.c:2369
+msgid "Force redraw after certain commands"
 msgstr ""
 
-#: src/lang.c:2220
+#: src/lang.c:2370
 msgid ""
 "# If ON a screen redraw will always be done after certain external commands\n"
 msgstr ""
 
-#: src/lang.c:2224
+#: src/lang.c:2374
 msgid ""
 "Start editor with line offset. <SPACE> toggles, <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/lang.c:2225
-msgid "Start editor with line offset      :"
+#: src/lang.c:2375
+msgid "Start editor with line offset"
 msgstr ""
 
-#: src/lang.c:2226
+#: src/lang.c:2376
 msgid ""
 "# If ON editor will be started with cursor offset into the file\n"
 "# otherwise the cursor will be positioned at the first line\n"
 msgstr ""
 
-#: src/lang.c:2231
+#: src/lang.c:2381
 msgid "Enter %E for editor, %F for filename, %N for line-number, <CR> to set."
 msgstr ""
 
-#: src/lang.c:2232
-msgid "Invocation of your editor          :"
+#: src/lang.c:2382
+msgid "Invocation of your editor"
 msgstr ""
 
-#: src/lang.c:2233
+#: src/lang.c:2383
+#, c-format
 msgid ""
 "# Format of editor line including parameters\n"
 "# %%E Editor  %%F Filename  %%N Linenumber\n"
 msgstr ""
 
-#: src/lang.c:2238
+#: src/lang.c:2388
 msgid ""
 "Enter name and options for external-inews, --internal for internal inews"
 msgstr ""
 
-#: src/lang.c:2239
-msgid "External inews                     :"
+#: src/lang.c:2389
+msgid "External inews"
 msgstr ""
 
-#: src/lang.c:2240
+#: src/lang.c:2390
 msgid ""
 "# If --internal use the built in mini inews for posting via NNTP\n"
 "# otherwise use an external inews program\n"
 msgstr ""
 
-#: src/lang.c:2244
+#: src/lang.c:2394
 msgid ""
 "Enter %M for mailer, %S for subject, %T for to, %F for filename, <CR> to set."
 msgstr ""
 
-#: src/lang.c:2245
-msgid "Invocation of your mail command    :"
+#: src/lang.c:2395
+msgid "Invocation of your mail command"
 msgstr ""
 
-#: src/lang.c:2246
+#: src/lang.c:2396
+#, c-format
 msgid ""
 "# Format of mailer line including parameters\n"
-"# %%M Mailer  %%S Subject  %%T To  %%F Filename  %%U User (AmigaDOS)\n"
+"# %%M Mailer  %%S Subject  %%T To  %%F Filename\n"
 "# ie. to use elm as your mailer:    elm -s \"%%S\" \"%%T\" < %%F\n"
 "# ie. elm interactive          :    elm -i %%F -s \"%%S\" \"%%T\"\n"
 msgstr ""
 
-#: src/lang.c:2254
-msgid "Use interactive mail reader        :"
+#: src/lang.c:2404
+msgid "Use interactive mail reader"
 msgstr ""
 
-#: src/lang.c:2255
+#: src/lang.c:2405
 msgid ""
-"# Interactive mailreader: if ON mailreader will be invoked earlier for\n"
-"# reply so you can use more of its features (eg. MIME, pgp, ...)\n"
-"# this option has to suit default_mailer_format\n"
+"# Interactive mailreader\n"
+"# Possible values are (the default is marked with *):\n"
+"# * 0 = no interactive mailreader\n"
+"#   1 = use interactive mailreader with headers in file\n"
+"#   2 = use interactive mailreader without headers in file\n"
 msgstr ""
 
-#: src/lang.c:2262
-msgid "Remove ~/.article after posting    :"
+#: src/lang.c:2414
+msgid "Remove ~/.article after posting"
 msgstr ""
 
-#: src/lang.c:2263
+#: src/lang.c:2415
 msgid "# If ON remove ~/.article after posting.\n"
 msgstr ""
 
-#: src/lang.c:2267
+#: src/lang.c:2419
 msgid "Filename for all posted articles, <CR> sets, no filename=do not save."
 msgstr ""
 
-#: src/lang.c:2268
-msgid "Filename for posted articles       :"
+#: src/lang.c:2420
+msgid "Filename for posted articles"
 msgstr ""
 
-#: src/lang.c:2269
+#: src/lang.c:2421
 msgid ""
 "# Filename where to keep all postings (default posted)\n"
 "# If no filename is set then postings will not be saved\n"
 msgstr ""
 
-#: src/lang.c:2274
+#: src/lang.c:2426
 msgid ""
 "Keep all failed articles in ~/dead.articles. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:2275
-msgid "Keep failed arts in ~/dead.articles:"
+#: src/lang.c:2427
+msgid "Keep failed arts in ~/dead.articles"
 msgstr ""
 
-#: src/lang.c:2276
+#: src/lang.c:2428
 msgid "# If ON keep all failed postings in ~/dead.articles\n"
 msgstr ""
 
-#: src/lang.c:2280
+#: src/lang.c:2432
 msgid "Do you want to strip unsubscribed groups from .newsrc"
 msgstr ""
 
-#: src/lang.c:2281
-msgid "No unsubscribed groups in newsrc   :"
+#: src/lang.c:2433
+msgid "No unsubscribed groups in newsrc"
 msgstr ""
 
-#: src/lang.c:2282
+#: src/lang.c:2434
 msgid "# If ON strip unsubscribed groups from newsrc\n"
 msgstr ""
 
-#: src/lang.c:2287
-msgid "Remove bogus groups from newsrc    :"
+#: src/lang.c:2439
+msgid "Remove bogus groups from newsrc"
 msgstr ""
 
-#: src/lang.c:2288
+#: src/lang.c:2440
 msgid ""
 "# What to do with bogus groups in newsrc file\n"
-"# 0=(Keep) 1=(Remove) 2=(Highlight with D on selection screen).\n"
+"# Possible values are (the default is marked with *):\n"
+"# * 0 = keep\n"
+"#   1 = remove\n"
+"#   2 = highlight with D on selection screen\n"
 msgstr ""
 
-#: src/lang.c:2292
+#: src/lang.c:2448
 msgid "Enter number of seconds until active file will be reread. <CR> sets."
 msgstr ""
 
-#: src/lang.c:2293
-msgid "Interval in secs to reread active  :"
+#: src/lang.c:2449
+msgid "Interval in secs to reread active"
 msgstr ""
 
-#: src/lang.c:2294
+#: src/lang.c:2450
 msgid ""
 "# Time interval in seconds between rereading the active file (0=never)\n"
 msgstr ""
 
-#: src/lang.c:2299
-msgid "Reconnect to server automatically  :"
+#: src/lang.c:2455
+msgid "Reconnect to server automatically"
 msgstr ""
 
-#: src/lang.c:2300
+#: src/lang.c:2456
 msgid ""
 "# If ON automatically reconnect to NNTP server if the connection is broken\n"
 msgstr ""
 
-#: src/lang.c:2304
+#: src/lang.c:2460
 msgid ""
 "Create local copies of NNTP overview files. <SPACE> toggles & <CR> sets."
 msgstr ""
 
-#: src/lang.c:2305
-msgid "Cache NNTP overview files locally  :"
+#: src/lang.c:2461
+msgid "Cache NNTP overview files locally"
 msgstr ""
 
-#: src/lang.c:2306
+#: src/lang.c:2462
 msgid "# If ON, create local copies of NNTP overview files.\n"
 msgstr ""
 
-#: src/main.c:619
-#, c-format
-msgid "Version: %s release %s (\"%s\") %s %s"
-msgstr ""
-
-#: src/main.c:622
-#, c-format
-msgid "Version: %s release %s (\"%s\")"
-msgstr ""
-
-#: src/nntplib.c:804
-#, c-format
-msgid ""
-"\n"
-"Server timed out, trying reconnect # %d\n"
-msgstr ""
-
-#: src/nntplib.c:822
-msgid "Rejoin current group\n"
-msgstr ""
-
-#: src/nntplib.c:829
-#, c-format
-msgid "Read (%s)\n"
-msgstr ""
-
-#: src/nntplib.c:831
-#, c-format
-msgid "Resend last command (%s)\n"
-msgstr ""
-
-#: src/nntplib.c:951
-msgid "100  Help text on way"
-msgstr ""
-
-#: src/nntplib.c:955
-msgid "180  Authorization capabilities"
-msgstr ""
-
-#: src/nntplib.c:959
-msgid "199  Debug output"
-msgstr ""
-
-#: src/nntplib.c:963
-msgid "200  Hello; you can post"
-msgstr ""
-
-#: src/nntplib.c:967
-msgid "201  Hello; you can't post"
-msgstr ""
-
-#: src/nntplib.c:971
-msgid "202  Slave status noted"
-msgstr ""
-
-#: src/nntplib.c:979
-msgid "211  Group selected"
-msgstr ""
-
-#: src/nntplib.c:984
-msgid "215  Newsgroups follow"
-msgstr ""
-
-#: src/nntplib.c:989
-msgid "218  Group index file follows"
-msgstr ""
-
-#: src/nntplib.c:994
-msgid "220  Article (head & body) follows"
-msgstr ""
-
-#: src/nntplib.c:998
-msgid "221  Head follows"
-msgstr ""
-
-#: src/nntplib.c:1002
-msgid "222  Body follows"
-msgstr ""
-
-#: src/nntplib.c:1006
-msgid "223  No text sent -- stat, next, last"
-msgstr ""
-
-#: src/nntplib.c:1010
-msgid "230  New articles by message-id follow"
-msgstr ""
-
-#: src/nntplib.c:1014
-msgid "231  New newsgroups follow"
-msgstr ""
-
-#: src/nntplib.c:1018
-msgid "235  Article transferred successfully"
-msgstr ""
-
-#: src/nntplib.c:1022
-msgid "240  Article posted successfully"
-msgstr ""
-
-#: src/nntplib.c:1026
-msgid "280  Authorization system ok"
-msgstr ""
-
-#: src/nntplib.c:1030
-msgid "281  Authorization (user/pass) ok"
-msgstr ""
-
-#: src/nntplib.c:1034
-msgid "282  binary data follows"
-msgstr ""
-
-#: src/nntplib.c:1038
-msgid "283  spooldir list follows"
-msgstr ""
-
-#: src/nntplib.c:1042
-msgid "284  Switching to a different spooldir"
-msgstr ""
-
-#: src/nntplib.c:1046
-msgid "285  Still using same spooldir"
-msgstr ""
-
-#: src/nntplib.c:1050
-msgid "286  Current spooldir"
-msgstr ""
-
-#: src/nntplib.c:1054
-msgid "287  Available spooldir"
-msgstr ""
-
-#: src/nntplib.c:1058
-msgid "288  Unavailable spooldir or invalid entry"
-msgstr ""
-
-#: src/nntplib.c:1062
-msgid "335  Continue to send article"
-msgstr ""
-
-#: src/nntplib.c:1066
-msgid "340  Continue to post article"
-msgstr ""
-
-#: src/nntplib.c:1070
-msgid "380  authorization is required"
-msgstr ""
-
-#: src/nntplib.c:1074
-msgid "381  <type> authorization data required"
-msgstr ""
-
-#: src/nntplib.c:1078
-msgid "400  Have to hang up for some reason"
-msgstr ""
-
-#: src/nntplib.c:1082
-msgid "411  No such newsgroup"
-msgstr ""
-
-#: src/nntplib.c:1086
-msgid "412  Not currently in newsgroup"
-msgstr ""
-
-#: src/nntplib.c:1090
-msgid "418  No index file for this group"
-msgstr ""
-
-#: src/nntplib.c:1094
-msgid "420  No current article selected"
-msgstr ""
-
-#: src/nntplib.c:1098
-msgid "421  No next article in this group"
-msgstr ""
-
-#: src/nntplib.c:1102
-msgid "422  No previous article in this group"
-msgstr ""
-
-#: src/nntplib.c:1106
-msgid "423  No such article in this group"
-msgstr ""
-
-#: src/nntplib.c:1110
-msgid "430  No such article at all"
-msgstr ""
-
-#: src/nntplib.c:1114
-msgid "435  Already got that article, don't send"
-msgstr ""
-
-#: src/nntplib.c:1118
-msgid "436  Transfer failed"
+#: src/lang.c:2466
+msgid "Enter format string. <CR> sets, <ESC> cancels."
 msgstr ""
 
-#: src/nntplib.c:1122
-msgid "437  Article rejected, don't resend"
+#: src/lang.c:2467
+msgid "Format string for display of dates"
 msgstr ""
 
-#: src/nntplib.c:1126
-msgid "440  Posting not allowed"
+#: src/lang.c:2468
+msgid "# Format string for date representation\n"
 msgstr ""
 
-#: src/nntplib.c:1130
-msgid "441  Posting failed"
+#: src/lang.c:2474
+msgid "Unicode normalization form"
 msgstr ""
 
-#: src/nntplib.c:1134
-msgid "480  authorization required for command"
+#: src/lang.c:2475
+msgid ""
+"# Unicode normalization form\n"
+"# Possible values are (the default is marked with *):\n"
+"#   0 = None\n"
+"# * 1 = NFKC\n"
+"#   2 = NFKD\n"
+"#   3 = NFC\n"
+"#   4 = NFD\n"
 msgstr ""
 
-#: src/nntplib.c:1138
-msgid "481  Authorization system invalid"
+#: src/lang.c:2487
+msgid "Render BiDi"
 msgstr ""
 
-#: src/nntplib.c:1142
-msgid "482  Authorization data rejected"
+#: src/lang.c:2488
+msgid "# If ON, bi-directional text is rendered by tin\n"
 msgstr ""
 
-#: src/nntplib.c:1146
-msgid "483  Invalid alias on spooldir cmd"
+#: src/misc.c:3750
+#, c-format
+msgid "Version: %s %s release %s (\"%s\") %s %s\n"
 msgstr ""
 
-#: src/nntplib.c:1150
-msgid "484  No spooldir file found"
+#: src/misc.c:3753
+#, c-format
+msgid "Version: %s %s release %s (\"%s\")\n"
 msgstr ""
 
-#: src/nntplib.c:1154
-msgid "500  Command not recognized"
+#: src/newsrc.c:430
+msgid "Unreachable?\n"
 msgstr ""
 
-#: src/nntplib.c:1158
-msgid "501  Command syntax error"
+#: src/nntplib.c:824
+#, c-format
+msgid ""
+"\n"
+"Server timed out, trying reconnect # %d\n"
 msgstr ""
 
-#: src/nntplib.c:1162
-msgid "502  Access to server denied"
+#: src/nntplib.c:842
+msgid "Rejoin current group\n"
 msgstr ""
 
-#: src/nntplib.c:1167
-msgid "503  Program fault, command not performed"
+#: src/nntplib.c:849
+#, c-format
+msgid "Read (%s)\n"
 msgstr ""
 
-#: src/nntplib.c:1171
-msgid "580  Authorization Failed"
+#: src/nntplib.c:851
+#, c-format
+msgid "Resend last command (%s)\n"
 msgstr ""
 
-#: src/nntplib.c:1175
-msgid "Unknown NNTP response code"
+#.
+#. * TODO: - store a hash value of the entire motd in the server-rc
+#. *         and only if it differs from the old value display the
+#. *         motd?
+#. *       - use some sort of pager?
+#. *       - -> lang.c
+#.
+#: src/nntplib.c:1759
+msgid "MOTD: "
 msgstr ""
 
-#: src/nrctbl.c:172
+#: src/nrctbl.c:170
 #, c-format
 msgid "couldn't expand %s\n"
 msgstr ""
 
-#: src/open.c:1032
-msgid "Unreachable?\n"
+#: src/post.c:1171
+#, c-format
+msgid ""
+"Line %d is longer than 998 octets and should be folded, but\n"
+"encoding is neither set to %s nor to %s\n"
 msgstr ""
 
-#: src/post.c:1749
+#: src/post.c:1176
 #, c-format
-msgid "%s is bogus"
+msgid ""
+"Line %d is longer than 998 octets, and should be folded, but\n"
+"encoding is set to %s without enabling MIME_BREAK_LONG_LINES or\n"
+"posting doesn't contain any 8bit chars and thus folding won't happen\n"
 msgstr ""
 
-#: src/post.c:1940
+#: src/post.c:1178
 #, c-format
-msgid "Posting: %.*s ..."
+msgid ""
+"Line %d is longer than 998 octets, and should be folded, but\n"
+"encoding is not set to %s\n"
 msgstr ""
 
-#. TODO: -> lang.c
-#: src/post.c:4038
+#: src/post.c:1993
 #, c-format
-msgid "Rereading %s..."
+msgid "Posting: %.*s ..."
 msgstr ""
 
-#. fp
 #. Check if okay to read
-#: src/read.c:219
+#: src/read.c:211
 msgid "Aborting read, please wait..."
 msgstr ""
 
-#: src/read.c:366
+#: src/read.c:358
 msgid "Aborted read\n"
 msgstr ""
 
-#: src/read.c:422
+#: src/read.c:414
 msgid "Draining\n"
 msgstr ""
 
 #. Don't hash the initial '<'
-#: src/refs.c:220
+#: src/refs.c:251
 msgid "unchanged"
 msgstr ""
 
-#: src/refs.c:573
+#: src/refs.c:609
 msgid "[- Unavailable -]"
 msgstr ""
 
-#: src/save.c:975
+#.
+#. * preamble
+#. * TODO: -> lang.c
+#.
+#: src/rfc2047.c:1201
+#, c-format
+msgid ""
+"This message has been composed in the 'multipart/mixed' MIME-format. If you\n"
+"are reading this prefix, your mail reader probably has not yet been "
+"modified\n"
+"to understand the new format, and some of what follows may look strange.\n"
+"\n"
+msgstr ""
+
+#: src/save.c:972
 msgid "bytes"
 msgstr ""
 
-#: src/select.c:351
+#: src/select.c:379
 msgid "unread"
 msgstr ""
 
-#: src/select.c:351
+#: src/select.c:379
 msgid "all"
 msgstr ""
 
-#: src/select.c:525 src/select.c:527
+#: src/select.c:549 src/select.c:551
 msgid " R"
 msgstr ""
 
Binary files tin-1.6.2/po/tr.gmo and tin-1.8.0/po/tr.gmo differ
diff -Nurp tin-1.6.2/po/tr.po tin-1.8.0/po/tr.po
--- tin-1.6.2/po/tr.po	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/po/tr.po	2005-12-24 19:09:52.798397134 +0100
@@ -0,0 +1,7261 @@
+# Turkish translations for tin
+# Copyright (C) 2005 Free Software Foundation, Inc.
+# Þebnem Korkmaz <sebnem_k@hotmail.com>, 2005.
+# Ali Ibraimi <liloib@yahoo.com>, 2005.
+# Özge Sevinç <ozge_se@yahoo.com>, 2005.
+#
+msgid	""
+msgstr	"Project-Id-Version: tin 1.7.7\n"
+	"Report-Msgid-Bugs-To: \n"
+	"POT-Creation-Date: 2005-12-24 19:09+0100\n"
+	"PO-Revision-Date: 2005-03-06 09:25+0200\n"
+	"Last-Translator: Þebnem Korkmaz <sebnem_k@hotmail.com>\n"
+	"Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
+	"MIME-Version: 1.0\n"
+	"Content-Type: text/plain; charset=ISO-8859-9\n"
+	"Content-Transfer-Encoding: 8bit\n"
+
+#: src/art.c:1533
+#, c-format
+msgid	"%d Bad overview record (%d fields) '%s'"
+msgstr	""
+
+#: src/attrib.c:649
+#, c-format
+msgid	"# Do not edit this comment block\n"
+	"#\n"
+msgstr	"# Bu açýklama bloðunu düzenlemeyin\n"
+	"#\n"
+
+#: src/attrib.c:650
+#, c-format
+msgid	"#  scope=STRING (ie. alt.*,!alt.bin*) [mandatory]\n"
+msgstr	"#  scope=DÝZGE (kapsam, örn. alt.*,!alt.bin*) [zorunlu]\n"
+
+#: src/attrib.c:651
+#, c-format
+msgid	"#  maildir=STRING (ie. ~/Mail)\n"
+msgstr	"#  maildir=DÝZGE (posta dizini, örn. ~/Mail)\n"
+
+#: src/attrib.c:652
+#, c-format
+msgid	"#  savedir=STRING (ie. ~user/News)\n"
+msgstr	"#  savedir=DÝZGE (saklama dizini, örn. ~user/News)\n"
+
+#: src/attrib.c:653
+#, c-format
+msgid	"#  savefile=STRING (ie. =linux)\n"
+msgstr	"#  savefile=DÝZGE (saklama dosyasý, örn. =linux)\n"
+
+#: src/attrib.c:654
+#, c-format
+msgid	"#  sigfile=STRING (ie. $var/sig)\n"
+msgstr	"#  sigfile=DÝZGE (imza dosyasý, örn. $var/sig)\n"
+
+#: src/attrib.c:655
+#, c-format
+msgid	"#  organization=STRING (if beginning with '/' read from file)\n"
+msgstr	"#  organization=DÝZGE (kurum; eðer / ile baþlýyor ise, dosyadan okunur)\n"
+
+#: src/attrib.c:656
+#, c-format
+msgid	"#  followup_to=STRING\n"
+msgstr	"#  followup_to=DÝZGE (cevap yönlendirmesi)\n"
+
+#: src/attrib.c:657
+#, c-format
+msgid	"#  mailing_list=STRING (ie. majordomo@example.org)\n"
+msgstr	"#  mailing_list=DÝZGE (posta listesi, örn. majordomo@example.org)\n"
+
+#: src/attrib.c:658
+#, c-format
+msgid	"#  x_headers=STRING (ie. ~/.tin/extra-headers)\n"
+msgstr	"#  x_headers=DÝZGE (ekstra baþlýk dosyasý, örn. ~/.tin/extra-headers)\n"
+
+#: src/attrib.c:659
+#, c-format
+msgid	"#  x_body=STRING (ie. ~/.tin/extra-body-text)\n"
+msgstr	"#  x_body=DÝZGE (extra gövde dosyasý, örn. ~/.tin/extra-body-text)\n"
+
+#: src/attrib.c:660
+#, c-format
+msgid	"#  from=STRING (just append wanted From:-line, don't use quotes)\n"
+msgstr	""
+
+#: src/attrib.c:661
+#, fuzzy, c-format
+msgid	"#  news_quote_format=STRING\n"
+msgstr	"#  news_quote_format=DÝZGE\n"
+
+#: src/attrib.c:662
+#, c-format
+msgid	"#  quote_chars=STRING (%%s, %%S for initials)\n"
+msgstr	""
+
+#: src/attrib.c:663
+#, c-format
+msgid	"#  mime_types_to_save=STRING (eg. image/*,!image/bmp)\n"
+msgstr	""
+
+#: src/attrib.c:665
+#, fuzzy, c-format
+msgid	"#  ispell=STRING\n"
+msgstr	"#  ispell=DÝZGE\n"
+
+#: src/attrib.c:667
+#, c-format
+msgid	"#  auto_select=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:668
+#, c-format
+msgid	"#  auto_save=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:669
+#, c-format
+msgid	"#  batch_save=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:670
+#, c-format
+msgid	"#  delete_tmp_files=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:671
+#, c-format
+msgid	"#  show_only_unread=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:672
+#, c-format
+msgid	"#  thread_arts=NUM"
+msgstr	""
+
+#: src/attrib.c:679
+#, c-format
+msgid	"#  thread_perc=NUM\n"
+msgstr	""
+
+#: src/attrib.c:680
+#, c-format
+msgid	"#  show_author=NUM\n"
+msgstr	""
+
+#: src/attrib.c:686
+#, c-format
+msgid	"#  show_info=NUM\n"
+msgstr	""
+
+#: src/attrib.c:692
+#, c-format
+msgid	"#  sort_art_type=NUM\n"
+msgstr	""
+
+#: src/attrib.c:710
+#, c-format
+msgid	"#  sort_threads_type=NUM\n"
+msgstr	""
+
+#: src/attrib.c:715
+#, c-format
+msgid	"#  post_proc_type=NUM\n"
+msgstr	""
+
+#: src/attrib.c:720
+#, c-format
+msgid	"#  quick_kill_scope=STRING (ie. talk.*)\n"
+msgstr	""
+
+#: src/attrib.c:721
+#, c-format
+msgid	"#  quick_kill_expire=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:722
+#, c-format
+msgid	"#  quick_kill_case=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:723
+#, c-format
+msgid	"#  quick_kill_header=NUM\n"
+msgstr	""
+
+#: src/attrib.c:724 src/attrib.c:731
+#, c-format
+msgid	"#    0=subj (case sensitive) 1=subj (ignore case)\n"
+msgstr	""
+
+#: src/attrib.c:725 src/attrib.c:732
+#, c-format
+msgid	"#    2=from (case sensitive) 3=from (ignore case)\n"
+msgstr	""
+
+#: src/attrib.c:726 src/attrib.c:733
+#, c-format
+msgid	"#    4=msgid 5=lines\n"
+msgstr	""
+
+#: src/attrib.c:727
+#, fuzzy, c-format
+msgid	"#  quick_select_scope=STRING\n"
+msgstr	"#  quick_select_scope=DÝZGE\n"
+
+#: src/attrib.c:728
+#, c-format
+msgid	"#  quick_select_expire=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:729
+#, c-format
+msgid	"#  quick_select_case=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:730
+#, c-format
+msgid	"#  quick_select_header=NUM\n"
+msgstr	""
+
+#: src/attrib.c:734
+#, c-format
+msgid	"#  x_comment_to=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:735
+#, c-format
+msgid	"#  fcc=STRING (eg. =mailbox)\n"
+msgstr	""
+
+#: src/attrib.c:736
+#, c-format
+msgid	"#  tex2iso_conv=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:737
+#, c-format
+msgid	"#  mime_forward=ON/OFF\n"
+msgstr	""
+
+#: src/attrib.c:739
+#, c-format
+msgid	"#  mm_network_charset=supported_charset"
+msgstr	""
+
+#: src/attrib.c:746
+#, c-format
+msgid	"#  undeclared_charset=STRING (default is US-ASCII)\n"
+msgstr	""
+
+#: src/attrib.c:748
+#, fuzzy, c-format
+msgid	"#\n"
+	"# Note that it is best to put general (global scoping)\n"
+msgstr	"#\n"
+	"# Genel(küresel) kaplamýn en iyi olduðunu not ediniz.\n"
+
+#: src/attrib.c:749
+#, fuzzy, c-format
+msgid	"# entries first followed by group specific entries.\n"
+	"#\n"
+msgstr	"# Öncelikle özgül grup girdileri tarafýndan takip edilen girdiler\n"
+	"#\n"
+
+#: src/attrib.c:750
+#, c-format
+msgid	"############################################################################\n"
+	"\n"
+msgstr	"############################################################################\n"
+	"\n"
+
+#: src/attrib.c:756
+#, c-format
+msgid	"# include extra headers\n"
+msgstr	"# extra baþlýklarý içerir\n"
+
+#: src/attrib.c:764
+#, c-format
+msgid	"# in *sources* set post process type to shar only\n"
+msgstr	""
+
+#: src/attrib.c:768
+#, fuzzy, c-format
+msgid	"# in *binaries* do full post processing but no TeX2ISO conversion,\n"
+msgstr	"# ikilik dosyalarda iþletim sonrasýný tam yapýn, tmp dosyalarýný kaldýrýn.\n"
+
+#: src/attrib.c:769
+#, c-format
+msgid	"# remove tmp files and set Followup-To: poster\n"
+msgstr	""
+
+#: src/cook.c:499
+msgid	"(unknown)"
+msgstr	"(bilinmiyor)"
+
+#.
+#. * TODO: add to the right rule, give better explanation, -> lang.c
+#.
+#: src/filter.c:597 src/filter.c:605
+msgid	"Removed from the previous rule: "
+msgstr	"Önceki kuraldan kaldýrýldý: "
+
+#: src/keymap.c:271
+msgid	"NULL"
+msgstr	""
+
+#: src/lang.c:42
+#, fuzzy
+msgid	"1 Response"
+msgstr	"1 Yanýt"
+
+#: src/lang.c:46
+#, fuzzy, c-format
+msgid	"\n"
+	"%s contains no newsgroups. Exiting."
+msgstr	"\n"
+	"%s haber gruplarýný içermez. Çýkýyor."
+
+#: src/lang.c:47
+msgid	"all "
+msgstr	"tümü"
+
+#: src/lang.c:48
+msgid	"All groups"
+msgstr	"Tüm gruplar"
+
+#: src/lang.c:49
+#, fuzzy, c-format
+msgid	"File %s exists. %s=append, %s=overwrite, %s=quit: "
+msgstr	"%s dosyasý var. %s=ekle, %s=üstüne yazý., %s=çýk: "
+
+#: src/lang.c:50
+msgid	"Article cancelled (deleted)."
+msgstr	"Makale iptal edildi (silinmiþ)."
+
+#: src/lang.c:51
+msgid	"Article cannot be cancelled (deleted)."
+msgstr	"Makale iptal edilemedi (silinemedi)."
+
+#: src/lang.c:52
+msgid	"Article deleted."
+msgstr	"Makale silindi."
+
+#: src/lang.c:53
+#, fuzzy, c-format
+msgid	"\n"
+	"Your article:\n"
+	"  \"%s\"\n"
+	"will be posted to the following %s:\n"
+msgstr	"\n"
+	"Makaleniz:\n"
+	"  \"%s\"\n"
+	"buna gönderilecektir %s:\n"
+
+#: src/lang.c:54
+msgid	"Article not posted!"
+msgstr	"Makale gönderilmedi!"
+
+#: src/lang.c:55
+msgid	"Article not saved"
+msgstr	"Makale kaydedilmedi"
+
+#: src/lang.c:56
+#, fuzzy
+msgid	"Article Level Commands"
+msgstr	"Makale Düzey Komutlarý"
+
+#: src/lang.c:57
+msgid	"Article has no parent"
+msgstr	"Makalenin üstü yok"
+
+#: src/lang.c:58
+#, fuzzy
+msgid	"Parent article has been killed"
+msgstr	"Ana makale öldürüldü"
+
+#: src/lang.c:59
+#, fuzzy
+msgid	"Parent article is unavailable"
+msgstr	"Ana makale kullanlamýyor."
+
+#: src/lang.c:60
+#, c-format
+msgid	"Article posted: %s"
+msgstr	"Makale gönderildi: %s"
+
+#: src/lang.c:61
+#, c-format
+msgid	"Article rejected (saved to %s)"
+msgstr	"Makale reddedildi (%s dosyasýna kaydedildi)"
+
+#: src/lang.c:62
+#, fuzzy, c-format
+msgid	"%s=article, %s=thread, %s=hot, %s=pattern, %s=tagged articles, %s=quit: "
+msgstr	"%s=makale, %s=parçacýk, %s=otomatik, %s=kalýp, %s=imlenmiþ makaleler, %s=çýk: "
+
+#: src/lang.c:63
+#, fuzzy
+msgid	"Article unavailable"
+msgstr	"Makale kullanýlamýyor."
+
+#: src/lang.c:64
+msgid	"Article undeleted."
+msgstr	"Makale silinmeden geri alýndý."
+
+#: src/lang.c:66
+msgid	"articles"
+msgstr	"makaleler"
+
+#: src/lang.c:67
+#, fuzzy
+msgid	"This is a repost of the following article:"
+msgstr	"Bu dosyanýn yeniden gönderimi dieðildir:"
+
+#: src/lang.c:68
+msgid	"article"
+msgstr	"makale"
+
+#: src/lang.c:69
+msgid	"Article"
+msgstr	"Makale"
+
+#: src/lang.c:70
+#, c-format
+msgid	"-- %d %s mailed --"
+msgstr	"-- %d %s postalandý --"
+
+#: src/lang.c:71
+#, c-format
+msgid	" at %s"
+msgstr	" %s de"
+
+#: src/lang.c:72
+#, fuzzy, c-format
+msgid	"%*s[-- %s/%s, encoding %s%s%s, %d lines%s%s --]\n"
+msgstr	"%*s[-- %s/%s, kodluyor %s%s%s, %d satýr%s%s --]\n"
+
+#: src/lang.c:73
+msgid	", charset: "
+msgstr	""
+
+#: src/lang.c:74
+#, c-format
+msgid	"%*s[-- Description: %s --]\n"
+msgstr	"%*s[-- Taným: %s --]\n"
+
+#: src/lang.c:75
+#, c-format
+msgid	"%d Authentication failed"
+msgstr	"%d Kimlik denetimi baþarýsýz"
+
+#: src/lang.c:76
+#, fuzzy
+msgid	"Server expects authentication.\n"
+msgstr	"Sunucu doðrulama bekliyor.\n"
+
+#: src/lang.c:77
+msgid	"    Please enter password: "
+msgstr	"    Lütfen parola girin: "
+
+#: src/lang.c:78
+msgid	"    Please enter username: "
+msgstr	"    Lütfen kullanýcý adý girin: "
+
+#: src/lang.c:79
+#, fuzzy, c-format
+msgid	"Author search backwards [%s]> "
+msgstr	"Yazar geriye doðru arýyor[%s]> "
+
+#: src/lang.c:80
+#, fuzzy, c-format
+msgid	"Author search forwards [%s]> "
+msgstr	"Yazar ileriye doðru arýyor [%s]> "
+
+#: src/lang.c:81
+#, fuzzy, c-format
+msgid	"Authorized for user: %s\n"
+msgstr	"Kullanýcý için yetkilendirlmiþ: %s\n"
+
+#: src/lang.c:82
+#, c-format
+msgid	"Authorization failed for user: %s\n"
+msgstr	"Kullanýcý için yetkilendirme baþarýsýz: %s\n"
+
+#: src/lang.c:83
+#, fuzzy, c-format
+msgid	"\n"
+	"Autosubscribed to %s"
+msgstr	"\n"
+	"Otomatik abone %s"
+
+#: src/lang.c:84
+#, fuzzy
+msgid	"Autosubscribing groups...\n"
+msgstr	"Gruplar otomatik abone ediliyor...\n"
+
+#: src/lang.c:85
+#, c-format
+msgid	"Autoselecting articles (use '%s' to see all unread) ..."
+msgstr	"Makaleler otomatik seçiliyor (tüm okunmamýþlarý görmek için '%s' kullanýn) ..."
+
+#: src/lang.c:87
+#, c-format
+msgid	"Active file corrupt - %s"
+msgstr	"Aktif dosya bozuk - %s"
+
+#: src/lang.c:88
+#, fuzzy, c-format
+msgid	"Article to be posted resulted in errors/warnings. %s=quit, %s=Menu, %s=edit: "
+msgstr	"Gönderilecek dosyada hatalar/uyarýlar çýktý. %s=çýk, %s=Menü, %s=düzelt: "
+
+#: src/lang.c:89
+#, c-format
+msgid	"Unrecognized attribute: %s"
+msgstr	"Tanýnmayan öznitelik: %s"
+
+#: src/lang.c:90
+#, c-format
+msgid	"Bad command. Type '%s' for help."
+msgstr	"Bozuk komut. Yardým için '%s' yazýn."
+
+#: src/lang.c:92
+#, fuzzy
+msgid	"Base article"
+msgstr	"Temel makale"
+
+#: src/lang.c:93
+#, fuzzy
+msgid	"Base article range"
+msgstr	"Temel makale aralýðý"
+
+#: src/lang.c:94
+#, fuzzy, c-format
+msgid	"%s: Updating of index files not supported\n"
+msgstr	"%s: Desteklenmeyen dizin dosyalarý güncelleniyor\n"
+
+#: src/lang.c:95
+msgid	"*** Beginning of article ***"
+msgstr	"*** Makalenin baþý ***"
+
+#: src/lang.c:97
+#, fuzzy, c-format
+msgid	"Cancel (delete) or supersede (overwrite) article [%%s]? (%s/%s/%s): "
+msgstr	"Dosyayý Ýptal et(sil) veya dosyanýn yerini al(üstüne yaz)[%%s]? (%s/%s/%s): "
+
+#: src/lang.c:98
+msgid	"Cancelling article..."
+msgstr	"Makale iptal ediliyor..."
+
+#: src/lang.c:100
+#, fuzzy, c-format
+msgid	"Cannot create %s"
+msgstr	"Yaratýlmaýyor %s"
+
+#: src/lang.c:101
+#, fuzzy, c-format
+msgid	"Can't find base article %d"
+msgstr	"Temel makale bulunamýyor %d"
+
+#: src/lang.c:102
+#, fuzzy, c-format
+msgid	"Can't open %s"
+msgstr	"Açýlamýyor %s"
+
+#: src/lang.c:103
+#, fuzzy, c-format
+msgid	"Couldn't open %s for saving"
+msgstr	"Kaydetmek için %s açýlmadý"
+
+#: src/lang.c:104
+msgid	"*** Posting not allowed ***"
+msgstr	"*** Gönderim izni yok ***"
+
+#: src/lang.c:105
+#, c-format
+msgid	"Posting is not allowed to %s"
+msgstr	"%s için gönderim izni yok"
+
+#: src/lang.c:106
+#, fuzzy, c-format
+msgid	"Can't retrieve %s"
+msgstr	"Alýnamýyor %s"
+
+#: src/lang.c:107
+#, c-format
+msgid	"%s is a directory"
+msgstr	"%s bir dizindir"
+
+#: src/lang.c:108
+msgid	"Catchup"
+msgstr	""
+
+#: src/lang.c:109
+#, c-format
+msgid	"Catchup %s..."
+msgstr	""
+
+#: src/lang.c:110
+msgid	"Catchup all groups entered during this session?"
+msgstr	""
+
+#: src/lang.c:111
+#, fuzzy
+msgid	"You have tagged articles in this group - catchup anyway?"
+msgstr	"Bu makalede imlenmiþ makaleler var - catchup anyway?"
+
+#: src/lang.c:112
+#, c-format
+msgid	"%s %d %s in %lu seconds\n"
+msgstr	"%4$lu saniyede %1$s %2$d %3$s\n"
+
+#: src/lang.c:113
+msgid	"Caughtup"
+msgstr	""
+
+#: src/lang.c:114
+#, fuzzy
+msgid	"Check Prepared Article"
+msgstr	"Hazýr Makaleyi Denetle"
+
+#: src/lang.c:115
+#, fuzzy
+msgid	"Checking for new groups... "
+msgstr	"Yeni gruplar denetleniyor... "
+
+#: src/lang.c:116
+#, fuzzy
+msgid	"Checking for news..."
+msgstr	"Haberler denetleniyor..."
+
+#: src/lang.c:117
+#, fuzzy, c-format
+msgid	"Post-process %s=no, %s=yes, %s=shar, %s=quit: "
+msgstr	"Son-iþlem %s=hayýr, %s=evet, %s=ortak, %s=çýk: "
+
+#: src/lang.c:119
+#, fuzzy
+msgid	"ANSI color disabled"
+msgstr	"ANSI renk geçersiz"
+
+#: src/lang.c:120
+#, fuzzy
+msgid	"ANSI color enabled"
+msgstr	"ANSI renk geçerli"
+
+#: src/lang.c:122
+#, c-format
+msgid	"Command failed: %s"
+msgstr	"Komut baþarýsýz: %s"
+
+#: src/lang.c:123
+msgid	"Mark not selected articles read?"
+msgstr	""
+
+#: src/lang.c:124
+#, fuzzy, c-format
+msgid	"Connecting to %s..."
+msgstr	"Baðlanýyor %s..."
+
+#: src/lang.c:125
+msgid	"<CR>"
+msgstr	"<CR>"
+
+#: src/lang.c:126
+#, fuzzy
+msgid	"Creating active file for saved groups...\n"
+msgstr	"Kaydedilen kümeler için aktif dosya oluþturuyor...\n"
+
+#: src/lang.c:127
+#, fuzzy
+msgid	"Creating newsrc file...\n"
+msgstr	"Newsrc dosyasý oluþturuluyor...\n"
+
+#: src/lang.c:129 src/lang.c:1150
+msgid	"Default"
+msgstr	"Öntanýmlý"
+
+#: src/lang.c:130
+#, fuzzy
+msgid	"Delete saved files that have been post processed?"
+msgstr	"Son iþlenen kaydedilmiþ dosyalarý sil?"
+
+#: src/lang.c:131
+msgid	"Deleting temporary files..."
+msgstr	"Geçici dosyalar siliniyor..."
+
+#: src/lang.c:133
+msgid	"*** End of article ***"
+msgstr	"*** Makalenin sonu ***"
+
+#: src/lang.c:134
+msgid	"*** End of articles ***"
+msgstr	"*** Makalelerin sonu ***"
+
+#: src/lang.c:135
+#, fuzzy
+msgid	"*** End of groups ***"
+msgstr	"*** Kümelerin sonu ***"
+
+#: src/lang.c:136
+#, fuzzy
+msgid	"*** End of thread ***"
+msgstr	"*** Parçacýklarýn sonu ***"
+
+#: src/lang.c:137
+#, fuzzy
+msgid	"Enter limit of articles to get> "
+msgstr	"Alýnacak makalelerin limitini girin> "
+
+#: src/lang.c:138
+#, fuzzy
+msgid	"Enter Message-ID to go to> "
+msgstr	"Gitmek için kimlik mesajýný girin> "
+
+#: src/lang.c:139
+#, fuzzy
+msgid	" and enter next unread thread"
+msgstr	" ve sonraki okuma parçacýðýný yazýn"
+
+#: src/lang.c:140
+#, fuzzy
+msgid	" and enter next unread group"
+msgstr	" ve sonraki okuma kümesini yazýn"
+
+#: src/lang.c:141
+#, fuzzy
+msgid	"Enter option number> "
+msgstr	"Seçenek numarasýný yazýn> "
+
+#: src/lang.c:142
+#, fuzzy, c-format
+msgid	"Enter range [%s]> "
+msgstr	"Aralýðý yazýn [%s]> "
+
+#: src/lang.c:143
+#, fuzzy
+msgid	"\n"
+	"Warning: Approved: header used.\n"
+msgstr	"\n"
+	"Uyarý: Onaylandý: baþlýk kullanýldý.\n"
+
+#: src/lang.c:145
+#, fuzzy
+msgid	"\n"
+	"Error: Bad address in Approved: header.\n"
+msgstr	"\n"
+	"Hata: Onaylananda bozuk adres: baþlýk.\n"
+
+#: src/lang.c:146
+#, fuzzy
+msgid	"\n"
+	"Error: Bad address in From: header.\n"
+msgstr	"\n"
+	"Hata: Gönderende bozuk adres: baþlýk.\n"
+
+#: src/lang.c:147
+#, fuzzy
+msgid	"\n"
+	"Error: Bad address in Reply-To: header.\n"
+msgstr	"\n"
+	"Hata: Yanýtta bozuk adres: baþlýk\n"
+
+#: src/lang.c:148
+#, fuzzy
+msgid	"\n"
+	"Error: Bad FQDN in Message-ID: header.\n"
+msgstr	"\n"
+	"Hata: Kimilk mesajýnda bozuk FQDN: baþlýk.\n"
+
+#: src/lang.c:149
+#, fuzzy, c-format
+msgid	"Can't unlock %s"
+msgstr	"Açýlamýyor %s"
+
+#: src/lang.c:151
+#, fuzzy, c-format
+msgid	"Corrupted file %s"
+msgstr	"Virüslü dosya %s"
+
+#: src/lang.c:152
+#, fuzzy, c-format
+msgid	"Couldn't dotlock %s - article not appended!"
+msgstr	"Açýlamadý %s - makale eklenmedi!"
+
+#: src/lang.c:153
+#, fuzzy, c-format
+msgid	"Couldn't lock %s - article not appended!"
+msgstr	"Kapatýlamadý %s - makale eklenmedi!"
+
+#: src/lang.c:155
+msgid	"Internal error in GNKSA routine - send bug report.\n"
+msgstr	"GNKSA yordamýnda iç hata - hata raporu gönder.\n"
+
+#: src/lang.c:156
+#, fuzzy
+msgid	"Left angle bracket missing in route address.\n"
+msgstr	"Yordam adresinde sol açýlý ayraç eksik.\n"
+
+#: src/lang.c:157
+msgid	"Left parenthesis missing in old-style address.\n"
+msgstr	"Eski-biçemli adreste sol ayraç eksik.\n"
+
+#: src/lang.c:158
+msgid	"Right parenthesis missing in old-style address.\n"
+msgstr	"Eski-biçemli adreste sað ayraç eksik.\n"
+
+#: src/lang.c:159
+msgid	"At-sign missing in mail address.\n"
+msgstr	"Posta adresinde @ iþareti eksik.\n"
+
+#: src/lang.c:160
+#, fuzzy
+msgid	"Single component FQDN is not allowed. Add your domain.\n"
+msgstr	"FQDN tekli bileþenine izin verilmedi. Taným kümesi ekleyin.\n"
+
+#: src/lang.c:161
+#, fuzzy
+msgid	"Invalid domain. Send bug report if your top level domain really exists.\n"
+	"Use .invalid as top level domain for munged addresses.\n"
+msgstr	"Geçersiz etki alaný. Üst düzey etki alaný varsa hata raporu gönderin.\n"
+	"Kullan . munged adresler için geçersiz üst düzey etki alaný.\n"
+
+#: src/lang.c:162
+#, fuzzy
+msgid	"Illegal domain. Send bug report if your top level domain really exists.\n"
+	"Use .invalid as top level domain for munged addresses.\n"
+msgstr	"Kuraldýþý etki alaný. Üst düzey etki alaný varsa hata raporu gönderin.\n"
+	"Kuulan . munged adresler için geçersiz üst düzey etki alaný.\n"
+
+#: src/lang.c:163
+#, fuzzy
+msgid	"Unknown domain. Send bug report if your top level domain really exists.\n"
+	"Use .invalid as top level domain for munged addresses.\n"
+msgstr	"Bilinmeyen etki alaný. Üst düzey etki alalný varsa hata raporu gönderin.\n"
+	"Kullan. munged adresler geçersiz üst düzey etki alaný.\n"
+
+#: src/lang.c:164
+msgid	"Illegal character in FQDN.\n"
+msgstr	"FQDN'de kuraldýþý karakter.\n"
+
+#: src/lang.c:165
+#, fuzzy
+msgid	"Zero length FQDN component not allowed.\n"
+msgstr	"Sýfýr unzunluklu FQDN bileþenine izin verilmedi.\n"
+
+#: src/lang.c:166
+#, fuzzy
+msgid	"FQDN component exceeds maximum allowed length (63 chars).\n"
+msgstr	"FQDN bileþeni izin verilen maximum uzunluðu aþýyor.(63 kar.).\n"
+
+#: src/lang.c:167
+#, fuzzy
+msgid	"FQDN component may not start or end with hyphen.\n"
+msgstr	"FQDN bileþeni tire ile baþlamayabilir veya bitmeyebilir.\n"
+
+#: src/lang.c:168
+#, fuzzy
+msgid	"FQDN component may not start with digit.\n"
+msgstr	"FQDN bileþeni basamak ile baþlamayabilir.\n"
+
+#: src/lang.c:169
+#, fuzzy
+msgid	"Domain literal has impossible numeric value.\n"
+msgstr	"Deðiþmez etki alaný imkansýz sayýsal deðere sahip.\n"
+
+#: src/lang.c:170
+#, fuzzy
+msgid	"Domain literal is for private use only and not allowed for global use.\n"
+msgstr	"Deðiþmez etki alaný sadece özel kullaným içindir ve küresel kullanýma izin "
+	"verilmez.\n"
+
+#: src/lang.c:171
+#, fuzzy
+msgid	"Right bracket missing in domain literal.\n"
+msgstr	"Deðiþmez etki alanýnda sað köþeli ayraç eksik.\n"
+
+#: src/lang.c:172
+msgid	"Missing localpart of mail address.\n"
+msgstr	"Posta adresinin yerel kýsmý eksik.\n"
+
+#: src/lang.c:173
+msgid	"Illegal character in localpart of mail address.\n"
+msgstr	"Posta adresinin yerel kýsmýnda kuraldýþý karakter.\n"
+
+#: src/lang.c:174
+#, fuzzy
+msgid	"Zero length localpart component not allowed.\n"
+msgstr	"Sýfýr uzunluklu yerel kýsým bileþenine izin verilmedi.\n"
+
+#: src/lang.c:175
+#, fuzzy
+msgid	"Illegal character in realname.\n"
+	"Unquoted words may not contain '!()<>@,;:\\.[]' in route addresses.\n"
+msgstr	"Gerçek isimde kuraldýþý karakter.\n"
+	"Ýmlenmemiþ sözcükler yordam adreslerinde '!()<>@,;:\\.[]' içermeyebilir.\n"
+
+#: src/lang.c:176
+#, fuzzy
+msgid	"Illegal character in realname.\n"
+	"Quoted words may not contain '()<>\\'.\n"
+msgstr	"Gerçek isimde kuraldýþý karakter.\n"
+	"Ýmlenmil sözcükler '()<>\\' içermeyebilir.\n"
+
+#: src/lang.c:177
+#, fuzzy
+msgid	"Illegal character in realname.\n"
+	"Encoded words may not contain '!()<>@,;:\"\\.[]/=' in parameter.\n"
+msgstr	"Gerçek isimde kuraldýþý karakter.\n"
+	"Kodlanmýþ sözcükler parametrelerde '!()<>@,;:\"\\.[]/= içermeyebilir.\n"
+
+#: src/lang.c:178
+#, fuzzy
+msgid	"Bad syntax in encoded word used in realname.\n"
+msgstr	"Gerçek isimde kullanýlan kodlanmýþ sözkükte bozuk sözdizimi.\n"
+
+#: src/lang.c:179
+#, fuzzy
+msgid	"Illegal character in realname.\n"
+	"Unquoted words may not contain '()<>\\' in old-style addresses.\n"
+msgstr	"Gerçek isimde kuraldýþý karakter.\n"
+	"Ýmlenmemiþ sözcükler eski-biçemli adreslerde '()<>\\' içermeyebilir.\n"
+
+#: src/lang.c:180
+#, fuzzy
+msgid	"Illegal character in realname.\n"
+	"Control characters and unencoded 8bit characters > 127 are not allowed.\n"
+msgstr	"Gerçek isimde kuraldýþý karakter. Denetim karakterlerine ve kodlanmamýþ 8bit "
+	"karakterlerine > 127 izin verilmedi.\n"
+
+#: src/lang.c:181
+#, fuzzy
+msgid	"\n"
+	"Error: No blank line found after header.\n"
+msgstr	"\n"
+	"Hata: Baþlýktan sonra boþ satýr bulunamadý.\n"
+
+#. TODO: fixme, US-ASCII is not the only 7bit charset we know about
+#: src/lang.c:183
+#, fuzzy
+msgid	"\n"
+	"Error: Posting contains non-ASCII characters but MM_CHARSET is set to\n"
+	"       US-ASCII  - please change this setting to a suitable value for\n"
+	"       your language  using the  M)enu of configurable  options or by\n"
+	"       editing tinrc.\n"
+msgstr	"\n"
+	"Hata: Gönderim ASCII olmayan karakterler içeriyor ama MM_CHARSET ayarlandý.\n"
+	" US-ASCII - lütfen bu ayarlarý uygun deðerlere dönüþtürün\n"
+	" diliniz için yapýlandýrabilen seçenekler M)enüsünü kullanarak ya da\n"
+	" tinric düzenleyerek.\n"
+
+#: src/lang.c:188
+#, fuzzy
+msgid	"\n"
+	"Error: Posting contains  non-ASCII characters  but the  MIME encoding\n"
+	"       for news  messages  is set  to \"7bit\"  -  please change this\n"
+	"       setting to \"8bit\" or \"quoted-printable\" depending  on what\n"
+	"       is more common  in your part  of the world.  This can  be done\n"
+	"       using the M)enu of configurable options or by editing tinrc.\n"
+msgstr	"\n"
+	"Hata: Gönderim ASCIII olmayan karakterler içeriyor ama MIME kodlanýyor\n"
+	" haber iletileri için  \"7bit\" ayarlandý - lütfen deðiþtirin\n"
+	" ayarlarý \"8bit\" ya da  \"quoted-printable\" baðlý olarak\n"
+	" yaþadýðýnýz bölgede daha yaygýn olana. Bu yapýlabilir\n"
+	" yapýlandýrabilen seçenekler  M)enüsü kullanýlarak veya tinrc düzenlenerek.\n"
+
+#: src/lang.c:194
+#, fuzzy
+msgid	"\n"
+	"Error: Article starts with blank line instead of header\n"
+msgstr	"\n"
+	"Hata: Makale baþlýk yerine boþ satýrla baþlýyor\n"
+
+#: src/lang.c:195
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: Header on line %d does not have a colon after the header name:\n"
+	"%s\n"
+msgstr	"\n"
+	"Hata: Satýrdaki baþlýkta %d baþlýk isminden sonra iki nokta yok:\n"
+	"%s\n"
+
+#: src/lang.c:196
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: The \"%s:\" line is empty.\n"
+msgstr	"\n"
+	"Hata: \"%s:\"satýrý boþ.\n"
+
+#: src/lang.c:197
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: The \"%s:\" line is missing from the article header.\n"
+msgstr	"\n"
+	"Hata: Makale baþlýðýnda \"%s:\" satýrý eksik.\n"
+
+#: src/lang.c:198
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: Header on line %d does not have a space after the colon:\n"
+	"%s\n"
+msgstr	"\n"
+	"Hata: %d satýrýndaki baþlýkta iki noktadan sonra boþluk yok:\n"
+	"%s\n"
+
+#: src/lang.c:199
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: There are multiple (%d) \"%s:\" lines in the header.\n"
+msgstr	"\n"
+	"Hata: Baþlýkta (%d) \"%s:\" çoklu satýlrarý var.\n"
+
+#: src/lang.c:200
+#, fuzzy, c-format
+msgid	"Insecure permissions of %s (%o)"
+msgstr	"Güvenli olmayan yetkiler %s (%o)"
+
+#: src/lang.c:201
+#, fuzzy, c-format
+msgid	"Invalid response to GROUP command, %s"
+msgstr	"KÜME komutuna geçersiz yanýt.%s"
+
+#: src/lang.c:203
+#, fuzzy, c-format
+msgid	"MIME parse error: Unexpected end of %s/%s article"
+msgstr	"MIME ayrýþtýrma hatasý: Makale %s/%s için beklenmeyen son"
+
+#: src/lang.c:204
+#, fuzzy
+msgid	"MIME parse error: Start boundary whilst reading headers"
+msgstr	"MIME ayrýþtýrma hatasý: Baþlýklarý okurken baþlatma sýnýrý"
+
+#: src/lang.c:205
+#, fuzzy
+msgid	"Can't get a (fully-qualified) domain-name!"
+msgstr	"(Tam niletelendirilmiþ) etki alaný adý alýnamadý!"
+
+#: src/lang.c:206
+#, fuzzy, c-format
+msgid	"No permissions to go into %s\n"
+msgstr	"%s için gidiþ yetkisi yok\n"
+
+#: src/lang.c:207
+#, fuzzy
+msgid	"\n"
+	"Error: From: line missing.\n"
+msgstr	"\n"
+	"Hata: Baþlangýç:satýr eksik.\n"
+
+#: src/lang.c:208
+#, fuzzy, c-format
+msgid	"No read permissions for %s\n"
+msgstr	"%s için okuma yetkisi yok\n"
+
+#: src/lang.c:209
+#, fuzzy, c-format
+msgid	"File %s does not exist\n"
+msgstr	"%s dosyasý yok\n"
+
+#: src/lang.c:210
+#, fuzzy, c-format
+msgid	"No write permissions for %s\n"
+msgstr	"%s için yazma yetkisi yok\n"
+
+#: src/lang.c:211
+#, fuzzy
+msgid	"Can't get user information (/etc/passwd missing?)"
+msgstr	"Kullanýcý bilgisi alýnamýyor(/etc/passwd kayýp?)"
+
+#: src/lang.c:212
+#, fuzzy
+msgid	"errors"
+msgstr	"hatalar"
+
+#: src/lang.c:213
+#, fuzzy, c-format
+msgid	"\n"
+	"Error on line %d: \"Sender:\" header not allowed (it will be added for you)\n"
+msgstr	"\n"
+	"%d satýrýnda hata \"Sender:\" baþlýk için izin verilmedi (sizin için "
+	"eklenecek)\n"
+
+#: src/lang.c:214
+#, fuzzy, c-format
+msgid	"Server has non of the groups listed in %s"
+msgstr	"Sunucuda %s'de listelenen gruplarýn hiçbiri yok"
+
+#: src/lang.c:215
+#, fuzzy
+msgid	"error"
+msgstr	"hata"
+
+#: src/lang.c:216
+#, fuzzy
+msgid	"Unknown display level"
+msgstr	"Bilinmeyen gösterim düzeyi"
+
+#: src/lang.c:217
+#, fuzzy
+msgid	"<ESC>"
+msgstr	"<ESC>"
+
+#: src/lang.c:218
+#, fuzzy
+msgid	"Exiting..."
+msgstr	"Çýkýyor..."
+
+#: src/lang.c:219
+#, fuzzy
+msgid	"leaving external mail-reader"
+msgstr	"Dýþ posta-okuyucuyu býrakýyor"
+
+#: src/lang.c:220
+#, fuzzy, c-format
+msgid	"Extracting %s..."
+msgstr	"Ayýklýyor %s..."
+
+#: src/lang.c:222
+#, fuzzy, c-format
+msgid	"Error writing %s file. Filesystem full? File reset to previous state."
+msgstr	"%s dosyasýný yazarken hata. Dosya sistemi dolu? Dosya önceki durumuna "
+	"dönüþtürüldü."
+
+#: src/lang.c:223
+#, fuzzy, c-format
+msgid	"Error making backup of %s file. Filesystem full?"
+msgstr	"%s dosyasýný yedeklemede hata. Dosya sistemi dolu?"
+
+#: src/lang.c:224
+#, fuzzy, c-format
+msgid	"Filtering global rules (%d/%d)..."
+msgstr	"Genel kurallar süzgeçleniyor (%d/%d)..."
+
+#: src/lang.c:225
+#, fuzzy
+msgid	"Rule created by: "
+msgstr	"Kural oluþturuldu: "
+
+#: src/lang.c:226
+#, fuzzy, c-format
+msgid	"Enter pattern [%s]> "
+msgstr	"Örüntüyü girin [%s]> "
+
+#: src/lang.c:227
+#, fuzzy, c-format
+msgid	"\n"
+	"You requested followups to your article to go to the following %s:\n"
+msgstr	"\n"
+	"Gitmek için makalenize takip-et istediniz %s:\n"
+
+#: src/lang.c:228
+#, fuzzy, c-format
+msgid	"  %s\t Answers will be directed to you by mail.\n"
+msgstr	"  %s\t Cevaplarý postayla yönlendirilecek.\n"
+
+#: src/lang.c:229
+msgid	"-- forwarded message --\n"
+msgstr	""
+
+#: src/lang.c:230
+msgid	"-- end of forwarded message --\n"
+msgstr	""
+
+#: src/lang.c:231
+#, fuzzy
+msgid	"# Format:\n"
+	"#   comment=STRING    Optional. Multiple lines allowed. Comments must be "
+	"placed\n"
+	"#                     at the beginning of a rule, or they will be moved to "
+	"the\n"
+	"#                     next rule. '#' is not a valid keyword for a comment!\n"
+	"#   group=STRING      Mandatory. Newsgroups list (e.g. comp.*,!*sources*).\n"
+	"#   case=NUM          Mandatory. Compare=0 / ignore=1 case when filtering.\n"
+	"#   score=NUM|STRING  Mandatory. Score to give. Either:\n"
+	"#     score=NUM         A number (e.g. 70). Or:\n"
+	"#     score=STRING      One of the two keywords: 'hot' or 'kill'.\n"
+	"#   subj=STRING       Optional. Subject: line (e.g. How to be a wizard).\n"
+	"#   from=STRING       Optional. From: line (e.g. *Craig Shergold*).\n"
+	"#   msgid=STRING      Optional. Message-ID: line (e.g. <123@ether.net>) with\n"
+	"#                     full references.\n"
+	"#   msgid_last=STRING Optional. Like above, but with last reference only.\n"
+	"#   msgid_only=STRING Optional. Like above, but without references.\n"
+	"#   refs_only=STRING  Optional. References: line (e.g. <123@ether.net>) "
+	"without\n"
+	"#                     Message-ID:\n"
+	"#   lines=[<>]?NUM    Optional. Lines: line. '<' or '>' are optional.\n"
+	"#   gnksa=[<>]?NUM    Optional. GNKSA parse_from() return code. '<' or '>' "
+	"opt.\n"
+	"#   xref=PATTERN      Optional. Kill pattern (e.g. alt.flame*)\n"
+	"#   time=NUM          Optional. time_t value when rule expires\n"
+	"#\n"
+msgstr	"# Format:\n"
+	"#   comment=STRING Seçmeli. Çoklu satýrlara izin verildi. Komutlar eklenmeli\n"
+	"#                    kural baþýna, ya da taþýnacak\n"
+	"#                    sonraki kurala.'#' komut için geçerli bir anahtar sözcük "
+	"deðildir!\n"
+	"#   group=STRING     Zorunlu. Haber grubu listesi (örn.comp.*,!*sources*).\n"
+	"#   case=NUM          Zorunlu. Karþýlaþtýr=0 / yoksay=1 durumu süzgeçlerken.\n"
+	"#   score=NUM|STRING  Zorunlu.Verilecek skor. Her ikisi:\n"
+	"#     score=NUM        Bir Sayý (örn. 70), Ya da:\n"
+	"#     score=STRING     Ýki anahtar sözcükten biri: 'hot' ya da 'kill'.\n"
+	"#   subj=STRING       Seçmeli. Konu: satýr (örn. Nasýl sihirbaz olunur)..\n"
+	"#   from=STRING       Seçmeli. Gönderen. satýr  (örn. *Craig Shergold*).\n"
+	"#   msgid=STRING      Seçmeli. Ýleti-kimliði : satýr (örn. <123@ether.net>) "
+	"ile\n"
+	"#                     tam referanslar.\n"
+	"#   msgid_last=STRING Seçmeli. Yukarýdaki gibi, ama sadece ilk referansla.\n"
+	"#   msgid_only=STRING Seçmeli. Yukarýdeki gibi, ama referans olmadan.\n"
+	"#                    Ýleti-kimliði:\n"
+	"#   lines=[<>]?NUM    Seçmeli. Satýrlar: satýr '<' or '>' seçmelidir.\n"
+	"#   gnksa=[<>]?NUM    Seçmeli. GNKSA dönüþ kodundan() ayrýþtýrýlýyor.'<' or "
+	"'>' opt.\n"
+	"#   xref=PATTERN     Seçmeli.Ölü örüntü (örn. alt.flame*)\n"
+	"#   time=NUM          Seçmeli.Kural bitince time_t deðeri\n"
+	"#\n"
+
+#: src/lang.c:252
+#, fuzzy, c-format
+msgid	"Enter score for rule (default=%d): "
+msgstr	"Kural için skoru yazýn (varsayýlan=%d): "
+
+#: src/lang.c:253
+#, fuzzy, c-format
+msgid	"Enter the score weight (range 0 < score <= %d)"
+msgstr	"Skor aðýrlýðýný yazýn (aralýk 0 < skor <= %d)"
+
+#. SCORE_MAX
+#: src/lang.c:254
+#, fuzzy
+msgid	"Full"
+msgstr	"Tam"
+
+#: src/lang.c:255
+#, fuzzy
+msgid	"Comment (optional)  : "
+msgstr	"Komut (seçmeli)   : "
+
+#: src/lang.c:256
+#, fuzzy
+msgid	"Apply pattern to    : "
+msgstr	"Örüntüyü uygula   : "
+
+#: src/lang.c:257
+#, fuzzy
+msgid	"From: line (ignore case)      "
+msgstr	"Gönderen: satýr (büyük/küçük harfleri yoksay) "
+
+#: src/lang.c:258
+#, fuzzy
+msgid	"From: line (case sensitive)   "
+msgstr	"Gönderen: satýr (büyük/küçük harfe duyarlý)   "
+
+#: src/lang.c:260
+#, fuzzy, c-format
+msgid	"%s%s: Unknown host.\n"
+msgstr	"%s%s: Bilinmeyen ana sunucu.\n"
+
+#: src/lang.c:261
+#, fuzzy
+msgid	"global "
+msgstr	"küresel "
+
+#: src/lang.c:262
+#, fuzzy, c-format
+msgid	"Please use %.100s instead"
+msgstr	"Lütfen % kullanýn.100s yerine"
+
+#: src/lang.c:263
+#, c-format
+msgid	"%s is bogus"
+msgstr	"%s sahte"
+
+#: src/lang.c:264
+#, fuzzy, c-format
+msgid	"Group %s is moderated. Continue?"
+msgstr	"Küme %s ayarlandý. Devam?"
+
+#: src/lang.c:265
+#, fuzzy
+msgid	"groups"
+msgstr	"kümeler"
+
+#: src/lang.c:266
+#, c-format
+msgid	"Rereading %s..."
+msgstr	"%s tekrar okunuyor..."
+
+#: src/lang.c:267
+#, fuzzy
+msgid	"Top Level Commands"
+msgstr	"Üst Düzey Komutlar"
+
+#: src/lang.c:268
+#, fuzzy
+msgid	"Group Selection"
+msgstr	"Küme Seçimi"
+
+#: src/lang.c:269
+#, fuzzy
+msgid	"group"
+msgstr	"küme"
+
+#: src/lang.c:271
+#, fuzzy
+msgid	"One or more lines of comment. <CR> to add a line or proceed if line is empty."
+msgstr	"Komutun bir veya birden çok satýrý. Satýr boþsa satýr eklemek veya devam "
+	"etmek için <CR>."
+
+#: src/lang.c:272
+#, fuzzy
+msgid	"From: line to add to filter file. <SPACE> toggles & <CR> sets."
+msgstr	"Gönderen: Süzgeç dosyaya eklenecek satýr.<SPACE> deðiþtirir & <CR> ayarlar."
+
+#: src/lang.c:273
+#, fuzzy
+msgid	"Linecount of articles to be filtered. < for less, > for more, = for equal."
+msgstr	"Süzgeçlenecek makalelerin satýr sayýsý. < az , > çok , =eþit."
+
+#: src/lang.c:274
+#, fuzzy
+msgid	"Message-ID: line to add to filter file. <SPACE> toggles & <CR> sets."
+msgstr	"Ýleti-kimliði: Dosya süzgeçlemek için eklenecek satýr. <SPACE> deðiþtirir & "
+	"<CR> ayarlar."
+
+#: src/lang.c:275
+#, fuzzy
+msgid	"Subject: line to add to filter file. <SPACE> toggles & <CR> sets."
+msgstr	"Konu: Dosya süzgeçlemek için eklenecek satýr. <SPACE> deðiþtirir & <CR> "
+	"ayarlar."
+
+#: src/lang.c:276
+#, fuzzy
+msgid	"Enter text pattern to filter if Subject: & From: lines are not what you want."
+msgstr	"Süzgeçlemek için metin örüntüsünü girin eðer Konu: & Gönderen: istediðiniz "
+	"satýrlar deðilse."
+
+#: src/lang.c:277
+#, fuzzy
+msgid	"Select where text pattern should be applied. <SPACE> toggles & <CR> sets."
+msgstr	"Metin örüntüsünün nereye uygulanacaðýný seçin. <SPACE> deðiþtirir & <CR> "
+	"ayarlar."
+
+#: src/lang.c:278
+#, fuzzy
+msgid	"Expiration time in days for the entered filter. <SPACE> toggles & <CR> sets."
+msgstr	"Yazýlan süzgeç için gün olarak kullaným süresi bitimi.<SPACE> deðiþtirir & "
+	"<CR> ayarlar."
+
+#: src/lang.c:279
+#, fuzzy
+msgid	"Apply kill only to current group or all groups. <SPACE> toggles & <CR> sets."
+msgstr	"Sadece mevcut küme veya bütün kümeler için kill uygulayýn. <SPACE> deðiþtirir "
+	"& <CR>ayarlar."
+
+#: src/lang.c:280
+#, fuzzy
+msgid	"Apply select to current group or all groups. <SPACE> toggles & <CR> sets."
+msgstr	"Mevcut küme veya bütün kümeler için seç uygulayýn <SPACE> deðiþtirir & "
+	"<CR>ayarlar."
+
+#: src/lang.c:281
+#, fuzzy
+msgid	"kill an article via a menu"
+msgstr	"makaleyi menü aracýlýðýyla öldür"
+
+#: src/lang.c:282
+#, fuzzy
+msgid	"auto-select (hot) an article via a menu"
+msgstr	"makaleyi menü aracýlýyla otomatik-seç (hot)"
+
+#: src/lang.c:283
+#, fuzzy
+msgid	"Browse URLs in article"
+msgstr	"Makaledeki URL'lara gözat"
+
+#: src/lang.c:284
+#, fuzzy
+msgid	"0 - 9\t  display article by number in current thread"
+msgstr	"0 - 9\t  makaleyi mevcut parçacýktaki sayýyla görüntüle"
+
+#: src/lang.c:285
+msgid	"cancel (delete) or supersede (overwrite) current article"
+msgstr	""
+
+#: src/lang.c:286
+#, fuzzy
+msgid	"edit article (mail-groups only)"
+msgstr	"makaleyi düzenle (sadece posta-gruplarý)"
+
+#: src/lang.c:287
+#, fuzzy
+msgid	"display first article in current thread"
+msgstr	"mevcut parçacýktaki makaleyi ilk görüntüle"
+
+#: src/lang.c:288
+#, fuzzy
+msgid	"display first page of article"
+msgstr	"makalenin ilk sayfasýný görüntüle"
+
+#: src/lang.c:289
+#, fuzzy
+msgid	"post followup to current article"
+msgstr	"mevcut makale için takip-et gönder"
+
+#: src/lang.c:290
+#, fuzzy
+msgid	"post followup (don't copy text) to current article"
+msgstr	"mevcut makale için takip-et gönder (metni kopyalama)"
+
+#: src/lang.c:291
+#, fuzzy
+msgid	"post followup to current article quoting complete headers"
+msgstr	"tam baþlýklarý imleyen mevcut makale için takip-et gönder"
+
+#: src/lang.c:292
+#, fuzzy
+msgid	"display last article in current thread"
+msgstr	"mevcut parçacýktaki son makaleyi görüntüle"
+
+#: src/lang.c:293
+#, fuzzy
+msgid	"display last page of article"
+msgstr	"makalenin son sayfasný görüntüle"
+
+#: src/lang.c:294
+#, fuzzy
+msgid	"mark rest of thread as read and advance to next unread"
+msgstr	"parçacýðýn kalanýný okunmuþ olarak iþaretle ve sonraki okunmamýþa geç"
+
+#: src/lang.c:295
+#, fuzzy
+msgid	"display next article"
+msgstr	"sonraki makaleyi görüntüle"
+
+#: src/lang.c:296
+#, fuzzy
+msgid	"display first article in next thread"
+msgstr	"sonraki baþlýktaki ilk makaleyi görüntüle"
+
+#: src/lang.c:297
+#, fuzzy
+msgid	"display next unread article"
+msgstr	"sonraki okunmamýþ makaleyi görüntüle"
+
+#: src/lang.c:298
+#, fuzzy
+msgid	"go to the article that this one followed up"
+msgstr	"bunu takip eden makaleye git"
+
+#: src/lang.c:299
+#, fuzzy
+msgid	"display previous article"
+msgstr	"önceki makaleyi görüntüle"
+
+#: src/lang.c:300
+#, fuzzy
+msgid	"display previous unread article"
+msgstr	"önceki okunmamýþ makaleyi görüntüle"
+
+#: src/lang.c:301
+#, fuzzy
+msgid	"quickly kill an article using defaults"
+msgstr	"varsayýlanlarý kullanarak makaleyi hemen öldür"
+
+#: src/lang.c:302
+#, fuzzy
+msgid	"quickly auto-select (hot) an article using defaults"
+msgstr	"varsayýlanlarý kullanarak makaleyi hemen otomatik-seç(hot)"
+
+#: src/lang.c:303
+#, fuzzy
+msgid	"return to group selection level"
+msgstr	"küme seçme düzeyine dön"
+
+#: src/lang.c:304
+#, fuzzy
+msgid	"reply through mail to author"
+msgstr	"yazara posta aracýlýðyla yanýt ver"
+
+#: src/lang.c:305
+#, fuzzy
+msgid	"reply through mail (don't copy text) to author"
+msgstr	"yazara posta aracýlýyla yanýt ver (metni kopyalama)"
+
+#: src/lang.c:306
+#, fuzzy
+msgid	"reply through mail to author quoting complete headers"
+msgstr	"tam baþlýklarý imleyerek yazara posta aracýlýðýyla yanýt ver"
+
+#: src/lang.c:307
+#, fuzzy
+msgid	"repost chosen article to another group"
+msgstr	"seçilen makaleyi baþka bir kümeye yeniden gönder"
+
+#: src/lang.c:308
+#, fuzzy
+msgid	"search backwards within this article"
+msgstr	"bu makalede geriye doðru ara"
+
+#: src/lang.c:309
+#, fuzzy
+msgid	"search forwards within this article"
+msgstr	"bu makalede ileriye doðru ara"
+
+#: src/lang.c:310
+#, fuzzy
+msgid	"show article in raw-mode (including all headers)"
+msgstr	"makaleyi ham-kipte göster (bütün baþlýklar dahil)"
+
+#: src/lang.c:311
+#, fuzzy
+msgid	"skip next block of included text"
+msgstr	"ekli dosyanýn sonraki öbeðine atla"
+
+#: src/lang.c:312
+#, fuzzy
+msgid	"toggle display of sections hidden by a form-feed (^L) on/off"
+msgstr	"(^L)açýk/kapalý form-besleme tarafýndan gizlenen bölümlerin gösterimini "
+	"deðiþtir"
+
+#: src/lang.c:313
+#, fuzzy
+msgid	"toggle word highlighting on/off"
+msgstr	"açýk/kapalý vurgulayan sözcüðü deðiþtir"
+
+#: src/lang.c:314
+#, fuzzy
+msgid	"toggle ROT-13 (basic decode) for current article"
+msgstr	"mevcut makale için ROT-13 (temel kod çözücü) deðiþtir"
+
+#: src/lang.c:315
+#, fuzzy
+msgid	"toggle tabwidth 4 <-> 8"
+msgstr	"sekme aralýðýný deðiþtir 4 <-> 8"
+
+#: src/lang.c:316
+#, fuzzy
+msgid	"toggle german TeX style decoding for current article"
+msgstr	"german TeX kod biçemi mevcut makale için deðiþtir"
+
+#: src/lang.c:317
+#, fuzzy
+msgid	"toggle display of uuencoded sections"
+msgstr	"metinsele kodlanmýþ bölümlerin gösterimini deðiþtir"
+
+#: src/lang.c:318
+#, fuzzy
+msgid	"View/save multimedia attachments"
+msgstr	"çoklu-ortam eklerini Görüntüle/kaydet"
+
+#: src/lang.c:319
+#, fuzzy, c-format
+msgid	"report bug or comment via mail to %s"
+msgstr	"hata veya komutu posta aracýlýðýyla bildirin %s"
+
+#: src/lang.c:320
+#, fuzzy
+msgid	"choose range of articles to be affected by next command"
+msgstr	"sonraki komuttan etkilenen makalelerin aralýðýný seç"
+
+#: src/lang.c:321
+#, fuzzy
+msgid	"escape from command prompt"
+msgstr	"komut isteminden çýk"
+
+#: src/lang.c:322
+#, fuzzy
+msgid	"edit filter file"
+msgstr	"Süz dosyasý okunuyor"
+
+#: src/lang.c:323
+#, fuzzy
+msgid	"get help"
+msgstr	"yardým al"
+
+#: src/lang.c:324
+#, fuzzy
+msgid	"display last article viewed"
+msgstr	"görüntülenen son makaleyi göster"
+
+#: src/lang.c:325
+#, fuzzy
+msgid	"down one line"
+msgstr	"bir satýr aþaðý"
+
+#: src/lang.c:326
+#, fuzzy
+msgid	"up one line"
+msgstr	"bir satýr aþaðý"
+
+#: src/lang.c:327
+#, fuzzy
+msgid	"go to article chosen by Message-ID"
+msgstr	"Ýleti-kimliði tarafýndn seçilen makaleye git"
+
+#: src/lang.c:328
+#, fuzzy
+msgid	"mail article/thread/hot/pattern/tagged articles to someone"
+msgstr	"makale/parçacýk/hot/örüntü/etiketlenmiþ makaleleri postala"
+
+#: src/lang.c:329
+#, fuzzy
+msgid	"menu of configurable options"
+msgstr	"yapýlandýrabilir seçenekler menüsü"
+
+#: src/lang.c:330
+#, fuzzy
+msgid	"down one page"
+msgstr	"bir sayfa alta"
+
+#: src/lang.c:331
+#, fuzzy
+msgid	"up one page"
+msgstr	"bir sayfa yukarýya"
+
+#: src/lang.c:332
+#, fuzzy
+msgid	"post (write) article to current group"
+msgstr	"makaleyi mevcut kümeye gönder(yaz)"
+
+#: src/lang.c:333
+#, fuzzy
+msgid	"post postponed articles"
+msgstr	"ertelenmiþ makaleleri postala"
+
+#: src/lang.c:334
+#, fuzzy
+msgid	"list articles posted by you (from posted file)"
+msgstr	"(postalanmýþ dosyadan) tarafýnýzdan postalanan makaleleri listele"
+
+#: src/lang.c:335
+#, fuzzy
+msgid	"return to previous menu"
+msgstr	"önceki menüye dön"
+
+#: src/lang.c:336
+#, fuzzy
+msgid	"quit tin immediately"
+msgstr	"tin'den hemen çýk"
+
+#: src/lang.c:337
+#, fuzzy
+msgid	"redraw page"
+msgstr	"sayfayý yeniden çiz"
+
+#: src/lang.c:338
+#, fuzzy
+msgid	"save article/thread/hot/pattern/tagged articles to file"
+msgstr	"makale/parçacýk/hot/örüntü/etiketlenmiþ makaleleri dosyaya kaydet"
+
+#: src/lang.c:339
+#, fuzzy
+msgid	"save marked articles automatically without user prompts"
+msgstr	"iþaretlenmiþ makaleleri kullanýcý istemi olmadan otomatik kaydet"
+
+#: src/lang.c:340
+msgid	"scroll the screen one line down"
+msgstr	""
+
+#: src/lang.c:341
+msgid	"scroll the screen one line up"
+msgstr	""
+
+#: src/lang.c:342
+#, fuzzy
+msgid	"search for articles by author backwards"
+msgstr	"makaleleri yazara göre geriye doðru ara"
+
+#: src/lang.c:343
+#, fuzzy
+msgid	"search for articles by author forwards"
+msgstr	"makaleleri yazara göre ileriye doðru ara"
+
+#: src/lang.c:344
+#, fuzzy
+msgid	"search all articles for a given string (this may take some time)"
+msgstr	"bütün makaleleri verilen dizgi için ara (bu uzun sürebilir)"
+
+#: src/lang.c:345
+#, fuzzy
+msgid	" \t  (searches are case-insensitive and wrap around to all articles)"
+msgstr	" \t  (arayýcýlar büyük/küçük harfe duyarlýdýr ve bütün makaleleri çevreler)"
+
+#: src/lang.c:346
+#, fuzzy
+msgid	"search for articles by Subject line backwards"
+msgstr	"makaleleri Konu satýrýna göre geriye doðru ara"
+
+#: src/lang.c:347
+#, fuzzy
+msgid	"search for articles by Subject line forwards"
+msgstr	"makaleleri Konuya göre ileriye doðru ara"
+
+#: src/lang.c:348
+#, fuzzy
+msgid	"repeat last search"
+msgstr	"son aramayý tekrarla"
+
+#: src/lang.c:349
+#, fuzzy
+msgid	"tag current article for reposting/mailing/piping/printing/saving"
+msgstr	"mevcut makaleyi yeniden gönderme/postalama/kanal/yazdýrma/kaydetme için "
+	"etiketle"
+
+#: src/lang.c:350
+#, fuzzy
+msgid	"toggle info message in last line (subject/description)"
+msgstr	"son satýrdaki bilgi iletisini deðiþtir (konu/taným)"
+
+#: src/lang.c:351
+#, fuzzy
+msgid	"toggle inverse video"
+msgstr	"ters video'yu deðiþtir"
+
+#: src/lang.c:352
+#, fuzzy
+msgid	"toggle mini help menu display"
+msgstr	"mini yardým menüsü görünümünü deðiþtir"
+
+#: src/lang.c:353
+#, fuzzy
+msgid	"cycle the display of authors email address, real name, both or neither"
+msgstr	"yazarlarýn e-posta adreslerinin, gerçek isimlerinin, ikisinin veya hiçbirinin "
+	"görünümünü çevir"
+
+#: src/lang.c:354
+#, fuzzy
+msgid	"show version information"
+msgstr	"sürüm bilgisini göster"
+
+#: src/lang.c:355
+#, fuzzy
+msgid	"mark all articles as read and return to group selection menu"
+msgstr	"bürtümn makaleleri okunmuþ olarak iþaretle ve küme seçme menüsüne geri dön"
+
+#: src/lang.c:356
+#, fuzzy
+msgid	"mark all articles as read and enter next group with unread articles"
+msgstr	"bütün makaleleri okunmuþ olarak iþaretle ve okunmamýþ makalelerin bulunduðu "
+	"sonraki kümeye gir"
+
+#: src/lang.c:357
+#, fuzzy
+msgid	"choose first thread in list"
+msgstr	"listedeki ilk parçacýðý seç"
+
+#: src/lang.c:358
+#, fuzzy
+msgid	"choose last thread in list"
+msgstr	"listedeki son parçacýðý seç"
+
+#: src/lang.c:359
+#, fuzzy
+msgid	"list articles within current thread (bring up Thread sub-menu)"
+msgstr	"mevcut parçacýk kapsamýndaki makaleleri seç ( Parçacýk alt-menüsünü aç)"
+
+#: src/lang.c:360
+#, fuzzy
+msgid	"mark article as unread"
+msgstr	"makaleyi okunmamýþ olarak iþaretle"
+
+#: src/lang.c:361
+#, fuzzy
+msgid	"mark current thread or tagged threads as read"
+msgstr	"mevcut parçacýðý veya etiketlenmiþ parçacýklarý okunmuþ olarak iþaretle "
+
+#: src/lang.c:362
+#, fuzzy
+msgid	"mark thread as unread"
+msgstr	"parçacýðý okunmamýþ olarak iþaretle"
+
+#: src/lang.c:363
+#, fuzzy
+msgid	"toggle display of all/selected articles"
+msgstr	"Bütün/seçilen makalelerin görünümünü deðiþtir"
+
+#: src/lang.c:364
+#, fuzzy
+msgid	"display next group"
+msgstr	"sonraki kümeyi görüntüle"
+
+#: src/lang.c:365
+#, fuzzy
+msgid	"display previous group"
+msgstr	"önceki kümeyi görüntüle"
+
+#: src/lang.c:366
+#, fuzzy
+msgid	"toggle all selections (all articles)"
+msgstr	"bütün seçimleri (bütün makaleleri) deðiþtir"
+
+#: src/lang.c:367
+#, fuzzy
+msgid	"select group (make \"hot\")"
+msgstr	"küme seç (yap \"hot\")"
+
+#: src/lang.c:368
+#, fuzzy
+msgid	"select thread"
+msgstr	"parçacýk seç"
+
+#: src/lang.c:369
+#, fuzzy
+msgid	"select threads if at least one unread article is selected"
+msgstr	"en az bir okunmamýþ makale seçilmiþse parçacýk seç)"
+
+#: src/lang.c:370
+#, fuzzy
+msgid	"select threads that match user specified pattern"
+msgstr	"kullanýcý tanýmlý kalýba uyan baþlýklarý seç"
+
+#: src/lang.c:371
+#, fuzzy
+msgid	"tag all parts of current multipart-message in order"
+msgstr	"mevcut çok-bölümlü iletinin bütün bölümlerini sýrayla etiketle"
+
+#: src/lang.c:372
+#, fuzzy
+msgid	"0 - 9\t  choose thread by number"
+msgstr	"0 - 9\t  sayýya göre parçacýk seç"
+
+#: src/lang.c:373
+#, fuzzy
+msgid	"toggle limit number of articles to get, and reload"
+msgstr	"alýnacak ve yeniden yüklenecek makalelerin sýnýr sayýsýný deðiþtir."
+
+#: src/lang.c:374
+#, fuzzy
+msgid	"toggle display of all/unread articles"
+msgstr	"bütün/okunmamýþ makalelerin görünümünü deðiþtir"
+
+#: src/lang.c:375
+#, fuzzy
+msgid	"toggle selection of thread"
+msgstr	"parçacýk seçimini deðiþtir"
+
+#: src/lang.c:376
+#, fuzzy
+msgid	"cycle through threading options available"
+msgstr	"kullanýlabilir parçacýk seçenekleriyle çevir"
+
+#: src/lang.c:377
+#, fuzzy
+msgid	"undo all selections (all articles)"
+msgstr	"bütün seçimleri (bütün makaleleri) geri al"
+
+#: src/lang.c:378
+#, fuzzy
+msgid	"untag all tagged threads"
+msgstr	"etiketlenmiþ bütün parçacýklarýn etiketini kaldýr"
+
+#: src/lang.c:379
+#, fuzzy
+msgid	"mark all articles in group as read"
+msgstr	"kümedeki bütün makaleleri okunmuþ olarak iþaretle"
+
+#: src/lang.c:380
+#, fuzzy
+msgid	"mark all articles in group as read and move to next unread group"
+msgstr	"kümedeki bütün makaleleri okumuþ olarak iþaretle ve sonraki okunmamýþ kümeye "
+	"geç"
+
+#: src/lang.c:381
+#, fuzzy
+msgid	"choose first group in list"
+msgstr	"listedeki ilk kümeyi seç"
+
+#: src/lang.c:382
+#, fuzzy
+msgid	"choose group by name"
+msgstr	"Ýsme göre küme seç"
+
+#: src/lang.c:383
+#, fuzzy
+msgid	"0 - 9\t  choose group by number"
+msgstr	"0 - 9\t  sayýya göre küme seç"
+
+#: src/lang.c:384
+#, fuzzy
+msgid	"choose range of groups to be affected by next command"
+msgstr	"sonraki komuttan etkilenecek olan kümelerin aralýðýný seç"
+
+#: src/lang.c:385
+#, fuzzy
+msgid	"choose last group in list"
+msgstr	"listedeki son kümeyi seç"
+
+#: src/lang.c:386
+#, fuzzy
+msgid	"mark all articles in chosen group unread"
+msgstr	"seçilen kümedeki bütün makaleleri okunmamýþ olarak iþaretle"
+
+#: src/lang.c:387
+#, fuzzy
+msgid	"move chosen group within list"
+msgstr	"Listede seçilen kümeye git"
+
+#: src/lang.c:388
+#, fuzzy
+msgid	"choose next group with unread news"
+msgstr	"okunmamýþ haberlerde sonraki kümeyi seç"
+
+#: src/lang.c:389 src/lang.c:1197
+#, fuzzy
+msgid	"quit"
+msgstr	"çýk"
+
+#: src/lang.c:390
+#, fuzzy
+msgid	"quit without saving configuration changes"
+msgstr	"yapýlandýrabilir deðiþiklikleri kaydetmeden çýk"
+
+#: src/lang.c:391
+#, fuzzy
+msgid	"read chosen group"
+msgstr	"seçilen kümeyi oku"
+
+#: src/lang.c:392
+#, fuzzy
+msgid	"reset .newsrc (all available articles in groups marked unread)"
+msgstr	"reset .newsrc (kümelerdeki bütün kullanýlabilir makaleler okunmamýþ olarak "
+	"iþaretlendi)"
+
+#: src/lang.c:393
+#, fuzzy
+msgid	"search backwards for a group name"
+msgstr	"geriye doðru küme ismi ara"
+
+#: src/lang.c:394
+#, fuzzy
+msgid	" \t  (all searches are case-insensitive and wrap around)"
+msgstr	" \t  (bütün arayýcýlar büyük/küçük harfe duyarlýdýr ve çevreler)"
+
+#: src/lang.c:395
+#, fuzzy
+msgid	"search forwards for a group name"
+msgstr	"ileriye doðru küme ismi ara"
+
+#: src/lang.c:396
+#, fuzzy
+msgid	"subscribe to chosen group"
+msgstr	"seçilen kümeye abone ol"
+
+#: src/lang.c:397
+#, fuzzy
+msgid	"subscribe to groups that match pattern"
+msgstr	"örüntüye uyan kümelere abone ol"
+
+#: src/lang.c:398
+#, fuzzy
+msgid	"reread active file to check for any new news"
+msgstr	"aktif dosyayý yeni haberleri onaylamak için yeniden oku"
+
+#: src/lang.c:399
+#, fuzzy
+msgid	"toggle display of group name only or group name plus description"
+msgstr	"sadece küme ismini veya küme ismi ve taným görünümünü deðiþtir"
+
+#: src/lang.c:400
+#, fuzzy
+msgid	"toggle display to show all/unread subscribed groups"
+msgstr	"bütün7okunmamýþ abone olmayan kümeleri göstermek için görünümü deðiþtir"
+
+#: src/lang.c:401
+#, fuzzy
+msgid	"unsubscribe from chosen group"
+msgstr	"seçilen küme için abonelikten çýk"
+
+#: src/lang.c:402
+#, fuzzy
+msgid	"unsubscribe from groups that match pattern"
+msgstr	"örüntüye uyan bütün kümeler için abonelikten çýk"
+
+#: src/lang.c:403
+#, fuzzy
+msgid	"sort the list of groups"
+msgstr	"küme listelerini sýrala"
+
+#: src/lang.c:404
+#, fuzzy
+msgid	"toggle display to show all/subscribed groups"
+msgstr	"bütün/abone olmayan kümeleri göstermek için görünümü deðiþtir"
+
+#: src/lang.c:405
+#, fuzzy
+msgid	"0 - 9\t  choose article by number"
+msgstr	"0 - 9\t  sayýya göre makale seç"
+
+#: src/lang.c:406
+#, fuzzy
+msgid	"mark thread as read and return to group index page"
+msgstr	"parçacýðý okunmuþ olarak iþaretle ve küme dizin sayfasýna geri dön"
+
+#: src/lang.c:407
+#, fuzzy
+msgid	"mark thread as read and enter next unread thread or group"
+msgstr	"parçacýðý okunmuþ olarak iþaretle ve sonraki okunmamýþ parçacýða veya kümeye "
+	"gir"
+
+#: src/lang.c:408
+#, fuzzy
+msgid	"choose first article in list"
+msgstr	"listedeki ilk makaleyi seç"
+
+#: src/lang.c:409
+#, fuzzy
+msgid	"choose last article in list"
+msgstr	"listedeki son makaleyi seç"
+
+#: src/lang.c:410
+#, fuzzy
+msgid	"mark article or tagged articles as read and move cursor to next unread article"
+msgstr	"makaleyi veya etiketlenen makaleleri okunmuþ olarak iþaretle ve imleçi "
+	"sonraki okunmamýþ makaleye taþý"
+
+#: src/lang.c:411
+#, fuzzy
+msgid	"read chosen article"
+msgstr	"seçilen makaleyi oku"
+
+#: src/lang.c:412
+#, fuzzy
+msgid	"Display properties\n"
+	"------------------"
+msgstr	"Özellikleri görüntüle\n"
+	"---------------------"
+
+#: src/lang.c:413
+#, fuzzy
+msgid	"Miscellaneous\n"
+	"-------------"
+msgstr	"Diðer\n"
+	"-----"
+
+#: src/lang.c:414
+#, fuzzy
+msgid	"Moving around\n"
+	"-------------"
+msgstr	"Etrafýna taþý\n"
+	"-------------"
+
+#: src/lang.c:415
+#, fuzzy
+msgid	"Group/thread/article operations\n"
+	"-------------------------------"
+msgstr	"Küme/parçacýk/makale iþlemleri\n"
+	"-------------------------------"
+
+#: src/lang.c:417
+#, fuzzy
+msgid	"Group Level Commands"
+msgstr	"Küme Düzey Komutlarý"
+
+#: src/lang.c:418
+#, fuzzy
+msgid	"Kill filter added"
+msgstr	"Eklendikten sonra öldür"
+
+#: src/lang.c:419
+#, fuzzy
+msgid	"Auto-selection filter added"
+msgstr	"Eklendikten sonra otomatik-seç"
+
+#: src/lang.c:420
+#, fuzzy
+msgid	"All parts tagged"
+msgstr	"Bütün bölümler etiketlendi"
+
+#: src/lang.c:421
+#, fuzzy
+msgid	"Storing article for later posting"
+msgstr	"Makale daha sonra postlama için yükleniyor"
+
+#: src/lang.c:422
+#, fuzzy
+msgid	"Please enter a valid character"
+msgstr	"Lütfen geçerli bir karakter yazýn"
+
+#: src/lang.c:423
+#, fuzzy, c-format
+msgid	"Missing part #%d"
+msgstr	"Eksik bölüm #%d"
+
+#: src/lang.c:424
+#, fuzzy
+msgid	"*** No postponed articles ***"
+msgstr	"*** Ertelenmiþ makale yok ***"
+
+#: src/lang.c:425
+#, fuzzy
+msgid	"Not a multi-part message"
+msgstr	"Çok-bölümlü ileti deðil"
+
+#: src/lang.c:426
+#, fuzzy
+msgid	"You are not subscribed to this group"
+msgstr	"Bu kümeye abone deðilsiniz"
+
+#: src/lang.c:427
+#, fuzzy
+msgid	"No previous expression"
+msgstr	"Önceki ifade yok"
+
+#: src/lang.c:428
+#, fuzzy
+msgid	"Operation disabled in no-overwrite mode"
+msgstr	"Üstüne yazýlmayan kipte iþlem geçersiz"
+
+#. TODO: replace hardcoded key-name in txt_info_postponed
+#: src/lang.c:430
+#, fuzzy, c-format
+msgid	"%d postponed %s, reuse with ^O...\n"
+msgstr	"%d ertelendi %s, tekrar kullan ^O...\n"
+
+#: src/lang.c:431
+#, fuzzy
+msgid	"X-Conversion-Note: multipart/alternative contents have been removed.\n"
+	"  To get the whole article, turn alternative handling OFF in the Option Menu\n"
+msgstr	"X-Çevirim Notu: çok-bölümlü/alternatif içerikler kaldýrýldý.\n"
+	"  Bütün makaleyi almak için, Seçenekler Menüsündeki alternatif kotarmayý\n"
+	"  OFF durumuna getirin\n"
+
+#: src/lang.c:433
+#, fuzzy, c-format
+msgid	"Save filename for %s/%s is a mailbox. Attachment not saved"
+msgstr	"Dosya adýný %s/%s için kaydet bir posta kutusudur. Ek kaydedilmedi"
+
+#: src/lang.c:434
+#, fuzzy
+msgid	"TeX2Iso encoded article"
+msgstr	"TeX2Iso makaleyi kodladý"
+
+#: src/lang.c:435
+#, fuzzy
+msgid	"incomplete "
+msgstr	"tamamlanmadý "
+
+#. TODO: replace hardcoded key-names
+#: src/lang.c:437
+#, fuzzy, c-format
+msgid	"\n"
+	"Welcome to %s, a full screen threaded Netnews reader. It can read news "
+	"locally\n"
+	"(ie. <spool>/news) or remotely (-r option)  from a NNTP (Network News "
+	"Transport\n"
+	"Protocol) server. -h lists the available command line options.\n"
+	"\n"
+	"%s  has four newsreading levels, the newsgroup selection page, the group "
+	"index\n"
+	"page, the thread listing page and the article viewer. Help is available at "
+	"each\n"
+	"level by pressing the 'h' command.\n"
+	"\n"
+	"Move up/down by using the terminal arrow keys or 'j' and 'k'.  Use PgUp/PgDn "
+	"or\n"
+	"Ctrl-U and Ctrl-D to page up/down. Enter a newsgroup by pressing RETURN/TAB.\n"
+	"\n"
+	"Articles, threads, tagged articles or articles matching a pattern can be "
+	"mailed\n"
+	"('m' command), printed ('o' command), saved ('s' command), piped ('|' "
+	"command).\n"
+	"Use  the 'w' command  to post a  news article,  the 'f'/'F' commands  to post "
+	"a\n"
+	"follow-up to  an existing  news article  and the 'r'/'R' commands  to reply "
+	"via\n"
+	"mail to an  existing news article author.  The 'M' command allows the "
+	"operation\n"
+	"of %s to be configured via a menu.\n"
+	"\n"
+	"For more information read the manual page, README, INSTALL, TODO and FTP "
+	"files.\n"
+	"Please send bug-reports/comments to %s with the 'R' command.\n"
+msgstr	"\n"
+	"Hoþgeldiniz %s, tam ekran Netnews okuyucu kullandý. Haberleri yerel olarak\n"
+	"(örn. <spool>/news) veya uzaktan (-r seçeneði) NNTP ((Network News Transport\n"
+	"Protocol) sunucusundan okuyabilir. -h kullanýlabilir komut satýrý "
+	"seçeneklerini listeler.\n"
+	"\n"
+	"%s dört haber okuma düzeyine sahiptir, haber grubu seçme sayfasý, grup dizin\n"
+	"sayfasý, kullaným listeleyen sayfa ve makale görüntüleyici. Yardým her\n"
+	"düzeyde 'h' komutuna basýlarak kullanýlabilir.\n"
+	"\n"
+	" 'j' ve 'k' uçbirim yön tuþlarýný kullanarak aþaðý/yukarý taþýyýn. Sayfayý "
+	"aþaðý/yukarý taþýmak için PgUp/PgDn ya da\n"
+	"Ctrl-U ve Ctrl-D kullanýn. Haber grubuna RETURN/TAB'a basarak girin.\n"
+	"\n"
+	"Makaleler, parçacýklar, etiketlenmiþ makaleler veya bir örüntüye uyan "
+	"makaleler postalanabilir\n"
+	"('m' komutu), yazdýr ('o' komutu), kaydet ('s' komutu), kanal ('I' komutu).\n"
+	"Bir haber makalesini postalamak için 'w' komutunu, var olan bir haber "
+	"makalesini takip-et için 'f'/'F' komutunu\n"
+	" ve var olan bir haber makalesi yazarýna posta yoluyla yanýt için 'r'/'R'\n"
+	" komutunu kullanýn. 'M' komutu menü aracýlýðýyla yapýlandýrýlacak %s için\n"
+	" iþleme izin verir.\n"
+	"\n"
+	"Daha fazla bilgi çin el ile sayfasýný, README, INSTALL, TODO ve FTP "
+	"dosyalarýný okuyun.\n"
+	"Hata-raporlarýný ve önerileri 'R' komutu ile %s'e gönderin.\n"
+
+#: src/lang.c:453
+#, fuzzy, c-format
+msgid	"Invalid  From: %s  line. Read the INSTALL file again."
+msgstr	"Geçersiz Gönderen: %s satýrý. INSTALL dosyasýný yeniden okuyun."
+
+#: src/lang.c:455
+msgid	"Invalid multibyte sequence found\n"
+msgstr	""
+
+#: src/lang.c:457
+#, fuzzy, c-format
+msgid	"Invalid  Sender:-header %s"
+msgstr	"Geçersiz Gönderen: -baþlýk %s"
+
+#: src/lang.c:458
+#, fuzzy
+msgid	"Inverse video disabled"
+msgstr	"Ters video geçersiz"
+
+#: src/lang.c:459
+#, fuzzy
+msgid	"Inverse video enabled"
+msgstr	"Ters video geçerli"
+
+#: src/lang.c:461
+#, fuzzy, c-format
+msgid	"Missing definition for %s\n"
+msgstr	"Taným eksik %s\n"
+
+#: src/lang.c:462
+#, fuzzy, c-format
+msgid	"Invalid key definition '%s'\n"
+msgstr	"Geçersiz tuþ tanýmý '%s'\n"
+
+#: src/lang.c:463
+#, fuzzy, c-format
+msgid	"Invalid keyname '%s'\n"
+msgstr	"Geçersiz anahtar sözcük '%s'\n"
+
+#: src/lang.c:464
+#, c-format
+msgid	"Keymap file was upgraded to version %s\n"
+msgstr	""
+
+#: src/lang.c:465
+#, fuzzy, c-format
+msgid	"Kill From:     [%s] (y/n): "
+msgstr	"Göndereni yok et:     [%s] (y/n): "
+
+#: src/lang.c:466
+#, fuzzy
+msgid	"Kill Lines: (</>num): "
+msgstr	"Satýrlarý yok et:(</>num): "
+
+#: src/lang.c:467
+#, fuzzy
+msgid	"Kill Article Menu"
+msgstr	"Makale menüsünü yok et"
+
+#: src/lang.c:468
+#, fuzzy, c-format
+msgid	"Kill Msg-Id:   [%s] (f/l/o/n): "
+msgstr	"Ýleti-Kimliðini yko et:   [%s] (f/l/o/n): "
+
+#: src/lang.c:469
+#, fuzzy
+msgid	"Kill pattern scope  : "
+msgstr	"Örüntü kapsamýný yok et: "
+
+#: src/lang.c:470
+#, fuzzy, c-format
+msgid	"Kill Subject:  [%s] (y/n): "
+msgstr	"Konuyu yok et: [%s] (y/n): "
+
+#: src/lang.c:471
+#, fuzzy
+msgid	"Kill text pattern   : "
+msgstr	"Metin örüntüsünü yok et : "
+
+#: src/lang.c:472
+#, fuzzy
+msgid	"Kill time in days   : "
+msgstr	"Zamaný gün olarak yok et: "
+
+#: src/lang.c:474
+#, fuzzy
+msgid	"Last"
+msgstr	"Son"
+
+#: src/lang.c:475
+#, fuzzy
+msgid	"-- Last response --"
+msgstr	"-- Son yanýt --"
+
+#: src/lang.c:476
+#, fuzzy, c-format
+msgid	"Lines %s  "
+msgstr	"Satýrlar %s "
+
+#: src/lang.c:478
+#, fuzzy
+msgid	"Message-ID: line              "
+msgstr	"Ýleti-Kimliði: satýr             "
+
+#: src/lang.c:479
+#, fuzzy
+msgid	"Mail"
+msgstr	"Postalandý"
+
+#: src/lang.c:480
+#, fuzzy
+msgid	"mailbox "
+msgstr	"posta kutusu "
+
+#: src/lang.c:481
+#, fuzzy, c-format
+msgid	"Mail article(s) to [%.*s]> "
+msgstr	"Makaleleri postala [%.*s]> "
+
+#: src/lang.c:482
+#, fuzzy, c-format
+msgid	"Mailing log to %s\n"
+msgstr	"Günlüðü postalýyor %s\n"
+
+#: src/lang.c:483
+#, fuzzy
+msgid	"Mail bug report..."
+msgstr	"Hata raporu postala..."
+
+#: src/lang.c:484
+#, fuzzy, c-format
+msgid	"Mail BUG REPORT to %s?"
+msgstr	"HATA RAPORUNU postala %s?"
+
+#: src/lang.c:485
+#, fuzzy
+msgid	"Mailed"
+msgstr	"Postalandý"
+
+#: src/lang.c:486
+#, fuzzy, c-format
+msgid	"Mailing to %s..."
+msgstr	"Postalanýyor %s..."
+
+#: src/lang.c:487
+#, fuzzy
+msgid	"# [Mail/Save] active file. Format is like news active file:\n"
+	"#   groupname  max.artnum  min.artnum  /dir\n"
+	"# The 4th field is the basedir (ie. ~/Mail or ~/News)\n"
+	"#\n"
+msgstr	"# (Mail/Save) aktif dosya. Format haber aktif dosyasyla ayný:\n"
+	"# grup ismi  max.artnum  min.artnum  /dir\n"
+	"# 4. alan basedir(örn.~/Mail or ~/News)\n"
+	"#\n"
+
+#: src/lang.c:490
+#, fuzzy, c-format
+msgid	"%s marked as unread"
+msgstr	"%s okunmamýþ olarak iþaretlendi"
+
+#: src/lang.c:491
+#, fuzzy, c-format
+msgid	"Marked %d of %d tagged %s as read"
+msgstr	"%d içerisinde %d iþaretlendi %s okunmuþ olarak etiketlendi"
+
+#: src/lang.c:492
+#, fuzzy, c-format
+msgid	"Mark all articles as read%s?"
+msgstr	"Bütün makaleleri okunmuþ olarak iþaretle%s?"
+
+#: src/lang.c:493
+#, fuzzy, c-format
+msgid	"Mark %s=tagged articles, %s=current article, %s=quit: "
+msgstr	"Ýþaretle %s=etiketlenen makaleler, %s=mevcut makale, %s=çýk: "
+
+#: src/lang.c:494
+#, fuzzy, c-format
+msgid	"Mark group %s as read?"
+msgstr	"Küme %s 'i okunmuþ olarak iþaretle?"
+
+#: src/lang.c:495
+#, fuzzy, c-format
+msgid	"Mark thread as read%s?"
+msgstr	"Parçacýk %s 'i okunmuþ olarak iþaretle?"
+
+#: src/lang.c:496
+#, fuzzy, c-format
+msgid	"Mark %s=tagged articles/threads, %s=current thread, %s=quit: "
+msgstr	"Ýþaretle %s=etiketlenen makale7parçacýklar, %s= mevcut parçacýk, %s=çýk: "
+
+#: src/lang.c:497
+#, fuzzy, c-format
+msgid	"Matching %s groups..."
+msgstr	"%s kümelerini eþleþtiriyor..."
+
+#: src/lang.c:498 src/lang.c:502
+#, fuzzy, c-format
+msgid	"<n>=set current to n; %s=next unread; %s=search pattern; %s=kill/select"
+msgstr	"<n>=muvcut n için ayarlandý; %s=sonraki okunmayan; %s=arama örüntüsü; %s=yok "
+	"et/seç"
+
+#: src/lang.c:499
+#, fuzzy, c-format
+msgid	"%s=author search; %s=catchup; %s=line down; %s=line up; %s=mark read; %s=list "
+	"thread"
+msgstr	"%s=yazar aramasý; %s=catchup; %s=alt satýr; %s=üst satýr; %s= okunmuþ "
+	"iþaretle; %s=parçacýk listele"
+
+#: src/lang.c:500
+#, fuzzy, c-format
+msgid	"%s=line up; %s=line down; %s=page up; %s=page down; %s=top; %s=bottom"
+msgstr	"%s=üst satýr; %s=alt satýr; %s=üst sayfa; %s= alt sayfa; %s=üst; %s=alt"
+
+#: src/lang.c:501
+#, fuzzy, c-format
+msgid	"%s=search forwards; %s=search backwards; %s=quit"
+msgstr	"%s=ileriye doðru ara; %s=geriye doðru ara; %s=çýk"
+
+#: src/lang.c:503
+#, fuzzy, c-format
+msgid	"%s=author search; %s=body search; %s=catchup; %s=followup; %s=mark read"
+msgstr	"%s=yazar aramasý; %s=gövde aramasý; %s=catchup; %s=takip-et; %s=okumuþ olarak "
+	"iþaretle"
+
+#: src/lang.c:504
+#, fuzzy, c-format
+msgid	"<n>=set current to n; %s=next unread; %s,%s=search pattern; %s=catchup"
+msgstr	"<n>=mevcut n için ayarlandý; %s=sonraki okunmayan; %s,%s=arama örgüsü; %"
+	"s=catchup"
+
+#: src/lang.c:505
+#, fuzzy, c-format
+msgid	"%s=line down; %s=line up; %s=help; %s=move; %s=quit; %s=toggle all/unread"
+msgstr	"%s=alt satýr; %s=üst satýr; %s=yardým; %s=taþý; %s=çýk; %s=bütün/okunmamýþ "
+	"deðiþtir"
+
+#: src/lang.c:506
+#, fuzzy, c-format
+msgid	"%s=subscribe; %s=sub pattern; %s=unsubscribe; %s=unsub pattern; %s=yank in/out"
+msgstr	"%s=abone ol; %s=alt örüntü; %s=abonelikten çýk; %s=alt olmayan örüntü; %"
+	"s=yank in/out"
+
+#: src/lang.c:507
+#, fuzzy, c-format
+msgid	"<n>=set current to n; %s=next unread; %s=catchup; %s=display toggle"
+msgstr	"<n>= muvcut n için ayarlandý; %s=sonraki okunmayan; %s=catchup; %s=deðiþimi "
+	"görüntüle"
+
+#: src/lang.c:508
+#, fuzzy, c-format
+msgid	"%s=help; %s=line down; %s=line up; %s=quit; %s=tag; %s=mark unread"
+msgstr	"%s=yardým; %s=alt satýr; %s=üst satýr; %s=quit; %s=etiketle; %s=okunmamýþ "
+	"olarak iþaretle"
+
+#: src/lang.c:509
+#, fuzzy
+msgid	"--More--"
+msgstr	"--Tümü--"
+
+#: src/lang.c:510
+#, fuzzy, c-format
+msgid	"Moving %s..."
+msgstr	"Taþýnan %s..."
+
+#: src/lang.c:512
+#, fuzzy
+msgid	", name: "
+msgstr	", isim: "
+
+#: src/lang.c:513
+#, fuzzy, c-format
+msgid	"Goto newsgroup [%s]> "
+msgstr	"Haber grubuna gidin [%s]> "
+
+#: src/lang.c:514
+#, fuzzy
+msgid	"newsgroups"
+msgstr	"haber gruplarý"
+
+#: src/lang.c:515
+#, fuzzy, c-format
+msgid	"Position %s in group list (1,2,..,$) [%d]> "
+msgstr	"Grup listesinde %s konumlayýn (1,2,..,$) [%d]> "
+
+#: src/lang.c:516
+#, fuzzy
+msgid	"newsgroup"
+msgstr	"haber gruplarý"
+
+#: src/lang.c:517
+#, fuzzy
+msgid	"Try and save newsrc file again?"
+msgstr	"Newsrc dosyasýný kaydetmeyi tekrar dene?"
+
+#: src/lang.c:518
+#, fuzzy
+msgid	"Warning: No newsgroups were written to your newsrc file. Save aborted."
+msgstr	"Uyarý: Newsrc dosyanýza herhangi bir haber grubu yazýlmadý. Kaydetme "
+	"durduruldu."
+
+#: src/lang.c:519
+#, fuzzy
+msgid	"newsrc file saved successfully.\n"
+msgstr	"newsrc dosyasý baþarýyla kaydedildi.\n"
+
+#: src/lang.c:520
+#, fuzzy
+msgid	"-- Next response --"
+msgstr	"-- Sonraki yanýt --"
+
+#: src/lang.c:521
+#, fuzzy, c-format
+msgid	"NNTP authorization password not found for %s"
+msgstr	"NNTP yetki þifresi %s için bulunamadý"
+
+#: src/lang.c:522
+#, fuzzy
+msgid	"No  "
+msgstr	"Hayýr"
+
+#: src/lang.c:523
+#, fuzzy
+msgid	"*** No articles ***"
+msgstr	"*** Makale yok ***"
+
+#: src/lang.c:524
+#, fuzzy
+msgid	"No articles have been posted"
+msgstr	"Hiçbir makale gönderilmedi"
+
+#: src/lang.c:525
+#, fuzzy
+msgid	"*** No description ***"
+msgstr	"*** Taným yok ***"
+
+#: src/lang.c:526
+#, fuzzy
+msgid	"No filename"
+msgstr	"Dosya adý yok"
+
+#: src/lang.c:527
+#, fuzzy
+msgid	"No group"
+msgstr	"Küme yok"
+
+#: src/lang.c:528
+#, fuzzy
+msgid	"*** No groups ***"
+msgstr	"*** Kümeler yok ***"
+
+#: src/lang.c:529
+#, fuzzy
+msgid	"No more groups to read"
+msgstr	"Okunacak küme kalmadý"
+
+#: src/lang.c:530
+#, fuzzy
+msgid	"No last message"
+msgstr	"Son ileti yok"
+
+#: src/lang.c:531
+#, fuzzy
+msgid	"No mail address"
+msgstr	"Posta adresi yok"
+
+#: src/lang.c:532
+#, fuzzy
+msgid	"No articles marked for saving"
+msgstr	"Kaydetmek için hiçbir makale iþaretlenmedi"
+
+#: src/lang.c:533
+#, fuzzy
+msgid	"No match"
+msgstr	"Eþ yok"
+
+#: src/lang.c:534
+#, fuzzy
+msgid	"No more groups"
+msgstr	"Baþka küme yok"
+
+#: src/lang.c:535
+#, fuzzy
+msgid	"No newsgroups"
+msgstr	"Haber gruplarý yok"
+
+#: src/lang.c:536
+#, fuzzy
+msgid	"No next unread article"
+msgstr	"Sonraki okunmamýþ makale yok"
+
+#: src/lang.c:537
+#, fuzzy
+msgid	"No previous group"
+msgstr	"Önceki küme yok"
+
+#: src/lang.c:538
+#, fuzzy
+msgid	"No previous unread article"
+msgstr	"Önceki okunmamýþ makale yok"
+
+#: src/lang.c:539
+#, fuzzy
+msgid	"No responses"
+msgstr	"Yanýt yok"
+
+#: src/lang.c:540
+#, fuzzy
+msgid	"No responses to list in current thread"
+msgstr	"Mevcut parçacýkta listelemek için hiç yanýt yok"
+
+#: src/lang.c:541
+#, fuzzy
+msgid	"No search string"
+msgstr	"Arama dizgisi yok"
+
+#: src/lang.c:542
+#, fuzzy
+msgid	"No subject"
+msgstr	"Konu yok"
+
+#: src/lang.c:544
+#, fuzzy, c-format
+msgid	"%s: Terminal must have clear to end-of-line (ce)\n"
+msgstr	"%s: Uçbirim satýr sonuna kadar boþ olmak zorunda (ce)\n"
+
+#: src/lang.c:545
+#, fuzzy, c-format
+msgid	"%s: Terminal must have clear to end-of-screen (cd)\n"
+msgstr	"%s: Uçbirim ekran sonuna kadar boþ olmak zorunda (cd)\n"
+
+#: src/lang.c:546
+#, fuzzy, c-format
+msgid	"%s: Terminal must have clearscreen (cl) capability\n"
+msgstr	"%s: Uçbirimin ekran temizleme (cl) yeteneði olmalý\n"
+
+#: src/lang.c:547
+#, fuzzy, c-format
+msgid	"%s: Terminal must have cursor motion (cm)\n"
+msgstr	"%s: Uçbirimin imleç hareketi olmalý (cm)\n"
+
+#: src/lang.c:548
+#, fuzzy, c-format
+msgid	"%s: TERM variable must be set to use screen capabilities\n"
+msgstr	"%s: TERM deðiþkeni ekran yetenekleri kullanýlacak þekilde ayarlanmalý\n"
+
+#: src/lang.c:550
+#, fuzzy, c-format
+msgid	"No viewer found for %s/%s\n"
+msgstr	"%s/%s için görüntüleyici yok\n"
+
+#: src/lang.c:551
+#, fuzzy
+msgid	"Newsgroup does not exist on this server"
+msgstr	"Bu sunucuda haber grubu yok"
+
+#: src/lang.c:552
+#, fuzzy, c-format
+msgid	"Group %s not found in active file"
+msgstr	"Küme %s aktif dosyada bulunamadý"
+
+#: src/lang.c:553
+#, fuzzy
+msgid	"c)reate it, use a)lternative name, use d)efault .newsrc, q)uit tin: "
+msgstr	"c)yarat, a)lternatif isim kullan, d)varsayýlaný kullan, mewsrc, q)tin'den "
+	"çýk: "
+
+#: src/lang.c:554
+#, fuzzy
+msgid	"use a)lternative name, use d)efault .newsrc, q)uit tin: "
+msgstr	"a)lternatif isim kullan, d)varsayýlaný kullan, newsrc, q)tin'den çýk: "
+
+#: src/lang.c:555
+#, fuzzy, c-format
+msgid	"# NNTP-server -> newsrc translation table and NNTP-server\n"
+	"# shortname list for %s %s\n"
+	"#\n"
+	"# the format of this file is\n"
+	"#   <FQDN of NNTP-server> <newsrc file> <shortname> ...\n"
+	"#\n"
+	"# if <newsrc file> is given without path, $HOME is assumed as its location\n"
+	"#\n"
+	"# examples:\n"
+	"#   news.tin.org  .newsrc-tin.org  tinorg\n"
+	"#   news.ka.nu    /tmp/nrc-nu      kanu    nu\n"
+	"#\n"
+msgstr	"# NNTP-sunucu -> newsrc çeviri dosyasý ile NNTP-sunucu\n"
+	"#   %s %s için kýsaltma listesi\n"
+	"#\n"
+	"# bu dosyanýn biçimi\n"
+	"#  <FQDN of NNTP-server> <newsrc file> <shortname> ...\n"
+	"#\n"
+	"# eðer <newsrc file> yol gösterilmeden verildiyse, $HOME onun yeri "
+	"varsayýlýr\n"
+	"#\n"
+	"# örnekler:\n"
+	"#   news.tin.org  .newsrc-tin.org  tinorg\n"
+	"#   news.ka.nu    /tmp/nrc-nu      kanu    nu\n"
+	"#\n"
+
+#: src/lang.c:562
+#, fuzzy
+msgid	"Only"
+msgstr	"Sadece"
+
+#: src/lang.c:563
+#, fuzzy, c-format
+msgid	"Option not enabled. Recompile with %s."
+msgstr	"Seçenek etkin kýlýnmadý. Yeniden derle %s."
+
+#: src/lang.c:564
+#, fuzzy
+msgid	"Options Menu"
+msgstr	"Seçenekler menüsü"
+
+#: src/lang.c:567
+#, fuzzy, c-format
+msgid	"Error in regex: %s at pos. %d '%s'"
+msgstr	"Regex'de hata: poda %s. %d '%s'"
+
+#: src/lang.c:568
+#, fuzzy, c-format
+msgid	"Error in regex: pcre internal error %d"
+msgstr	"Regex'de hata: pcre iç hata %d"
+
+#: src/lang.c:569
+#, fuzzy, c-format
+msgid	"Error in regex: study - pcre internal error %s"
+msgstr	"Regex'de hata: incele - pcre iç hata %s"
+
+#: src/lang.c:570
+#, fuzzy
+msgid	"Post a followup..."
+msgstr	"Takip edici gönder..."
+
+#. TODO: replace hardcoded key-name in txt_post_error_ask_postpone
+#: src/lang.c:572
+#, fuzzy
+msgid	"An error has occurred while posting the article. If you think that this\n"
+	"error is temporary or otherwise correctable, you can postpone the article\n"
+	"and pick it up again with ^O later.\n"
+msgstr	"Makaleyi gönderirken hata oluþtu. Bu makalenin düzeltibeleceðini "
+	"düþünüyorsanýz, makaleyi erteleyebilir ve tekrar ^O komutunu kulanarak "
+	"ulaþabilirsiniz.\n"
+
+#: src/lang.c:575
+#, fuzzy
+msgid	"Posted articles history"
+msgstr	"Gönderilmiþ makalelerin geçmiþi"
+
+#: src/lang.c:576
+#, fuzzy, c-format
+msgid	"Post to newsgroup(s) [%s]> "
+msgstr	"habergrup(lar)a gönder [%s]> "
+
+#: src/lang.c:577
+#, fuzzy
+msgid	"-- post processing started --"
+msgstr	"-- gönderme iþlemi baþlatýldý --"
+
+#: src/lang.c:578
+#, fuzzy
+msgid	"-- post processing completed --"
+msgstr	"-- gönderme iþlemi tamamlandý --"
+
+#: src/lang.c:579
+#, fuzzy, c-format
+msgid	"Post subject [%s]> "
+msgstr	"Konuyu gönder (%s)> "
+
+#: src/lang.c:580
+#, fuzzy
+msgid	"# Summary of mailed/posted messages viewable by 'W' command from within tin.\n"
+msgstr	"# 'W' komutundan görünebilir postalanmýþ/gönderilmiþ iletilerin özeti.\n"
+
+#: src/lang.c:581
+#, fuzzy
+msgid	"Posting article..."
+msgstr	"Makale gönderiliyor..."
+
+#: src/lang.c:582
+#, fuzzy, c-format
+msgid	"Post postponed articles [%%s]? (%s/%s/%s/%s/%s): "
+msgstr	"Ertelenmiþ makaleleri gönder [%%s]? (%s/%s/%s/%s/%s): "
+
+#: src/lang.c:583
+#, fuzzy, c-format
+msgid	"Hot %s"
+msgstr	"Hot %s"
+
+#: src/lang.c:584
+#, fuzzy, c-format
+msgid	"Tagged %s"
+msgstr	"%s imlenmiþ"
+
+#: src/lang.c:585
+#, fuzzy, c-format
+msgid	"Untagged %s"
+msgstr	"%s imlenmemiþ"
+
+#: src/lang.c:586
+#, fuzzy
+msgid	"Processing mail messages marked for deletion."
+msgstr	"Silinmek için iþaretlenen iletilerin iþletilmesi."
+
+#: src/lang.c:587
+#, fuzzy
+msgid	"Processing saved articles marked for deletion."
+msgstr	"Silinmek için iþaretlenen kaydedilmiþ makalelerin iþletilmesi."
+
+#: src/lang.c:588
+#, fuzzy, c-format
+msgid	"Accept Followup-To? %s=post, %s=ignore, %s=quit: "
+msgstr	"Takip edilsin? %s=gönder, %s=yoksay, %s=terk et: "
+
+#: src/lang.c:589
+#, fuzzy
+msgid	"Article unchanged, abort mailing?"
+msgstr	"Makale deðiþtirilmesini, posta iptal edilsin mi?"
+
+#: src/lang.c:590
+#, fuzzy, c-format
+msgid	"Do you want to see postponed articles (%d)?"
+msgstr	"Ertelediðiniz makaleleri görmek ister misiniz (%d)?"
+
+#: src/lang.c:592
+#, fuzzy
+msgid	"Add quick kill filter?"
+msgstr	"Öldürücü hýzlý süzü eklensin mi?"
+
+#: src/lang.c:593
+#, fuzzy
+msgid	"Add quick selection filter?"
+msgstr	"Hýzlý seçenek süzü eklensin mi?"
+
+#: src/lang.c:594
+#, fuzzy
+msgid	"Do you really want to quit?"
+msgstr	"Terketmek istediðinizden emin misiniz?"
+
+#: src/lang.c:595
+#, fuzzy, c-format
+msgid	"%s=edit cancel message, %s=quit, %s=delete (cancel) [%%s]: "
+msgstr	"%s=düzenle iletiyi iptal et, %s=terk et, %s=sil (iptal) [%%s]: "
+
+#: src/lang.c:596
+#, fuzzy
+msgid	"You have tagged articles in this group - quit anyway?"
+msgstr	"Bu gruptaki makaleleri imlediniz-yine de terk edilsin mi?"
+
+#: src/lang.c:597
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=postpone: "
+msgstr	"%s=terk et, %s=düzenle, %s=ertele: "
+
+#: src/lang.c:598
+#, fuzzy, c-format
+msgid	"%s=quit %s=edit %s=save kill description: "
+msgstr	"%s=terk et %s=düzenle %s=kaydet tanýmý öldür: "
+
+#: src/lang.c:599
+#, fuzzy, c-format
+msgid	"%s=quit %s=edit %s=save select description: "
+msgstr	"%s=terk et %s=düzenle %s=kaydet tanýmý seç: "
+
+#: src/lang.c:600
+#, fuzzy
+msgid	"Do you really want to quit without saving your configuration?"
+msgstr	"Yapýlandýrmalarý kaydetmeden terk etmek istediðinizden emin misiniz?"
+
+#: src/lang.c:603
+#, fuzzy
+msgid	"Invalid range - valid are '0-9.$' eg. 1-$"
+msgstr	"Geçersiz aralýklar- '0-9.$' eg. 1-$ geçerlidir"
+
+#: src/lang.c:604
+#, fuzzy
+msgid	"Do you want to abort this operation?"
+msgstr	"Ýþlem durdurulsun mu?"
+
+#: src/lang.c:605
+#, fuzzy
+msgid	"Do you want to exit tin immediately?"
+msgstr	"tin'den hemen çýkmak istediðinizden emin misisniz?"
+
+#: src/lang.c:606
+#, fuzzy
+msgid	"Read response> "
+msgstr	"Yanýtý oku> "
+
+#: src/lang.c:607
+#, fuzzy
+msgid	"Reading ('q' to quit)..."
+msgstr	"('q' iptal) okunuyor..."
+
+#: src/lang.c:608
+#, fuzzy, c-format
+msgid	"Reading %sarticles..."
+msgstr	"Makaleler %sokunuyor..."
+
+#: src/lang.c:609
+#, fuzzy, c-format
+msgid	"Reading %sattributes file...\n"
+msgstr	"%sÖznitelik dosyasý okunuyor...\n"
+
+#: src/lang.c:610
+#, fuzzy, c-format
+msgid	"Reading %sconfig file...\n"
+msgstr	"%sYapýlandýrma dosyasý okunuyor\n"
+
+#: src/lang.c:611
+#, fuzzy
+msgid	"Reading filter file...\n"
+msgstr	"Süz dosyasý okunuyor...\n"
+
+#: src/lang.c:612
+#, fuzzy, c-format
+msgid	"Reading %s groups..."
+msgstr	"%s gruplar okunuyor..."
+
+#: src/lang.c:613
+#, fuzzy
+msgid	"Reading input history file...\n"
+msgstr	"Giriþ tarihçe dosyasý okunuyor...\n"
+
+#: src/lang.c:614
+#, fuzzy
+msgid	"Reading keymap file...\n"
+msgstr	"anahtarharita dosyasý okunuyor...\n"
+
+#: src/lang.c:615
+#, fuzzy
+msgid	"Reading groups from active file... "
+msgstr	"Gruplar yürürlükteki dosyadan okunuyor... "
+
+#: src/lang.c:616
+#, fuzzy
+msgid	"Reading groups from newsrc file... "
+msgstr	"Gruplar haberkaynak dosyasýndan okunuyor... "
+
+#: src/lang.c:617
+#, fuzzy
+msgid	"Reading newsgroups file... "
+msgstr	"Habergruplar dosyasý okunuyor... "
+
+#: src/lang.c:618
+#, fuzzy
+msgid	"Reading newsrc file..."
+msgstr	"Haberkaynak dosyasý okunuyor..."
+
+#: src/lang.c:620
+#, c-format
+msgid	"(%d:%02d remaining)"
+msgstr	""
+
+#: src/lang.c:622
+#, fuzzy, c-format
+msgid	"Bogus group %s removed."
+msgstr	"Bogus grubu %s kaldýrýldý."
+
+#: src/lang.c:623
+#, fuzzy, c-format
+msgid	"Error: rename %s to %s"
+msgstr	"Hata:%s'den %s'ye yeniden adlandýr"
+
+#: src/lang.c:624
+#, fuzzy
+msgid	"Reply to author..."
+msgstr	"Yetkiliye yanýt gönderiyor..."
+
+#: src/lang.c:625
+#, fuzzy
+msgid	"Repost"
+msgstr	"Yeniden gönder"
+
+#: src/lang.c:626
+#, fuzzy
+msgid	"Reposting article..."
+msgstr	"Makale yeniden gönderiliyor..."
+
+#: src/lang.c:627
+#, fuzzy, c-format
+msgid	"Repost article(s) to group(s) [%s]> "
+msgstr	"Makale(ler)i grup(lar)a gönder (%s)> "
+
+#: src/lang.c:628
+#, fuzzy
+msgid	"Reset newsrc?"
+msgstr	"Haberkaynak sýfýrlansýn mý?"
+
+#: src/lang.c:629
+#, fuzzy
+msgid	"Responses have been directed to the following newsgroups"
+msgstr	"Yanýtlar sonraki habergruplara yönlendirildi"
+
+#: src/lang.c:630
+#, fuzzy, c-format
+msgid	"Responses have been directed to poster. %s=mail, %s=post, %s=quit: "
+msgstr	"Yanýtlar göndericiye yönlendirildi. %s=postala, %s=gönder, %s=iptal: "
+
+#: src/lang.c:631
+#, fuzzy, c-format
+msgid	"RespNo %4d of %4d"
+msgstr	"YanýtNo %4d of %4d"
+
+#: src/lang.c:632
+#, fuzzy
+msgid	"Press <RETURN> to continue..."
+msgstr	"Devam etmek için <DÖNÜÞ> bas..."
+
+#: src/lang.c:634
+#, c-format
+msgid	"Select From    [%s] (y/n): "
+msgstr	""
+
+#: src/lang.c:635
+#, fuzzy
+msgid	"Select Lines: (</>num): "
+msgstr	"Satýrlarý seç: (</>num): "
+
+#: src/lang.c:636
+#, fuzzy
+msgid	"Auto-select Article Menu"
+msgstr	"Otomatik Seçme Makale Menüsü"
+
+#: src/lang.c:637
+#, fuzzy, c-format
+msgid	"Select Msg-Id  [%s] (f/l/o/n): "
+msgstr	"Ýleti-kimliði seçiniz [%s] (f/l/o/n): "
+
+#: src/lang.c:638
+#, fuzzy
+msgid	"Select pattern scope: "
+msgstr	"Örüntü alanýný seç: "
+
+#: src/lang.c:639
+#, fuzzy, c-format
+msgid	"Select Subject [%s] (y/n): "
+msgstr	"Konuyu seç [%s] (y/n): "
+
+#: src/lang.c:640
+#, fuzzy
+msgid	"Select text pattern : "
+msgstr	"Alan metnini seç : "
+
+#: src/lang.c:641
+#, fuzzy
+msgid	"Select time in days   : "
+msgstr	"Günlük olarak zamaný seç: "
+
+#: src/lang.c:642
+#, fuzzy, c-format
+msgid	"# %s server configuration file\n"
+	"# This file was automatically saved by %s %s %s (\"%s\")\n"
+	"#\n"
+	"# Do not edit while %s is running, since all your changes to this file\n"
+	"# will be overwritten when you leave %s.\n"
+	"# Do not edit at all if you don't know what you do.\n"
+	"############################################################################\n"
+	"\n"
+msgstr	"# %ssunucu yapýlandýrma dosyasý\n"
+	"# Bu dosya otomatik olarak kaydedildi %s %s %s (\"%s\")\n"
+	"#\n"
+	"# %s çalýþýrken deðiþtirmeyiniz, çünkü her deðiþikler\n"
+	"# terk ettiðinde yeniden yazýlacak %s.\n"
+	"# Ne yapmak gerektiðinizi bilmiyorsanýz lütfen deðiþtirmeyiniz.\n"
+
+#: src/lang.c:648
+#, fuzzy
+msgid	"Showing unread groups only"
+msgstr	"Sadece okunmamýþ gruplar görünüyor"
+
+#: src/lang.c:649
+#, fuzzy
+msgid	"Subject: line (ignore case)   "
+msgstr	"Konu: satýr (büyük küçük harf durumunu yoksay)"
+
+#: src/lang.c:650
+#, fuzzy
+msgid	"Subject: line (case sensitive)"
+msgstr	"Konu: satýr (büyük-küçük duyarlý)"
+
+#: src/lang.c:651
+#, fuzzy
+msgid	"Save"
+msgstr	"Kaydet"
+
+#: src/lang.c:652
+#, fuzzy, c-format
+msgid	"Save '%s' (%s/%s)?"
+msgstr	"Kaydedilsin mi '%s' (%s/%s)?"
+
+#: src/lang.c:653
+#, fuzzy
+msgid	"Save configuration before continuing?"
+msgstr	"Devam etmeden düzenlemeleri kaydet?"
+
+#: src/lang.c:654
+#, fuzzy
+msgid	"Save filename> "
+msgstr	"Dosyaadý kaydet> "
+
+#: src/lang.c:655
+#, fuzzy
+msgid	"Saved"
+msgstr	"Kaydedildi"
+
+#: src/lang.c:656
+#, fuzzy, c-format
+msgid	"%4d unread (%4d hot) %s in %s\n"
+msgstr	"%4d okunmamýþ (%4d hot) %s in %s\n"
+
+#: src/lang.c:657
+#, fuzzy, c-format
+msgid	"Saved %s...\n"
+msgstr	"Kaydedildi %s...\n"
+
+#: src/lang.c:658
+#, fuzzy
+msgid	"Nothing was saved"
+msgstr	"Hiçbirþey kaydedilmedi"
+
+#: src/lang.c:659
+#, fuzzy, c-format
+msgid	"\n"
+	"%s %d %s from %d %s\n"
+msgstr	"\n"
+	"%s %d %s 'dan %d %s\n"
+
+#: src/lang.c:660
+#, fuzzy, c-format
+msgid	"-- %s saved to %s%s --"
+msgstr	"-- %s kaydedildi %s%s --"
+
+#: src/lang.c:661
+#, fuzzy, c-format
+msgid	"-- %s saved to %s - %s --"
+msgstr	"-- %s kaydedildi %s - %s --"
+
+#: src/lang.c:662
+#, fuzzy
+msgid	"Saving..."
+msgstr	"Kaydediliyor..."
+
+#: src/lang.c:663
+#, fuzzy, c-format
+msgid	"%s: Screen initialization failed"
+msgstr	"%s: Ekran baþlatma baþarýsýz"
+
+#: src/lang.c:665
+#, fuzzy, c-format
+msgid	"%s: screen is too small\n"
+msgstr	"%s: ekran çok küçük\n"
+
+#: src/lang.c:667
+#, fuzzy, c-format
+msgid	"screen is too small, %s is exiting\n"
+msgstr	"ekran çok küçük, %s çýkýyor\n"
+
+#: src/lang.c:668
+#, fuzzy, c-format
+msgid	"Search backwards [%s]> "
+msgstr	"Geri ara [%s]> "
+
+#: src/lang.c:669
+#, fuzzy, c-format
+msgid	"Search body [%s]> "
+msgstr	"Gövdeyi ara [%s]> "
+
+#: src/lang.c:670
+#, fuzzy, c-format
+msgid	"Search forwards [%s]> "
+msgstr	"Ýleri ara [%s]> "
+
+#: src/lang.c:671
+#, fuzzy
+msgid	"Searching..."
+msgstr	"Arýyor..."
+
+#: src/lang.c:672
+#, fuzzy, c-format
+msgid	"Searching article %d of %d ('q' to abort)..."
+msgstr	"Makale aranýyor %d of %d ('q' durdur)..."
+
+#: src/lang.c:673
+#, fuzzy
+msgid	"Select article> "
+msgstr	"Makale seç> "
+
+#: src/lang.c:674
+#, fuzzy
+msgid	"Select option number before text or use arrow keys and <CR>. 'q' to quit."
+msgstr	"Metin ve ok tuþu kullanmadan seçenek ve <CR>düðmelerini basýnýz. terk etmek "
+	"için 'q'."
+
+#: src/lang.c:675
+#, fuzzy
+msgid	"Select group> "
+msgstr	"Grup seç> "
+
+#: src/lang.c:676
+#, fuzzy, c-format
+msgid	"Enter selection pattern [%s]> "
+msgstr	"Seçme örüntüsünü girin [%s]> "
+
+#: src/lang.c:677
+#, fuzzy
+msgid	"Select thread > "
+msgstr	"En küçük yürütme birimlerini seç > "
+
+#: src/lang.c:678
+#, fuzzy, c-format
+msgid	"%s %s %s (\"%s\") [%s]: send a DETAILED bug report to %s\n"
+msgstr	"%s %s %s (\"%s\") [%s]: DETAYLI hata raporu gönder %s\n"
+
+#: src/lang.c:679
+#, fuzzy
+msgid	"servers active-file"
+msgstr	"Sunucular etkindosyasý"
+
+#: src/lang.c:680
+#, fuzzy
+msgid	"Cannot move into new newsgroups. Subscribe first..."
+msgstr	"Habergruplara giriþ yapýlamýyor. Önce abone ol..."
+
+#: src/lang.c:681
+#, fuzzy
+msgid	"<SPACE>"
+msgstr	"<ARALIK>"
+
+#: src/lang.c:682
+#, fuzzy, c-format
+msgid	"Starting: (%s)"
+msgstr	"Baþlatma: (%s)"
+
+#: src/lang.c:683
+#, fuzzy, c-format
+msgid	"List Thread (%d of %d)"
+msgstr	"En küçük yürütme birimlerini listele (%d of %d)"
+
+#: src/lang.c:684
+#, fuzzy, c-format
+msgid	"Thread (%.*s)"
+msgstr	"En küçük yürütme birimi (%.*s)"
+
+#: src/lang.c:685
+#, fuzzy
+msgid	"Enter wildcard subscribe pattern> "
+msgstr	"Joker abone alanýna giriniz> "
+
+#: src/lang.c:686
+#, fuzzy, c-format
+msgid	"subscribed to %d groups"
+msgstr	"%d gruplara abone olundu"
+
+#: src/lang.c:687
+#, fuzzy, c-format
+msgid	"Subscribed to %s"
+msgstr	"Abone olundu %s"
+
+#: src/lang.c:688
+#, fuzzy
+msgid	"Subscribing... "
+msgstr	"Abone olunuyor... "
+
+#: src/lang.c:689
+#, fuzzy, c-format
+msgid	"Repost or supersede article(s) [%%s]? (%s/%s/%s): "
+msgstr	"Makale(ler)i yeniden gönder yada deðiþtir (s) [%%s]? (%s/%s/%s): "
+
+#: src/lang.c:690
+#, fuzzy, c-format
+msgid	"Supersede article(s) to group(s) [%s]> "
+msgstr	"Makale(ler)i Grup(lar)a yerini al [%s]> "
+
+#: src/lang.c:691
+#, fuzzy
+msgid	"Superseding article ..."
+msgstr	"Makaleyi deðiþtiriyor..."
+
+#: src/lang.c:692
+#, fuzzy, c-format
+msgid	"\n"
+	"Stopped. Type 'fg' to restart %s\n"
+msgstr	"\n"
+	"Durduruldu. Yeniden baþlatmak için 'fg' yaz %s\n"
+
+#: src/lang.c:694
+#, fuzzy, c-format
+msgid	"%d days"
+msgstr	"%d günler"
+
+#: src/lang.c:695
+#, fuzzy
+msgid	"<TAB>"
+msgstr	"<SEKME>"
+
+#: src/lang.c:696
+msgid	"TeX "
+msgstr	""
+
+#: src/lang.c:697
+#, fuzzy
+msgid	"# Default action/prompt strings\n"
+msgstr	"# Varsayýlan iþlem/komut dizgileri\n"
+
+#: src/lang.c:698
+#, fuzzy
+msgid	"# Defaults for quick (1 key) kill & auto-selection filters\n"
+	"# header=NUM  0,1=Subject: 2,3=From: 4=Message-ID: & full References: line\n"
+	"#             5=Message-ID: & last References: entry only\n"
+	"#             6=Message-ID: entry only 7=Lines:\n"
+	"# global=ON/OFF  ON=apply to all groups OFF=apply to current group\n"
+	"# case=ON/OFF    ON=filter case sensitive OFF=ignore case\n"
+	"# expire=ON/OFF  ON=limit to default_filter_days OFF=don't ever expire\n"
+msgstr	"# Varsayýlanlarý (1 tuþ) kill & otomatik seçme süzleri\n"
+	"# baþlýk=NUM  0,1=Konu: 2,3=dan: 4=Ýleti kimliði: & tam referanslar: satýr\n"
+	"#             5=Ýleti Kimliði: & son referanslar: sadece giriþ\n"
+	"#             6=Ýleti Kimliði: sadece giriþ 7=Satýrlar:\n"
+	"# global=ON/OFF  ON=bütün gruplara uygula OFF=mevcut gruba uygula\n"
+	"# case=ON/OFF    ON=filter case sensitive OFF=ignore case\n"
+	"# expire=ON/OFF  ON=limit to default_filter_days OFF=don't ever expire\n"
+
+#: src/lang.c:711
+#, fuzzy
+msgid	"# If ON use print current subject or newsgroup description in the last line\n"
+msgstr	"# ON durumdaysa mevcut konu yada son satýrdaki habergrup tanýmý için yazýcýyý "
+	"kullanýnýz\n"
+
+#: src/lang.c:712
+#, fuzzy
+msgid	"# Host & time info used for detecting new groups (don't touch)\n"
+msgstr	"# Yeni gruplarý algýlamak için ana sunucu& zaman bilgileri kullanýnýz "
+	"(dokunmayýnýz)\n"
+
+#: src/lang.c:713
+#, fuzzy
+msgid	"There is no news\n"
+msgstr	"Hiçbir haber yok\n"
+
+#: src/lang.c:714
+#, fuzzy
+msgid	"Thread"
+msgstr	"En küçük yürütme birimi"
+
+#: src/lang.c:715
+#, fuzzy
+msgid	"Thread Level Commands"
+msgstr	"En Küçük Yürütme Birim Komut Düzeyi"
+
+#: src/lang.c:716
+#, fuzzy
+msgid	"Thread deselected"
+msgstr	"En küçük yürütme birimin seçimi iptal edildi"
+
+#: src/lang.c:717
+#, fuzzy
+msgid	"Thread selected"
+msgstr	"En küçük yürütme birimi seçildi"
+
+#: src/lang.c:719
+#, fuzzy
+msgid	"threads"
+msgstr	"en küçük yürütme birimleri"
+
+#: src/lang.c:721
+#, fuzzy
+msgid	"Thread range"
+msgstr	"en küçük yürütme birimi aralýðý"
+
+#: src/lang.c:722
+#, fuzzy
+msgid	"thread"
+msgstr	"en küçük yürütme birimi"
+
+#: src/lang.c:723
+#, fuzzy, c-format
+msgid	"Thread %4s of %4s"
+msgstr	"En küçük yürütme birimi %4s of %4s"
+
+#: src/lang.c:724
+#, fuzzy
+msgid	"Threading articles..."
+msgstr	"Makaleler baðlanýyor..."
+
+#: src/lang.c:725
+#, fuzzy, c-format
+msgid	"Toggled word highlighting %s"
+msgstr	"Geçiþ kelime belirtiliyor %s"
+
+#: src/lang.c:726
+#, fuzzy
+msgid	"Toggled rot13 encoding"
+msgstr	"Geçiþ rot13 kodlanýyor"
+
+#: src/lang.c:727
+#, fuzzy, c-format
+msgid	"Toggled german TeX encoding %s"
+msgstr	"Geçiþ almanca TeX kodlanýyor %s"
+
+#: src/lang.c:728
+#, fuzzy, c-format
+msgid	"Toggled tab-width to %d"
+msgstr	"Geçiþ sekme geniþliði %d"
+
+#: src/lang.c:729
+#, fuzzy, c-format
+msgid	"%d Trying to dotlock %s"
+msgstr	"%d kilitlemeye deniyor %s"
+
+#: src/lang.c:730
+#, fuzzy, c-format
+msgid	"%d Trying to lock %s"
+msgstr	"%d kilitlemeye çalýþýyor %s"
+
+#: src/lang.c:731
+#, fuzzy
+msgid	"           h=help\n"
+msgstr	"         h=yardým\n"
+
+#: src/lang.c:733
+#, fuzzy
+msgid	"Unlimited"
+msgstr	"Sýnýrsýz"
+
+#: src/lang.c:734
+#, fuzzy
+msgid	"Enter wildcard unsubscribe pattern> "
+msgstr	"Abone iptal joker alanýna giriniz> "
+
+#: src/lang.c:735
+#, fuzzy, c-format
+msgid	"Error decoding %s : %s"
+msgstr	"Hata kod çözülmesi %s: %s"
+
+#: src/lang.c:736
+#, fuzzy
+msgid	"No end."
+msgstr	"Sonu yok."
+
+#: src/lang.c:737
+#, fuzzy, c-format
+msgid	"%s successfully decoded."
+msgstr	"%s kod baþarýyla çözüldü."
+
+#: src/lang.c:738
+#, fuzzy, c-format
+msgid	"%*s[-- %s/%s, %suuencoded file, %d lines, name: %s --]\n"
+	"\n"
+msgstr	"%*s[-- %s/%s, %s metinsele kodlama dosyasý, %d satýr, ad: %s --]\n"
+	"\n"
+
+#: src/lang.c:739
+#, fuzzy
+msgid	"unread "
+msgstr	"okunmamýþ "
+
+#: src/lang.c:740
+#, fuzzy, c-format
+msgid	"unsubscribed from %d groups"
+msgstr	"%d gruptan abonelik iptal edildi"
+
+#: src/lang.c:741
+#, fuzzy, c-format
+msgid	"Unsubscribed from %s"
+msgstr	"abonelik iptal edildi %s"
+
+#: src/lang.c:742
+#, fuzzy
+msgid	"Unsubscribing... "
+msgstr	"Abonelik iptal oluyor... "
+
+#: src/lang.c:743
+#, fuzzy
+msgid	"Unthreading articles..."
+msgstr	"Makalelerin baðlantýsý sonlanýyor..."
+
+#: src/lang.c:744
+#, fuzzy
+msgid	"Updated"
+msgstr	"Güncelendi"
+
+#: src/lang.c:745
+#, fuzzy
+msgid	"Updating"
+msgstr	"Güncellenme"
+
+#: src/lang.c:746
+#, fuzzy, c-format
+msgid	"Opening %s\n"
+msgstr	"Açýlma %s\n"
+
+#: src/lang.c:747
+#, fuzzy
+msgid	"No more URL's in this article"
+msgstr	"Makalede Birörnek Kaynak Bulucu yok"
+
+#: src/lang.c:748
+#, fuzzy
+msgid	"Use MIME display program for this message?"
+msgstr	"Bu ileti için MIME(Çok Amaçlý Internet Posta Uzantýlarý) ekran programý "
+	"kullan?"
+
+#: src/lang.c:749
+#, fuzzy
+msgid	"  -c       mark all news as read in subscribed newsgroups (batch mode)"
+msgstr	"  -c       abone edilmiþ habergruplara bütün haberleri okunmuþ olarak "
+	"iþaretleyiniz (toplu mod)"
+
+#: src/lang.c:750
+#, fuzzy
+msgid	"  -Z       return status indicating if any unread news (batch mode)"
+msgstr	"  -Z       Okunmamýþ haber varsa geri statüsüne gelir (toplu mod)"
+
+#: src/lang.c:751
+#, fuzzy
+msgid	"  -q       don't check for new newsgroups"
+msgstr	"  -q       yeni habergruplarý için deneme"
+
+#: src/lang.c:752
+#, fuzzy
+msgid	"  -X       don't save any files on quit"
+msgstr	"  -X       çýkýþta hiçbir dosya kaydetme"
+
+#: src/lang.c:753
+#, fuzzy
+msgid	"  -d       don't show newsgroup descriptions"
+msgstr	"  -d       habergrubu tanýmlarý gösterme"
+
+#: src/lang.c:754
+#, fuzzy
+msgid	"  -G limit get only limit articles/group"
+msgstr	"  -G limit sadece makale/grup sýnýrý elde et"
+
+#: src/lang.c:755
+#, fuzzy, c-format
+msgid	"  -H       help information about %s"
+msgstr	"  -H       yardým bilgisi %s"
+
+#: src/lang.c:756
+#, fuzzy
+msgid	"  -h       this help message"
+msgstr	"  -h       ileti yardýmý"
+
+#: src/lang.c:757
+#, fuzzy, c-format
+msgid	"  -I dir   news index file directory [default=%s]"
+msgstr	"  -I dir   haber dizin dosyasý [varsayýlant=%s]"
+
+#: src/lang.c:758
+#, fuzzy
+msgid	"  -u       update index files (batch mode)"
+msgstr	"  -u       guncelleme dizin dosyasý (toplu modu)"
+
+#: src/lang.c:759
+#, fuzzy, c-format
+msgid	"  -m dir   mailbox directory [default=%s]"
+msgstr	"  -m dir   posta kutusu dizini [varsayýlan=%s]"
+
+#: src/lang.c:760
+#, fuzzy, c-format
+msgid	"\n"
+	"Mail bug reports/comments to %s"
+msgstr	"\n"
+	"posta hata raporu/açýklama %s"
+
+#: src/lang.c:761
+#, fuzzy
+msgid	"  -N       mail new news to your posts (batch mode)"
+msgstr	"  -N       Gönderilenlere yeni haber gönder (toplu mod)"
+
+#: src/lang.c:762
+#, fuzzy
+msgid	"  -M user  mail new news to specified user (batch mode)"
+msgstr	"  -M kulanýcýsý  özel kulanýcýya yeni haber göder (toplu mod)"
+
+#: src/lang.c:763
+#, fuzzy, c-format
+msgid	"  -f file  subscribed to newsgroups file [default=%s]"
+msgstr	"  -f dosyasý  habergruplar dosyasýna abone olundu (varsayýlan=%s)"
+
+#: src/lang.c:764
+#, fuzzy
+msgid	"  -x       no posting mode"
+msgstr	"  -x       iþlem modu yok"
+
+#: src/lang.c:765
+#, fuzzy
+msgid	"  -w       post an article and exit"
+msgstr	"  -w       makale gönder ve çýk"
+
+#: src/lang.c:766
+#, fuzzy
+msgid	"  -o       post all postponed articles and exit"
+msgstr	"  -o       ertelenmiþ bütün makaleleri gönder ve çýk"
+
+#: src/lang.c:767
+#, fuzzy
+msgid	"  -r       read news remotely from default NNTP server"
+msgstr	"  -r       varsayýlan NTTP sunucusundan haberleri uzaktan oku"
+
+#: src/lang.c:768
+#, fuzzy
+msgid	"  -R       read news saved by -S option"
+msgstr	"  -R       -S seçeneði basarak kaydedilen haberleri oku"
+
+#: src/lang.c:769
+#, fuzzy, c-format
+msgid	"  -s dir   save news directory [default=%s]"
+msgstr	"  -s dir   haber dizinini kaydet (varsayýlan=%s)"
+
+#: src/lang.c:770
+#, fuzzy
+msgid	"  -S       save new news for later reading (batch mode)"
+msgstr	"  -S       daha sonra okumak üzere yeni haberleri kaydet (toplu mod)"
+
+#: src/lang.c:771
+#, fuzzy
+msgid	"  -z       start if any unread news"
+msgstr	"  -z       okunmamýþ haber varsa baþla"
+
+#: src/lang.c:772
+#, fuzzy, c-format
+msgid	"A Usenet reader.\n"
+	"\n"
+	"Usage: %s [options] [newsgroup[,...]]"
+msgstr	"Usenet okuyucusu.\n"
+	"\n"
+	"Kullaným: %s [seçenekler] [habergrubu[,...]]"
+
+#: src/lang.c:773
+#, fuzzy
+msgid	"  -v       verbose output for batch mode options"
+msgstr	"  -v       toplu kip seçenekleri için gereksiz çýkýþ"
+
+#: src/lang.c:774
+#, fuzzy
+msgid	"  -V       print version & date information"
+msgstr	"  -V       Sürüm & tarih bilgilerini yazdýr"
+
+#: src/lang.c:775
+#, fuzzy, c-format
+msgid	"%s only useful without batch mode operations\n"
+msgstr	"%s sadece toplu kip seçenekleri yoksa kullanýþlý\n"
+
+#: src/lang.c:776
+#, fuzzy, c-format
+msgid	"%s only useful for batch mode operations\n"
+msgstr	"%s sadece toplu kip seçenekleri varsa kullanýþlý\n"
+
+#: src/lang.c:778
+#, fuzzy, c-format
+msgid	"\n"
+	"%s%d out of range (0 - %d). Reset to 0"
+msgstr	"\n"
+	"%s%d erimin dýþýnda (0 - %d), Sýfýrla"
+
+#: src/lang.c:779
+#, fuzzy, c-format
+msgid	"View '%s' (%s/%s)?"
+msgstr	"Göster '%s' (%s/%s)?"
+
+#: src/lang.c:781
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: posting exceeds %d columns. Line %d is the first long one:\n"
+	"%-100s\n"
+msgstr	"\n"
+	"Uyarý: gönderme %d sütunlarýný geçiyor. %d en uzun ilk satýr:\n"
+	"%-100s\n"
+
+#: src/lang.c:782
+#, fuzzy
+msgid	"\n"
+	"Warning: article unchanged after editing\n"
+msgstr	"\n"
+	"Uyarý: makale düzenlendikten sonra deðiþtirildi\n"
+
+#: src/lang.c:783
+#, fuzzy
+msgid	"\n"
+	"Warning: \"Subject:\" contains only whitespaces.\n"
+msgstr	"\n"
+	"Uyarý: \"Konu:\" sadece beyazboþluklar var.\n"
+
+#: src/lang.c:784
+#, fuzzy
+msgid	"\n"
+	"Warning: \"Subject:\" begins with \"Re: \" but there are no \"References:\".\n"
+msgstr	"\n"
+	"Uyarý: \"Konu:\" ,  \"Re: \" ile baþlar ama \"Referanslar:\" yok.\n"
+
+#: src/lang.c:786
+#, fuzzy
+msgid	"\n"
+	"Warning: Article has \"References:\" but \"Subject:\" does not begin\n"
+	"         with \"Re: \" and does not contain \"(was:\".\n"
+msgstr	"\n"
+	"Uyarý: Makalede \"Referanslar:\"  var \"Konu:\"    \"Re: \" ile\n"
+	"       baþlmýyor ve \"(was:\" yok.\n"
+
+#: src/lang.c:789
+#, fuzzy
+msgid	"Read carefully!\n"
+	"\n"
+	"  You are about to cancel an article seemingly written by you. This will "
+	"wipe\n"
+	"  the article from most  news servers  throughout the world,  but there is "
+	"no\n"
+	"  guarantee that it will work.\n"
+	"\n"
+	"This is the article you are about to cancel:\n"
+	"\n"
+msgstr	"Dikkatle oku!\n"
+	"\n"
+	" Tarafýnýzdan yazýlan bir makaleyi iptal etmek üzeresiniz. Bu, makaleyi "
+	"dünyadaki\n"
+	" birçok haber sunucusundan silecektir, ama çalýþacaðýnýn da bir garantisi "
+	"yok.\n"
+	"\n"
+	"Ýptal etmek üzere olduðunuz makale bu:\n"
+	"\n"
+
+#: src/lang.c:793
+#, fuzzy
+msgid	"\n"
+	"Warning: You are using a non-plain transfer encoding (such as base64 or\n"
+	"         quoted-printable) and an external inews program to submit your\n"
+	"         article. If a signature is appended by that inews program it will\n"
+	"         not be encoded properly.\n"
+msgstr	"\n"
+	"Uyarý: Makalenizi sunmak için düz olmayan bir transfer kodlamasý (base64 ya "
+	"da\n"
+	"          imlenen-yazýlabilir gibi) ve dýþ inews programý kullanýyorsunuz. "
+	"Eðer o\n"
+	"          inews programý tarafýndan bir imza iliþtirildiyse, uygun þekilde "
+	"kodlanamaz.\n"
+
+#: src/lang.c:798
+#, fuzzy, c-format
+msgid	"\n"
+	"\n"
+	"You are upgrading to tin %s from an earlier version.\n"
+	"Some values in your %s file have changed!\n"
+	"Read WHATSNEW, etc...\n"
+msgstr	"\n"
+	"\n"
+	"Daha önceki bir sürümden tin %s 'e güncelliyorsunuz.\n"
+	"%s dosyanýzdaki bazi deðerler deðiþtirilmiþtir!\n"
+	"Oku WHATSNEW, vb...\n"
+
+#: src/lang.c:800
+#, fuzzy, c-format
+msgid	"\n"
+	"\n"
+	"You are downgrading to tin %s from a more recent version!\n"
+	"Some values in your %s file may be ignored, others might have changed!\n"
+msgstr	"\n"
+	"\n"
+	"Yeni bir sürümden tin %s 'e alçaltýyorsunuz!\n"
+	"%s dosyanýdaki bazý deðerler yoksayýlabiri, diðerleri deðiþtirilebilir!\n"
+
+#: src/lang.c:803
+#, fuzzy, c-format
+msgid	"Warning: tin wrote fewer groups to your\n"
+	"\t%s\n"
+	"than it read at startup. If you didn't unsubscribe from %ld %s during\n"
+	"this session this indicates an error and you should backup your %s\n"
+	"before you start tin once again!\n"
+msgstr	"Uyarý: tin baþlangýçta okuduðundan\n"
+	"\t%s\n"
+	"daha az küme yazdý. Bu oturum sýrasýnda %ld %s 'den aboneliðinizi "
+	"almadýysanýz\n"
+	"bu bir hata gösterir ve tini tekrar baþlatmadan %s'i\n"
+	"yedeklemeniz gerekmektedir!\n"
+
+#: src/lang.c:807
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: Found %d '-- \\n' lines, this may confuse some people.\n"
+msgstr	"\n"
+	"Uyarý: Bulundu %d '-- \\n' satýrlar, bazý insanlarýn kafasý karýþabilir.\n"
+
+#: src/lang.c:808
+#, fuzzy, c-format
+msgid	"Warning: Only %d out of %d articles were saved"
+msgstr	"Uyarý: Sadece %d 'de %d makale kaydedildi"
+
+#: src/lang.c:809
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: Your signature  is longer than %d lines.  Since signatures usually "
+	"do\n"
+	"         not  transport any  useful information,  they should be as  short "
+	"as\n"
+	"         possible.\n"
+msgstr	"\n"
+	"Uyarý: Ýmzanýz %d satýrlarýndan daha uzun. Ýmzalar genellikle\n"
+	"         iþe yarar bilgi aktarmadýklarý için, olabildikleri kadar kýsa\n"
+	"        olmalýlar.\n"
+
+#: src/lang.c:813
+#, fuzzy, c-format
+msgid	"Warning: this mail address may contain a spamtrap. %s=continue, %s=abort? "
+msgstr	"Uyarý: bu posta adresinde mesaj yaðanaðý tuzaðý olabilir. %s=devam. %"
+	"s=durdur? "
+
+#: src/lang.c:814
+#, fuzzy
+msgid	"\n"
+	"Warning: Signatures should start with '-- \\n' not with '--\\n'.\n"
+msgstr	"\n"
+	"Uyarý: Ýmzalar '-- \\n' ile baþlamalý '--\\n' ile deðil.\n"
+
+#: src/lang.c:815
+#, fuzzy
+msgid	"Writing attributes file..."
+msgstr	"Öznitelikler dosylasýný yazýyor..."
+
+#: src/lang.c:817
+#, fuzzy, c-format
+msgid	"%d Responses"
+msgstr	"%d Yanýtlar"
+
+#: src/lang.c:819
+#, fuzzy, c-format
+msgid	"Added %d %s"
+msgstr	"Eklendi %d %s"
+
+#: src/lang.c:820
+#, fuzzy
+msgid	"No unsubscribed groups to show"
+msgstr	"Gösterilecek abonelikten çýkmýþ küme yok"
+
+#: src/lang.c:821
+#, fuzzy
+msgid	"Showing subscribed to groups only"
+msgstr	"Sadece abone kümeleri göster"
+
+#: src/lang.c:822
+#, fuzzy
+msgid	"Yes "
+msgstr	"Evet"
+
+#: src/lang.c:823
+#, fuzzy
+msgid	"    You have mail\n"
+msgstr	"     Postanýz var\n"
+
+#: src/lang.c:828
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: Posting is in %s and contains characters which are not\n"
+	"         in your selected MM_NETWORK_CHARSET: %s.\n"
+	"         These characters will be replaced by '?' if you post this\n"
+	"         article unchanged. To avoid garbling your article please either\n"
+	"         edit it and remove those characters or change the setting of\n"
+	"         MM_NETWORK_CHARSET to a suitable value for your posting via the\n"
+	"         M)enu option.\n"
+msgstr	"\n"
+	"Uyarý: Gönderim %s 'de ve seçtiðiniz\n"
+	"     MM_NETWORK_CHARSETte olmayan karakterler içeriyor: %s.\n"
+	"     Bu makaleyi deðiþtirmeden gönderirseniz bu karakterler '?' ile\n"
+	"    deðiþtirilecektir. Makalenizi karamþýklaþtýrmamak için\n"
+	"    düzenleyip karakterleri silin ya da  MM_NETWORK_CHARSET\n"
+	"    ayarlarýný M)enü seçeneði ile yollamak için daha uygun bir þekilde\n"
+	"    deðiþtirin.\n"
+
+#: src/lang.c:839
+#, fuzzy
+msgid	"  -D       debug mode 1=NNTP 2=ALL"
+msgstr	"  -D       hata ayýklma kipi 1=NNTP 2=HEPSÝ"
+
+#: src/lang.c:843
+#, fuzzy
+msgid	"Read carefully!\n"
+	"\n"
+	"  You are about to cancel an article seemingly not written by you.  This "
+	"will\n"
+	"  wipe the article from lots of news servers throughout the world;\n"
+	"  Usenet's majority  considers this  rather inappropriate,  to say the "
+	"least.\n"
+	"  Only press 'd'  if you are  absolutely positive  that you are ready to "
+	"take\n"
+	"  the rap.\n"
+	"\n"
+	"This is the article you are about to cancel:\n"
+	"\n"
+msgstr	"Dikkatle okuyun!\n"
+	"\n"
+	" Tarafýnýzdan yazýlmýþ olmayan bir makaleyi iptal etmek üzeresiniz. Bu\n"
+	" dünyadaki birçok sunucudan bu makaleyi silecektir;\n"
+	" en azýndan Usenet'in çoðunluðu bunu uygunsuz bulmaktadýr.\n"
+	" Bu eleþtiriyi almaya hazýr olduðunuzdan kesinlikle eminseniz\n"
+	" sadece 'd' ye basýn.\n"
+	"\n"
+	"Ýptal etmek üzere olduðunuz makale bu:\n"
+	"\n"
+
+#: src/lang.c:852
+#, fuzzy
+msgid	"toggle color"
+msgstr	"renk deðiþtir"
+
+#: src/lang.c:853
+msgid	"# Changing colors of several screen parts\n"
+	"# Possible values are:\n"
+	"#  -1 = default (white for foreground and black for background)\n"
+	"#   0 = black\n"
+	"#   1 = red\n"
+	"#   2 = green\n"
+	"#   3 = brown\n"
+	"#   4 = blue\n"
+	"#   5 = pink\n"
+	"#   6 = cyan\n"
+	"#   7 = white\n"
+	"# These are *only* for foreground:\n"
+	"#   8 = gray\n"
+	"#   9 = light red\n"
+	"#  10 = light green\n"
+	"#  11 = yellow\n"
+	"#  12 = light blue\n"
+	"#  13 = light pink\n"
+	"#  14 = light cyan\n"
+	"#  15 = light white\n"
+	"\n"
+msgstr	""
+
+#: src/lang.c:873
+#, fuzzy
+msgid	"  -a       toggle color flag"
+msgstr	"  -a       renk bayraðýný deðiþtir"
+
+#: src/lang.c:877
+#, fuzzy
+msgid	"\n"
+	"Error: Followup-To set to more than one newsgroup!\n"
+msgstr	"\n"
+	"Hata: Birden fazla haber grubu için Takip-Et ayarlandý!\n"
+
+#: src/lang.c:878
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: cross-posting to %d newsgroups and no Followup-To line!\n"
+msgstr	"\n"
+	"Hata: %d haber gruubuna çapraz gönderiyor ve Takip-Et satýrý yok!\n"
+
+#: src/lang.c:879
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: \"%s\" is not a valid newsgroup!\n"
+msgstr	"\n"
+	"Hata: \"%s\" geçerli bir haber grubu deðil!\n"
+
+#: src/lang.c:881
+#, fuzzy
+msgid	"\n"
+	"Warning: Followup-To set to more than one newsgroup!\n"
+msgstr	"\n"
+	"Uyarý: Birden fazla haber grubu için Takip-Et ayarlandý!\n"
+
+#: src/lang.c:882
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: cross-posting to %d newsgroups and no Followup-To line!\n"
+msgstr	"\n"
+	"Hata: %d haber gruubuna çapraz gönderiyor ve Takip-Et satýrý yok!\n"
+
+#: src/lang.c:883
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: \"%s\" is not in your newsrc, it may be invalid at this site!\n"
+msgstr	"\n"
+	"Uyarý:  \"%s\" sizin newsrc'niz deðil, bu sitede geçersiz olabilir!\n"
+
+#: src/lang.c:884
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: \"%s\" is not a valid newsgroup at this site!\n"
+msgstr	"\n"
+	"Uyaý:  \"%s\" bu sitede geçerli bir newsrc deðil!\n"
+
+#: src/lang.c:888
+#, fuzzy, c-format
+msgid	"%d files successfully written from %d articles. %d %s occurred."
+msgstr	"%d dosyalarý %d makalelerinden baþarýyla yazýldý. %d%s meydana geldi."
+
+#: src/lang.c:889
+#, fuzzy
+msgid	"Missing parts."
+msgstr	"Bazý yerler eksik."
+
+#: src/lang.c:890
+#, fuzzy
+msgid	"No beginning."
+msgstr	"Baþlangýç yok."
+
+#: src/lang.c:891
+#, fuzzy
+msgid	"No data."
+msgstr	"Veri yok."
+
+#: src/lang.c:892
+#, fuzzy
+msgid	"Unknown error."
+msgstr	"Bilinmeyen hata."
+
+#: src/lang.c:895
+#, fuzzy, c-format
+msgid	"\tChecksum of %s (%ld %s)"
+msgstr	"\tSaðlama toplamý %s (%ld %s)"
+
+#: src/lang.c:900
+#, fuzzy
+msgid	"Reading mail active file... "
+msgstr	"Posta aktif dosyasý okunuyor... "
+
+#: src/lang.c:901
+#, fuzzy
+msgid	"Reading mailgroups file... "
+msgstr	"Postagruplarý dosyasý okunuyor... "
+
+#: src/lang.c:905
+#, fuzzy
+msgid	"perform PGP operations on article"
+msgstr	"makalede PGP iþlemi gerçekleþtir"
+
+#: src/lang.c:906
+#, fuzzy
+msgid	"Add key(s) to public keyring?"
+msgstr	"Genel tuþhalkasýna tuþ(lar) ekle?"
+
+#: src/lang.c:907
+#, fuzzy, c-format
+msgid	"%s=encrypt, %s=sign, %s=both, %s=quit: "
+msgstr	"%s=þifrele, %s=imzala. %s=ikisi de, %s=çýk: "
+
+#: src/lang.c:908
+#, fuzzy, c-format
+msgid	"%s=sign, %s=sign & include public key, %s=quit: "
+msgstr	"%s=iþaretle, %s=imzala & genel tuþ dahil et, %s=çýk: "
+
+#: src/lang.c:909
+#, fuzzy, c-format
+msgid	"PGP has not been set up (can't open %s)"
+msgstr	"PGP ayarlanmadý (açýlamýyor %s)"
+
+#: src/lang.c:910
+#, fuzzy
+msgid	"Article not signed and no public keys found"
+msgstr	"Makale  imzalanmadý ve genel tuþlar bulunamadý"
+
+#: src/lang.c:912
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=çýk, %s=düzenle, %s=ispell, %s=pgp, %s=menü, %s=yolla, %s=ertele: "
+
+#: src/lang.c:913
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%s]: "
+msgstr	"%s=çýk, %s=düzenle, %s=ispell, %s=pgp, %s=gönder [%%s]: "
+
+#: src/lang.c:914
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=çýk, %s=düzenle, %s=ispell, %s=pgp, %s=menü, %s=yolla, %s=ertele [%%s]: "
+
+#: src/lang.c:916
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=çýk, %s=düzenle, %s=pgp, %s=menü, %s=yolla, %s=ertele: "
+
+#: src/lang.c:917
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=send [%%s]: "
+msgstr	"%s=çýk, %s=düzenle, %s=pgp, %s=gönder [%%s]: "
+
+#: src/lang.c:918
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=çýk, %s=düzenle, %s=pgp, %s=menü, %s=yolla, %s=ertele [%%]: "
+
+#: src/lang.c:922
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=çýk, %s=düzenle, %s=ispell, %s=menü, %s=yolla, %s=ertele: "
+
+#: src/lang.c:923
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=send [%%s]: "
+msgstr	"%s=çýk, %s=düzenle, %s=ispell, %s=yolla [%%s]: "
+
+#: src/lang.c:924
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=çýk, %s=düzenle, %s=ispell, %s=menü, %s=yolla, %s=ertele [%%s]: "
+
+#: src/lang.c:926
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone: "
+msgstr	"%s=çýk, %s=düzenle, %s=menü, %s=post, %s=ertele: "
+
+#: src/lang.c:927
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=send [%%s]: "
+msgstr	"%s=çýk, %s=düzenle, %s=gönder [%%s]: "
+
+#: src/lang.c:928
+#, fuzzy, c-format
+msgid	"%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%s]: "
+msgstr	"%s=çýk, %s=düzenle, %s=menü, %s=yolla, %s=ertele [%%s]: "
+
+#: src/lang.c:937
+#, fuzzy
+msgid	"Try cache_overview_files to speed up things.\n"
+msgstr	"Hýzlandýrmak için önbellek_giriþ_dosyalarýný deneyin.\n"
+
+#: src/lang.c:938
+#, fuzzy
+msgid	"Tin will use local index files instead.\n"
+msgstr	"Tin yerel dizin dosyalarýný kullanacak.\n"
+
+#: src/lang.c:939
+#, fuzzy
+msgid	"Cannot find NNTP server name"
+msgstr	"NNTP sunucu ismi bulunamadý"
+
+#: src/lang.c:940
+#, fuzzy, c-format
+msgid	"Connecting to %s:%d..."
+msgstr	"Baðlanýyor %s:%d..."
+
+#: src/lang.c:941
+#, fuzzy
+msgid	"Disconnecting from server...\n"
+msgstr	"Sunucu baðlantýsý kesildi...\n"
+
+#: src/lang.c:942
+#, fuzzy, c-format
+msgid	"Wrong newsgroup name in response of GROUP command, %s for %s"
+msgstr	"GRUP komut yanýtýnda yanlýþ haber grubu ismi. %s e %s"
+
+#: src/lang.c:943
+#, fuzzy, c-format
+msgid	"Failed to connect to NNTP server %s. Exiting..."
+msgstr	"NNTP sunucusuna baðlantý baþarýsýz %s. Çýkýyor..."
+
+#: src/lang.c:944
+#, fuzzy
+msgid	"205  Closing connection"
+msgstr	"205  Baðlantý kesiliyor"
+
+#: src/lang.c:945
+#, fuzzy
+msgid	"Your server does not support the NNTP XOVER or OVER command.\n"
+msgstr	"Sunucunuz NNTP XOVER ya da OVER komutunu desteklemiyor.\n"
+
+#: src/lang.c:946
+#, fuzzy
+msgid	"Connection to news server has timed out. Reconnect?"
+msgstr	"Haber sunucusu baðlantý süreniz doldu. Tekrar baðlan?"
+
+#: src/lang.c:947
+#, fuzzy, c-format
+msgid	"Put the server name in the file %s,\n"
+	"or set the environment variable NNTPSERVER"
+msgstr	"%s dosyasýna sunucu ismini girin,\n"
+	"ya da çevre deðiþkeni NNTPSERVERi ayarlayýn"
+
+#: src/lang.c:948
+#, fuzzy
+msgid	"  -A       force authentication on connect"
+msgstr	"  -A       baðlantýda doðrulamayý zorla"
+
+#: src/lang.c:949
+#, fuzzy, c-format
+msgid	"  -g serv  read news from NNTP server serv [default=%s]"
+msgstr	"  -g serv  NNTP sunucusundan haberleri oku serv [default=%s]"
+
+#: src/lang.c:950
+#, fuzzy, c-format
+msgid	"  -p port  use port as NNTP port [default=%d]"
+msgstr	"  -p port  baðlantý noktasýný NNTP gibi kullan port [default=%d]"
+
+#: src/lang.c:951
+#, fuzzy
+msgid	"  -Q       quick start. Same as -nqd"
+msgstr	"  -Q       hýzlý baþlat. -nqd ile ayný"
+
+#: src/lang.c:952
+#, fuzzy
+msgid	"  -l       use only LIST instead of GROUP (-n) command"
+msgstr	"  -l       GROUP (-n) komutu yerine sadece LIST i kullan"
+
+#: src/lang.c:953
+#, fuzzy
+msgid	"  -n       only read subscribed .newsrc groups from NNTP server"
+msgstr	"  -n       NNTP sunucusundan sadece abone newsrc gruplarýný oku"
+
+#: src/lang.c:955
+#, fuzzy, c-format
+msgid	"%s/tcp: Unknown service.\n"
+msgstr	"%s/tcp: Bilinmeyen servis.\n"
+
+#: src/lang.c:958
+#, fuzzy
+msgid	"\n"
+	"socket or connect problem\n"
+msgstr	"\n"
+	"socket ya da baðlantý hatasý\n"
+
+#: src/lang.c:960
+#, fuzzy, c-format
+msgid	"\n"
+	"Connection to %s: "
+msgstr	"\n"
+	"Baðlanýyor %s: "
+
+#: src/lang.c:961
+#, fuzzy
+msgid	"Giving up...\n"
+msgstr	"Pes ediliyor...\n"
+
+#: src/lang.c:964
+#, fuzzy
+msgid	"Your server does not have Xref: in its XOVER information.\n"
+	"Tin will try to use XHDR XREF instead (slows down things a bit).\n"
+msgstr	"Sunucunuzun XOVER bilgisinde Xref: yok.\n"
+	"Tin XHDR XREF kullanmayý deneyecek (biraz yavaþlatýr).\n"
+
+#: src/lang.c:967
+#, fuzzy
+msgid	"Your server does not have Xref: in its XOVER information.\n"
+msgstr	"Sunucunuzun XOVER bilgisinde Xref: yok.\n"
+
+#: src/lang.c:970
+#, fuzzy, c-format
+msgid	"Can't open %s. Try %s -r to read news via NNTP.\n"
+msgstr	"%s Açýlamýyor. NNTP aracýlýðýyla haber okumak için %s -r deneyin.\n"
+
+#: src/lang.c:973
+#, fuzzy
+msgid	"  -Q       quick start. Same as -qd"
+msgstr	"  -Q       hýzlý baþlat. -qd ile ayný"
+
+#: src/lang.c:974
+#, fuzzy
+msgid	"  -l       read only active file instead of scanning spool (-n) command"
+msgstr	"  -l       bekletme komutunu taramak yerine sadece aktif dosyayý okuyun"
+
+#: src/lang.c:975
+#, fuzzy
+msgid	"  -n       only read subscribed .newsrc groups from spool"
+msgstr	"  -n       'bekletme'den sadece abone newsrc gruplarý okuyun"
+
+#: src/lang.c:976
+#, fuzzy
+msgid	"Your server does not have Xref: in its NOV-files.\n"
+msgstr	"Sunucunuzun NOV-dosyalarýnda Xref:yok.\n"
+
+#: src/lang.c:980
+#, fuzzy
+msgid	"Posting using external inews failed. Use built in inews instead?"
+msgstr	"Dýþ inews kullanýlarak gönderme baþarýsýz. Yerine yerleþik inews kullanýlsýn "
+	"mý?"
+
+#: src/lang.c:981
+#, fuzzy
+msgid	"It worked! Should I always use my built in inews from now on?"
+msgstr	"Ýþe yaradý! Bundan sonra hep yerleþik inewslerimi mi kullanmalýyým?"
+
+#: src/lang.c:989
+#, fuzzy, c-format
+msgid	"%d %s printed"
+msgstr	"%d %s yazdýrýldý"
+
+#: src/lang.c:990
+#, fuzzy
+msgid	"output article/thread/hot/pattern/tagged articles to printer"
+msgstr	"çýkýþ makalesi/parçacýk/hot/örüntü/imlenmiþ makaleleri yazýcýya gönder"
+
+#: src/lang.c:991
+#, fuzzy
+msgid	"Print"
+msgstr	"Yazdýr"
+
+#: src/lang.c:992
+#, fuzzy
+msgid	"Printing..."
+msgstr	"Yazdýrýlýyor..."
+
+#: src/lang.c:996
+#, fuzzy
+msgid	"pipe article/thread/hot/pattern/tagged articles into command"
+msgstr	"kanal makale/parçacýk/hot/örüntü/imlenmiþ makaleleri komuta al"
+
+#: src/lang.c:997
+#, fuzzy
+msgid	"No command"
+msgstr	"Komut yok"
+
+#: src/lang.c:998
+#, fuzzy
+msgid	"Pipe"
+msgstr	"Kanal"
+
+#: src/lang.c:999
+#, fuzzy, c-format
+msgid	"Pipe to command [%.*s]> "
+msgstr	"Komut kanalý [%.*s]> "
+
+#: src/lang.c:1000
+#, fuzzy
+msgid	"Piping..."
+msgstr	"Yöneltiliyor..."
+
+#: src/lang.c:1002
+#, fuzzy
+msgid	"Piping not enabled."
+msgstr	"Yöneltme gerçekleþtirilemedi."
+
+#: src/lang.c:1006
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: The \"%s:\" line has spaces  in it that MUST be removed.\n"
+	"       The only allowable  space is the one  separating the colon (:)\n"
+	"       from  the  contents.  Use a  comma  (,)  to separate  multiple\n"
+	"       newsgroup names.\n"
+msgstr	"\n"
+	"Hata: \"%s:\" satýrýnda çýkarýlmasý gereken boþluklar var.\n"
+	"      Ýzin verilebilir tek boþluk iki noktayý(:) içerikten  ayýran\n"
+	"      boþluktur. Çoklu habergrubu isimlerini ayýrmak için\n"
+	"      virgül (,) kullanýn.\n"
+
+#: src/lang.c:1011
+#, fuzzy, c-format
+msgid	"\n"
+	"Error: The \"%s:\" line is  continued in  the next line.  Since\n"
+	"       the line  may not  contain  whitespace,  this is  not allowed.\n"
+	"       Please write all newsgroups into a single line.\n"
+msgstr	"\n"
+	"Hata: \"%s:\" satýrý bir sonraki satýrda devam ediyor. Satýrda\n"
+	"       beyazboþluk kullanýlamayacaðý için, buna izin verilmiyor.\n"
+	"       Lütfen bütün haber gruplarýný tek bir satýra yazýn.\n"
+
+#: src/lang.c:1016
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: The \"%s:\" line is continued in the next line.\n"
+	"         This is a very new feature and may not be accepted by all servers.\n"
+	"         To avoid trouble please write all newsgroups into a single line.\n"
+msgstr	"\n"
+	"Uyarý: \"%s:\" satýrý bir sonraki satýrda devam ediyor.\n"
+	"        Bu çok yeni bir öznitelik ve tüm sunucular tarafýndan kabul "
+	"edilmeyebilir.\n"
+	"        Herhangi bir sorunla karþýlaþmamak için bütün haber gruplarýný tek "
+	"bir satýra yazýn.\n"
+
+#: src/lang.c:1020
+#, fuzzy, c-format
+msgid	"\n"
+	"Warning: The \"%s:\" line has spaces in it that SHOULD be removed.\n"
+msgstr	"\n"
+	"Uyarý: \"%s:\" satýrýnda SÝLÝNMESÝ GEREKEN boþluklar var.\n"
+
+#: src/lang.c:1025
+#, fuzzy
+msgid	"\n"
+	"  If your article contains quoted text  please take some time to pare it "
+	"down\n"
+	"  to just the  key points to which you are  responding,  or people will "
+	"think\n"
+	"  you are a dweeb!  Many people have the habit of skipping any article  "
+	"whose\n"
+	"  first page is largely  quoted material.  Format your article to fit in "
+	"less\n"
+	"  then 80 chars,  since that's the conventional size  (72 is a good choice "
+	"as\n"
+	"  it allows quoting without exceeding the limit).  If your lines are too "
+	"long\n"
+	"  they'll wrap  around  ugly and  people won't  read what you  write.  If "
+	"you\n"
+	"  aren't  careful  and considerate  in  formatting  your posting, people  "
+	"are\n"
+	"  likely to ignore it completely.  It's a crowded net out there.\n"
+msgstr	"\n"
+	"  Makaleniz imlenmiþ metin içeriyorsa, karþýlýk verdiðiniz çözümleri\n"
+	" uygun hale getirmek için metni kýsaltýn, yoksa insanlar sizin bir ahmak "
+	"olduðunuzu\n"
+	" düþünür. Birçok insan ilk sayfasýnda uzunca bir imlenmiþ metin gördükleri "
+	"makaleleri\n"
+	" atlýyor. Makalenizi geleneksel olan 80 karakterden az tutacak þekilde "
+	"biçimlendirin\n"
+	" (72 sýnýrý aþmadan imlemeye izin verdiði için iyi bir seçim).  Satýrlarýnýz "
+	"fazla uzunsa\n"
+	" çirkin görünürler ve insanlar yazdýklarýnýzý okumazlar. Göndereceklerinizi "
+	"biçimlendirmede\n"
+	" dikkatli ve özenli olmazsanýz, insanlar onu tamamen yoksayarlar. Net oldukça "
+	"kalabalýk bir yer.\n"
+
+#: src/lang.c:1038
+#, fuzzy
+msgid	"shell escape"
+msgstr	"kabuk çýkýþý"
+
+#: src/lang.c:1039
+#, fuzzy, c-format
+msgid	"Shell Command (%s)"
+msgstr	"Kabuk Komutu (%s)"
+
+#: src/lang.c:1040
+#, fuzzy, c-format
+msgid	"Enter shell command [%s]> "
+msgstr	"Kabuk komutunu girin [%s]> "
+
+#: src/lang.c:1044
+#, fuzzy, c-format
+msgid	"%s: Can't get entry for TERM\n"
+msgstr	"%s: TERM için girdi alýnamýyor\n"
+
+#: src/lang.c:1048
+#, fuzzy, c-format
+msgid	"Group %.*s ('q' to quit)..."
+msgstr	"Grup %.*s (çýkmak için 'q')..."
+
+#: src/lang.c:1050
+#, fuzzy, c-format
+msgid	"Group %.*s..."
+msgstr	"Grup %.*s..."
+
+#: src/lang.c:1054
+#, fuzzy
+msgid	"Server unavailable\n"
+msgstr	"Sunucu kullanýlamýyor\n"
+
+#: src/lang.c:1060
+#, fuzzy, c-format
+msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %"
+	"s=post"
+msgstr	"%s=kanal, %s=posta; %s=yazdýr, %s=çýk, %s=hepsini deðiþtir/okunmayanlar; %"
+	"s=kaydet; %s=etiketle; %s=yolla"
+
+#: src/lang.c:1061
+#, fuzzy, c-format
+msgid	"%s=pipe; %s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
+msgstr	"%s=kanal; %s=posta; %s=yazdýr; %s=çýk; %s=cevap yaz; %s=kaydet; %s=etiketle; %"
+	"s=yolla"
+
+#: src/lang.c:1063
+#, fuzzy, c-format
+msgid	"%s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
+msgstr	"%s=posta; %s=yazdýr; %s=çýk; %s=hepsini deðiþtir/okunmayanlar; %s=kaydet; %"
+	"s=etiketle; %s=yolla"
+
+#: src/lang.c:1064
+#, fuzzy, c-format
+msgid	"%s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
+msgstr	"%s=posta; %s=yazdýr; %s=çýk; %s=cevap yaz; %s=kaydet; %s=etiketle; %s=yolla"
+
+#: src/lang.c:1068
+#, fuzzy, c-format
+msgid	"%s=pipe; %s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
+msgstr	"%s=kanal; %s=posta; %s=çýk; %s=hepsini deðiþtir/okunmayanlar; %s=kaydet; %"
+	"s=etiketle; %s=yolla"
+
+#: src/lang.c:1069
+#, fuzzy, c-format
+msgid	"%s=pipe; %s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
+msgstr	"%s=kanal; %s=posta; %s=çýk; %s=cevap yaz; %s=kaydet; %s=etiketle; %s=yolla"
+
+#: src/lang.c:1071
+#, fuzzy, c-format
+msgid	"%s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post"
+msgstr	"%s=posta; %s=çýk; %s=hepsini deðiþtir/okunmayanlar; %s=kaydet; %s=etiketle; %"
+	"s=yolla"
+
+#: src/lang.c:1072
+#, fuzzy, c-format
+msgid	"%s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post"
+msgstr	"%s=posta; %s=çýk; %s=cevap yaz; %s=kaydet; %s=etiketle; %s=yolla"
+
+#: src/lang.c:1078
+#, fuzzy
+msgid	"Terminal does not support color"
+msgstr	"Uçbirim renk desteklemiyor"
+
+#: src/lang.c:1083
+#, fuzzy, c-format
+msgid	"Trying %s"
+msgstr	"%s deneniyor"
+
+#: src/lang.c:1097 src/lang.c:1123 src/lang.c:1139 src/lang.c:1318 src/refs.c:296
+#, fuzzy
+msgid	"None"
+msgstr	"Hiçbiri"
+
+#: src/lang.c:1098
+#, fuzzy
+msgid	"Subject"
+msgstr	"Konu"
+
+#: src/lang.c:1099
+#, fuzzy
+msgid	"References"
+msgstr	"Kaynaklar"
+
+#: src/lang.c:1100
+#, fuzzy
+msgid	"Both Subject and References"
+msgstr	"Konu ve Kaynaklar"
+
+#: src/lang.c:1101
+#, fuzzy
+msgid	"Multipart Subject"
+msgstr	"Çoklu Konu"
+
+#: src/lang.c:1102
+msgid	"Percentage Match"
+msgstr	""
+
+#: src/lang.c:1114 src/lang.c:1225
+#, fuzzy
+msgid	"No"
+msgstr	"Hayýr"
+
+#: src/lang.c:1115 src/lang.c:1227
+#, fuzzy
+msgid	"Yes"
+msgstr	"Evet"
+
+#: src/lang.c:1116
+#, fuzzy
+msgid	"Hide All"
+msgstr	"Tümünü Sakla"
+
+#: src/lang.c:1124
+#, fuzzy
+msgid	"Address"
+msgstr	"Adres"
+
+#: src/lang.c:1125
+#, fuzzy
+msgid	"Full Name"
+msgstr	"Tüm Ýsim"
+
+#: src/lang.c:1126
+#, fuzzy
+msgid	"Address and Name"
+msgstr	"Adres ve Ýsim"
+
+#: src/lang.c:1133
+#, fuzzy
+msgid	"Max"
+msgstr	"En Çok"
+
+#: src/lang.c:1134
+#, fuzzy
+msgid	"Sum"
+msgstr	"Toplam"
+
+#: src/lang.c:1135
+#, fuzzy
+msgid	"Average"
+msgstr	"Ortalama"
+
+#: src/lang.c:1140
+#, fuzzy
+msgid	"Lines"
+msgstr	"Çizgiler"
+
+#: src/lang.c:1141
+#, fuzzy
+msgid	"Score"
+msgstr	"Skorlar"
+
+#: src/lang.c:1142
+#, fuzzy
+msgid	"Lines & Score"
+msgstr	"Satýrlar & Skorlar"
+
+#: src/lang.c:1151
+#, fuzzy
+msgid	"Black"
+msgstr	"Siyah"
+
+#: src/lang.c:1152
+#, fuzzy
+msgid	"Red"
+msgstr	"Kýrmýzý"
+
+#: src/lang.c:1153
+#, fuzzy
+msgid	"Green"
+msgstr	"Yeþil"
+
+#: src/lang.c:1154
+#, fuzzy
+msgid	"Brown"
+msgstr	"Kahverengi"
+
+#: src/lang.c:1155
+#, fuzzy
+msgid	"Blue"
+msgstr	"Mavi"
+
+#: src/lang.c:1156
+#, fuzzy
+msgid	"Pink"
+msgstr	"Pembe"
+
+#: src/lang.c:1157
+#, fuzzy
+msgid	"Cyan"
+msgstr	"Camgöbeði"
+
+#: src/lang.c:1158
+#, fuzzy
+msgid	"White"
+msgstr	"Beyaz"
+
+#: src/lang.c:1159
+#, fuzzy
+msgid	"Gray"
+msgstr	"Gri"
+
+#: src/lang.c:1160
+#, fuzzy
+msgid	"Light Red"
+msgstr	"Açýk Kýrmýzý"
+
+#: src/lang.c:1161
+#, fuzzy
+msgid	"Light Green"
+msgstr	"Açýk Yeþil"
+
+#: src/lang.c:1162
+#, fuzzy
+msgid	"Yellow"
+msgstr	"Sarý"
+
+#: src/lang.c:1163
+#, fuzzy
+msgid	"Light Blue"
+msgstr	"Açýk Mavi"
+
+#: src/lang.c:1164
+#, fuzzy
+msgid	"Light Pink"
+msgstr	"Açýk Pembe"
+
+#: src/lang.c:1165
+#, fuzzy
+msgid	"Light Cyan"
+msgstr	"Açýk Camgöbeði"
+
+#: src/lang.c:1166
+#, fuzzy
+msgid	"Light White"
+msgstr	"Açýk Beyaz"
+
+#: src/lang.c:1174 src/lang.c:1231 src/lang.c:1245
+#, fuzzy
+msgid	"Nothing"
+msgstr	"Hiçbirþey"
+
+#: src/lang.c:1175
+#, fuzzy
+msgid	"Mark"
+msgstr	"Ýþaretle"
+
+#: src/lang.c:1176
+#, fuzzy
+msgid	"Space"
+msgstr	"Boþluk"
+
+#: src/lang.c:1183
+#, fuzzy
+msgid	"Normal"
+msgstr	"Normal"
+
+#: src/lang.c:1184
+#, fuzzy
+msgid	"Best highlighting"
+msgstr	"En iyi vurgulama"
+
+#: src/lang.c:1185
+#, fuzzy
+msgid	"Underline"
+msgstr	"Alt çizgi"
+
+#: src/lang.c:1186
+#, fuzzy
+msgid	"Reverse video"
+msgstr	"Tes görüntü"
+
+#: src/lang.c:1187
+#, fuzzy
+msgid	"Blinking"
+msgstr	"Yanýp sönme"
+
+#: src/lang.c:1188
+#, fuzzy
+msgid	"Half bright"
+msgstr	"Yarý parlak"
+
+#: src/lang.c:1189
+#, fuzzy
+msgid	"Bold"
+msgstr	"Kalýn"
+
+#: src/lang.c:1194
+#, fuzzy
+msgid	"none"
+msgstr	"hiçbiri"
+
+#: src/lang.c:1195
+#, fuzzy
+msgid	"commands"
+msgstr	"komutlar"
+
+#: src/lang.c:1196
+#, fuzzy
+msgid	"select"
+msgstr	"seç"
+
+#: src/lang.c:1198
+#, fuzzy
+msgid	"commands & quit"
+msgstr	"komutlar & çýk"
+
+#: src/lang.c:1199
+#, fuzzy
+msgid	"commands & select"
+msgstr	"komutlar & seç"
+
+#: src/lang.c:1200
+#, fuzzy
+msgid	"quit & select"
+msgstr	"çýk & seç"
+
+#: src/lang.c:1201
+#, fuzzy
+msgid	"commands & quit & select"
+msgstr	"komutlar & çýk & seç"
+
+#: src/lang.c:1226
+#, fuzzy
+msgid	"Shell archive"
+msgstr	"kabuk arþivi"
+
+#: src/lang.c:1232
+#, fuzzy
+msgid	"Subject: (descending)"
+msgstr	"Konu: (alçalan)"
+
+#: src/lang.c:1233
+#, fuzzy
+msgid	"Subject: (ascending)"
+msgstr	"Konu: (yükselen)"
+
+#: src/lang.c:1234
+#, fuzzy
+msgid	"From: (descending)"
+msgstr	"Gönderen: (alçalan)"
+
+#: src/lang.c:1235
+#, fuzzy
+msgid	"From: (ascending)"
+msgstr	"Gönderen: (yükselen)"
+
+#: src/lang.c:1236
+#, fuzzy
+msgid	"Date: (descending)"
+msgstr	"Tarih: (alçalan)"
+
+#: src/lang.c:1237
+#, fuzzy
+msgid	"Date: (ascending)"
+msgstr	"Tarih: (yükselen)"
+
+#: src/lang.c:1238 src/lang.c:1246
+#, fuzzy
+msgid	"Score (descending)"
+msgstr	"Skor: (alçalan)"
+
+#: src/lang.c:1239 src/lang.c:1247
+#, fuzzy
+msgid	"Score (ascending)"
+msgstr	"Skor: (yükselen)"
+
+#: src/lang.c:1240
+#, fuzzy
+msgid	"Lines: (descending)"
+msgstr	"Satýrlar: (alçalan)"
+
+#: src/lang.c:1241
+#, fuzzy
+msgid	"Lines: (ascending)"
+msgstr	"Satýrlar: (yükselen)"
+
+#: src/lang.c:1252
+#, fuzzy
+msgid	"Always Keep"
+msgstr	"Hep Sakla"
+
+#: src/lang.c:1253
+#, fuzzy
+msgid	"Always Remove"
+msgstr	"Hep Kaldýr"
+
+#: src/lang.c:1254
+#, fuzzy
+msgid	"Mark with D on selection screen"
+msgstr	"Seçenek ekranýnda D ile iþaretle"
+
+#: src/lang.c:1259
+#, fuzzy
+msgid	"Kill only unread arts"
+msgstr	"Sadece okunmayan makaleleri yok et"
+
+#: src/lang.c:1260
+#, fuzzy
+msgid	"Kill all arts & show with K"
+msgstr	"Tüm makaleleri yok et & K ile göster"
+
+#  TODO: s/K/art_marked_killed/
+#. TODO: s/K/art_marked_killed/
+#: src/lang.c:1261
+#, fuzzy
+msgid	"Kill all arts and never show"
+msgstr	"Tüm makaleleri yok et ve asla gösterme"
+
+#: src/lang.c:1266
+#, fuzzy
+msgid	"Nothing special"
+msgstr	"Özel birþey yok"
+
+#: src/lang.c:1267
+#, fuzzy
+msgid	"Compress quotes"
+msgstr	"Ýmleri sýkýþtýr"
+
+#: src/lang.c:1268
+#, fuzzy
+msgid	"Quote signatures"
+msgstr	"Ýmzalarý imle"
+
+#: src/lang.c:1269
+#, fuzzy
+msgid	"Compress quotes, quote sigs"
+msgstr	"Ýmleri sýkýþtýr, imzalarý imle"
+
+#: src/lang.c:1270
+#, fuzzy
+msgid	"Quote empty lines"
+msgstr	"Boþ satýrlarý imle"
+
+#: src/lang.c:1271
+#, fuzzy
+msgid	"Compress quotes, quote empty lines"
+msgstr	"Ýmleri sýkýþtýr, boþ satýrlarý imle"
+
+#: src/lang.c:1272
+#, fuzzy
+msgid	"Quote sigs & empty lines"
+msgstr	"Ýmzalarý & boþ satýrlarý imle"
+
+#: src/lang.c:1273
+#, fuzzy
+msgid	"Comp. q., quote sigs & empty lines"
+msgstr	"Ýmleri sýkýþtýr, imzalarý & boþ satýrlarý imle"
+
+#: src/lang.c:1311
+#, fuzzy
+msgid	"no"
+msgstr	"hiçbiri"
+
+#: src/lang.c:1312
+#, fuzzy
+msgid	"with headers"
+msgstr	"en küçük yürütme birimleri"
+
+#: src/lang.c:1313
+msgid	"without headers"
+msgstr	""
+
+#: src/lang.c:1320 src/lang.c:1326
+msgid	"NFKC"
+msgstr	""
+
+#: src/lang.c:1321
+msgid	"NFKD"
+msgstr	""
+
+#: src/lang.c:1322
+msgid	"NFC"
+msgstr	""
+
+#: src/lang.c:1323
+msgid	"NFD"
+msgstr	""
+
+#: src/lang.c:1334
+#, fuzzy
+msgid	"Display Options"
+msgstr	"Seçenekleri Göster"
+
+#: src/lang.c:1341
+#, fuzzy
+msgid	"Color Options"
+msgstr	"Renk Seçenekleri"
+
+#: src/lang.c:1348
+#, fuzzy
+msgid	"Article-Limiting Options"
+msgstr	"Makale-Sýnýrlandýrma Seçenekleri"
+
+#: src/lang.c:1354
+#, fuzzy
+msgid	"Posting/Mailing Options"
+msgstr	"Yollama/Postalama Seçenekleri"
+
+#: src/lang.c:1360
+#, fuzzy
+msgid	"Saving/Printing Options"
+msgstr	"Kaydetme/Yazdýrma Seçenekleri"
+
+#: src/lang.c:1366
+#, fuzzy
+msgid	"Expert Options"
+msgstr	"Uzman Seçenekleri"
+
+#: src/lang.c:1372
+#, fuzzy
+msgid	"Filtering Options"
+msgstr	"Süzgeçleme Seçenekleri"
+
+#: src/lang.c:1377 src/lang.c:1408 src/lang.c:1414 src/lang.c:1440 src/lang.c:1490
+#: src/lang.c:1496 src/lang.c:1506 src/lang.c:1526 src/lang.c:1601 src/lang.c:1771
+#: src/lang.c:1777 src/lang.c:1783 src/lang.c:1789 src/lang.c:1801 src/lang.c:1808
+#: src/lang.c:1862 src/lang.c:1871 src/lang.c:1877 src/lang.c:1884 src/lang.c:1891
+#: src/lang.c:1898 src/lang.c:1905 src/lang.c:1912 src/lang.c:1919 src/lang.c:1926
+#: src/lang.c:1933 src/lang.c:1940 src/lang.c:1947 src/lang.c:1954 src/lang.c:1961
+#: src/lang.c:1968 src/lang.c:1975 src/lang.c:1982 src/lang.c:1989 src/lang.c:1996
+#: src/lang.c:2003 src/lang.c:2010 src/lang.c:2017 src/lang.c:2024 src/lang.c:2031
+#: src/lang.c:2039 src/lang.c:2055 src/lang.c:2062 src/lang.c:2069 src/lang.c:2076
+#: src/lang.c:2082 src/lang.c:2088 src/lang.c:2105 src/lang.c:2117 src/lang.c:2151
+#: src/lang.c:2204 src/lang.c:2211 src/lang.c:2217 src/lang.c:2242 src/lang.c:2259
+#: src/lang.c:2312 src/lang.c:2348 src/lang.c:2368 src/lang.c:2403 src/lang.c:2413
+#: src/lang.c:2438 src/lang.c:2454 src/lang.c:2473 src/lang.c:2486
+#, fuzzy
+msgid	"<SPACE> toggles, <CR> sets, <ESC> cancels."
+msgstr	"<SPACE> deðiþtirir, <CR> ayarlar, <ESC> iptal eder."
+
+#: src/lang.c:1378
+#, fuzzy
+msgid	"Show mini menu & posting etiquette"
+msgstr	"Mini menüyü & yollama etiketini göster"
+
+#: src/lang.c:1379
+#, fuzzy
+msgid	"# If ON show a mini menu of useful commands at each level\n"
+	"# and posting etiquette after composing an article\n"
+msgstr	"# ON durumundaysa makale oluþturduktan sonra tüm düzeylerde kullanýþlý "
+	"komutlarýn\n"
+	"# mini menüsünü ve yollama etiketini göster.\n"
+
+#: src/lang.c:1384
+#, fuzzy
+msgid	"Show short description for each newsgroup. <SPACE> toggles & <CR> sets."
+msgstr	"Her haber grubu için kýsa açýklama göster. <SPACE> deðiþtirir & <CR> ayarlar."
+
+#: src/lang.c:1385
+#, fuzzy
+msgid	"Show description of each newsgroup"
+msgstr	"Her haber grubu için açýklama göster"
+
+#: src/lang.c:1386
+#, fuzzy
+msgid	"# If ON show group description text after newsgroup name at\n"
+	"# group selection level\n"
+msgstr	"# ON durumundaysa grup seçim düzeyindeki haber grubu isiminden sonraki\n"
+	"# grup açýklama metnini göster.\n"
+
+#: src/lang.c:1391
+#, fuzzy
+msgid	"Show Subject & From (author) fields in group menu. <SPACE> toggles & <CR> "
+	"sets."
+msgstr	"Grup menüsünde Konu & Gönderen (yazar) alanlarýný göster. <SPACE> deðiþtirir "
+	"& <CR> ayarlar."
+
+#: src/lang.c:1392
+#, fuzzy
+msgid	"In group menu, show author by"
+msgstr	"Grup menüsünde yazarý þuna göre göster"
+
+#: src/lang.c:1393
+#, fuzzy
+msgid	"# Part of from field to display\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = none\n"
+	"#   1 = address\n"
+	"# * 2 = full name\n"
+	"#   3 = both\n"
+msgstr	"# Gösterilecek gönderen alan kýsýmlarý 0)hiç 1)adres 2) tüm isim 3) hepsi\n"
+
+#: src/lang.c:1402
+#, fuzzy
+msgid	"Draw -> or highlighted bar for selection. <SPACE> toggles & <CR> sets."
+msgstr	"Çiz -> ya da seçim için vurgulanmýþ çubuk. <SPACE> deðiþtirir & <CR> ayarlar."
+
+#: src/lang.c:1403
+#, fuzzy
+msgid	"Draw -> instead of highlighted bar"
+msgstr	"Çiz -> vurgulanmýþ çubuk yerine"
+
+#: src/lang.c:1404
+#, fuzzy
+msgid	"# If ON use -> otherwise highlighted bar for selection\n"
+msgstr	"# ON durumundaysa -> deðilse seçim için vurgulanmýþ çubuk\n"
+
+#: src/lang.c:1409
+#, fuzzy
+msgid	"Use inverse video for page headers"
+msgstr	"Sayfa baþlýklarý için ters görüntü kullan"
+
+#: src/lang.c:1410
+#, fuzzy
+msgid	"# If ON use inverse video for page headers at different levels\n"
+msgstr	"# ON durumundaysa farklý düzeyde sayfa baþlýklarý için ters görüntü kullan\n"
+
+#: src/lang.c:1415
+#, fuzzy
+msgid	"Thread articles by"
+msgstr	"Makaleleri belirle"
+
+#: src/lang.c:1416
+msgid	"# Thread articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject\n"
+	"#   2 = References\n"
+	"# * 3 = Both (Subject and References)\n"
+	"#   4 = Multipart Subject\n"
+	"#   5 = Percentage Match\n"
+msgstr	""
+
+#: src/lang.c:1427
+msgid	"Enter percentage match required to thread together. <CR> sets."
+msgstr	""
+
+#: src/lang.c:1428
+msgid	"Thread percentage match"
+msgstr	""
+
+#: src/lang.c:1429
+#, c-format
+msgid	"# Thread percentage match...\n"
+	"# the percentage of characters in the subject of an article that must match\n"
+	"# a base article for both those articles to be considered to belong to the\n"
+	"# same thread. This option is an integer percentage, eg. 80, no decimals may\n"
+	"# follow. If 80 is used here, then 80%% of the characters must match "
+	"exactly,\n"
+	"# no insertion of a character, for the two articles to be put in the same\n"
+	"# thread. eg. 'happy' and 'harpy' would match, but 'harpie', 'happie' and\n"
+	"# 'harppy' would be threaded separately from 'happy'\n"
+msgstr	""
+
+#: src/lang.c:1441
+#, fuzzy
+msgid	"Score of a thread"
+msgstr	"Bir iþ parçacýðýnýn skoru"
+
+#: src/lang.c:1442
+msgid	"# Thread score\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = max\n"
+	"#   1 = sum\n"
+	"#   2 = average\n"
+msgstr	""
+
+#: src/lang.c:1450
+#, fuzzy
+msgid	"Sort articles by Subject, From, Date or Score. <SPACE> toggles & <CR> sets."
+msgstr	"Makaleleri Konu,Gönderen,Tarih ya da Skora göre sýrala. <SPACE> deðiþtirir & "
+	"<CR> ayarlar."
+
+#: src/lang.c:1451
+#, fuzzy
+msgid	"Sort articles by"
+msgstr	"Makaleleri sýrala"
+
+#: src/lang.c:1452
+#, fuzzy
+msgid	"# Sort articles by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"#   1 = Subject descending\n"
+	"#   2 = Subject ascending\n"
+	"#   3 = From descending\n"
+	"#   4 = From ascending\n"
+	"#   5 = Date descending\n"
+	"# * 6 = Date ascending\n"
+	"#   7 = Score descending\n"
+	"#   8 = Score ascending\n"
+	"#   9 = Lines descending\n"
+	"#  10 = Lines ascending\n"
+msgstr	"# Makaleleri sýrala 0=(hiçbirþey) 1=(Konu azalmasý) 2=(Konu yükselmesi)\n"
+	"# 3=(Gönderen azalmasý) 4=(Gönderen yükselmesi) 5=(Tarih azalmasý) 6=(Tarih "
+	"yükselmesi)\n"
+	"# 7=(Skor azalmasý) 8=(Skor yükselmesi) 9=(Satýrlar azalmasý) 10=(Satýrlar "
+	"yükselmesi).\n"
+
+#: src/lang.c:1468
+#, fuzzy
+msgid	"Sort threads by Nothing or Score. <SPACE> toggles & <CR> sets."
+msgstr	"Ýþ parçacýklarýný Hiçbirþeye ya da skora göre sýrala. <SPACE> deðiþtirir & "
+	"<CR> ayarlar."
+
+#: src/lang.c:1469
+#, fuzzy
+msgid	"Sort threads by"
+msgstr	"Ýþ parçacýklarýný sýrala"
+
+#: src/lang.c:1470
+msgid	"# Sort thread by ...\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = Score descending\n"
+	"#   2 = Score ascending\n"
+msgstr	""
+
+#: src/lang.c:1478
+#, fuzzy
+msgid	"Put cursor at first/last unread art in groups. <SPACE> toggles & <CR> sets."
+msgstr	"Ýmleci gruplardaki ilk/son okunmamýþ makalelere koyun. <SPACE> deðiþtirir & "
+	"<CR> ayarlar."
+
+#: src/lang.c:1479
+#, fuzzy
+msgid	"Goto first unread article in group"
+msgstr	"Gruptaki ilk okunmamýþ makaleye git"
+
+#: src/lang.c:1480
+#, fuzzy
+msgid	"# If ON put cursor at first unread art in group otherwise last art\n"
+msgstr	"# ON durumundaysa imleci ilk okunmamýþ makeleye, deðilse son makeleye koy.\n"
+
+#: src/lang.c:1484
+#, fuzzy
+msgid	"Show all articles or only unread articles. <SPACE> toggles & <CR> sets."
+msgstr	"Tüm makaleleri ya da sadece okunmayan makaleleri göster.<SPACE> deðiþtirir & "
+	"<CR> ayarlar."
+
+#: src/lang.c:1485
+#, fuzzy
+msgid	"Show only unread articles"
+msgstr	"Sadece okunmayan makaleleri göster"
+
+#: src/lang.c:1486
+#, fuzzy
+msgid	"# If ON show only new/unread articles otherwise show all.\n"
+msgstr	"# ON durumundaysa sadece yeni/okunmamýþ makaleleri, deðilse hepsini göster.\n"
+
+#: src/lang.c:1491
+#, fuzzy
+msgid	"Show only groups with unread arts"
+msgstr	"Sadece okunmamýþ makale olan gruplarý göster"
+
+#: src/lang.c:1492
+#, fuzzy
+msgid	"# If ON show only subscribed to groups that contain unread articles.\n"
+msgstr	"# ON durumundaysa sadece abone olunup okunmamýþ makaler içerem gruplarý "
+	"göster.\n"
+
+#: src/lang.c:1497
+#, fuzzy
+msgid	"Filter which articles"
+msgstr	"Hangi makaleleri filtrele"
+
+#: src/lang.c:1498
+#, fuzzy
+msgid	"# Filter which articles\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = only kill unread articles\n"
+	"#   1 = kill all articles and show in threads marked with K\n"
+	"#   2 = kill all articles and never show them\n"
+msgstr	"# 0=(Sadece okunmamýþ makaleleri yok et)\n"
+	"# 1=(Tüm makalerleri yok et ve K ile iþaretlenmiþ parçaýk olarak göster)\n"
+	"# 2=(Tüm makaleleri yok et ve bir daha gösterme].\n"
+
+#: src/lang.c:1507
+#, fuzzy
+msgid	"Tab goes to next unread article"
+msgstr	"Sekme sonraki okunmamýþ makaleye gider"
+
+#: src/lang.c:1508
+#, fuzzy
+msgid	"# If ON the TAB command will go to next unread article at article viewer "
+	"level\n"
+msgstr	"# ON durumundaysa TAB komutu makale görüntüleyici düzeyinde sonraki okunmamýþ "
+	"makaleye gider\n"
+
+#: src/lang.c:1512
+#, fuzzy
+msgid	"Scrolling with <SPACE> past the end of an art. jumps to the next unread one."
+msgstr	"Bir makalenin sonundan sonra <SPACE> ile kaydýrma bir sonraki okunmamýþ "
+	"makaleye atlar."
+
+#: src/lang.c:1513
+#, fuzzy
+msgid	"Space goes to next unread article"
+msgstr	"Boþluk sonraki okunmamýþ makaleye gider"
+
+#: src/lang.c:1514
+#, fuzzy
+msgid	"# If ON the SPACE command will go to next unread article at article viewer\n"
+	"# level when the end of the article is reached (rn-style pager)\n"
+msgstr	"# ON durumundaysa makalenin sonuna gelindiðinde SPACE komutu makale "
+	"görüntüleyici # düzeyinde sonraki okunmamýþ makaleye gider\n"
+
+#: src/lang.c:1519
+#, fuzzy
+msgid	"Scrolling with <PGDN>/<DOWN> past the end of an art. jumps to the unread one."
+msgstr	"Makalenin sonundan sonra <PGDN>/<DOWN> ile kaydýrma bir sonraki makaleye "
+	"atlar."
+
+#: src/lang.c:1520
+#, fuzzy
+msgid	"PgDn goes to next unread article"
+msgstr	"PgDn sonraki okunmamýþ makaleye gider"
+
+#: src/lang.c:1521
+#, fuzzy
+msgid	"# If ON the PGDN or DOWN command will go to next unread article when\n"
+	"# pressed at end of message\n"
+msgstr	"# ON durumundaysa PGDN ya da DOWN komutu iletinin sonunda\n"
+	"# basýldýðýnda sonraki okunmamýþ makaleye gider\n"
+
+#: src/lang.c:1527
+#, fuzzy
+msgid	"List thread using right arrow key"
+msgstr	"Sað ok tuþuna basarak parçacýklarý listele"
+
+#: src/lang.c:1528
+#, fuzzy
+msgid	"# If ON automatically list thread when entering it using right arrow key.\n"
+msgstr	"# ON durumundaysa parçacýklarý sað ok tuþunu kullanarak girerken otomatik "
+	"olarak listele.\n"
+
+#: src/lang.c:1532
+#, fuzzy
+msgid	"Enter character to indicate deleted articles. <CR> sets, <ESC> cancels."
+msgstr	"Silinmiþ makaleleri göstermek için karakter giriniz. <CR> ayarlar, <ESC> "
+	"iptal eder."
+
+#: src/lang.c:1533
+#, fuzzy
+msgid	"Character to show deleted articles"
+msgstr	"Silinmiþ makaleleri gösterecek olan karakter"
+
+#: src/lang.c:1534
+#, fuzzy
+msgid	"# Character used to show that an art was deleted (default 'D')\n"
+	"# _ is turned into ' '\n"
+msgstr	"# Makalenin silindiðini göstermek için kullanýlan karakter (varsayýlan 'D')\n"
+	"# _ þuna dönüþür ' '\n"
+
+#: src/lang.c:1539
+#, fuzzy
+msgid	"Enter character to indicate articles in a range. <CR> sets, <ESC> cancels."
+msgstr	"Sýralanmýþ makaleleri imlemek için karakter girin. <CR> ayarlar, <ESC> iptal "
+	"eder."
+
+#: src/lang.c:1540
+#, fuzzy
+msgid	"Character to show inrange articles"
+msgstr	"Sýralanmýþ makaleleri gösterecek olan karakter"
+
+#: src/lang.c:1541
+#, fuzzy
+msgid	"# Character used to show that an art is in a range (default '#')\n"
+	"# _ is turned into ' '\n"
+msgstr	"# Bir makalenin sýralanmýþ olduðunu göstermek için kullanýlan karakter "
+	"(varsayýlan '#')\n"
+	"# _ þuna dönüþür ' '\n"
+
+#: src/lang.c:1546
+#, fuzzy
+msgid	"Enter character to indicate that article will return. <CR> sets, <ESC> "
+	"cancels."
+msgstr	"Makalenin döneceðini göstermek için karakter girin. <CR> ayarlar, <ESC> iptal "
+	"eder."
+
+#: src/lang.c:1547
+#, fuzzy
+msgid	"Character to show returning arts"
+msgstr	"Dönen makaleleri gösterecek olan karakter"
+
+#: src/lang.c:1548
+#, fuzzy
+msgid	"# Character used to show that an art will return (default '-')\n"
+	"# _ is turned into ' '\n"
+msgstr	"# Bir makalenin döneceðini göstermek için kullanýlan karakter (varsayýlan "
+	"'-')\n"
+	"# _ þuna dönüþür ' '\n"
+
+#: src/lang.c:1553
+#, fuzzy
+msgid	"Enter character to indicate selected articles. <CR> sets, <ESC> cancels."
+msgstr	"Seçilen makaleleri imlemek için karakter girin. <CR> ayarlar, <ESC> iptal "
+	"eder."
+
+#: src/lang.c:1554
+#, fuzzy
+msgid	"Character to show selected articles"
+msgstr	"Seçilen makaleleri gösterecek olan karakter"
+
+#: src/lang.c:1555
+#, fuzzy
+msgid	"# Character used to show that an art was auto-selected (default '*')\n"
+	"# _ is turned into ' '\n"
+msgstr	"# Bir makalenin otomatik seçildiðini göstermek için kullanýlan karakter "
+	"(varsayýlan '*')\n"
+	"# _ þuna dönüþür ' '\n"
+
+#: src/lang.c:1560
+#, fuzzy
+msgid	"Enter character to indicate recent articles. <CR> sets, <ESC> cancels."
+msgstr	"Son makaleleri imlemek için karakter girin. <CR> ayarlar, <ESC> iptal eder."
+
+#: src/lang.c:1561
+#, fuzzy
+msgid	"Character to show recent articles"
+msgstr	"Son makaleleri gösterecek olan karakter"
+
+#: src/lang.c:1562
+#, fuzzy
+msgid	"# Character used to show that an art is recent (default 'o')\n"
+	"# _ is turned into ' '\n"
+msgstr	"# Bir makalenin son olduðunu göstermek için kullanýlan karakter (varsayýlan "
+	"'o')\n"
+	"# _ þuna dönüþür ' '\n"
+
+#: src/lang.c:1567
+#, fuzzy
+msgid	"Enter character to indicate unread articles. <CR> sets, <ESC> cancels."
+msgstr	"Okunmamýþ makaleleri imlemek için karakter girin. <CR> ayarlar, <ESC> iptal "
+	"eder."
+
+#: src/lang.c:1568
+#, fuzzy
+msgid	"Character to show unread articles"
+msgstr	"Okunmamýþ makaleleri gösterecek olan karakter"
+
+#: src/lang.c:1569
+#, fuzzy
+msgid	"# Character used to show that an art is unread (default '+')\n"
+	"# _ is turned into ' '\n"
+msgstr	"# Bir makalenin okunmadýðýný göstermek için kullanýlan karakter (varsayýlan "
+	"'+')\n"
+	"# _ þuna dönüþür ' '\n"
+
+#: src/lang.c:1574
+#, fuzzy
+msgid	"Enter character to indicate read articles. <CR> sets, <ESC> cancels."
+msgstr	"Okunan makaleleri imlemek için karakter girin. <CR> yarlar, <ESC> iptal eder."
+
+#: src/lang.c:1575
+#, fuzzy
+msgid	"Character to show read articles"
+msgstr	"Okunmamýþ makaleleri gösterecek olan karakter"
+
+#: src/lang.c:1576
+#, fuzzy
+msgid	"# Character used to show that an art was read (default ' ')\n"
+	"# _ is turned into ' '\n"
+msgstr	"# Bir makalenin okunduðunu göstermek için kullanýlan karakter (varsayýlan ' "
+	"')\n"
+	"# _ þuna dönüþür ' '\n"
+
+#: src/lang.c:1581
+#, fuzzy
+msgid	"Enter character to indicate killed articles. <CR> sets, <ESC> cancels."
+msgstr	"Yok olan makaleleri imlemek için karakter girin. <CR> ayarlar, <ESC> iptal "
+	"eder."
+
+#: src/lang.c:1582
+#, fuzzy
+msgid	"Character to show killed articles"
+msgstr	"Yok olan makaleleri gösterecen karakter"
+
+#: src/lang.c:1583
+#, fuzzy
+msgid	"# Character used to show that an art was killed (default 'K')\n"
+	"# kill_level must be set accordingly, _ is turned into ' '\n"
+msgstr	"# Bir makalenin yok olduðunu göstermek için kullanýlan karakter (varsayýlan "
+	"'K')\n"
+	"# yok olma düzeyi ona göre ayarlanmalýdýr, _ þuna dönüþür ' '\n"
+
+#: src/lang.c:1588
+#, fuzzy
+msgid	"Enter character to indicate read selected articles. <CR> sets, <ESC> cancels."
+msgstr	"Okunmuþ-seçilmiþ makaleleri imlemek için karakter girin. <CR> ayarlar, <ESC> "
+	"iptal eder."
+
+#: src/lang.c:1589
+#, fuzzy
+msgid	"Character to show readselected arts"
+msgstr	"Okunmuþ-seçilmiþ makaleleri gösteren karakter"
+
+#: src/lang.c:1590
+#, fuzzy
+msgid	"# Character used to show that an art was selected before read (default ':')\n"
+	"# kill_level must be set accordingly, _ is turned into ' '\n"
+msgstr	"# Bir makalenin okunmadan seçildiðini göstermek için kullanýlan karakter "
+	"(varsayýlan ':')\n"
+	"# yok olma düzeyi ona göre ayarlanmalýdýr, _ þuna dönüþür ' '\n"
+
+#: src/lang.c:1595
+#, fuzzy
+msgid	"Enter maximum length of newsgroup names displayed. <CR> sets."
+msgstr	"Görünen haber gruplarýnýn en fazla uzunluðunu girin. <CR> ayarlar."
+
+#: src/lang.c:1596
+#, fuzzy
+msgid	"Max. length of group names shown"
+msgstr	"Gösterilen grup isimlerinin en fazla uzunluðu"
+
+#: src/lang.c:1597
+#, fuzzy
+msgid	"# Maximum length of the names of newsgroups displayed\n"
+msgstr	"# Görünen haber gryplarýnýn isimlerinin en fazla uzunluðu\n"
+
+#: src/lang.c:1602
+#, fuzzy
+msgid	"Show lines/score in listings"
+msgstr	"Listelerdeki satýrlarý/skoru göster"
+
+#: src/lang.c:1603
+#, fuzzy
+msgid	"# What informations should be displayed in article/thread listing\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = nothing\n"
+	"# * 1 = lines\n"
+	"#   2 = score\n"
+	"#   3 = lines & score\n"
+msgstr	"# Makale/parçacýk listelerinde hangi bilgiler gösterilmeli\n"
+	"# 0 = hiçbir þey, 1 = satýrlar, 2 = skor, 3 = satýrlar & skor\n"
+
+#: src/lang.c:1612
+#, fuzzy
+msgid	"0 = full page scrolling, -1 = show previous last line as first on next page, -"
+	"2 = half page"
+msgstr	"0 = tüm sayfa kaydýrýmý, -1 = önceki son satýrý bir sonraki sayfanýn ilk "
+	"satýrýnda göster, -2 = yarým sayfa"
+
+#: src/lang.c:1613
+#, fuzzy
+msgid	"Number of lines to scroll in pager"
+msgstr	"Sayfalayýcýda kaydýrýlan satýr sayýsý"
+
+#: src/lang.c:1614
+msgid	"# Number of lines that cursor-up/down will scroll in article pager\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#  -2 = half-page scrolling\n"
+	"#  -1 = the top/bottom line is carried over onto the next page\n"
+	"#   0 = page-by-page (traditional behavior)\n"
+	"# * 1 = line-by-line\n"
+	"#   2 or greater = scroll by 2 or more lines (only in the pager)\n"
+msgstr	""
+
+#: src/lang.c:1624
+msgid	"Display signatures. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1625
+#, fuzzy
+msgid	"Display signatures"
+msgstr	"Seçenekleri Göster"
+
+#: src/lang.c:1626
+msgid	"# If OFF don't show signatures when displaying articles\n"
+msgstr	""
+
+#: src/lang.c:1630
+msgid	"Display uuencoded data as tagged attachments. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1631
+msgid	"Display uue data as an attachment"
+msgstr	""
+
+#: src/lang.c:1632
+msgid	"# Handling of uuencoded data in the pager\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no, display raw uuencoded data\n"
+	"#   1 = yes, uuencoded data will be condensed to a single tag line showing\n"
+	"#       size and filename, similar to how MIME attachments are displayed\n"
+	"#   2 = hide all, as for 1, but any line that looks like uuencoded data will\n"
+	"#       be folded into a tag line.\n"
+msgstr	""
+
+#: src/lang.c:1642
+msgid	"Decode German style TeX umlaut codes to ISO. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1643
+msgid	"Display \"a as Umlaut-a"
+msgstr	""
+
+#: src/lang.c:1644
+msgid	"# If ON decode German style TeX umlaut codes to ISO and\n"
+	"# show \"a as Umlaut-a, etc.\n"
+msgstr	""
+
+#: src/lang.c:1649 src/lang.c:1659
+msgid	"Space separated list of header fields"
+msgstr	""
+
+#: src/lang.c:1650
+msgid	"Display these header fields (or *)"
+msgstr	""
+
+#: src/lang.c:1651
+msgid	"# Which news headers you wish to see. If you want to see _all_ the headers,\n"
+	"# place an '*' as this value. This is the only way a wildcard can be used.\n"
+	"# If you enter 'X-' as the value, you will see all headers beginning with\n"
+	"# 'X-' (like X-Alan or X-Pape). You can list more than one by delimiting "
+	"with\n"
+	"# spaces. Not defining anything turns off this option.\n"
+msgstr	""
+
+#: src/lang.c:1660
+#, fuzzy
+msgid	"Do not display these header fields"
+msgstr	"Aktüel habver baþlýlarý alanýnýn rengi"
+
+#: src/lang.c:1661
+msgid	"# Same as 'news_headers_to_display' except it denotes the opposite.\n"
+	"# An example of using both options might be if you thought X- headers were\n"
+	"# A Good Thing(tm), but thought Alan and Pape were miscreants...well then "
+	"you\n"
+	"# would do something like this:\n"
+	"# news_headers_to_display=X-\n"
+	"# news_headers_to_not_display=X-Alan X-Pape\n"
+	"# Not defining anything turns off this option.\n"
+msgstr	""
+
+#: src/lang.c:1671
+msgid	"Do you want to enable automatic handling of multipart/alternative articles?"
+msgstr	""
+
+#: src/lang.c:1672
+msgid	"Skip multipart/alternative parts"
+msgstr	""
+
+#: src/lang.c:1673
+msgid	"# If ON strip multipart/alternative messages automatically\n"
+msgstr	""
+
+#: src/lang.c:1678
+msgid	"A regex used to decide which lines to show in col_quote."
+msgstr	""
+
+#: src/lang.c:1679
+msgid	"Regex used to show quoted lines"
+msgstr	""
+
+#: src/lang.c:1680
+msgid	"# A regular expression that tin will use to decide which lines are\n"
+	"# quoted when viewing articles. Quoted lines are shown in col_quote.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1686
+msgid	"A regex used to decide which lines to show in col_quote2."
+msgstr	""
+
+#: src/lang.c:1687
+msgid	"Regex used to show twice quoted l."
+msgstr	""
+
+#: src/lang.c:1688
+msgid	"# A regular expression that tin will use to decide which lines are\n"
+	"# quoted twice. Twice quoted lines are shown in col_quote2.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1694
+msgid	"A regex used to decide which lines to show in col_quote3."
+msgstr	""
+
+#: src/lang.c:1695
+msgid	"Regex used to show >= 3 times q.l."
+msgstr	""
+
+#: src/lang.c:1696
+msgid	"# A regular expression that tin will use to decide which lines are\n"
+	"# quoted >=3 times. >=3 times quoted lines are shown in col_quote3.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1703
+msgid	"A regex used to decide which words to show in col_markslashes."
+msgstr	""
+
+#: src/lang.c:1704
+msgid	"Regex used to highlight /slashes/"
+msgstr	""
+
+#: src/lang.c:1705
+msgid	"# A regular expression that tin will use to decide which words\n"
+	"# bounded by '/' are to be shown in col_markslashes.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1711
+msgid	"A regex used to decide which words to show in col_markstars."
+msgstr	""
+
+#: src/lang.c:1712
+msgid	"Regex used to highlight *stars*"
+msgstr	""
+
+#: src/lang.c:1713
+msgid	"# A regular expression that tin will use to decide which words\n"
+	"# bounded by '*' are to be shown in col_markstars.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1719
+msgid	"A regex used to decide which words to show in col_markstroke."
+msgstr	""
+
+#: src/lang.c:1720
+#, fuzzy
+msgid	"Regex used to highlight -strokes-"
+msgstr	"-vuruþ- ile vurgulama rengi"
+
+#: src/lang.c:1721
+msgid	"# A regular expression that tin will use to decide which words\n"
+	"# bounded by '-' are to be shown in col_markstroke.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1727
+msgid	"A regex used to decide which words to show in col_markdash."
+msgstr	""
+
+#: src/lang.c:1728
+msgid	"Regex used to highlight _underline_"
+msgstr	""
+
+#: src/lang.c:1729
+msgid	"# A regular expression that tin will use to decide which words\n"
+	"# bounded by '_' are to be shown in col_markdash.\n"
+	"# If you leave this blank, tin will use a built in default.\n"
+msgstr	""
+
+#: src/lang.c:1735
+msgid	"A regex used to find Subject prefixes to remove.  Use '|' as separator."
+msgstr	""
+
+#: src/lang.c:1736
+msgid	"Regex with Subject prefixes"
+msgstr	""
+
+#: src/lang.c:1737
+msgid	"# A regular expression that tin will use to find Subject prefixes\n"
+	"# which will be removed before showing the header.\n"
+msgstr	""
+
+#: src/lang.c:1742
+msgid	"A regex used to find Subject suffixes to remove.  Use '|' as separator."
+msgstr	""
+
+#: src/lang.c:1743
+msgid	"Regex with Subject suffixes"
+msgstr	""
+
+#: src/lang.c:1744
+msgid	"# A regular expression that tin will use to find Subject suffixes\n"
+	"# which will be removed when replying or posting followup.\n"
+msgstr	""
+
+#: src/lang.c:1749
+msgid	"Enter name and options for external MIME viewer, --internal for built-in "
+	"viewer"
+msgstr	""
+
+#: src/lang.c:1750
+msgid	"MIME binary content viewer"
+msgstr	""
+
+#: src/lang.c:1751
+msgid	"# If --internal automatically use the built in MIME viewer for non-text\n"
+	"# parts of articles.\n"
+	"# Otherwise specify an external viewer program (eg, metamail) or leave blank\n"
+	"# for no automatic viewing\n"
+msgstr	""
+
+#: src/lang.c:1758
+msgid	"Confirm before starting non-text viewing program"
+msgstr	""
+
+#: src/lang.c:1759
+msgid	"Ask before using MIME viewer"
+msgstr	""
+
+#: src/lang.c:1760
+msgid	"# If ON tin will ask before using metamail to display MIME messages\n"
+	"# this only happens if metamail_prog is set to something\n"
+msgstr	""
+
+#: src/lang.c:1765
+msgid	"Ask to mark groups read when quitting. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:1766
+msgid	"Catchup read groups when quitting"
+msgstr	""
+
+#: src/lang.c:1767
+msgid	"# If ON ask user if read groups should all be marked read\n"
+msgstr	""
+
+#: src/lang.c:1772
+msgid	"Catchup group using left key"
+msgstr	""
+
+#: src/lang.c:1773
+msgid	"# If ON catchup group/thread when leaving with the left arrow key.\n"
+msgstr	""
+
+#: src/lang.c:1778
+msgid	"Catchup thread by using left key"
+msgstr	""
+
+#: src/lang.c:1784
+msgid	"Which actions require confirmation"
+msgstr	""
+
+#: src/lang.c:1785
+msgid	"# What should we ask confirmation for.\n"
+msgstr	""
+
+#: src/lang.c:1790
+#, fuzzy
+msgid	"'Mark article read' ignores tags"
+msgstr	"makaleyi okunmamýþ olarak iþaretle"
+
+#: src/lang.c:1791
+#, fuzzy
+msgid	"# If ON the 'Mark article read' function marks only the current article.\n"
+msgstr	"# ON durumundaysa 'makaleyi okunmuþ olarak iþaretle'"
+
+#: src/lang.c:1795
+#, fuzzy
+msgid	"Program to run to open URL's, <CR> sets, <ESC> cancels."
+msgstr	"URL açmak için çalýþtýrýlan program, <CR> ayarlar, <ESC> iptal eder."
+
+#: src/lang.c:1796
+#, fuzzy
+msgid	"Program that opens URL's"
+msgstr	"URL açan program"
+
+#: src/lang.c:1797
+#, fuzzy
+msgid	"# The program used to open URL's. The actual URL will be appended\n"
+msgstr	"# Program URL açýyordu. Aktüel URL'ler sona eklenecek\n"
+
+#: src/lang.c:1802
+#, fuzzy
+msgid	"Use mouse in xterm"
+msgstr	"xterm2de fare kullan"
+
+#: src/lang.c:1803
+#, fuzzy
+msgid	"# If ON enable mouse key support on xterm terminals\n"
+msgstr	"# ON durumundaysa xtrem uçbirimlerini destekleyen fare tuþunu etkinleþtir.\n"
+
+#: src/lang.c:1809
+#, fuzzy
+msgid	"Use scroll keys on keypad"
+msgstr	"Klavye üzerinde kaydýrma tuþlarýný kullan"
+
+#: src/lang.c:1810
+#, fuzzy
+msgid	"# If ON enable scroll keys on terminals that support it\n"
+msgstr	"# ON durumunduysa uçbirimler tarafýndan desteklenen kaydýrma tuþlarýný "
+	"etkinleþtir\n"
+
+#: src/lang.c:1815
+#, fuzzy
+msgid	"Enter maximum number of article to get. <CR> sets."
+msgstr	"Alýnacak makalenin max. sayýsýný yazýn. <CR> ayarlar."
+
+#: src/lang.c:1816
+#, fuzzy
+msgid	"Number of articles to get"
+msgstr	"Alýnacak makale sayýsý"
+
+#: src/lang.c:1817
+#, fuzzy
+msgid	"# Number of articles to get (0=no limit), if negative sets maximum number\n"
+	"# of already read articles to be read before first unread one\n"
+msgstr	"# Alýnacak makale sayýsý (0= sýnýrsýz), eðer negatif max.sayýyý ayarlarsa\n"
+
+#: src/lang.c:1822
+#, fuzzy
+msgid	"Enter number of days article is considered recent. <CR> sets."
+msgstr	"Makalenin yeni sayýlacaðý gün sayýsýný yazýn. <CR> ayarlar."
+
+#: src/lang.c:1823
+#, fuzzy
+msgid	"Article recentness time limit"
+msgstr	"Makalenin yenilik zaman sýnýrý"
+
+#: src/lang.c:1824
+#, fuzzy
+msgid	"# Number of days in which article is considered recent, (0=OFF)\n"
+msgstr	"# Makalenin yeni sayýldýðý gün sayýsý, (0=OFF)\n"
+
+#: src/lang.c:1828
+#, fuzzy
+msgid	"WILDMAT for normal wildcards, REGEX for full regular expression matching."
+msgstr	"WILDMAT normal jokerler, REGEX tam düzenli varsayým eþleþtirmeleri  içindir."
+
+#: src/lang.c:1829
+#, fuzzy
+msgid	"Wildcard matching"
+msgstr	"Joker eþleþtiriyor"
+
+#: src/lang.c:1830
+msgid	"# Wildcard matching\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = wildmat\n"
+	"#   1 = regex\n"
+msgstr	""
+
+#: src/lang.c:1837
+#, fuzzy
+msgid	"Enter minimal score before an article is marked killed. <CR> sets."
+msgstr	"Makale yok et olarak iþaretlenmeden önce minimal skoru yazýn.<CR> ayarlar."
+
+#: src/lang.c:1838
+#, fuzzy
+msgid	"Score limit (kill)"
+msgstr	"Sýnýrý skorla (yok et)"
+
+#: src/lang.c:1839
+#, fuzzy
+msgid	"# Score limit before an article is marked killed\n"
+msgstr	"# Makale yok et olarak iþaretlendiðinde sýnýrý skorla\n"
+
+#: src/lang.c:1843
+#, fuzzy
+msgid	"Enter default score to kill articles. <CR> sets."
+msgstr	"Makaleleri yok etmke için varsayýlan skoru yazýn. <CR> ayarlar."
+
+#: src/lang.c:1844
+#, fuzzy
+msgid	"Default score to kill articles"
+msgstr	"Makaleleri yok etmke için skoru varsay"
+
+#: src/lang.c:1845
+#, fuzzy
+msgid	"# Default score to kill articles\n"
+msgstr	"# Makaleleri yok etmke için skoru varsay\n"
+
+#: src/lang.c:1849
+#, fuzzy
+msgid	"Enter minimal score before an article is marked hot. <CR> sets."
+msgstr	"Makale 'hot' olarak iþaretlenmeden önce minimum skoru yazýn.<CR> ayarlar."
+
+#: src/lang.c:1850
+#, fuzzy
+msgid	"Score limit (select)"
+msgstr	"Sýnýrý skorla (seç)"
+
+#: src/lang.c:1851
+#, fuzzy
+msgid	"# Score limit before an article is marked hot\n"
+msgstr	"# Makale 'hot! olarak iþaretlenmeden önce sýnýrý skorlayýn\n"
+
+#: src/lang.c:1855
+#, fuzzy
+msgid	"Enter default score to select articles. <CR> sets."
+msgstr	"Makaleleri seçmek için varsayýlan skoru yazýn.<CR> ayarlar."
+
+#: src/lang.c:1856
+#, fuzzy
+msgid	"Default score to select articles"
+msgstr	"Makaleleri seçmek için varsayýlan deðer"
+
+#: src/lang.c:1857
+#, fuzzy
+msgid	"# Default score to select articles\n"
+msgstr	"# Makaleleri seçmek için varsayýlan deðer\n"
+
+#: src/lang.c:1863
+#, fuzzy
+msgid	"Use slrnface to show ''X-Face:''s"
+msgstr	"''X-Face:''s göstermek için slmface kullan"
+
+#: src/lang.c:1864
+#, fuzzy
+msgid	"# If ON using slrnface(1) to interpret the ''X-Face:'' header.\n"
+	"# Only useful when running in an xterm.\n"
+msgstr	"# ON durmunduysa ''X-Face:'' baþlýðýný yorumlamak için slrnface(1) "
+	"kullanýlýyor.\n"
+	"# sadece xterm çalýþýtýrýlýrken yararlý.\n"
+
+#: src/lang.c:1872
+#, fuzzy
+msgid	"Use ANSI color"
+msgstr	"ANSI renk geçerli"
+
+#: src/lang.c:1873
+#, fuzzy
+msgid	"# If ON using ANSI-color\n"
+msgstr	"# On durumundaysa ANSI-renk kullanýlýyor\n"
+
+#: src/lang.c:1878
+#, fuzzy
+msgid	"Standard foreground color"
+msgstr	"Standart önplan rengi"
+
+#: src/lang.c:1879
+#, fuzzy
+msgid	"# Standard foreground color\n"
+	"# Default: -1 (default color)\n"
+msgstr	"# Standart önplan rengi\n"
+
+#: src/lang.c:1885
+#, fuzzy
+msgid	"Standard background color"
+msgstr	"Standart arkaplan rengi"
+
+#: src/lang.c:1886
+#, fuzzy
+msgid	"# Standard background color\n"
+	"# Default: -1 (default color)\n"
+msgstr	"# Standart arkaplan rengi\n"
+
+#: src/lang.c:1892
+#, fuzzy
+msgid	"Color for inverse text (background)"
+msgstr	"Çapraz metnin arkaplan rengi"
+
+#: src/lang.c:1893
+#, fuzzy
+msgid	"# Color of background for inverse text\n"
+	"# Default: 4 (blue)\n"
+msgstr	"# Çapraz metnin arkaplan rengi\n"
+
+#: src/lang.c:1899
+#, fuzzy
+msgid	"Color for inverse text (foreground)"
+msgstr	"Çapraz metnin önplan rengi"
+
+#: src/lang.c:1900
+#, fuzzy
+msgid	"# Color of foreground for inverse text\n"
+	"# Default: 7 (white)\n"
+msgstr	"# Çapraz metnin önplan rengi\n"
+
+#: src/lang.c:1906
+#, fuzzy
+msgid	"Color of text lines"
+msgstr	"Metin satýrlarýnýn rengi"
+
+#: src/lang.c:1907
+#, fuzzy
+msgid	"# Color of text lines\n"
+	"# Default: -1 (default color)\n"
+msgstr	"# Color of text lines\n"
+
+#: src/lang.c:1913
+#, fuzzy
+msgid	"Color of mini help menu"
+msgstr	"Mini yardým menüsünün rengi"
+
+#: src/lang.c:1914
+#, fuzzy
+msgid	"# Color of mini help menu\n"
+	"# Default: 3 (brown)\n"
+msgstr	"# Mini yardým menüsünün rengi\n"
+
+#: src/lang.c:1920
+#, fuzzy
+msgid	"Color of help text"
+msgstr	"Yardým sayfalarýnýn rengi"
+
+#: src/lang.c:1921
+msgid	"# Color of help pages\n"
+	"# Default: -1 (default color)\n"
+msgstr	""
+
+#: src/lang.c:1927
+#, fuzzy
+msgid	"Color of status messages"
+msgstr	"Durum iletilerinin rengi"
+
+#: src/lang.c:1928
+#, fuzzy
+msgid	"# Color of messages in last line\n"
+	"# Default: 6 (cyan)\n"
+msgstr	"# Son satýrdaki iletilerin rengi\n"
+
+#: src/lang.c:1934
+#, fuzzy
+msgid	"Color of quoted lines"
+msgstr	"Ýmlenmiþ-satýr rengi"
+
+#: src/lang.c:1935
+#, fuzzy
+msgid	"# Color of quote-lines\n"
+	"# Default: 2 (green)\n"
+msgstr	"# Ýmlenmiþ-satýr rengi\n"
+
+#: src/lang.c:1941
+#, fuzzy
+msgid	"Color of twice quoted line"
+msgstr	"Çift imlenen satýrlarýn rengi"
+
+#: src/lang.c:1942
+#, fuzzy
+msgid	"# Color of twice quoted lines\n"
+	"# Default: 3 (brown)\n"
+msgstr	"# Çift imlenen satýrlarýn rengi\n"
+
+#: src/lang.c:1948
+#, fuzzy
+msgid	"Color of =>3 times quoted line"
+msgstr	"Ýmlenmiþ satýrda =>3 kat rengi"
+
+#: src/lang.c:1949
+#, fuzzy
+msgid	"# Color of >=3 times quoted lines\n"
+	"# Default: 4 (blue)\n"
+msgstr	"# Ýmlenmiþ satýrlarda >=3 kat rengi\n"
+
+#: src/lang.c:1955
+#, fuzzy
+msgid	"Color of article header lines"
+msgstr	"Makale baþlýk satýrlarýnýn rengi"
+
+#: src/lang.c:1956
+#, fuzzy
+msgid	"# Color of header-lines\n"
+	"# Default: 2 (green)\n"
+msgstr	"# Baþlýk-satýrlarýnýn rengi\n"
+
+#: src/lang.c:1962
+#, fuzzy
+msgid	"Color of actual news header fields"
+msgstr	"Aktüel habver baþlýlarý alanýnýn rengi"
+
+#: src/lang.c:1963
+#, fuzzy
+msgid	"# Color of actual news header fields\n"
+	"# Default: 9 (light red)\n"
+msgstr	"# Aktüel haber baþlýklarý alanýnýn rengi\n"
+
+#: src/lang.c:1969
+#, fuzzy
+msgid	"Color of article subject lines"
+msgstr	"Makale konu satýrlarýnýn rengi"
+
+#: src/lang.c:1970
+#, fuzzy
+msgid	"# Color of article subject\n"
+	"# Default: 6 (cyan)\n"
+msgstr	"# Makale konusunun rengi\n"
+
+#: src/lang.c:1976
+#, fuzzy
+msgid	"Color of response counter"
+msgstr	"Yanýt sayacý rengi"
+
+#: src/lang.c:1977
+#, fuzzy
+msgid	"# Color of response counter\n"
+	"# Default: 2 (green)\n"
+msgstr	"# Yanýt sayacý rengi\n"
+
+#: src/lang.c:1983
+#, fuzzy
+msgid	"Color of sender (From:)"
+msgstr	"Gönderen (-den:) rengi"
+
+#: src/lang.c:1984
+#, fuzzy
+msgid	"# Color of sender (From:)\n"
+	"# Default: 2 (green)\n"
+msgstr	"# Gönderen (-den:) rengi\n"
+
+#: src/lang.c:1990
+#, fuzzy
+msgid	"Color of help/mail sign"
+msgstr	"yardým/posta iþareti rengi"
+
+#: src/lang.c:1991
+#, fuzzy
+msgid	"# Color of Help/Mail-Sign\n"
+	"# Default: 4 (blue)\n"
+msgstr	"# Yardým/Posta Ýþareti rengi\n"
+
+#: src/lang.c:1997
+#, fuzzy
+msgid	"Color of signatures"
+msgstr	"Ýmza rengi"
+
+#: src/lang.c:1998
+#, fuzzy
+msgid	"# Color of signature\n"
+	"# Default: 4 (blue)\n"
+msgstr	"# Ýmza rengi\n"
+
+#: src/lang.c:2004
+#, fuzzy
+msgid	"Color of highlighted URLs"
+msgstr	"*yýldýz* ile vurgulama rengi"
+
+#: src/lang.c:2005
+msgid	"# Color of highlighted URLs\n"
+	"# Default: -1 (default color)\n"
+msgstr	""
+
+#: src/lang.c:2011
+#, fuzzy
+msgid	"Color of highlighting with *stars*"
+msgstr	"*yýldýz* ile vurgulama rengi"
+
+#: src/lang.c:2012
+#, fuzzy
+msgid	"# Color of word highlighting with *stars*\n"
+	"# Default: 11 (yellow)\n"
+msgstr	"# *yýldýz* ile vurgulama rengi\n"
+
+#: src/lang.c:2018
+#, fuzzy
+msgid	"Color of highlighting with _dash_"
+msgstr	"_kesik çizgi_ ile vurgulama rengi"
+
+#: src/lang.c:2019
+#, fuzzy
+msgid	"# Color of word highlighting with _dash_\n"
+	"# Default: 13 (light pink)\n"
+msgstr	"# _kesik çizgi_ ile vurgulama rengi\n"
+
+#: src/lang.c:2025
+#, fuzzy
+msgid	"Color of highlighting with /slash/"
+msgstr	"/bölü/ ile vurgulama rengi"
+
+#: src/lang.c:2026
+#, fuzzy
+msgid	"# Color of word highlighting with /slash/\n"
+	"# Default: 14 (light cyan)\n"
+msgstr	"# /bölü/ ile vurgulama rengi\n"
+
+#: src/lang.c:2032
+#, fuzzy
+msgid	"Color of highlighting with -stroke-"
+msgstr	"-vuruþ- ile vurgulama rengi"
+
+#: src/lang.c:2033
+#, fuzzy
+msgid	"# Color of word highlighting with -stroke-\n"
+	"# Default: 12 (light blue)\n"
+msgstr	"# -vuruþ- ile vurgulama rengi\n"
+
+#: src/lang.c:2040
+#, fuzzy
+msgid	"Attr. of highlighting with *stars*"
+msgstr	"*yýldýz*  ile vurgulama özniteliði"
+
+#: src/lang.c:2041
+#, fuzzy
+msgid	"# Attributes of word highlighting on mono terminals\n"
+	"# Possible values are:\n"
+	"#   0 = Normal\n"
+	"#   1 = Underline\n"
+	"#   2 = Best highlighting\n"
+	"#   3 = Reverse video\n"
+	"#   4 = Blinking\n"
+	"#   5 = Half bright\n"
+	"#   6 = Bold\n"
+	"\n"
+	"# Attribute of word highlighting with *stars*\n"
+	"# Default: 6 (bold)\n"
+msgstr	"# Tekli uçbirimlerde sözcük vurgulama özniteliði.\n"
+	"# Makalelerde dört olanak vardýr:\n"
+	"# *yýldýz*, /bölü/, _kesik çizgi_ and -vuruþ-.\n"
+	"Olasý deðerler\n"
+	"# 0 - Normal, 1 - Altýný çiz, 2 - En iyi vurgulama,\n"
+	"# 3 - Video ters çevir, 4 - Yanýp sönen, 5 - Yaý parlak, 6 - Koyu\n"
+
+#: src/lang.c:2056
+#, fuzzy
+msgid	"Attr. of highlighting with _dash_"
+msgstr	"_vuruþ_  ile vurgulama özniteliði"
+
+#: src/lang.c:2057
+msgid	"# Attribute of word highlighting with _dash_\n"
+	"# Default: 2 (best highlighting)\n"
+msgstr	""
+
+#: src/lang.c:2063
+#, fuzzy
+msgid	"Attr. of highlighting with /slash/"
+msgstr	"/bölü/ ile vurgulama özniteliði"
+
+#: src/lang.c:2064
+#, fuzzy
+msgid	"# Attribute of word highlighting with /slash/\n"
+	"# Default: 5 (half bright)\n"
+msgstr	"# /bölü/ ile vurgulama özniteliði\n"
+
+#: src/lang.c:2070
+#, fuzzy
+msgid	"Attr. of highlighting with -stroke-"
+msgstr	"-kesik çizgi- ile vurgulama özniteliði"
+
+#: src/lang.c:2071
+#, fuzzy
+msgid	"# Attribute of word highlighting with -stroke-\n"
+	"# Default: 3 (reverse video)\n"
+msgstr	"# -kesik çizgi- ile vurgulama özniteliði\n"
+
+#: src/lang.c:2077
+#, fuzzy
+msgid	"URL highlighting in message body"
+msgstr	"Ýleti gövdesinde vurgulana sözcük"
+
+#: src/lang.c:2078
+#, fuzzy
+msgid	"# Enable URL highlighting?\n"
+msgstr	"# Sözcük vurgulamayý etkinlþetir?\n"
+
+#: src/lang.c:2083
+#, fuzzy
+msgid	"Word highlighting in message body"
+msgstr	"Ýleti gövdesinde vurgulana sözcük"
+
+#: src/lang.c:2084
+#, fuzzy
+msgid	"# Enable word highlighting?\n"
+msgstr	"# Sözcük vurgulamayý etkinlþetir?\n"
+
+#: src/lang.c:2089
+#, fuzzy
+msgid	"What to display instead of mark"
+msgstr	"Ýþaretin yerine ne gösterilmeli?"
+
+#: src/lang.c:2090
+#, fuzzy
+msgid	"# Should the leading and ending stars and dashes also be displayed,\n"
+	"# even when they are highlighting marks?\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = no\n"
+	"#   1 = yes, display mark\n"
+	"# * 2 = print a space instead\n"
+msgstr	"# iþaretleri vurgulasalar bile?\n"
+	"# baþtaki ve sondaki yýldýzlar ve kesik çizgiler görüntülenmelidir\n"
+	"# 0 - hayýr    1 - evet, iþareti görüntüle    2 - boþluk býrak\n"
+
+#: src/lang.c:2099
+#, fuzzy
+msgid	"Enter column number to wrap article lines to in the pager. <CR> sets."
+msgstr	"Sayfalayýcýdaki makale satýrlarýný çevrelemek için sütun mumarasýný yazýn. "
+	"<CR> ayarlar."
+
+#: src/lang.c:2100
+#, fuzzy
+msgid	"Page line wrap column"
+msgstr	"Sayfa satýrý sütunu çevreliyor"
+
+#: src/lang.c:2101
+#, fuzzy
+msgid	"# Wrap article lines at column\n"
+msgstr	"# Sütundaki makale satýrlarýný çevrele\n"
+
+#: src/lang.c:2106
+#, fuzzy
+msgid	"Wrap around threads on next unread"
+msgstr	"Sonraki okunmayanda parçacýklarý çevrele"
+
+#: src/lang.c:2107
+#, fuzzy
+msgid	"# If ON wrap around threads on searching next unread article\n"
+msgstr	"# ON durumunduysa sonraki okunmayan makaleyi aramak için parçacýklarý "
+	"çevrele\n"
+
+#: src/lang.c:2111
+#, fuzzy
+msgid	"Enter default mail address (and fullname). <CR> sets."
+msgstr	"Varsayýlan posta adresini (ve tüm ismi) yaz, <CR> ayarlar."
+
+#: src/lang.c:2112
+#, fuzzy
+msgid	"Mail address (and fullname)"
+msgstr	"Posta adresi (ile tüm isim)"
+
+#: src/lang.c:2113
+#, fuzzy
+msgid	"# User's mail address (and fullname), if not username@host (fullname)\n"
+msgstr	"# Kullanýcýnýn posta adresi (ile tüm ismi), deðilse kullanýcýadý@anasistem "
+	"(tüm isim)\n"
+
+#: src/lang.c:2118
+msgid	"Show empty Followup-To in editor"
+msgstr	""
+
+#: src/lang.c:2119
+msgid	"# If ON show empty Followup-To header when editing an article\n"
+msgstr	""
+
+#: src/lang.c:2123
+msgid	"Enter path/! command/--none to create your default signature. <CR> sets."
+msgstr	""
+
+#: src/lang.c:2124
+msgid	"Create signature from path/command"
+msgstr	""
+
+#: src/lang.c:2125
+msgid	"# Signature path (random sigs)/file to be used when posting/replying\n"
+	"# default_sigfile=file       appends file as signature\n"
+	"# default_sigfile=!command   executes external command to generate a "
+	"signature\n"
+	"# default_sigfile=--none     don't append a signature\n"
+msgstr	""
+
+#: src/lang.c:2132
+msgid	"Prepend signature with \"-- \" on own line. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2133
+msgid	"Prepend signature with \"-- \""
+msgstr	""
+
+#: src/lang.c:2134
+msgid	"# If ON prepend the signature with dashes '\\n-- \\n'\n"
+msgstr	""
+
+#: src/lang.c:2138
+msgid	"Add signature when reposting articles. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2139
+msgid	"Add signature when reposting"
+msgstr	""
+
+#: src/lang.c:2140
+msgid	"# If ON add signature to reposted articles\n"
+msgstr	""
+
+#: src/lang.c:2144
+#, c-format
+msgid	"Enter quotation marks, %s or %S for author's initials."
+msgstr	""
+
+#: src/lang.c:2145
+msgid	"Characters used as quote-marks"
+msgstr	""
+
+#: src/lang.c:2146
+#, fuzzy, c-format
+msgid	"# Characters used in quoting to followups and replies.\n"
+	"# '_' is replaced by ' ', %%s, %%S are replaced by author's initials.\n"
+msgstr	"# Sonrakine geçerken ve cevaplarda kulanýlan karakterlerin gösterimi.\n"
+	"# '_'  deðiþtirilir ' ', %%s, %%S yazar baþlýðý deðiþtirilir.\n"
+
+#: src/lang.c:2152
+#, fuzzy
+msgid	"Quoting behavior"
+msgstr	"Davranýþ göstermesi"
+
+#: src/lang.c:2153
+#, fuzzy
+msgid	"# How quoting should be handled when following up or replying.\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = Nothing special\n"
+	"#   1 = Compress quotes\n"
+	"#   2 = Quote signatures\n"
+	"#   3 = Compress quotes, quote signatures\n"
+	"#   4 = Quote empty lines\n"
+	"# * 5 = Compress quotes, quote empty lines\n"
+	"#   6 = Quote signatures, quote empty lines\n"
+	"#   7 = Compress quotes, quote signatures, quote empty lines\n"
+msgstr	"Diðerine geçerken yada cevap verirken görünüm nasýl olmalý.\n"
+	"# 0 = Normal\n"
+	"# 1 = Görünümleri sýkýþtýr\n"
+	"# 2 = Ýmzayý göster\n"
+	"# 3 = Görünümleri þýkýþtýr, imzalarý göster\n"
+	"# 4 = Boþ satýrlarý göster\n"
+	"# 5 = Görünümleri sýkýþtýr, boþ satýrlarý göster\n"
+	"# 6 = Ýmzalarý göster, boþ satýrlarý göster\n"
+	"# 7 = Görünümleri göster, imzalarý göster, boþ satýrlarý göster\n"
+
+#: src/lang.c:2166 src/lang.c:2174 src/lang.c:2180
+#, fuzzy
+msgid	"%A Addr %D Date %F Addr+Name %G Groupname %M Message-ID %N Name %C First Name"
+msgstr	"%A Adres %D Tarih %F Adres+Ad %G Grupadý %M Ýleti-Kimliði %N Ad %C Ýlk Ad"
+
+#: src/lang.c:2167
+#, fuzzy
+msgid	"Quote line when following up"
+msgstr	"Sonrakine geçerken satýr göster"
+
+#: src/lang.c:2168
+#, fuzzy, c-format
+msgid	"# Format of quote line when mailing/posting/following-up an article\n"
+	"# %%A Address    %%D Date   %%F Addr+Name   %%G Groupname   %%M Message-ID\n"
+	"# %%N Full Name  %%C First Name   %%I Initials\n"
+msgstr	"# Bir makaleyi postalarken/gönderirken/diðerine geçerken görünüm satýrý "
+	"biçimleyiniz\n"
+	"# %%A Adres   %%D Tarih   %%F Adres+Ad   %%G Grupadý   %%M Ýleti-Kimliði\n"
+	"# %%N Tam Ad  %%C Ýlk Adýnýz   %%I Adýn baþ harfleri\n"
+
+#: src/lang.c:2175
+#, fuzzy
+msgid	"Quote line when cross-posting"
+msgstr	"Çapraz gönderirken satýrý göster"
+
+#: src/lang.c:2181
+#, fuzzy
+msgid	"Quote line when mailing"
+msgstr	"posta gönderirken satýrý göster"
+
+#: src/lang.c:2186
+#, fuzzy
+msgid	"If ON, include User-Agent: header. <SPACE> toggles & <CR> sets."
+msgstr	"ON durumdaysa, Kullanýcý-Etken baþlýðý ekleyiniz.  <SPACE> toggles & <CR> "
+	"sets."
+
+#: src/lang.c:2187
+#, fuzzy
+msgid	"Insert 'User-Agent:'-header"
+msgstr	"'User-Agent:'-baþlýk ekleyiniz"
+
+#: src/lang.c:2188
+#, fuzzy
+msgid	"# If ON include advertising User-Agent: header\n"
+msgstr	"# ON durumdaysa User-Agent ilanýný ekleyiniz: baþlýk\n"
+
+#: src/lang.c:2193
+#, fuzzy
+msgid	"Enter charset name for MIME (e.g. US-ASCII, ISO-8859-1, EUC-KR), <CR> to set."
+msgstr	"(US-ASCII, ISO-8859-1, EUC-KR) Çok Amaçlý Internet Posta Uzantýlarý için "
+	"karakterküme ismini giriniz."
+
+#: src/lang.c:2194
+msgid	"MM_CHARSET"
+msgstr	""
+
+#: src/lang.c:2195
+#, fuzzy
+msgid	"# Charset supported locally which is also used for MIME header and\n"
+	"# Content-Type header.\n"
+	"# If not set, the value of the environment variable MM_CHARSET is used.\n"
+	"# Set to US-ASCII or compile time default if neither of them is defined.\n"
+	"# If MIME_STRICT_CHARSET is defined at compile-time, charset other than\n"
+	"# mm_charset is considered not displayable and represented as '?'.\n"
+msgstr	"# Karakterkümesi Çok Amaçlý Internet Posta Uzantýlarý baþlýklarý için de "
+	"yerel olarak desteklenmemktedir\n"
+	"# Ýçerik-Tür baþlýðý.\n"
+	"# Kurulmamýþsa, çevre deðerli MM_KARAKTERKÜMESÝ kullanýlýr.\n"
+	"# US-ASCII kümesi yada varsayýlan zamanýnýn tanýmý yoksa derleyiniz.\n"
+	"# Çok Amaçlý Internet Posta Uzantýlarý_STICT_KARAKTERKÜMESÝ doðru zamanda "
+	"tanýmlanmýþsa, diðer karakterkümesi\n"
+	"# mm_karakterkümesi görünemez ve gösteremez '?'.\n"
+
+#: src/lang.c:2205
+#, fuzzy
+msgid	"MM_NETWORK_CHARSET"
+msgstr	"MM_AÐ_KARAKTERKÜMESÝ"
+
+#: src/lang.c:2206
+#, fuzzy
+msgid	"# Charset used for MIME (Content-Type) header in postings.\n"
+msgstr	"# Çok Amaçlý Internet Posta Uzantýlarýn (içerik-tür) posta baþlýklarý için "
+	"kulanýlan karakter kümesi\n"
+
+#: src/lang.c:2212
+#, fuzzy
+msgid	"Mailbox format"
+msgstr	"posta kutusu"
+
+#: src/lang.c:2213
+#, fuzzy
+msgid	"# Format of the mailbox.\n"
+msgstr	"# Posta kutusunun biçimi.\n"
+
+#: src/lang.c:2218
+#, fuzzy
+msgid	"MIME encoding in news messages"
+msgstr	"Yeni mesajlarda Çok Amaçlý Internet Posta Uzantýlarý kodla"
+
+#: src/lang.c:2219
+#, fuzzy
+msgid	"# MIME encoding (8bit, base64, quoted-printable, 7bit) of the body\n"
+	"# for mails and posts, if necessary. QP is efficient for most European\n"
+	"# character sets (ISO-8859-X) with small fraction of non-US-ASCII chars,\n"
+	"# while Base64 is more efficient for most 8bit East Asian, Greek, and\n"
+	"# Russian charsets with a lot of 8bit characters.\n"
+msgstr	"# Çok Amaçlý Internet Posta Uzantýlarý kodlayýcý (8bit, base64, quoted-"
+	"printable, 7bit)\n"
+	"# e-postalar için, gerektiðinde. QP European için yüksek verimlidir\n"
+	"# Karakter kümesi (ISO-8859-X) küçük iþaretli kesir US-ASCII karakterler\n"
+	"# Base64 8bit Doðu Asya ve Yunancadan daha yüksek verimlidir\n"
+	"# Rusça karakter kümesinin 8bit karakterler.\n"
+
+#: src/lang.c:2227 src/lang.c:2248
+#, fuzzy
+msgid	"Don't change unless you know what you are doing. <ESC> cancels."
+msgstr	"Ne yaptýðýný bilmiyorsan deðiþtirme. <ESC> iptal eder."
+
+#: src/lang.c:2228
+#, fuzzy
+msgid	"Use 8bit characters in news headers"
+msgstr	"Yeni baþlýklarda 8bit karakter kullan."
+
+#: src/lang.c:2229
+#, fuzzy
+msgid	"# If ON, 8bit characters in news headers are NOT encoded.\n"
+	"# default is OFF. Thus 8bit characters are encoded by default.\n"
+	"# 8bit chars in header are encoded regardless of the value of this\n"
+	"# parameter unless post_mime_encoding is 8bit as well.\n"
+msgstr	"# ON durumdaysa, 8bit karakterler yeni baþlýklarda kodlanmaz.\n"
+	"# varsayýlan OFF durumdaysa 8bit karakterler kodlanýr 8bit baþlýklardaki\n"
+	"# karakterlerin deðeri bakýlmadan kodlanýr\n"
+	"# Çok Amaçlý Internet Posta Uzantýlarý kodlamasý 8bit ise\n"
+
+#: src/lang.c:2236
+#, fuzzy
+msgid	"Auto-view post-processed files <SPACE> toggles, <CR> sets, <ESC> cancels."
+msgstr	"Soniþemci dosyalarý otomatik olarak göster <SPACE> toggles, <CR> sets, <ESC> "
+	"cancels."
+
+#: src/lang.c:2237
+#, fuzzy
+msgid	"View post-processed files"
+msgstr	"Soniþlemci dosyalarý göster"
+
+#: src/lang.c:2238
+#, fuzzy
+msgid	"# If set, post processed files will be opened in a viewer\n"
+msgstr	"# Kurulmuþsa, soniþlemci dosyalar görünüleyicide açýlacak\n"
+
+#: src/lang.c:2243
+#, fuzzy
+msgid	"MIME encoding in mail messages"
+msgstr	"Çok Amaçlý Internet Posta Uzantýlarý posta iletilerinde kodla"
+
+#: src/lang.c:2249
+#, fuzzy
+msgid	"Use 8bit characters in mail headers"
+msgstr	"Posta baþlýklarýnda 8bit karakter kullan"
+
+#: src/lang.c:2250
+#, fuzzy
+msgid	"# If ON, 8bit characters in mail headers are NOT encoded.\n"
+	"# default is OFF. Thus 8bit characters are encoded by default.\n"
+	"# 8bit chars in headers are encoded regardless of the value of this "
+	"parameter\n"
+	"# unless mail_mime_encoding is 8bit as well. Note that RFC 2822\n"
+	"# prohibits 8bit characters in mail headers so that you are advised NOT to\n"
+	"# turn it ON unless you have some compelling reason.\n"
+msgstr	"# ON durumdaysa, 8bit karakterler posta baþlýklarýnda kodlanmaz\n"
+	"# 8bit baþlýklardaki karakterler parametrelerin deðeri bakýlmadan kodlanýr\n"
+	"# Çok Amaçlý Internet Posta Uzantýlarý kodlamasý 8bit deðilse. Dikkat ! RFC "
+	"2822\n"
+	"# posta baþlýklarýnda 8bit karakterleri yasaksa iptal önerilir HAYIR -e\n"
+	"# Çok önemli neden yoksa ON durumuna getir\n"
+
+#: src/lang.c:2260
+#, fuzzy
+msgid	"Strip blanks from ends of lines"
+msgstr	"Satýr sonu boþlarý yok et"
+
+#: src/lang.c:2261
+#, fuzzy
+msgid	"# If ON strip blanks from ends of lines for faster display on slow "
+	"terminals.\n"
+msgstr	"# ON durumdaysa yavaþ uçbirimde daha hýzlý görüntü için boþlarý yok et.\n"
+
+#: src/lang.c:2266
+#, fuzzy
+msgid	"If ON, use transliteration. <SPACE> toggles & <CR> sets."
+msgstr	"ON durumdaysa damga çevirisi kullan.  <SPACE> toggles & <CR> sets."
+
+#: src/lang.c:2267
+#, fuzzy
+msgid	"Transliteration"
+msgstr	"Damga çevirisi"
+
+#: src/lang.c:2268
+#, fuzzy
+msgid	"# If ON, use //TRANSLIT extension. This means that when a character cannot\n"
+	"# be represented in the in the target character set, it can be approximated\n"
+	"# through one or several similarly looking characters.\n"
+msgstr	"# ON durumdaysa, //DAMGAÇEVÝRÝSÝ uzantýsý kullan. Karakterin yapamadýðýný\n"
+	"# daha büyük damga kümesi, yaklaþýk deðer verilebilir\n"
+	"# Bir veya daha fazla ayný karakter\n"
+
+#: src/lang.c:2275
+#, fuzzy
+msgid	"Send you a carbon copy automatically. <SPACE> toggles & <CR> sets."
+msgstr	"Mektup kopyasý otomatik olarak kendine gönder. <SPACE> toggles & <CR> sets."
+
+#: src/lang.c:2276
+#, fuzzy
+msgid	"Send you a cc automatically"
+msgstr	"Mektup kopyasý otomatik olarak kendine gönder."
+
+#: src/lang.c:2277
+#, fuzzy
+msgid	"# If ON automatically put your name in the Cc: field when mailing an article\n"
+msgstr	"# ON durumdaysa otomatic olarak ismini mektup kopyasýna koy: Makaleyi "
+	"gönderirken alan yarat\n"
+
+#: src/lang.c:2281
+#, fuzzy
+msgid	"Send you a blind carbon copy automatically. <SPACE> toggles & <CR> sets."
+msgstr	"Gizli mektup kopyasý otomatik olarak kendine gönder."
+
+#: src/lang.c:2282
+#, fuzzy
+msgid	"Send you a blind cc automatically"
+msgstr	"Gizli mektup kopyasý otomatik olarak kendine gönder"
+
+#: src/lang.c:2283
+#, fuzzy
+msgid	"# If ON automatically put your name in the Bcc: field when mailing an "
+	"article\n"
+msgstr	"# ON durumdaysa otomatic olarak ismini görünmeyen mektup kopyasýna koy: "
+	"Makaleyi gönderirken alan yarat\n"
+
+#: src/lang.c:2287
+#, fuzzy
+msgid	"Enter address elements about which you want to be warned. <CR> sets."
+msgstr	"uyarýlmak istediðin adres öðelerine gir <CR> sets."
+
+#: src/lang.c:2288
+#, fuzzy
+msgid	"Spamtrap warning address parts"
+msgstr	"isteneyen e-mail posta uyarýsý"
+
+#: src/lang.c:2289
+#, fuzzy
+msgid	"# A comma-delimited list of address-parts you want to be warned\n"
+	"# about when trying to reply by email.\n"
+msgstr	"# Uyarýlmak isiyorsan virgülle-sýnýrlanmýþ address-kýsýmlarýn listesini "
+	"göster\n"
+	"# e-posta ile cevap yazmak istediðin zaman\n"
+
+#: src/lang.c:2294
+#, fuzzy
+msgid	"Enter default number of days a filter entry will be valid. <CR> sets."
+msgstr	"Süz giriþin geçerli olacaðý varsayýlan günler sayýsýna gir <CR> sets."
+
+#: src/lang.c:2295
+#, fuzzy
+msgid	"No. of days a filter entry is valid"
+msgstr	"Süz girdisinin geçerli günler sayýsý"
+
+#: src/lang.c:2296
+#, fuzzy
+msgid	"# Number of days a short term filter will be active\n"
+msgstr	"# Kýsa sürecek süzün aktif olacaðý günler sayýsý\n"
+
+#: src/lang.c:2300
+msgid	"Add posted articles to filter. <SPACE> toggles & <CR> sets."
+msgstr	""
+
+#: src/lang.c:2301
+#, fuzzy
+msgid	"Add posted articles to filter"
+msgstr	"Gönderilen makaleleri süzgece ekle"
+
+#: src/lang.c:2302
+#, fuzzy
+msgid	"# If ON add posted articles which start a new thread to filter for\n"
+	"# highlighting follow-ups\n"
+msgstr	"# ON durumduysa gönderilmiþ makaleleri ekle# highlighting follow-ups\n"
+
+#: src/lang.c:2306
+#, fuzzy
+msgid	"The directory where articles/threads are to be saved in mailbox format."
+msgstr	"makaleler/iç parçacýklarýn posta kutusu olarak kaydedilecek dizin."
+
+#: src/lang.c:2307
+#, fuzzy
+msgid	"Mail directory"
+msgstr	"Posta dizini"
+
+#: src/lang.c:2308
+#, fuzzy
+msgid	"# (-m) directory where articles/threads are saved in mailbox format\n"
+msgstr	"# makaleler/iç parçacýklarýn posta kutusu olarak kaydetmek istediðin dizin\n"
+
+#: src/lang.c:2313
+#, fuzzy
+msgid	"Save articles in batch mode (-S)"
+msgstr	"Makaleleri toplu moda kaydet (-S)"
+
+#: src/lang.c:2314
+#, fuzzy
+msgid	"# If ON articles/threads will be saved in batch mode when save -S\n"
+	"# or mail (-M/-N) is specified on the command line\n"
+msgstr	"# ON durumdaysa kaydeti bastýðýn zaman makaleler/iç parçacýklar\n"
+	"# toplu mode olarak kaydedilir\n"
+
+#: src/lang.c:2319
+#, fuzzy
+msgid	"The directory where you want articles/threads saved."
+msgstr	"makeleleri7iç parçacýklarýný kaydetmek istediðin dizin."
+
+#: src/lang.c:2320
+#, fuzzy
+msgid	"Directory to save arts/threads in"
+msgstr	"iç parçacýklarýn kaydedildiði dizin"
+
+#: src/lang.c:2321
+#, fuzzy
+msgid	"# Directory where articles/threads are saved\n"
+msgstr	"# Kaydedilmiþ makalelerin/iç parçacýklarýn olduðu dizin\n"
+
+#: src/lang.c:2325
+#, fuzzy
+msgid	"Auto save article/thread by Archive-name: header. <SPACE> toggles & <CR> sets."
+msgstr	"Arçivadý olarak makaleleri/iç parçacýklarý otomatik olarak kaydet: header. "
+	"<SPACE> toggles & <CR> sets."
+
+#: src/lang.c:2326
+#, fuzzy
+msgid	"Use Archive-name: header for save"
+msgstr	"Arþiv ismi kullan: baþlýk kaydetme"
+
+#: src/lang.c:2327
+#, fuzzy
+msgid	"# If ON articles/threads with Archive-name: in mail header will\n"
+	"# be automatically saved with the Archive-name & part/patch no.\n"
+msgstr	"# ON durumdaysa Arþiv ismi ile makaleleri/iç parçacýklarý: posta baþlýðý\n"
+	"# will Arþiv ismi &\n"
+
+#: src/lang.c:2332
+#, fuzzy
+msgid	"Mark saved articles/threads as read. <SPACE> toggles, <CR> sets, <ESC> "
+	"cancels."
+msgstr	"Kaydedilmiþ makaleleri /iç parçacýklarý okunmuþ olarak iþaretle. <ARALIK> "
+	"büyük küçük harf, <CR> kümeler, <ESC> iptal et."
+
+#: src/lang.c:2333
+#, fuzzy
+msgid	"Mark saved articles/threads as read"
+msgstr	"Kaydedilmiþ makaleleri /iç parçacýklarý okunmuþ olarak iþaretle"
+
+#: src/lang.c:2334
+#, fuzzy
+msgid	"# If ON mark articles that are saved as read\n"
+msgstr	"# ON durumdaysa kaydedilmiþ makaleleri okunmuþ olarak iþaretle\n"
+
+#: src/lang.c:2338
+#, fuzzy
+msgid	"Do post processing (eg. extract attachments) for saved articles."
+msgstr	"Kaydedilmiþ makaleler için iþlem gönder (örn. ekleri çýkart) for saved "
+	"articles."
+
+#: src/lang.c:2339
+#, fuzzy
+msgid	"Post process saved articles"
+msgstr	"Kaydedilmiþ makaleleri gönder"
+
+#: src/lang.c:2340
+#, fuzzy
+msgid	"# Perform post processing (saving binary attachments) from saved articles.\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no\n"
+	"#   1 = extract shell archives (shar) only\n"
+	"#   2 = yes\n"
+msgstr	"# Kaydedilmiþ makaleler gönderme iþlemini bitir.\n"
+	"# 0=(evet) 1=(hayýr) 2=(kabuk arþivleri bul (shar) only)\n"
+
+#: src/lang.c:2349
+#, fuzzy
+msgid	"Process only unread articles"
+msgstr	"Sadece okunmayan makaleleri iþle"
+
+#: src/lang.c:2350
+#, fuzzy
+msgid	"# If ON only save/print/pipe/mail unread articles (tagged articles excepted)\n"
+msgstr	"# ON durumundaysa okunmamýþ makaleleri sadece kaydet/yazdýr/ilet/postala "
+	"(imlenmiþ makaleler hariç tutulur)\n"
+
+#: src/lang.c:2355
+#, fuzzy
+msgid	"Print all or just part of header. <SPACE> toggles & <CR> sets."
+msgstr	"Baþlýðýn tümünü ya da bir kýsmýný yazdýr.  <SPACE> deðiþtirir & <CR> ayarlar."
+
+#: src/lang.c:2356
+#, fuzzy
+msgid	"Print all headers when printing"
+msgstr	"Yazdýrýrken tüm baþlýklarý yazdýr"
+
+#: src/lang.c:2357
+#, fuzzy
+msgid	"# If ON print all of article header otherwise just the important lines\n"
+msgstr	"# On durumundaysa makale baþlýðýnýn tümünü deðilse sadece önemli olanlarý "
+	"yazdýr\n"
+
+#: src/lang.c:2361
+#, fuzzy
+msgid	"The printer program with options that is to be used to print articles/threads."
+msgstr	"Makaleleri/parçacýklarý yazdýrmak için kullanýlacak seçenekli yazýcý programý."
+
+#: src/lang.c:2362
+#, fuzzy
+msgid	"Printer program with options"
+msgstr	"Seçenekli yazýcý programý"
+
+#: src/lang.c:2363
+#, fuzzy
+msgid	"# Print program with parameters used to print articles/threads\n"
+msgstr	"# Makaleleri/iþ parçacýklarý yazdýrmak için parameterli yazýcý program "
+	"kullan\n"
+
+#: src/lang.c:2369
+#, fuzzy
+msgid	"Force redraw after certain commands"
+msgstr	"Kesin komutlardan sonra ekrandaki çizimin yenilenmesini güçlendir"
+
+#: src/lang.c:2370
+#, fuzzy
+msgid	"# If ON a screen redraw will always be done after certain external commands\n"
+msgstr	"# ON durumdaysa ekrandaki çizimin yenilenmesi bazý dýþ komutlardan sonra "
+	"tamamlanacak\n"
+
+#: src/lang.c:2374
+#, fuzzy
+msgid	"Start editor with line offset. <SPACE> toggles, <CR> sets, <ESC> cancels."
+msgstr	"Satýr kaydýrarak düzenleciyi baþlat. <ARALIK> büyük küçük harf, <CR> kümeler, "
+	"<ESC> iptal et."
+
+#: src/lang.c:2375
+#, fuzzy
+msgid	"Start editor with line offset"
+msgstr	"Düzenleyiciyi satýr konumu ile baþlat"
+
+#: src/lang.c:2376
+#, fuzzy
+msgid	"# If ON editor will be started with cursor offset into the file\n"
+	"# otherwise the cursor will be positioned at the first line\n"
+msgstr	"# ON düzenleyicir dosyadaki imleç kaydýrýcýlarda açýlacak\n"
+	"# aksi takdirde imleç ilk satýrda yer alacak\n"
+
+#: src/lang.c:2381
+#, fuzzy
+msgid	"Enter %E for editor, %F for filename, %N for line-number, <CR> to set."
+msgstr	"Düzenleyici için %E, dosya adý için %F, satýr numarasý için %N, kümelemek "
+	"için <CR> yazýn."
+
+#: src/lang.c:2382
+#, fuzzy
+msgid	"Invocation of your editor"
+msgstr	"Düzenleyicinizin yürütülmesi"
+
+#: src/lang.c:2383
+#, fuzzy, c-format
+msgid	"# Format of editor line including parameters\n"
+	"# %%E Editor  %%F Filename  %%N Linenumber\n"
+msgstr	"# Parametrelerle birlikte düzenleyici satýrý biçimi\n"
+	"# %%E Düzenleyici  %%F Dosya adý  %%N Satýr numarasý\n"
+
+#: src/lang.c:2388
+#, fuzzy
+msgid	"Enter name and options for external-inews, --internal for internal inews"
+msgstr	"Dýþ inew programlarý için isim ve seçenekleri, --iç inew programlarý için "
+	"içseli girin"
+
+#: src/lang.c:2389
+#, fuzzy
+msgid	"External inews"
+msgstr	"Dýþ inew programlarý"
+
+#: src/lang.c:2390
+#, fuzzy
+msgid	"# If --internal use the built in mini inews for posting via NNTP\n"
+	"# otherwise use an external inews program\n"
+msgstr	"# Eðer --içsel ise NNTP yoluyla gönderim için yerleþik mini inew "
+	"programlarýný kullanýn\n"
+	"# deðilse bir dýþ inew programý kullanýn\n"
+
+#: src/lang.c:2394
+#, fuzzy
+msgid	"Enter %M for mailer, %S for subject, %T for to, %F for filename, <CR> to set."
+msgstr	"Posta gönderici için %M, konu için %S, gönderilen için %T, dosya adý için %F, "
+	"kümelemek için <CR> yazýn."
+
+#: src/lang.c:2395
+#, fuzzy
+msgid	"Invocation of your mail command"
+msgstr	"Posta komutunuzun yürütülmesi"
+
+#: src/lang.c:2396
+#, fuzzy, c-format
+msgid	"# Format of mailer line including parameters\n"
+	"# %%M Mailer  %%S Subject  %%T To  %%F Filename\n"
+	"# ie. to use elm as your mailer:    elm -s \"%%S\" \"%%T\" < %%F\n"
+	"# ie. elm interactive          :    elm -i %%F -s \"%%S\" \"%%T\"\n"
+msgstr	"# Parametrelerle birlikte gönderici satýrý biçimi\n"
+	"# %%M Gönderici  %%S Konu  %%T Gönderilen  %%F Dosya adý\n"
+	"# ie. elmi göndericiniz olarak kullanmak için:    elm -s \"%%S\" \"%%T\" < %%"
+	"F\n"
+	"# ie. elm etkileþimli            :    elm -i %%F -s \"%%S\" \"%%T\"\n"
+
+#: src/lang.c:2404
+#, fuzzy
+msgid	"Use interactive mail reader"
+msgstr	"Etkileþimli posta okuyucu kullan"
+
+#: src/lang.c:2405
+msgid	"# Interactive mailreader\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = no interactive mailreader\n"
+	"#   1 = use interactive mailreader with headers in file\n"
+	"#   2 = use interactive mailreader without headers in file\n"
+msgstr	""
+
+#: src/lang.c:2414
+#, fuzzy
+msgid	"Remove ~/.article after posting"
+msgstr	"Kaldýr ~/.article sonra makale"
+
+#: src/lang.c:2415
+#, fuzzy
+msgid	"# If ON remove ~/.article after posting.\n"
+msgstr	"# ON durumundaysa kaldýr  ~/.gönderimden sonra makale.\n"
+
+#: src/lang.c:2419
+#, fuzzy
+msgid	"Filename for all posted articles, <CR> sets, no filename=do not save."
+msgstr	"Tüm gönderilen makaleler için dosya adý, <CR> ayarlar, dosya adý "
+	"yok=kaydetmeyin."
+
+#: src/lang.c:2420
+#, fuzzy
+msgid	"Filename for posted articles"
+msgstr	"Gönderilen makaleler için dosya adý"
+
+#: src/lang.c:2421
+#, fuzzy
+msgid	"# Filename where to keep all postings (default posted)\n"
+	"# If no filename is set then postings will not be saved\n"
+msgstr	"# Postalarýn tutunacak dosyaadý (gönderilmiþ varsayýlan)\n"
+	"# Dosyaadý yoksa hiçbir posta kaydedilmeyecek\n"
+
+#: src/lang.c:2426
+#, fuzzy
+msgid	"Keep all failed articles in ~/dead.articles. <SPACE> toggles & <CR> sets."
+msgstr	"Baþarýsýz makaleleri tut ~/ölü.makale. <Aralýk> büyük küçük harf & <CR> "
+	"kümeleri."
+
+#: src/lang.c:2427
+#, fuzzy
+msgid	"Keep failed arts in ~/dead.articles"
+msgstr	"Baþarýsýz makaleleri tut ~/ölü.makale"
+
+#: src/lang.c:2428
+#, fuzzy
+msgid	"# If ON keep all failed postings in ~/dead.articles\n"
+msgstr	"# If ON gönderilemeyen bütün postalarý tut ~/ölü.makale\n"
+
+#: src/lang.c:2432
+#, fuzzy
+msgid	"Do you want to strip unsubscribed groups from .newsrc"
+msgstr	"Abone olmayan gruplarý çýkart .newsrc"
+
+#: src/lang.c:2433
+#, fuzzy
+msgid	"No unsubscribed groups in newsrc"
+msgstr	"Abone olmayan grup yok newsrc"
+
+#: src/lang.c:2434
+#, fuzzy
+msgid	"# If ON strip unsubscribed groups from newsrc\n"
+msgstr	"# If ON abone olmamýþ gruplarý çýkart newsrc\n"
+
+#: src/lang.c:2439
+#, fuzzy
+msgid	"Remove bogus groups from newsrc"
+msgstr	"Bogus gruplarý kaldýr newsrc"
+
+#: src/lang.c:2440
+#, fuzzy
+msgid	"# What to do with bogus groups in newsrc file\n"
+	"# Possible values are (the default is marked with *):\n"
+	"# * 0 = keep\n"
+	"#   1 = remove\n"
+	"#   2 = highlight with D on selection screen\n"
+msgstr	"# newsrc dosyasýnda olan bogus gruplara ne yapýlsýn\n"
+	"# 0=(Koru) 1=(Kaldýr) 2=(Highlight with D on selection screen).\n"
+
+#: src/lang.c:2448
+#, fuzzy
+msgid	"Enter number of seconds until active file will be reread. <CR> sets."
+msgstr	"Aktif dosya tekrar okunana kadar saniye miktarýný girin. <CR> ayarlar."
+
+#: src/lang.c:2449
+#, fuzzy
+msgid	"Interval in secs to reread active"
+msgstr	"yeniden etkin kýlma saniye aralýðý"
+
+#: src/lang.c:2450
+#, fuzzy
+msgid	"# Time interval in seconds between rereading the active file (0=never)\n"
+msgstr	"# Aktif dosyalar okunurken saniyeler süren zaman aralýðý (0=asla)\n"
+
+#: src/lang.c:2455
+#, fuzzy
+msgid	"Reconnect to server automatically"
+msgstr	"Sunucuya otomatik olarak baðlan"
+
+#: src/lang.c:2456
+#, fuzzy
+msgid	"# If ON automatically reconnect to NNTP server if the connection is broken\n"
+msgstr	"# ON konumunda ise baðlantý kesilirse NNTP sunucusuna otomatik olarak tekrar "
+	"baðlan\n"
+
+#: src/lang.c:2460
+#, fuzzy
+msgid	"Create local copies of NNTP overview files. <SPACE> toggles & <CR> sets."
+msgstr	"NNTP giriþ sayfalarýnýn yerel kopyalarýný yarat. <SPACE> deðiþtirir & <CR> "
+	"ayarlar."
+
+#: src/lang.c:2461
+#, fuzzy
+msgid	"Cache NNTP overview files locally"
+msgstr	"Að Haberleri Aktarma Protokolü önbelleði yerel olarak giriþ dosyalarý"
+
+#: src/lang.c:2462
+#, fuzzy
+msgid	"# If ON, create local copies of NNTP overview files.\n"
+msgstr	"# On durumundaysa, NNTP giriþ dosyalarýnýn yerel kopyalarýný yarat.\n"
+
+#: src/lang.c:2466
+#, fuzzy
+msgid	"Enter format string. <CR> sets, <ESC> cancels."
+msgstr	"Okunan makaleleri imlemek için karakter girin. <CR> yarlar, <ESC> iptal eder."
+
+#: src/lang.c:2467
+msgid	"Format string for display of dates"
+msgstr	""
+
+#: src/lang.c:2468
+msgid	"# Format string for date representation\n"
+msgstr	""
+
+#: src/lang.c:2474
+msgid	"Unicode normalization form"
+msgstr	""
+
+#: src/lang.c:2475
+msgid	"# Unicode normalization form\n"
+	"# Possible values are (the default is marked with *):\n"
+	"#   0 = None\n"
+	"# * 1 = NFKC\n"
+	"#   2 = NFKD\n"
+	"#   3 = NFC\n"
+	"#   4 = NFD\n"
+msgstr	""
+
+#: src/lang.c:2487
+msgid	"Render BiDi"
+msgstr	""
+
+#: src/lang.c:2488
+msgid	"# If ON, bi-directional text is rendered by tin\n"
+msgstr	""
+
+#: src/misc.c:3750
+#, fuzzy, c-format
+msgid	"Version: %s %s release %s (\"%s\") %s %s\n"
+msgstr	"Sürüm: %s %s serbest býrak %s (\"%s\") %s %s\n"
+
+#: src/misc.c:3753
+#, fuzzy, c-format
+msgid	"Version: %s %s release %s (\"%s\")\n"
+msgstr	"Sürüm: %s %s serbest býrak %s (\"%s\")\n"
+
+#: src/newsrc.c:430
+#, fuzzy
+msgid	"Unreachable?\n"
+msgstr	"Ulaþýlamaz?\n"
+
+#: src/nntplib.c:824
+#, fuzzy, c-format
+msgid	"\n"
+	"Server timed out, trying reconnect # %d\n"
+msgstr	"\n"
+	"Sunucu süresi doldu, tekrar baðlanmaya çalýþýyor # %d\n"
+
+#: src/nntplib.c:842
+#, fuzzy
+msgid	"Rejoin current group\n"
+msgstr	"Þu anki gruba tekrar katýl\n"
+
+#: src/nntplib.c:849
+#, fuzzy, c-format
+msgid	"Read (%s)\n"
+msgstr	"Oku (%s)\n"
+
+#: src/nntplib.c:851
+#, fuzzy, c-format
+msgid	"Resend last command (%s)\n"
+msgstr	"Son komutu tekrr yolla (%s)\n"
+
+#.
+#. * TODO: - store a hash value of the entire motd in the server-rc
+#. *         and only if it differs from the old value display the
+#. *         motd?
+#. *       - use some sort of pager?
+#. *       - -> lang.c
+#.
+#: src/nntplib.c:1759
+msgid	"MOTD: "
+msgstr	""
+
+#: src/nrctbl.c:170
+#, c-format
+msgid	"couldn't expand %s\n"
+msgstr	"%s geniþletilemedi\n"
+
+#: src/post.c:1171
+#, c-format
+msgid	"Line %d is longer than 998 octets and should be folded, but\n"
+	"encoding is neither set to %s nor to %s\n"
+msgstr	""
+
+#: src/post.c:1176
+#, c-format
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is set to %s without enabling MIME_BREAK_LONG_LINES or\n"
+	"posting doesn't contain any 8bit chars and thus folding won't happen\n"
+msgstr	""
+
+#: src/post.c:1178
+#, c-format
+msgid	"Line %d is longer than 998 octets, and should be folded, but\n"
+	"encoding is not set to %s\n"
+msgstr	""
+
+#: src/post.c:1993
+#, fuzzy, c-format
+msgid	"Posting: %.*s ..."
+msgstr	"Gönderiliyor: %.*s ..."
+
+#. Check if okay to read
+#: src/read.c:211
+msgid	"Aborting read, please wait..."
+msgstr	"Okuma durduruluyor, lütfen bekleyin..."
+
+#: src/read.c:358
+msgid	"Aborted read\n"
+msgstr	"Okuma durduruldu\n"
+
+#: src/read.c:414
+#, fuzzy
+msgid	"Draining\n"
+msgstr	"Akaçlanma\n"
+
+#. Don't hash the initial '<'
+#: src/refs.c:251
+#, fuzzy
+msgid	"unchanged"
+msgstr	"deðiþtirilmedi"
+
+#: src/refs.c:609
+#, fuzzy
+msgid	"[- Unavailable -]"
+msgstr	"[- Kullanýlamýyor -]"
+
+#.
+#. * preamble
+#. * TODO: -> lang.c
+#.
+#: src/rfc2047.c:1201
+#, c-format
+msgid	"This message has been composed in the 'multipart/mixed' MIME-format. If you\n"
+	"are reading this prefix, your mail reader probably has not yet been modified\n"
+	"to understand the new format, and some of what follows may look strange.\n"
+	"\n"
+msgstr	""
+
+#: src/save.c:972
+msgid	"bytes"
+msgstr	"bayt"
+
+#: src/select.c:379
+msgid	"unread"
+msgstr	"okunmamýþ"
+
+#: src/select.c:379
+msgid	"all"
+msgstr	"Hepsi"
+
+#: src/select.c:549 src/select.c:551
+msgid	" R"
+msgstr	" R"
+
+#  TODO: use tin global 'homedir' instead? or even rcdir?
+#. TODO: use tin global 'homedir' instead? or even rcdir?
+#: src/xface.c:91
+#, c-format
+msgid	"Can't run slrnface: Environment variable %s not found."
+msgstr	"Slrnface çalýþtýrýlamýyor: Çevre deðiþkeni %s bulunamadý."
+
+#: src/xface.c:99 src/xface.c:131
+#, fuzzy, c-format
+msgid	"Can't run slrnface: failed to create %s"
+msgstr	"Slrnface çalýþtýrýlamýyor: yaratým baþarýsýz %s"
+
+#: src/xface.c:109
+#, fuzzy
+msgid	"This directory is used to create named pipes for communication between\n"
+	"slrnface and its parent process. It should normally be empty because\n"
+	"the pipe is deleted right after it has been opened by both processes.\n"
+	"\n"
+	"File names generated by slrnface have the form \"hostname.pid\". It is\n"
+	"probably an error if they linger here longer than a fraction of a second.\n"
+	"\n"
+	"However, if the directory is mounted from an NFS server, you might see\n"
+	"special files created by your NFS server while slrnface is running.\n"
+	"Do not try to remove them.\n"
+msgstr	"Bu dizin slrnface ve ana iþlem arasýndaki iletiþimi saðlayan adý konmuþ\n"
+	" kanallarý yaratmak için kullanýlmaktadýr. Normalde boþ olmalý çünkü\n"
+	" kanal her iki iþlem tarafýndan açýldýktan hemen sonra silinir.\n"
+	"\n"
+	"Slrnface tarafýndan oluþturulan dosya isimleri þu biçimdedir: hostname.pid\". "
+	"Bu\n"
+	" muhtemelen saniyenin onda birinden bile fazla kalýnca oluþan bir hatadýr.\n"
+	"\n"
+	"Ancak dizin eðer NFS sunucusundan kurulduysa, slrnface çalýþýrken\n"
+	"NFS sunucunuzun yarattýðý özel dosyalari görebilirsiniz.\n"
+	"Kaldýrmaya çalýþmayýnýz.\n"
+
+#: src/xface.c:123
+#, fuzzy
+msgid	"Can't run slrnface: couldn't construct fifo name."
+msgstr	"Slrnface çalýþtýrýlamýyor: fifo isim oluþturulamadý."
+
+#: src/xface.c:162
+#, fuzzy, c-format
+msgid	"Slrnface abnormally exited, code %d."
+msgstr	"Slrnface beklenmedik þekilde sonlandýrýldý, kod %d."
+
+#: src/xface.c:206
+#, fuzzy, c-format
+msgid	"Slrnface failed: %s."
+msgstr	"Slrnface baþarýsýz: %s."
diff -Nurp tin-1.6.2/src/Makefile.in tin-1.8.0/src/Makefile.in
--- tin-1.6.2/src/Makefile.in	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/Makefile.in	2005-07-16 21:49:36.000000000 +0200
@@ -1,9 +1,9 @@
 # Source Makefile for tin
 # - for configuration options read the ../doc/INSTALL file.
 #
-# Updated: 2003-07-24
+# Updated: 2005-07-02
 #
-# Copyright (c) 1995-2003 Thomas E. Dickey <dickey@invisible-island.net>
+# Copyright (c) 1995-2005 Thomas E. Dickey <dickey@invisible-island.net>
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -43,28 +43,37 @@ srcdir		= @srcdir@
 VPATH		= $(srcdir)
 
 # Compiler, linker & parser commands
-CC	= @CC@
-CPP	= @CPP@
-EXEEXT	= @PROG_EXT@
-PRELIB	= @LIB_PREFIX@
+CC		= @CC@
+CPP		= @CPP@
+PRELIB		= @LIB_PREFIX@
 
-DEBUG	= @ENABLE_DEBUG@ -DDEBUG #-DDEBUG_NEWSRC -DPROFILE -DDEBUG_REFS
-CANLOCK = # -DUSE_CANLOCK # -DEVIL_INSIDE
+x		= @EXEEXT@
+o		= .@OBJEXT@
+
+DEBUG		= @ENABLE_DEBUG@ -DDEBUG #-DDEBUG_NEWSRC -DPROFILE -DDEBUG_REFS
+CANLOCK		= # -DUSE_CANLOCK # -DEVIL_INSIDE
 
 INTL_CPPFLAGS	= -DLOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\"
 PCRE_CPPFLAGS	= @PCREDIR_CPPFLAGS@ @PCREDIR_MAKE@ -I$(top_builddir)/pcre -I$(top_srcdir)/pcre
 
-CPPOPTS	= @DEFS@ -I. -I../include $(PCRE_CPPFLAGS) $(INTL_CPPFLAGS) -I$(INCDIR) $(DEBUG) $(CANLOCK) @CPPFLAGS@
-CFLAGS	= @CFLAGS@
+CPPFLAGS	= @DEFS@ -I. -I../include $(PCRE_CPPFLAGS) $(INTL_CPPFLAGS) -I$(INCDIR) $(DEBUG) $(CANLOCK) @CPPFLAGS@
+CFLAGS		= @CFLAGS@
+
+LDFLAGS		= @LDFLAGS@
+YACC		= @YACC@
 
-LD	= $(CC)
-LDFLAGS	= @LDFLAGS@
-YACC	= @YACC@
+BUILD_CC	= @BUILD_CC@
+BUILD_CFLAGS	= @BUILD_CFLAGS@
+BUILD_CPPFLAGS	= @BUILD_CPPFLAGS@ $(PCRE_CPPFLAGS)
+BUILD_LDFLAGS	= @BUILD_LDFLAGS@
+BUILD_LIBS	= @BUILD_LIBS@
+X		= $(BUILD_EXEEXT)
 
 CANLIB		= # -L../libcanlock -lcanlock
 INTL_LIBS	= @INTLLIBS@
 PCRE_LIBS	= @PCREDIR_LIBS@ @PCREDIR_MAKE@ -L../pcre -lpcre
-LIBS		= $(PCRE_LIBS) $(CANLIB) @LIBS@ @INN_NNTPLIB@ $(INTL_LIBS)
+LIBS		= @LIBS@
+LINK_LIBS	= $(PCRE_LIBS) $(CANLIB) @LIBS@ @INN_NNTPLIB@ $(INTL_LIBS)
 
 # Where do you want the binary & manual page installed?
 DESTDIR	= @DESTDIR@
@@ -76,7 +85,7 @@ INS_OLD_SUFFIX	= old
 
 # Project
 PROJECT	= @PACKAGE@
-EXE	= @PACKAGE@$(EXEEXT)
+EXE	= @PACKAGE@$x
 VER	= @VERSION@
 
 # directory structure
@@ -111,7 +120,7 @@ HFILES	= \
 	$(INCDIR)/bugrep.h \
 	$(INCDIR)/extern.h \
 	$(INCDIR)/keymap.h \
-	$(INCDIR)/menukeys.h \
+	$(INCDIR)/newsrc.h \
 	$(INCDIR)/nntplib.h \
 	$(INCDIR)/plp_snprintf.h \
 	$(INCDIR)/policy.h \
@@ -160,7 +169,7 @@ CFILES	= \
 	$(SRCDIR)/newsrc.c \
 	$(SRCDIR)/nntplib.c \
 	$(SRCDIR)/nrctbl.c \
-	$(SRCDIR)/open.c \
+	$(SRCDIR)/options_menu.c \
 	$(SRCDIR)/page.c \
 	$(SRCDIR)/parsdate.y \
 	$(SRCDIR)/pgp.c \
@@ -194,115 +203,116 @@ CFILES	= \
 EXTRAOBJS = @EXTRAOBJS@
 
 EXTRA_INTLLIBS = @INTLDIR_MAKE@ @INTLLIBS@
+EXTRA_PCREHDRS = @PCREDIR_MAKE@ ../pcre/pcre.h
 EXTRA_PCRELIBS = @PCREDIR_MAKE@ ../pcre/$(PRELIB)pcre.a
 EXTRALIBS = $(EXTRA_INTLLIBS) $(EXTRA_PCRELIBS)
 
 OFILES	= @ALLOCA@ $(EXTRAOBJS) \
-	$(OBJDIR)/active.o \
-	$(OBJDIR)/art.o \
-	$(OBJDIR)/attrib.o \
-	$(OBJDIR)/auth.o \
-	$(OBJDIR)/charset.o \
-	$(OBJDIR)/color.o \
-	$(OBJDIR)/config.o \
-	$(OBJDIR)/cook.o \
-	$(OBJDIR)/curses.o \
-	$(OBJDIR)/debug.o \
-	$(OBJDIR)/envarg.o \
-	$(OBJDIR)/feed.o \
-	$(OBJDIR)/filter.o \
-	$(OBJDIR)/getline.o \
-	$(OBJDIR)/global.o \
-	$(OBJDIR)/group.o \
-	$(OBJDIR)/hashstr.o \
-	$(OBJDIR)/header.o \
-	$(OBJDIR)/help.o \
-	$(OBJDIR)/inews.o \
-	$(OBJDIR)/init.o \
-	$(OBJDIR)/joinpath.o \
-	$(OBJDIR)/keymap.o \
-	$(OBJDIR)/lang.o \
-	$(OBJDIR)/langinfo.o \
-	$(OBJDIR)/list.o \
-	$(OBJDIR)/lock.o \
-	$(OBJDIR)/mail.o \
-	$(OBJDIR)/main.o \
-	$(OBJDIR)/memory.o \
-	$(OBJDIR)/mimetypes.o \
-	$(OBJDIR)/misc.o \
-	$(OBJDIR)/my_tmpfile.o \
-	$(OBJDIR)/newsrc.o \
-	$(OBJDIR)/nntplib.o \
-	$(OBJDIR)/nrctbl.o \
-	$(OBJDIR)/open.o \
-	$(OBJDIR)/page.o \
-	$(OBJDIR)/parsdate.o \
-	$(OBJDIR)/pgp.o \
-	$(OBJDIR)/plp_snprintf.o \
-	$(OBJDIR)/post.o \
-	$(OBJDIR)/prompt.o \
-	$(OBJDIR)/read.o \
-	$(OBJDIR)/refs.o \
-	$(OBJDIR)/regex.o \
-	$(OBJDIR)/rfc1524.o \
-	$(OBJDIR)/rfc2045.o \
-	$(OBJDIR)/rfc2046.o \
-	$(OBJDIR)/rfc2047.o \
-	$(OBJDIR)/save.o \
-	$(OBJDIR)/screen.o \
-	$(OBJDIR)/search.o \
-	$(OBJDIR)/select.o \
-	$(OBJDIR)/sigfile.o \
-	$(OBJDIR)/signal.o \
-	$(OBJDIR)/strftime.o \
-	$(OBJDIR)/string.o \
-	$(OBJDIR)/tags.o \
-	$(OBJDIR)/tcurses.o \
-	$(OBJDIR)/tmpfile.o \
-	$(OBJDIR)/thread.o \
-	$(OBJDIR)/version.o \
-	$(OBJDIR)/wildmat.o \
-	$(OBJDIR)/xface.o \
-	$(OBJDIR)/xref.o
+	$(OBJDIR)/active$o \
+	$(OBJDIR)/art$o \
+	$(OBJDIR)/attrib$o \
+	$(OBJDIR)/auth$o \
+	$(OBJDIR)/charset$o \
+	$(OBJDIR)/color$o \
+	$(OBJDIR)/config$o \
+	$(OBJDIR)/cook$o \
+	$(OBJDIR)/curses$o \
+	$(OBJDIR)/debug$o \
+	$(OBJDIR)/envarg$o \
+	$(OBJDIR)/feed$o \
+	$(OBJDIR)/filter$o \
+	$(OBJDIR)/getline$o \
+	$(OBJDIR)/global$o \
+	$(OBJDIR)/group$o \
+	$(OBJDIR)/hashstr$o \
+	$(OBJDIR)/header$o \
+	$(OBJDIR)/help$o \
+	$(OBJDIR)/inews$o \
+	$(OBJDIR)/init$o \
+	$(OBJDIR)/joinpath$o \
+	$(OBJDIR)/keymap$o \
+	$(OBJDIR)/lang$o \
+	$(OBJDIR)/langinfo$o \
+	$(OBJDIR)/list$o \
+	$(OBJDIR)/lock$o \
+	$(OBJDIR)/mail$o \
+	$(OBJDIR)/main$o \
+	$(OBJDIR)/memory$o \
+	$(OBJDIR)/mimetypes$o \
+	$(OBJDIR)/misc$o \
+	$(OBJDIR)/my_tmpfile$o \
+	$(OBJDIR)/newsrc$o \
+	$(OBJDIR)/nntplib$o \
+	$(OBJDIR)/nrctbl$o \
+	$(OBJDIR)/options_menu$o \
+	$(OBJDIR)/page$o \
+	$(OBJDIR)/parsdate$o \
+	$(OBJDIR)/pgp$o \
+	$(OBJDIR)/plp_snprintf$o \
+	$(OBJDIR)/post$o \
+	$(OBJDIR)/prompt$o \
+	$(OBJDIR)/read$o \
+	$(OBJDIR)/refs$o \
+	$(OBJDIR)/regex$o \
+	$(OBJDIR)/rfc1524$o \
+	$(OBJDIR)/rfc2045$o \
+	$(OBJDIR)/rfc2046$o \
+	$(OBJDIR)/rfc2047$o \
+	$(OBJDIR)/save$o \
+	$(OBJDIR)/screen$o \
+	$(OBJDIR)/search$o \
+	$(OBJDIR)/select$o \
+	$(OBJDIR)/sigfile$o \
+	$(OBJDIR)/signal$o \
+	$(OBJDIR)/strftime$o \
+	$(OBJDIR)/string$o \
+	$(OBJDIR)/tags$o \
+	$(OBJDIR)/tcurses$o \
+	$(OBJDIR)/tmpfile$o \
+	$(OBJDIR)/thread$o \
+	$(OBJDIR)/version$o \
+	$(OBJDIR)/wildmat$o \
+	$(OBJDIR)/xface$o \
+	$(OBJDIR)/xref$o
 
 ALL_FILES = $(HFILES) $(CFILES) $(NNTP)
 
-LINTFLAGS = -a -c -h -n -x $(CPPOPTS) -I/usr/local/include/ \
+LINTFLAGS = -a -c -h -n -x $(CPPFLAGS) -I/usr/local/include/ \
 	-DUSE_ISO2ASC=\"2\" \
 	-DHAVE_ISPELL \
 	-DHAVE_COLOR
 
-all: $(BINDIR)/$(EXE)
+all : $(BINDIR)/$(EXE)
 
-.SUFFIXES: .i
+.SUFFIXES : .i
 
-.c.o:
+.c$o :
 @SHOW_CC@
-	@ECHO_CC@$(CC) $(CPPOPTS) $(CFLAGS) -c $(srcdir)/$*.c
+	@ECHO_CC@$(CC) $(CPPFLAGS) $(CFLAGS) -c $(srcdir)/$*.c
 
-.c.i:
+.c.i :
 @SHOW_CC@
-	@ECHO_CC@$(CPP) -C $(CPPOPTS) $*.c >$@
+	@ECHO_CC@$(CPP) -C $(CPPFLAGS) $*.c >$@
 
 # explicit rules to allow running lint, and to accommodate older 'make' programs
-$(OBJDIR)/parsdate.o: $(SRCDIR)/parsdate.y
+$(OBJDIR)/parsdate$o : $(SRCDIR)/parsdate.y
 	@$(ECHO) "expect 6 shift/reduce conflicts ..."
 	$(YACC) $(SRCDIR)/parsdate.y
 	$(MV) -f y.tab.c $(OBJDIR)/parsdate.c
 @SHOW_CC@
-	@ECHO_CC@$(CC) $(CPPOPTS) $(CFLAGS) -c $(OBJDIR)/parsdate.c
+	@ECHO_CC@$(CC) $(CPPFLAGS) $(CFLAGS) -c $(OBJDIR)/parsdate.c
 
-$(OBJDIR)/parsdate.c: $(SRCDIR)/parsdate.y
+$(OBJDIR)/parsdate.c : $(SRCDIR)/parsdate.y
 	@$(ECHO) "expect 6 shift/reduce conflicts ..."
 	$(YACC) $(SRCDIR)/parsdate.y
 	$(MV) -f y.tab.c $(OBJDIR)/parsdate.c
 
-$(BINDIR)/$(EXE): $(OFILES) $(EXTRALIBS)
+$(BINDIR)/$(EXE) : $(OFILES) $(EXTRALIBS)
 	@$(ECHO) "Linking $(EXE) v$(VER) ..."
-	$(LD) $(LDFLAGS) -o $(BINDIR)/$(EXE) $(OFILES) $(NNTPLIB) $(NETLIBS) $(LIBS) $(DEBUG)
+	$(CC) $(LDFLAGS) -o $(BINDIR)/$(EXE) $(OFILES) $(LINK_LIBS) $(DEBUG)
 	@$(LS) -l $(BINDIR)/$(EXE)
 
-help:
+help :
 	@$(ECHO) "This Makefile offers the following options:"
 	@$(ECHO) " "
 	@$(ECHO) "    make [all]                 [ Build the binary for your OS ]"
@@ -321,7 +331,7 @@ $(DESTDIR)$(INS_BINARY_DIR) \
 $(DESTDIR)$(INS_SYSDEF_DIR) :
 	$(top_srcdir)/mkdirs.sh $@
 
-install_manpage: $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT) $(DESTDIR)$(INS_MANUAL_DIR)5
+install_manpage : $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT) $(DESTDIR)$(INS_MANUAL_DIR)5
 	@$(ECHO) "Installing $(PROJECT) manual pages to $(DESTDIR)$(INS_MANUAL_DIR) ..."
 	@$(INSTALL) -m 444 $(DOCDIR)/tin.1 $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT)/$(PROJECT).$(INS_MANUAL_EXT)
 	@( $(CD) $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT) && $(RM) -f r$(PROJECT).$(INS_MANUAL_EXT) && $(LN) $(PROJECT).$(INS_MANUAL_EXT) r$(PROJECT).$(INS_MANUAL_EXT) )
@@ -329,7 +339,7 @@ install_manpage: $(DESTDIR)$(INS_MANUAL_
 	@-if test ! -f $(DESTDIR)$(INS_MANUAL_DIR)5/mbox.5 ; then $(INSTALL) -m 444 $(DOCDIR)/mbox.5 $(DESTDIR)$(INS_MANUAL_DIR)5/mbox.5 ; else $(ECHO) "  ... skipping $(DESTDIR)$(INS_MANUAL_DIR)5/mbox.5 - file already exists" ; fi
 	@-if test ! -f $(DESTDIR)$(INS_MANUAL_DIR)5/mmdf.5 ; then $(INSTALL) -m 444 $(DOCDIR)/mmdf.5 $(DESTDIR)$(INS_MANUAL_DIR)5/mmdf.5 ; else $(ECHO) "  ... skipping $(DESTDIR)$(INS_MANUAL_DIR)5/mmdf.5 - file already exists" ; fi
 
-uninstall_manpage:
+uninstall_manpage :
 	@$(ECHO) "Uninstalling $(PROJECT) manual page in $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT) ..."
 	@-$(RM) -f $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT)/$(PROJECT).$(INS_MANUAL_EXT)
 	@-$(RM) -f $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT)/r$(PROJECT).$(INS_MANUAL_EXT)
@@ -337,35 +347,39 @@ uninstall_manpage:
 #	@-$(RM) -f $(DESTDIR)$(INS_MANUAL_DIR)5/mbox.5
 #	@-$(RM) -f $(DESTDIR)$(INS_MANUAL_DIR)5/mmdf.5
 
-install_sysdefs: $(DESTDIR)$(INS_SYSDEF_DIR)
+install_sysdefs : $(DESTDIR)$(INS_SYSDEF_DIR)
 	@$(ECHO) "Installing system-wide defaults to $(DESTDIR)$(INS_SYSDEF_DIR) ..."
 	@-if test -f $(DESTDIR)$(INS_SYSDEF_DIR)/tin.defaults ; then $(ECHO) "  ... backing up existing tin.defaults file to tin.defaults.$(INS_OLD_SUFFIX)" ; $(MV) -f $(DESTDIR)$(INS_SYSDEF_DIR)/tin.defaults $(DESTDIR)$(INS_SYSDEF_DIR)/tin.defaults.$(INS_OLD_SUFFIX) ; fi
 	@-if test -f $(DESTDIR)$(INS_SYSDEF_DIR)/mime.types ; then $(ECHO) "  ... backing up existing mime.types file to mime.types.$(INS_OLD_SUFFIX)" ; $(MV) -f $(DESTDIR)$(INS_SYSDEF_DIR)/mime.types $(DESTDIR)$(INS_SYSDEF_DIR)/mime.types.$(INS_OLD_SUFFIX) ; fi
 	@$(INSTALL) -m 644 $(DOCDIR)/tin.defaults $(DESTDIR)$(INS_SYSDEF_DIR)/tin.defaults
 	@$(INSTALL) -m 644 $(DOCDIR)/mime.types $(DESTDIR)$(INS_SYSDEF_DIR)/mime.types
 
-uninstall_sysdefs:
+uninstall_sysdefs :
 	@$(ECHO) "Uninstalling system-wide defaults in $(DESTDIR)$(INS_SYSDEF_DIR) ..."
 	@-$(RM) -f $(DESTDIR)$(INS_SYSDEF_DIR)/tin.defaults
 	@-$(RM) -f $(DESTDIR)$(INS_SYSDEF_DIR)/mime.types
 
-install_helpers: $(DESTDIR)$(INS_BINARY_DIR) $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT)
+install_helpers : $(DESTDIR)$(INS_BINARY_DIR) $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT)
 	@$(ECHO) "Installing helper applications ..."
 	@-if test ! -f $(DESTDIR)$(INS_BINARY_DIR)/url_handler.sh ; then $(INSTALL) -m 755 $(TOLDIR)/url_handler.sh $(DESTDIR)$(INS_BINARY_DIR)/url_handler.sh ; fi
 	@-if test ! -f $(DESTDIR)$(INS_BINARY_DIR)/metamutt ; then $(INSTALL) -m 755 $(TOLDIR)/metamutt $(DESTDIR)$(INS_BINARY_DIR)/metamutt ; fi
 	@$(INSTALL) -m 755 $(TOLDIR)/w2r.pl $(DESTDIR)$(INS_BINARY_DIR)/w2r.pl
 	@$(INSTALL) -m 755 $(TOLDIR)/opt-case.pl $(DESTDIR)$(INS_BINARY_DIR)/opt-case.pl
+	@$(INSTALL) -m 755 $(TOLDIR)/tinews.pl $(DESTDIR)$(INS_BINARY_DIR)/tinews.pl
 	@$(INSTALL) -m 444 $(DOCDIR)/w2r.1 $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT)/w2r.pl.$(INS_MANUAL_EXT)
 	@$(INSTALL) -m 444 $(DOCDIR)/opt-case.1 $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT)/opt-case.pl.$(INS_MANUAL_EXT)
+	@$(INSTALL) -m 444 $(DOCDIR)/tinews.1 $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT)/tinews.pl.$(INS_MANUAL_EXT)
 
-uninstall_helpers:
+uninstall_helpers :
 	@$(ECHO) "Removing helper applications ..."
 	@-$(RM) -f $(DESTDIR)$(INS_BINARY_DIR)/w2r.pl
 	@-$(RM) -f $(DESTDIR)$(INS_BINARY_DIR)/opt-case.pl
+	@-$(RM) -f $(DESTDIR)$(INS_BINARY_DIR)/tinews.pl
 	@-$(RM) -f $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT)/w2r.pl.$(INS_MANUAL_EXT)
 	@-$(RM) -f $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT)/opt-case.pl.$(INS_MANUAL_EXT)
+	@-$(RM) -f $(DESTDIR)$(INS_MANUAL_DIR)$(INS_MANUAL_EXT)/tinews.pl.$(INS_MANUAL_EXT)
 
-install: $(DESTDIR)$(INS_BINARY_DIR)
+install : $(DESTDIR)$(INS_BINARY_DIR)
 	@$(MAKE) all
 	@$(ECHO) "Installing $(EXE) v$(VER) to $(DESTDIR)$(INS_BINARY_DIR) ..."
 	@$(INSTALL) -s $(BINDIR)/$(EXE) $(DESTDIR)$(INS_BINARY_DIR)/$(EXE)
@@ -374,7 +388,7 @@ install: $(DESTDIR)$(INS_BINARY_DIR)
 	@$(MAKE) install_manpage
 @MSG_DIR_MAKE@	@$(MAKE) install_nls
 
-uninstall:
+uninstall :
 	@$(ECHO) "Uninstalling $(EXE) in $(DESTDIR)$(INS_BINARY_DIR) ..."
 	@-$(RM) -f $(DESTDIR)$(INS_BINARY_DIR)/$(EXE)
 	@-$(RM) -f $(DESTDIR)$(INS_BINARY_DIR)/r$(EXE)
@@ -382,32 +396,32 @@ uninstall:
 	@$(MAKE) uninstall_manpage
 @MSG_DIR_MAKE@	@$(MAKE) uninstall_nls
 
-install_nls:
+install_nls :
 @MSG_DIR_MAKE@	@-if test -r ../po/Makefile ; then $(ECHO) "Installing NLS-files" ; $(CD) ../po/ && $(MAKE) install ; fi
 
-uninstall_nls:
+uninstall_nls :
 @MSG_DIR_MAKE@	@-if test -r ../po/Makefile ; then $(ECHO) "Uninstalling NLS-files" ; $(CD) ../po/ && $(MAKE) uninstall ; fi
 
-tags:
+tags :
 	@$(ECHO) "Generating tags (results in ./tags) ..."
 	@-$(RM) -f tags
 	@$(TAGS) $(HFILES) $(CFILES)
 
-TAGS:
+TAGS :
 	@$(ECHO) "Generating emacs tags (results in ./TAGS) ..."
 	@-$(RM) -f TAGS
 	@$(ETAGS) $(HFILES) $(CFILES)
 
-lint:	$(CFILES) $(OBJDIR)/parsdate.c tincfg.h
+lint :	$(CFILES) $(OBJDIR)/parsdate.c tincfg.h options_menu.h
 	@$(ECHO) "Linting source (results in ./LINT) ..."
 	@$(LINT) $(LINTFLAGS) -DNNTP_ABLE `$(LS) $(CFILES)|$(SED) -e 's/\.y/.c/'` $(LIBS) > LINT
 
-clean:
+clean :
 	@$(ECHO) "Cleaning ..."
 	@-$(RM) -f $(OFILES)
 	@-$(RM) -f $(OBJDIR)/parsdate.c
 	@-$(RM) -f LINT *.ln *.out
-	@-$(RM) -f makecfg$(EXEEXT) makecfg.o tincfg.h
+	@-$(RM) -f makecfg$X makecfg$o tincfg.h options_menu.h
 	@-$(RM) -f core *~
 	@-$(RM) -f $(EXE)
 @PCREDIR_MAKE@	@-if test -r ../pcre/Makefile ; then $(CD) ../pcre && $(ECHO) "Cleaning Philip Hazel's Perl-compatible regular expressions library ..." && $(MAKE) @cf_cv_makeflags@ clean ; fi
@@ -415,7 +429,7 @@ clean:
 @INTLDIR_MAKE@	@-if test -r ../intl/Makefile ; then $(CD) ../intl && $(MAKE) @cf_cv_makeflags@ $@ ; fi
 
 laundry \
-dirty:
+dirty :
 	@$(ECHO) "I'm sorry, this is not supported yet ..."
 
 distclean \
@@ -427,20 +441,44 @@ distclean ::
 @INTLDIR_MAKE@	@-$(CD) ../intl && $(MAKE) @cf_cv_makeflags@ $@
 @MSG_DIR_MAKE@	@-$(CD) ../po && $(MAKE) @cf_cv_makeflags@ clean
 
-cflow:
+cflow :
 	@$(ECHO) "Creating cflow for $(PROJECT) ..."
 @PCREDIR_MAKE@	@$(CFLOW) -I$(INCDIR) -I$(SRCDIR) -I../pcre $(CFILES) > cflow.$(PROJECT)
 
-cscope:
+cscope :
 	@$(ECHO) "Creating cscope database $(PROJECT) ..."
 	@$(CSCOPE) $(ALL_FILES)
 
-canlock:
+canlock :
 	@$(ECHO) "Building libcanlock ..."
 	@$(CD) ../libcanlock && ./Build
 
+@PCREDIR_MAKE@../pcre/pcre.h ../pcre/$(PRELIB)pcre.a :
+@PCREDIR_MAKE@	@$(ECHO) "Building Philip Hazel's Perl regular expressions library ..."
+@PCREDIR_MAKE@	@$(CD) ../pcre && $(MAKE) @cf_cv_makeflags@ $(PRELIB)pcre.a
+
+@INTLDIR_MAKE@@INTLLIBS@ :
+@INTLDIR_MAKE@	@$(ECHO) "Building GNU gettext library ..."
+@INTLDIR_MAKE@	@$(CD) ../intl && $(MAKE) @cf_cv_makeflags@
+
+options_menu.h :		$(SRCDIR)/tincfg.tbl \
+				makecfg$X
+	./makecfg $(SRCDIR)/tincfg.tbl tincfg.h
+
+tincfg.h :			$(SRCDIR)/tincfg.tbl \
+				makecfg$X
+	./makecfg $(SRCDIR)/tincfg.tbl $@
+
+makecfg$X :			$(SRCDIR)/makecfg.c \
+				Makefile \
+				$(INCDIR)/tin.h \
+				../include/autoconf.h
+@SHOW_CC@
+	@ECHO_CC@$(BUILD_CC) $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -o $@ makecfg.c #$(BUILD_LIBS)
+
 TIN_DEP	= \
 	Makefile \
+	options_menu.h \
 	$(INCDIR)/tin.h \
 	$(INCDIR)/tinrc.h \
 	../include/autoconf.h \
@@ -448,140 +486,127 @@ TIN_DEP	= \
 	$(INCDIR)/extern.h \
 	$(INCDIR)/nntplib.h \
 	$(INCDIR)/tcurses.h \
-	$(INCDIR)/proto.h $(EXTRA_INTLLIBS)
-
-@PCREDIR_MAKE@../pcre/$(PRELIB)pcre.a:
-@PCREDIR_MAKE@	@$(ECHO) "Building Philip Hazel's Perl regular expressions library ..."
-@PCREDIR_MAKE@	@$(CD) ../pcre && $(MAKE) @cf_cv_makeflags@ $(PRELIB)pcre.a
-
-@INTLDIR_MAKE@@INTLLIBS@:
-@INTLDIR_MAKE@	@$(ECHO) "Building GNU gettext library ..."
-@INTLDIR_MAKE@	@$(CD) ../intl && $(MAKE) @cf_cv_makeflags@
-
-tincfg.h:			$(SRCDIR)/tincfg.tbl \
-				makecfg$(EXEEXT)
-	./makecfg $(SRCDIR)/tincfg.tbl tincfg.h
-
-makecfg$(EXEEXT):		$(OBJDIR)/makecfg.o
-	$(LD) $(LDFLAGS) -o $@ $(OBJDIR)/makecfg.o @LIBS@
+	$(INCDIR)/proto.h $(EXTRA_PCREHDRS) $(EXTRA_INTLLIBS)
 
-$(OBJDIR)/active.o:		$(SRCDIR)/active.c $(TIN_DEP)
-$(OBJDIR)/art.o:		$(SRCDIR)/art.c $(TIN_DEP) \
+$(OBJDIR)/active$o :		$(SRCDIR)/active.c $(TIN_DEP)
+$(OBJDIR)/art$o :		$(SRCDIR)/art.c $(TIN_DEP) \
 				$(INCDIR)/stpwatch.h
-$(OBJDIR)/attrib.o:		$(SRCDIR)/attrib.c $(TIN_DEP) \
+$(OBJDIR)/attrib$o :		$(SRCDIR)/attrib.c $(TIN_DEP) \
 				$(INCDIR)/version.h
-$(OBJDIR)/auth.o:		$(SRCDIR)/auth.c $(TIN_DEP)
-$(OBJDIR)/charset.o:		$(SRCDIR)/charset.c $(TIN_DEP)
-$(OBJDIR)/color.o:		$(SRCDIR)/color.c $(TIN_DEP)
-$(OBJDIR)/config.o:		$(SRCDIR)/config.c $(TIN_DEP) \
-				tincfg.h \
-				$(INCDIR)/menukeys.h \
+$(OBJDIR)/auth$o :		$(SRCDIR)/auth.c $(TIN_DEP)
+$(OBJDIR)/charset$o :		$(SRCDIR)/charset.c $(TIN_DEP)
+$(OBJDIR)/color$o :		$(SRCDIR)/color.c $(TIN_DEP)
+$(OBJDIR)/config$o :		$(SRCDIR)/config.c $(TIN_DEP) \
 				$(INCDIR)/tnntp.h \
 				$(INCDIR)/version.h
-$(OBJDIR)/curses.o:		$(SRCDIR)/curses.c $(TIN_DEP) \
-				$(INCDIR)/tnntp.h
-$(OBJDIR)/cook.o:		$(SRCDIR)/cook.c $(TIN_DEP) \
+$(OBJDIR)/cook$o :		$(SRCDIR)/cook.c $(TIN_DEP) \
 				$(INCDIR)/rfc2046.h
-$(OBJDIR)/debug.o:		$(SRCDIR)/debug.c $(TIN_DEP)
-$(OBJDIR)/envarg.o:		$(SRCDIR)/envarg.c $(TIN_DEP)
-$(OBJDIR)/feed.o:		$(SRCDIR)/feed.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h \
+$(OBJDIR)/curses$o :		$(SRCDIR)/curses.c $(TIN_DEP) \
+				$(INCDIR)/tnntp.h
+$(OBJDIR)/debug$o :		$(SRCDIR)/debug.c $(TIN_DEP) \
+				$(INCDIR)/newsrc.h
+$(OBJDIR)/envarg$o :		$(SRCDIR)/envarg.c $(TIN_DEP)
+$(OBJDIR)/feed$o :		$(SRCDIR)/feed.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h \
 				$(INCDIR)/rfc2046.h
-$(OBJDIR)/filter.o:		$(SRCDIR)/filter.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h \
+$(OBJDIR)/filter$o :		$(SRCDIR)/filter.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h \
 				$(INCDIR)/version.h
-$(OBJDIR)/getline.o:		$(SRCDIR)/getline.c $(TIN_DEP)
-$(OBJDIR)/global.o:		$(SRCDIR)/global.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h
-$(OBJDIR)/group.o:		$(SRCDIR)/group.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h
-$(OBJDIR)/hashstr.o:		$(SRCDIR)/hashstr.c $(TIN_DEP)
-$(OBJDIR)/header.o:		$(SRCDIR)/header.c $(TIN_DEP) \
+$(OBJDIR)/getline$o :		$(SRCDIR)/getline.c $(TIN_DEP)
+$(OBJDIR)/global$o :		$(SRCDIR)/global.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h
+$(OBJDIR)/group$o :		$(SRCDIR)/group.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h
+$(OBJDIR)/hashstr$o :		$(SRCDIR)/hashstr.c $(TIN_DEP)
+$(OBJDIR)/header$o :		$(SRCDIR)/header.c $(TIN_DEP) \
 				$(INCDIR)/tnntp.h
-$(OBJDIR)/help.o:		$(SRCDIR)/help.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h
-$(OBJDIR)/inews.o:		$(SRCDIR)/inews.c $(TIN_DEP) \
+$(OBJDIR)/help$o :		$(SRCDIR)/help.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h
+$(OBJDIR)/inews$o :		$(SRCDIR)/inews.c $(TIN_DEP) \
 				$(INCDIR)/tnntp.h
-$(OBJDIR)/init.o:		$(SRCDIR)/init.c $(TIN_DEP) \
+$(OBJDIR)/init$o :		$(SRCDIR)/init.c $(TIN_DEP) \
 				$(INCDIR)/bugrep.h \
-				$(INCDIR)/menukeys.h \
+				$(INCDIR)/keymap.h \
 				$(INCDIR)/tnntp.h \
 				$(INCDIR)/version.h
-$(OBJDIR)/joinpath.o:		$(SRCDIR)/joinpath.c $(TIN_DEP)
-$(OBJDIR)/keymap.o:		$(SRCDIR)/keymap.c $(TIN_DEP) \
+$(OBJDIR)/joinpath$o :		$(SRCDIR)/joinpath.c $(TIN_DEP)
+$(OBJDIR)/keymap$o :		$(SRCDIR)/keymap.c $(TIN_DEP) \
 				$(INCDIR)/keymap.h \
-				$(INCDIR)/menukeys.h
-$(OBJDIR)/lang.o:		$(SRCDIR)/lang.c $(TIN_DEP)
-$(OBJDIR)/langinfo.o:		$(SRCDIR)/langinfo.c $(TIN_DEP)
-$(OBJDIR)/list.o:		$(SRCDIR)/list.c $(TIN_DEP)
-$(OBJDIR)/lock.o:		$(SRCDIR)/lock.c $(TIN_DEP)
-$(OBJDIR)/mail.o:		$(SRCDIR)/mail.c $(TIN_DEP)
-$(OBJDIR)/main.o:		$(SRCDIR)/main.c $(TIN_DEP) \
 				$(INCDIR)/version.h
-$(OBJDIR)/makecfg.o:		$(SRCDIR)/makecfg.c $(TIN_DEP)
-$(OBJDIR)/memory.o:		$(SRCDIR)/memory.c $(TIN_DEP) \
+$(OBJDIR)/lang$o :		$(SRCDIR)/lang.c $(TIN_DEP)
+$(OBJDIR)/langinfo$o :		$(SRCDIR)/langinfo.c $(TIN_DEP)
+$(OBJDIR)/list$o :		$(SRCDIR)/list.c $(TIN_DEP)
+$(OBJDIR)/lock$o :		$(SRCDIR)/lock.c $(TIN_DEP)
+$(OBJDIR)/mail$o :		$(SRCDIR)/mail.c $(TIN_DEP)
+$(OBJDIR)/main$o :		$(SRCDIR)/main.c $(TIN_DEP) \
+				$(INCDIR)/version.h
+$(OBJDIR)/memory$o :		$(SRCDIR)/memory.c $(TIN_DEP) \
 				$(INCDIR)/rfc2046.h
-$(OBJDIR)/mimetypes.o:		$(SRCDIR)/mimetypes.c $(TIN_DEP)
-$(OBJDIR)/misc.o:		$(SRCDIR)/misc.c $(TIN_DEP) \
+$(OBJDIR)/mimetypes$o :		$(SRCDIR)/mimetypes.c $(TIN_DEP)
+$(OBJDIR)/misc$o :		$(SRCDIR)/misc.c $(TIN_DEP) \
 				$(INCDIR)/policy.h \
-				$(INCDIR)/rfc2046.h
-$(OBJDIR)/my_tmpfile.o:		$(SRCDIR)/my_tmpfile.c $(TIN_DEP)
-$(OBJDIR)/newsrc.o:		$(SRCDIR)/newsrc.c $(TIN_DEP) \
+				$(INCDIR)/rfc2046.h \
+				$(INCDIR)/version.h
+$(OBJDIR)/my_tmpfile$o :	$(SRCDIR)/my_tmpfile.c $(TIN_DEP)
+$(OBJDIR)/newsrc$o :		$(SRCDIR)/newsrc.c $(TIN_DEP) \
+				$(INCDIR)/newsrc.h \
 				$(INCDIR)/tnntp.h
-$(OBJDIR)/nntplib.o:		$(SRCDIR)/nntplib.c $(TIN_DEP) \
+$(OBJDIR)/nntplib$o :		$(SRCDIR)/nntplib.c $(TIN_DEP) \
 				$(INCDIR)/tnntp.h
-$(OBJDIR)/nrctbl.o:		$(SRCDIR)/nrctbl.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h \
+$(OBJDIR)/nrctbl$o :		$(SRCDIR)/nrctbl.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h \
 				$(INCDIR)/version.h
-$(OBJDIR)/open.o:		$(SRCDIR)/open.c $(TIN_DEP) \
-				$(INCDIR)/tnntp.h
-$(OBJDIR)/page.o:		$(SRCDIR)/page.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h \
+$(OBJDIR)/options_menu$o :	$(SRCDIR)/options_menu.c $(TIN_DEP) \
+				tincfg.h \
+				$(INCDIR)/keymap.h
+$(OBJDIR)/page$o :		$(SRCDIR)/page.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h \
 				$(INCDIR)/rfc2046.h
-$(OBJDIR)/parsdate.o:		$(OBJDIR)/parsdate.y $(TIN_DEP)
-$(OBJDIR)/pgp.o:		$(SRCDIR)/pgp.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h
-$(OBJDIR)/plp_snprintf.o:	$(SRCDIR)/plp_snprintf.c $(TIN_DEP) \
+$(OBJDIR)/parsdate$o :		$(OBJDIR)/parsdate.y $(TIN_DEP)
+$(OBJDIR)/pgp$o :		$(SRCDIR)/pgp.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h
+$(OBJDIR)/plp_snprintf$o :	$(SRCDIR)/plp_snprintf.c $(TIN_DEP) \
 				$(INCDIR)/plp_snprintf.h
-$(OBJDIR)/post.o:		$(SRCDIR)/post.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h \
+$(OBJDIR)/post$o :		$(SRCDIR)/post.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h \
 				$(INCDIR)/rfc2046.h \
 				$(INCDIR)/version.h
-$(OBJDIR)/prompt.o:		$(SRCDIR)/prompt.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h
-$(OBJDIR)/read.o:		$(SRCDIR)/read.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h \
+$(OBJDIR)/prompt$o :		$(SRCDIR)/prompt.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h
+$(OBJDIR)/read$o :		$(SRCDIR)/read.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h \
 				$(INCDIR)/tnntp.h
-$(OBJDIR)/refs.o:		$(SRCDIR)/refs.c $(TIN_DEP)
-$(OBJDIR)/regex.o:		$(SRCDIR)/regex.c $(TIN_DEP)
-$(OBJDIR)/rfc1524.o:		$(SRCDIR)/rfc1524.c $(TIN_DEP) \
+$(OBJDIR)/refs$o :		$(SRCDIR)/refs.c $(TIN_DEP)
+$(OBJDIR)/regex$o :		$(SRCDIR)/regex.c $(TIN_DEP)
+$(OBJDIR)/rfc1524$o :		$(SRCDIR)/rfc1524.c $(TIN_DEP) \
 				$(INCDIR)/rfc2046.h
-$(OBJDIR)/rfc2045.o:		$(SRCDIR)/rfc2045.c $(TIN_DEP)
-$(OBJDIR)/rfc2046.o:		$(SRCDIR)/rfc2046.c $(TIN_DEP) \
+$(OBJDIR)/rfc2045$o :		$(SRCDIR)/rfc2045.c $(TIN_DEP)
+$(OBJDIR)/rfc2046$o :		$(SRCDIR)/rfc2046.c $(TIN_DEP) \
 				$(INCDIR)/rfc2046.h
-$(OBJDIR)/rfc2047.o:		$(SRCDIR)/rfc2047.c $(TIN_DEP) \
+$(OBJDIR)/rfc2047$o :		$(SRCDIR)/rfc2047.c $(TIN_DEP) \
 				$(INCDIR)/rfc2046.h
-$(OBJDIR)/save.o:		$(SRCDIR)/save.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h \
+$(OBJDIR)/save$o :		$(SRCDIR)/save.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h \
 				$(INCDIR)/rfc2046.h
-$(OBJDIR)/screen.o:		$(SRCDIR)/screen.c $(TIN_DEP)
-$(OBJDIR)/search.o:		$(SRCDIR)/search.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h
-$(OBJDIR)/select.o:		$(SRCDIR)/select.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h
-$(OBJDIR)/sigfile.o:		$(SRCDIR)/sigfile.c $(TIN_DEP)
-$(OBJDIR)/signal.o:		$(SRCDIR)/signal.c $(TIN_DEP) \
-				$(INCDIR)/version.h
-$(OBJDIR)/strftime.o:		$(SRCDIR)/strftime.c $(TIN_DEP)
-$(OBJDIR)/string.o:		$(SRCDIR)/string.c $(TIN_DEP)
-$(OBJDIR)/tags.o:		$(SRCDIR)/tags.c $(TIN_DEP)
-$(OBJDIR)/tcurses.o:		$(SRCDIR)/tcurses.c $(TIN_DEP)
-$(OBJDIR)/tmpfile.o:		$(SRCDIR)/tmpfile.c $(TIN_DEP)
-$(OBJDIR)/thread.o:		$(SRCDIR)/thread.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h
-$(OBJDIR)/version.o:		$(SRCDIR)/version.c $(TIN_DEP) \
-				$(INCDIR)/menukeys.h \
-				$(INCDIR)/version.h
-$(OBJDIR)/wildmat.o:		$(SRCDIR)/wildmat.c $(TIN_DEP)
-$(OBJDIR)/xface.o:		$(SRCDIR)/xface.c $(TIN_DEP)
-$(OBJDIR)/xref.o:		$(SRCDIR)/xref.c $(TIN_DEP)
+$(OBJDIR)/screen$o :		$(SRCDIR)/screen.c $(TIN_DEP)
+$(OBJDIR)/search$o :		$(SRCDIR)/search.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h
+$(OBJDIR)/select$o :		$(SRCDIR)/select.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h
+$(OBJDIR)/sigfile$o :		$(SRCDIR)/sigfile.c $(TIN_DEP)
+$(OBJDIR)/signal$o :		$(SRCDIR)/signal.c $(TIN_DEP) \
+				$(INCDIR)/version.h
+$(OBJDIR)/strftime$o :		$(SRCDIR)/strftime.c $(TIN_DEP)
+$(OBJDIR)/string$o :		$(SRCDIR)/string.c $(TIN_DEP)
+$(OBJDIR)/tags$o :		$(SRCDIR)/tags.c $(TIN_DEP)
+$(OBJDIR)/tcurses$o :		$(SRCDIR)/tcurses.c $(TIN_DEP)
+$(OBJDIR)/thread$o :		$(SRCDIR)/thread.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h
+$(OBJDIR)/tmpfile$o :		$(SRCDIR)/tmpfile.c $(TIN_DEP)
+$(OBJDIR)/version$o :		$(SRCDIR)/version.c $(TIN_DEP) \
+				$(INCDIR)/keymap.h \
+				$(INCDIR)/version.h
+$(OBJDIR)/wildmat$o :		$(SRCDIR)/wildmat.c $(TIN_DEP)
+$(OBJDIR)/xface$o :		$(SRCDIR)/xface.c $(TIN_DEP)
+$(OBJDIR)/xref$o :		$(SRCDIR)/xref.c $(TIN_DEP) \
+				$(INCDIR)/newsrc.h
diff -Nurp tin-1.6.2/src/active.c tin-1.8.0/src/active.c
--- tin-1.6.2/src/active.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/active.c	2005-12-02 12:07:35.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : active.c
  *  Author    : I. Lea
  *  Created   : 1992-02-16
- *  Updated   : 2003-06-29
+ *  Updated   : 2004-06-30
  *  Notes     :
  *
- * Copyright (c) 1992-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1992-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -62,6 +62,8 @@ static time_t active_timestamp;	/* time 
 /*
  * Local prototypes
  */
+static FILE *open_newgroups_fp(int idx);
+static FILE *open_news_active_fp(void);
 static void active_add(struct t_group *ptr, long count, long max, long min, const char *moderated);
 static void append_group_line(char *active_file, char *group_path, long art_max, long art_min, char *base_dir);
 static void check_for_any_new_groups(void);
@@ -72,25 +74,6 @@ static void read_newsrc_active_file(void
 static void subscribe_new_group(char *group, char *autosubscribe, char *autounsubscribe);
 
 
-/*
- * Get default array size for active[] from environment (AmigaDOS)
- * or just return the standard default.
- */
-int
-get_active_num(
-	void)
-{
-#ifdef ENV_VAR_GROUPS /* M_AMIGA only */
-	char *ptr;
-	int num;
-
-	if ((ptr = getenv(ENV_VAR_GROUPS)) != NULL)
-		return ((num = atoi(ptr)) ? num : DEFAULT_ACTIVE_NUM);
-#endif /* ENV_VAR_GROUPS */
-	return DEFAULT_ACTIVE_NUM;
-}
-
-
 t_bool
 need_reread_active_file(
 	void)
@@ -138,7 +121,6 @@ resync_active_file(
 		toggle_my_groups(old_group);
 
 	FreeAndNull(old_group);
-	set_groupname_len(FALSE);
 	show_selection_page();
 
 	return TRUE;
@@ -159,8 +141,8 @@ active_add(
 	const char *moderated)
 {
 	/* name - pre-initialised when group is made */
-	ptr->aliasedto = ((moderated[0] == '=') ? my_strdup(moderated + 1) : (char *) 0);
-	ptr->description = (char *) 0;
+	ptr->aliasedto = ((moderated[0] == '=') ? my_strdup(moderated + 1) : NULL);
+	ptr->description = NULL;
 	/* spool - see below */
 	ptr->moderated = moderated[0];
 	ptr->count = count;
@@ -317,7 +299,7 @@ read_newsrc_active_file(
 			char line[NNTP_STRLEN];
 			if (window < NUM_SIMULTANEOUS_GROUP_COMMAND && ptr) {
 				ngnames[index_i] = my_strdup(ptr);
-				sprintf(buf, "GROUP %s", ngnames[index_i]);
+				snprintf(buf, sizeof(buf), "GROUP %s", ngnames[index_i]);
 #	ifdef DEBUG
 				debug_nntp("read_newsrc_active_file", buf);
 #	endif /* DEBUG */
@@ -338,7 +320,7 @@ read_newsrc_active_file(
 					int i;
 					int j = index_o;
 					for (i = 0; i < window - 1; i++) {
-						sprintf(buf, "GROUP %s", ngnames[j]);
+						snprintf(buf, sizeof(buf), "GROUP %s", ngnames[j]);
 #	ifdef DEBUG
 						debug_nntp("read_newsrc_active_file", buf);
 #	endif /* DEBUG */
@@ -359,8 +341,7 @@ read_newsrc_active_file(
 						{
 							char fmt[20];
 
-							sprintf(fmt, "%%ld %%ld %%ld %%%ds", NNTP_STRLEN);
-
+							snprintf(fmt, sizeof(fmt), "%%ld %%ld %%ld %%%ds", NNTP_STRLEN);
 							if (sscanf(line, fmt, &count, &min, &max, ngname) != 4)
 								error_message(_(txt_error_invalid_response_to_group), line);
 							if (strcmp(ngname, ngnames[index_o]) != 0)
@@ -457,13 +438,29 @@ read_newsrc_active_file(
 
 
 /*
+ * Open the news active file locally or send the LIST command
+ */
+static FILE *
+open_news_active_fp(
+	void)
+{
+#ifdef NNTP_ABLE
+	if (read_news_via_nntp && !read_saved_news)
+		return (nntp_command("LIST", OK_GROUPS, NULL, 0));
+	else
+#endif /* NNTP_ABLE */
+		return (fopen(news_active_file, "r"));
+}
+
+
+/*
  * Load the active file into active[]
  */
 static void
 read_active_file(
 	void)
 {
-	FILE *fp = (FILE *) 0;
+	FILE *fp;
 	char *ptr;
 	char moderated[PATH_LEN];
 	long count = -1L, min = 1L, max = 0L;
@@ -483,7 +480,7 @@ read_active_file(
 #	ifndef NNTP_ONLY
 		else
 			error_message(_(txt_cannot_open_active_file), news_active_file, tin_progname);
-#	endif /* NNTP_ONLY */
+#	endif /* !NNTP_ONLY */
 #else
 		error_message(_(txt_cannot_open), news_active_file);
 #endif /* NNTP_ABLE */
@@ -549,7 +546,7 @@ void
 read_news_active_file(
 	void)
 {
-	FILE *fp = 0;
+	FILE *fp;
 
 	/*
 	 * Ignore -n if no .newsrc can be found or .newsrc is empty
@@ -592,6 +589,41 @@ read_news_active_file(
 
 
 /*
+ * Open the active.times file locally or send the NEWGROUPS command
+ *
+ * NEWGROUPS yymmdd hhmmss
+ */
+static FILE *
+open_newgroups_fp(
+	int idx)
+{
+#ifdef NNTP_ABLE
+	char line[NNTP_STRLEN];
+	struct tm *ngtm;
+
+	if (read_news_via_nntp && !read_saved_news) {
+		if (idx == -1)
+			return (FILE *) 0;
+
+		ngtm = localtime(&newnews[idx].time);
+		/*
+		 * in the current draft, NEWGROUPS is allowed to take a 4 digit year
+		 * component - but even with a 2 digit year component it is y2k
+		 * compliant... we should switch over to ngtm->tm_year + 1900
+		 * when most servers can handle the new format
+		 */
+		snprintf(line, sizeof(line), "NEWGROUPS %02d%02d%02d %02d%02d%02d",
+			ngtm->tm_year % 100, ngtm->tm_mon + 1, ngtm->tm_mday,
+			ngtm->tm_hour, ngtm->tm_min, ngtm->tm_sec);
+
+		return (nntp_command(line, OK_NEWGROUPS, NULL, 0));
+	} else
+#endif /* NNTP_ABLE */
+		return (fopen(active_times_file, "r"));
+}
+
+
+/*
  * Check for any newly created newsgroups.
  *
  * If reading news locally check the NEWSLIBDIR/active.times file.
@@ -670,7 +702,7 @@ check_for_any_new_groups(
 	if (newnews_index >= 0)
 		newnews[newnews_index].time = new_newnews_time;
 	else {
-		sprintf(buf, "%s %lu", nntp_server, (unsigned long int) new_newnews_time);
+		snprintf(buf, sizeof(buf), "%s %lu", nntp_server, (unsigned long int) new_newnews_time);
 		load_newnews_info(buf);
 	}
 }
@@ -753,9 +785,8 @@ match_group_list(
 	char *separator;
 	char pattern[HEADER_LEN];
 	size_t group_len, list_len;
-	t_bool accept, negate;
+	t_bool negate, accept = FALSE;
 
-	accept = FALSE;
 	list_len = strlen(group_list);
 	/*
 	 * walk through comma-separated entries in list
@@ -765,7 +796,7 @@ match_group_list(
 		 * find end/length of this entry
 		 */
 		separator = strchr(group_list, ',');
-		group_len = ((separator == NULL) ? list_len : (size_t) (separator - group_list));
+		group_len = MIN(((separator == NULL) ? list_len : (size_t) (separator - group_list)), sizeof(pattern) - 1);
 
 		if ((negate = ('!' == *group_list))) {
 			/*
@@ -820,7 +851,7 @@ load_newnews_info(
 	 */
 	if (!num_newnews) {
 		for (i = 0; i < max_newnews; i++) {
-			newnews[i].host = (char *) 0;
+			newnews[i].host = NULL;
 			newnews[i].time = (time_t) 0;
 		}
 	}
@@ -957,9 +988,7 @@ make_group_list(
 				make_group_list(active_file, base_dir, group_path);
 				find_art_max_min(group_path, &art_max, &art_min);
 				append_group_line(active_file, group_path, art_max, art_min, base_dir);
-
-				ptr = strrchr(group_path, '/'); /* TODO: Unix'ism */
-				if (ptr != NULL)
+				if ((ptr = strrchr(group_path, '/')) != NULL) /* TODO: Unix'ism */
 					*ptr = '\0';
 			}
 		}
diff -Nurp tin-1.6.2/src/art.c tin-1.8.0/src/art.c
--- tin-1.6.2/src/art.c	2003-08-26 15:11:35.000000000 +0200
+++ tin-1.8.0/src/art.c	2005-12-02 12:07:35.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : art.c
  *  Author    : I.Lea & R.Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 2003-08-23
+ *  Updated   : 2005-06-30
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,45 +42,52 @@
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
 
-#ifdef PROFILE
-#	ifndef STPWATCH_H
-#		include "stpwatch.h"
-#	endif /* !STPWATCH_H */
-#endif /* PROFILE */
+#ifndef STPWATCH_H
+#	include "stpwatch.h"
+#endif /* !STPWATCH_H */
 
 /*
  * TODO: fixup to remove CURR_GROUP dependency in all sort funcs
  */
 #define SortBy(func)	qsort(arts, (size_t) top_art, sizeof(struct t_article), func);
 
-static long last_read_article;
 int top_art = 0;				/* # of articles in arts[] */
 
+
 /*
  * Local prototypes
  */
+static FILE *open_art_header(long art, long *next);
 static FILE *open_xover_fp(struct t_group *group, const char *mode, long min, long max, t_bool local);
 static char *find_nov_file(struct t_group *group, int mode);
 static char *print_date(time_t secs);
 static char *print_from(struct t_article *article);
 static int artnum_comp(t_comptype p1, t_comptype p2);
-static int date_comp(t_comptype p1, t_comptype p2);
-static int from_comp(t_comptype p1, t_comptype p2);
+static int base_comp(t_comptype p1, t_comptype p2);
+static int date_comp_asc(t_comptype p1, t_comptype p2);
+static int date_comp_desc(t_comptype p1, t_comptype p2);
+static int from_comp_asc(t_comptype p1, t_comptype p2);
+static int from_comp_desc(t_comptype p1, t_comptype p2);
 static int global_get_multiparts(int aindex, MultiPartInfo **malloc_and_setme_info);
 static int global_look_for_multipart_info(int aindex, MultiPartInfo *setme, char start, char stop, int *offset);
-static int lines_comp(t_comptype p1, t_comptype p2);
-static int read_nov_file(struct t_group *group, long min, long max, int *expired, t_bool local);
-static int read_group(struct t_group *group, int *pcount);
-static int score_comp(t_comptype p1, t_comptype p2);
+static int lines_comp_asc(t_comptype p1, t_comptype p2);
+static int lines_comp_desc(t_comptype p1, t_comptype p2);
+static int read_art_headers(struct t_group *group, int total, long top);
+static int read_overview(struct t_group *group, long min, long max, long *top, t_bool local);
+static int score_comp_asc(t_comptype p1, t_comptype p2);
+static int score_comp_desc(t_comptype p1, t_comptype p2);
 static int score_comp_base(t_comptype p1, t_comptype p2);
-static int subj_comp(t_comptype p1, t_comptype p2);
+static int subj_comp_asc(t_comptype p1, t_comptype p2);
+static int subj_comp_desc(t_comptype p1, t_comptype p2);
 static int valid_artnum(long art);
 static long find_first_unread(struct t_group *group);
+static long setup_hard_base(struct t_group *group);
 static t_bool parse_headers(FILE *fp, struct t_article *h);
 static t_compfunc eval_sort_arts_func(unsigned int sort_art_type);
 static void sort_base(unsigned int sort_threads_type);
-static void thread_by_subject(void);
 static void thread_by_multipart(void);
+static void thread_by_percentage(struct t_group *group);
+static void thread_by_subject(void);
 
 
 /*
@@ -97,19 +104,15 @@ show_art_msg(
 
 
 /*
- * Construct the pointers to the base article in each thread.
+ * Construct the pointers to the first (base) article in each thread.
  * If we are showing only unread, then point to the first unread. I have
  * no idea why this should be so, it causes problems elsewhere [which_response]
- * .prev is set on each article that is after the first article in the
- * thread and points to the previous article. Articles which have been expired
- * have their .thread set to ART_EXPIRED
  */
 void
 find_base(
 	struct t_group *group)
 {
-	int i;
-	int j;
+	int i, j;
 
 	grpmenu.max = 0;
 
@@ -117,17 +120,23 @@ find_base(
 	debug_print_arts();
 #endif /* DEBUG */
 
-	if (group->attribute->show_only_unread) {
-		for_each_art(i) {
-			if (arts[i].prev >= 0 || arts[i].thread == ART_EXPIRED || (arts[i].killed && tinrc.kill_level == KILL_NOTHREAD))
-				continue;
+	for_each_art(i) {
+		/*
+		 * .prev will be set on each article that is after the first article in
+		 * the thread. Invalid articles which have been expired will have
+		 * .thread set to ART_EXPIRED
+		 */
+		if (arts[i].prev >= 0 || arts[i].thread == ART_EXPIRED || (arts[i].killed && tinrc.kill_level == KILL_NOTHREAD))
+			continue;
 
-			if (grpmenu.max >= max_art)
-				expand_art();
+		if (grpmenu.max >= max_art)
+			expand_art();
 
+		if (group->attribute->show_only_unread) {
 			if (arts[i].status != ART_READ)
 				base[grpmenu.max++] = i;
 			else {
+				/* Find 1st unread art in thread */
 				for (j = i; j >= 0; j = arts[j].thread) {
 					if (arts[j].status != ART_READ) {
 						base[grpmenu.max++] = i;
@@ -135,21 +144,173 @@ find_base(
 					}
 				}
 			}
+		} else
+			base[grpmenu.max++] = i;
+	}
+	/* sort base[] */
+	if (group->attribute->sort_threads_type > SORT_THREADS_BY_NOTHING)
+		sort_base(group->attribute->sort_threads_type);
+}
+
+
+/*
+ * Longword comparison routine for the qsort()
+ */
+static int
+base_comp(
+	t_comptype p1,
+	t_comptype p2)
+{
+	const long *a = (const long *) p1;
+	const long *b = (const long *) p2;
+
+	if (*a < *b)
+		return -1;
+
+	if (*a > *b)
+		return 1;
+
+	return 0;
+}
+
+
+/*
+ * via NNTP:
+ *   Issue a LISTGROUP command
+ *   Read the article numbers existing in the group into base[]
+ *   If the LISTGROUP failed, issue a GROUP command. Use the results to
+ *   create a less accurate version of base[]
+ *   This data will already be sorted
+ *
+ * on local spool:
+ *   Read the spool dir to populate base[] as above. Sort it.
+ *
+ * Grow the arts[] and bitmaps as needed.
+ * NB: the output will be sorted on artnum
+ *
+ * grpmenu.max is one past top.
+ * Returns total number of articles in group, or -1 on error
+ */
+static long
+setup_hard_base(
+	struct t_group *group)
+{
+	char buf[NNTP_STRLEN];
+	long art;
+	long total = 0;
+
+	grpmenu.max = 0;
+
+	/*
+	 * If reading with NNTP, issue a LISTGROUP
+	 */
+	if (read_news_via_nntp && group->type == GROUP_TYPE_NEWS) {
+#ifdef NNTP_ABLE
+		FILE *fp;
+
+#	ifdef BROKEN_LISTGROUP
+		/*
+		 * Some nntp servers are broken and need an extra GROUP command
+		 * (reported by reorx@irc.pl). This affects (old?) versions of
+		 * nntpcache and leafnode. Usually this should not be needed.
+		 */
+		snprintf(buf, sizeof(buf), "GROUP %s", group->name);
+		if (nntp_command(buf, OK_GROUP, NULL, 0) == NULL)
+			return -1;
+#	endif /* BROKEN_LISTGROUP */
+
+		/*
+		 * See if LISTGROUP works
+		 */
+		snprintf(buf, sizeof(buf), "LISTGROUP %s", group->name);
+		if ((fp = nntp_command(buf, OK_GROUP, NULL, 0)) != NULL) {
+			char *ptr;
+
+#	ifdef DEBUG
+			debug_nntp("setup_hard_base", buf);
+#	endif /* DEBUG */
+
+			while ((ptr = tin_fgets(fp, FALSE)) != NULL) {
+				if (grpmenu.max >= max_art)
+					expand_art();
+				base[grpmenu.max++] = atoi(ptr);
+			}
+
+			if (tin_errno)
+				return -1;
+
+		} else {
+			/*
+			 * LISTGROUP failed, use GROUP command instead
+			 */
+			long start, last, count;
+			char line[NNTP_STRLEN];
+
+			/*
+			 * Handle the obscure case that the user aborted before the LISTGROUP
+			 * had a chance to respond
+			 */
+			if (tin_errno)
+				return -1;
+
+			snprintf(buf, sizeof(buf), "GROUP %s", group->name);
+			if (nntp_command(buf, OK_GROUP, line, sizeof(line)) == NULL)
+				return -1;
+
+			if (sscanf(line, "%ld %ld %ld", &count, &start, &last) != 3)
+				return -1;
+
+			/*
+			 * TODO: AFAICS "total" and "count" arn't used in the code below
+			 *       anymore, why do we bother to set them?
+			 */
+			total = count;
+			if (last - count > start)
+				count = last - start;
+
+			while (start <= last) {
+				if (grpmenu.max >= max_art)
+					expand_art();
+				base[grpmenu.max++] = start++;
+			}
 		}
+#endif /* NNTP_ABLE */
+	/*
+	 * Reading off local spool, read the directory files
+	 */
 	} else {
-		for_each_art(i) {
-			if (arts[i].prev >= 0 || arts[i].thread == ART_EXPIRED || (arts[i].killed && tinrc.kill_level == KILL_NOTHREAD))
-				continue;
+		DIR *d;
+		DIR_BUF *e;
+
+		make_base_group_path(group->spooldir, group->name, buf);
 
-			if (grpmenu.max >= max_art)
-				expand_art();
+		if (access(buf, R_OK) != 0) {
+			error_message(_(txt_not_exist));
+			return -1;
+		}
 
-			base[grpmenu.max++] = i;
+		if ((d = opendir(buf)) != NULL) {
+			while ((e = readdir(d)) != NULL) {
+				art = atol(e->d_name);
+				if (art >= 1) {
+					total++;
+					if (grpmenu.max >= max_art)
+						expand_art();
+					base[grpmenu.max++] = art;
+				}
+			}
+			CLOSEDIR(d);
+			qsort((char *) base, (size_t) grpmenu.max, sizeof(long), base_comp);
 		}
 	}
-	/* sort base[] */
-	if (group->attribute->sort_threads_type > SORT_THREADS_BY_NOTHING)
-		sort_base(group->attribute->sort_threads_type);
+
+	if (grpmenu.max) {
+		if (base[grpmenu.max - 1] > group->xmax)
+			group->xmax = base[grpmenu.max - 1];
+		expand_bitmap(group, base[0]);
+	}
+
+	return total;
 }
 
 
@@ -167,11 +328,11 @@ index_group(
 	struct t_group *group)
 {
 	int i;
-	int count;
-	int expired;
-	int modified;
-	long min;
-	long max;
+	int changed;				/* Count of articles whose overview has changed */
+	int respnum;
+	int total;
+	long last_read_article;
+	long min, max;
 	t_bool caching_xover;
 	t_bool filtered;
 
@@ -187,25 +348,19 @@ index_group(
 	free_art_array();
 	free_msgids();
 
-	/*
-	 * Load articles within min..max from xover index file if it exists
-	 * and then create base[] article numbers from loaded articles.
-	 * If nov file does not exist then create base[] with setup_hard_base().
-	 */
-#ifdef PROFILE
 	BegStopWatch("setup_hard_base");
-#endif /* PROFILE */
 
+	/*
+	 * Get list of valid article numbers
+	 */
 	if (setup_hard_base(group) < 0)
 		return FALSE;
 
-#ifdef PROFILE
 	EndStopWatch();
 	PrintStopWatch();
-#endif /* PROFILE */
 
 #ifdef DEBUG_NEWSRC
-	debug_print_comment("Before read_nov_file");
+	debug_print_comment("Before read_overview");
 	debug_print_bitmap(group, NULL);
 #endif /* DEBUG_NEWSRC */
 
@@ -232,42 +387,59 @@ index_group(
 	last_read_article = 0L;
 
 	/*
-	 * Read in the existing overview
+	 * Read in the existing overview data for min..max
 	 * This read has local=TRUE set if locally caching XOVER records to ensure
 	 * we pull in any private overview caches in preference to using using OVER
 	 *
 	 * When reading local spool, this will pull in the system wide overview
 	 * cache (if found) otherwise the private overview cache will be read
 	 */
-	caching_xover = (tinrc.cache_overview_files && xover_cmd && group->type == GROUP_TYPE_NEWS);
-
-	if (read_nov_file(group, min, max, &expired, caching_xover) == -1)
+	caching_xover = (tinrc.cache_overview_files && nntp_caps.over_cmd && group->type == GROUP_TYPE_NEWS);
+	if ((changed = read_overview(group, min, max, &last_read_article, caching_xover)) == -1)
 		return FALSE;	/* user aborted indexing */
 
 	/*
 	 * Fill in the range last_read_article...max using XOVER
-	 * Only do this if the previous read_nov_file() was against private cache
+	 * Only do this if the previous read_overview() was against private cache
 	 */
 	if ((last_read_article < max) && caching_xover) {
-		if (read_nov_file(group, (last_read_article >= min) ? last_read_article + 1 : min, max, &expired, FALSE) == -1)
+		min = (last_read_article >= min) ? last_read_article + 1 : min;
+
+		if ((changed += read_overview(group, min, max, &last_read_article, FALSE)) == -1)
 			return FALSE;	/* user aborted indexing */
 	} else
 		caching_xover = FALSE;
 
 	/*
-	 * Add any articles to arts[] that are new or were killed
+	 * Mark as UNTHREADED all articles that have been verified as valid
+	 * Get num of new arts to index so the user will have an idea of index time
 	 */
-	if ((modified = read_group(group, &count)) == -1)
-		return FALSE;		/* user aborted indexing */
+	for (i = 0, total = 0; i < grpmenu.max; i++) {
+		if ((respnum = valid_artnum(base[i])) >= 0) {
+			arts[respnum].thread = ART_UNTHREADED;
+			continue;
+		}
+		if (base[i] <= last_read_article)		/* It is vital this test be done last */
+			continue;
+		total++;
+	}
 
 	/*
-	 * Do this before calling art_mark(,, ART_READ) if you want
-	 * the unread count to be correct.
+	 * Add any articles to arts[] that are new or were killed
 	 */
+	if (total > 0) {
+		if ((changed += read_art_headers(group, total, last_read_article)) == -1)
+			return FALSE;		/* user aborted indexing */
+	}
+
 #ifdef DEBUG_NEWSRC
 	debug_print_comment("Before parse_unread_arts()");
 	debug_print_bitmap(group, NULL);
 #endif /* DEBUG_NEWSRC */
+	/*
+	 * Do this before calling art_mark(,, ART_READ) if you want
+	 * the unread count to be correct.
+	 */
 	parse_unread_arts(group);
 #ifdef DEBUG_NEWSRC
 	debug_print_comment("After parse_unread_arts()");
@@ -279,7 +451,7 @@ index_group(
 	 */
 	for_each_art(i) {
 		if (arts[i].thread == ART_EXPIRED) {
-			expired = 1;
+			changed++;
 #ifdef DEBUG_NEWSRC
 			debug_print_comment("art.c: index_group() purging...");
 #endif /* DEBUG_NEWSRC */
@@ -289,9 +461,10 @@ index_group(
 
 	/*
 	 * Only rewrite the index if it has changed
+	 * TODO review the exact logic behind "|| caching_xover"
 	 */
-	if (expired || modified || caching_xover)
-		write_nov_file(group);
+	if (changed || caching_xover)
+		write_overview(group);
 
 	/*
 	 * Create the reference tree. The msgid and ref ptrs will
@@ -304,18 +477,17 @@ index_group(
 	 */
 	filtered = filter_articles(group);
 
-#ifdef PROFILE
 	BegStopWatch("make_thread");
-#endif /* PROFILE */
 
+	/*
+	 * Thread the group
+	 */
 	make_threads(group, FALSE);
 
-#ifdef PROFILE
 	EndStopWatch();
 	PrintStopWatch();
-#endif /* PROFILE */
 
-	if ((modified || filtered) && !batch_mode)
+	if ((changed > 0 || filtered) && !batch_mode)
 		clear_message();
 
 	return TRUE;
@@ -343,85 +515,108 @@ find_first_unread(
 
 
 /*
+ * Open an article for reading just the header
+ * 'next' is used/updated with the next article number
+ * to optimise the number of 'HEAD' commands issued on
+ * groups with holes.
+ */
+static FILE *
+open_art_header(
+	long art,
+	long *next)
+{
+	char buf[NNTP_STRLEN];
+#ifdef NNTP_ABLE
+	FILE *fp;
+
+	if (read_news_via_nntp && CURR_GROUP.type == GROUP_TYPE_NEWS) {
+		/*
+		 * Don't bother requesting if we have not got there yet.
+		 * This is a big win if the group has got holes in it (ie. if 000's
+		 * of articles have expired between active files min & max values).
+		 */
+		if (art < *next)
+			return NULL;
+
+		snprintf(buf, sizeof(buf), "HEAD %ld", art);
+		if ((fp = nntp_command(buf, OK_HEAD, NULL, 0)) != NULL)
+			return fp;
+
+		/*
+		 * HEAD failed, try to find NEXT
+		 * Should return "223 artno message-id more text...."
+		 */
+		if (nntp_command("NEXT", OK_NOTEXT, buf, sizeof(buf)))
+			*next = atoi(buf);		/* Set next art number */
+
+		return NULL;
+	}
+#endif /* NNTP_ABLE */
+
+	snprintf(buf, sizeof(buf), "%ld", art);
+	return (fopen(buf, "r"));
+}
+
+
+/*
  * Called after XOVER/local/private overview databases have been loaded
  * Read and parse in headers for any arts not already found (usually
  * new articles that have not been indexed yet)
- * Already present articles that pass valid_artnum() have their
- * ->thread set to ART_NORMAL, as do any new articles that are added.
+ * Any new articles that are added have ->thread set to ART_UNTHREADED
+ * 'top' is the current highest artnum read
  *
  * Return values are:
- *    1   Additional articles were read in
+ *   >0   Number of additional articles read in
  *    0   No additional (new) articles were found
  *   -1   user aborted during read
- * TODO: think of a function name that sucks less
- * TODO: *pcount isn't used by the caller (index_group)
  */
 static int
-read_group(
+read_art_headers(
 	struct t_group *group,
-	int *pcount)
+	int total,
+	long top)
 {
 	FILE *fp;
-	char buf[PATH_LEN];
+	char dir[PATH_LEN];
+	char *group_msg;
 	int i;
-	int count = 0;
-	int respnum, total = 0;
 	int modified = 0;
 	long art;
+	long head_next = -1; /* Reset the next article number index (for when HEAD fails) */
 	t_bool res;
-	static char dir[PATH_LEN] = "";
 
 	/*
 	 * Change to groups spooldir to optimize fopen()'s on local articles
+	 * NB open_art_header() requires this
 	 */
 	if (!read_news_via_nntp || group->type != GROUP_TYPE_NEWS) {
+		char buf[PATH_LEN];
+
 		get_cwd(dir);
 		make_base_group_path(group->spooldir, group->name, buf);
 		my_chdir(buf);
 	}
 
-	/*
-	 * Count num of arts to index so the user has an idea of index time
-	 */
-	for (i = 0; i < grpmenu.max; i++) {
-		if (base[i] <= last_read_article || valid_artnum(base[i]) >= 0)
-			continue;
-
-		total++;
-	}
-
-	/*
-	 * Reset the next article number index (for when HEAD fails)
-	 */
-	head_next = -1;
-
-	for (i = 0; i < grpmenu.max; i++) {	/* for each article # */
+	group_msg = fmt_string(_(txt_group), cCOLS - strlen(_(txt_group)) + 2 - 3, group->name);
+	for (i = 0; i < grpmenu.max; i++) {	/* for each article number */
 		art = base[i];
 
 		/*
-		 * Do we already have this article in our index? Change
-		 * arts[].thread from ART_EXPIRED to ART_NORMAL and skip
-		 * reading the header.
-		 */
-		if ((respnum = valid_artnum(art)) >= 0 || art <= last_read_article) {
-			if (respnum >= 0)
-				arts[respnum].thread = ART_NORMAL;
-
+		 * Skip articles that are below the low water mark or are
+		 * already present
+		 */
+		if (valid_artnum(art) >= 0)
+			continue;
+		if (art <= top)
 			continue;
-		}
 
 		/*
 		 * Try and open the article
 		 */
-		if ((fp = open_art_header(art)) == NULL)
+		if ((fp = open_art_header(art, &head_next)) == NULL)
 			continue;
 
 		/*
-		 * we've modified the index so it will need to be re-written
-		 */
-		modified = 1;
-
-		/*
 		 * Add article to arts[]
 		 */
 		if (top_art >= max_art)
@@ -429,40 +624,36 @@ read_group(
 
 		set_article(&arts[top_art]);
 		arts[top_art].artnum = art;
-		arts[top_art].thread = ART_NORMAL;
+		arts[top_art].thread = ART_UNTHREADED;
 
 		res = parse_headers(fp, &arts[top_art]);
 
 		TIN_FCLOSE(fp);
 		if (tin_errno) {
-			if (!read_news_via_nntp || group->type != GROUP_TYPE_NEWS)
-				my_chdir(dir);
-
-			return -1;
+			modified = -1;
+			break;
 		}
 
 		if (!res) {
-			sprintf(buf, "FAILED parse_headers(%ld)", art);
 #ifdef DEBUG
-			debug_nntp("read_group", buf);
+			char buf[PATH_LEN];
+
+			snprintf(buf, sizeof(buf), "FAILED parse_headers(%ld)", art);
+			debug_nntp("read_art_headers", buf);
 #endif /* DEBUG */
 			continue;
 		}
 
-		last_read_article = arts[top_art].artnum;	/* used if arts are killed */
+		top = arts[top_art].artnum;	/* used if arts are killed */
 		top_art++;
 
-		if (++count % MODULO_COUNT_NUM == 0)
-			show_progress(mesg, count, total);
+		if (++modified % MODULO_COUNT_NUM == 0)
+			show_progress(group_msg, modified, total);
 	}
+	free(group_msg);
 
 	/*
-	 * Update number of article we 'read'
-	 */
-	*pcount = count;
-
-	/*
-	 * if !nntp change to previous dir before indexing started
+	 * Change back to previous dir before indexing started
 	 */
 	if (!read_news_via_nntp || group->type != GROUP_TYPE_NEWS)
 		my_chdir(dir);
@@ -530,6 +721,76 @@ thread_by_subject(
 #endif /* 0 */
 }
 
+/*
+ * This Threading algorithm threads articles into 'buckets' where each bucket
+ * contains all the articles which match the root article's subject line to
+ * the configured percentage. Eg, if the root article had the subject "asdf"
+ * and the match percentage was configured to be 75% then any article would
+ * match if its subject was no different in more than a single character.
+ */
+static void
+thread_by_percentage(
+	struct t_group *group)
+{
+	int i, j, k;
+	int root_num = 0; /* The index number of the root we are currently working on. */
+	int unmatched; /* This is the number of characters that don't match between the two strings */
+	unsigned int percentage = 100 - group->attribute->thread_perc;
+	size_t slen;
+
+	/* First we need to sort art[] to simplify and speed up the matching. */
+	SortBy(subj_comp_asc);
+
+	/*
+	 * Now we put all the articles which match enough into the thread. If
+	 * an article doesn't match enough we create a new thread and then add
+	 * to that and so on.
+	 */
+	base[0] = 0;
+	arts[0].prev = ART_NORMAL;
+	for_each_art(i) {
+		if (i == 0)
+			continue;
+
+		/* Check each character to see if it matched enough */
+		k = 0;
+		unmatched = 0;
+		for (j = 0; arts[base[root_num]].subject[j] != '\0' && arts[i].subject[k] != '\0'; j++, k++) {
+			if (arts[base[root_num]].subject[j] != arts[i].subject[k])
+				unmatched++;
+		}
+
+		/*
+		 * By getting here we have a number of unmatched characters
+		 * between the two strings. We also have the length of the
+		 * strings available to us easily.
+		 * All we need to do is see if the match is good enough, but
+		 * we count differences in the length of the strings against
+		 * them matching.
+		 */
+		slen = strlen(arts[base[root_num]].subject);
+		unmatched += abs(slen - strlen(arts[i].subject));
+		if ((unmatched * 100) / slen > percentage) {
+			/*
+			 * If there is less greater than percentage% different start a
+			 * new thread.
+			 */
+			base[++root_num] = i;
+			arts[i].prev = ART_NORMAL;
+			continue;
+		} else {
+			/*
+			 * The subject lines match enough to consider them part of a single
+			 * thread, so add the current article to the thread.
+			 */
+			if (arts[base[root_num]].thread < 0)
+				arts[base[root_num]].thread = i;
+			arts[i].prev = i - 1;
+			arts[i - 1].thread = i;
+			continue;
+		}
+	}
+}
 
 /*
  * This was brought over from tags.c, however this version doesn't not
@@ -576,8 +837,8 @@ global_look_for_multipart_info(
 	char stop,
 	int *offset)
 {
-	char *subj = (char *) 0;
-	char *pch = (char *) 0;
+	char *subj;
+	char *pch;
 	MultiPartInfo tmp;
 
 	*offset = 0;
@@ -632,7 +893,7 @@ global_get_multiparts(
 	int aindex,
 	MultiPartInfo **malloc_and_setme_info)
 {
-	int i = 0;
+	int i;
 	int part_index;
 	MultiPartInfo tmp, tmp2;
 	MultiPartInfo *info = 0;
@@ -709,7 +970,6 @@ thread_by_multipart(
 	MultiPartInfo *minfo = NULL;
 
 	for_each_art(i) {
-
 		if (IGNORE_ART_THREAD(i) || arts[i].prev >= 0 || !global_get_multiparts(i, &minfo))
 			continue;
 
@@ -738,14 +998,16 @@ thread_by_multipart(
  *	THREAD_REFS		Threads are created using the References headers
  *	THREAD_BOTH		Threads created using References and then Subject
  *	THREAD_MULTI	Threads created using Subject to search for Multiparts
+ *	THREAD_PERC		Threads based upon a char for char match of greater than x%
  *
- * Apart from THREAD_NONE, .thread and .prev are used, the
- * first article in a thread should have .prev set to ART_NORMAL, the
- * rest >= 0. Only do unexpired articles we haven't visited yet
- * (arts[].thread == -1 ART_NORMAL).
- *
- * The rethread parameter is a misnomer. Its only effect (if set) is
- * to delete all threading information, not to rethread
+ * .thread and .prev are used to hold the threading information, see tin.h for
+ * more information
+ * Only process valid (unexpired) articles we haven't visited yet
+ * (ie arts[].thread == ART_UNTHREADED)
+ *
+ * The rethread parameter is used to force the deletion of existing threading
+ * information before threading which happens anyway expect when using
+ * THREAD_NONE (I don't immediately see how this is useful)
  */
 /* TODO: rewrite that user can easly combine different 'threading'
  *       methods, i.e:
@@ -756,8 +1018,6 @@ make_threads(
 	struct t_group *group,
 	t_bool rethread)
 {
-	int i;
-
 	if (!cmd_line && !batch_mode)
 		info_message((group->attribute->thread_arts == THREAD_NONE ? _(txt_unthreading_arts) : _(txt_threading_arts)));
 
@@ -782,24 +1042,29 @@ make_threads(
 
 	/*
 	 * The threading pointers need to be reset if re-threading
-	 *	If using ref threading, revector the links back to the articles
+	 * If using ref threading, revector the links back to the articles
 	 */
 	if (rethread || group->attribute->thread_arts) {
+		int i;
+
 		for_each_art(i) {
-			if (arts[i].thread != ART_EXPIRED)
-				arts[i].thread = ART_NORMAL;
+			if (arts[i].thread >= 0)
+				arts[i].thread = ART_UNTHREADED;
 
 			arts[i].prev = ART_NORMAL;
 
 			/* Should never happen if tree is built properly */
 			if (arts[i].refptr == 0) {
+#ifdef DEBUG
 				my_fprintf(stderr, "\nError  : art->refptr is NULL\n");
 				my_fprintf(stderr, "Artnum : %ld\n", arts[i].artnum);
 				my_fprintf(stderr, "Subject: %s\n", arts[i].subject);
 				my_fprintf(stderr, "From   : %s\n", arts[i].from);
+				assert(arts[i].refptr != 0);
+#else
+				continue;
+#endif /* DEBUG */
 			}
-			assert(arts[i].refptr != 0);
-
 			arts[i].refptr->article = i;
 		}
 	}
@@ -828,12 +1093,21 @@ make_threads(
 			thread_by_multipart();
 			break;
 
+		case THREAD_PERC:
+			thread_by_percentage(group);
+			break;
+
 		default: /* not reached */
 			break;
 	}
+
+	/*
+	 * Rebuild base[]
+	 */
 	find_base(group);
 }
 
+
 static t_compfunc
 eval_sort_arts_func(
 	unsigned int sort_art_type)
@@ -843,24 +1117,34 @@ eval_sort_arts_func(
 			return artnum_comp;
 
 		case SORT_ARTICLES_BY_SUBJ_DESCEND:
+			return subj_comp_desc;
+
 		case SORT_ARTICLES_BY_SUBJ_ASCEND:
-			return subj_comp;
+			return subj_comp_asc;
 
 		case SORT_ARTICLES_BY_FROM_DESCEND:
+			return from_comp_desc;
+
 		case SORT_ARTICLES_BY_FROM_ASCEND:
-			return from_comp;
+			return from_comp_asc;
 
 		case SORT_ARTICLES_BY_DATE_DESCEND:
+			return date_comp_desc;
+
 		case SORT_ARTICLES_BY_DATE_ASCEND:
-			return date_comp;
+			return date_comp_asc;
 
 		case SORT_ARTICLES_BY_SCORE_DESCEND:
+			return score_comp_desc;
+
 		case SORT_ARTICLES_BY_SCORE_ASCEND:
-			return score_comp;
+			return score_comp_asc;
 
 		case SORT_ARTICLES_BY_LINES_DESCEND:
+			return lines_comp_desc;
+
 		case SORT_ARTICLES_BY_LINES_ASCEND:
-			return lines_comp;
+			return lines_comp_asc;
 
 		default:
 			break;
@@ -884,7 +1168,7 @@ static void
 sort_base(
 	unsigned int sort_threads_type)
 {
-	switch (sort_threads_type) {
+	switch (sort_threads_type) { /* this switch doesn't look very usefull */
 		case SORT_THREADS_BY_SCORE_DESCEND:
 		case SORT_THREADS_BY_SCORE_ASCEND:
 			qsort(base, (size_t) grpmenu.max, sizeof(long), score_comp_base);
@@ -974,9 +1258,9 @@ parse_headers(
 				if (!got_from) {
 					if ((hdr = parse_header(ptr + 1, "rom", FALSE, FALSE))) {
 						h->gnksa_code = parse_from(hdr, art_from_addr, art_full_name);
-						h->from = hash_str(art_from_addr);
+						h->from = hash_str(buffer_to_ascii(art_from_addr));
 						if (*art_full_name)
-							h->name = hash_str(eat_tab(rfc1522_decode(art_full_name)));
+							h->name = hash_str(eat_tab(convert_to_printable(rfc1522_decode(art_full_name))));
 						got_from = TRUE;
 					}
 				}
@@ -1016,13 +1300,13 @@ parse_headers(
 			/*
 			 * FIXME: Subject: truncation is a HACK and it's not multibyte safe
 			 *        the core problem are probably fixed length buffers
-			 *        (i.e. in rfc1522_encode() called from write_nov_file()
+			 *        (i.e. in rfc1522_encode() called from write_overview()
 			 *         with the data read in here).
 			 */
 			case 'S':	/* Subject:  mandatory */
 				if (!h->subject) {
 					if ((hdr = parse_header(ptr + 1, "ubject", FALSE, FALSE))) {
-						strncpy(art_trunc_subj, eat_re(eat_tab(rfc1522_decode(hdr)), FALSE), sizeof(art_trunc_subj) - 1);
+						strncpy(art_trunc_subj, eat_re(eat_tab(convert_to_printable(rfc1522_decode(hdr))), FALSE), sizeof(art_trunc_subj) - 1);
 						h->subject = hash_str(art_trunc_subj);
 					}
 				}
@@ -1067,73 +1351,83 @@ parse_headers(
 }
 
 
+#ifdef DEBUG
+#	define handle_overview_fmt_error()	else oerror += 1<<count
+#else
+#	define handle_overview_fmt_error()
+#endif /* DEBUG */
 /*
- * Read in an Nov/Xover index file. Fields are separated by TAB.
- * return the new value of 'top_art' or -1 if user quit partway.
- * TODO: rewrite parser using strtok() or some other separator
- *       based function
- * If 'local' is set then always open local overview cache in
- * preference to NNTP XOVER
- *
- * Format:
- * 	1. article number (ie. 183)                [mandatory]
- * 	2. Subject: line  (ie. Which newsreader?)  [mandatory]
- * 	3. From: line     (ie. iain@ecrc.de)       [mandatory]
- * 	4. Date: line     (rfc822 format)          [mandatory]
- * 	5. MessageID:     (ie. <123@ether.net>)    [mandatory]
- * 	6. References:    (ie. <message-id> ....)  [optional]
- * 	7. Byte count     (Skipped - not used)     [mandatory]
- * 	8. Lines: line    (ie. 23)                 [mandatory]
- * 	9. Xref: line     (ie. alt.test:389)       [optional]
+ * Read in an overview index file. Fields are separated by TAB.
+ * return the number of expired articles encountered or -1 if the user aborted
+ * the read
+ * 'top' is set to the highest artnum read
+ * If 'local' is set then always open local overview cache in preference to
+ * using NNTP XOVER
+ *
+ * Format (mandatory as far as line count [RFC2980]):
+ *	1. article number (ie. 183)                [mandatory]
+ *	2. Subject: line  (ie. Which newsreader?)  [mandatory]
+ *	3. From: line     (ie. iain@ecrc.de)       [mandatory]
+ *	4. Date: line     (rfc822 format)          [mandatory]
+ *	5. MessageID:     (ie. <123@ether.net>)    [mandatory]
+ *	6. References:    (ie. <message-id> ....)  [optional]
+ *	7. Byte count     (Skipped - not used)     [mandatory]
+ *	8. Lines: line    (ie. 23)                 [mandatory]
+ *	9. Xref: line     (ie. alt.test:389)       [optional]
  */
 static int
-read_nov_file(
+read_overview(
 	struct t_group *group,
 	long min,
 	long max,
-	int *expired,
+	long *top,
 	t_bool local)
 {
 	FILE *fp;
-	char *p, *q;
+	char *ptr;
 	char *buf;
+	char *group_msg;
 	char art_full_name[HEADER_LEN];
 	char art_from_addr[HEADER_LEN];
+	unsigned int count;
+	int expired = 0;
 	long artnum;
-
-	*expired = 0;
+	struct t_article *art;
+#ifdef DEBUG
+	unsigned int oerror = 0;
+#endif /* DEBUG */
 
 	/*
 	 * open the overview file (whether it be local or via nntp)
 	 */
 	if ((fp = open_xover_fp(group, "r", min, max, local)) == NULL)
-		return top_art;
+		return expired;
 
 	if (group->xmax > max)
 		group->xmax = max;
 
+	group_msg = fmt_string(_(txt_group), cCOLS - strlen(_(txt_group)) + 2 - 3, group->name);
 	while ((buf = tin_fgets(fp, FALSE)) != NULL) {
 		if (need_resize) {
 			handle_resize((need_resize == cRedraw) ? TRUE : FALSE);
 			need_resize = cNo;
 		}
 
-#ifdef DEBUG
-		debug_nntp("read_nov_file", buf);
-#endif /* DEBUG */
-
-		if (top_art >= max_art)
-			expand_art();
-
-		p = buf;
+		/*
+		 * Read artnum
+		 */
+		if ((ptr = tin_strtok(buf, "\t")) == NULL)
+			continue;
 
 		/*
 		 * read the article number, guaranteed to be the first field
 		 */
-		artnum = atol(p);
+		artnum = atol(ptr);
 
-		/* catches case of 1st line being groupname (i.e. local cached overviews) */
-		/* TODO: so test the group name properly then ? */
+		/*
+		 * artnum field invalid/corrupt or is 1st line of local cached overview
+		 * (group name)
+		 */
 		if (artnum <= 0)
 			continue;
 
@@ -1141,7 +1435,7 @@ read_nov_file(
 		 * Check to make sure article in nov file has not expired in group
 		 */
 		if (artnum < group->xmin) {
-			(*expired)++;
+			expired++;
 			continue;
 		}
 
@@ -1155,188 +1449,117 @@ read_nov_file(
 		if (artnum > group->xmax)
 			continue;
 
-		set_article(&arts[top_art]);
-		arts[top_art].artnum = last_read_article = artnum;
-
-		if ((q = strchr(p, '\t')) == NULL) {
-#ifdef DEBUG
-			error_message("Bad overview record (Artnum) '%s'", buf);
-			debug_nntp("read_nov_file", "Bad overview record (Artnum)");
-#endif /* DEBUG */
-			continue;
-		} else
-			p = q + 1;
-
-		/*
-		 * TODO: rewrite the code below as the field order is not fixed,
-		 *       but defined in "LIST OVERVIEW.FMT"
-		 */
-
-		/*
-		 * read Subject
-		 */
-		if ((q = strchr(p, '\t')) == NULL) {
-#ifdef DEBUG
-			error_message("Bad overview record (Subject) [%s]", p);
-			debug_nntp("read_nov_file", "Bad overview record (Subject)");
-#endif /* DEBUG */
-			continue;
-		} else
-			*q = '\0';
+		if (top_art >= max_art)
+			expand_art();
 
-		arts[top_art].subject = hash_str(eat_re(eat_tab(rfc1522_decode(p)), FALSE));
-		p = q + 1;
+		art = &arts[top_art];
+		set_article(art);
+		art->artnum = *top = artnum;
+
+		/*
+		 * Note: Fields after line count are not mandatory, use "LIST OVERVIEW.FMT"
+		 *       to check for additions like we do with xref_supported
+		 */
+		for (count = 1; (ptr = tin_strtok(NULL, "\t")) != NULL; count++) {
+			switch (count) {
+				case 1:		/* Subject */
+					/*
+					 * TODO: As eat_re() is also called in batch_mode we need
+					 *       to init (all) regexes (but do not use the others).
+					 *       Calling eat_re() isn't very wise at all as we use
+					 *       the modified subject for -N/-M batch opperations
+					 *       so ppl. can't tell from the subject if the posting
+					 *       was a reply or not.
+					 */
+					art->subject = hash_str(eat_re(eat_tab(convert_to_printable(rfc1522_decode(ptr))), FALSE));
+					break;
+
+				case 2:		/* From */
+					art->gnksa_code = parse_from(ptr, art_from_addr, art_full_name);
+					art->from = hash_str(buffer_to_ascii(art_from_addr));
+
+					if (*art_full_name)
+						art->name = hash_str(eat_tab(convert_to_printable(rfc1522_decode(art_full_name))));
+					break;
 
-		/*
-		 * read From
-		 */
-		if ((q = strchr(p, '\t')) == NULL) {
+				case 3:		/* Date */
+					art->date = parsedate(ptr, (TIMEINFO *) 0);
 #ifdef DEBUG
-			error_message("Bad overview record (From) [%s]", p);
-			debug_nntp("read_nov_file", "Bad overview record (From)");
+					if (art->date == (time_t) -1)
+						oerror += 1<<count;
 #endif /* DEBUG */
-			continue;
-		} else
-			*q = '\0';
-
-		arts[top_art].gnksa_code = parse_from(p, art_from_addr, art_full_name);
-		arts[top_art].from = hash_str(art_from_addr);
+					break;
 
-		if (*art_full_name)
-			arts[top_art].name = hash_str(eat_tab(rfc1522_decode(art_full_name)));
+				case 4:		/* Message-ID */
+					if (*ptr)
+						art->msgid = my_strdup(ptr);
+					handle_overview_fmt_error();
+					break;
+
+				case 5:		/* References */
+					if (*ptr)
+						art->refs = my_strdup(ptr);
+					break;
 
-		p = q + 1;
-		/*
-		 * read Date
-		 */
-		if ((q = strchr(p, '\t')) == NULL) {
+				case 6:		/* Bytes */
 #ifdef DEBUG
-			error_message("Bad overview record (Date) [%s]", p);
-			debug_nntp("read_nov_file", "Bad overview record (Date)");
+					if (!isdigit((unsigned char) *ptr))
+						oerror += 1<<count;
 #endif /* DEBUG */
-			continue;
-		} else
-			*q = '\0';
+					break;
 
-		arts[top_art].date = parsedate(p, (TIMEINFO *) 0);
-		p = q + 1;
+				case 7:		/* Lines */
+					if (isdigit((unsigned char) *ptr))
+						art->line_count = atoi(ptr);
+					handle_overview_fmt_error();
+					break;
+
+				case 8:		/* Xref: */
+					if (!xref_supported)
+						continue;
+					/* TODO: crosscheck artnum against Xref:-line (if Xref:full) */
+					if ((ptr = parse_header(ptr, "Xref", FALSE, FALSE)) != NULL)
+						art->xref = my_strdup(ptr);
+					handle_overview_fmt_error();
+					break;
+			}
+		}
 
-		/*
-		 * read Message-ID
-		 */
-		q = strchr(p, '\t');
-		if (q == NULL || p == q) {	/* Empty msgid's */
 #ifdef DEBUG
-			error_message("Bad overview record (Msg-id) [%s]", p);
-			debug_nntp("read_nov_file", "Bad overview record (Msg-id)");
+		/* Complain if incorrect # of fields */
+		if (count < (xref_supported ? 8 : 7) || oerror) {
+			char errbuf[LEN];
+
+			error_message(_("%d Bad overview record (%d fields) '%s'"), oerror, count, BlankIfNull(ptr)); /* TODO move to lang.c */
+			snprintf(errbuf, sizeof(errbuf), "%d Bad overview record (%d fields)", oerror, count);
+			debug_nntp("read_overview", errbuf);
+		}
+		debug_print_header(art);
+		oerror = 0;
 #endif /* DEBUG */
-			continue;
-		} else
-			*q = '\0';
 
 		/*
-		 * TODO: is no mesg-id allowed in rfc?
-		 *       no, but we might see that in mailgroups as mesg-id is
-		 *       optional in mail
-		 *		 So complain if group->type == GROUP_TYPE_NEWS
-		 *
-		 *       draft-ietf-nntpext-base-13.txt, section 9.2.1.1
-		 *       comes up with "<0>" - should we use it instead of '\0'?
+		 * RFC says Message-ID is mandatory in newsgroups (but not in
+		 * mailgroups etc..) NB. a NULL Message-ID would abort if we ever do
+		 * threading in mailgroups
 		 */
-		arts[top_art].msgid = (*p ? my_strdup(p) : '\0');
-
-		p = q + 1;
-
-		/*
-		 * read References
-		 */
-		if ((q = strchr(p, '\t')) == NULL) {
-#ifdef DEBUG
-			error_message("Bad overview record (References) [%s]", p);
-			debug_nntp("read_nov_file", "Bad overview record (References)");
-#endif /* DEBUG */
+		if (!art->msgid && group->type == GROUP_TYPE_NEWS)
 			continue;
-		} else
-			*q = '\0';
-
-		arts[top_art].refs = (*p ? my_strdup(p) : '\0');
-
-		p = q + 1;
-
-		/*
-		 * skip Bytes
-		 */
-		if ((q = strchr(p, '\t')) == NULL) {
-#ifdef DEBUG
-			error_message("Bad overview record (Bytes) [%s]", p);
-			debug_nntp("read_nov_file", "Bad overview record (Bytes)");
-#endif /* DEBUG */
-			continue;
-		} else
-			*q = '\0';
-
-		p = (q == NULL ? (char *) 0 : q + 1);
-
-		/*
-		 * read Lines
-		 */
-		if (p != NULL) {
-			if ((q = strchr(p, '\t')) != NULL)
-				*q = '\0';
-
-			if (isdigit((unsigned char) *p))
-				arts[top_art].line_count = atoi(p);
-
-			p = (q == NULL ? (char *) 0 : q + 1);
-		}
-
-		/*
-		 * read Xref
-		 */
-		if (p != NULL && xref_supported) {
-			if ((q = strstr(p, "Xref: ")) == NULL)
-				q = strstr(p, "xref: ");
-
-			if (q != NULL) {
-				p = q + 6;
-				q = p;
-				while (*q && *q != '\t')
-					q++;
-
-				*q = '\0';
-				q = strrchr(p, '\n');
-				if (q != NULL)
-					*q = '\0';
-
-				q = p;
-				while (*q && *q == ' ')
-					q++;
-
-				arts[top_art].xref = my_strdup(q);
-				/* TODO: crosscheck artnum against Xref:-line (if Xref:full) */
-			}
-		}
-
-		/*
-		 * end of overview line processing
-		 */
-#ifdef DEBUG
-		debug_print_header(&arts[top_art]);
-#endif /* DEBUG */
 
 		/* we might loose accuracy here, but that shouldn't hurt */
 		if (artnum % MODULO_COUNT_NUM == 0)
-			show_progress(mesg, artnum - min, max - min);
+			show_progress(group_msg, artnum - min, max - min);
 
-		top_art++;
+		top_art++;				/* Basically this statement commits the article */
 	}
+	free(group_msg);
 
 	TIN_FCLOSE(fp);
 
 	if (tin_errno)
 		return -1;
 
-	return top_art;
+	return expired;
 }
 
 
@@ -1344,15 +1567,15 @@ read_nov_file(
  * Write an Nov/Xover index file. Fields are separated by '\t'.
  *
  * Format:
- * 	1. article number (ie. 183)                [mandatory]
- * 	2. Subject: line  (ie. Which newsreader?)  [mandatory]
- * 	3. From: line     (ie. iain@ecrc.de)       [mandatory]
- * 	4. Date: line     (rfc822 format)          [mandatory]
- * 	5. MessageID:     (ie. <123@ether.net>)    [mandatory]
- * 	6. References:    (ie. <message-id> ....)  [optional]
- * 	7. Byte count     (Skipped - not used)     [mandatory]
- * 	8. Lines: line    (ie. 23)                 [mandatory]
- * 	9. Xref: line     (ie. alt.test:389)       [optional]
+ *	1. article number (ie. 183)                [mandatory]
+ *	2. Subject: line  (ie. Which newsreader?)  [mandatory]
+ *	3. From: line     (ie. iain@ecrc.de)       [mandatory]
+ *	4. Date: line     (rfc822 format)          [mandatory]
+ *	5. MessageID:     (ie. <123@ether.net>)    [mandatory]
+ *	6. References:    (ie. <message-id> ....)  [optional]
+ *	7. Byte count     (Skipped - not used)     [mandatory]
+ *	8. Lines: line    (ie. 23)                 [mandatory]
+ *	9. Xref: line     (ie. alt.test:389)       [optional]
  *
  * TODO: as we don't use the original data, we currently can't store
  *       the data (from/subject) in the original charset (we don't store
@@ -1366,14 +1589,14 @@ read_nov_file(
  *       long-term solution: store the original data in the overview
  *       (tin has to handle raw 8bit data and other ugly stuff in the
  *       overviews anyway and thus we preserver as much info as possible)
- *       this would require some changes in read_nov_file() and
+ *       this would require some changes in read_overview() and
  *       parse_headers(): don't do the decoding/unfolding there, but in a
- *       second pass right after write_nov_file(), or two additional fields
+ *       second pass right after write_overview(), or two additional fields
  *       which hold the raw data for from/subject. the latter has the
  *       disadvantage that it costs (much) more memory.
  */
 void
-write_nov_file(
+write_overview(
 	struct t_group *group)
 {
 	FILE *fp;
@@ -1415,6 +1638,7 @@ write_nov_file(
 			 *       ignore stuff like this.
 			 */
 			p = rfc1522_encode(article->subject, tinrc.mm_local_charset, FALSE);
+			/* as the subject might now be folded we have to unfold it */
 			unfold_header(p);
 
 			/*
@@ -1508,8 +1732,8 @@ find_nov_file(
 
 		case GROUP_TYPE_NEWS:
 			/*
-			 * xover_cmd is not an issue here, any gripes and warnings
-			 * about XOVER are handled in nntp_open()
+			 * nntp.caps.over_cmd is not an issue here, any gripes and warnings
+			 * about [X]OVER are handled in nntp_open()
 			 */
 
 			/*
@@ -1535,7 +1759,7 @@ find_nov_file(
 						return NULL;			/* Don't write cache in this case */
 				}
 			}
-#endif /* NNTP_ONLY */
+#endif /* !NNTP_ONLY */
 
 			/*
 			 * We only get here when private overviews are going to be used
@@ -1606,22 +1830,22 @@ find_nov_file(
 		joinpath(nov_file, dir, buf);
 
 		if ((fp = fopen(nov_file, "r")) == NULL)
-			return nov_file;
+			break;
 
 		/*
 		 * No group name header, so not a valid index file => overwrite it
 		 */
 		if (fgets(buf, (int) sizeof(buf), fp) == NULL) {
 			fclose(fp);
-			return nov_file;
+			break;
 		}
 		fclose(fp);
 
 		if ((ptr = strrchr(buf, '\n')) != NULL)
 			*ptr = '\0';
 
-		if (STRCMPEQ(buf, group->name))
-			return nov_file;
+		if (strcmp(buf, group->name) == 0)
+			break;
 
 	}
 
@@ -1648,6 +1872,13 @@ do_update(
 	 */
 	for (i = 0; i < selmenu.max; i++) {
 		group = &active[my_group[i]];
+		/*
+		 * FIXME: workaround to get a valid CURR_GROUP
+		 * it also points to the currently processed group so that
+		 * the correct attributes are used
+		 * The correct fix is to get rid of CURR_GROUP
+		 */
+		selmenu.curr = i;
 
 		if (group->bogus || !group->subscribed)
 			continue;
@@ -1700,8 +1931,11 @@ artnum_comp(
 }
 
 
+/*
+ * return result of strcmp (reversed for descending)
+ */
 static int
-subj_comp(
+subj_comp_asc(
 	t_comptype p1,
 	t_comptype p2)
 {
@@ -1709,19 +1943,15 @@ subj_comp(
 	const struct t_article *s1 = (const struct t_article *) p1;
 	const struct t_article *s2 = (const struct t_article *) p2;
 
-	/*
-	 * return result of strcmp(reversed for descending)
-	 */
-	return (CURR_GROUP.attribute->sort_art_type == SORT_ARTICLES_BY_SUBJ_ASCEND
-			? (retval = strcasecmp(s1->subject, s2->subject))
-				? retval : ((s1->date - s2->date) > 0) ? 1 : -1
-			: (retval = strcasecmp(s2->subject, s1->subject))
-				? retval : ((s1->date - s2->date) > 0) ? 1 : -1);
+	if ((retval = strcasecmp(s1->subject, s2->subject))) /* != 0 */
+		return retval;
+
+	return s1->date - s2->date > 0 ? 1 : -1;
 }
 
 
 static int
-from_comp(
+subj_comp_desc(
 	t_comptype p1,
 	t_comptype p2)
 {
@@ -1729,14 +1959,45 @@ from_comp(
 	const struct t_article *s1 = (const struct t_article *) p1;
 	const struct t_article *s2 = (const struct t_article *) p2;
 
-	/*
-	 * return result of strcmp(reversed for descending)
-	 */
-	return (CURR_GROUP.attribute->sort_art_type == SORT_ARTICLES_BY_FROM_ASCEND
-			? (retval = strcasecmp(s1->from, s2->from))
-				? retval : ((s1->date - s2->date) > 0) ? 1 : -1
-			: (retval = strcasecmp(s2->from, s1->from))
-				? retval : ((s1->date - s2->date) > 0) ? 1 : -1);
+	if ((retval = strcasecmp(s2->subject, s1->subject))) /* != 0 */
+		return retval;
+
+	return s1->date - s2->date > 0 ? 1 : -1;
+}
+
+
+/*
+ * return result of strcmp (reversed for descending)
+ */
+static int
+from_comp_asc(
+	t_comptype p1,
+	t_comptype p2)
+{
+	int retval;
+	const struct t_article *s1 = (const struct t_article *) p1;
+	const struct t_article *s2 = (const struct t_article *) p2;
+
+	if ((retval = strcasecmp(s1->from, s2->from))) /* != 0 */
+		return retval;
+
+	return s1->date - s2->date > 0 ? 1 : -1;
+}
+
+
+static int
+from_comp_desc(
+	t_comptype p1,
+	t_comptype p2)
+{
+	int retval;
+	const struct t_article *s1 = (const struct t_article *) p1;
+	const struct t_article *s2 = (const struct t_article *) p2;
+
+	if ((retval = strcasecmp(s2->from, s1->from))) /* != 0 */
+		return retval;
+
+	return s1->date - s2->date > 0 ? 1 : -1;
 }
 
 
@@ -1750,38 +2011,49 @@ from_comp(
  * is reversed.
  */
 static int
-date_comp(
+date_comp_asc(
 	t_comptype p1,
 	t_comptype p2)
 {
 	const struct t_article *s1 = (const struct t_article *) p1;
 	const struct t_article *s2 = (const struct t_article *) p2;
 
-	if (CURR_GROUP.attribute->sort_art_type == SORT_ARTICLES_BY_DATE_ASCEND) {
-		/*
-		 * s1->date less than s2->date
-		 */
-		if (s1->date < s2->date)
-			return -1;
+	/*
+	 * s1->date less than s2->date
+	 */
+	if (s1->date < s2->date)
+		return -1;
 
-		/*
-		 * s1->date greater than s2->date
-		 */
-		if (s1->date > s2->date)
-			return 1;
-	} else {
-		/*
-		 * s2->date less than s1->date
-		 */
-		if (s2->date < s1->date)
-			return -1;
+	/*
+	 * s1->date greater than s2->date
+	 */
+	if (s1->date > s2->date)
+		return 1;
+
+	return 0;
+}
+
+
+static int
+date_comp_desc(
+	t_comptype p1,
+	t_comptype p2)
+{
+	const struct t_article *s1 = (const struct t_article *) p1;
+	const struct t_article *s2 = (const struct t_article *) p2;
+
+	/*
+	 * s2->date less than s1->date
+	 */
+	if (s2->date < s1->date)
+		return -1;
+
+	/*
+	 * s2->date greater than s1->date
+	 */
+	if (s2->date > s1->date)
+		return 1;
 
-		/*
-		 * s2->date greater than s1->date
-		 */
-		if (s2->date > s1->date)
-			return 1;
-	}
 	return 0;
 }
 
@@ -1790,26 +2062,37 @@ date_comp(
  * Same again, but for art[].score
  */
 static int
-score_comp(
+score_comp_asc(
 	t_comptype p1,
 	t_comptype p2)
 {
 	const struct t_article *s1 = (const struct t_article *) p1;
 	const struct t_article *s2 = (const struct t_article *) p2;
 
-	if (CURR_GROUP.attribute->sort_art_type == SORT_ARTICLES_BY_SCORE_ASCEND) {
-		if (s1->score < s2->score)
-			return -1;
+	if (s1->score < s2->score)
+		return -1;
 
-		if (s1->score > s2->score)
-			return 1;
-	} else {
-		if (s2->score < s1->score)
-			return -1;
+	if (s1->score > s2->score)
+		return 1;
+
+	return s1->date - s2->date > 0 ? 1 : -1;
+}
+
+
+static int
+score_comp_desc(
+	t_comptype p1,
+	t_comptype p2)
+{
+	const struct t_article *s1 = (const struct t_article *) p1;
+	const struct t_article *s2 = (const struct t_article *) p2;
+
+	if (s2->score < s1->score)
+		return -1;
+
+	if (s2->score > s1->score)
+		return 1;
 
-		if (s2->score > s1->score)
-			return 1;
-	}
 	return s1->date - s2->date > 0 ? 1 : -1;
 }
 
@@ -1818,26 +2101,37 @@ score_comp(
  * Same again, but for art[].line_count
  */
 static int
-lines_comp(
+lines_comp_asc(
 	t_comptype p1,
 	t_comptype p2)
 {
 	const struct t_article *s1 = (const struct t_article *) p1;
 	const struct t_article *s2 = (const struct t_article *) p2;
 
-	if (CURR_GROUP.attribute->sort_art_type == SORT_ARTICLES_BY_LINES_ASCEND) {
-		if (s1->line_count < s2->line_count)
-			return -1;
+	if (s1->line_count < s2->line_count)
+		return -1;
 
-		if (s1->line_count > s2->line_count)
-			return 1;
-	} else {
-		if (s2->line_count < s1->line_count)
-			return -1;
+	if (s1->line_count > s2->line_count)
+		return 1;
+
+	return s1->date - s2->date > 0 ? 1 : -1;
+}
+
+
+static int
+lines_comp_desc(
+	t_comptype p1,
+	t_comptype p2)
+{
+	const struct t_article *s1 = (const struct t_article *) p1;
+	const struct t_article *s2 = (const struct t_article *) p2;
+
+	if (s2->line_count < s1->line_count)
+		return -1;
+
+	if (s2->line_count > s1->line_count)
+		return 1;
 
-		if (s2->line_count > s1->line_count)
-			return 1;
-	}
 	return s1->date - s2->date > 0 ? 1 : -1;
 }
 
@@ -1876,19 +2170,20 @@ void
 set_article(
 	struct t_article *art)
 {
-	art->subject = (char *) 0;
-	art->from = (char *) 0;
-	art->name = (char *) 0;
+	art->subject = NULL;
+	art->from = NULL;
+	art->name = NULL;
 	art->date = (time_t) 0;
-	art->xref = (char *) 0;
-	art->msgid = (char *) 0;
-	art->refs = (char *) 0;
-	art->refptr = (struct t_msgid *) 0;
+	art->xref = NULL;
+	art->msgid = NULL;
+	art->refs = NULL;
+	art->refptr = NULL;
 	art->line_count = -1;
-	art->archive = (struct t_archive *) 0;
+	art->archive = NULL;
 	art->tagged = FALSE;
 	art->thread = ART_EXPIRED;
 	art->prev = ART_NORMAL;
+	art->score = 0;
 	art->status = ART_UNREAD;
 	art->killed = ART_NOTKILLED;
 	art->zombie = FALSE;
@@ -1901,6 +2196,7 @@ set_article(
 
 /*
  * Do a binary chop to see if 'art' (an article number) exists in arts[]
+ * Naturally arts[] must be sorted on artnum
  * Return index into arts[] or -1
  */
 static int
@@ -1943,14 +2239,13 @@ print_date(
 {
 	static char date[25];
 	struct tm *tm;
-
 	static const char *const months_a[] = {
 		"Jan", "Feb", "Mar", "Apr", "May", "Jun",
 		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
 	};
 
 	tm = gmtime(&secs);
-	sprintf(date, "%02d %s %04d %02d:%02d:%02d GMT",
+	snprintf(date, sizeof(date), "%02d %s %04d %02d:%02d:%02d GMT",
 			tm->tm_mday,
 			months_a[tm->tm_mon],
 			tm->tm_year + 1900,
@@ -1964,8 +2259,8 @@ static char *
 print_from(
 	struct t_article *article)
 {
-	static char from[PATH_LEN];
 	char *p;
+	static char from[PATH_LEN];
 
 	*from = '\0';
 
@@ -1999,12 +2294,12 @@ open_xover_fp(
 	t_bool local)
 {
 #ifdef NNTP_ABLE
-	if (!local && xover_cmd && *mode == 'r' && group->type == GROUP_TYPE_NEWS) {
+	if (!local && nntp_caps.over_cmd && *mode == 'r' && group->type == GROUP_TYPE_NEWS) {
 		char line[NNTP_STRLEN];
 
-		sprintf(line, "%s %ld-%ld", xover_cmd, min, max);
+		snprintf(line, sizeof(line), "%s %ld-%ld", nntp_caps.over_cmd, min, max);
 		return (nntp_command(line, OK_XOVER, NULL, 0));
-	} else
+	}
 #endif /* NNTP_ABLE */
 	{
 		FILE *fp;
@@ -2017,6 +2312,6 @@ open_xover_fp(
 			if (*mode != 'r')
 				error_message(_(txt_cannot_open), nov_file);
 		}
-		return NULL;
 	}
+	return NULL;
 }
diff -Nurp tin-1.6.2/src/attrib.c tin-1.8.0/src/attrib.c
--- tin-1.6.2/src/attrib.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/attrib.c	2005-12-02 12:07:35.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : attrib.c
  *  Author    : I. Lea
  *  Created   : 1993-12-01
- *  Updated   : 2003-05-10
+ *  Updated   : 2005-06-30
  *  Notes     : Group attribute routines
  *
- * Copyright (c) 1993-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1993-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -65,7 +65,9 @@ enum {
 	ATTRIB_DELETE_TMP_FILES,
 	ATTRIB_SHOW_ONLY_UNREAD,
 	ATTRIB_THREAD_ARTS,
+	ATTRIB_THREAD_PERC,
 	ATTRIB_SHOW_AUTHOR,
+	ATTRIB_SHOW_INFO,
 	ATTRIB_SORT_ART_TYPE,
 	ATTRIB_POST_PROC_TYPE,
 	ATTRIB_QUICK_KILL_HEADER,
@@ -79,11 +81,13 @@ enum {
 	ATTRIB_MAILING_LIST,
 	ATTRIB_X_HEADERS,
 	ATTRIB_X_BODY,
-	ATTRIB_AUTO_SAVE_MSG,
+	ATTRIB_AUTO_SAVE_MSG, /* TODO: what is this? dublicate of ATTRIB_AUTO_SAVE? */
 	ATTRIB_X_COMMENT_TO,
+	ATTRIB_FCC,
 	ATTRIB_NEWS_QUOTE,
 	ATTRIB_QUOTE_CHARS,
 	ATTRIB_MIME_TYPES_TO_SAVE,
+	ATTRIB_MIME_FORWARD,
 #ifdef HAVE_ISPELL
 		ATTRIB_ISPELL,
 #endif /* HAVE_ISPELL */
@@ -125,32 +129,34 @@ set_default_attributes(
 	attributes->global = FALSE;	/* global/group specific */
 	attributes->maildir = tinrc.maildir;
 	attributes->savedir = tinrc.savedir;
-	attributes->savefile = (char *) 0;
+	attributes->savefile = NULL;
 	attributes->sigfile = tinrc.sigfile;
-	attributes->organization = (*default_organization ? default_organization : (char *) 0);
-	attributes->followup_to = (char *) 0;
-	attributes->mailing_list = (char *) 0;
-	attributes->x_headers = (char *) 0;
-	attributes->x_body = (char *) 0;
+	attributes->organization = (*default_organization ? default_organization : NULL);
+	attributes->followup_to = NULL;
+	attributes->mailing_list = NULL;
+	attributes->x_headers = NULL;
+	attributes->x_body = NULL;
 	attributes->from = tinrc.mail_address;
 	attributes->news_quote_format = tinrc.news_quote_format;
 	attributes->quote_chars = tinrc.quote_chars;
 	attributes->mime_types_to_save = my_strdup("*/*");
 #ifdef HAVE_ISPELL
-	attributes->ispell = (char *) 0;
+	attributes->ispell = NULL;
 #endif /* HAVE_ISPELL */
-	attributes->quick_kill_scope = (tinrc.default_filter_kill_global ? my_strdup("*") : (char *) 0);
+	attributes->quick_kill_scope = (tinrc.default_filter_kill_global ? my_strdup("*") : NULL);
 	attributes->quick_kill_header = tinrc.default_filter_kill_header;
 	attributes->quick_kill_case = tinrc.default_filter_kill_case;
 	attributes->quick_kill_expire = tinrc.default_filter_kill_expire;
-	attributes->quick_select_scope = (tinrc.default_filter_select_global ? my_strdup("*") : (char *) 0);
+	attributes->quick_select_scope = (tinrc.default_filter_select_global ? my_strdup("*") : NULL);
 	attributes->quick_select_header = tinrc.default_filter_select_header;
 	attributes->quick_select_case = tinrc.default_filter_select_case;
 	attributes->quick_select_expire = tinrc.default_filter_select_expire;
 	attributes->show_only_unread = tinrc.show_only_unread_arts;
 	attributes->thread_arts = tinrc.thread_articles;
+	attributes->thread_perc = tinrc.thread_perc;
 	attributes->sort_art_type = tinrc.sort_article_type;
 	attributes->sort_threads_type = tinrc.sort_threads_type;
+	attributes->show_info = tinrc.show_info;
 	attributes->show_author = tinrc.show_author;
 	attributes->auto_save = tinrc.auto_save;
 	attributes->auto_select = FALSE;
@@ -159,17 +165,15 @@ set_default_attributes(
 	attributes->post_proc_type = tinrc.post_process;
 	attributes->x_comment_to = FALSE;
 	attributes->tex2iso_conv = tinrc.tex2iso_conv;
+	attributes->mime_forward = FALSE;
+	attributes->fcc = NULL;
 #ifdef CHARSET_CONVERSION
 	attributes->mm_network_charset = tinrc.mm_network_charset;
-	attributes->undeclared_charset = (char *) 0;
+	attributes->undeclared_charset = NULL;
 #endif /* CHARSET_CONVERSION */
 }
 
 
-/*
- * Load global & local attributes into active[].attribute
- */
-
 #define MATCH_BOOLEAN(pattern, type) \
 	if (match_boolean(line, pattern, &flag)) { \
 		num = (flag != FALSE); \
@@ -184,7 +188,7 @@ set_default_attributes(
 		break; \
 	}
 #define MATCH_STRING(pattern, type) \
-	if (match_string(line, pattern, buf, sizeof(buf))) { \
+	if (match_string(line, pattern, buf, sizeof(buf) - strlen(pattern))) { \
 		set_attrib(type, scope, buf); \
 		found = TRUE; \
 		break; \
@@ -197,6 +201,14 @@ set_default_attributes(
 			break; \
 		}
 #endif /* CHARSET_CONVERSION */
+#if !defined(CHARSET_CONVERSION) || !defined(HAVE_ISPELL)
+#	define SKIP_ITEM(pattern) \
+		if (!strncmp(line, pattern, strlen(pattern))) { \
+			found = TRUE; \
+			break; \
+		}
+#endif /* !CHARSET_CONVERSION || !HAVE_ISPELL */
+
 
 /*
  * (re)read global/local attributes file
@@ -273,6 +285,7 @@ read_attributes_file(
 					break;
 
 				case 'f':
+					MATCH_STRING("fcc=", ATTRIB_FCC);
 					MATCH_STRING("followup_to=", ATTRIB_FOLLOWUP_TO);
 					MATCH_STRING("from=", ATTRIB_FROM);
 					break;
@@ -280,15 +293,20 @@ read_attributes_file(
 				case 'i':
 #ifdef HAVE_ISPELL
 					MATCH_STRING("ispell=", ATTRIB_ISPELL);
+#else
+					SKIP_ITEM("ispell=");
 #endif /* HAVE_ISPELL */
 					break;
 
 				case 'm':
 					MATCH_STRING("maildir=", ATTRIB_MAILDIR);
 					MATCH_STRING("mailing_list=", ATTRIB_MAILING_LIST);
+					MATCH_BOOLEAN("mime_forward=", ATTRIB_MIME_FORWARD);
 					MATCH_STRING("mime_types_to_save=", ATTRIB_MIME_TYPES_TO_SAVE);
 #ifdef CHARSET_CONVERSION
-					MATCH_LIST("mm_network_charset=", ATTRIB_MM_NETWORK_CHARSET,txt_mime_charsets, NUM_MIME_CHARSETS);
+					MATCH_LIST("mm_network_charset=", ATTRIB_MM_NETWORK_CHARSET, txt_mime_charsets, NUM_MIME_CHARSETS);
+#else
+					SKIP_ITEM("mm_network_charset=");
 #endif /* CHARSET_CONVERSION */
 					break;
 
@@ -329,6 +347,7 @@ read_attributes_file(
 						break;
 					}
 					MATCH_INTEGER("show_author=", ATTRIB_SHOW_AUTHOR, SHOW_FROM_BOTH);
+					MATCH_INTEGER("show_info=", ATTRIB_SHOW_INFO, SHOW_INFO_BOTH);
 					MATCH_BOOLEAN("show_only_unread=", ATTRIB_SHOW_ONLY_UNREAD);
 					MATCH_STRING("sigfile=", ATTRIB_SIGFILE);
 					MATCH_INTEGER("sort_art_type=", ATTRIB_SORT_ART_TYPE, SORT_ARTICLES_BY_LINES_ASCEND);
@@ -338,11 +357,14 @@ read_attributes_file(
 				case 't':
 					MATCH_BOOLEAN("tex2iso_conv=", ATTRIB_TEX2ISO_CONV);
 					MATCH_INTEGER("thread_arts=", ATTRIB_THREAD_ARTS, THREAD_MAX);
+					MATCH_INTEGER("thread_perc=", ATTRIB_THREAD_PERC, 100);
 					break;
 
 				case 'u':
 #ifdef CHARSET_CONVERSION
 					MATCH_STRING("undeclared_charset=", ATTRIB_UNDECLARED_CHARSET);
+#else
+					SKIP_ITEM("undeclared_charset=");
 #endif /* CHARSET_CONVERSION */
 					break;
 
@@ -391,8 +413,11 @@ set_attrib(
 {
 	struct t_group *group;
 
-	if (scope == NULL || *scope == '\0')	/* No active scope set yet */
+	if (scope == NULL || *scope == '\0') {	/* No active scope set yet */
+		/* TODO: include full line in error-message */
+		error_message("attribute with no scope: %s", data);
 		return;
+	}
 #if 0
 	fprintf(stderr, "set_attrib #%d %s %s(%d)\n", type, scope, data, (int) *data);
 #endif /* 0 */
@@ -405,6 +430,7 @@ set_attrib(
 			do_set_attrib(group, type, data);
 	} else {
 		int i;
+
 		/* TODO: Can we get out of doing this per group for .global case */
 		for_each_group(i) {
 			group = &active[i];
@@ -443,96 +469,145 @@ do_set_attrib(
 		case ATTRIB_MAILDIR:
 			free_if_not_default(&group->attribute->maildir, tinrc.maildir);
 			SET_STRING(maildir);
+
 		case ATTRIB_SAVEDIR:
 			free_if_not_default(&group->attribute->savedir, tinrc.savedir);
 			SET_STRING(savedir);
+
 		case ATTRIB_SAVEFILE:
 			FreeIfNeeded(group->attribute->savefile);
 			SET_STRING(savefile);
+
 		case ATTRIB_ORGANIZATION:
 			free_if_not_default(&group->attribute->organization, default_organization);
 			SET_STRING(organization);
+
 		case ATTRIB_FROM:
 			free_if_not_default(&group->attribute->from, tinrc.mail_address);
 			SET_STRING(from);
+
 		case ATTRIB_SIGFILE:
 			free_if_not_default(&group->attribute->sigfile, tinrc.sigfile);
 			SET_STRING(sigfile);
+
 		case ATTRIB_FOLLOWUP_TO:
 			FreeIfNeeded(group->attribute->followup_to);
 			SET_STRING(followup_to);
+
 		case ATTRIB_AUTO_SELECT:
 			SET_INTEGER(auto_select);
+
 		case ATTRIB_AUTO_SAVE:
 			SET_INTEGER(auto_save);
+
 		case ATTRIB_BATCH_SAVE:
 			SET_INTEGER(batch_save);
+
 		case ATTRIB_DELETE_TMP_FILES:
 			SET_INTEGER(delete_tmp_files);
+
 		case ATTRIB_SHOW_ONLY_UNREAD:
 			SET_INTEGER(show_only_unread);
+
 		case ATTRIB_THREAD_ARTS:
 			SET_INTEGER(thread_arts);
+
+		case ATTRIB_THREAD_PERC:
+			SET_INTEGER(thread_perc);
+
 		case ATTRIB_SHOW_AUTHOR:
 			SET_INTEGER(show_author);
+
+		case ATTRIB_SHOW_INFO:
+			SET_INTEGER(show_info);
+
 		case ATTRIB_SORT_ART_TYPE:
 			SET_INTEGER(sort_art_type);
+
 		case ATTRIB_SORT_THREADS_TYPE:
 			SET_INTEGER(sort_threads_type);
+
 		case ATTRIB_POST_PROC_TYPE:
 			SET_INTEGER(post_proc_type);
+
 		case ATTRIB_QUICK_KILL_HEADER:
 			SET_INTEGER(quick_kill_header);
+
 		case ATTRIB_QUICK_KILL_SCOPE:
 			FreeIfNeeded(group->attribute->quick_kill_scope);
 			SET_STRING(quick_kill_scope);
+
 		case ATTRIB_QUICK_KILL_EXPIRE:
 			SET_INTEGER(quick_kill_expire);
+
 		case ATTRIB_QUICK_KILL_CASE:
 			SET_INTEGER(quick_kill_case);
+
 		case ATTRIB_QUICK_SELECT_HEADER:
 			SET_INTEGER(quick_select_header);
+
 		case ATTRIB_QUICK_SELECT_SCOPE:
 			FreeIfNeeded(group->attribute->quick_select_scope);
 			SET_STRING(quick_select_scope);
+
 		case ATTRIB_QUICK_SELECT_EXPIRE:
 			SET_INTEGER(quick_select_expire);
+
 		case ATTRIB_QUICK_SELECT_CASE:
 			SET_INTEGER(quick_select_case);
+
 		case ATTRIB_MAILING_LIST:
 			FreeIfNeeded(group->attribute->mailing_list);
 			SET_STRING(mailing_list);
+
 #ifdef CHARSET_CONVERSION
 		case ATTRIB_MM_NETWORK_CHARSET:
 			SET_INTEGER(mm_network_charset);
+
 		case ATTRIB_UNDECLARED_CHARSET:
 			FreeIfNeeded(group->attribute->undeclared_charset);
 			SET_STRING(undeclared_charset);
 #endif /* CHARSET_CONVERSION */
+
 		case ATTRIB_X_HEADERS:
 			FreeIfNeeded(group->attribute->x_headers);
 			SET_STRING(x_headers);
+
 		case ATTRIB_X_BODY:
 			FreeIfNeeded(group->attribute->x_body);
 			SET_STRING(x_body);
+
 		case ATTRIB_X_COMMENT_TO:
 			SET_INTEGER(x_comment_to);
+
+		case ATTRIB_FCC:
+			FreeIfNeeded(group->attribute->fcc);
+			SET_STRING(fcc);
+
 		case ATTRIB_NEWS_QUOTE:
 			free_if_not_default(&group->attribute->news_quote_format, tinrc.news_quote_format);
 			SET_STRING(news_quote_format);
+
 		case ATTRIB_QUOTE_CHARS:
 			free_if_not_default(&group->attribute->quote_chars, tinrc.quote_chars);
 			SET_STRING(quote_chars);
+
 		case ATTRIB_MIME_TYPES_TO_SAVE:
 			FreeIfNeeded(group->attribute->mime_types_to_save);
 			SET_STRING(mime_types_to_save);
+
+		case ATTRIB_MIME_FORWARD:
+			SET_INTEGER(mime_forward);
+
 #ifdef HAVE_ISPELL
 		case ATTRIB_ISPELL:
 			FreeIfNeeded(group->attribute->ispell);
 			SET_STRING(ispell);
 #endif /* HAVE_ISPELL */
+
 		case ATTRIB_TEX2ISO_CONV:
 			SET_INTEGER(tex2iso_conv);
+
 		default:
 			break;
 	}
@@ -601,12 +676,19 @@ write_attributes_file(
 		fprintf(fp, "%d=%s, ", i, _(txt_threading[i]));
 	}
 	fprintf(fp, "\n");
+	fprintf(fp, _("#  thread_perc=NUM\n"));
 	fprintf(fp, _("#  show_author=NUM\n"));
 	fprintf(fp, "#    %d=%s, %d=%s, %d=%s, %d=%s\n",
 		SHOW_FROM_NONE, _(txt_show_from[SHOW_FROM_NONE]),
 		SHOW_FROM_ADDR, _(txt_show_from[SHOW_FROM_ADDR]),
 		SHOW_FROM_NAME, _(txt_show_from[SHOW_FROM_NAME]),
 		SHOW_FROM_BOTH, _(txt_show_from[SHOW_FROM_BOTH]));
+	fprintf(fp, _("#  show_info=NUM\n"));
+	fprintf(fp, "#    %d=%s, %d=%s, %d=%s, %d=%s\n",
+		SHOW_INFO_NOTHING, _(txt_show_info_type[SHOW_INFO_NOTHING]),
+		SHOW_INFO_LINES, _(txt_show_info_type[SHOW_INFO_LINES]),
+		SHOW_INFO_SCORE, _(txt_show_info_type[SHOW_INFO_SCORE]),
+		SHOW_INFO_BOTH, _(txt_show_info_type[SHOW_INFO_BOTH]));
 	fprintf(fp, _("#  sort_art_type=NUM\n"));
 	fprintf(fp, "#    %d=%s,\n",
 		SORT_ARTICLES_BY_NOTHING, _(txt_sort_a_type[SORT_ARTICLES_BY_NOTHING]));
@@ -650,7 +732,9 @@ write_attributes_file(
 	fprintf(fp, _("#    2=from (case sensitive) 3=from (ignore case)\n"));
 	fprintf(fp, _("#    4=msgid 5=lines\n"));
 	fprintf(fp, _("#  x_comment_to=ON/OFF\n"));
+	fprintf(fp, _("#  fcc=STRING (eg. =mailbox)\n"));
 	fprintf(fp, _("#  tex2iso_conv=ON/OFF\n"));
+	fprintf(fp, _("#  mime_forward=ON/OFF\n"));
 #ifdef CHARSET_CONVERSION
 	fprintf(fp, _("#  mm_network_charset=supported_charset"));
 	for (i = 0; i < NUM_MIME_CHARSETS; i++) {
@@ -681,10 +765,11 @@ write_attributes_file(
 		fprintf(fp, "scope=*sources*\n");
 		fprintf(fp, "post_proc_type=%d\n\n", POST_PROC_SHAR);
 
-		fprintf(fp, _("# in *binaries* do full post processing, remove tmp files\n"));
-		fprintf(fp, _("# and set Followup-To: poster\n"));
+		fprintf(fp, _("# in *binaries* do full post processing but no TeX2ISO conversion,\n"));
+		fprintf(fp, _("# remove tmp files and set Followup-To: poster\n"));
 		fprintf(fp, "scope=*binaries*\n");
 		fprintf(fp, "post_proc_type=%d\n", POST_PROC_YES);
+		fprintf(fp, "tex2iso_conv=OFF\n");
 		fprintf(fp, "delete_tmp_files=ON\n");
 		fprintf(fp, "followup_to=poster\n\n");
 	} else {
@@ -710,7 +795,8 @@ write_attributes_file(
 		error_message(_(txt_filesystem_full), ATTRIBUTES_FILE);
 	else if (copy_ok)
 		rename_file(new_file, file);
-	else unlink (new_file);
+	else
+		unlink (new_file);
 
 	free(new_file);
 	return;
@@ -739,6 +825,7 @@ write_attributes_file(
 #	endif /* HAVE_ISPELL */
 		fprintf(fp, "show_only_unread=%s\n", print_boolean(attr->show_only_unread));
 		fprintf(fp, "thread_arts=%d\n", attr->thread_arts);
+		fprintf(fp, "thread_perc=%d\n", attr->thread_perc);
 		fprintf(fp, "auto_select=%s\n", print_boolean(attr->auto_select));
 		fprintf(fp, "auto_save=%s\n", print_boolean(attr->auto_save));
 		fprintf(fp, "batch_save=%s\n", print_boolean(attr->batch_save));
@@ -746,6 +833,7 @@ write_attributes_file(
 		fprintf(fp, "sort_art_type=%d\n", attr->sort_art_type);
 		fprintf(fp, "sort_threads_type=%d\n", attr->sort_threads_type);
 		fprintf(fp, "show_author=%d\n", attr->show_author);
+		fprintf(fp, "show_info=%d\n", attr->show_info);
 		fprintf(fp, "post_proc_type=%d\n", attr->post_proc_type);
 		fprintf(fp, "quick_kill_scope=%s\n", attr->quick_kill_scope);
 		fprintf(fp, "quick_kill_case=%s\n", print_boolean(attr->quick_kill_case));
@@ -756,7 +844,9 @@ write_attributes_file(
 		fprintf(fp, "quick_select_expire=%s\n", print_boolean(attr->quick_select_expire));
 		fprintf(fp, "quick_select_header=%d\n", attr->quick_select_header);
 		fprintf(fp, "x_comment_to=%s\n", print_boolean(attr->x_comment_to));
+		fprintf(fp, "fcc=%s\n", attr->fcc);
 		fprintf(fp, "tex2iso_conv=%s\n", print_boolean(attr->tex2iso_conv));
+		fprintf(fp, "mime_forward=%s\n", print_boolean(attr->mime_forward));
 #	ifdef CHARSET_CONVERSION
 		fprintf(fp, "mm_network_charset=%s\n", txt_mime_charsets[attr->mm_network_charset]);
 		fprintf(fp, "undeclared_charset=%s\n", attr->undeclared_charset);
@@ -828,6 +918,7 @@ dump_attributes(
 #		endif /* HAVE_ISPELL */
 		fprintf(stderr, "\tshow_only_unread=%s\n", print_boolean(group->attribute->show_only_unread));
 		fprintf(stderr, "\tthread_arts=%d\n", group->attribute->thread_arts);
+		fprintf(stderr, "\tthread_perc=%d\n", group->attribute->thread_perc);
 		fprintf(stderr, "\tauto_select=%s\n", print_boolean(group->attribute->auto_select));
 		fprintf(stderr, "\tauto_save=%s\n", print_boolean(group->attribute->auto_save));
 		fprintf(stderr, "\tbatch_save=%s\n", print_boolean(group->attribute->batch_save));
@@ -835,6 +926,7 @@ dump_attributes(
 		fprintf(stderr, "\tsort_art_type=%d\n", group->attribute->sort_art_type);
 		fprintf(stderr, "\tsort_threads_type=%d\n", group->attribute->sort_threads_type);
 		fprintf(stderr, "\tshow_author=%d\n", group->attribute->show_author);
+		fprintf(stderr, "\tshow_info=%d\n", group->attribute->show_info);
 		fprintf(stderr, "\tpost_proc_type=%d\n", group->attribute->post_proc_type);
 		fprintf(stderr, "\tquick_kill_scope=%s\n", group->attribute->quick_kill_scope);
 		fprintf(stderr, "\tquick_kill_case=%s\n", print_boolean(group->attribute->quick_kill_case));
@@ -845,7 +937,9 @@ dump_attributes(
 		fprintf(stderr, "\tquick_select_expire=%s\n", print_boolean(group->attribute->quick_select_expire));
 		fprintf(stderr, "\tquick_select_header=%d\n", group->attribute->quick_select_header);
 		fprintf(stderr, "\tx_comment_to=%s\n", print_boolean(group->attribute->x_comment_to));
+		fprintf(stderr, "\tfcc=%s\n", group->attribute->fcc);
 		fprintf(stderr, "\ttex2iso_conv=%s\n", print_boolean(group->attribute->tex2iso_conv));
+		fprintf(stderr, "\tmime_forward=%s\n", print_boolean(group->attribute->mime_forward));
 #		ifdef CHARSET_CONVERSION
 		fprintf(stderr, "\tmm_network_charset=%s\n", txt_mime_charsets[group->attribute->mm_network_charset]);
 		fprintf(stderr, "\tundeclared_charset=%s\n", group->attribute->undeclared_charset);
diff -Nurp tin-1.6.2/src/auth.c tin-1.8.0/src/auth.c
--- tin-1.6.2/src/auth.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/auth.c	2005-12-02 12:07:35.000000000 +0100
@@ -3,11 +3,11 @@
  *  Module    : auth.c
  *  Author    : Dirk Nimmich <nimmich@muenster.de>
  *  Created   : 1997-04-05
- *  Updated   : 2003-05-09
+ *  Updated   : 2005-08-16
  *  Notes     : Routines to authenticate to a news server via NNTP.
  *              DON'T USE get_respcode() THROUGHOUT THIS CODE.
  *
- * Copyright (c) 1997-2003 Dirk Nimmich <nimmich@muenster.de>
+ * Copyright (c) 1997-2006 Dirk Nimmich <nimmich@muenster.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -114,13 +114,13 @@ authinfo_generic(
 	put_server(tmpbuf);
 
 #ifdef HAVE_SETENV
-	sprintf(tmpbuf, "%d.%d.%d",
+	snprintf(tmpbuf, sizeof(tmpbuf), "%d.%d.%d",
 			fileno(get_nntp_fp(FAKE_NNTP_FP)),
 			fileno(get_nntp_wr_fp(FAKE_NNTP_FP)), cookiefd);
 	setenv("NNTP_AUTH_FDS", tmpbuf, 1);
 #else
 #	ifdef HAVE_PUTENV
-	sprintf(tmpbuf, "NNTP_AUTH_FDS=%d.%d.%d",
+	snprintf(tmpbuf, sizeof(tmpbuf), "NNTP_AUTH_FDS=%d.%d.%d",
 			fileno(get_nntp_fp(FAKE_NNTP_FP)),
 			fileno(get_nntp_wr_fp(FAKE_NNTP_FP)), cookiefd);
 	new_env = my_strdup(tmpbuf);
@@ -152,7 +152,7 @@ read_newsauth_file(
 	char *ptr;
 	char line[PATH_LEN];
 	int found = 0;
-	int fd = -1;
+	int fd;
 	struct stat statbuf;
 
 	joinpath(line, homedir, ".newsauth");
@@ -258,7 +258,7 @@ do_authinfo_original(
 	char line[PATH_LEN];
 	int ret;
 
-	sprintf(line, "AUTHINFO USER %s", authuser);
+	snprintf(line, sizeof(line), "AUTHINFO USER %s", authuser);
 #ifdef DEBUG
 	debug_nntp("authorization", line);
 #endif /* DEBUG */
@@ -274,7 +274,7 @@ do_authinfo_original(
 		return ERR_AUTHBAD;
 	}
 
-	sprintf(line, "AUTHINFO PASS %s", authpass);
+	snprintf(line, sizeof(line), "AUTHINFO PASS %s", authpass);
 #ifdef DEBUG
 	debug_nntp("authorization", line);
 #endif /* DEBUG */
@@ -289,8 +289,10 @@ do_authinfo_original(
 /*
  * NNTP user authorization. Returns TRUE if authorization succeeded,
  * FALSE if not.
- * Password read from ~/.newsauth or, if not present or no matching
+ * If username/passwd already given, and server wasn't changed, retry those.
+ * Otherwise, read password from ~/.newsauth or, if not present or no matching
  * server found, from console.
+ *
  * The ~/.newsauth authorization file has the format:
  *   nntpserver1 password [user]
  *   nntpserver2 password [user]
@@ -303,22 +305,36 @@ authinfo_original(
 	t_bool startup)
 {
 	char *authpass;
-	char authusername[PATH_LEN];
-	char authpassword[PATH_LEN];
 	int ret = ERR_AUTHBAD, changed;
+	static char authusername[PATH_LEN] = "";
+	static char authpassword[PATH_LEN] = "";
 	static char last_server[PATH_LEN] = "";
 	static t_bool already_failed = FALSE;
+	static t_bool initialized = FALSE;
 
 #ifdef DEBUG
 	debug_nntp("authorization", "original authinfo");
 #endif /* DEBUG */
 
+
+	changed = strcmp(server, last_server);	/* do we need new auth values? */
+	strncpy(last_server, server, PATH_LEN - 1);
+	last_server[PATH_LEN - 1] = '\0';
+
+	/*
+	 * Let's try the previous auth pair first, if applicable.
+	 * Else, proceed to the other mechanisms.
+	 */
+	if (initialized && !changed && !already_failed && do_authinfo_original(server, authusername, authpassword))
+		return TRUE;
+
 	authpassword[0] = '\0';
 	authuser = strncpy(authusername, authuser, sizeof(authusername) - 1);
 	authpass = authpassword;
 
 	/*
-	 * read .newsauth only if we had not failed authentication yet for the
+	 * No username/password given yet.
+	 * Read .newsauth only if we had not failed authentication yet for the
 	 * current server (we don't want to try wrong username/password pairs
 	 * more than once because this may lead to an infinite loop at connection
 	 * startup: nntp_open tries to authenticate, it fails, server closes
@@ -330,7 +346,7 @@ authinfo_original(
 	 * and restart tin or change to another server and back in order to get
 	 * it read again.
 	 */
-	if ((changed = strcmp(server, last_server)) || (!changed && !already_failed)) {
+	if (changed || (!changed && !already_failed)) {
 		already_failed = FALSE;
 		if (read_newsauth_file(server, authuser, authpass)) {
 			ret = do_authinfo_original(server, authuser, authpass);
@@ -338,6 +354,7 @@ authinfo_original(
 #ifdef DEBUG
 				debug_nntp("authorization", "succeeded");
 #endif /* DEBUG */
+				initialized = TRUE;
 				return TRUE;
 			}
 		}
@@ -387,11 +404,12 @@ authinfo_original(
 		 */
 		authpass = strncpy(authpassword, getpass(_(txt_auth_pass)), sizeof(authpassword) - 1);
 #	else
-		authpass = strncpy(authpassword, tin_getline(_(txt_auth_pass), FALSE, (char *) 0, PATH_LEN, TRUE, HIST_NONE), sizeof(authpassword) - 1);
+		authpass = strncpy(authpassword, tin_getline(_(txt_auth_pass), FALSE, NULL, PATH_LEN, TRUE, HIST_NONE), sizeof(authpassword) - 1);
 #	endif /* 0 */
 #endif /* USE_CURSES */
 
 		ret = do_authinfo_original(server, authuser, authpass);
+		initialized = TRUE;
 		my_retouch();			/* Get rid of the chaff */
 	}
 
diff -Nurp tin-1.6.2/src/charset.c tin-1.8.0/src/charset.c
--- tin-1.6.2/src/charset.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/charset.c	2005-12-02 12:07:35.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : charset.c
  *  Author    : M. Kuhn, T. Burmester
  *  Created   : 1993-12-10
- *  Updated   : 2003-03-22
+ *  Updated   : 2004-07-21
  *  Notes     : ISO to ascii charset conversion routines
  *
- * Copyright (c) 1993-2003 Markus Kuhn <mgk25@cl.cam.ac.uk>
+ * Copyright (c) 1993-2006 Markus Kuhn <mgk25@cl.cam.ac.uk>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -255,7 +255,7 @@ convert_tex2iso(
 	char *from,
 	char *to)
 {
-	const char * tex_to[TEX_SUBST];
+	const char *tex_to[TEX_SUBST];
 	int i;
 	size_t spaces = 0; /* spaces to add */
 	size_t len, col = 0;	/* length of from, col counter */
@@ -379,20 +379,22 @@ convert_to_printable(
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 	char *buffer;
 	wchar_t *wbuffer;
-	size_t len = strlen(buf);
+	size_t len = strlen(buf) + 1;
 
-	buffer = my_malloc(len + 1);
-	wbuffer = my_malloc(sizeof(wchar_t) * (len + 1));
+	if (IS_LOCAL_CHARSET("UTF-8"))
+		utf8_valid(buf);
 
-	if (mbstowcs(wbuffer, buf, len) != (size_t) (-1)) {
-		wbuffer[len] = (wchar_t) '\0';
+	if ((wbuffer = char2wchar_t(buf)) != NULL) {
 		wconvert_to_printable(wbuffer);
-		wcstombs(buffer, wbuffer, len);
-		buffer[len] = '\0';
-		strcpy(buf, (const char *) buffer);
+
+		if ((buffer = wchar_t2char(wbuffer)) != NULL) {
+			strncpy(buf, buffer, len);
+			buf[len - 1] = '\0';
+
+			free(buffer);
+		}
+		free(wbuffer);
 	}
-	free(buffer);
-	free(wbuffer);
 #else
 	unsigned char *c;
 
@@ -436,30 +438,27 @@ wconvert_to_printable(
  *        sometimes fails to propper convert (wchar_t) 0 to (wint_t) 0
  *        and thus loop termination fails.
  */
-void
+char *
 convert_body2printable(
 	char *buf)
 {
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 	char *buffer;
 	wchar_t *wc, *wbuffer;
-	size_t len = strlen(buf);
-
-	buffer = my_malloc(len + 1);
-	wbuffer = my_malloc(sizeof(wchar_t) * (len + 1));
+	size_t len = strlen(buf) + 1;
 
-	if (mbstowcs(wbuffer, buf, len) != (size_t) (-1)) {
-		wbuffer[len] = (wchar_t) '\0';
+	if ((wbuffer = char2wchar_t(buf)) != NULL) {
 		for (wc = wbuffer; *wc; wc++) {
 			if (!(iswprint((wint_t) *wc) || *wc == (wchar_t) 8 || *wc == (wchar_t) 9 || *wc == (wchar_t) 10 || *wc == (wchar_t) 12 || *wc == (wchar_t) 13 || (IS_LOCAL_CHARSET("Big5") && *wc == (wchar_t) 27)))
 				*wc = (wchar_t) '?';
 		}
-		wcstombs(buffer, wbuffer, len);
-		buffer[len] = '\0';
-		strcpy(buf, (const char *) buffer);
+		if ((buffer = wchar_t2char(wbuffer)) != NULL) {
+			strncpy(buf, buffer, len);
+			buf[len - 1] = '\0';
+			free(buffer);
+		}
+		free(wbuffer);
 	}
-	free(buffer);
-	free(wbuffer);
 #else
 	unsigned char *c;
 
@@ -468,4 +467,5 @@ convert_body2printable(
 			*c = '?';
 	}
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	return buf;
 }
diff -Nurp tin-1.6.2/src/color.c tin-1.8.0/src/color.c
--- tin-1.6.2/src/color.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/color.c	2005-12-02 12:07:35.000000000 +0100
@@ -5,13 +5,13 @@
  *  Author    : Roland Rosenfeld <roland@spinnaker.rhein.de>
  *              Giuseppe De Marco <gdm@rebel.net> (light-colors)
  *              Julien Oster <fuzzy@cu8.cum.de> (word highlighting)
- *              T.Dickey <dickey@herndon4.his.com> (curses support)
+ *              T.Dickey <dickey@invisible-island.net> (curses support)
  *  Created   : 1995-06-02
- *  Updated   : 2003-05-05
+ *  Updated   : 2004-06-07
  *  Notes     : This are the basic function for ansi-color
  *              and word highlighting
  *
- * Copyright (c) 1995-2003 Roland Rosenfeld <roland@spinnaker.rhein.de>
+ * Copyright (c) 1995-2006 Roland Rosenfeld <roland@spinnaker.rhein.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -211,7 +211,8 @@ bcol(
 void
 draw_pager_line(
 	const char *str,
-	int flags)
+	int flags,
+	t_bool raw_data)
 {
 #ifdef HAVE_COLOR
 
@@ -233,7 +234,90 @@ draw_pager_line(
 	}
 
 #endif /* HAVE_COLOR */
-	my_fputs(str, stdout);
+	if (!raw_data) {
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && defined(HAVE_UNICODE_UBIDI_H) && !defined(NO_LOCALE)
+		/*
+		 * BiDi support
+		 */
+		/* don't run it on empty lines and lines containing only one char (which must be an ASCII one) */
+		if (tinrc.render_bidi && IS_LOCAL_CHARSET("UTF-8") && strlen(str) > 1) {
+			char *line;
+			t_bool is_rtl;
+
+			if ((line = render_bidi(str, &is_rtl)) != NULL) {
+				if (is_rtl) { /* RTL */
+					/* determine visual length and pad out so that line is right-aligned */
+					wchar_t *wline;
+
+					if ((wline = char2wchar_t(line)) != NULL) {
+						int visual_len;
+
+						wconvert_to_printable(wline);
+						visual_len = wcswidth(wline, wcslen(wline) + 1);
+						free(wline);
+
+						if (visual_len > 0) {
+							int i;
+
+							for (i = 0; i < cCOLS - visual_len - 1; i++)
+								my_fputc(' ', stdout);
+						}
+						my_fputs(line, stdout);
+					} else /* fallback */
+						my_fputs(line, stdout);
+
+				} else	/* LTR */
+					my_fputs(line, stdout);
+
+				free(line);
+			} else
+				my_fputs(str, stdout);
+		} else
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && HAVE_UNICODE_UBIDI_H && !NO_LOCALE */
+			my_fputs(str, stdout);
+	} else {
+		/* in RAW-mode (show_all_headers) display non-printable chars as octals */
+		const char *c;
+		char octal[5];
+
+		c = str;
+		while (*c) {
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+			int num_bytes;
+			wchar_t wc;
+
+			num_bytes = mbtowc(&wc, c, MB_CUR_MAX);
+			if (num_bytes != -1 && iswprint(wc)) {
+				my_fputwc((wint_t) wc, stdout);
+				c += num_bytes;
+			}
+#else
+			if (my_isprint((int) *c)) {
+				my_fputc((int) *c, stdout);
+				c++;
+			}
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+			else if (IS_LOCAL_CHARSET("Big5") && (unsigned char) *c >= 0xa1 &&(unsigned char) *c <= 0xfe && *(c + 1)) {
+				/*
+				 * Big5: ASCII chars are handled by the normal code
+				 * check only for 2-byte chars
+				 * TODO: should we also check if the second byte is also valid?
+				 */
+				my_fputc((int) *c, stdout);
+				c++;
+				my_fputc((int) *c, stdout);
+				c++;
+			} else {
+				/*
+				 * non-printable char
+				 * print as an octal value
+				 */
+				snprintf(octal, sizeof(octal), "\\%03o", (int) *c & 0xff);
+				my_fputs(octal, stdout);
+				c++;
+			}
+		}
+	}
 
 #ifndef USE_CURSES
 	my_fputs(cCRLF, stdout);
diff -Nurp tin-1.6.2/src/config.c tin-1.8.0/src/config.c
--- tin-1.6.2/src/config.c	2003-09-01 00:39:42.000000000 +0200
+++ tin-1.8.0/src/config.c	2005-12-02 12:07:35.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : config.c
  *  Author    : I. Lea
  *  Created   : 1991-04-01
- *  Updated   : 2003-09-01
+ *  Updated   : 2005-08-14
  *  Notes     : Configuration file routines
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,15 +41,9 @@
 #ifndef VERSION_H
 #	include "version.h"
 #endif /* !VERSION_H */
-#ifndef TINTBL_H
-#	include "tincfg.h"
-#endif /* !TINTBL_H */
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
 #ifndef TNNTP_H
 #	include "tnntp.h"
 #endif /* TNNTP_H */
@@ -57,27 +51,12 @@
 /*
  * local prototypes
  */
-static int get_option_num(int act_option);
-static int set_option_num(int option);
-static t_bool OptionOnPage(int option);
 static t_bool match_item(char *line, const char *pat, char *dst, size_t dstlen);
 static t_bool rc_update(FILE *fp);
-static void RepaintOption(int option);
-static void check_score_defaults(void);
-static void expand_rel_abs_pathname(int line, int col, char *str);
-static void highlight_option(int option);
-static void print_any_option(int act_option);
-static void print_option(enum option_enum the_option);
-static void redraw_screen(int option);
-static void show_config_page(void);
-static void unhighlight_option(int option);
 static void write_server_config(void);
 #ifdef HAVE_COLOR
 	static t_bool match_color(char *line, const char *pat, int *dst, int max);
 #endif /* HAVE_COLOR */
-#ifdef USE_CURSES
-	static void DoScroll(int jump);
-#endif /* USE_CURSES */
 
 
 #define DASH_TO_SPACE(mark)	((char) (mark == '_' ? ' ' : mark))
@@ -93,7 +72,6 @@ read_config_file(
 	t_bool global_file) /* return value is always ignored */
 {
 	FILE *fp;
-	char newnews_info[PATH_LEN];
 	char buf[LEN], tmp[LEN];
 	int upgrade = RC_CHECK;
 
@@ -264,6 +242,9 @@ read_config_file(
 			if (match_color(buf, "col_signature=", &tinrc.col_signature, MAX_COLOR))
 				break;
 
+			if (match_color(buf, "col_urls=", &tinrc.col_urls, MAX_COLOR))
+				break;
+
 			if (match_color(buf, "col_markstar=", &tinrc.col_markstar, MAX_COLOR))
 				break;
 
@@ -282,6 +263,9 @@ read_config_file(
 			break;
 
 		case 'd':
+			if (match_string(buf, "date_format=", tinrc.date_format, sizeof(tinrc.date_format)))
+				break;
+
 			if (match_string(buf, "default_editor_format=", tinrc.editor_format, sizeof(tinrc.editor_format)))
 				break;
 
@@ -307,8 +291,11 @@ read_config_file(
 			if (match_string(buf, "default_sigfile=", tinrc.sigfile, sizeof(tinrc.sigfile)))
 				break;
 
-			if (match_integer(buf, "default_filter_days=", &tinrc.filter_days, 0))
+			if (match_integer(buf, "default_filter_days=", &tinrc.filter_days, 0)) {
+				if (tinrc.filter_days <= 0)
+					tinrc.filter_days = 1;
 				break;
+			}
 
 			if (match_integer(buf, "default_filter_kill_header=", &tinrc.default_filter_kill_header, FILTER_LINES))
 				break;
@@ -375,7 +362,7 @@ read_config_file(
 #ifndef DONT_HAVE_PIPING
 			if (match_string(buf, "default_pipe_command=", tinrc.default_pipe_command, sizeof(tinrc.default_pipe_command)))
 				break;
-#endif /* DONT_HAVE_PIPING */
+#endif /* !DONT_HAVE_PIPING */
 
 			if (match_string(buf, "default_post_newsgroups=", tinrc.default_post_newsgroups, sizeof(tinrc.default_post_newsgroups)))
 				break;
@@ -443,6 +430,9 @@ read_config_file(
 			if (match_string(buf, "inews_prog=", tinrc.inews_prog, sizeof(tinrc.inews_prog)))
 				break;
 
+			if (match_integer(buf, "interactive_mailer=", &tinrc.interactive_mailer, INTERACTIVE_NONE))
+				break;
+
 			break;
 
 		case 'k':
@@ -507,8 +497,8 @@ read_config_file(
 			break;
 
 		case 'n':
-			if (match_string(buf, "newnews=", newnews_info, sizeof(newnews_info))) {
-				load_newnews_info(newnews_info);
+			if (match_string(buf, "newnews=", tmp, sizeof(tmp))) {
+				load_newnews_info(tmp);
 				break;
 			}
 
@@ -533,6 +523,18 @@ read_config_file(
 			if (match_string(buf, "news_quote_format=", tinrc.news_quote_format, sizeof(tinrc.news_quote_format)))
 				break;
 
+#ifdef HAVE_UNICODE_NORMALIZATION
+#	ifdef HAVE_LIBICUUC
+			if (match_integer(buf, "normalization_form=", &tinrc.normalization_form, NORMALIZE_NFD))
+				break;
+#	else
+#		ifdef HAVE_LIBIDN
+			if (match_integer(buf, "normalization_form=", &tinrc.normalization_form, NORMALIZE_NFKC))
+				break;
+#		endif /* HAVE_LIBIDN */
+#	endif /* HAVE_LIBICUUC */
+#endif /* HAVE_UNICODE_NORMALIZATION */
+
 			break;
 
 		case 'p':
@@ -600,6 +602,11 @@ read_config_file(
 			if (match_integer(buf, "recent_time=", &tinrc.recent_time, 16383)) /* use INT_MAX? */
 				break;
 
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && defined(HAVE_UNICODE_UBIDI_H) && !defined(NO_LOCALE)
+			if (match_boolean(buf, "render_bidi=", &tinrc.render_bidi))
+				break;
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && HAVE_UNICODE_UBIDI_H && !NO_LOCALE */
+
 			if (match_integer(buf, "reread_active_file_secs=", &tinrc.reread_active_file_secs, 16383)) /* use INT_MAX? */
 				break;
 
@@ -697,6 +704,9 @@ read_config_file(
 			if (match_integer(buf, "thread_articles=", &tinrc.thread_articles, THREAD_MAX))
 				break;
 
+			if (match_integer(buf, "thread_perc=", &tinrc.thread_perc, 100))
+				break;
+
 			if (match_integer(buf, "thread_score=", &tinrc.thread_score, THREAD_SCORE_WEIGHT))
 				break;
 
@@ -726,7 +736,7 @@ read_config_file(
 			if (match_string(buf, "url_handler=", tinrc.url_handler, sizeof(tinrc.url_handler)))
 				break;
 
-			if (match_boolean(buf, "use_mailreader_i=", &tinrc.use_mailreader_i))
+			if (match_boolean(buf, "url_highlight=", &tinrc.url_highlight))
 				break;
 
 			if (match_boolean(buf, "use_mouse=", &tinrc.use_mouse))
@@ -752,10 +762,8 @@ read_config_file(
 			break;
 
 		case 'w':
-			if (match_integer(buf, "wildcard=", &tinrc.wildcard, 2)) {
-				wildcard_func = (tinrc.wildcard) ? match_regex : wildmat;
+			if (match_integer(buf, "wildcard=", &tinrc.wildcard, 2))
 				break;
-			}
 
 			if (match_boolean(buf, "word_highlight=", &tinrc.word_highlight)) {
 				word_highlight = tinrc.word_highlight;
@@ -799,7 +807,7 @@ read_config_file(
 	 */
 	{
 #ifndef NO_LOCALE
-		char *p;
+		const char *p;
 
 		if ((p = tin_nl_langinfo(CODESET)) != NULL) {
 			if (!strcmp(p, "ANSI_X3.4-1968"))
@@ -920,6 +928,9 @@ write_config_file(
 	fprintf(fp, _(txt_thread_articles.tinrc));
 	fprintf(fp, "thread_articles=%d\n\n", tinrc.thread_articles);
 
+	fprintf(fp, _(txt_thread_perc.tinrc));
+	fprintf(fp, "thread_perc=%d\n\n", tinrc.thread_perc);
+
 	fprintf(fp, _(txt_show_description.tinrc));
 	fprintf(fp, "show_description=%s\n\n", print_boolean(tinrc.show_description));
 
@@ -973,8 +984,8 @@ write_config_file(
 	fprintf(fp, _(txt_mailer_format.tinrc));
 	fprintf(fp, "default_mailer_format=%s\n\n", tinrc.mailer_format);
 
-	fprintf(fp, _(txt_use_mailreader_i.tinrc));
-	fprintf(fp, "use_mailreader_i=%s\n\n", print_boolean(tinrc.use_mailreader_i));
+	fprintf(fp, _(txt_interactive_mailer.tinrc));
+	fprintf(fp, "interactive_mailer=%d\n\n", tinrc.interactive_mailer);
 
 	fprintf(fp, _(txt_show_info.tinrc));
 	fprintf(fp, "show_info=%d\n\n", tinrc.show_info);
@@ -1198,39 +1209,51 @@ write_config_file(
 
 	fprintf(fp, _(txt_col_signature.tinrc));
 	fprintf(fp, "col_signature=%d\n\n", tinrc.col_signature);
+
+	fprintf(fp, _(txt_col_urls.tinrc));
+	fprintf(fp, "col_urls=%d\n\n", tinrc.col_urls);
 #endif /* HAVE_COLOR */
 
-#ifdef XFACE_ABLE
-	fprintf(fp, _(txt_use_slrnface.tinrc));
-	fprintf(fp, "use_slrnface=%s\n\n", print_boolean(tinrc.use_slrnface));
-#endif /*XFACE_ABLE */
+	fprintf(fp, _(txt_url_highlight.tinrc));
+	fprintf(fp, "url_highlight=%s\n\n", print_boolean(tinrc.url_highlight));
 
 	fprintf(fp, _(txt_word_highlight.tinrc));
 	fprintf(fp, "word_highlight=%s\n\n", print_boolean(tinrc.word_highlight));
 
-	fprintf(fp, _(txt_wrap_column.tinrc));
-	fprintf(fp, "wrap_column=%d\n\n", tinrc.wrap_column);
-
 	fprintf(fp, _(txt_word_h_display_marks.tinrc));
 	fprintf(fp, "word_h_display_marks=%d\n\n", tinrc.word_h_display_marks);
 
 #ifdef HAVE_COLOR
 	fprintf(fp, _(txt_col_markstar.tinrc));
-	fprintf(fp, "col_markstar=%d\n", tinrc.col_markstar);
-	fprintf(fp, "col_markdash=%d\n", tinrc.col_markdash);
-	fprintf(fp, "col_markslash=%d\n", tinrc.col_markslash);
+	fprintf(fp, "col_markstar=%d\n\n", tinrc.col_markstar);
+	fprintf(fp, _(txt_col_markdash.tinrc));
+	fprintf(fp, "col_markdash=%d\n\n", tinrc.col_markdash);
+	fprintf(fp, _(txt_col_markslash.tinrc));
+	fprintf(fp, "col_markslash=%d\n\n", tinrc.col_markslash);
+	fprintf(fp, _(txt_col_markstroke.tinrc));
 	fprintf(fp, "col_markstroke=%d\n\n", tinrc.col_markstroke);
 #endif /* HAVE_COLOR */
 
 	fprintf(fp, _(txt_mono_markstar.tinrc));
-	fprintf(fp, "mono_markstar=%d\n", tinrc.mono_markstar);
-	fprintf(fp, "mono_markdash=%d\n", tinrc.mono_markdash);
-	fprintf(fp, "mono_markslash=%d\n", tinrc.mono_markslash);
+	fprintf(fp, "mono_markstar=%d\n\n", tinrc.mono_markstar);
+	fprintf(fp, _(txt_mono_markdash.tinrc));
+	fprintf(fp, "mono_markdash=%d\n\n", tinrc.mono_markdash);
+	fprintf(fp, _(txt_mono_markslash.tinrc));
+	fprintf(fp, "mono_markslash=%d\n\n", tinrc.mono_markslash);
+	fprintf(fp, _(txt_mono_markstroke.tinrc));
 	fprintf(fp, "mono_markstroke=%d\n\n", tinrc.mono_markstroke);
 
 	fprintf(fp, _(txt_mail_address.tinrc));
 	fprintf(fp, "mail_address=%s\n\n", tinrc.mail_address);
 
+#ifdef XFACE_ABLE
+	fprintf(fp, _(txt_use_slrnface.tinrc));
+	fprintf(fp, "use_slrnface=%s\n\n", print_boolean(tinrc.use_slrnface));
+#endif /*XFACE_ABLE */
+
+	fprintf(fp, _(txt_wrap_column.tinrc));
+	fprintf(fp, "wrap_column=%d\n\n", tinrc.wrap_column);
+
 #ifndef CHARSET_CONVERSION
 	fprintf(fp, _(txt_mm_charset.tinrc));
 	fprintf(fp, "mm_charset=%s\n\n", tinrc.mm_charset);
@@ -1274,9 +1297,22 @@ write_config_file(
 	fprintf(fp, _(txt_strip_bogus.tinrc));
 	fprintf(fp, "strip_bogus=%d\n\n", tinrc.strip_bogus);
 
+	fprintf(fp, _(txt_date_format.tinrc));
+	fprintf(fp, "date_format=%s\n\n", tinrc.date_format);
+
 	fprintf(fp, _(txt_wildcard.tinrc));
 	fprintf(fp, "wildcard=%d\n\n", tinrc.wildcard);
 
+#ifdef HAVE_UNICODE_NORMALIZATION
+	fprintf(fp, _(txt_normalization_form.tinrc));
+	fprintf(fp, "normalization_form=%d\n\n", tinrc.normalization_form);
+#endif /* HAVE_UNICODE_NORMALIZATION */
+
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && defined(HAVE_UNICODE_UBIDI_H) && !defined(NO_LOCALE)
+	fprintf(fp, _(txt_render_bidi.tinrc));
+	fprintf(fp, "render_bidi=%s\n\n", print_boolean(tinrc.render_bidi));
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && HAVE_UNICODE_UBIDI_H && !NO_LOCALE */
+
 	fprintf(fp, _(txt_tinrc_filter));
 	fprintf(fp, "default_filter_kill_header=%d\n", tinrc.default_filter_kill_header);
 	fprintf(fp, "default_filter_kill_global=%s\n", print_boolean(tinrc.default_filter_kill_global));
@@ -1302,7 +1338,7 @@ write_config_file(
 	fprintf(fp, "default_move_group=%d\n", tinrc.default_move_group);
 #ifndef DONT_HAVE_PIPING
 	fprintf(fp, "default_pipe_command=%s\n", tinrc.default_pipe_command);
-#endif /* DONT_HAVE_PIPING */
+#endif /* !DONT_HAVE_PIPING */
 	fprintf(fp, "default_post_newsgroups=%s\n", tinrc.default_post_newsgroups);
 	fprintf(fp, "default_post_subject=%s\n", tinrc.default_post_subject);
 	fprintf(fp, "default_range_group=%s\n", tinrc.default_range_group);
@@ -1345,1043 +1381,6 @@ write_config_file(
 }
 
 
-static int first_option_on_screen;
-static int actual_top_option = 0;
-
-#define option_lines_per_page (cLINES - INDEX_TOP - 3)
-#define TopOfPage(option) option_lines_per_page \
-			* ((option) / option_lines_per_page)
-#define OptionInPage(option)	((option) - first_option_on_screen)
-#define OptionIndex(option)	(OptionInPage(option) % option_lines_per_page)
-
-
-int
-option_row(
-	int option)
-{
-	return (INDEX_TOP + OptionIndex(option));
-}
-
-
-static int
-get_option_num(
-	int act_option)
-{
-	int result = 0;
-
-	if (option_table[act_option].var_type != OPT_TITLE) {
-		while (act_option >= 0) {
-			if (option_table[act_option--].var_type != OPT_TITLE)
-				++result;
-		}
-	}
-	return result;
-}
-
-
-static int
-set_option_num(
-	int option)
-{
-	int result = 0;
-
-	while (option >= 0 && result < LAST_OPT) {
-		while (result < LAST_OPT && option_table[result].var_type == OPT_TITLE)
-			result++;
-		if (result < LAST_OPT) {
-			if (--option < 0)
-				break;
-			++result;
-		}
-	}
-	return result;
-}
-
-
-#define OPTION_WIDTH 35
-char *
-fmt_option_prompt(
-	char *dst,
-	int len,
-	t_bool editing,
-	int option)
-{
-	int num = get_option_num(option);
-
-	/*
-	 * TODO: make the open length (OPTION_WIDTH) cCOLS dependent
-	 *       requries changes in various prompt_*() functions (and lang.c)
-	 */
-	if (num) {
-		snprintf(dst, len, "%s %3d. %.*s: ", editing ? "->" : "  ", num,
-			OPTION_WIDTH, _(option_table[option].txt->opt));
-	} else
-		snprintf(dst, len, "  %.*s", cCOLS - 3, _(option_table[option].txt->opt));
-
-	return dst;
-}
-
-
-static void
-print_any_option(
-	int act_option)
-{
-	constext **list;
-	char temp[LEN], *ptr, *ptr2;
-	int row = option_row(act_option);
-	int len = sizeof(temp) - 1;
-
-	MoveCursor(row, 0);
-
-	ptr = fmt_option_prompt(temp, len, FALSE, act_option);
-	ptr += strlen(temp);
-	len -= strlen(temp);
-
-	switch (option_table[act_option].var_type) {
-		case OPT_ON_OFF:
-			/* tailing space to overwrite any left over F from OFF */
-			snprintf(ptr, len, "%s ", print_boolean(*OPT_ON_OFF_list[option_table[act_option].var_index]));
-			break;
-
-		case OPT_LIST:
-			list = option_table[act_option].opt_list;
-			ptr2 = my_strdup(list[*(option_table[act_option].variable) + ((strcasecmp(_(list[0]), _(txt_default)) == 0) ? 1 : 0)]);
-			snprintf(ptr, len, "%s", _(ptr2));
-			free(ptr2);
-			break;
-
-		case OPT_STRING:
-			snprintf(ptr, len, "%s", OPT_STRING_list[option_table[act_option].var_index]);
-			break;
-
-		case OPT_NUM:
-			snprintf(ptr, len, "%d", *(option_table[act_option].variable));
-			break;
-
-		case OPT_CHAR:
-			snprintf(ptr, len, "%c", *OPT_CHAR_list[option_table[act_option].var_index]);
-			break;
-
-		default:
-			break;
-	}
-#ifdef USE_CURSES
-	my_printf("%.*s", cCOLS, temp);
-	{
-		int y, x;
-
-		getyx(stdscr, y, x);
-		if (x < cCOLS)
-			clrtoeol();
-	}
-#else
-	my_printf("%.*s", cCOLS - 1, temp);
-	/* draw_arrow_mark() will read this back for repainting */
-	strncpy(screen[row - INDEX_TOP].col, temp, cCOLS);
-#endif /* USE_CURSES */
-}
-
-
-static void
-print_option(
-	enum option_enum the_option)
-{
-	print_any_option((int) the_option);
-}
-
-
-static t_bool
-OptionOnPage(
-	int option)
-{
-	if ((option >= first_option_on_screen) && (option < first_option_on_screen + option_lines_per_page))
-		return TRUE;
-	return FALSE;
-}
-
-
-static void
-RepaintOption(
-	int option)
-{
-	if (OptionOnPage(option))
-		print_any_option(option);
-}
-
-
-#ifdef USE_CURSES
-static void
-DoScroll(
-	int jump)
-{
-	MoveCursor(INDEX_TOP, 0);
-	SetScrollRegion(INDEX_TOP, INDEX_TOP + option_lines_per_page - 1);
-	ScrollScreen(jump);
-	SetScrollRegion(0, LINES - 1);
-}
-#endif /* USE_CURSES */
-
-
-static void
-highlight_option(
-	int option)
-{
-	if (!OptionOnPage(option)) {
-#ifdef USE_CURSES
-		if (option > 0 && OptionOnPage(option - 1)) {
-			DoScroll(1);
-			first_option_on_screen++;
-		} else if (option < LAST_OPT && OptionOnPage(option + 1)) {
-			DoScroll(-1);
-			first_option_on_screen--;
-		} else
-#endif /* USE_CURSES */
-		{
-			first_option_on_screen = TopOfPage(option);
-			ClearScreen();
-		}
-	}
-
-	refresh_config_page(option);
-	draw_arrow_mark(option_row(option));
-}
-
-
-static void
-unhighlight_option(
-	int option)
-{
-	/* Astonishing hack */
-	t_menu *savemenu = currmenu;
-	t_menu cfgmenu = { 0, 1, 0, 0, NULL, NULL };
-
-	currmenu = &cfgmenu;
-	currmenu->curr = option_row(option) - INDEX_TOP;
-	erase_arrow();
-	currmenu = savemenu;
-}
-
-
-/*
- * Refresh the config page which holds the actual option. If act_option is
- * smaller zero fall back on the last given option (first option if there was
- * no last option) and refresh the screen.
- */
-void
-refresh_config_page(
-	int act_option)
-{
-	static int last_option = 0;
-	t_bool force_redraw = FALSE;
-
-	signal_context = cConfig;
-
-	if (act_option < 0) {
-		force_redraw = TRUE;
-		act_option = last_option;
-		ClearScreen();
-	}
-
-	if ((first_option_on_screen != actual_top_option) || force_redraw) {
-		show_config_page();
-		actual_top_option = first_option_on_screen;
-	}
-	last_option = act_option;
-}
-
-
-static void
-redraw_screen(
-	int option)
-{
-	my_retouch();
-	set_xclick_off();
-	ClearScreen();
-	show_config_page();
-	highlight_option(option);
-}
-
-
-/*
- * options menu so that the user can dynamically change parameters
- *
- * TODO: - why do we use ret_code when we never modify it?  what about calling
- *         code which checks the return value?
- *       - when we change something we need to update the related attributes
- *         as well (see line 2009).
- */
-int
-change_config_file(
-	struct t_group *group)
-{
-	int ch = 0;
-	int original_list_value;
-	int option, old_option;
-	int ret_code = NO_FILTERING;
-	int mime_encoding = MIME_ENCODING_7BIT;
-	t_bool change_option = FALSE;
-	t_bool original_on_off_value;
-
-	actual_top_option = -1;
-	option = 0;
-
-	ClearScreen();
-	set_xclick_off();
-	forever {
-		highlight_option(option);
-		stow_cursor();
-		ch = ReadCh();
-
-		/*
-		 * convert arrow key codes to "normal" codes
-		 */
-		switch (ch) {
-			case ESC:	/* common arrow keys */
-#	ifdef HAVE_KEY_PREFIX
-			case KEY_PREFIX:
-#	endif /* HAVE_KEY_PREFIX */
-				switch (get_arrow_key(ch)) {
-					case KEYMAP_UP:
-						ch = map_to_local(iKeyUp, &menukeymap.config_change);
-						break;
-
-					case KEYMAP_DOWN:
-						ch = map_to_local(iKeyDown, &menukeymap.config_change);
-						break;
-
-					case KEYMAP_HOME:
-						ch = map_to_local(iKeyFirstPage, &menukeymap.config_change);
-						break;
-
-					case KEYMAP_END:
-						ch = map_to_local(iKeyLastPage, &menukeymap.config_change);
-						break;
-
-					case KEYMAP_PAGE_UP:
-						ch = map_to_local(iKeyPageUp, &menukeymap.config_change);
-						break;
-
-					case KEYMAP_PAGE_DOWN:
-						ch = map_to_local(iKeyPageDown, &menukeymap.config_change);
-						break;
-
-					default:
-						break;
-				} /* switch (get_arrow_key()) */
-				break;
-
-			default:
-				break;
-		}	/* switch (ch) */
-
-		switch (map_to_default(ch, &menukeymap.config_change)) {
-			case iKeyQuit:
-				write_config_file(local_config_file);
-				/* FALLTHROUGH */
-			case iKeyConfigNoSave:
-				clear_note_area();
-				return ret_code;
-
-			case iKeyUp:
-			case iKeyUp2:
-				unhighlight_option(option);
-				if (--option < 0)
-					option = LAST_OPT;
-				highlight_option(option);
-				break;
-
-			case iKeyDown:
-			case iKeyDown2:
-				unhighlight_option(option);
-				if (++option > LAST_OPT)
-					option = 0;
-				highlight_option(option);
-				break;
-
-			case iKeyFirstPage:
-			case iKeyConfigFirstPage2:
-				unhighlight_option(option);
-				option = 0;
-				highlight_option(option);
-				break;
-
-			case iKeyLastPage:
-			case iKeyConfigLastPage2:
-				unhighlight_option(option);
-				option = LAST_OPT;
-				highlight_option(option);
-				break;
-
-			case iKeyPageUp:
-			case iKeyPageUp2:
-			case iKeyPageUp3:
-				unhighlight_option(option);
-				if (OptionInPage(option)) {
-					option = first_option_on_screen;
-				} else if (!first_option_on_screen) {
-					option = LAST_OPT;
-					first_option_on_screen = TopOfPage(option);
-					ClearScreen();
-					show_config_page();
-				} else if ((option -= option_lines_per_page) < 0) {
-					option = 0;
-					first_option_on_screen = 0;
-				} else {
-					first_option_on_screen -= (tinrc.scroll_lines == -2) ? option_lines_per_page / 2 : option_lines_per_page;
-					ClearScreen();
-					show_config_page();
-				}
-				highlight_option(option);
-				break;
-
-			case iKeyPageDown:
-			case iKeyPageDown2:
-			case iKeyPageDown3:
-				unhighlight_option(option);
-				first_option_on_screen += (tinrc.scroll_lines == -2) ? option_lines_per_page / 2 : option_lines_per_page;
-				if (first_option_on_screen > LAST_OPT)
-					first_option_on_screen = 0;
-
-				option = first_option_on_screen;
-				ClearScreen();
-				show_config_page();
-				highlight_option(option);
-				break;
-
-			case '1': case '2': case '3': case '4': case '5':
-			case '6': case '7': case '8': case '9':
-				unhighlight_option(option);
-				old_option = option;
-				option = prompt_num(ch, _(txt_enter_option_num)) - 1;
-				option = set_option_num(option);
-				if (option < 0 || option > LAST_OPT) {
-					option = old_option;
-					break;
-				}
-				highlight_option(option);
-				break;
-
-			case iKeySearchSubjF:
-			case iKeySearchSubjB:
-			case iKeySearchRepeat:
-				if (ch == iKeySearchRepeat && i_key_search_last != iKeySearchSubjF && i_key_search_last != iKeySearchSubjB)
-					break;
-
-				old_option = option;
-				option = search_config((ch == iKeySearchSubjF), (ch == iKeySearchRepeat), option, LAST_OPT);
-				if (option != old_option) {
-					unhighlight_option(old_option);
-					highlight_option(option);
-				}
-				break;
-
-			case iKeyConfigSelect:
-			case iKeyConfigSelect2:
-				change_option = TRUE;
-				break;
-
-			case iKeyRedrawScr:	/* redraw screen */
-				redraw_screen(option);
-				break;
-
-			default:
-				break;
-		} /* switch (ch) */
-
-		if (change_option) {
-			switch (option_table[option].var_type) {
-				case OPT_ON_OFF:
-					original_on_off_value = *OPT_ON_OFF_list[option_table[option].var_index];
-					prompt_on_off(option_row(option),
-						OPT_ARG_COLUMN,
-						OPT_ON_OFF_list[option_table[option].var_index],
-						option_table[option].txt->help,
-						option_table[option].txt->opt
-						);
-					/*
-					 * some options need further action to take effect
-					 */
-					switch (option) {
-						/* show mini help menu */
-						case OPT_BEGINNER_LEVEL:
-							if (!bool_equal(tinrc.beginner_level, original_on_off_value))
-								set_noteslines(cLINES);
-							break;
-
-						/* show all arts or just new/unread arts */
-						case OPT_SHOW_ONLY_UNREAD_ARTS:
-							if (!bool_equal(tinrc.show_only_unread_arts, original_on_off_value) && group != NULL) {
-								make_threads(group, TRUE);
-								pos_first_unread_thread();
-							}
-							break;
-
-						/* draw -> / highlighted bar */
-						case OPT_DRAW_ARROW:
-							unhighlight_option(option);
-							if (!tinrc.draw_arrow && !tinrc.inverse_okay) {
-								tinrc.inverse_okay = TRUE;
-								RepaintOption(OPT_INVERSE_OKAY);
-							}
-							break;
-
-						/* draw inversed screen header lines */
-						/* draw inversed group/article/option line if draw_arrow is OFF */
-						case OPT_INVERSE_OKAY:
-							unhighlight_option(option);
-							if (!tinrc.draw_arrow && !tinrc.inverse_okay) {
-								tinrc.draw_arrow = TRUE;	/* we don't want to navigate blindly */
-								RepaintOption(OPT_DRAW_ARROW);
-							}
-							break;
-
-						case OPT_MAIL_8BIT_HEADER:
-							if (strcasecmp(txt_mime_encodings[tinrc.mail_mime_encoding], txt_8bit)) {
-								tinrc.mail_8bit_header = FALSE;
-								print_option(OPT_MAIL_8BIT_HEADER);
-							}
-							break;
-
-						case OPT_POST_8BIT_HEADER:
-							/* if post_mime_encoding != 8bit, post_8bit_header is disabled */
-							if (strcasecmp(txt_mime_encodings[tinrc.post_mime_encoding], txt_8bit)) {
-								tinrc.post_8bit_header = FALSE;
-								print_option(OPT_POST_8BIT_HEADER);
-							}
-							break;
-
-						/* show newsgroup description text next to newsgroups */
-						case OPT_SHOW_DESCRIPTION:
-							show_description = tinrc.show_description;
-							if (show_description)			/* force reread of newgroups file */
-								read_descriptions(FALSE);
-							else
-								set_groupname_len(FALSE);
-							break;
-
-#ifdef HAVE_COLOR
-						/* use ANSI color */
-						case OPT_USE_COLOR:
-#	ifdef USE_CURSES
-							if (!has_colors())
-								use_color = FALSE;
-							else
-#	endif /* USE_CURSES */
-								use_color = tinrc.use_color;
-							break;
-#endif /* HAVE_COLOR */
-
-#ifdef XFACE_ABLE
-						/* use slrnface */
-						case OPT_USE_SLRNFACE:
-							if (!bool_equal(tinrc.use_slrnface, original_on_off_value)) {
-								if (!tinrc.use_slrnface)
-									slrnface_stop();
-								else
-									slrnface_start();
-							}
-							break;
-#endif /* XFACE_ABLE */
-
-						/*
-						 * the following are boolean and do not need further action (if I'm right)
-						 *
-						 * case OPT_AUTO_BCC:
-						 * case OPT_AUTO_CC:
-						 * case OPT_AUTO_LIST_THREAD:
-						 * case OPT_AUTO_RECONNECT:
-						 * case OPT_AUTO_SAVE:
-						 * case OPT_BATCH_SAVE:
-						 * case OPT_CATCHUP_READ_GROUPS:
-						 * case OPT_FORCE_SCREEN_REDRAW:
-						 * case OPT_FULL_PAGE_SCROLL:
-						 * case OPT_GROUP_CATCHUP_ON_EXIT:
-						 * case OPT_KEEP_DEAD_ARTICLES:
-						 * case OPT_MARK_SAVED_READ:
-						 * case OPT_NO_ADVERTISING:
-						 * case OPT_POS_FIRST_UNREAD:
-						 * case OPT_POSTED_ARTICLES:
-						 * case OPT_PRINT_HEADER:
-						 * case OPT_PROCESS_ONLY_UNREAD:
-						 * case OPT_SHOW_ONLY_UNREAD_GROUPS:
-						 * case OPT_SHOW_XCOMMENTTO:
-						 * case OPT_SIGDASHES:
-						 * case OPT_SPACE_GOTO_NEXT_UNREAD:
-						 * case OPT_START_EDITOR_OFFSET:
-						 * case OPT_STRIP_BLANKS:
-						 * case OPT_TAB_GOTO_NEXT_UNREAD:
-						 * case OPT_TEX2ISO_CONV:
-						 * case OPT_THREAD_CATCHUP_ON_EXIT:
-						 * case OPT_UNLINK_ARTICLE:
-						 * case OPT_USE_MAILREADER_I:
-						 * case OPT_USE_MOUSE:
-						 * case OPT_WORD_HIGHLIGHT_TINRC:
-						 * case OPT_WRAP_ON_NEXT_UNREAD:
-#ifdef HAVE_KEYPAD
-						 * case OPT_USE_KEYPAD:
-#endif
-						 * case OPT_ASK_FOR_METAMAIL:
-#if defined(HAVE_ICONV_OPEN_TRANSLIT) && defined(CHARSET_CONVERSION)
-						 * case OPT_TRANSLIT:
-#endif
-						 */
-
-						default:
-							break;
-					} /* switch (option) */
-					break;
-
-				case OPT_LIST:
-					original_list_value = *(option_table[option].variable);
-					*(option_table[option].variable) = prompt_list(option_row(option),
-								OPT_ARG_COLUMN,
-								*(option_table[option].variable), /* post_process */
-								option_table[option].txt->help,
-								_(option_table[option].txt->opt),
-								option_table[option].opt_list,
-								option_table[option].opt_count
-								);
-
-					/*
-					 * some options need further action to take effect
-					 */
-					switch (option) {
-						case OPT_THREAD_ARTICLES:
-							/*
-							 * If the threading strategy has changed, fix things
-							 * so that rethreading will occur
-							 */
-							if (tinrc.thread_articles != original_list_value && group != NULL) {
-								int n, old_base_art = base[grpmenu.curr];
-
-								group->attribute->thread_arts = tinrc.thread_articles;
-								make_threads(group, TRUE);
-								/* in non-empty groups update cursor position */
-								if (grpmenu.max > 0) {
-									if ((n = which_thread(old_base_art)) >= 0)
-										grpmenu.curr = n;
-								}
-							}
-							clear_message();
-							break;
-
-						case OPT_SORT_THREADS_TYPE:
-							/*
-							 * If the sorting strategy of threads has changed, fix things
-							 * so that resorting will occur
-							 */
-							if (tinrc.sort_threads_type != original_list_value && group != NULL) {
-								group->attribute->sort_threads_type = tinrc.sort_threads_type;
-								make_threads(group, TRUE);
-							}
-							clear_message();
-							break;
-
-						case OPT_THREAD_SCORE:
-							/*
-							 * If the scoring of a thread has changed,
-							 * resort base[]
-							 */
-							if (tinrc.thread_score != original_list_value && group != NULL)
-								find_base(group);
-							clear_message();
-							break;
-
-						case OPT_POST_PROCESS:
-							glob_attributes.post_proc_type = tinrc.post_process;
-							if (group != NULL)
-								group->attribute->post_proc_type = tinrc.post_process;
-							break;
-
-						case OPT_SHOW_AUTHOR:
-							if (group != NULL)
-								group->attribute->show_author = tinrc.show_author;
-							break;
-
-						case OPT_WILDCARD:
-							wildcard_func = (tinrc.wildcard) ? match_regex : wildmat;
-							break;
-
-						case OPT_MAIL_MIME_ENCODING:
-						case OPT_POST_MIME_ENCODING:
-							mime_encoding = *(option_table[option].variable);
-							/* do not use 8 bit headers if mime encoding is not 8bit */
-							if (strcasecmp(txt_mime_encodings[mime_encoding], txt_8bit)) {
-								if (option == (int) OPT_POST_MIME_ENCODING) {
-									tinrc.post_8bit_header = FALSE;
-									RepaintOption(OPT_POST_8BIT_HEADER);
-								} else {
-									tinrc.mail_8bit_header = FALSE;
-									RepaintOption(OPT_MAIL_8BIT_HEADER);
-								}
-							}
-							break;
-
-#ifdef CHARSET_CONVERSION
-						case OPT_MM_NETWORK_CHARSET:
-							if (tinrc.mm_network_charset != original_list_value) {
-								glob_attributes.mm_network_charset = tinrc.mm_network_charset;
-								if (group)
-									group->attribute->mm_network_charset = tinrc.mm_network_charset;
-#	ifdef NO_LOCALE
-								strcpy(tinrc.mm_local_charset, txt_mime_charsets[tinrc.mm_network_charset]);
-#	endif /* NO_LOCALE */
-							}
-							/*
-							 * check if we have selected a 7bit charset, otherwise
-							 * update encoding
-							 * we always do this (even if we did not change the
-							 * charset) to fixup flaws in the tinrc - once we do
-							 * the same while reading the tinrc this can go into
-							 * the != original_list_value case.
-							 */
-							{
-								int i;
-								t_bool change;
-
-								if (!strcasecmp(txt_mime_encodings[tinrc.post_mime_encoding], txt_7bit)) {
-									change = TRUE;
-									for (i = 0; *txt_mime_7bit_charsets[i]; i++) {
-										if (!strcasecmp(txt_mime_charsets[tinrc.mm_network_charset], txt_mime_7bit_charsets[i])) {
-											change = FALSE;
-											break;
-										}
-									}
-									if (change) {
-										tinrc.post_mime_encoding = MIME_ENCODING_8BIT;
-										RepaintOption(OPT_POST_MIME_ENCODING);
-									}
-								} else { /* and vice versa, if we have a 7bit chaset but a !7bit encoding, fix that */
-									for (i = 0; *txt_mime_7bit_charsets[i]; i++) {
-										if (!strcasecmp(txt_mime_charsets[tinrc.mm_network_charset], txt_mime_7bit_charsets[i])) {
-											tinrc.mail_mime_encoding = tinrc.post_mime_encoding = MIME_ENCODING_7BIT;
-											tinrc.mail_8bit_header = tinrc.post_8bit_header = FALSE;
-											RepaintOption(OPT_POST_MIME_ENCODING);
-											RepaintOption(OPT_MAIL_MIME_ENCODING);
-											RepaintOption(OPT_POST_8BIT_HEADER);
-											break;
-										}
-									}
-								}
-
-								if (!strcasecmp(txt_mime_encodings[tinrc.mail_mime_encoding], txt_7bit)) {
-									change = TRUE;
-									for (i = 0; *txt_mime_7bit_charsets[i]; i++) {
-										if (!strcasecmp(txt_mime_charsets[tinrc.mm_network_charset], txt_mime_7bit_charsets[i])) {
-											change = FALSE;
-											break;
-										}
-									}
-									if (change) {
-										tinrc.mail_mime_encoding = MIME_ENCODING_QP;
-										RepaintOption(OPT_MAIL_MIME_ENCODING);
-									}
-								} else { /* and vice versa, if we have a 7bit chaset but a !7bit encoding, fix that */
-									for (i = 0; *txt_mime_7bit_charsets[i]; i++) {
-										if (!strcasecmp(txt_mime_charsets[tinrc.mm_network_charset], txt_mime_7bit_charsets[i])) {
-											tinrc.mail_mime_encoding = tinrc.post_mime_encoding = MIME_ENCODING_7BIT;
-											tinrc.mail_8bit_header = tinrc.post_8bit_header = FALSE;
-											RepaintOption(OPT_POST_MIME_ENCODING);
-											RepaintOption(OPT_MAIL_MIME_ENCODING);
-											RepaintOption(OPT_POST_8BIT_HEADER);
-											break;
-										}
-									}
-								}
-							}
-							break;
-#endif /* CHARSET_CONVERSION */
-
-						/*
-						 * the following are picklists and don't need any further action
-#ifdef HAVE_COLOR
-						 * case OPT_COL_BACK:
-						 * case OPT_COL_FROM:
-						 * case OPT_COL_HEAD:
-						 * case OPT_COL_HELP:
-						 * case OPT_COL_INVERS:
-						 * case OPT_COL_MESSAGE:
-						 * case OPT_COL_MINIHELP:
-						 * case OPT_COL_NORMAL:
-						 * case OPT_COL_QUOTE:
-						 * case OPT_COL_QUOTE2:
-						 * case OPT_COL_QUOTE3:
-						 * case OPT_COL_RESPONSE:
-						 * case OPT_COL_SIGNATURE:
-						 * case OPT_COL_SUBJECT:
-						 * case OPT_COL_TEXT:
-						 * case OPT_COL_TITLE:
-						 * case OPT_COL_MARKSTAR:
-						 * case OPT_COL_MARKDASH:
-						 * case OPT_COL_MARKSLASH:
-						 * case OPT_COL_MARKSTROKE:
-#endif
-						 * case OPT_HIDE_UUE:
-						 * case OPT_WORD_H_DISPLAY_MARKS:
-						 * case OPT_MONO_MARKSTAR:
-						 * case OPT_MONO_MARKDASH:
-						 * case OPT_MONO_MARKSLASH:
-						 * case OPT_MONO_MARKSTROKE:
-						 * case OPT_CONFIRM_CHOICE:
-						 * case OPT_DEFAULT_SORT_ART_TYPE:
-						 * case OPT_MAILBOX_FORMAT:
-						 * case OPT_SHOW_INFO:
-						 *	break;
-						 */
-
-						default:
-							break;
-					} /* switch (option) */
-					break;
-
-				case OPT_STRING:
-					switch (option) {
-						case OPT_EDITOR_FORMAT:
-						case OPT_INEWS_PROG:
-						case OPT_MAILER_FORMAT:
-						case OPT_MAIL_ADDRESS:
-						case OPT_MAIL_QUOTE_FORMAT:
-						case OPT_METAMAIL_PROG:
-#ifndef CHARSET_CONVERSION
-						case OPT_MM_CHARSET:
-#endif /* !CHARSET_CONVERSION */
-						case OPT_NEWS_QUOTE_FORMAT:
-						case OPT_QUOTE_CHARS:
-						case OPT_SPAMTRAP_WARNING_ADDRESSES:
-						case OPT_URL_HANDLER:
-						case OPT_XPOST_QUOTE_FORMAT:
-							prompt_option_string(option);
-							break;
-
-						case OPT_NEWS_HEADERS_TO_DISPLAY:
-							prompt_option_string(option);
-							if (news_headers_to_display_array)
-								FreeIfNeeded(*news_headers_to_display_array);
-							FreeIfNeeded(news_headers_to_display_array);
-							news_headers_to_display_array = ulBuildArgv(tinrc.news_headers_to_display, &num_headers_to_display);
-							break;
-
-						case OPT_NEWS_HEADERS_TO_NOT_DISPLAY:
-							prompt_option_string(option);
-							if (news_headers_to_not_display_array)
-								FreeIfNeeded(*news_headers_to_not_display_array);
-							FreeIfNeeded(news_headers_to_not_display_array);
-							news_headers_to_not_display_array = ulBuildArgv(tinrc.news_headers_to_not_display, &num_headers_to_not_display);
-							break;
-
-#ifndef DISABLE_PRINTING
-						case OPT_PRINTER:
-#endif /* !DISABLE_PRINTING */
-						case OPT_MAILDIR:
-						case OPT_SAVEDIR:
-						case OPT_SIGFILE:
-						case OPT_POSTED_ARTICLES_FILE:
-#ifdef M_AMIGA
-							if (tin_bbs_mode)
-								break;
-#endif /* M_AMIGA */
-							prompt_option_string(option);
-							expand_rel_abs_pathname(option_row(option),
-								OPT_ARG_COLUMN + OPTION_WIDTH,
-								OPT_STRING_list[option_table[option].var_index]
-								);
-							break;
-
-#ifdef HAVE_COLOR
-						case OPT_QUOTE_REGEX:
-							prompt_option_string(option);
-							FreeIfNeeded(quote_regex.re);
-							FreeIfNeeded(quote_regex.extra);
-							if (!strlen(tinrc.quote_regex))
-								STRCPY(tinrc.quote_regex, DEFAULT_QUOTE_REGEX);
-							compile_regex(tinrc.quote_regex, &quote_regex, PCRE_CASELESS);
-							break;
-
-						case OPT_QUOTE_REGEX2:
-							prompt_option_string(option);
-							FreeIfNeeded(quote_regex2.re);
-							FreeIfNeeded(quote_regex2.extra);
-							if (!strlen(tinrc.quote_regex2))
-								STRCPY(tinrc.quote_regex2, DEFAULT_QUOTE_REGEX2);
-							compile_regex(tinrc.quote_regex2, &quote_regex2, PCRE_CASELESS);
-							break;
-
-						case OPT_QUOTE_REGEX3:
-							prompt_option_string(option);
-							FreeIfNeeded(quote_regex3.re);
-							FreeIfNeeded(quote_regex3.extra);
-							if (!strlen(tinrc.quote_regex3))
-								STRCPY(tinrc.quote_regex3, DEFAULT_QUOTE_REGEX3);
-							compile_regex(tinrc.quote_regex3, &quote_regex3, PCRE_CASELESS);
-							break;
-#endif /* HAVE_COLOR */
-
-						case OPT_SLASHES_REGEX:
-							prompt_option_string(option);
-							FreeIfNeeded(slashes_regex.re);
-							FreeIfNeeded(slashes_regex.extra);
-							if (!strlen(tinrc.slashes_regex))
-								STRCPY(tinrc.slashes_regex, DEFAULT_SLASHES_REGEX);
-							compile_regex(tinrc.slashes_regex, &slashes_regex, PCRE_CASELESS);
-							break;
-
-						case OPT_STARS_REGEX:
-							prompt_option_string(option);
-							FreeIfNeeded(stars_regex.re);
-							FreeIfNeeded(stars_regex.extra);
-							if (!strlen(tinrc.stars_regex))
-								STRCPY(tinrc.stars_regex, DEFAULT_STARS_REGEX);
-							compile_regex(tinrc.stars_regex, &stars_regex, PCRE_CASELESS);
-							break;
-
-						case OPT_STROKES_REGEX:
-							prompt_option_string(option);
-							FreeIfNeeded(strokes_regex.re);
-							FreeIfNeeded(strokes_regex.extra);
-							if (!strlen(tinrc.strokes_regex))
-								STRCPY(tinrc.strokes_regex, DEFAULT_STROKES_REGEX);
-							compile_regex(tinrc.strokes_regex, &strokes_regex, PCRE_CASELESS);
-							break;
-
-						case OPT_UNDERSCORES_REGEX:
-							prompt_option_string(option);
-							FreeIfNeeded(underscores_regex.re);
-							FreeIfNeeded(underscores_regex.extra);
-							if (!strlen(tinrc.underscores_regex))
-								STRCPY(tinrc.underscores_regex, DEFAULT_UNDERSCORES_REGEX);
-							compile_regex(tinrc.underscores_regex, &underscores_regex, PCRE_CASELESS);
-							break;
-
-						case OPT_STRIP_RE_REGEX:
-							prompt_option_string(option);
-							FreeIfNeeded(strip_re_regex.re);
-							FreeIfNeeded(strip_re_regex.extra);
-							if (!strlen(tinrc.strip_re_regex))
-								STRCPY(tinrc.strip_re_regex, DEFAULT_STRIP_RE_REGEX);
-							compile_regex(tinrc.strip_re_regex, &strip_re_regex, PCRE_ANCHORED);
-							break;
-
-						case OPT_STRIP_WAS_REGEX:
-							prompt_option_string(option);
-							FreeIfNeeded(strip_was_regex.re);
-							FreeIfNeeded(strip_was_regex.extra);
-							if (!strlen(tinrc.strip_was_regex))
-								STRCPY(tinrc.strip_was_regex, DEFAULT_STRIP_WAS_REGEX);
-							compile_regex(tinrc.strip_was_regex, &strip_was_regex, 0);
-							break;
-
-						default:
-							break;
-					} /* switch (option) */
-
-					break;
-
-				case OPT_NUM:
-					switch (option) {
-						case OPT_REREAD_ACTIVE_FILE_SECS:
-						case OPT_GETART_LIMIT:
-						case OPT_RECENT_TIME:
-						case OPT_GROUPNAME_MAX_LENGTH:
-						case OPT_SCROLL_LINES:
-						case OPT_FILTER_DAYS:
-							prompt_option_num(option);
-							break;
-
-						case OPT_SCORE_LIMIT_KILL:
-						case OPT_SCORE_KILL:
-						case OPT_SCORE_LIMIT_SELECT:
-						case OPT_SCORE_SELECT:
-							prompt_option_num(option);
-							check_score_defaults();
-							if (group != NULL) {
-								unfilter_articles();
-								read_filter_file(filter_file);
-								if (filter_articles(group))
-									make_threads(group, FALSE);
-							}
-							redraw_screen(option);
-							break;
-
-						case OPT_WRAP_COLUMN:
-							prompt_option_num(option);
-							/* recook if in an article is open */
-							if (pgart.raw)
-								resize_article(TRUE, &pgart);
-							break;
-
-						default:
-							break;
-					} /* switch (option) */
-					break;
-
-				case OPT_CHAR:
-					switch (option) {
-						/*
-						 * TODO: do DASH_TO_SPACE/SPACE_TO_DASH conversion here?
-						 */
-						case OPT_ART_MARKED_DELETED:
-						case OPT_ART_MARKED_INRANGE:
-						case OPT_ART_MARKED_RETURN:
-						case OPT_ART_MARKED_SELECTED:
-						case OPT_ART_MARKED_RECENT:
-						case OPT_ART_MARKED_UNREAD:
-						case OPT_ART_MARKED_READ:
-						case OPT_ART_MARKED_KILLED:
-						case OPT_ART_MARKED_READ_SELECTED:
-							prompt_option_char(option);
-							break;
-
-						default:
-							break;
-					} /* switch (option) */
-					break;
-
-				default:
-					break;
-			} /* switch (option_table[option].var_type) */
-			change_option = FALSE;
-			show_menu_help(txt_select_config_file_option);
-			RepaintOption(option);
-		} /* if (change_option) */
-	} /* forever */
-	/* NOTREACHED */
-	return ret_code;
-}
-
-
-/*
- * expand ~/News to /usr/username/News and print to screen
- */
-static void
-expand_rel_abs_pathname(
-	int line,
-	int col,
-	char *str)
-{
-	char buf[PATH_LEN];
-
-	strfpath(str, buf, sizeof(buf), &CURR_GROUP);
-	sprintf(str, "%-.*s", cCOLS - col - 1, buf);
-	MoveCursor(line, col);
-	CleartoEOLN();
-	my_fputs(str, stdout);
-	my_flush();
-}
-
-
-/*
- * show_menu_help
- */
-void
-show_menu_help(
-	const char *help_message)
-{
-	MoveCursor(cLINES - 2, 0);
-	CleartoEOLN();
-	center_line(cLINES - 2, FALSE, _(help_message));
-}
-
-
 t_bool
 match_boolean(
 	char *line,
@@ -2522,10 +1521,11 @@ match_string(
 	size_t patlen = strlen(pat);
 
 	if (STRNCMPEQ(line, pat, patlen) && (strlen(line) > patlen /* + 1 */)) {
-		strncpy(dst, &line[patlen], dstlen);
-		if ((ptr = strrchr(dst, '\n')) != NULL)
-			*ptr = '\0';
-
+		if (dst != NULL && dstlen >= 1) {
+			strncpy(dst, &line[patlen], dstlen);
+			if ((ptr = strrchr(dst, '\n')) != NULL)
+				*ptr = '\0';
+		}
 		return TRUE;
 	}
 	return FALSE;
@@ -2608,33 +1608,6 @@ quote_space_to_dash(
 
 
 /*
- * display current configuration page
- */
-static void
-show_config_page(
-	void)
-{
-	int i, lines_to_print = option_lines_per_page;
-
-	center_line(0, TRUE, _(txt_options_menu));
-
-	/*
-	 * on last page, there need not be option_lines_per_page options
-	 */
-	if (first_option_on_screen + option_lines_per_page > LAST_OPT)
-		lines_to_print = LAST_OPT + 1 - first_option_on_screen;
-
-	for (i = 0; i < lines_to_print; i++)
-		print_any_option(first_option_on_screen + i);
-	CleartoEOS();
-
-	show_menu_help(txt_select_config_file_option);
-	my_flush();
-	stow_cursor();
-}
-
-
-/*
  * Written by: Brad Viviano and Scott Powers (bcv & swp)
  *
  * Takes a 1d string and turns it into a 2d array of strings.
@@ -2651,7 +1624,7 @@ ulBuildArgv(
 	char *buf, *tmp;
 	int i = 0;
 
-	if (!cmd && !*cmd) {
+	if (!cmd || !*cmd) {
 		*new_argc = 0;
 		return NULL;
 	}
@@ -2696,21 +1669,6 @@ ulBuildArgv(
 
 
 /*
- * Check if score_kill is <= score_limit_kill and if score_select >= score_limit_select
- */
-static void
-check_score_defaults(
-	void)
-{
-	if (tinrc.score_kill > tinrc.score_limit_kill)
-		tinrc.score_kill = tinrc.score_limit_kill;
-
-	if (tinrc.score_select < tinrc.score_limit_select)
-		tinrc.score_select = tinrc.score_limit_select;
-}
-
-
-/*
  * auto update tinrc
  */
 static t_bool
@@ -2731,8 +1689,10 @@ rc_update(
 	t_bool show_lines = FALSE;
 	t_bool show_score = FALSE;
 	t_bool thread_articles = FALSE;
+	t_bool thread_perc = FALSE;
 	t_bool use_builtin_inews = FALSE;
 	t_bool use_getart_limit = FALSE;
+	t_bool use_mailreader_i = FALSE;
 	t_bool use_metamail = FALSE;
 
 	if (!fp)
@@ -2797,6 +1757,8 @@ rc_update(
 					break;
 				if (match_boolean(buf, "use_getart_limit=", &use_getart_limit))
 					break;
+				if (match_boolean(buf, "use_mailreader_i=", &use_mailreader_i))
+					break;
 				if (match_boolean(buf, "use_metamail=", &use_metamail))
 					break;
 				break;
@@ -2807,7 +1769,7 @@ rc_update(
 	}
 
 	/* update the values */
-	tinrc.confirm_choice = (confirm_action ? 1 : 0 ) + (confirm_to_quit ? 3 : 0);
+	tinrc.confirm_choice = (confirm_action ? 1 : 0) + (confirm_to_quit ? 3 : 0);
 
 	if (!use_getart_limit)
 		tinrc.getart_limit = 0;
@@ -2830,9 +1792,15 @@ rc_update(
 	if (thread_articles)
 		tinrc.thread_articles = THREAD_BOTH;
 
+	if (thread_perc)
+		tinrc.thread_perc = THREAD_PERC_DEFAULT;
+
 	if (use_builtin_inews)
 		strncpy(tinrc.inews_prog, INTERNAL_CMD, sizeof(tinrc.inews_prog) - 1);
 
+	if (use_mailreader_i)
+		tinrc.interactive_mailer = INTERACTIVE_WITHOUT_HEADERS;
+
 	env = getenv("NOMETAMAIL");
 	if (!use_metamail || (NULL == env))
 		strncpy(tinrc.metamail_prog, INTERNAL_CMD, sizeof(tinrc.metamail_prog) - 1);
@@ -2853,7 +1821,6 @@ read_server_config(
 	char file[PATH_LEN];
 	char newnews_info[LEN];
 	char serverdir[PATH_LEN];
-	char version[LEN];
 	int upgrade = RC_CHECK;
 
 #ifdef NNTP_ABLE
@@ -2862,11 +1829,11 @@ read_server_config(
 	else
 #endif /* NNTP_ABLE */
 	{
-		STRCPY(file, nntp_server);
+		STRCPY(file, quote_space_to_dash(nntp_server));
 	}
 	JOINPATH(serverdir, rcdir, file);
 	joinpath(file, serverdir, SERVERCONFIG_FILE);
-
+	joinpath(local_newsgroups_file, serverdir, NEWSGROUPS_FILE);
 	if ((fp = fopen(file, "r")) == NULL)
 		return;
 	while (NULL != (line = tin_fgets(fp, FALSE))) {
@@ -2874,7 +1841,7 @@ read_server_config(
 			continue;
 
 		if (match_string(line, "last_newnews=", newnews_info, sizeof(newnews_info))) {
-			int tmp_len = strlen(nntp_server) + strlen(newnews_info) + 2;
+			size_t tmp_len = strlen(nntp_server) + strlen(newnews_info) + 2;
 			char *tmp_info = my_malloc(tmp_len);
 
 			snprintf(tmp_info, tmp_len, "%s %s", nntp_server, newnews_info);
@@ -2882,7 +1849,7 @@ read_server_config(
 			free(tmp_info);
 			continue;
 		}
-		if (match_string(line, "version=", version, sizeof(version))) {
+		if (match_string(line, "version=", NULL, 0)) {
 			if (RC_CHECK != upgrade)
 				/* ignore duplicate version lines; last match counts */
 				continue;
diff -Nurp tin-1.6.2/src/cook.c tin-1.8.0/src/cook.c
--- tin-1.6.2/src/cook.c	2003-08-26 14:34:07.000000000 +0200
+++ tin-1.8.0/src/cook.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : cook.c
  *  Author    : J. Faultless
  *  Created   : 2000-03-08
- *  Updated   : 2003-08-26
+ *  Updated   : 2005-07-20
  *  Notes     : Split from page.c
  *
- * Copyright (c) 2000-2003 Jason Faultless <jason@altarstone.com>
+ * Copyright (c) 2000-2006 Jason Faultless <jason@altarstone.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,9 +40,7 @@
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
-#ifndef RFC2046_H
-#	include "rfc2046.h"
-#endif /* !RFC2046_H */
+
 
 /*
  * We malloc() this many t_lineinfo's at a time
@@ -57,14 +55,10 @@
 #define MATCH_REGEX(x,y,z)	(pcre_exec(x.re, x.extra, y, z, 0, 0, NULL, 0) >= 0)
 
 
-static int put_rest(char **rest, char **line, int *max_line_len, const int offset);
-static int read_decoded_base64_line(FILE *file, char **line, int *max_line_len, const int max_lines_to_read, char **rest);
-static int read_decoded_qp_line(FILE *file, char **line, int *max_line_len, const int max_lines_to_read);
 static t_bool header_wanted(const char *line);
 static t_part *new_uue(t_part **part, char *name);
 static void process_text_body_part(t_bool wrap_lines, FILE *in, t_part *part, int hide_uue, int tabs);
 static void put_cooked(size_t buf_len, t_bool wrap_lines, int flags, const char *fmt, ...);
-static void set_rest(char **rest, const char *ptr);
 #ifdef DEBUG_ART
 	static void dump_cooked(void);
 #endif /* DEBUG_ART */
@@ -160,13 +154,13 @@ put_cooked(
 	char *p, *bufp, *buf;
 	int wrap_column;
 	int space;
-	static int overflow = 0;
+/*	static int overflow = 0; */ /* TODO: we don't use it (anymore?) */
 	static int saved_flags = 0;
+	va_list ap;
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 	int bytes;
 	wint_t *wp;
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-	va_list ap;
 
 	buf = my_malloc(buf_len + 1);
 
@@ -176,7 +170,11 @@ put_cooked(
 	if (tinrc.wrap_column < 0)
 		wrap_column = ((tinrc.wrap_column > -cCOLS) ? cCOLS + tinrc.wrap_column : cCOLS);
 	else
+#if 1
 		wrap_column = ((tinrc.wrap_column > 0) ? tinrc.wrap_column : cCOLS);
+#else	/* never cut off long lines */
+		wrap_column = (((tinrc.wrap_column > 0) && (tinrc.wrap_column < cCOLS)) ? tinrc.wrap_column : cCOLS);
+#endif /* 1 */
 
 	p = bufp = buf;
 
@@ -209,7 +207,7 @@ put_cooked(
 		if (*p == '\n')
 			p++;
 		bufp = p;
-		overflow = 0;
+/*		overflow = 0; */
 
 		if (art->cooked_lines == 0) {
 			art->cookl = my_malloc(sizeof(t_lineinfo) * CHUNK);
@@ -246,7 +244,7 @@ put_cooked(
 	if (*bufp != '\0') {
 		fputs(bufp, art->cooked);
 		saved_flags = flags;
-		overflow += strlen(bufp);
+/*		overflow += strlen(bufp); */
 	}
 
 	va_end(ap);
@@ -255,312 +253,6 @@ put_cooked(
 
 
 /*
- * FIXME: should go into rfc1521.c
- *
- * Set everything in ptr as the rest of a physical line to be processed
- * later.
- */
-static void
-set_rest(
-	char **rest,
-	const char *ptr)
-{
-	char *old_rest = *rest;
-
-	if (ptr == NULL || strlen(ptr) == 0) {
-		FreeAndNull(*rest);
-		return;
-	}
-	*rest = my_strdup(ptr);
-	FreeIfNeeded(old_rest);
-}
-
-
-/*
- * FIXME: should go into rfc1521.c
- *
- * Copy things that were left over from the last decoding into the new line.
- * If there's a newline in the rest, copy everything up to and including that
- * newline into the expected buffer, adjust rest and return. If there's no
- * newline in the rest, copy all of it to the expected buffer and return.
- *
- * Side effects: resizes line if necessary, adjusts max_line_len
- * accordingly.
- *
- * This function returns the number of character written to the line buffer.
- * The buffer is LF + NULL terminated if a complete line was written. The
- * buffer is NOT neccessarily NULL terminated if there was no newline in the
- * rest. Use the return value to find out how long the string is.
- */
-static int
-put_rest(
-	char **rest,
-	char **line,
-	int *max_line_len,
-	const int offset)
-{
-	char *my_rest = *rest;
-	char *ptr;
-	char c;
-	int put_chars = offset;
-
-	if ((ptr = my_rest) == NULL)
-		return 0;
-	if (strlen(my_rest) == 0) {
-		FreeAndNull(*rest);
-		return 0;
-	}
-
-	while ((c = *ptr++) && (c != '\n')) {
-		if ((c == '\r') && (*ptr == '\n'))
-			continue;	/* step over CRLF */
-		/*
-		 * Resize line if necessary. Keep in mind that we add LF and \0 later.
-		 */
-		if (put_chars >= *max_line_len - 2) {
-			if (*max_line_len == 0)
-				*max_line_len = LEN;
-			else
-				*max_line_len <<= 1;
-			*line = my_realloc(*line, *max_line_len);
-		}
-		(*line)[put_chars++] = c;
-	}
-	if (c == '\n') {
-		/*
-		 * FIXME: Adding a newline may be not correct. At least it may
-		 * be not what the author of that article intended.
-		 * Unfortunately, a newline is expected at the end of a line by
-		 * some other code in cook.c and even those functions invoking
-		 * this one rely on it.
-		 */
-		(*line)[put_chars++] = '\n';
-		(*line)[put_chars] = '\0';	/* don't count the termining NULL! */
-		set_rest(rest, ptr);
-	} else
-		/* rest is now empty */
-		FreeAndNull(*rest);
-
-	return put_chars;
-}
-
-
-/*
- * FIXME: should go into rfc1521.c
- *
- * Read a logical base64 encoded line into the specified line buffer.
- * Logical lines can be split over several physical base64 encoded lines and
- * a single physical base64 encoded line can contain serveral logical lines.
- * This function keeps track of all these cases and always copies only one
- * decoded line to the line buffer.
- *
- * Side effects: resizes line if necessary, adjusts max_line_len
- * accordingly.
- *
- * This function returns the number of physical lines read or a negative
- * value on error.
- */
-static int
-read_decoded_base64_line(
-	FILE *file,
-	char **line,
-	int *max_line_len,
-	const int max_lines_to_read,
-	char **rest)
-{
-	char *buf2;	/* holds the entire decoded line */
-	char *buf;	/* holds the entire encoded line*/
-	int count = 0;
-	int lines_read = 0;
-	int put_chars = 0;
-
-	/*
-	 * First of all, catch everything that is left over from the last decoding.
-	 * If there's a newline in that rest, copy everything up to and including
-	 * that newline in the expected buffer, adjust rest and return. If there's
-	 * no newline in the rest, copy all of it (modulo length of the buffer) to
-	 * the expected buffer and continue as if there was no rest.
-	 */
-	put_chars = put_rest(rest, line, max_line_len, 0);
-	if (put_chars && ((*line)[put_chars - 1] == '\n'))
-		return 0;	/* we didn't read any new lines but filled the line */
-
-	/*
-	 * At this point, either there was no rest or there was no newline in the
-	 * rest. In any case, we need to read further encoded lines and decode
-	 * them until we find a newline or there are no more (encoded or physical)
-	 * lines in this part of the posting. To be sure, now allocate memory for
-	 * the output if it wasn't already done.
-	 */
-	if (*max_line_len == 0) {
-		*max_line_len = LEN;
-		*line = my_malloc(*max_line_len);
-	}
-
-	/*
-	 * max_lines_to_read==0 occurs at end of an encoded part and if there was
-	 * no trailing newline in the encoded text. So we put one there and exit.
-	 * FIXME: Adding a newline may be not correct. At least it may be not
-	 * what the author of that article intended. Unfortunately, a newline is
-	 * expected at the end of a line by some other code in cook.c.
-	 */
-	if (max_lines_to_read <= 0) {
-		if (put_chars) {
-			(*line)[put_chars++] = '\n';
-			(*line)[put_chars] = '\0';
-		}
-		return max_lines_to_read;
-	}
-	/*
-	 * Ok, now read a new line from the original article.
-	 */
-	do {
-		if ((buf = tin_fgets(file, FALSE)) == NULL) {
-			/*
-			 * Premature end of file (or file error), leave loop. To prevent
-			 * re-invoking of this function, set the numbers of read lines to
-			 * the expected maximum that should be read at most.
-			 *
-			 * FIXME: Adding a newline may be not correct. At least it may be
-			 * not what the author of that article intended. Unfortunately, a
-			 * newline is expected at the end of a line by some other code in
-			 * cook.c.
-			 */
-			if (put_chars > *max_line_len - 2) {
-				*max_line_len <<= 1;
-				*line = my_realloc(*line, *max_line_len);
-			}
-			(*line)[put_chars++] = '\n';
-			(*line)[put_chars] = '\0';
-			return max_lines_to_read;
-		}
-		lines_read++;
-		buf2 = my_malloc(strlen(buf) + 1); /* decoded string is always shorter than encoded string, so this is safe */
-		count = mmdecode(buf, 'b', '\0', buf2);
-		buf2[count] = '\0';
-		FreeIfNeeded(*rest);
-		*rest = buf2;
-		put_chars = put_rest(rest, line, max_line_len, put_chars);
-		if (put_chars && ((*line)[put_chars - 1] == '\n')) /* end of logical line reached */
-			return lines_read;
-	} while (lines_read < max_lines_to_read);
-	return lines_read;
-}
-
-
-/*
- * FIXME: should go into rfc1521.c
- *
- * Read a logical quoted-printable encoded line into the specified line
- * buffer. Quoted-printable lines can be split over several physical lines,
- * so this function collects all affected lines, concatenates and decodes
- * them.
- *
- * Side effects: resizes line if necessary, adjusts max_line_len
- * accordingly.
- *
- * This function returns the number of physical lines read or a negative
- * value on error.
- */
-static int
-read_decoded_qp_line(
-	FILE *file,
-	char **line,					/* where to copy the decoded line */
-	int *max_line_len,				/* (maximum) line length */
-	const int max_lines_to_read)	/* don't read more physical lines than told here */
-{
-	char *buf, *buf2;
-	char *ptr;
-	char c;
-	int buflen = LEN;
-	size_t chars_to_add = 0;
-	int count = 0;
-	int lines_read = 0;
-
-	buf = my_malloc(buflen); /* initial internal line buffer */
-	*buf = '\0';
-	do {
-		if ((buf2 = tin_fgets(file, FALSE)) == NULL) {
-			/*
-			 * Premature end of file (or file error, leave loop. To prevent
-			 * re-invokation of this function, set the numbers of read lines
-			 * to the expected maximum that should be read at most.
-			 */
-			lines_read = max_lines_to_read;
-			break;
-		}
-		lines_read++;
-		if ((chars_to_add = strlen(buf2)) == 0) /* Empty line, leave loop. */
-			break;
-
-		/*
-		 * Strip trailing white space at the end of the line.
-		 * See RFC 2045, section 6.7, #3
-		 */
-		c = buf2[chars_to_add - 1];
-		while ((chars_to_add > 0) && ((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r'))) {
-			--chars_to_add;
-			c = (chars_to_add > 0 ? buf2[chars_to_add - 1] : '\0');
-		}
-
-		/*
-		 * '=' at the end of a line indicates a soft break meaning
-		 * that the following physical line "belongs" to this one.
-		 * (See RFC 2045, section 6.7, #5)
-		 *
-		 * Skip that equal sign now; since c holds this char, the
-		 * loop is not left but the next line is read and concatenated
-		 * with this one while the '=' is overwritten.
-		 */
-		if (c == '=') /* c is 0 when chars_to_add is 0 so this is safe */
-			buf2[--chars_to_add] = '\0';
-
-		/*
-		 * Join physical lines to a logical one; keep in mind that a LF is
-		 * added afterwards.
-		 */
-		if (chars_to_add > buflen - strlen(buf) - 2) {
-			buflen <<= 1;
-			buf = my_realloc(buf, buflen);
-		}
-		strncat(buf, buf2, buflen);
-	} while ((c == '=') && (lines_read < max_lines_to_read));
-	/*
-	 * re-add newline and NULL termination at end of line
-	 * FIXME: Adding a newline may be not correct. At least it may be not
-	 * what the author of that article intended. Unfortunately, a newline is
-	 * expected at the end of a line by some other code in cook.c.
-	 */
-	strcat(buf, "\n");
-
-	/*
-	 * Now decode complete (logical) line from buf to buf2 and copy it to the
-	 * buffer where the invoking function expects it. Don't decode directly
-	 * to the buffer of the other function to prevent buffer overruns and to
-	 * decide if the encoding was ok.
-	 */
-	buf2 = my_malloc(strlen(buf) + 1); /* Don't use realloc here, tin_fgets relies on its internal state! */
-	count = mmdecode(buf, 'q', '\0', buf2);
-
-	if (count >= 0) {
-		buf2[count] = '\0';
-		ptr = buf2;
-	} else	/* error in encoding: copy raw line */
-		ptr = buf;
-
-	if (*max_line_len < (int) strlen(ptr) + 1) {
-		*max_line_len = strlen(ptr) + 1;
-		*line = my_realloc(*line, *max_line_len);
-	}
-	strncpy(*line, ptr, *max_line_len);
-	(*line)[*max_line_len - 1] = '\0'; /* be sure to terminate string */
-	free(buf);
-	free(buf2);
-	return lines_read;
-}
-
-
-/*
  * Add a new uuencode attachment description to the current part
  */
 static t_part *
@@ -719,7 +411,12 @@ process_text_body_part(
 			break;	/* premature end of file, file error etc. */
 
 		/* convert network to local charset, tex2iso, iso2asc etc. */
-		process_charsets(&line, &max_line_len, get_param(part->params, "charset"), tinrc.mm_local_charset, CURR_GROUP.attribute->tex2iso_conv && art->tex2iso);
+		process_charsets(&line, &max_line_len, get_param(part->params, "charset"), tinrc.mm_local_charset, curr_group->attribute->tex2iso_conv && art->tex2iso);
+
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		if (IS_LOCAL_CHARSET("UTF-8"))
+			utf8_valid(line);
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 		len = (int) strlen(line);
 
@@ -743,6 +440,9 @@ process_text_body_part(
 		/*
 		 * Detect and process uuencoded sections
 		 * Look for the start or the end of a uuencoded section
+		 *
+		 * TODO: look for a tailing size line after end (non standard
+		 *       extension)?
 		 */
 		if (pcre_exec(uubegin_regex.re, uubegin_regex.extra, line, len, 0, 0, offsets, size_offsets) != PCRE_ERROR_NOMATCH) {
 			in_uue = TRUE;
@@ -809,7 +509,7 @@ process_text_body_part(
 		 * Skip output if we're hiding uue or the sig
 		 */
 		if (in_uue && hide_uue)
-			continue;						/* No further processing needed */
+			continue;	/* No further processing needed */
 
 		flags = in_sig ? C_SIG : C_BODY;
 
@@ -908,8 +608,8 @@ static void
 dump_cooked(
 	void)
 {
-	int i;
 	char *line;
+	int i;
 
 	for (i = 0; i < art->cooked_lines; i++) {
 		fseek(art->cooked, art->cookl[i].offset, SEEK_SET);
@@ -982,11 +682,13 @@ cook_article(
 		}
 
 		if (header_wanted(line)) {	/* Put cooked data */
+			int i = LEN;
+			char *l = my_strdup(convert_body2printable(rfc1522_decode(line)));	/* FIXME: don't decode addr-part of From:/Cc:/ etc.pp. */
+
 			header_put = TRUE;
-			/*
-			 * FIXME: don't decode addr-part of From:/Cc:/ etc.pp.
-			 */
-			put_cooked(LEN, wrap_lines, C_HEADER, "%s\n", rfc1522_decode(line));
+			expand_ctrl_chars(&l, &i, tabs);
+			put_cooked(LEN, wrap_lines, C_HEADER, "%s", l);
+			free(l);
 		}
 	}
 
diff -Nurp tin-1.6.2/src/curses.c tin-1.8.0/src/curses.c
--- tin-1.6.2/src/curses.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/curses.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,7 +3,7 @@
  *  Module    : curses.c
  *  Author    : D. Taylor & I. Lea
  *  Created   : 1986-01-01
- *  Updated   : 2003-08-03
+ *  Updated   : 2005-04-18
  *  Notes     : This is a screen management library borrowed with permission
  *              from the Elm mail system. This library was hacked to provide
  *              what tin needs.
@@ -38,10 +38,6 @@ t_bool have_linescroll = TRUE;	/* USE_CU
 
 #else	/* !USE_CURSES */
 
-#ifdef M_AMIGA
-#	undef BSD
-#endif /* M_AMIGA */
-
 #ifndef ns32000
 #	undef	sinix
 #endif /* !ns32000 */
@@ -61,7 +57,7 @@ t_bool have_linescroll = TRUE;	/* USE_CU
 #define DEFAULT_COLUMNS_ON_TERMINAL	80
 
 int cLINES = DEFAULT_LINES_ON_TERMINAL - 1;
-int cCOLS  = DEFAULT_COLUMNS_ON_TERMINAL;
+int cCOLS = DEFAULT_COLUMNS_ON_TERMINAL;
 int _hp_glitch = FALSE;		/* stdout not erased by overwriting on HP terms */
 static int _inraw = FALSE;	/* are we IN rawmode? */
 static int xclicks = FALSE;	/* do we have an xterm? */
@@ -106,7 +102,7 @@ static TTY _raw_tty, _original_tty;
 
 #else	/* FIXME: prune the non-autoconf'd stuff */
 
-#	if (defined(M_AMIGA) && !defined(__SASC)) || defined(COHERENT) || defined(BSD)
+#	if defined(COHERENT) || defined(BSD)
 #		ifdef BSD4_1
 #			include <termio.h>
 #			define USE_TERMIO 1
@@ -115,7 +111,7 @@ static TTY _raw_tty, _original_tty;
 #			define USE_SGTTY 1
 #		endif /* BSD4_1 */
 #	else
-#		if !defined(SYSV) && !defined(M_AMIGA)
+#		if !defined(SYSV)
 #			ifdef MINIX
 #				include <sgtty.h>
 #				define USE_SGTTY 1
@@ -134,24 +130,22 @@ static TTY _raw_tty, _original_tty;
 #					endif /* sinix */
 #				endif /* !QNX42 */
 #			endif /* MINIX */
-#		endif /* !SYSV && !M_AMIGA */
-#	endif /* (M_AMIGA && !__SASC) || COHERENT || BSD */
+#		endif /* !SYSV */
+#	endif /* COHERENT || BSD */
 
 #	ifndef VMS
-#		if (defined(M_AMIGA) && !defined(__SASC)) || defined(BSD) || defined(MINIX)
+#		if defined(BSD) || defined(MINIX)
 #			define USE_SGTTY 1
 struct sgttyb _raw_tty, _original_tty;
 #		else
-#			if !defined(M_AMIGA)
-#				if defined(HAVE_TERMIOS_H) || defined(sinix)
-#					define USE_POSIX_TERMIOS 1
+#			if defined(HAVE_TERMIOS_H) || defined(sinix)
+#				define USE_POSIX_TERMIOS 1
 struct termios _raw_tty, _original_tty;
-#				else
-#					define USE_TERMIO 1
+#			else
+#				define USE_TERMIO 1
 struct termio _raw_tty, _original_tty;
-#				endif /* HAVE_TERMIOS_H || sinix */
-#			endif /* !M_AMIGA */
-#		endif /* (M_AMIGA && !__SASC) || BSD || MINIX */
+#			endif /* HAVE_TERMIOS_H || sinix */
+#		endif /* BSD || MINIX */
 #	endif /* !VMS */
 #endif /* HAVE_CONFIG_H */
 
@@ -159,12 +153,11 @@ struct termio _raw_tty, _original_tty;
 #	define USE_SGTTY 0
 #endif /* !USE_SGTTY */
 
-#ifndef USE_TERMIO
-#	define USE_TERMIO 0
-#endif /* !USE_TERMIO */
-
 #ifndef USE_POSIX_TERMIOS
 #	define USE_POSIX_TERMIOS 0
+#	ifndef USE_TERMIO
+#		define USE_TERMIO 0
+#	endif /* !USE_TERMIO */
 #endif /* !USE_POSIX_TERMIOS */
 
 static char *_clearscreen, *_moveto, *_cleartoeoln, *_cleartoeos,
@@ -174,10 +167,6 @@ static char *_clearscreen, *_moveto, *_c
 			*_scrollregion, *_scrollfwd, *_scrollback,
 			*_reset, *_reversevideo, *_blink, *_dim, *_bold;
 
-#ifdef M_AMIGA
-static char *_getwinsize;
-#endif /* M_AMIGA */
-
 static int _columns, _line, _lines;
 
 #ifdef M_UNIX
@@ -213,9 +202,6 @@ static int _columns, _line, _lines;
 static int input_pending(int delay);
 static void ScreenSize(int *num_lines, int *num_columns);
 static void xclick(int state);
-#if !defined(VMS) && defined(M_AMIGA)
-	static int AmiReadCh(int getscrsize);
-#endif /* !VMS && M_AMIGA */
 
 
 /*
@@ -349,9 +335,9 @@ get_termcaps(
 	for (n = 0; n < ARRAY_SIZE(table); n++) {
 		*(table[n].value) = TGETSTR(table[n].capname, &ptr);
 	}
-	_lines          = TGETNUM(dCAPNAME("li", "lines"));
-	_columns        = TGETNUM(dCAPNAME("co", "cols"));
-	_hp_glitch      = TGETFLAG(dCAPNAME("xs", "xhp"));
+	_lines = TGETNUM(dCAPNAME("li", "lines"));
+	_columns = TGETNUM(dCAPNAME("co", "cols"));
+	_hp_glitch = TGETFLAG(dCAPNAME("xs", "xhp"));
 
 #	if defined(USE_TERMCAP) && defined(HAVE_EXTERN_TCAP_PC)
 	t = TGETSTR(CAPNAME("pc", "pad"), &p);
@@ -361,10 +347,10 @@ get_termcaps(
 
 	if (STRCMPEQ(the_termname, "xterm")) {
 		static char x_init[] = "\033[?9h";
-		static char x_end[]  = "\033[?9l";
+		static char x_end[] = "\033[?9l";
 		xclicks = TRUE;
-		_xclickinit	= x_init;
-		_xclickend	= x_end;
+		_xclickinit = x_init;
+		_xclickend = x_end;
 	}
 
 	if (NO_CAP(_clearscreen)) {
@@ -432,64 +418,38 @@ InitScreen(
 	 * we're going to assume a terminal here...
 	 */
 
-	_clearscreen	= "\033[1;1H\033[J";
-	_moveto		= "\033[%d;%dH";	/* not a termcap string! */
-	_cleartoeoln	= "\033[K";
-	_setinverse	= "\033[7m";
-	_clearinverse	= "\033[0m";
-	_setunderline	= "\033[4m";
-	_clearunderline	= "\033[0m";
-	_keypadlocal	= "";
-	_keypadxmit	= "";
-#	ifdef M_AMIGA
-	_terminalinit	= "\033[12{\033[0 p";
-	_terminalend	= "\033[12}\033[ p";
-	_cursoron	= "\033[ p";
-	_cursoroff	= "\033[0 p";
-	_cleartoeos	= "\033[J";
-	_getwinsize	= "\2330 q";
-#	endif /* M_AMIGA */
+	_clearscreen = "\033[1;1H\033[J";
+	_moveto = "\033[%d;%dH";	/* not a termcap string! */
+	_cleartoeoln = "\033[K";
+	_setinverse = "\033[7m";
+	_clearinverse = "\033[0m";
+	_setunderline = "\033[4m";
+	_clearunderline = "\033[0m";
+	_keypadlocal = "";
+	_keypadxmit = "";
 #	ifdef VMS
-	_cleartoeos	= "\033[J";
-	_terminalinit	= NULL;
-	_terminalend	= "";
+	_cleartoeos = "\033[J";
+	_terminalinit = NULL;
+	_terminalend = "";
 #	endif /* VMS */
 	/* needed for word highlighting */
-	_reset		= "\033[0m";
-	_reversevideo	= "\033[7m";
-	_blink		= "\033[5m";
-	_dim		= "\033[2m";
-	_bold		= "\033[1m";
+	_reset = "\033[0m";
+	_reversevideo = "\033[7m";
+	_blink = "\033[5m";
+	_dim = "\033[2m";
+	_bold = "\033[1m";
 
 	_lines = _columns = -1;
 
-	/*
-	 * Get lines and columns from environment settings - useful when
-	 * you're using something other than an Amiga window
-	 */
-
-	if ((ptr = getenv("LINES")) != 0) {
+	if ((ptr = getenv("LINES")) != 0)
 		_lines = atol(ptr);
-	}
-	if ((ptr = getenv("COLUMNS")) != 0) {
+
+	if ((ptr = getenv("COLUMNS")) != 0)
 		_columns = atol(ptr);
-	}
 
 	/*
 	 * If that failed, try get a response from the console itself
 	 */
-#	ifdef M_AMIGA
-	if (_lines == -1 || _columns == -1) {
-		_lines = DEFAULT_LINES_ON_TERMINAL;
-		_columns = DEFAULT_COLUMNS_ON_TERMINAL;
-	} else {
-		_terminalinit = NULL;		/* don't do fancy things on a non-amiga console */
-		_terminalend = NULL;
-		_cursoroff = NULL;
-		_cursoron = NULL;
-		_getwinsize = NULL;
-	}
-#	endif /* M_AMIGA */
 #	ifdef VMS /* moved from below InitWin() M.St. 22.01.98 */
 	{
 		int input_chan, status;
@@ -547,7 +507,7 @@ InitScreen(
 			xclicks = TRUE;
 			if (!eightbit) {
 				_xclickinit = "\033[?9h";
-				_xclickend  = "\033[?9l";
+				_xclickend = "\033[?9l";
 			}
 #			if 0
 			else {
@@ -674,7 +634,7 @@ MoveCursor(
 	char stuff[12];
 
 	if (_moveto) {
-		sprintf(stuff, _moveto, row + 1, col + 1);
+		snprintf(stuff, sizeof(stuff), _moveto, row + 1, col + 1);
 		tputs(stuff, 1, outchar);
 		my_flush();
 		_line = row + 1;
@@ -856,10 +816,6 @@ Raw(
 		_inraw = 1;
 	}
 #else
-#	if defined(M_AMIGA) && defined(__SASC)
-	_inraw = state;
-	rawcon(state);
-#	else
 	if (!state && _inraw) {
 		SET_TTY(&_original_tty);
 		_inraw = 0;
@@ -869,9 +825,6 @@ Raw(
 #		if USE_SGTTY
 		_raw_tty.sg_flags &= ~(ECHO | CRMOD);	/* echo off */
 		_raw_tty.sg_flags |= CBREAK;		/* raw on */
-#			ifdef M_AMIGA
-		_raw_tty.sg_flags |= RAW; /* Manx-C 5.2 does not support CBREAK */
-#			endif /* M_AMIGA */
 #		else
 #			ifdef __FreeBSD__
 		cfmakeraw(&_raw_tty);
@@ -885,131 +838,11 @@ Raw(
 		SET_TTY(&_raw_tty);
 		_inraw = 1;
 	}
-#	endif /* M_AMIGA && __SASC */
 #endif /* !VMS */
 }
 
 
 /*
- * read a character with Raw mode set!
- */
-
-#ifndef VMS
-#	ifdef M_AMIGA
-#		include <sprof.h>
-
-static int new_lines, new_columns;
-
-static int
-AmiReadCh(
-	int getscrsize)
-{
-	int result;
-	static int buflen = 0, bufp = 0;
-	static unsigned char buf[128];
-	unsigned char ch;
-
-	while (getscrsize || !buflen) {
-PROFILE_OFF();
-		result = read(0, (char *) &buf[buflen], 1);
-PROFILE_ON();
-		if (result <= 0) return EOF;
-		buflen++;
-		if (buf[bufp] == KEY_PREFIX) {
-			do {
-				result = read(0, (char *) &buf[buflen], 1);
-				if (result <= 0) return EOF;
-			} while (buf[buflen++] < 0x40);
-
-			switch (buf[buflen - 1]) {
-				char *ptr;
-				long class;
-
-				case 'r':		/* Window bounds report */
-					ptr = (char *) &buf[bufp + 1];
-					strtol(ptr, &ptr, 10);
-					ptr++;
-					strtol(ptr, &ptr, 10);
-					ptr++;
-					new_lines = strtol(ptr, &ptr, 10);
-					ptr++;
-					new_columns = strtol(ptr, &ptr, 10);
-					buflen = bufp;
-					if (getscrsize)
-						return 0;
-					break;
-
-				case '|':		/* Raw Input Events */
-					ptr = (char *) &buf[bufp + 1];
-					class = strtol(ptr, &ptr, 10);
-					ptr++;
-					switch (class) {
-						int x, y;
-
-						case 12:	/* Window resized */
-							buflen = bufp; /* Must do this before raise() */
-							raise(SIGWINCH);
-							break;
-#			ifdef notdef
-						case 2:	/* Mouse event */
-					/*
-					 * At this point we know what button was pressed
-					 * but we don't really know where the mouse is.
-					 * The <x> and <y> parameters don't help.
-					 * Perhaps looking directly in the window's structure
-					 * is the easiest thing to do (after finding out where
-					 * the window's structure is! Sending an ACTION_INFO
-					 * packet to the handler gives us this. I don't know
-					 * if there is an easier way.
-					 */
-							buflen = bufp;
-							break;
-#			endif /* notdef */
-						default:
-							buflen = bufp;
-							break;
-					}
-					break;
-
-				default:
-					break;
-			}
-		}
-	}
-
-	ch = buf[bufp++];
-	if (bufp >= buflen)
-		buflen = bufp = 0;
-	return ch;
-}
-
-
-int
-ReadCh(
-	void)
-{
-	return AmiReadCh(0);
-}
-
-
-void
-AmiGetWinSize(
-	int *lines,
-	int *columns)
-{
-	if (_getwinsize) {
-		tputs(_getwinsize, 1, outchar);	/* identify yourself */
-		my_flush();
-		AmiReadCh(1);		/* Look for the identification */
-		*lines = new_lines;
-		*columns = new_columns;
-	}
-}
-
-#	endif /* M_AMIGA */
-#endif /* !VMS */
-
-/*
  *  output a character. From tputs... (Note: this CANNOT be a macro!)
  */
 OUTC_FUNCTION(
@@ -1106,13 +939,13 @@ highlight_string(
 	 */
 	if (col > 0) {
 		char tmp[LEN];
-		wchar_t wtmp[LEN];
+		wchar_t *wtmp;
 
 		my_strncpy(tmp, &(screen[row].col[0]), sizeof(tmp) - 1);
 		tmp[col] = '\0';
-		if (mbstowcs(wtmp, tmp, ARRAY_SIZE(wtmp) - 1) != (size_t) -1) {
-			wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-			col = wcswidth(wtmp, ARRAY_SIZE(wtmp));
+		if ((wtmp = char2wchar_t(tmp)) != NULL) {
+			col = wcswidth(wtmp, wcslen(wtmp) + 1);
+			free(wtmp);
 		}
 	}
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
@@ -1146,7 +979,7 @@ word_highlight_string(
 	int byte_offset = col;
 	int wsize = size;
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	wchar_t wtmp[LEN];
+	wchar_t *wtmp;
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 	attributes[0] = _reset;	/* Normal */
@@ -1169,14 +1002,14 @@ word_highlight_string(
 		char tmp[LEN];
 		my_strncpy(tmp, &(screen[row].col[0]), sizeof(tmp) - 1);
 		tmp[byte_offset] = '\0';
-		if (mbstowcs(wtmp, tmp, ARRAY_SIZE(wtmp) - 1) != (size_t) -1) {
-			wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-			col = wcswidth(wtmp, ARRAY_SIZE(wtmp));
+		if ((wtmp = char2wchar_t(tmp)) != NULL) {
+			col = wcswidth(wtmp, wcslen(wtmp) + 1);
+			free(wtmp);
 		}
 	}
-	if (mbstowcs(wtmp, output, ARRAY_SIZE(wtmp) - 1) != (size_t) -1) {
-		wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-		wsize = wcswidth(wtmp, ARRAY_SIZE(wtmp));
+	if ((wtmp = char2wchar_t(output)) != NULL) {
+		wsize = wcswidth(wtmp, wcslen(wtmp) + 1);
+		free(wtmp);
 	}
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
@@ -1258,10 +1091,6 @@ input_pending(
 
 #else
 
-#	ifdef M_AMIGA
-	return (WaitForChar(Input(), 1000 * delay) == DOSTRUE) ? TRUE : FALSE;
-#	endif /* M_AMIGA */
-
 #	ifdef HAVE_SELECT
 	int fd = STDIN_FILENO;
 	fd_set fdread;
@@ -1325,10 +1154,6 @@ get_arrow_key(
 		&& i < ((VT_ESCAPE_TIMEOUT * 1000) / SECOND_CHARACTER_DELAY))
 
 #	ifndef VMS
-#		ifdef M_AMIGA
-	if (WaitForChar(Input(), 1000) == DOSTRUE)
-		return prech;
-#		else	/* !M_AMIGA */
 	if (!input_pending(0)) {
 #			ifdef HAVE_USLEEP
 		int i = 0;
@@ -1365,7 +1190,6 @@ get_arrow_key(
 		if (!input_pending(0))
 			return prech;
 	}
-#		endif /* M_AMIGA */
 #	endif /* !VMS */
 	ch = ReadCh();
 	if (ch == '[' || ch == 'O')
@@ -1404,11 +1228,7 @@ get_arrow_key(
 #	ifdef QNX42
 		case 0xA2:
 #	endif /* QNX42 */
-#	ifdef M_AMIGA
-			return KEYMAP_PAGE_DOWN;
-#	else
 			return KEYMAP_PAGE_UP;
-#	endif /* M_AMIGA */
 
 		case 'G':		/* ansi  PgDn */
 		case 'U':		/* at386 PgDn */
@@ -1416,11 +1236,7 @@ get_arrow_key(
 #	ifdef QNX42
 		case 0xAA:
 #	endif /* QNX42 */
-#	ifdef M_AMIGA
-			return KEYMAP_PAGE_UP;
-#	else
 			return KEYMAP_PAGE_DOWN;
-#	endif /* M_AMIGA */
 
 		case 'H':		/* at386 Home */
 #	ifdef QNX42
@@ -1491,7 +1307,7 @@ ReadCh(
 	int result;
 #	ifndef READ_CHAR_HACK
 	char ch;
-#	endif /* READ_CHAR_HACK */
+#	endif /* !READ_CHAR_HACK */
 
 	fflush(stdout);
 #	ifdef READ_CHAR_HACK
diff -Nurp tin-1.6.2/src/debug.c tin-1.8.0/src/debug.c
--- tin-1.6.2/src/debug.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/debug.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : debug.c
  *  Author    : I. Lea
  *  Created   : 1991-04-01
- *  Updated   : 2003-04-28
+ *  Updated   : 2005-05-04
  *  Notes     : debug routines
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,6 +40,9 @@
 #endif /* !TIN_H */
 
 #if defined(DEBUG) || defined(DEBUG_NEWSRC)
+#	ifndef NEWSRC_H
+#		include "newsrc.h"
+#	endif /* !NEWSRC_H */
 #	ifndef TCURSES_H
 #		include "tcurses.h"
 #	endif /* !TCURSES_H */
@@ -91,21 +94,29 @@ debug_delete_files(
 void
 debug_nntp(
 	const char *func,
-	const char *line)
+	const char *fmt,
+	...)
 {
-	char file[PATH_LEN];
 	FILE *fp;
+	char *buf;
+	char file[PATH_LEN];
+	va_list ap;
 
 	if (!debug)
 		return;
 
+	va_start(ap, fmt);
+	buf = fmt_message(fmt, ap);
+
 	joinpath(file, TMPDIR, "NNTP");
 
 	if ((fp = fopen(file, "a+")) != NULL) {
-		fprintf(fp,"%s: %s\n", func, line);
+		fprintf(fp,"%s: %s\n", func, buf);
 		fchmod(fileno(fp), (S_IRUGO|S_IWUGO));
 		fclose(fp);
 	}
+	free(buf);
+	va_end(ap);
 }
 
 
@@ -130,8 +141,8 @@ void
 debug_print_header(
 	struct t_article *s)
 {
-	char file[PATH_LEN];
 	FILE *fp;
+	char file[PATH_LEN];
 
 	if (debug != 2)
 		return;
@@ -158,7 +169,6 @@ debug_print_header(
 				fprintf(fp, "archive.ispart=[%s]\n", bool_unparse(s->archive->ispart));
 		}
 		fprintf(fp,"thread=[%d]  prev=[%d]  status=[%d]\n\n", s->thread, s->prev, s->status);
-/*		fprintf(fp,"thread=[%s]  prev=[%s]  status=[%s]\n", (s->thread == ART_NORMAL ? "ART_NORMAL" : "ART_EXPIRED"), s->prev, bool_unparse(s->status)); */
 		fflush(fp);
 		fchmod(fileno(fp), (S_IRUGO|S_IWUGO));
 		fclose(fp);
@@ -170,8 +180,8 @@ void
 debug_print_active(
 	void)
 {
-	char file[PATH_LEN];
 	FILE *fp;
+	char file[PATH_LEN];
 	int i;
 	struct t_group *group;
 
@@ -240,25 +250,25 @@ debug_print_attributes(
 
 
 void
-vDbgPrintMalloc(
-	int iIsMalloc,
-	const char *pcFile,
-	int iLine,
-	size_t iSize)
+debug_print_malloc(
+	int is_malloc,
+	const char *xfile,
+	int line,
+	size_t size)
 {
 	FILE *fp;
 	char file[PATH_LEN];
-	static int iTotal = 0;
+	static int total = 0;
 
 	if (debug == 4) {
 		joinpath(file, TMPDIR, "MALLOC");
 		if ((fp = fopen(file, "a+")) != NULL) {
-			iTotal += iSize;
+			total += size;
 			/* sometimes size_t is long */
-			if (iIsMalloc)
-				fprintf(fp, "%10s:%-4d Malloc  %6ld. Total %d\n", pcFile, iLine, (long) iSize, iTotal);
+			if (is_malloc)
+				fprintf(fp, "%10s:%-4d Malloc  %6ld. Total %d\n", xfile, line, (long) size, total);
 			else
-				fprintf(fp, "%10s:%-4d Realloc %6ld. Total %d\n", pcFile, iLine, (long) iSize, iTotal);
+				fprintf(fp, "%10s:%-4d Realloc %6ld. Total %d\n", xfile, line, (long) size, total);
 			fchmod(fileno(fp), (S_IRUGO|S_IWUGO));
 			fclose(fp);
 		}
@@ -293,8 +303,8 @@ void
 debug_print_filters(
 	void)
 {
-	char file[PATH_LEN];
 	FILE *fp;
+	char file[PATH_LEN];
 	int i, num;
 	struct t_filter *the_filter;
 
@@ -320,15 +330,32 @@ debug_print_filters(
 		fclose(fp);
 	}
 }
+
+
+/* TODO: print out all fields of t_capabilities */
+#	ifdef NNTP_ABLE
+void
+debug_print_nntp_extensions(
+	void)
+{
+	if (debug < 2)
+		return;
+	debug_nntp("###", "NNTP EXTENSIONS/CAPABILITIES");
+	debug_nntp("###", "Type/Version : %d/%d", nntp_caps.type, nntp_caps.version);
+	debug_nntp("###", "Command-names: %s %s", BlankIfNull(nntp_caps.over_cmd), BlankIfNull(nntp_caps.hdr_cmd));
+	debug_nntp("###", "List         : %s", nntp_caps.list_motd ? "MOTD" : "");
+}
+#	endif /* NNTP_ABLE */
 #endif /* DEBUG */
 
+
 #ifdef DEBUG_NEWSRC
 void
 debug_print_comment(
 	const char *comment)
 {
-	char file[PATH_LEN];
 	FILE *fp;
+	char file[PATH_LEN];
 
 	if (debug < 2)
 		return;
@@ -348,8 +375,8 @@ debug_print_bitmap(
 	struct t_group *group,
 	struct t_article *art)
 {
-	char file[PATH_LEN];
 	FILE *fp;
+	char file[PATH_LEN];
 
 	if (debug != 3)
 		return;
@@ -367,9 +394,8 @@ debug_print_bitmap(
 				bool_unparse(art->killed),
 				bool_unparse(art->selected),
 				art->subject);
-			fprintf(fp, "thread=[%s]  prev=[%d]  status=[%s]\n",
-				(art->thread == ART_NORMAL ? "ART_NORMAL" : "ART_EXPIRED"),
-				art->prev,
+			fprintf(fp, "thread=[%d]  prev=[%d]  status=[%s]\n",
+				art->thread, art->prev,
 				(art->status == ART_READ ? "READ" : "UNREAD"));
 		}
 		debug_print_newsrc(&group->newsrc, fp);
@@ -381,22 +407,22 @@ debug_print_bitmap(
 
 void
 debug_print_newsrc(
-	struct t_newsrc *NewSrc,
+	struct t_newsrc *lnewsrc,
 	FILE *fp)
 {
 	int i, j;
 
 	fprintf(fp, "Newsrc: min=[%ld] max=[%ld] bitlen=[%ld] num_unread=[%ld] present=[%d]\n",
-		NewSrc->xmin, NewSrc->xmax, NewSrc->xbitlen,
-		NewSrc->num_unread, NewSrc->present);
+		lnewsrc->xmin, lnewsrc->xmax, lnewsrc->xbitlen,
+		lnewsrc->num_unread, lnewsrc->present);
 
 	fprintf(fp, "bitmap=[");
-	if (NewSrc->xbitlen && NewSrc->xbitmap) {
-		for (j = 0, i = NewSrc->xmin; i <= NewSrc->xmax; i++) {
+	if (lnewsrc->xbitlen && lnewsrc->xbitmap) {
+		for (j = 0, i = lnewsrc->xmin; i <= lnewsrc->xmax; i++) {
 			fprintf(fp, "%d",
-				(NTEST(NewSrc->xbitmap, i - NewSrc->xmin) == ART_READ ?
+				(NTEST(lnewsrc->xbitmap, i - lnewsrc->xmin) == ART_READ ?
 				ART_READ : ART_UNREAD));
-			if ((j++ % 8) == 7 && i < NewSrc->xmax)
+			if ((j++ % 8) == 7 && i < lnewsrc->xmax)
 				fprintf(fp, " ");
 		}
 	}
diff -Nurp tin-1.6.2/src/envarg.c tin-1.8.0/src/envarg.c
--- tin-1.6.2/src/envarg.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/envarg.c	2005-12-02 12:07:36.000000000 +0100
@@ -6,7 +6,7 @@
  *  Updated   : 1993-03-10
  *  Notes     : Adds default options from environment to command line
  *
- * Copyright (c) 1991-2003 Bill Davidson
+ * Copyright (c) 1991-2006 Bill Davidson
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -125,7 +125,7 @@ envargs(
 	/*
 	 * finally, add a NULL after the last arg, like UNIX
 	 */
-	*argv = (char *) 0;
+	*argv = NULL;
 
 	/*
 	 * save the values and return
diff -Nurp tin-1.6.2/src/feed.c tin-1.8.0/src/feed.c
--- tin-1.6.2/src/feed.c	2003-08-10 15:31:13.000000000 +0200
+++ tin-1.8.0/src/feed.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : feed.c
  *  Author    : I. Lea
  *  Created   : 1991-08-31
- *  Updated   : 2003-08-10
+ *  Updated   : 2005-07-02
  *  Notes     : provides same interface to mail,pipe,print,save & repost commands
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -45,20 +45,12 @@
 #	endif /* !TCURSES_H */
 #endif /* DEBUG */
 
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
 
-#ifndef RFC2046_H
-#	include "rfc2046.h"
-#endif /* !RFC2046_H */
-
-
-static char proc_ch;					/* Post-processing type when saving */
 static t_bool confirm;					/* only used for FEED_MAIL */
 static t_bool is_mailbox = FALSE;
 static t_bool redraw_screen = FALSE;
 static t_bool supersede = FALSE;		/* for reposting only */
+static t_function pproc_func;			/* Post-processing type when saving */
 #ifndef DONT_HAVE_PIPING
 	static FILE *pipe_fp = (FILE *) 0;
 #endif /* !DONT_HAVE_PIPING */
@@ -74,10 +66,10 @@ struct t_counters {
  * Local prototypes
  */
 static char *get_save_filename(struct t_group *group, int function, char *filename, int filelen, int respnum);
-static int get_feed_key(int function, int level, struct t_group *group, struct t_art_stat *thread, int respnum);
-static int get_post_proc_type(void);
 static t_bool feed_article(int art, int function, struct t_counters *counter, t_bool use_current, const char *data, struct t_group *group);
-static void print_save_summary(char type, int fed);
+static t_function get_feed_key(int function, int level, struct t_group *group, struct t_art_stat *thread, int respnum);
+static t_function get_post_proc_type(void);
+static void print_save_summary(t_function type, int fed);
 #ifndef DISABLE_PRINTING
 	static t_bool print_file(const char *command, int respnum, t_openartinfo *artinfo);
 #endif /* !DISABLE_PRINTING */
@@ -86,7 +78,7 @@ static void print_save_summary(char type
 #	define handle_SIGPIPE()	if (got_sig_pipe) goto got_sig_pipe_while_piping
 #else
 #	define handle_SIGPIPE() /*nothing*/
-#endif /* DONT_HAVE_PIPING */
+#endif /* !DONT_HAVE_PIPING */
 
 /*
  * 'filename' holds 'filelen' amount of storage in which to place the
@@ -156,44 +148,57 @@ get_save_filename(
 
 /*
  * Find out what post-processing to perform.
- * This is not used when saving to mailboxes (we don't postprocess mailboxen)
+ * This is not used when saving to mailboxes (we don't postprocess mailboxes)
  * Also not used when using the auto-save feature because a default value is
  * taken from the group attributes
- * Return a post_proc_char or 0 if aborting the save process
+ * Returns POSTPROCESS_{NO,SHAR,YES} or GLOBAL_ABORT if aborting the save process
  */
-static int
+static t_function
 get_post_proc_type(
 	void)
 {
-	char ch;
 	char keyno[MAXKEYLEN], keyyes[MAXKEYLEN], keyquit[MAXKEYLEN];
 	char keyshar[MAXKEYLEN];
+	t_function default_func, func;
+
+	switch (curr_group->attribute->post_proc_type) {
+		case POST_PROC_YES:
+			default_func = POSTPROCESS_YES;
+			break;
+
+		case POST_PROC_SHAR:
+			default_func = POSTPROCESS_SHAR;
+			break;
+
+		case POST_PROC_NO:
+		default:
+			default_func = POSTPROCESS_NO;
+			break;
+	}
 
-	ch = (char) prompt_slk_response(ch_post_process[curr_group->attribute->post_proc_type],
-				&menukeymap.feed_post_process_type,
-				_(txt_choose_post_process_type),
-				printascii(keyno, map_to_local(iKeyPProcNo, &menukeymap.feed_post_process_type)),
-				printascii(keyyes, map_to_local(iKeyPProcYes, &menukeymap.feed_post_process_type)),
-				printascii(keyshar, map_to_local(iKeyPProcShar, &menukeymap.feed_post_process_type)),
-				printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.feed_post_process_type)));
+	func = prompt_slk_response(default_func, feed_post_process_keys, _(txt_choose_post_process_type),
+				printascii(keyno, func_to_key(POSTPROCESS_NO, feed_post_process_keys)),
+				printascii(keyyes, func_to_key(POSTPROCESS_YES, feed_post_process_keys)),
+				printascii(keyshar, func_to_key(POSTPROCESS_SHAR, feed_post_process_keys)),
+				printascii(keyquit, func_to_key(GLOBAL_QUIT, feed_post_process_keys)));
 
-	if (ch == iKeyQuit || ch == iKeyAbort) {			/* exit */
+	if (func == GLOBAL_QUIT || func == GLOBAL_ABORT) {			/* exit */
 		clear_message();
-		return 0;
+		return GLOBAL_ABORT;
 	}
-	return ch;
+	return func;
 }
 
 
 /*
- * Return the key mapping for what we are intending to process or 0 if save
- * process is being aborted
+ * Return the key mapping for what we are intending to process or
+ * GLOBAL_ABORT if save process is being aborted
  * Key can be (current) article, (current) thread, tagged articles,
  * hot articles, or articles matching a pattern
  * This is automatic in the various auto-save cases, in other
  * cases this is prompted for based on a chosen default
  */
-static int
+static t_function
 get_feed_key(
 	int function,
 	int level,
@@ -202,7 +207,7 @@ get_feed_key(
 	int respnum)
 {
 	constext *prompt;
-	int ch, ch_default;
+	t_function default_func, func;
 
 	switch (function) {
 		case FEED_MAIL:
@@ -229,7 +234,7 @@ get_feed_key(
 		case FEED_REPOST:
 			if (!can_post) {				/* Get this over with before asking any Q's */
 				info_message(_(txt_cannot_post));
-				return 0;
+				return NOT_ASSIGNED;
 			}
 			prompt = txt_repost;
 			break;
@@ -243,11 +248,11 @@ get_feed_key(
 	 * Try and work out what default the user wants
 	 * thread->total = # arts in thread
 	 */
-	ch_default = (num_of_tagged_arts ? iKeyFeedTag :
-					(arts_selected() ? iKeyFeedHot :
-					((level == GROUP_LEVEL && thread->total > 1) ? iKeyFeedThd :
-					(thread->selected_total ? iKeyFeedHot :
-					iKeyFeedArt))));
+	default_func = (num_of_tagged_arts ? FEED_TAGGED :
+					(arts_selected() ? FEED_HOT :
+					((level == GROUP_LEVEL && thread->total > 1) ? FEED_THREAD :
+					(thread->selected_total ? FEED_HOT :
+					FEED_ARTICLE))));
 
 	/*
 	 * Don't bother querying when:
@@ -256,40 +261,48 @@ get_feed_key(
 	 */
 	if ((function == FEED_AUTOSAVE && (num_of_tagged_arts || arts_selected())) ||
 			(group->attribute->auto_save && arts[respnum].archive))
-		ch = ch_default;
+		func = default_func;
 	else {
 		char buf[LEN];
 		char keyart[MAXKEYLEN], keythread[MAXKEYLEN], keyhot[MAXKEYLEN];
 		char keypat[MAXKEYLEN], keytag[MAXKEYLEN], keyquit[MAXKEYLEN];
 
 		snprintf(buf, sizeof(buf), _(txt_art_thread_regex_tag),
-			printascii(keyart, map_to_local(iKeyFeedArt, &menukeymap.feed_art_thread_regex_tag)),
-			printascii(keythread, map_to_local(iKeyFeedThd, &menukeymap.feed_art_thread_regex_tag)),
-			printascii(keyhot, map_to_local(iKeyFeedHot, &menukeymap.feed_art_thread_regex_tag)),
-			printascii(keypat, map_to_local(iKeyFeedPat, &menukeymap.feed_art_thread_regex_tag)),
-			printascii(keytag, map_to_local(iKeyFeedTag, &menukeymap.feed_art_thread_regex_tag)),
-			printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.feed_art_thread_regex_tag)));
-
-		ch = prompt_slk_response(ch_default, &menukeymap.feed_art_thread_regex_tag, "%s %s", _(prompt), buf);
+			printascii(keyart, func_to_key(FEED_ARTICLE, feed_type_keys)),
+			printascii(keythread, func_to_key(FEED_THREAD, feed_type_keys)),
+			printascii(keyhot, func_to_key(FEED_HOT, feed_type_keys)),
+			printascii(keypat, func_to_key(FEED_PATTERN, feed_type_keys)),
+			printascii(keytag, func_to_key(FEED_TAGGED, feed_type_keys)),
+			printascii(keyquit, func_to_key(GLOBAL_QUIT, feed_type_keys)));
+
+		func = prompt_slk_response(default_func, feed_type_keys, "%s %s", _(prompt), buf);
 	}
 
-	switch (ch) {
-		case iKeyQuit:
-		case iKeyAbort:
-			clear_message();
-			return 0;
+	switch (func) {
+		case FEED_PATTERN:
+			{
+				char *tmp = fmt_string(_(txt_feed_pattern), tinrc.default_pattern);
 
-		case iKeyFeedPat:
-			sprintf(mesg, _(txt_feed_pattern), tinrc.default_pattern);
-			if (!(prompt_string_default(mesg, tinrc.default_pattern, _(txt_no_match), HIST_REGEX_PATTERN)))
-				return 0;
+				if (!(prompt_string_default(tmp, tinrc.default_pattern, _(txt_no_match), HIST_REGEX_PATTERN))) {
+					free(tmp);
+					return GLOBAL_ABORT;
+				}
+				free(tmp);
+			}
+			break;
+
+		case GLOBAL_QUIT:
+		case GLOBAL_ABORT:
+			clear_message();
+			return GLOBAL_ABORT;
+			/* NOTREACHED */
 			break;
 
 		default:
 			break;
 	}
 
-	return ch;
+	return func;
 }
 
 
@@ -300,7 +313,7 @@ get_feed_key(
  */
 static void
 print_save_summary(
-	char type,
+	t_function type,
 	int fed)
 {
 	const char *first, *last;
@@ -311,20 +324,20 @@ print_save_summary(
 		wait_message(2, _(txt_warn_not_all_arts_saved), fed, num_save);
 
 	switch (type) {
-		case iKeyFeedHot:
+		case FEED_HOT:
 			snprintf(what, sizeof(what), _(txt_prefix_hot), PLURAL(fed, txt_article));
 			break;
 
-		case iKeyFeedTag:
+		case FEED_TAGGED:
 			snprintf(what, sizeof(what), _(txt_prefix_tagged), PLURAL(fed, txt_article));
 			break;
 
-		case iKeyFeedThd:
+		case FEED_THREAD:
 			STRCPY(what, _(txt_thread_upper));
 			break;
 
-		case iKeyFeedArt:
-		case iKeyFeedPat:
+		case FEED_ARTICLE:
+		case FEED_PATTERN:
 		default:
 			snprintf(what, sizeof(what), "%s", PLURAL(fed, txt_article));
 			break;
@@ -368,6 +381,7 @@ feed_article(
 	const char *data,		/* Extra data if needed, print command or save filename */
 	struct t_group *group)
 {
+	char *progress_mesg = NULL;
 	t_bool ok = TRUE;		/* Assume success */
 	t_openartinfo openart;
 	t_openartinfo *openartptr = &openart;
@@ -382,29 +396,33 @@ feed_article(
 #ifndef DONT_HAVE_PIPING
 		case FEED_PIPE:
 			/* TODO: looks odd because screen mode is raw */
-			wait_message(0, "%s (%d/%d)", _(txt_piping), counter->total, counter->max);
+			progress_mesg = fmt_string("%s (%d/%d)", _(txt_piping), counter->total, counter->max);
 			break;
 #endif /* !DONT_HAVE_PIPING */
 
 #ifndef DISABLE_PRINTING
 		case FEED_PRINT:
 			/* TODO: looks odd because screen mode is raw */
-			wait_message(0, "%s (%d/%d)", _(txt_printing), counter->total, counter->max);
+			progress_mesg = fmt_string("%s (%d/%d)", _(txt_printing), counter->total, counter->max);
 			break;
 #endif /* !DISABLE_PRINTING */
 
 		case FEED_SAVE:
 		case FEED_AUTOSAVE:
-			wait_message(0, "%s (%d/%d)", _(txt_saving), counter->total, counter->max);
+			progress_mesg = fmt_string("%s (%d/%d)", _(txt_saving), counter->total, counter->max);
 			break;
 	}
 
 	if (use_current)
 		openartptr = &pgart;			/* Use art already open in pager */
 	else {
-		if (art_open(FALSE, &arts[art], group, openartptr, TRUE) < 0)	/* User abort or an error */
+		if (art_open(FALSE, &arts[art], group, openartptr, TRUE, progress_mesg) < 0) {
+			/* User abort or an error */
+			FreeIfNeeded(progress_mesg);
 			return FALSE;
+		}
 	}
+	FreeIfNeeded(progress_mesg);
 
 	switch (function) {
 		case FEED_MAIL:
@@ -437,7 +455,7 @@ feed_article(
 
 		case FEED_SAVE:
 		case FEED_AUTOSAVE:
-			ok = save_and_process_art(openartptr, &arts[art], is_mailbox, data /*filename*/, counter->max, (proc_ch != iKeyPProcNo));
+			ok = save_and_process_art(openartptr, &arts[art], is_mailbox, data /*filename*/, counter->max, (pproc_func != POSTPROCESS_NO));
 			break;
 
 		case FEED_REPOST:
@@ -458,7 +476,7 @@ feed_article(
 	 */
 	if (function == FEED_SAVE || function == FEED_AUTOSAVE) {
 		if (ok && tinrc.mark_saved_read)
-			art_mark(&CURR_GROUP, &arts[art], ART_READ);
+			art_mark(curr_group, &arts[art], ART_READ);
 	}
 
 	if (!use_current)
@@ -495,9 +513,9 @@ feed_articles(
 	struct t_group *group,
 	int respnum)
 {
+	char *prompt;
 	char outpath[PATH_LEN];
 	int art;
-	int feed_type;
 	int i;
 	int saved_curr_line = -1;
 	int thread_base;
@@ -506,6 +524,7 @@ feed_articles(
 	t_bool use_current = FALSE;
 	t_bool ret1 = FALSE;
 	t_bool post_processed_ok = FALSE;
+	t_function feed_type;
 
 #ifdef DONT_HAVE_PIPING
 	if (function == FEED_PIPE) {
@@ -526,7 +545,7 @@ feed_articles(
 	thread_base = which_thread(respnum);
 	stat_thread(thread_base, &sbuf);
 
-	if ((feed_type = get_feed_key(function, level, group, &sbuf, respnum)) == 0)
+	if ((feed_type = get_feed_key(function, level, group, &sbuf, respnum)) == GLOBAL_ABORT)
 		return;
 
 	/*
@@ -535,17 +554,23 @@ feed_articles(
 	switch (function) {
 		/* Setup mail - get address to mail to */
 		case FEED_MAIL:
-			sprintf(mesg, _(txt_mail_art_to), cCOLS - (strlen(_(txt_mail_art_to)) + 30), tinrc.default_mail_address);
-			if (!(prompt_string_default(mesg, tinrc.default_mail_address, _(txt_no_mail_address), HIST_MAIL_ADDRESS)))
+			prompt = fmt_string(_(txt_mail_art_to), cCOLS - (strlen(_(txt_mail_art_to)) + 30), tinrc.default_mail_address);
+			if (!(prompt_string_default(prompt, tinrc.default_mail_address, _(txt_no_mail_address), HIST_MAIL_ADDRESS))) {
+				free(prompt);
 				return;
+			}
+			free(prompt);
 			break;
 
 #ifndef DONT_HAVE_PIPING
 		/* Setup pipe - get pipe-to command and open the pipe */
 		case FEED_PIPE:
-			sprintf(mesg, _(txt_pipe_to_command), cCOLS - (strlen(_(txt_pipe_to_command)) + 30), tinrc.default_pipe_command);
-			if (!(prompt_string_default(mesg, tinrc.default_pipe_command, _(txt_no_command), HIST_PIPE_COMMAND)))
+			prompt = fmt_string(_(txt_pipe_to_command), cCOLS - (strlen(_(txt_pipe_to_command)) + 30), tinrc.default_pipe_command);
+			if (!(prompt_string_default(prompt, tinrc.default_pipe_command, _(txt_no_command), HIST_PIPE_COMMAND))) {
+				free(prompt);
 				return;
+			}
+			free(prompt);
 
 			got_sig_pipe = FALSE;
 			EndWin(); /* Turn off curses/windowing */
@@ -563,7 +588,7 @@ feed_articles(
 #ifndef DISABLE_PRINTING
 		/* Setup printing - get print command line */
 		case FEED_PRINT:
-			sprintf(outpath, "%s %s", tinrc.printer, REDIRECT_OUTPUT);
+			snprintf(outpath, sizeof(outpath), "%s %s", tinrc.printer, REDIRECT_OUTPUT);
 			break;
 #endif /* !DISABLE_PRINTING */
 
@@ -584,13 +609,26 @@ feed_articles(
 				if (get_save_filename(group, function, savefile, sizeof(savefile), respnum) == NULL)
 					return;
 
-				proc_ch = ch_post_process[curr_group->attribute->post_proc_type];
+				switch (curr_group->attribute->post_proc_type) {
+					case POST_PROC_YES:
+						pproc_func = POSTPROCESS_YES;
+						break;
+
+					case POST_PROC_SHAR:
+						pproc_func = POSTPROCESS_SHAR;
+						break;
+
+					case POST_PROC_NO:
+					default:
+						pproc_func = POSTPROCESS_NO;
+						break;
+				}
 
 				/* We don't postprocess mailboxen */
 				if ((is_mailbox = expand_save_filename(outpath, savefile)) == TRUE)
-					proc_ch = iKeyPProcNo;
+					pproc_func = POSTPROCESS_NO;
 				else {
-					if (function != FEED_AUTOSAVE && (proc_ch = get_post_proc_type()) == 0)
+					if (function != FEED_AUTOSAVE && (pproc_func = get_post_proc_type()) == GLOBAL_ABORT)
 						return;
 				}
 				if (!create_path(outpath))
@@ -601,6 +639,7 @@ feed_articles(
 		/* repost (or supersede) article */
 		case FEED_REPOST:
 			{
+				char *tmp;
 #ifndef FORGERY
 				char from_name[PATH_LEN];
 
@@ -608,28 +647,30 @@ feed_articles(
 
 				if (strstr(from_name, arts[respnum].from)) {
 #endif /* !FORGERY */
+					char *smsg;
 					char buf[LEN];
 					char keyrepost[MAXKEYLEN], keysupersede[MAXKEYLEN];
 					char keyquit[MAXKEYLEN];
-					char option;
+					t_function func;
 
 					/* repost or supersede? */
 					snprintf(buf, sizeof(buf), _(txt_supersede_article),
-							printascii(keyrepost, map_to_local(iKeyFeedRepost, &menukeymap.feed_supersede_article)),
-							printascii(keysupersede, map_to_local(iKeyFeedSupersede, &menukeymap.feed_supersede_article)),
-							printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.feed_supersede_article)));
-					option = (char) prompt_slk_response(iKeyFeedSupersede,
-										&menukeymap.feed_supersede_article, "%s",
-										sized_message(buf, arts[respnum].subject));
-
-					switch (option) {
-						case iKeyFeedSupersede:
-							sprintf(mesg, _(txt_supersede_group), tinrc.default_repost_group);
+							printascii(keyrepost, func_to_key(FEED_KEY_REPOST, feed_supersede_article_keys)),
+							printascii(keysupersede, func_to_key(FEED_SUPERSEDE, feed_supersede_article_keys)),
+							printascii(keyquit, func_to_key(GLOBAL_QUIT, feed_supersede_article_keys)));
+					func = prompt_slk_response(FEED_SUPERSEDE,
+								feed_supersede_article_keys, "%s",
+								sized_message(&smsg, buf, arts[respnum].subject));
+					free(smsg);
+
+					switch (func) {
+						case FEED_SUPERSEDE:
+							tmp = fmt_string(_(txt_supersede_group), tinrc.default_repost_group);
 							supersede = TRUE;
 							break;
 
-						case iKeyFeedRepost:
-							sprintf(mesg, _(txt_repost_group), tinrc.default_repost_group);
+						case FEED_KEY_REPOST:
+							tmp = fmt_string(_(txt_repost_group), tinrc.default_repost_group);
 							supersede = FALSE;
 							break;
 
@@ -639,12 +680,15 @@ feed_articles(
 					}
 #ifndef FORGERY
 				} else {
-					sprintf(mesg, _(txt_repost_group), tinrc.default_repost_group);
+					tmp = fmt_string(_(txt_repost_group), tinrc.default_repost_group);
 					supersede = FALSE;
 				}
 #endif /* !FORGERY */
-				if (!(prompt_string_default(mesg, tinrc.default_repost_group, _(txt_no_group), HIST_REPOST_GROUP)))
+				if (!(prompt_string_default(tmp, tinrc.default_repost_group, _(txt_no_group), HIST_REPOST_GROUP))) {
+					free(tmp);
 					return;
+				}
+				free(tmp);
 			}
 			break;
 
@@ -659,7 +703,7 @@ feed_articles(
 	 * Performance hack - If we feed a single art from the pager then we can
 	 * re-use the currently open article
 	 */
-	if (level == PAGE_LEVEL && feed_type == iKeyFeedArt) {
+	if (level == PAGE_LEVEL && feed_type == FEED_ARTICLE) {
 		saved_curr_line = curr_line;		/* Save where we were in pager */
 		use_current = TRUE;
 	}
@@ -669,13 +713,13 @@ feed_articles(
 	 * The general idea is to feed_article() for every article to be processed
 	 */
 	switch (feed_type) {
-		case iKeyFeedArt:		/* article */
+		case FEED_ARTICLE:		/* article */
 			counter.max = 1;
 			if (!feed_article(respnum, function, &counter, use_current, outpath, group))
 				handle_SIGPIPE();
 			break;
 
-		case iKeyFeedThd:		/* thread */
+		case FEED_THREAD:		/* thread */
 			/* Get accurate count first */
 			for_each_art_in_thread(art, which_thread(respnum)) {
 				if (!(tinrc.process_only_unread && arts[art].status == ART_READ))
@@ -691,7 +735,7 @@ feed_articles(
 			}
 			break;
 
-		case iKeyFeedTag:		/* tagged articles */
+		case FEED_TAGGED:		/* tagged articles */
 			counter.max = num_of_tagged_arts;
 			for (i = 1; i <= num_of_tagged_arts; i++) {
 				for_each_art(art) {
@@ -706,20 +750,32 @@ feed_articles(
 			untag_all_articles();	/* TODO: this will untag even on partial failure */
 			break;
 
-		case iKeyFeedHot:		/* hot (auto-selected) articles */
-		case iKeyFeedPat:		/* pattern matched articles */
-			for_each_art(art) {
-				if (feed_type == iKeyFeedPat) {
-					if (!REGEX_MATCH(arts[art].subject, tinrc.default_pattern, TRUE))
+		case FEED_HOT:		/* hot (auto-selected) articles */
+		case FEED_PATTERN:	/* pattern matched articles */
+			{
+				struct regex_cache cache = { NULL, NULL };
+
+				if ((feed_type == FEED_PATTERN) && tinrc.wildcard && !(compile_regex(tinrc.default_pattern, &cache, PCRE_CASELESS)))
+					break;
+
+				for_each_art(art) {
+					if (feed_type == FEED_PATTERN) {
+						if (!match_regex(arts[art].subject, tinrc.default_pattern, &cache, TRUE))
+							continue;
+					} else if (!arts[art].selected)
+						continue;
+
+					if (tinrc.process_only_unread && arts[art].status == ART_READ)
 						continue;
-				} else if (!arts[art].selected)
-					continue;
 
-				if (tinrc.process_only_unread && arts[art].status == ART_READ)
-					continue;
+					arts[art].matched = TRUE;
+					counter.max++;
+				}
 
-				arts[art].matched = TRUE;
-				counter.max++;
+				if (tinrc.wildcard) {
+					FreeIfNeeded(cache.re);
+					FreeIfNeeded(cache.extra);
+				}
 			}
 
 			/* I think we nest like this to preserve any 'ordering' of the arts */
@@ -731,7 +787,7 @@ feed_articles(
 
 					/* Keep going - don't abort on errors */
 					if (feed_article(art, function, &counter, use_current, outpath, group)) {
-						if (feed_type == iKeyFeedHot)
+						if (feed_type == FEED_HOT)
 							arts[art].selected = FALSE;
 					} else
 						handle_SIGPIPE();
@@ -741,13 +797,13 @@ feed_articles(
 
 		default:			/* Should never get here */
 			break;
-	} /* switch (ch) */
+	} /* switch (feed_type) */
 
 	/*
 	 * Invoke post-processing if needed
 	 * Work out what (if anything) needs to be redrawn
 	 */
-	if (!tinrc.use_mailreader_i)
+	if (INTERACTIVE_NONE == tinrc.interactive_mailer)
 		redraw_screen |= mail_check();	/* in case of sending to oneself */
 
 	switch (function) {
@@ -774,18 +830,18 @@ got_sig_pipe_while_piping:
 			}
 
 			print_save_summary(feed_type, counter.total);
-			if (proc_ch != iKeyPProcNo) {
+			if (pproc_func != POSTPROCESS_NO) {
 				t_bool delete_post_proc = FALSE;
 
-				if (CURR_GROUP.attribute->delete_tmp_files)
+				if (curr_group->attribute->delete_tmp_files)
 					delete_post_proc = TRUE;
 				else {
 					if (function != FEED_AUTOSAVE) {
-						if (prompt_yn(cLINES, _(txt_delete_processed_files), TRUE) == 1)
+						if (prompt_yn(_(txt_delete_processed_files), TRUE) == 1)
 							delete_post_proc = TRUE;
 					}
 				}
-				post_processed_ok = post_process_files(proc_ch, delete_post_proc);
+				post_processed_ok = post_process_files(pproc_func, delete_post_proc);
 			}
 			free_save_array();		/* NB: This is where num_save etc.. gets purged */
 			break;
@@ -826,7 +882,7 @@ got_sig_pipe_while_piping:
 	 */
 	switch (function) {
 		case FEED_MAIL:
-			if (tinrc.use_mailreader_i)
+			if (INTERACTIVE_NONE != tinrc.interactive_mailer)
 				info_message(_(txt_external_mail_done));
 			else
 				info_message(_(txt_articles_mailed), counter.success, PLURAL(counter.success, txt_article));
@@ -854,8 +910,8 @@ print_file(
 	t_openartinfo *artinfo)
 {
 	FILE *fp;
-	t_bool ok = TRUE;
 	struct t_header *hdr = &artinfo->hdr;
+	t_bool ok;
 #	ifdef DONT_HAVE_PIPING
 	char cmd[PATH_LEN], file[PATH_LEN];
 #	endif /* DONT_HAVE_PIPING */
diff -Nurp tin-1.6.2/src/filter.c tin-1.8.0/src/filter.c
--- tin-1.6.2/src/filter.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/filter.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : filter.c
  *  Author    : I. Lea
  *  Created   : 1992-12-28
- *  Updated   : 2003-05-16
+ *  Updated   : 2005-07-06
  *  Notes     : Filter articles. Kill & auto selection are supported.
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,9 +44,6 @@
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
 
 
 #define IS_READ(i)	(arts[i].status == ART_READ)
@@ -77,8 +74,8 @@
  * Easier access to hashed msgids. Note that in REFS(), y must be free()d
  * msgid is mandatory in an article and cannot be NULL
  */
-#define MSGID(x)			(x->refptr->txt)
-#define REFS(x,y)			((y = get_references(x->refptr->parent)) ? y : "")
+#define MSGID(x)			(x->refptr ? x->refptr->txt : "")
+#define REFS(x,y)			((y = get_references(x->refptr ? x->refptr->parent : NULL)) ? y : "")
 
 /*
  * global filter array
@@ -89,18 +86,22 @@ struct t_filters glob_filter = { 0, 0, (
 /*
  * Local prototypes
  */
-static int get_choice(int x, const char *help, const char *prompt, const char *opt1, const char *opt2, const char *opt3, const char *opt4, const char *opt5);
+static int get_choice(int x, const char *help, const char *prompt, char *list[], int list_size);
 static int set_filter_scope(struct t_group *group);
 static struct t_filter_comment *add_filter_comment(struct t_filter_comment *ptr, char *text);
 static struct t_filter_comment *free_filter_comment(struct t_filter_comment *ptr);
 static struct t_filter_comment *copy_filter_comment(struct t_filter_comment *from, struct t_filter_comment *to);
-static t_bool add_filter_rule(struct t_group *group, struct t_article *art, struct t_filter_rule *rule);
-static t_bool test_regex(const char *string, char *regex, t_bool nocase, struct regex_cache *cache);
+static t_bool add_filter_rule(struct t_group *group, struct t_article *art, struct t_filter_rule *rule, t_bool quick_filter_rule);
+static int test_regex(const char *string, char *regex, t_bool nocase, struct regex_cache *cache);
 static void expand_filter_array(struct t_filters *ptr);
+static void fmt_filter_menu_prompt(char *dest, size_t dest_len, const char *fmt_str, int len, const char *text);
 static void free_filter_item(struct t_filter *ptr);
 static void print_filter_menu(void);
 static void set_filter(struct t_filter *ptr);
 static void write_filter_array(FILE *fp, struct t_filters *ptr);
+#if 0 /* currently unused */
+	static FILE *open_xhdr_fp(char *header, long min, long max);
+#endif /* 0 */
 
 
 /*
@@ -184,9 +185,11 @@ expand_filter_array(
 /*
  * Looks for a matching filter hit (wildmat or pcre regex) in the supplied string
  * If the cache is not yet initialised, compile and optimise the regex
- * Return TRUE if we hit the rule
+ * Returns 1 if we hit the rule
+ * Returns 0 if we had no match
+ * In case of error prints an error message and returns -1
  */
-static t_bool
+static int
 test_regex(
 	const char *string,
 	char *regex,
@@ -197,19 +200,21 @@ test_regex(
 
 	if (!tinrc.wildcard) {
 		if (wildmat(string, regex, nocase))
-			return TRUE;
+			return 1;
 	} else {
 		if (!cache->re)
 			compile_regex(regex, cache, (nocase ? PCRE_CASELESS : 0));
 		if (cache->re) {
 			regex_errpos = pcre_exec(cache->re, cache->extra, string, strlen(string), 0, 0, NULL, 0);
 			if (regex_errpos >= 0)
-				return TRUE;
-			else if (regex_errpos != PCRE_ERROR_NOMATCH)
-				sprintf(mesg, _(txt_pcre_error_num), regex_errpos);
+				return 1;
+			else if (regex_errpos != PCRE_ERROR_NOMATCH) {
+				error_message(_(txt_pcre_error_num), regex_errpos);
+				return -1;
+			}
 		}
 	}
-	return FALSE;
+	return 0;
 }
 
 
@@ -222,19 +227,19 @@ set_filter(
 {
 	if (ptr != NULL) {
 		ptr->comment = (struct t_filter_comment *) 0;
-		ptr->scope = (char *) 0;
+		ptr->scope = NULL;
 		ptr->inscope = TRUE;
 		ptr->icase = FALSE;
 		ptr->fullref = FILTER_MSGID;
-		ptr->subj = (char *) 0;
-		ptr->from = (char *) 0;
-		ptr->msgid = (char *) 0;
+		ptr->subj = NULL;
+		ptr->from = NULL;
+		ptr->msgid = NULL;
 		ptr->lines_cmp = FILTER_LINES_NO;
 		ptr->lines_num = 0;
 		ptr->gnksa_cmp = FILTER_LINES_NO;
 		ptr->gnksa_num = 0;
 		ptr->score = 0;
-		ptr->xref = (char *) 0;
+		ptr->xref = NULL;
 		ptr->time = (time_t) 0;
 		ptr->next = (struct t_filter *) 0;
 	}
@@ -287,7 +292,7 @@ read_filter_file(
 	FILE *fp;
 	char buf[HEADER_LEN];
 	char scope[HEADER_LEN];
-	char comment_line[LEN];  /* one line of comment */
+	char comment_line[LEN];	/* one line of comment */
 	char subj[HEADER_LEN];
 	char from[HEADER_LEN];
 	char msgid[HEADER_LEN];
@@ -299,8 +304,8 @@ read_filter_file(
 	int icase = 0;
 	int score = 0;
 	long secs = 0L;
-	struct t_filter_comment *comment;
-	struct t_filter *ptr;
+	struct t_filter_comment *comment = NULL;
+	struct t_filter *ptr = NULL;
 	t_bool expired = FALSE;
 	t_bool expired_time = FALSE;
 	time_t current_secs = (time_t) 0;
@@ -321,9 +326,6 @@ read_filter_file(
 	if (!first_read)
 		free_filter_array(&glob_filter);
 
-	ptr = (struct t_filter *) 0;
-	comment = (struct t_filter_comment *) 0;
-
 	while (fgets(buf, (int) sizeof(buf), fp) != NULL) {
 		if (*buf == '#' || *buf == '\n') {
 			if (upgrade == RC_CHECK && first_read) {
@@ -337,294 +339,283 @@ read_filter_file(
 		}
 
 		switch (tolower((unsigned char) buf[0])) {
-		case 'c':
-			if (match_integer(buf + 1, "ase=", &icase, 1)) {
-				if (ptr && !expired_time)
-					ptr[i].icase = (unsigned) icase;
+			case 'c':
+				if (match_integer(buf + 1, "ase=", &icase, 1)) {
+					if (ptr && !expired_time)
+						ptr[i].icase = (unsigned) icase;
 
+					break;
+				}
+				if (match_string(buf + 1, "omment=", comment_line, sizeof(comment_line)))
+					comment = add_filter_comment(comment, comment_line);
 				break;
-			}
-			if (match_string(buf + 1, "omment=", comment_line, sizeof(comment_line))) {
-				comment = add_filter_comment(comment, comment_line);
-				break;
-			}
-			break;
 
-		case 'f':
-			if (match_string(buf + 1, "rom=", from, sizeof(from))) {
-				if (ptr && !expired_time) {
-					if (tinrc.wildcard && ptr[i].from != NULL) {
-						/* merge with already read value */
-						ptr[i].from = my_realloc(ptr[i].from, strlen(ptr[i].from) + strlen(from) + 2);
-						strcat(ptr[i].from, "|");
-						strcat(ptr[i].from, from);
-					} else {
-						FreeIfNeeded(ptr[i].from);
-						ptr[i].from = my_strdup(from);
+			case 'f':
+				if (match_string(buf + 1, "rom=", from, sizeof(from))) {
+					if (ptr && !expired_time) {
+						if (tinrc.wildcard && ptr[i].from != NULL) {
+							/* merge with already read value */
+							ptr[i].from = my_realloc(ptr[i].from, strlen(ptr[i].from) + strlen(from) + 2);
+							strcat(ptr[i].from, "|");
+							strcat(ptr[i].from, from);
+						} else {
+							FreeIfNeeded(ptr[i].from);
+							ptr[i].from = my_strdup(from);
+						}
 					}
 				}
 				break;
-			}
-			break;
 
-		case 'g':
-			if (match_string(buf + 1, "roup=", scope, sizeof(scope))) {
+			case 'g':
+				if (match_string(buf + 1, "roup=", scope, sizeof(scope))) {
 #ifdef DEBUG
-				if (debug) {
-					my_printf("group=[%s] num=[%d]\n", scope, glob_filter.num);
-					my_flush();
-				}
+					if (debug) {
+						my_printf("group=[%s] num=[%d]\n", scope, glob_filter.num);
+						my_flush();
+					}
 #endif /* DEBUG */
-				if (glob_filter.num >= glob_filter.max)
-					expand_filter_array(&glob_filter);
+					if (glob_filter.num >= glob_filter.max)
+						expand_filter_array(&glob_filter);
 
-				ptr = glob_filter.filter;
-				i = glob_filter.num++;
-				set_filter(&ptr[i]);
-				expired_time = FALSE;
-				ptr[i].scope = my_strdup(scope);
-				if (comment != NULL) {
-					ptr[i].comment = copy_filter_comment(comment, ptr[i].comment);
-					comment = free_filter_comment(comment);
-				}
-				subj[0] = '\0';
-				from[0] = '\0';
-				msgid[0] = '\0';
-				buffer[0] = '\0';
-				xref[0] = '\0';
-				icase = 0;
-				secs = 0L;
-				break;
-			}
-			if (match_string(buf + 1, "nksa=", gnksa, sizeof(gnksa))) {
-				if (ptr && !expired_time) {
-					if (gnksa[0] == '<') {
-						ptr[i].gnksa_cmp = FILTER_LINES_LT;
-						ptr[i].gnksa_num = atoi(&gnksa[1]);
-					} else if (gnksa[0] == '>') {
-						ptr[i].gnksa_cmp = FILTER_LINES_GT;
-						ptr[i].gnksa_num = atoi(&gnksa[1]);
-					} else {
-						ptr[i].gnksa_cmp = FILTER_LINES_EQ;
-						ptr[i].gnksa_num = atoi(gnksa);
+					ptr = glob_filter.filter;
+					i = glob_filter.num++;
+					set_filter(&ptr[i]);
+					expired_time = FALSE;
+					ptr[i].scope = my_strdup(scope);
+					if (comment != NULL) {
+						ptr[i].comment = copy_filter_comment(comment, ptr[i].comment);
+						comment = free_filter_comment(comment);
 					}
+					subj[0] = '\0';
+					from[0] = '\0';
+					msgid[0] = '\0';
+					buffer[0] = '\0';
+					xref[0] = '\0';
+					icase = 0;
+					secs = 0L;
+					break;
 				}
-				break;
-			}
-		break;
-
-		case 'l':
-			if (match_string(buf + 1, "ines=", buffer, sizeof(buffer))) {
-				if (ptr && !expired_time) {
-					if (buffer[0] == '<') {
-						ptr[i].lines_cmp = FILTER_LINES_LT;
-						ptr[i].lines_num = atoi(&buffer[1]);
-					} else if (buffer[0] == '>') {
-						ptr[i].lines_cmp = FILTER_LINES_GT;
-						ptr[i].lines_num = atoi(&buffer[1]);
-					} else {
-						ptr[i].lines_cmp = FILTER_LINES_EQ;
-						ptr[i].lines_num = atoi(buffer);
+				if (match_string(buf + 1, "nksa=", gnksa, sizeof(gnksa))) {
+					if (ptr && !expired_time) {
+						if (gnksa[0] == '<') {
+							ptr[i].gnksa_cmp = FILTER_LINES_LT;
+							ptr[i].gnksa_num = atoi(&gnksa[1]);
+						} else if (gnksa[0] == '>') {
+							ptr[i].gnksa_cmp = FILTER_LINES_GT;
+							ptr[i].gnksa_num = atoi(&gnksa[1]);
+						} else {
+							ptr[i].gnksa_cmp = FILTER_LINES_EQ;
+							ptr[i].gnksa_num = atoi(gnksa);
+						}
 					}
 				}
-				break;
-			}
 			break;
 
-		case 'm':
-			if (match_string(buf + 1, "sgid=", msgid, sizeof(msgid))) {
-				if (ptr && !expired_time) {
-					if (tinrc.wildcard && ptr[i].msgid != NULL && ptr[i].fullref == FILTER_MSGID) {
-						/* merge with already read value */
-						ptr[i].msgid = my_realloc(ptr[i].msgid, strlen(ptr[i].msgid) + strlen(msgid) + 2);
-						strcat(ptr[i].msgid, "|");
-						strcat(ptr[i].msgid, msgid);
-					} else {
-						FreeIfNeeded(ptr[i].msgid);
-						ptr[i].msgid = my_strdup(msgid);
-						ptr[i].fullref = FILTER_MSGID;
+			case 'l':
+				if (match_string(buf + 1, "ines=", buffer, sizeof(buffer))) {
+					if (ptr && !expired_time) {
+						if (buffer[0] == '<') {
+							ptr[i].lines_cmp = FILTER_LINES_LT;
+							ptr[i].lines_num = atoi(&buffer[1]);
+						} else if (buffer[0] == '>') {
+							ptr[i].lines_cmp = FILTER_LINES_GT;
+							ptr[i].lines_num = atoi(&buffer[1]);
+						} else {
+							ptr[i].lines_cmp = FILTER_LINES_EQ;
+							ptr[i].lines_num = atoi(buffer);
+						}
 					}
 				}
 				break;
-			}
-			if (match_string(buf + 1, "sgid_last=", msgid, sizeof(msgid))) {
-				if (ptr && !expired_time) {
-					if (tinrc.wildcard && ptr[i].msgid != NULL && ptr[i].fullref == FILTER_MSGID_LAST) {
-						/* merge with already read value */
-						ptr[i].msgid = my_realloc(ptr[i].msgid, strlen(ptr[i].msgid) + strlen(msgid) + 2);
-						strcat(ptr[i].msgid, "|");
-						strcat(ptr[i].msgid, msgid);
-					} else {
-						FreeIfNeeded(ptr[i].msgid);
-						ptr[i].msgid = my_strdup(msgid);
-						ptr[i].fullref = FILTER_MSGID_LAST;
+
+			case 'm':
+				if (match_string(buf + 1, "sgid=", msgid, sizeof(msgid))) {
+					if (ptr && !expired_time) {
+						if (tinrc.wildcard && ptr[i].msgid != NULL && ptr[i].fullref == FILTER_MSGID) {
+							/* merge with already read value */
+							ptr[i].msgid = my_realloc(ptr[i].msgid, strlen(ptr[i].msgid) + strlen(msgid) + 2);
+							strcat(ptr[i].msgid, "|");
+							strcat(ptr[i].msgid, msgid);
+						} else {
+							FreeIfNeeded(ptr[i].msgid);
+							ptr[i].msgid = my_strdup(msgid);
+							ptr[i].fullref = FILTER_MSGID;
+						}
 					}
+					break;
 				}
-				break;
-			}
-			if (match_string(buf + 1, "sgid_only=", msgid, sizeof(msgid))) {
-				if (ptr && !expired_time) {
-					if (tinrc.wildcard && ptr[i].msgid != NULL && ptr[i].fullref == FILTER_MSGID_ONLY) {
-						/* merge with already read value */
-						ptr[i].msgid = my_realloc(ptr[i].msgid, strlen(ptr[i].msgid) + strlen(msgid) + 2);
-						strcat(ptr[i].msgid, "|");
-						strcat(ptr[i].msgid, msgid);
-					} else {
-						FreeIfNeeded(ptr[i].msgid);
-						ptr[i].msgid = my_strdup(msgid);
-						ptr[i].fullref = FILTER_MSGID_ONLY;
+				if (match_string(buf + 1, "sgid_last=", msgid, sizeof(msgid))) {
+					if (ptr && !expired_time) {
+						if (tinrc.wildcard && ptr[i].msgid != NULL && ptr[i].fullref == FILTER_MSGID_LAST) {
+							/* merge with already read value */
+							ptr[i].msgid = my_realloc(ptr[i].msgid, strlen(ptr[i].msgid) + strlen(msgid) + 2);
+							strcat(ptr[i].msgid, "|");
+							strcat(ptr[i].msgid, msgid);
+						} else {
+							FreeIfNeeded(ptr[i].msgid);
+							ptr[i].msgid = my_strdup(msgid);
+							ptr[i].fullref = FILTER_MSGID_LAST;
+						}
+					}
+					break;
+				}
+				if (match_string(buf + 1, "sgid_only=", msgid, sizeof(msgid))) {
+					if (ptr && !expired_time) {
+						if (tinrc.wildcard && ptr[i].msgid != NULL && ptr[i].fullref == FILTER_MSGID_ONLY) {
+							/* merge with already read value */
+							ptr[i].msgid = my_realloc(ptr[i].msgid, strlen(ptr[i].msgid) + strlen(msgid) + 2);
+							strcat(ptr[i].msgid, "|");
+							strcat(ptr[i].msgid, msgid);
+						} else {
+							FreeIfNeeded(ptr[i].msgid);
+							ptr[i].msgid = my_strdup(msgid);
+							ptr[i].fullref = FILTER_MSGID_ONLY;
+						}
 					}
 				}
 				break;
-			}
-			break;
 
-		case 'r':
-			if (match_string(buf + 1, "efs_only=", msgid, sizeof(msgid))) {
-				if (ptr && !expired_time) {
-					if (tinrc.wildcard && ptr[i].msgid != NULL && ptr[i].fullref == FILTER_REFS_ONLY) {
-						/* merge with already read value */
-						ptr[i].msgid = my_realloc(ptr[i].msgid, strlen(ptr[i].msgid) + strlen(msgid) + 2);
-						strcat(ptr[i].msgid, "|");
-						strcat(ptr[i].msgid, msgid);
-					} else {
-						FreeIfNeeded(ptr[i].msgid);
-						ptr[i].msgid = my_strdup(msgid);
-						ptr[i].fullref = FILTER_REFS_ONLY;
+			case 'r':
+				if (match_string(buf + 1, "efs_only=", msgid, sizeof(msgid))) {
+					if (ptr && !expired_time) {
+						if (tinrc.wildcard && ptr[i].msgid != NULL && ptr[i].fullref == FILTER_REFS_ONLY) {
+							/* merge with already read value */
+							ptr[i].msgid = my_realloc(ptr[i].msgid, strlen(ptr[i].msgid) + strlen(msgid) + 2);
+							strcat(ptr[i].msgid, "|");
+							strcat(ptr[i].msgid, msgid);
+						} else {
+							FreeIfNeeded(ptr[i].msgid);
+							ptr[i].msgid = my_strdup(msgid);
+							ptr[i].fullref = FILTER_REFS_ONLY;
+						}
 					}
 				}
 				break;
-			}
-			break;
 
-		case 's':
-			if (match_string(buf + 1, "ubj=", subj, sizeof(subj))) {
-				if (ptr && !expired_time) {
-					if (tinrc.wildcard && ptr[i].subj != NULL) {
-						/* merge with already read value */
-						ptr[i].subj = my_realloc(ptr[i].subj, strlen(ptr[i].subj) + strlen(subj) + 2);
-						strcat(ptr[i].subj, "|");
-						strcat(ptr[i].subj, subj);
-					} else {
-						FreeIfNeeded(ptr[i].subj);
-						ptr[i].subj = my_strdup(subj);
+			case 's':
+				if (match_string(buf + 1, "ubj=", subj, sizeof(subj))) {
+					if (ptr && !expired_time) {
+						if (tinrc.wildcard && ptr[i].subj != NULL) {
+							/* merge with already read value */
+							ptr[i].subj = my_realloc(ptr[i].subj, strlen(ptr[i].subj) + strlen(subj) + 2);
+							strcat(ptr[i].subj, "|");
+							strcat(ptr[i].subj, subj);
+						} else {
+							FreeIfNeeded(ptr[i].subj);
+							ptr[i].subj = my_strdup(subj);
+						}
 					}
-				}
 
 #ifdef DEBUG
-				if (debug) {
-					my_printf("6. buf=[%s]  Gsubj=[%s]\n", ptr[i].subj, glob_filter.filter[i].subj);
-					my_flush();
-				}
+					if (debug) {
+						my_printf("6. buf=[%s]  Gsubj=[%s]\n", ptr[i].subj, glob_filter.filter[i].subj);
+						my_flush();
+					}
 #endif /* DEBUG */
-				break;
-			}
+					break;
+				}
 
-			/*
-			 * read score for rule
-			 */
-			if (match_string(buf + 1, "core=", scbuf, PATH_LEN)) {
-				score = atoi(scbuf);
+				/*
+				 * read score for rule
+				 */
+				if (match_string(buf + 1, "core=", scbuf, PATH_LEN)) {
+					score = atoi(scbuf);
 #ifdef DEBUG
-				if (debug) {
-					my_printf("score=[%d]\n", score);
-					my_flush();
-				}
+					if (debug) {
+						my_printf("score=[%d]\n", score);
+						my_flush();
+					}
 #endif /* DEBUG */
-				if (ptr && !expired_time) {
-					if (score > SCORE_MAX)
-						score = SCORE_MAX;
-					else {
-						if (score < -SCORE_MAX)
-							score = -SCORE_MAX;
+					if (ptr && !expired_time) {
+						if (score > SCORE_MAX)
+							score = SCORE_MAX;
 						else {
-							if (!score) {
-								if (!strncasecmp(scbuf, "kill", 4))
-									score = tinrc.score_kill;
-								else {
-									if (!strncasecmp(scbuf, "hot", 3))
-										score = tinrc.score_select;
+							if (score < -SCORE_MAX)
+								score = -SCORE_MAX;
+							else {
+								if (!score) {
+									if (!strncasecmp(scbuf, "kill", 4))
+										score = tinrc.score_kill;
+									else {
+										if (!strncasecmp(scbuf, "hot", 3))
+											score = tinrc.score_select;
+									}
 								}
 							}
 						}
+						ptr[i].score = score;
 					}
-					ptr[i].score = score;
 				}
 				break;
-			}
-			break;
 
-		case 't':
-			if (match_long(buf + 1, "ime=", &secs)) {
-				if (ptr && !expired_time) {
-					ptr[i].time = (time_t) secs;
-					/* rule expired? */
-					if (secs && current_secs > (time_t) secs) {
+			case 't':
+				if (match_long(buf + 1, "ime=", &secs)) {
+					if (ptr && !expired_time) {
+						ptr[i].time = (time_t) secs;
+						/* rule expired? */
+						if (secs && current_secs > (time_t) secs) {
 #ifdef DEBUG
-						if (debug) {
-							my_printf("EXPIRED  secs=[%lu]  current_secs=[%lu]\n", (unsigned long int) secs, (unsigned long int) current_secs);
-							my_flush();
-						}
+							if (debug) {
+								my_printf("EXPIRED  secs=[%lu]  current_secs=[%lu]\n", (unsigned long int) secs, (unsigned long int) current_secs);
+								my_flush();
+							}
 #endif /* DEBUG */
-						glob_filter.num--;
-						expired_time = TRUE;
-						expired = TRUE;
+							glob_filter.num--;
+							expired_time = TRUE;
+							expired = TRUE;
+						}
 					}
 				}
 				break;
-			}
-			break;
 
-		case 'x':
-			/*
-			 * TODO: fromat has changed in FILTER_VERSION 1.0.0,
-			 *       should we comment out older xref rules like below?
-			 */
-			if (match_string(buf + 1, "ref=", xref, sizeof(xref))) {
-				if (ptr && !expired_time) {
-					if (tinrc.wildcard && ptr[i].xref != NULL) {
-						/* merge with already read value */
-						ptr[i].xref = my_realloc(ptr[i].xref, strlen(ptr[i].xref) + strlen(xref) + 2);
-						strcat(ptr[i].xref, "|");
-						strcat(ptr[i].xref, xref);
-					} else {
-						FreeIfNeeded(ptr[i].xref);
-						ptr[i].xref = my_strdup(xref);
+			case 'x':
+				/*
+				 * TODO: fromat has changed in FILTER_VERSION 1.0.0,
+				 *       should we comment out older xref rules like below?
+				 */
+				if (match_string(buf + 1, "ref=", xref, sizeof(xref))) {
+					if (ptr && !expired_time) {
+						if (tinrc.wildcard && ptr[i].xref != NULL) {
+							/* merge with already read value */
+							ptr[i].xref = my_realloc(ptr[i].xref, strlen(ptr[i].xref) + strlen(xref) + 2);
+							strcat(ptr[i].xref, "|");
+							strcat(ptr[i].xref, xref);
+						} else {
+							FreeIfNeeded(ptr[i].xref);
+							ptr[i].xref = my_strdup(xref);
+						}
 					}
-				}
-				break;
-			}
-			if (upgrade == RC_UPGRADE) {
-				char foo[HEADER_LEN];
-
-				if (match_string(buf + 1, "ref_max=", foo, LEN - 1)) {
-					/*
-					 * TODO: add to the right rule, give better explanation, -> lang.c
-					 */
-					snprintf(foo, HEADER_LEN, "%s%s", _("Removed from the previous rule: "), str_trim(buf));
-					comment = (struct t_filter_comment *) add_filter_comment(comment, foo);
 					break;
 				}
-				if (match_string(buf + 1, "ref_score=", foo, LEN - 1)) {
-					/*
-					 * TODO: add to the right rule, give better explanation, -> lang.c
-					 */
-					snprintf(foo, HEADER_LEN, "%s%s", _("Removed from the previous rule: "), str_trim(buf));
-					comment = (struct t_filter_comment *) add_filter_comment(comment, foo);
-					break;
+				if (upgrade == RC_UPGRADE) {
+					char foo[HEADER_LEN];
+
+					if (match_string(buf + 1, "ref_max=", foo, LEN - 1)) {
+						/*
+						 * TODO: add to the right rule, give better explanation, -> lang.c
+						 */
+						snprintf(foo, HEADER_LEN, "%s%s", _("Removed from the previous rule: "), str_trim(buf));
+						comment = add_filter_comment(comment, foo);
+						break;
+					}
+					if (match_string(buf + 1, "ref_score=", foo, LEN - 1)) {
+						/*
+						 * TODO: add to the right rule, give better explanation, -> lang.c
+						 */
+						snprintf(foo, HEADER_LEN, "%s%s", _("Removed from the previous rule: "), str_trim(buf));
+						comment = add_filter_comment(comment, foo);
+					}
 				}
-			}
-			break;
+				break;
 
-		default:
-			break;
+			default:
+				break;
 		}
 	}
 	fclose(fp);
 
-	if (expired || upgrade == RC_UPGRADE) {
+	if (expired || upgrade == RC_UPGRADE)
 		write_filter_file(file);
-	}
 
 	if (cmd_line && !batch_mode)
 		printf("\r\n");
@@ -687,7 +678,7 @@ write_filter_array(
 	struct t_filters *ptr)
 {
 	int i;
-	struct t_filter_comment *comment = (struct t_filter_comment *) 0;
+	struct t_filter_comment *comment;
 	time_t theTime = time(NULL);
 
 	if (ptr == NULL)
@@ -817,39 +808,69 @@ get_choice(
 	int x,
 	const char *help,
 	const char *prompt,
-	const char *opt1,
-	const char *opt2,
-	const char *opt3,
-	const char *opt4,
-	const char *opt5)
-{
-	const char *argv[5];
-	int ch, n = 0, i = 0;
-
-	if (opt1)
-		argv[n++] = opt1;
-	if (opt2)
-		argv[n++] = opt2;
-	if (opt3)
-		argv[n++] = opt3;
-	if (opt4)
-		argv[n++] = opt4;
-	if (opt5)
-		argv[n++] = opt5;
-	assert(n > 0);
+	char *list[],
+	int list_size)
+{
+	int ch, y, i = 0;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wchar_t *wbuf;
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 	if (help)
 		show_menu_help(help);
 
+	if (list == NULL || list_size < 1)
+		return -1;
+
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	if ((wbuf = char2wchar_t(prompt)) != NULL) {
+		wconvert_to_printable(wbuf);
+		if ((y = wcswidth(wbuf, wcslen(wbuf) + 1)) == -1) /* something went wrong, use wcslen() as fallback */
+			y = wcslen(wbuf);
+
+		free(wbuf);
+	} else
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+		y = (int) strlen(prompt);
+
 	do {
-		MoveCursor(x, (int) strlen(prompt));
-		my_fputs(argv[i], stdout);
+		MoveCursor(x, y);
+		my_fputs(list[i], stdout);
 		my_flush();
 		CleartoEOLN();
-		if ((ch = ReadCh()) != ' ')
-			continue;
-		if (++i == n)
-			i = 0;
+		ch = ReadCh();
+		switch (ch) {
+			case ' ':
+				i++;
+				i %= list_size;
+				break;
+
+			case ESC:	/* (ESC) common arrow keys */
+#	ifdef HAVE_KEY_PREFIX
+			case KEY_PREFIX:
+#	endif /* HAVE_KEY_PREFIX */
+				switch (get_arrow_key(ch)) {
+					case KEYMAP_UP:
+						i--;
+						if (i < 0)
+							i = list_size - 1;
+						ch = ' ';	/* don't exit the while loop yet */
+						break;
+
+					case KEYMAP_DOWN:
+						i++;
+						i %= list_size;
+						ch = ' ';	/* don't exit the while loop yet */
+						break;
+
+					default:
+						break;
+				}
+				break;
+
+			default:
+				break;
+		}
 	} while (ch != '\n' && ch != '\r' && ch != iKeyAbort); /* TODO: replace hardcoded keynames */
 
 	if (ch == iKeyAbort)
@@ -883,7 +904,7 @@ print_filter_menu(
 	MoveCursor(INDEX_TOP, 0);
 	my_printf("%s%s%s", ptr_filter_comment, cCRLF, cCRLF);
 	my_printf("%s%s", ptr_filter_text, cCRLF);
-	my_printf("%s%s%s",  _(txt_filter_text_type), cCRLF, cCRLF);
+	my_printf("%s%s%s", _(txt_filter_text_type), cCRLF, cCRLF);
 	my_printf("%s%s", text_subj, cCRLF);
 	my_printf("%s%s", text_from, cCRLF);
 	my_printf("%s%s%s", text_msgid, cCRLF, cCRLF);
@@ -915,12 +936,53 @@ refresh_filter_menu(
 
 
 /*
+ * a help function for filter_menu
+ * formats a menu option in a multibyte-safe way
+ *
+ * this function in closely tight to the way how the filter menu is build
+ */
+static void
+fmt_filter_menu_prompt(
+	char *dest,		/* where to store the resulting string */
+	size_t dest_len,	/* size of dest */
+	const char *fmt_str,	/* format string */
+	int len,		/* maximal len of the include string */
+	const char *text)	/* the include string */
+{
+	char *buf;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wchar_t *wbuf, *wbuf2;
+
+	if ((wbuf = char2wchar_t(text)) != NULL) {
+		wbuf2 = wcspart(wbuf, len, TRUE);
+		if ((buf = wchar_t2char(wbuf2)) == NULL) {
+			/* conversion failed, truncate original string */
+			buf = my_malloc(len + 1);
+			snprintf(buf, len + 1, "%-*.*s", len, len, text);
+		}
+
+		free(wbuf);
+		free(wbuf2);
+	} else
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	{
+		buf = my_malloc(len + 1);
+		snprintf(buf, len + 1, "%-*.*s", len, len, text);
+	}
+	snprintf(dest, dest_len, fmt_str, buf);
+	free(buf);
+
+	return;
+}
+
+
+/*
  * Interactive filter menu so that the user can dynamically enter parameters.
  * Can be configured for kill or auto-selection screens.
  */
 t_bool
 filter_menu(
-	int type,
+	t_function type,
 	struct t_group *group,
 	struct t_article *art)
 {
@@ -930,18 +992,21 @@ filter_menu(
 	const char *ptr_filter_help_scope;
 	const char *ptr_filter_quit_edit_save;
 	char *ptr;
+	char **list;
 	char comment_line[LEN];
-	char argv[4][PATH_LEN];
 	char buf[LEN];
 	char keyedit[MAXKEYLEN], keyquit[MAXKEYLEN], keysave[MAXKEYLEN];
 	char text_time[PATH_LEN];
 	char double_time[PATH_LEN];
 	char quat_time[PATH_LEN];
-	char ch_default = iKeyFilterSave;
-	int ch, i, len;
+	int i, len, clen = 0, flen = 0;
 	struct t_filter_rule rule;
 	t_bool proceed;
 	t_bool ret;
+	t_function func, default_func = FILTER_SAVE;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wchar_t *wbuf;
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 	signal_context = cFilter;
 
@@ -966,11 +1031,11 @@ filter_menu(
 	/*
 	 * setup correct text for user selected menu
 	 */
-	(void) printascii(keyedit, map_to_local(iKeyFilterEdit, &menukeymap.filter_quit_edit_save));
-	(void) printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.filter_quit_edit_save));
-	(void) printascii(keysave, map_to_local(iKeyFilterSave, &menukeymap.filter_quit_edit_save));
+	printascii(keyedit, func_to_key(FILTER_EDIT, filter_keys));
+	printascii(keyquit, func_to_key(GLOBAL_QUIT, filter_keys));
+	printascii(keysave, func_to_key(FILTER_SAVE, filter_keys));
 
-	if (type == FILTER_KILL) {
+	if (type == GLOBAL_MENU_FILTER_KILL) {
 		ptr_filter_from = _(txt_kill_from);
 		ptr_filter_lines = _(txt_kill_lines);
 		ptr_filter_menu = _(txt_kill_menu);
@@ -981,7 +1046,7 @@ filter_menu(
 		ptr_filter_time = _(txt_kill_time);
 		ptr_filter_help_scope = _(txt_help_kill_scope);
 		ptr_filter_quit_edit_save = _(txt_quit_edit_save_kill);
-	} else {
+	} else {	/* type == GLOBAL_MENU_FILTER_SELECT */
 		ptr_filter_from = _(txt_select_from);
 		ptr_filter_lines = _(txt_select_lines);
 		ptr_filter_menu = _(txt_select_menu);
@@ -997,14 +1062,56 @@ filter_menu(
 	ptr_filter_comment = _(txt_filter_comment);
 	ptr_filter_groupname = group->name;
 
-	len = cCOLS - 30;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	if ((wbuf = char2wchar_t(_(txt_no))) != NULL) {
+		clen = MAX(clen, wcswidth(wbuf, wcslen(wbuf)));
+		free(wbuf);
+	}
+	if ((wbuf = char2wchar_t(_(txt_yes))) != NULL) {
+		clen = MAX(clen, wcswidth(wbuf, wcslen(wbuf)));
+		free(wbuf);
+	}
+	if ((wbuf = char2wchar_t(_(txt_full))) != NULL) {
+		clen = MAX(clen, wcswidth(wbuf, wcslen(wbuf)));
+		free(wbuf);
+	}
+	if ((wbuf = char2wchar_t(_(txt_last))) != NULL) {
+		clen = MAX(clen, wcswidth(wbuf, wcslen(wbuf)));
+		free(wbuf);
+	}
+	if ((wbuf = char2wchar_t(_(txt_only))) != NULL) {
+		clen = MAX(clen, wcswidth(wbuf, wcslen(wbuf)));
+		free(wbuf);
+	}
+	if ((wbuf = char2wchar_t(ptr_filter_subj)) != NULL) {
+		flen = MAX(flen, wcswidth(wbuf, wcslen(wbuf)) - 2);
+		free(wbuf);
+	}
+	if ((wbuf = char2wchar_t(ptr_filter_from)) != NULL) {
+		flen = MAX(flen, wcswidth(wbuf, wcslen(wbuf)) - 2);
+		free(wbuf);
+	}
+	if ((wbuf = char2wchar_t(ptr_filter_msgid)) != NULL) {
+		flen = MAX(flen, wcswidth(wbuf, wcslen(wbuf)) - 2);
+		free(wbuf);
+	}
+#else
+	clen = MAX(clen, (int) strlen(_(txt_no)));
+	clen = MAX(clen, (int) strlen(_(txt_yes)));
+	clen = MAX(clen, (int) strlen(_(txt_full)));
+	clen = MAX(clen, (int) strlen(_(txt_last)));
+	clen = MAX(clen, (int) strlen(_(txt_only)));
+	flen = MAX(flen, (int) strlen(ptr_filter_subj) - 2);
+	flen = MAX(flen, (int) strlen(ptr_filter_from) - 2);
+	flen = MAX(flen, (int) strlen(ptr_filter_msgid) - 2);
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	len = cCOLS - flen - clen - 1 + 4;
 
 	snprintf(text_time, sizeof(text_time), _(txt_time_default_days), tinrc.filter_days);
-	snprintf(text_subj, sizeof(text_subj), ptr_filter_subj, len, len, art->subject);
-	snprintf(text_score, sizeof(text_score), _(txt_filter_score), (type == FILTER_KILL ? -tinrc.score_kill : tinrc.score_select));
-	STRCPY(buf, art->from);
-	snprintf(text_from, sizeof(text_from), ptr_filter_from, len, len, buf);
-	snprintf(text_msgid, sizeof(text_msgid), ptr_filter_msgid, len - 4, len - 4, MSGID(art));
+	fmt_filter_menu_prompt(text_subj, sizeof(text_subj), ptr_filter_subj, len, art->subject);
+	snprintf(text_score, sizeof(text_score), _(txt_filter_score), (type == GLOBAL_MENU_FILTER_KILL ? -tinrc.score_kill : tinrc.score_select));
+	fmt_filter_menu_prompt(text_from, sizeof(text_from), ptr_filter_from, len, art->from);
+	fmt_filter_menu_prompt(text_msgid, sizeof(text_msgid), ptr_filter_msgid, len - 4, MSGID(art));
 
 	print_filter_menu();
 
@@ -1033,13 +1140,16 @@ filter_menu(
 	}
 
 	if (*rule.text) {
-		i = get_choice(INDEX_TOP + 3, _(txt_help_filter_text_type),
-			       _(txt_filter_text_type),
-			       _(txt_subj_line_only_case),
-			       _(txt_subj_line_only),
-			       _(txt_from_line_only_case),
-			       _(txt_from_line_only),
-			       _(txt_msgid_line_only));
+		list = my_malloc(sizeof(char *) * 5);
+		list[0] = (char *) _(txt_subj_line_only_case);
+		list[1] = (char *) _(txt_subj_line_only);
+		list[2] = (char *) _(txt_from_line_only_case);
+		list[3] = (char *) _(txt_from_line_only);
+		list[4] = (char *) _(txt_msgid_line_only);
+
+		i = get_choice(INDEX_TOP + 3, _(txt_help_filter_text_type), _(txt_filter_text_type), list, 5);
+		free(list);
+
 		if (i == -1) {
 			rule.comment = free_filter_comment(rule.comment);
 			return FALSE;
@@ -1072,7 +1182,12 @@ filter_menu(
 		/*
 		 * Subject:
 		 */
-		i = get_choice(INDEX_TOP + 5, _(txt_help_filter_subj), text_subj, _(txt_yes), _(txt_no), (char *) 0, (char *) 0, (char *) 0);
+		list = my_malloc(sizeof(char *) * 2);
+		list[0] = (char *) _(txt_yes);
+		list[1] = (char *) _(txt_no);
+		i = get_choice(INDEX_TOP + 5, _(txt_help_filter_subj), text_subj, list, 2);
+		free(list);
+
 		if (i == -1) {
 			rule.comment = free_filter_comment(rule.comment);
 			return FALSE;
@@ -1082,7 +1197,17 @@ filter_menu(
 		/*
 		 * From:
 		 */
-		i = get_choice(INDEX_TOP + 6, _(txt_help_filter_from), text_from, (rule.subj_ok ? _(txt_no) : _(txt_yes)), (rule.subj_ok ? _(txt_yes) : _(txt_no)), (char *) 0, (char *) 0, (char *) 0);
+		list = my_malloc(sizeof(char *) * 2);
+		if (rule.subj_ok) {
+			list[0] = (char *) _(txt_no);
+			list[1] = (char *) _(txt_yes);
+		} else {
+			list[0] = (char *) _(txt_yes);
+			list[1] = (char *) _(txt_no);
+		}
+		i = get_choice(INDEX_TOP + 6, _(txt_help_filter_from), text_from, list, 2);
+		free(list);
+
 		if (i == -1) {
 			rule.comment = free_filter_comment(rule.comment);
 			return FALSE;
@@ -1092,10 +1217,20 @@ filter_menu(
 		/*
 		 * Message-ID:
 		 */
-		if (rule.subj_ok || rule.from_ok)
-			i = get_choice(INDEX_TOP + 7, _(txt_help_filter_msgid), text_msgid, _(txt_no), _(txt_full), _(txt_last), _(txt_only), (char *) 0);
-		else
-			i = get_choice(INDEX_TOP + 7, _(txt_help_filter_msgid), text_msgid, _(txt_full), _(txt_last), _(txt_only), _(txt_no), (char *) 0);
+		list = my_malloc(sizeof(char *) * 4);
+		if (rule.subj_ok || rule.from_ok) {
+			list[0] = (char *) _(txt_no);
+			list[1] = (char *) _(txt_full);
+			list[2] = (char *) _(txt_last);
+			list[3] = (char *) _(txt_only);
+		} else {
+			list[0] = (char *) _(txt_full);
+			list[1] = (char *) _(txt_last);
+			list[2] = (char *) _(txt_only);
+			list[3] = (char *) _(txt_no);
+		}
+		i = get_choice(INDEX_TOP + 7, _(txt_help_filter_msgid), text_msgid, list, 4);
+		free(list);
 
 		if (i == -1) {
 			rule.comment = free_filter_comment(rule.comment);
@@ -1184,9 +1319,9 @@ filter_menu(
 		rule.score = atoi(buf);
 	else {
 		/* use default score */
-		if (type == FILTER_KILL)
+		if (type == GLOBAL_MENU_FILTER_KILL)
 			rule.score = tinrc.score_kill;
-		else /* type == FILTER_SELECT */
+		else /* type == GLOBAL_MENU_FILTER_SELECT */
 			rule.score = tinrc.score_select;
 	}
 
@@ -1204,16 +1339,21 @@ filter_menu(
 		rule.score = SCORE_MAX;
 
 	/* get the right sign for the score */
-	if (type == FILTER_KILL)
+	if (type == GLOBAL_MENU_FILTER_KILL)
 		rule.score = -rule.score;
 
 	/*
 	 * Expire time
 	 */
-	sprintf(double_time, "2x %s", text_time);
-	sprintf(quat_time, "4x %s", text_time);
-	i = get_choice(INDEX_TOP + 11, _(txt_help_filter_time), ptr_filter_time,
-			_(txt_unlimited_time), text_time, double_time, quat_time, (char *) 0);
+	snprintf(double_time, sizeof(double_time), "2x %s", text_time);
+	snprintf(quat_time, sizeof(double_time), "4x %s", text_time);
+	list = my_malloc(sizeof(char *) * 4);
+	list[0] = (char *) _(txt_unlimited_time);
+	list[1] = text_time;
+	list[2] = double_time;
+	list[3] = quat_time;
+	i = get_choice(INDEX_TOP + 11, _(txt_help_filter_time), ptr_filter_time, list, 4);
+	free(list);
 
 	if (i == -1) {
 		rule.comment = free_filter_comment(rule.comment);
@@ -1226,55 +1366,45 @@ filter_menu(
 	 * Scope
 	 */
 	if (*rule.text || rule.subj_ok || rule.from_ok || rule.msgid_ok || rule.lines_ok) {
-		strcpy(argv[0], group->name);
-		strcpy(argv[1], _(txt_all_groups));
-		strcpy(argv[2], group->name);
-		ptr = strrchr(argv[2], '.');
-		if (ptr != NULL) {
-			ptr++;
-			*(ptr++) = '*';
-			*ptr = '\0';
-			strcpy(argv[3], argv[2]);
-			argv[3][strlen(argv[3]) - 2] = '\0';
-			ptr = strrchr(argv[3], '.');
-			if (ptr != NULL) {
-				ptr++;
-				*(ptr++) = '*';
-				*ptr = '\0';
-			} else
-				argv[3][0] = '\0';
-
-		} else
-			argv[2][0] = '\0';
+		int j = 0;
 
-		i = get_choice(INDEX_TOP + 13, ptr_filter_help_scope,
-			       ptr_filter_scope,
-			       (argv[0][0] ? argv[0] : (char *) 0),
-			       (argv[1][0] ? argv[1] : (char *) 0),
-			       (argv[2][0] ? argv[2] : (char *) 0),
-			       (argv[3][0] ? argv[3] : (char *) 0),
-			       (char *) 0);
+		list = my_malloc(sizeof(char *) * 2); /* at least 2 scopes */
+		list[j++] = my_strdup(group->name);
+		list[j] = my_strdup(list[j - 1]);
+		while ((ptr = strrchr(list[j], '.')) != NULL) {
+			*(++ptr) = '*';
+			*(++ptr) = '\0';
+			j++;
+			list = my_realloc(list, sizeof(char *) * (j + 1)); /* one element more */
+			list[j] = my_strdup(list[j - 1]);
+			list[j][strlen(list[j]) - 2] = '\0';
+		}
+		free(list[j]); /* this copy isn't needed anymore */
+		list[j] = (char *) _(txt_all_groups);
+
+		if ((i = get_choice(INDEX_TOP + 13, ptr_filter_help_scope, ptr_filter_scope, list, j + 1)) > 0)
+			strncpy(rule.scope, i == j ? "*" : list[i], sizeof(rule.scope));
+
+		for (j--; j >= 0; j--)
+			free(list[j]);
+		free(list);
 
 		if (i == -1) {
 			rule.comment = free_filter_comment(rule.comment);
 			return FALSE;
 		}
-
-		strcpy(rule.scope, ((i == 1) ? "*" : argv[i]));
 	} else {
 		rule.comment = free_filter_comment(rule.comment);
 		return FALSE;
 	}
 
 	forever {
-		ch = prompt_slk_response(ch_default,
-				&menukeymap.filter_quit_edit_save,
-				ptr_filter_quit_edit_save,
-				keyquit, keyedit, keysave);
-		switch (ch) {
+		func = prompt_slk_response(default_func, filter_keys,
+				ptr_filter_quit_edit_save, keyquit, keyedit, keysave);
+		switch (func) {
 
-		case iKeyFilterEdit:
-			add_filter_rule(group, art, &rule); /* save the rule */
+		case FILTER_EDIT:
+			add_filter_rule(group, art, &rule, FALSE); /* save the rule */
 			rule.comment = free_filter_comment(rule.comment);
 			if (!invoke_editor(filter_file, FILTER_FILE_OFFSET))
 				return FALSE;
@@ -1284,18 +1414,18 @@ filter_menu(
 			/* keep lint quiet: */
 			/* FALLTHROUGH */
 
-		case iKeyQuit:
-		case iKeyAbort:
+		case GLOBAL_QUIT:
+		case GLOBAL_ABORT:
 			rule.comment = free_filter_comment(rule.comment);
 			return FALSE;
 			/* keep lint quiet: */
 			/* FALLTHROUGH */
 
-		case iKeyFilterSave:
+		case FILTER_SAVE:
 			/*
 			 * Add the filter rule and save it to the filter file
 			 */
-			ret = add_filter_rule(group, art, &rule);
+			ret = add_filter_rule(group, art, &rule, FALSE);
 			rule.comment = free_filter_comment(rule.comment);
 			return ret;
 			/* keep lint quiet: */
@@ -1315,7 +1445,7 @@ filter_menu(
  */
 t_bool
 quick_filter(
-	int type,
+	t_function type,
 	struct t_group *group,
 	struct t_article *art)
 {
@@ -1325,12 +1455,12 @@ quick_filter(
 	struct t_filter_rule rule;
 	t_bool ret;
 
-	if (type == FILTER_KILL) {
+	if (type == GLOBAL_QUICK_FILTER_KILL) {
 		header = group->attribute->quick_kill_header;
 		expire = group->attribute->quick_kill_expire;
 		icase = group->attribute->quick_kill_case;
 		scope = group->attribute->quick_kill_scope;
-	} else {
+	} else {	/* type == GLOBAL_QUICK_FILTER_SELECT */
 		header = group->attribute->quick_select_header;
 		expire = group->attribute->quick_select_expire;
 		icase = group->attribute->quick_select_case;
@@ -1340,7 +1470,7 @@ quick_filter(
 #ifdef DEBUG
 	if (debug)
 		error_message("%s header=[%d] scope=[%s] expire=[%s] case=[%d]",
-			(type == FILTER_KILL) ? "KILL" : "SELECT", header,
+			(type == GLOBAL_QUICK_FILTER_KILL) ? "KILL" : "SELECT", header,
 			BlankIfNull(scope), txt_onoff[expire != FALSE ? 1 : 0], icase);
 #endif /* DEBUG */
 
@@ -1358,19 +1488,19 @@ quick_filter(
 	rule.subj_ok = (header == FILTER_SUBJ_CASE_SENSITIVE || header == FILTER_SUBJ_CASE_IGNORE);
 
 	/* create an auto-comment. */
-	if (type == FILTER_KILL)
-		snprintf(txt, sizeof(txt), "%s%s%c%s%s%s", _(txt_filter_rule_created), "'", iKeyGroupQuickKill, "' (", _(txt_help_article_quick_kill), ").");
+	if (type == GLOBAL_QUICK_FILTER_KILL)
+		snprintf(txt, sizeof(txt), "%s%s%c%s%s%s", _(txt_filter_rule_created), "'", ']', "' (", _(txt_help_article_quick_kill), ").");
 	else
-		snprintf(txt, sizeof(txt), "%s%s%c%s%s%s", _(txt_filter_rule_created), "'", iKeyGroupQuickAutoSel, "' (", _(txt_help_article_quick_select), ").");
+		snprintf(txt, sizeof(txt), "%s%s%c%s%s%s", _(txt_filter_rule_created), "'", '[', "' (", _(txt_help_article_quick_select), ").");
 	rule.comment = add_filter_comment(NULL, txt);
 
 	rule.text[0] = '\0';
 	rule.icase = icase;
 	rule.expire_time = expire;
 	rule.check_string = TRUE;
-	rule.score = (type == FILTER_KILL) ? tinrc.score_kill : tinrc.score_select;
+	rule.score = (type == GLOBAL_QUICK_FILTER_KILL) ? tinrc.score_kill : tinrc.score_select;
 
-	ret = add_filter_rule(group, art, &rule);
+	ret = add_filter_rule(group, art, &rule, TRUE);
 	rule.comment = free_filter_comment(rule.comment);
 	return ret;
 }
@@ -1451,10 +1581,10 @@ quick_filter_select_posted_art(
 			/* Hack */
 			art.refptr = (struct t_msgid *) &refptr_dummyart;
 
-			filtered = add_filter_rule(group, &art, &rule);
+			filtered = add_filter_rule(group, &art, &rule, FALSE);
 		} else {
 			art.subject = my_strdup(subj);
-			filtered = add_filter_rule(group, &art, &rule);
+			filtered = add_filter_rule(group, &art, &rule, FALSE);
 			FreeIfNeeded(art.subject);
 		}
 		rule.comment = free_filter_comment(rule.comment);
@@ -1470,7 +1600,8 @@ static t_bool
 add_filter_rule(
 	struct t_group *group,
 	struct t_article *art,
-	struct t_filter_rule *rule)
+	struct t_filter_rule *rule,
+	t_bool quick_filter_rule)
 {
 	char acBuf[PATH_LEN];
 	char sbuf[(sizeof(acBuf) / 2)]; /* half as big as acBuf so quote_wild(sbuf) fits into acBuf */
@@ -1488,16 +1619,16 @@ add_filter_rule(
 	ptr[i].inscope = TRUE;
 	ptr[i].fullref = FILTER_MSGID;
 	ptr[i].comment = (struct t_filter_comment *) 0;
-	ptr[i].scope = (char *) 0;
-	ptr[i].subj = (char *) 0;
-	ptr[i].from = (char *) 0;
-	ptr[i].msgid = (char *) 0;
+	ptr[i].scope = NULL;
+	ptr[i].subj = NULL;
+	ptr[i].from = NULL;
+	ptr[i].msgid = NULL;
 	ptr[i].lines_cmp = rule->lines_cmp;
 	ptr[i].lines_num = rule->lines_num;
 	ptr[i].gnksa_cmp = FILTER_LINES_NO;
 	ptr[i].gnksa_num = 0;
 	ptr[i].score = rule->score;
-	ptr[i].xref = (char *) 0;
+	ptr[i].xref = NULL;
 
 	if (rule->comment != NULL)
 		ptr[i].comment = copy_filter_comment(rule->comment, ptr[i].comment);
@@ -1530,7 +1661,7 @@ add_filter_rule(
 
 	ptr[i].icase = rule->icase;
 	if (*rule->text) {
-		sprintf(acBuf, REGEX_FMT, quote_wild_whitespace(rule->text));
+		snprintf(acBuf, sizeof(acBuf), REGEX_FMT, quote_wild_whitespace(rule->text));
 
 		switch (rule->counter) {
 			case FILTER_SUBJ_CASE_IGNORE:
@@ -1565,12 +1696,12 @@ add_filter_rule(
 		 */
 		if (rule->subj_ok) {
 			STRCPY(sbuf, art->subject);
-			sprintf(acBuf, REGEX_FMT, (rule->check_string ? quote_wild(sbuf) : sbuf));
+			snprintf(acBuf, sizeof(acBuf), REGEX_FMT, (rule->check_string ? quote_wild(sbuf) : sbuf));
 			ptr[i].subj = my_strdup(acBuf);
 		}
 		if (rule->from_ok) {
 			STRCPY(sbuf, art->from);
-			sprintf(acBuf, REGEX_FMT, quote_wild(sbuf));
+			snprintf(acBuf, sizeof(acBuf), REGEX_FMT, quote_wild(sbuf));
 			ptr[i].from = my_strdup(acBuf);
 		}
 		/*
@@ -1590,8 +1721,7 @@ add_filter_rule(
 			 * So the thread remains open (in group level). To overcome this,
 			 * the first msgid from references field is taken in this case.
 			 */
-#if 1	/* This is what I think is more correct, but I did NOT test it! (urs) */
-			if (group->attribute->thread_arts == THREAD_REFS &&
+			if (quick_filter_rule && group->attribute->thread_arts == THREAD_REFS &&
 				(group->attribute->quick_kill_header == FILTER_MSGID ||
 				 group->attribute->quick_kill_header == FILTER_REFS_ONLY) &&
 				 art->refptr->parent != NULL)
@@ -1605,24 +1735,7 @@ add_filter_rule(
 			} else {
 				STRCPY(sbuf, MSGID(art));
 			}
-#else /* original logic by guido */
-			if (group->attribute->thread_arts != THREAD_REFS ||
-				origin != GROUP_LEVEL ||
-				(group->attribute->quick_kill_header != FILTER_MSGID &&
-				group->attribute->quick_kill_header != FILTER_MSGID_LAST)
-				(art->refptr->parent == NULL))
-			{
-				STRCPY(sbuf, MSGID(art));
-			} else {
-				/* not real parent, take first references entry as MID */
-				struct t_msgid *xptr;
-
-				for (xptr = art->refptr->parent; xptr->parent != NULL; xptr = xptr->parent)
-					;
-				STRCPY(sbuf, xptr->txt);
-			}
-#endif /* 1 */
-			sprintf(acBuf, REGEX_FMT, quote_wild(sbuf));
+			snprintf(acBuf, sizeof(acBuf), REGEX_FMT, quote_wild(sbuf));
 			ptr[i].msgid = my_strdup(acBuf);
 			ptr[i].fullref = rule->fullref;
 		}
@@ -1694,6 +1807,7 @@ filter_articles(
 	struct regex_cache *regex_cache_msgid = NULL;
 	struct regex_cache *regex_cache_xref = NULL;
 	t_bool filtered = FALSE;
+	t_bool error = FALSE;
 
 	/*
 	 * check if there are any global filter rules
@@ -1737,30 +1851,33 @@ filter_articles(
 			regex_cache_xref[j].extra = NULL;
 		}
 	}
-	mesg[0] = '\0';				/* Clear system message field */
 
 	/*
 	 * loop thru all arts applying global & local filtering rules
 	 */
-	for (i = 0; (i < top_art) && (mesg[0] == '\0'); i++) {
+	for (i = 0; (i < top_art) && !error; i++) {
 		arts[i].score = 0;
 
-		/*
-		 * do we really need to 'reset' mesg for every article?
-		 */
-		mesg[0] = '\0';				/* Clear system message field */
-
 		if (tinrc.kill_level == KILL_UNREAD && IS_READ(i)) /* skip only when the article is read */
 			continue;
 
-		for (j = 0; j < num; j++) {
+		for (j = 0; j < num && !error; j++) {
 			if (ptr[j].inscope) {
 				/*
 				 * Filter on Subject: line
 				 */
 				if (ptr[j].subj != NULL) {
-					if (test_regex(arts[i].subject, ptr[j].subj, ptr[j].icase, &regex_cache_subj[j])) {
-						SET_FILTER(group, i, j);
+					switch (test_regex(arts[i].subject, ptr[j].subj, ptr[j].icase, &regex_cache_subj[j])) {
+						case 1:
+							SET_FILTER(group, i, j);
+							break;
+
+						case -1:
+							error = TRUE;
+							break;
+
+						default:
+							break;
 					}
 				}
 
@@ -1769,11 +1886,21 @@ filter_articles(
 				 */
 				if (ptr[j].from != NULL) {
 					if (arts[i].name != NULL)
-						sprintf(buf, "%s (%s)", arts[i].from, arts[i].name);
+						snprintf(buf, sizeof(buf), "%s (%s)", arts[i].from, arts[i].name);
 					else
 						strcpy(buf, arts[i].from);
-					if (test_regex(buf, ptr[j].from, ptr[j].icase, &regex_cache_from[j])) {
-						SET_FILTER(group, i, j);
+
+					switch (test_regex(buf, ptr[j].from, ptr[j].icase, &regex_cache_from[j])) {
+						case 1:
+							SET_FILTER(group, i, j);
+							break;
+
+						case -1:
+							error = TRUE;
+							break;
+
+						default:
+							break;
 					}
 				}
 
@@ -1784,10 +1911,11 @@ filter_articles(
 				 * Case is important here
 				 */
 				if (ptr[j].msgid != NULL) {
-					struct t_article *art = &arts[i];
 					char *refs = NULL;
 					const char *myrefs = NULL;
 					const char *mymsgid = NULL;
+					int x;
+					struct t_article *art = &arts[i];
 					/*
 					 * TODO: nice idea del'd; better apply one rule on all
 					 *       fitting articles, so we can switch to an appropriate
@@ -1805,7 +1933,7 @@ filter_articles(
 							break;
 
 						case FILTER_MSGID_LAST:
-							myrefs = (art->refptr->parent) ? art->refptr->parent->txt : "";
+							myrefs = art->refptr ? (art->refptr->parent ? art->refptr->parent->txt : "") : "";
 							mymsgid = MSGID(art);
 							break;
 
@@ -1825,10 +1953,20 @@ filter_articles(
 							break;
 					}
 
-					if (test_regex(myrefs, ptr[j].msgid, FALSE, &regex_cache_msgid[j])) {
-						SET_FILTER(group, i, j);
-					} else if (test_regex(mymsgid, ptr[j].msgid, FALSE, &regex_cache_msgid[j])) {
-						SET_FILTER(group, i, j);
+					if ((x = test_regex(myrefs, ptr[j].msgid, FALSE, &regex_cache_msgid[j])) == 0) /* no match */
+						x = test_regex(mymsgid, ptr[j].msgid, FALSE, &regex_cache_msgid[j]);
+
+					switch (x) {
+						case 1:
+							SET_FILTER(group, i, j);
+							break;
+
+						case -1:
+							error = TRUE;
+							break;
+
+						default:
+							break;
 					}
 					FreeIfNeeded(refs);
 				}
@@ -1922,17 +2060,26 @@ wait_message(1, "FILTERED Lines arts[%d]
 								*e++ = ',';
 								skip = TRUE;
 							}
-							if (*s != ':' && !isspace(*s) && !skip)
+							if (*s != ':' && !isspace((int) *s) && !skip)
 								*e++ = *s;
-							if (isspace(*s))
+							if (isspace((int) *s))
 								skip = FALSE;
 							s++;
 						}
 						*--e = '\0';
 
 						if (ptr[j].xref != NULL) {
-							if (test_regex(k, ptr[j].xref, ptr[j].icase, &regex_cache_xref[j])) {
-								SET_FILTER(group, i, j);
+							switch (test_regex(k, ptr[j].xref, ptr[j].icase, &regex_cache_xref[j])) {
+								case 1:
+									SET_FILTER(group, i, j);
+									break;
+
+								case -1:
+									error = TRUE;
+									break;
+
+								default:
+									break;
 							}
 						}
 						free(k);
@@ -1942,9 +2089,6 @@ wait_message(1, "FILTERED Lines arts[%d]
 		}
 	}
 
-	if (mesg[0] != '\0')
-		error_message(mesg);
-
 	/*
 	 * throw away the contents of all regex_caches
 	 */
@@ -1969,7 +2113,7 @@ wait_message(1, "FILTERED Lines arts[%d]
 	 * now entering the main filter loop:
 	 * all articles have scored, so do kill & select
 	 */
-	if (mesg[0] == '\0') {
+	if (!error) {
 		for_each_art(i) {
 			if (arts[i].score <= tinrc.score_limit_kill) {
 				if (arts[i].status == ART_UNREAD)
@@ -2011,3 +2155,26 @@ set_filter_scope(
 	}
 	return inscope;
 }
+
+
+/*
+ * This will come in useful for filtering on non-overview hdr fields
+ */
+#if 0
+static FILE *
+open_xhdr_fp(
+	char *header,
+	long min,
+	long max)
+{
+#	ifdef NNTP_ABLE
+	if (read_news_via_nntp && !read_saved_news && nntp_caps.hdr_cmd) {
+		char buf[NNTP_STRLEN];
+
+		snprintf(buf, sizeof(buf), "%s %s %ld-%ld", nntp_caps.hdr_cmd, header, min, max);
+		return (nntp_command(buf, OK_HEAD, NULL, 0));
+	} else
+#	endif /* NNTP_ABLE */
+		return (FILE *) 0;		/* Some trick implementation for local spool... */
+}
+#endif /* 0 */
diff -Nurp tin-1.6.2/src/getline.c tin-1.8.0/src/getline.c
--- tin-1.6.2/src/getline.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/getline.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,7 +3,7 @@
  *  Module    : getline.c
  *  Author    : Chris Thewalt & Iain Lea
  *  Created   : 1991-11-09
- *  Updated   : 2003-08-03
+ *  Updated   : 2004-07-02
  *  Notes     : emacs style line editing input package.
  *  Copyright : (c) Copyright 1991-99 by Chris Thewalt & Iain Lea
  *              Permission to use, copy, modify, and distribute this
@@ -23,7 +23,6 @@
 #endif /* !TCURSES_H */
 
 #define BUF_SIZE	1024
-#define SCROLL		30
 #define TABSIZE		4
 
 #define CTRL_A	'\001'
@@ -66,7 +65,6 @@ static t_bool is_passwd;
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 static void gl_del(int loc);
 static void gl_fixup(int change, int cursor);
-static void gl_redraw(void);
 static void gl_newline(int w);
 static void gl_kill(void);
 static void gl_kill_back_word(void);
@@ -100,6 +98,8 @@ tin_getline(
 	char *buf = gl_buf;
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
+	input_context = cGetline;
+
 	is_passwd = passwd;
 
 	set_xclick_off();
@@ -135,12 +135,12 @@ tin_getline(
 
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 	if (str != NULL) {
-		wchar_t wbuf[LEN];
+		wchar_t *wbuf;
 
-		if (mbstowcs(wbuf, str, ARRAY_SIZE(wbuf) - 1) != (size_t) -1) {
-			wbuf[ARRAY_SIZE(wbuf) - 1] = (wchar_t) '\0';
+		if ((wbuf = char2wchar_t(str)) != NULL) {
 			for (i = 0; wbuf[i]; i++)
 				gl_addwchar(wbuf[i]);
+			free(wbuf);
 		}
 	}
 
@@ -227,7 +227,8 @@ tin_getline(
 							break;
 
 						default:
-							return (char *) 0;
+							input_context = cNone;
+							return NULL;
 					}
 					break;
 
@@ -237,6 +238,7 @@ tin_getline(
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 					wcstombs(buf, gl_buf, BUF_SIZE - 1);
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+					input_context = cNone;
 					return buf;
 
 				case CTRL_A:
@@ -254,6 +256,7 @@ tin_getline(
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 						wcstombs(buf, gl_buf, BUF_SIZE - 1);
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+						input_context = cNone;
 						return buf;
 					} else
 						gl_del(0);
@@ -314,6 +317,7 @@ tin_getline(
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 	wcstombs(buf, gl_buf, BUF_SIZE - 1);
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	input_context = cNone;
 	return buf;
 }
 
@@ -493,15 +497,21 @@ gl_kill_back_word(
 /*
  * emit a newline, reset and redraw prompt and current input line
  */
-static void
+void
 gl_redraw(
 	void)
 {
-	if (gl_init_done == -1) {
+	if (gl_init_done == -1) {	/* terminal */
 		my_fputc('\n', stdout);
 		my_fputs(gl_prompt, stdout);
 		gl_pos = 0;
 		gl_fixup(0, BUF_SIZE);
+	} else if (gl_init_done == 0) {	/* screen */
+		clear_message();
+		my_fputs(gl_prompt, stdout);
+		gl_pos = 0;
+		gl_fixup(0, BUF_SIZE);
+		cursoron();
 	}
 }
 
@@ -529,6 +539,8 @@ gl_fixup(
 	int new_shift;		/* value of shift based on cursor */
 	int extra;		/* adjusts when shift (scroll) happens */
 	int i;
+	/* FIXME: there are some small problems if SCROLL >= gl_width - 2 */
+	int SCROLL = MIN(30, gl_width - 3);
 
 	if (change == -1 && cursor == 0 && gl_buf[0] == 0) {	/* reset */
 		gl_shift = off_right = off_left = 0;
@@ -667,24 +679,18 @@ hist_add(
 {
 	char *p;
 	char *tmp;
-#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	int size = wcstombs(NULL, gl_buf, 0);
 
-	tmp = my_malloc(size + 1);
-	if (wcstombs(tmp, gl_buf, size) == (size_t) -1) {
-		/* conversation failed */
-		free(tmp);
+	if (w == HIST_NONE)
+		return;
+
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	if ((tmp = wchar_t2char(gl_buf)) == NULL)
 		return;
-	} else
-		tmp[size] = '\0';
 #else
 	tmp = my_strdup(gl_buf);
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-	p = tmp;
-
-	if (w == HIST_NONE)
-		return;
 
+	p = tmp;
 	while (*p == ' ' || *p == '\t')		/* only save nonblank line */
 		p++;
 
diff -Nurp tin-1.6.2/src/global.c tin-1.8.0/src/global.c
--- tin-1.6.2/src/global.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/global.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : global.c
  *  Author    : Jason Faultless <jason@altarstone.com>
  *  Created   : 1999-12-12
- *  Updated   : 2000-01-05
+ *  Updated   : 2005-10-19
  *  Notes     : Generic nagivation and key handling routines
  *
- * Copyright (c) 1999-2003 Jason Faultless <jason@altarstone.com>
+ * Copyright (c) 1999-2006 Jason Faultless <jason@altarstone.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,67 +41,13 @@
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
 
 /*
  * Local prototypes
  */
-static int _page_up(int curslot, int maxslot);
-static int _page_down(int curslot, int maxslot);
-static int mouse_action(int ch, int (*left_action) (void), int (*right_action) (void));
-
-/*
- * Return the new line index following a PageUp request.
- * Take half page scrolling into account
- */
-static int
-_page_up(
-	int curslot,
-	int maxslot)
-{
-	int n, scroll_lines;
-
-	if (curslot == 0)
-		return (maxslot - 1);
-
-	scroll_lines = (tinrc.scroll_lines == -2) ? NOTESLINES / 2 : NOTESLINES;
-
-	if ((n = curslot % scroll_lines) > 0)
-		curslot -= n;
-	else
-		curslot = ((curslot - scroll_lines) / scroll_lines) * scroll_lines;
-
-	return ((curslot < 0) ? 0 : curslot);
-}
-
-
-/*
- * Return the new line index following a PageDown request.
- * Take half page scrolling into account
- */
-static int
-_page_down(
-	int curslot,
-	int maxslot)
-{
-	int scroll_lines;
-
-	if (curslot == maxslot - 1)
-		return 0;
-
-	scroll_lines = (tinrc.scroll_lines == -2) ? NOTESLINES / 2 : NOTESLINES;
-
-	curslot = ((curslot + scroll_lines) / scroll_lines) * scroll_lines;
-
-	if (curslot >= maxslot) {
-		curslot = (maxslot / scroll_lines) * scroll_lines;
-		if (curslot < maxslot - 1)
-			curslot = maxslot - 1;
-	}
-	return curslot;
-}
+#ifdef USE_CURSES
+	static void do_scroll(int jump);
+#endif /* USE_CURSES */
 
 
 /*
@@ -112,29 +58,19 @@ void
 set_first_screen_item(
 	void)
 {
-	if (currmenu->curr >= currmenu->max)
-		currmenu->curr = currmenu->max - 1;
-
-	if (NOTESLINES <= 0)
+	if (currmenu->max == 0) {
 		currmenu->first = 0;
-	else {
-		currmenu->first = (currmenu->curr / NOTESLINES) * NOTESLINES;
-		if (currmenu->first < 0)
-			currmenu->first = 0;
+		currmenu->curr = -1;
+		return;
 	}
 
-	currmenu->last = currmenu->first + NOTESLINES;
-
-	if (currmenu->last >= currmenu->max) {
-		currmenu->last = currmenu->max;
-		currmenu->first = (currmenu->max / NOTESLINES) * NOTESLINES;
-
-		if (currmenu->first == currmenu->last || currmenu->first < 0)
-			currmenu->first = ((currmenu->first < 0) ? 0 : currmenu->last - NOTESLINES);
-	}
+	if (currmenu->curr >= currmenu->max)
+		currmenu->curr = currmenu->max - 1;
+	else if (currmenu->curr < -1)
+		currmenu->curr = -1;
 
-	if (currmenu->max == 0)
-		currmenu->first = currmenu->last = 0;
+	if (currmenu->curr < currmenu->first || currmenu->curr > currmenu->first + NOTESLINES - 1) /* current selection is out of screen */
+		currmenu->first = (currmenu->curr / NOTESLINES) * NOTESLINES;
 }
 
 
@@ -142,8 +78,28 @@ void
 move_up(
 	void)
 {
-	if (currmenu->max)
-		move_to_item((currmenu->curr == 0) ? (currmenu->max - 1) : (currmenu->curr - 1));
+	if (!currmenu->max)
+		return;
+
+	if (currmenu->curr - 1 < currmenu->first && currmenu->curr != 0) {
+		currmenu->first--;
+#ifdef USE_CURSES
+		do_scroll(-1);
+		currmenu->draw_item(currmenu->curr - 1);
+#else
+		currmenu->redraw();
+#endif /* USE_CURSES */
+	}
+	if (currmenu->curr == 0) {
+		currmenu->first = MAX(0, currmenu->max - NOTESLINES);
+
+		if (currmenu->max - 1 >= NOTESLINES) {
+			currmenu->curr = currmenu->max - 1;
+			currmenu->redraw();
+		} else
+			move_to_item(currmenu->max - 1);
+	} else
+		move_to_item(currmenu->curr - 1);
 }
 
 
@@ -151,8 +107,19 @@ void
 move_down(
 	void)
 {
-	if (currmenu->max)
-		move_to_item((currmenu->curr + 1 >= currmenu->max) ? 0 : (currmenu->curr + 1));
+	if (!currmenu->max)
+		return;
+
+	if (currmenu->curr + 1 > currmenu->first + NOTESLINES - 1 && currmenu->curr + 1 < currmenu->max) {
+		currmenu->first++;
+#ifdef USE_CURSES
+		do_scroll(1);
+		currmenu->draw_item(currmenu->curr + 1);
+#else
+		currmenu->redraw();
+#endif /* USE_CURSES */
+	}
+	move_to_item((currmenu->curr + 1 >= currmenu->max) ? 0 : (currmenu->curr + 1));
 }
 
 
@@ -160,8 +127,24 @@ void
 page_up(
 	void)
 {
-	if (currmenu->max)
-		move_to_item(_page_up(currmenu->curr, currmenu->max));
+	int scroll_lines;
+
+	if (!currmenu->max)
+		return;
+
+	if (currmenu->curr == currmenu->first) {
+		scroll_lines = (tinrc.scroll_lines == -2) ? NOTESLINES / 2 : NOTESLINES;
+		if (currmenu->first == 0) {
+			/* wrap around */
+			currmenu->first = MAX(0, currmenu->max - scroll_lines);
+			currmenu->curr = currmenu->max - 1;
+		} else {
+			currmenu->first = MAX(0, currmenu->first - scroll_lines);
+			currmenu->curr = currmenu->first;
+		}
+		currmenu->redraw();
+	} else
+		move_to_item(currmenu->first);
 }
 
 
@@ -169,8 +152,26 @@ void
 page_down(
 	void)
 {
-	if (currmenu->max)
-		move_to_item(_page_down(currmenu->curr, currmenu->max));
+	int scroll_lines;
+
+	if (!currmenu->max)
+		return;
+
+	if (currmenu->curr == currmenu->max - 1) {
+		/* wrap around */
+		currmenu->first = 0;
+		currmenu->curr = 0;
+		currmenu->redraw();
+	} else {
+		scroll_lines = (tinrc.scroll_lines == -2) ? NOTESLINES / 2 : NOTESLINES;
+		if (currmenu->first + scroll_lines >= currmenu->max)
+			move_to_item(currmenu->max - 1);
+		else {
+			currmenu->first += scroll_lines;
+			currmenu->curr = currmenu->first;
+			currmenu->redraw();
+		}
+	}
 }
 
 
@@ -229,12 +230,11 @@ move_to_item(
 	HpGlitch(erase_arrow());
 	erase_arrow();
 
-	currmenu->curr = n;
-	if (currmenu->curr < 0)
+	if ((currmenu->curr = n) < 0)
 		currmenu->curr = 0;
 	clear_message();
 
-	if (n >= currmenu->first && n < currmenu->last)
+	if (n >= currmenu->first && n < currmenu->first + NOTESLINES)
 		currmenu->draw_arrow();
 	else
 		currmenu->redraw();
@@ -242,22 +242,90 @@ move_to_item(
 
 
 /*
+ * scroll the screen one line down
+ * the selected item is only moved if it is scrolled off the screen
+ */
+void
+scroll_down(
+	void)
+{
+	if (!currmenu->max || currmenu->first + NOTESLINES >= currmenu->max)
+		return;
+
+	currmenu->first++;
+#ifdef USE_CURSES
+	do_scroll(1);
+	currmenu->draw_item(currmenu->first + NOTESLINES - 1);
+	stow_cursor();
+	if (currmenu->curr < currmenu->first)
+		move_to_item(currmenu->curr + 1);
+#else
+	if (currmenu->curr < currmenu->first)
+		currmenu->curr++;
+	currmenu->redraw();
+#endif /* USE_CURSES */
+}
+
+
+/*
+ * scroll the screen one line up
+ * the selected item is only moved if it is scrolled off the screen
+ */
+void
+scroll_up(
+	void)
+{
+	if (!currmenu->max || currmenu->first == 0)
+		return;
+
+	currmenu->first--;
+#ifdef USE_CURSES
+	do_scroll(-1);
+	currmenu->draw_item(currmenu->first);
+	stow_cursor();
+	if (currmenu->curr >= currmenu->first + NOTESLINES)
+		move_to_item(currmenu->curr - 1);
+#else
+	if (currmenu->curr >= currmenu->first + NOTESLINES)
+		currmenu->curr--;
+	currmenu->redraw();
+#endif /* USE_CURSES */
+}
+
+
+#ifdef USE_CURSES
+/* TODO: merge with options_menu.c:do_scroll() and move to tcurses.c */
+/* scroll the screen 'jump' lines down or up (if 'jump' < 0) */
+static void
+do_scroll(
+	int jump)
+{
+	scrollok(stdscr, TRUE);
+	MoveCursor(INDEX_TOP, 0);
+	SetScrollRegion(INDEX_TOP, INDEX_TOP + NOTESLINES - 1);
+	ScrollScreen(jump);
+	SetScrollRegion(0, LINES - 1);
+	scrollok(stdscr, FALSE);
+}
+#endif /* USE_CURSES */
+
+
+/*
  * Handle mouse clicks. We simply map the event to a return
  * keymap code that will drop through to call the correct function
  */
-static int
-mouse_action(
-	int ch,
-	int (*left_action) (void),		/* Typically catchup type event */
-	int (*right_action) (void))		/* Typically read next etc.. */
+t_function
+global_mouse_action(
+	t_function (*left_action) (void),
+	t_function (*right_action) (void))
 {
-	int INDEX_BOTTOM = INDEX_TOP + currmenu->last - currmenu->first;
+	int INDEX_BOTTOM = INDEX_TOP + NOTESLINES;
 
 	switch (xmouse) {
 		case MOUSE_BUTTON_1:
 		case MOUSE_BUTTON_3:
 			if (xrow < INDEX_TOP || xrow >= INDEX_BOTTOM)
-				return iKeyPageDown;
+				return GLOBAL_PAGE_DOWN;
 
 			erase_arrow();
 			currmenu->curr = xrow - INDEX_TOP + currmenu->first;
@@ -269,65 +337,74 @@ mouse_action(
 
 		case MOUSE_BUTTON_2:
 			if (xrow < INDEX_TOP || xrow >= INDEX_BOTTOM)
-				return iKeyPageUp;
+				return GLOBAL_PAGE_UP;
 
 			return left_action();
 
 		default:
 			break;
 	}
-	return ch;			/* Pass through */
+	return NOT_ASSIGNED;
 }
 
 
-int
+t_function
 handle_keypad(
-	int (*left_action) (void),
-	int (*right_action) (void),
-	const t_menukeys *menukeys)
-{
+	t_function (*left_action) (void),
+	t_function (*right_action) (void),
+	t_function (*mouse_action) (
+		t_function (*left_action) (void),
+		t_function (*right_action) (void)),
+	const struct keylist keys)
+{
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wint_t ch = ReadWch();
+#else
 	int ch = ReadCh();
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	t_function func = NOT_ASSIGNED;
 
 	switch (ch) {
 		case ESC:	/* common arrow keys */
 #	ifdef HAVE_KEY_PREFIX
 		case KEY_PREFIX:
 #	endif /* HAVE_KEY_PREFIX */
-			switch (get_arrow_key(ch)) {
+			switch (get_arrow_key((int) ch)) {
 				case KEYMAP_UP:
-					ch = iKeyUp;
+					func = GLOBAL_LINE_UP;
 					break;
 
 				case KEYMAP_DOWN:
-					ch = iKeyDown;
+					func = GLOBAL_LINE_DOWN;
 					break;
 
 				case KEYMAP_LEFT:
-					ch = left_action();
+					func = left_action();
 					break;
 
 				case KEYMAP_RIGHT:
-					ch = right_action();
+					func = right_action();
 					break;
 
 				case KEYMAP_PAGE_UP:
-					ch = iKeyPageUp;
+					func = GLOBAL_PAGE_UP;
 					break;
 
 				case KEYMAP_PAGE_DOWN:
-					ch = iKeyPageDown;
+					func = GLOBAL_PAGE_DOWN;
 					break;
 
 				case KEYMAP_HOME:
-					ch = iKeyFirstPage;
+					func = GLOBAL_FIRST_PAGE;
 					break;
 
 				case KEYMAP_END:
-					ch = iKeyLastPage;
+					func = GLOBAL_LAST_PAGE;
 					break;
 
 				case KEYMAP_MOUSE:
-					ch = mouse_action(ch, left_action, right_action);
+					if (mouse_action)
+						func = mouse_action(left_action, right_action);
 					break;
 
 				default:
@@ -336,10 +413,10 @@ handle_keypad(
 			break;
 
 		default:
-			ch = map_to_default(ch, menukeys);
+			func = key_to_func(ch, keys);
 			break;
 	}
-	return ch;
+	return func;
 }
 
 
diff -Nurp tin-1.6.2/src/group.c tin-1.8.0/src/group.c
--- tin-1.6.2/src/group.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/group.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : group.c
  *  Author    : I. Lea & R. Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 2003-08-10
+ *  Updated   : 2005-07-02
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,17 +41,7 @@
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
 
-#define INDEX2SNUM(i)	((i) % NOTESLINES)
-#ifdef USE_CURSES
-#	define INDEX2LNUM(i)	(INDEX_TOP + INDEX2SNUM(i))
-#endif /* USE_CURSES */
-
-/* 3+1+3; width(art_mark) + space + width(unread count) */
-#define MAGIC	7
 
 /*
  * Globally accessible pointer to currently active group
@@ -61,78 +51,77 @@
  */
 struct t_group *curr_group;
 
-static const char *spaces = "XXXX";
-static int len_from;
-static int len_subj;
-
 /*
  * Local prototypes
  */
-static int do_search(int type, t_bool forward, t_bool repeat);
+static int do_search(t_function func, t_bool repeat);
 static int enter_pager(int art, t_bool ignore_unavail);
 static int enter_thread(int depth, t_pagerinfo *page);
-static int group_catchup(int ch);
-static int group_left(void);
-static int group_right(void);
-static int tab_pressed(void);
+static int group_catchup(t_function func);
 static int prompt_getart_limit(void);
+static int tab_pressed(void);
+static t_function group_left(void);
+static t_function group_right(void);
 static void build_sline(int i);
+static void build_multipart_header(char *dest, int maxlen, const char *src, int cmplen, int have, int total);
 static void draw_subject_arrow(void);
+static void mark_thd_read(struct t_group *group, t_bool range_active);
 static void show_group_title(t_bool clear_title);
 static void show_tagged_lines(void);
 static void toggle_read_unread(t_bool force);
 static void update_group_page(void);
-static void build_multipart_header(char *dest, int maxlen, const char *src, int cmplen, int have, int total);
-static void mark_thd_read(struct t_group *group, t_bool range_active);
 
 /*
  * grpmenu.curr is an index into base[] and so equates to the cursor location
  * (thread number) on group page
- * grpmenu.first, last are static here
+ * grpmenu.first is static here
  */
-t_menu grpmenu = { 0, 0, 0, 0, show_group_page, draw_subject_arrow };
+t_menu grpmenu = { 0, 0, 0, show_group_page, draw_subject_arrow, build_sline };
+
+/* TODO: find a better solution */
+static int ret_code = 0;		/* Set to < 0 when it is time to leave the group level */
 
 static void
 show_tagged_lines(
 	void)
 {
-	int i;
+	int i, j;
 
-	for (i = grpmenu.first; i < grpmenu.last; ++i) {
-		if ((i != grpmenu.curr) && line_is_tagged(base[i])) {
-			build_sline(i);
-			draw_line(i, MAGIC);
-		}
+	for (i = grpmenu.first; i < grpmenu.first + NOTESLINES && i < grpmenu.max; ++i) {
+		if ((i != grpmenu.curr) && (j = line_is_tagged(base[i])))
+			mark_screen(i, MARK_OFFSET - 2, tin_ltoa(j, 3));
 	}
 }
 
 
-static int
+static t_function
 group_left(
 	void)
 {
 	if (tinrc.group_catchup_on_exit)
-		return iKeyCatchupLeft;		/* ie, not via 'c' or 'C' */
+		return SPECIAL_CATCHUP_LEFT;		/* ie, not via 'c' or 'C' */
 	else
-		return iKeyQuit;
+		return GLOBAL_QUIT;
 }
 
 
-static int
+static t_function
 group_right(
 	void)
 {
 	if (grpmenu.curr >= 0 && HAS_FOLLOWUPS(grpmenu.curr)) {
 		if (tinrc.auto_list_thread)
-			return iKeyGroupListThd;
+			return GROUP_LIST_THREAD;
 		else {
 			int n = next_unread((int) base[grpmenu.curr]);
 
-			if (grpmenu.curr == which_thread(n) && n >= 0)
-				return enter_pager(n, TRUE);
+			if (n >= 0 && grpmenu.curr == which_thread(n)) {
+				ret_code = enter_pager(n, TRUE);
+				return GLOBAL_ABORT;	/* TODO: should we return something else? */
+			}
 		}
 	}
-	return iKeyGroupReadBasenote;
+	return GROUP_READ_BASENOTE;
 }
 
 
@@ -150,18 +139,16 @@ group_page(
 	struct t_group *group)
 {
 	char key[MAXKEYLEN];
-	int ch = 0;
 	int i, n, ii;
 	int old_top = 0;
-	int old_group_top;
-	int ret_code = 0;			/* Set to < 0 when it is time to leave this menu */
 	int thread_depth;	/* Starting depth in threads we enter */
 	long old_artnum = 0L;
 	struct t_art_stat sbuf;
 	t_bool flag;
 	t_bool range_active = FALSE;		/* Set if a range is defined */
 	t_bool xflag = FALSE;	/* 'X'-flag */
-	t_bool repeat_search = FALSE;
+	t_bool repeat_search;
+	t_function func;
 
 	/*
 	 * Set the group attributes
@@ -177,19 +164,22 @@ group_page(
 	/*
 	 * update index file. quit group level if user aborts indexing
 	 */
-	if (!index_group(group))
+	if (!index_group(group)) {
+		curr_group = NULL;
 		return GRP_RETSELECT;
+	}
 
 	/*
 	 * Position 'grpmenu.curr' accordingly
 	 */
 	pos_first_unread_thread();
+	/* reset grpmenu.first */
+	grpmenu.first = 0;
 
-	set_subj_from_size(cCOLS);
 	clear_note_area();
 
 	if (group->attribute->auto_select) {
-		error_message(_(txt_autoselecting_articles), printascii(key, map_to_local(iKeyGroupMarkUnselArtRead, &menukeymap.group_nav)));
+		error_message(_(txt_autoselecting_articles), printascii(key, func_to_key(GROUP_MARK_UNSELECTED_ARTICLES_READ, group_keys)));
 		do_auto_select_arts();						/* 'X' command */
 		xflag = TRUE;
 	}
@@ -200,40 +190,48 @@ group_page(
 	debug_print_bitmap(group, NULL);
 #	endif /* DEBUG_NEWSRC */
 
+	/* reset ret_code */
+	ret_code = 0;
 	while (ret_code >= 0) {
 		set_xclick_on();
-		if ((ch = handle_keypad(group_left, group_right, &menukeymap.group_nav)) == iKeySearchRepeat) {
-			ch = i_key_search_last;
+		if ((func = handle_keypad(group_left, group_right, global_mouse_action, group_keys)) == GLOBAL_SEARCH_REPEAT) {
+			func = last_search;
 			repeat_search = TRUE;
-		}
-		else
+		} else
 			repeat_search = FALSE;
 
-		switch (ch) {
-			case iKeyAbort:		/* Abort */
+		switch (func) {
+			case GLOBAL_ABORT:
 				break;
 
-			case '1': case '2': case '3': case '4': case '5':
-			case '6': case '7': case '8': case '9':
+			case DIGIT_1:
+			case DIGIT_2:
+			case DIGIT_3:
+			case DIGIT_4:
+			case DIGIT_5:
+			case DIGIT_6:
+			case DIGIT_7:
+			case DIGIT_8:
+			case DIGIT_9:
 				if (grpmenu.max)
-					prompt_item_num(ch, _(txt_select_thread));
+					prompt_item_num(func_to_key(func, group_keys), _(txt_select_thread));
 				break;
 
 #	ifndef NO_SHELL_ESCAPE
-			case iKeyShellEscape:
+			case GLOBAL_SHELL_ESCAPE:
 				do_shell_escape();
 				break;
 #	endif /* !NO_SHELL_ESCAPE */
 
-			case iKeyFirstPage: /* show first page of threads */
+			case GLOBAL_FIRST_PAGE:		/* show first page of threads */
 				top_of_list();
 				break;
 
-			case iKeyLastPage:	/* show last page of threads */
+			case GLOBAL_LAST_PAGE:		/* show last page of threads */
 				end_of_list();
 				break;
 
-			case iKeyLastViewed:	/* go to last viewed article */
+			case GLOBAL_LAST_VIEWED:	/* go to last viewed article */
 				/*
 				 * If the last art is no longer in a thread then we can't display it
 				 */
@@ -243,58 +241,54 @@ group_page(
 					ret_code = enter_pager(this_resp, FALSE);
 				break;
 
-			case iKeyPipe:		/* pipe article/thread/tagged arts to command */
+			case GLOBAL_PIPE:		/* pipe article/thread/tagged arts to command */
 				if (grpmenu.curr >= 0)
 					feed_articles(FEED_PIPE, GROUP_LEVEL, group, (int) base[grpmenu.curr]);
 				break;
 
-			case iKeyGroupMail:	/* mail article to somebody */
+			case GROUP_MAIL:	/* mail article to somebody */
 				if (grpmenu.curr >= 0)
 					feed_articles(FEED_MAIL, GROUP_LEVEL, group, (int) base[grpmenu.curr]);
 				break;
 
 #ifndef DISABLE_PRINTING
-			case iKeyPrint:	/* output art/thread/tagged arts to printer */
+			case GLOBAL_PRINT:	/* output art/thread/tagged arts to printer */
 				if (grpmenu.curr >= 0)
 					feed_articles(FEED_PRINT, GROUP_LEVEL, group, (int) base[grpmenu.curr]);
 				break;
 #endif /* !DISABLE_PRINTING */
 
-			case iKeyGroupRepost:	/* repost current article */
+			case GROUP_REPOST:	/* repost current article */
 				if (grpmenu.curr >= 0)
 					feed_articles(FEED_REPOST, GROUP_LEVEL, group, (int) base[grpmenu.curr]);
 				break;
 
-			case iKeyGroupSave:	/* save articles with prompting */
+			case GROUP_SAVE:	/* save articles with prompting */
 				if (grpmenu.curr >= 0)
 					feed_articles(FEED_SAVE, GROUP_LEVEL, group, (int) base[grpmenu.curr]);
 				break;
 
-			case iKeyGroupAutoSave:	/* Auto-save articles without prompting */
+			case GROUP_AUTOSAVE:	/* Auto-save articles without prompting */
 				if (grpmenu.curr >= 0)
 					feed_articles(FEED_AUTOSAVE, GROUP_LEVEL, group, (int) base[grpmenu.curr]);
 				break;
 
-			case iKeySetRange:	/* set range */
+			case GLOBAL_SET_RANGE:	/* set range */
 				if (set_range(GROUP_LEVEL, 1, grpmenu.max, grpmenu.curr + 1)) {
 					range_active = TRUE;
 					show_group_page();
 				}
 				break;
 
-			case iKeySearchAuthF:	/* author forward/backward  search */
-			case iKeySearchAuthB:
-				if ((thread_depth = do_search(SEARCH_AUTH, (ch == iKeySearchAuthF), repeat_search)) != 0)
+			case GLOBAL_SEARCH_AUTHOR_FORWARD:
+			case GLOBAL_SEARCH_AUTHOR_BACKWARD:
+			case GLOBAL_SEARCH_SUBJECT_FORWARD:
+			case GLOBAL_SEARCH_SUBJECT_BACKWARD:
+				if ((thread_depth = do_search(func, repeat_search)) != 0)
 					ret_code = enter_thread(thread_depth, NULL);
 				break;
 
-			case iKeySearchSubjF:	/* subject forward/backward search */
-			case iKeySearchSubjB:
-				if ((thread_depth = do_search(SEARCH_SUBJ, (ch == iKeySearchSubjF), repeat_search)) != 0)
-					ret_code = enter_thread(thread_depth, NULL);
-				break;
-
-			case iKeySearchBody:	/* search article body */
+			case GLOBAL_SEARCH_BODY:	/* search article body */
 				if (grpmenu.curr >= 0) {
 					if ((n = search_body(group, (int) base[grpmenu.curr], repeat_search)) != -1)
 						ret_code = enter_pager(n, FALSE);
@@ -302,26 +296,23 @@ group_page(
 					info_message(_(txt_no_arts));
 				break;
 
-			case iKeyGroupReadBasenote:
-			case iKeyGroupReadBasenote2:	/* read current basenote */
+			case GROUP_READ_BASENOTE:	/* read current basenote */
 				if (grpmenu.curr >= 0)
 					ret_code = enter_pager((int) base[grpmenu.curr], FALSE /*TRUE*/);
 				else
 					info_message(_(txt_no_arts));
 				break;
 
-			case iKeyGroupNextUnreadArtOrGrp:	/* goto next unread article/group */
+			case GROUP_NEXT_UNREAD_ARTICLE_OR_GROUP:	/* goto next unread article/group */
 				ret_code = tab_pressed();
 				break;
 
-			case iKeyPageDown:		/* page down */
-			case iKeyPageDown2:
-			case iKeyPageDown3:
+			case GLOBAL_PAGE_DOWN:
 				page_down();
 				break;
 
-			case iKeyGroupAutoSel:		/* auto-select article menu */
-			case iKeyGroupKill:		/* kill article menu */
+			case GLOBAL_MENU_FILTER_SELECT:		/* auto-select article menu */
+			case GLOBAL_MENU_FILTER_KILL:		/* kill article menu */
 				if (grpmenu.curr < 0) {
 					info_message(_(txt_no_arts));
 					break;
@@ -329,7 +320,7 @@ group_page(
 				old_top = top_art;
 				n = (int) base[grpmenu.curr];
 				old_artnum = arts[n].artnum;
-				if (filter_menu((ch == iKeyGroupKill) ? FILTER_KILL : FILTER_SELECT, group, &arts[n])) {
+				if (filter_menu(func, group, &arts[n])) {
 					if (filter_articles(group)) {
 						make_threads(group, FALSE);
 						grpmenu.curr = find_new_pos(old_top, old_artnum, grpmenu.curr);
@@ -338,7 +329,7 @@ group_page(
 				show_group_page();
 				break;
 
-			case iKeyGroupEditFilter:
+			case GLOBAL_EDIT_FILTER:
 				if (!invoke_editor(filter_file, FILTER_FILE_OFFSET))
 					break;
 				unfilter_articles();
@@ -350,18 +341,18 @@ group_page(
 				show_group_page();
 				break;
 
-			case iKeyGroupQuickAutoSel:		/* quickly auto-select article */
-			case iKeyGroupQuickKill:		/* quickly kill article */
+			case GLOBAL_QUICK_FILTER_SELECT:		/* quickly auto-select article */
+			case GLOBAL_QUICK_FILTER_KILL:			/* quickly kill article */
 				if (grpmenu.curr < 0) {
 					info_message(_(txt_no_arts));
 					break;
 				}
-				if ((!TINRC_CONFIRM_ACTION) || prompt_yn(cLINES, (ch == iKeyGroupQuickKill) ? _(txt_quick_filter_kill) : _(txt_quick_filter_select), TRUE) == 1) {
+				if ((!TINRC_CONFIRM_ACTION) || prompt_yn((func == GLOBAL_QUICK_FILTER_KILL) ? _(txt_quick_filter_kill) : _(txt_quick_filter_select), TRUE) == 1) {
 					old_top = top_art;
 					n = (int) base[grpmenu.curr]; /* should this depend on show_only_unread? */
 					old_artnum = arts[n].artnum;
-					if (quick_filter((ch == iKeyGroupQuickKill) ? FILTER_KILL : FILTER_SELECT, group, &arts[n])) {
-						info_message((ch == iKeyGroupQuickKill) ? _(txt_info_add_kill) : _(txt_info_add_select));
+					if (quick_filter(func, group, &arts[n])) {
+						info_message((func == GLOBAL_QUICK_FILTER_KILL) ? _(txt_info_add_kill) : _(txt_info_add_select));
 						if (filter_articles(group)) {
 							make_threads(group, FALSE);
 							/* TODO: position is wrong after quick killing a thread */
@@ -372,72 +363,70 @@ group_page(
 				}
 				break;
 
-			case iKeyRedrawScr:	/* redraw screen */
+			case GLOBAL_REDRAW_SCREEN:
 				my_retouch();
 				set_xclick_off();
 				show_group_page();
 				break;
 
-			case iKeyDown:		/* line down */
-			case iKeyDown2:
+			case GLOBAL_LINE_DOWN:
 				move_down();
 				break;
 
-			case iKeyUp:		/* line up */
-			case iKeyUp2:
+			case GLOBAL_LINE_UP:
 				move_up();
 				break;
 
-			case iKeyPageUp:		/* page up */
-			case iKeyPageUp2:
-			case iKeyPageUp3:
+			case GLOBAL_PAGE_UP:
 				page_up();
 				break;
 
-			case iKeyCatchupLeft:
-			case iKeyGroupCatchup:
-			case iKeyGroupCatchupNextUnread:
-				ret_code = group_catchup(ch);
+			case GLOBAL_SCROLL_DOWN:
+				scroll_down();
+				break;
+
+			case GLOBAL_SCROLL_UP:
+				scroll_up();
+				break;
+
+			case SPECIAL_CATCHUP_LEFT:
+			case CATCHUP:
+			case CATCHUP_NEXT_UNREAD:
+				ret_code = group_catchup(func);
 				break;
 
-			case iKeyGroupToggleSubjDisplay:	/* toggle display of subject & subj/author */
-				toggle_subject_from();
+			case GROUP_TOGGLE_SUBJECT_DISPLAY:	/* toggle display of subject & subj/author */
+				if (++curr_group->attribute->show_author > SHOW_FROM_BOTH)
+					curr_group->attribute->show_author = SHOW_FROM_NONE;
 				show_group_page();
 				break;
 
-			case iKeyGroupGoto:	/* choose a new group by name */
-				old_group_top = selmenu.max;
+			case GROUP_GOTO:	/* choose a new group by name */
 				n = choose_new_group();
 				if (n >= 0 && n != selmenu.curr) {
-					/*
-					 * if we added a group, set the length as appropriate
-					 * for the group selection display
-					 */
-					if (old_group_top != selmenu.max)
-						set_groupname_len(FALSE);
 					selmenu.curr = n;
 					ret_code = GRP_ENTER;
 				}
 				break;
 
-			case iKeyHelp:					/* help */
+			case GLOBAL_HELP:
 				show_help_page(GROUP_LEVEL, _(txt_index_page_com));
 				show_group_page();
 				break;
 
-			case iKeyToggleHelpDisplay:		/* toggle mini help menu */
+			case GLOBAL_TOGGLE_HELP_DISPLAY:		/* toggle mini help menu */
 				toggle_mini_help(GROUP_LEVEL);
 				show_group_page();
 				break;
 
-			case iKeyToggleInverseVideo:	/* toggle inverse video */
+			case GLOBAL_TOGGLE_INVERSE_VIDEO:		/* toggle inverse video */
 				toggle_inverse_video();
 				show_group_page();
 				show_inverse_video_status();
 				break;
 
 #	ifdef HAVE_COLOR
-			case iKeyToggleColor:
+			case GLOBAL_TOGGLE_COLOR:
 				if (toggle_color()) {
 					show_group_page();
 					show_color_status();
@@ -445,22 +434,22 @@ group_page(
 				break;
 #	endif /* HAVE_COLOR */
 
-			case iKeyGroupMarkThdRead:	/* mark current thread/range/tagged threads as read */
+			case GROUP_MARK_THREAD_READ:			/* mark current thread/range/tagged threads as read */
 				mark_thd_read(group, range_active);
 				if (range_active)
 					range_active = FALSE; /* Range has gone now */
 				break;
 
-			case iKeyGroupListThd:				/* list articles within current thread */
+			case GROUP_LIST_THREAD:				/* list articles within current thread */
 				ret_code = enter_thread(0, NULL);	/* Enter thread at the top */
 				break;
 
-			case iKeyLookupMessage:
+			case GLOBAL_LOOKUP_MESSAGEID:
 				if ((i = prompt_msgid()) != ART_UNAVAILABLE)
 					ret_code = enter_pager(i, FALSE);
 				break;
 
-			case iKeyOptionMenu:	/* option menu */
+			case GLOBAL_OPTION_MENU:			/* option menu */
 				if (grpmenu.max > 0) {
 					old_top = top_art;
 					old_artnum = arts[(int) base[grpmenu.curr]].artnum;
@@ -468,17 +457,16 @@ group_page(
 				n = tinrc.sort_article_type;
 				if ((change_config_file(group) == NO_FILTERING) && n != tinrc.sort_article_type)
 					make_threads(group, TRUE);
-				set_subj_from_size(cCOLS);
 				grpmenu.curr = find_new_pos(old_top, old_artnum, grpmenu.curr);
 				show_group_page();
 				break;
 
-			case iKeyGroupNextGroup:	/* goto next group */
+			case GROUP_NEXT_GROUP:			/* goto next group */
 				clear_message();
 				if (selmenu.curr + 1 >= selmenu.max)
 					info_message(_(txt_no_more_groups));
 				else {
-					if (xflag && TINRC_CONFIRM_SELECT && (prompt_yn(cLINES, _(txt_confirm_select_on_exit), FALSE) != 1)) {
+					if (xflag && TINRC_CONFIRM_SELECT && (prompt_yn(_(txt_confirm_select_on_exit), FALSE) != 1)) {
 						undo_auto_select_arts();
 						xflag = FALSE;
 					}
@@ -487,7 +475,7 @@ group_page(
 				}
 				break;
 
-			case iKeyGroupNextUnreadArt:	/* goto next unread article */
+			case GROUP_NEXT_UNREAD_ARTICLE:	/* goto next unread article */
 				if (grpmenu.curr < 0) {
 					info_message(_(txt_no_next_unread_art));
 					break;
@@ -498,7 +486,7 @@ group_page(
 					ret_code = enter_pager(n, FALSE);
 				break;
 
-			case iKeyGroupPrevUnreadArt:	/* go to previous unread article */
+			case GROUP_PREVIOUS_UNREAD_ARTICLE:	/* go to previous unread article */
 				if (grpmenu.curr < 0) {
 					info_message(_(txt_no_prev_unread_art));
 					break;
@@ -510,7 +498,7 @@ group_page(
 					ret_code = enter_pager(n, FALSE);
 				break;
 
-			case iKeyGroupPrevGroup:	/* previous group */
+			case GROUP_PREVIOUS_GROUP:	/* previous group */
 				clear_message();
 				for (i = selmenu.curr - 1; i >= 0; i--) {
 					if (UNREAD_GROUP(i))
@@ -519,7 +507,7 @@ group_page(
 				if (i < 0)
 					info_message(_(txt_no_prev_group));
 				else {
-					if (xflag && TINRC_CONFIRM_SELECT && (prompt_yn(cLINES, _(txt_confirm_select_on_exit), FALSE) != 1)) {
+					if (xflag && TINRC_CONFIRM_SELECT && (prompt_yn(_(txt_confirm_select_on_exit), FALSE) != 1)) {
 						undo_auto_select_arts();
 						xflag = FALSE;
 					}
@@ -528,48 +516,47 @@ group_page(
 				}
 				break;
 
-			case iKeyQuit:	/* return to group selection page */
-				if (num_of_tagged_arts && prompt_yn(cLINES, _(txt_quit_despite_tags), TRUE) != 1)
+			case GLOBAL_QUIT:	/* return to group selection page */
+				if (num_of_tagged_arts && prompt_yn(_(txt_quit_despite_tags), TRUE) != 1)
 					break;
-				if (xflag && TINRC_CONFIRM_SELECT && (prompt_yn(cLINES, _(txt_confirm_select_on_exit), FALSE) != 1)) {
+				if (xflag && TINRC_CONFIRM_SELECT && (prompt_yn(_(txt_confirm_select_on_exit), FALSE) != 1)) {
 					undo_auto_select_arts();
 					xflag = FALSE;
 				}
 				ret_code = GRP_EXIT;
 				break;
 
-			case iKeyQuitTin:		/* quit */
-				if (num_of_tagged_arts && prompt_yn(cLINES, _(txt_quit_despite_tags), TRUE) != 1)
+			case GLOBAL_QUIT_TIN:		/* quit */
+				if (num_of_tagged_arts && prompt_yn(_(txt_quit_despite_tags), TRUE) != 1)
 					break;
-				if (xflag && TINRC_CONFIRM_SELECT && (prompt_yn(cLINES, _(txt_confirm_select_on_exit), FALSE) != 1)) {
+				if (xflag && TINRC_CONFIRM_SELECT && (prompt_yn(_(txt_confirm_select_on_exit), FALSE) != 1)) {
 					undo_auto_select_arts();
 					xflag = FALSE;
 				}
 				ret_code = GRP_QUIT;
 				break;
 
-			case iKeyGroupToggleReadUnread:
+			case GROUP_TOGGLE_READ_UNREAD:
 				toggle_read_unread(FALSE);
 				show_group_page();
 				break;
 
-			case iKeyGroupToggleGetartLimit:
+			case GROUP_TOGGLE_GET_ARTICLES_LIMIT:
 				tinrc.getart_limit = prompt_getart_limit();
 				ret_code = GRP_NEXTUNREAD;
 				break;
 
-			case iKeyGroupBugReport:
+			case GLOBAL_BUGREPORT:
 				bug_report();
 				break;
 
-			case iKeyGroupTagParts: /* tag all in order */
+			case GROUP_TAG_PARTS: /* tag all in order */
 				if (0 <= grpmenu.curr) {
-					i = tag_multipart(grpmenu.curr);
-					/*
-					 * on success, move the pointer to the next
-					 * untagged article just for ease of use's sake
-					 */
-					if (i != 0) {
+					if (tag_multipart(grpmenu.curr) != 0) {
+						/*
+						 * on success, move the pointer to the next
+						 * untagged article just for ease of use's sake
+						 */
 						n = grpmenu.curr;
 						update_group_page();
 						do {
@@ -585,7 +572,7 @@ group_page(
 				}
 				break;
 
-			case iKeyGroupTag:	/* tag/untag threads for mailing/piping/printing/saving */
+			case GROUP_TAG:		/* tag/untag threads for mailing/piping/printing/saving */
 				if (grpmenu.curr >= 0) {
 					t_bool tagged = TRUE;
 
@@ -624,8 +611,16 @@ group_page(
 								arts[ii].tagged = ++num_of_tagged_arts;
 						}
 					}
-					build_sline(grpmenu.curr);
-					draw_line(grpmenu.curr, MAGIC);
+					if ((ii = line_is_tagged(n)))
+						mark_screen(grpmenu.curr, MARK_OFFSET - 2, tin_ltoa(ii, 3));
+					else {
+						char mark[] = { '\0', '\0' };
+
+						stat_thread(grpmenu.curr, &sbuf);
+						mark[0] = sbuf.art_mark;
+						mark_screen(grpmenu.curr, MARK_OFFSET - 2, "  "); /* clear space used by tag numbering */
+						mark_screen(grpmenu.curr, MARK_OFFSET, mark);
+					}
 					if (tagged)
 						show_tagged_lines();
 
@@ -639,7 +634,7 @@ group_page(
 				}
 				break;
 
-			case iKeyGroupToggleThreading:	/* Cycle through the threading types */
+			case GROUP_TOGGLE_THREADING:		/* Cycle through the threading types */
 				group->attribute->thread_arts = (group->attribute->thread_arts + 1) % (THREAD_MAX + 1);
 				if (grpmenu.curr >= 0) {
 					i = base[grpmenu.curr];								/* Save a copy of current thread */
@@ -651,24 +646,23 @@ group_page(
 				show_group_page();
 				break;
 
-			case iKeyGroupUntag:	/* untag all articles */
+			case GROUP_UNTAG:	/* untag all articles */
 				if (grpmenu.curr >= 0) {
 					if (untag_all_articles())
 						update_group_page();
 				}
 				break;
 
-			case iKeyVersion:
+			case GLOBAL_VERSION:
 				info_message(cvers);
 				break;
 
-			case iKeyPost:	/* post an article */
+			case GLOBAL_POST:	/* post an article */
 				if (post_article(group->name))
 					show_group_page();
 				break;
 
-			case iKeyPostponed:
-			case iKeyPostponed2:	/* post postponed article */
+			case GLOBAL_POSTPONED:	/* post postponed article */
 				if (can_post) {
 					if (pickup_postponed_articles(FALSE, FALSE))
 						show_group_page();
@@ -676,19 +670,17 @@ group_page(
 					info_message(_(txt_cannot_post));
 				break;
 
-			case iKeyDisplayPostHist:	/* display messages posted by user */
+			case GLOBAL_DISPLAY_POST_HISTORY:	/* display messages posted by user */
 				if (user_posted_messages())
 					show_group_page();
 				break;
 
-			case iKeyGroupMarkArtUnread:	/* mark base article of thread unread */
-				{
+			case MARK_ARTICLE_UNREAD:		/* mark base article of thread unread */
+				if (grpmenu.curr < 0)
+					info_message(_(txt_no_arts));
+				else {
 					const char *ptr;
 
-					if (grpmenu.curr < 0) {
-						info_message(_(txt_no_arts));
-						break;
-					}
 					if (range_active) {
 						/*
 						 * We are tied to following base[] here, not arts[], as we operate on
@@ -712,21 +704,17 @@ group_page(
 
 					show_group_title(TRUE);
 					build_sline(grpmenu.curr);
-					draw_line(grpmenu.curr, MAGIC);
 					draw_subject_arrow();
 					info_message(_(txt_marked_as_unread), ptr);
-					break;
 				}
+				break;
 
-			case iKeyGroupMarkThdUnread:	/* mark whole thread as unread */
-				{
+			case MARK_THREAD_UNREAD:		/* mark whole thread as unread */
+				if (grpmenu.curr < 0)
+					info_message(_(txt_no_arts));
+				else {
 					const char *ptr;
 
-					if (grpmenu.curr < 0) {
-						info_message(_(txt_no_arts));
-						break;
-					}
-
 					/*
 					 * We process all articles in case the threading changed since
 					 * the range was created
@@ -748,21 +736,20 @@ group_page(
 
 					show_group_title(TRUE);
 					build_sline(grpmenu.curr);
-					draw_line(grpmenu.curr, MAGIC);
 					draw_subject_arrow();
 					info_message(_(txt_marked_as_unread), ptr);
-					break;
 				}
+				break;
 
-			case iKeyGroupSelThd:	/* mark thread as selected */
-			case iKeyGroupToggleThdSel:	/* toggle thread */
+			case GROUP_SELECT_THREAD:	/* mark thread as selected */
+			case GROUP_TOGGLE_SELECT_THREAD:	/* toggle thread */
 				if (grpmenu.curr < 0) {
 					info_message(_(txt_no_arts));
 					break;
 				}
 
 				flag = TRUE;
-				if (ch == iKeyGroupToggleThdSel) {
+				if (func == GROUP_TOGGLE_SELECT_THREAD) {
 					stat_thread(grpmenu.curr, &sbuf);
 					if (sbuf.selected_unread == sbuf.unread)
 						flag = FALSE;
@@ -773,13 +760,15 @@ group_page(
 					++n;
 				}
 				assert(n > 0);
-				build_sline(grpmenu.curr);
-				draw_line(grpmenu.curr, MAGIC);
+				{
+					char mark[] = { '\0', '\0' };
 
-				info_message(flag
-					      ? _(txt_thread_marked_as_selected)
-					      : _(txt_thread_marked_as_deselected));
+					stat_thread(grpmenu.curr, &sbuf);
+					mark[0] = sbuf.art_mark;
+					mark_screen(grpmenu.curr, MARK_OFFSET, mark);
+				}
 
+				info_message(flag ? _(txt_thread_marked_as_selected) : _(txt_thread_marked_as_deselected));
 				show_group_title(TRUE);
 
 				if (grpmenu.curr + 1 < grpmenu.max) {
@@ -789,52 +778,66 @@ group_page(
 				draw_subject_arrow();
 				break;
 
-			case iKeyGroupReverseSel:	/* reverse selections */
+			case GROUP_REVERSE_SELECTIONS:	/* reverse selections */
 				for_each_art(i)
 					arts[i].selected = bool_not(arts[i].selected);
 				update_group_page();
 				show_group_title(TRUE);
 				break;
 
-			case iKeyGroupUndoSel:	/* undo selections */
+			case GROUP_UNDO_SELECTIONS:	/* undo selections */
 				undo_selections();
 				xflag = FALSE;
 				show_group_title(TRUE);
 				update_group_page();
 				break;
 
-			case iKeyGroupSelPattern:	/* select matching patterns */
+			case GROUP_SELECT_PATTERN:	/* select matching patterns */
 				{
 					char pat[128];
+					char *prompt;
+					struct regex_cache cache = { NULL, NULL };
 
-					sprintf(mesg, _(txt_select_pattern), tinrc.default_select_pattern);
-					if (!(prompt_string_default(mesg, tinrc.default_select_pattern, _(txt_info_no_previous_expression), HIST_SELECT_PATTERN)))
+					prompt = fmt_string(_(txt_select_pattern), tinrc.default_select_pattern);
+					if (!(prompt_string_default(prompt, tinrc.default_select_pattern, _(txt_info_no_previous_expression), HIST_SELECT_PATTERN))) {
+						free(prompt);
 						break;
+					}
+					free(prompt);
 
-					if (STRCMPEQ(tinrc.default_select_pattern, "*"))	/* all */
-						strncpy(pat, tinrc.default_select_pattern, sizeof(pat));
-					else
+					if (STRCMPEQ(tinrc.default_select_pattern, "*")) {	/* all */
+						if (tinrc.wildcard)
+							STRCPY(pat, ".*");
+						else
+							strncpy(pat, tinrc.default_select_pattern, sizeof(pat));
+					} else
 						snprintf(pat, sizeof(pat), REGEX_FMT, tinrc.default_select_pattern);
 
+					if (tinrc.wildcard && !(compile_regex(pat, &cache, PCRE_CASELESS)))
+						break;
+
 					flag = FALSE;
 					for (n = 0; n < grpmenu.max; n++) {
-						if (!REGEX_MATCH(arts[base[n]].subject, pat, TRUE))
+						if (!match_regex(arts[base[n]].subject, pat, &cache, TRUE))
 							continue;
 
 						for_each_art_in_thread(i, n)
 							arts[i].selected = TRUE;
 
-						build_sline(n);
 						flag = TRUE;
 					}
 					if (flag) {
 						show_group_title(TRUE);
 						update_group_page();
 					}
+					if (tinrc.wildcard) {
+						FreeIfNeeded(cache.re);
+						FreeIfNeeded(cache.extra);
+					}
 					break;
 				}
 
-			case iKeyGroupSelThdIfUnreadSelected:	/* select all unread arts in thread hot if 1 is hot */
+			case GROUP_SELECT_THREAD_IF_UNREAD_SELECTED:	/* select all unread arts in thread hot if 1 is hot */
 				for (n = 0; n < grpmenu.max; n++) {
 					stat_thread(n, &sbuf);
 					if (!sbuf.selected_unread || sbuf.selected_unread == sbuf.unread)
@@ -846,7 +849,7 @@ group_page(
 				show_group_title(TRUE);
 				break;
 
-			case iKeyGroupMarkUnselArtRead:	/* mark read all unselected arts */
+			case GROUP_MARK_UNSELECTED_ARTICLES_READ:	/* mark read all unselected arts */
 				if (!xflag) {
 					do_auto_select_arts();
 					xflag = TRUE;
@@ -856,7 +859,7 @@ group_page(
 				}
 				break;
 
-			case iKeyGroupDoAutoSel:		/* perform auto-selection on group */
+			case GROUP_DO_AUTOSELECT:		/* perform auto-selection on group */
 				for (n = 0; n < grpmenu.max; n++) {
 					for_each_art_in_thread(i, n)
 						arts[i].selected = TRUE;
@@ -865,13 +868,13 @@ group_page(
 				show_group_title(TRUE);
 				break;
 
-			case iKeyToggleInfoLastLine:
+			case GLOBAL_TOGGLE_INFO_LAST_LINE:
 				tinrc.info_in_last_line = bool_not(tinrc.info_in_last_line);
 				show_group_page();
 				break;
 
 			default:
-				info_message(_(txt_bad_command), printascii(key, map_to_local(iKeyHelp, &menukeymap.group_nav)));
+				info_message(_(txt_bad_command), printascii(key, func_to_key(GLOBAL_HELP, group_keys)));
 				break;
 		} /* switch(ch) */
 	} /* ret_code >= 0 */
@@ -883,6 +886,8 @@ group_page(
 
 	art_close(&pgart);				/* Close any open art */
 
+	curr_group = NULL;
+
 	return ret_code;
 }
 
@@ -896,36 +901,21 @@ show_group_page(
 	signal_context = cGroup;
 	currmenu = &grpmenu;
 
-	MoveCursor(0, 0);
-	CleartoEOLN();
-
-	show_group_title(FALSE);
-
-	MoveCursor(1, 0);
-	CleartoEOLN();
-	MoveCursor(INDEX_TOP, 0);
-
+	ClearScreen();
 	set_first_screen_item();
+	show_group_title(FALSE);
 
-	if (tinrc.draw_arrow)
-		CleartoEOS();
-
-	for (i = grpmenu.first; i < grpmenu.last; ++i) {
+	for (i = grpmenu.first; i < grpmenu.first + NOTESLINES && i < grpmenu.max; ++i)
 		build_sline(i);
-		draw_line(i, 0);
-	}
 
-	CleartoEOS();
 	show_mini_help(GROUP_LEVEL);
 
 	if (grpmenu.max <= 0) {
 		info_message(_(txt_no_arts));
 		return;
-	} else if (grpmenu.last == grpmenu.max)
-		info_message(_(txt_end_of_arts));
+	}
 
 	draw_subject_arrow();
-
 }
 
 
@@ -933,11 +923,21 @@ static void
 update_group_page(
 	void)
 {
-	int i;
+	int i, j;
+	char mark[] = { '\0', '\0' };
+	struct t_art_stat sbuf;
 
-	for (i = grpmenu.first; i < grpmenu.last; ++i) {
-		build_sline(i);
-		draw_line(i, MAGIC);
+	for (i = grpmenu.first; i < grpmenu.first + NOTESLINES && i < grpmenu.max; ++i) {
+		if ((j = line_is_tagged(base[i])))
+			mark_screen(i, MARK_OFFSET - 2, tin_ltoa(j, 3));
+		else {
+			stat_thread(i, &sbuf);
+			mark[0] = sbuf.art_mark;
+			mark_screen(i, MARK_OFFSET - 2, "  ");	/* clear space used by tag numbering */
+			mark_screen(i, MARK_OFFSET, mark);
+			if (sbuf.art_mark == tinrc.art_marked_selected)
+				draw_mark_selected(i);
+		}
 	}
 
 	if (grpmenu.max <= 0)
@@ -958,10 +958,8 @@ draw_subject_arrow(
 
 		stat_thread(grpmenu.curr, &statbuf);
 		info_message("%s", arts[(statbuf.unread ? next_unread(base[grpmenu.curr]) : base[grpmenu.curr])].subject);
-	} else {
-		if (grpmenu.last == grpmenu.max)
-			info_message(_(txt_end_of_arts));
-	}
+	} else if (grpmenu.curr == grpmenu.max - 1)
+		info_message(_(txt_end_of_arts));
 }
 
 
@@ -986,13 +984,13 @@ toggle_read_unread(
 	int n, i = -1;
 
 	if (force)
-		CURR_GROUP.attribute->show_only_unread = TRUE;	/* Yes - really, we change it in a bit */
+		curr_group->attribute->show_only_unread = TRUE;	/* Yes - really, we change it in a bit */
 
 	wait_message(0, _(txt_reading_arts),
-		(CURR_GROUP.attribute->show_only_unread) ? _(txt_all) : _(txt_unread));
+		(curr_group->attribute->show_only_unread) ? _(txt_all) : _(txt_unread));
 
 	if (grpmenu.curr >= 0) {
-		if (CURR_GROUP.attribute->show_only_unread || new_responses(grpmenu.curr))
+		if (curr_group->attribute->show_only_unread || new_responses(grpmenu.curr))
 			i = base[grpmenu.curr];
 		else if ((n = prev_unread((int) base[grpmenu.curr])) >= 0)
 			i = n;
@@ -1000,9 +998,9 @@ toggle_read_unread(
 			i = n;
 	}
 
-	CURR_GROUP.attribute->show_only_unread = bool_not(CURR_GROUP.attribute->show_only_unread);
+	curr_group->attribute->show_only_unread = bool_not(curr_group->attribute->show_only_unread);
 
-	find_base(&CURR_GROUP);
+	find_base(curr_group);
 	if (i >= 0 && (n = which_thread(i)) >= 0)
 		grpmenu.curr = n;
 	else if (grpmenu.max > 0)
@@ -1060,13 +1058,12 @@ pos_first_unread_thread(
 
 void
 mark_screen(
-	int level,	/* Always SELECT_LEVEL - TODO: move to select.c or use this everywhere */
 	int screen_row,
 	int screen_col,
 	const char *value)
 {
 	if (tinrc.draw_arrow) {
-		MoveCursor(INDEX_TOP + screen_row, screen_col);
+		MoveCursor(INDEX2LNUM(screen_row), screen_col);
 		my_fputs(value, stdout);
 		stow_cursor();
 		my_flush();
@@ -1074,75 +1071,20 @@ mark_screen(
 #ifdef USE_CURSES
 		int y, x;
 		getyx(stdscr, y, x);
-		mvaddstr(INDEX_TOP + screen_row, screen_col, value);
+		mvaddstr(INDEX2LNUM(screen_row), screen_col, value);
 		MoveCursor(y, x);
 #else
 		int i;
 		for (i = 0; value[i] != '\0'; i++)
-			screen[screen_row].col[screen_col + i] = value[i];
+			screen[INDEX2SNUM(screen_row)].col[screen_col + i] = value[i];
+		MoveCursor(INDEX2LNUM(screen_row), screen_col);
+		my_fputs(value, stdout);
 #endif /* USE_CURSES */
-		if (level == SELECT_LEVEL)
-			draw_group_arrow();
-		else
-			draw_subject_arrow();
+		currmenu->draw_arrow();
 	}
 }
 
 
-void
-set_subj_from_size(
-	int num_cols)
-{
-	int show_author;
-	int max_from;
-	int max_subj;
-
-	/*
-	 * This function is called early during startup when we only have
-	 * very limited information loaded.
-	 */
-	show_author = ((selmenu.max && CURR_GROUP.attribute) ? CURR_GROUP.attribute->show_author : tinrc.show_author);
-	max_subj = ((show_author == SHOW_FROM_BOTH) ? ((num_cols / 2) - 4): ((num_cols / 2) + 3));
-	max_from = (num_cols - max_subj) - 17;
-
-	if (show_author != SHOW_FROM_BOTH) {
-		if (max_from > 25) {
-			max_subj += max_from - 25;
-			max_from = 25;
-		}
-	}
-
-	if (show_author != SHOW_FROM_NONE) {
-		len_from = max_from - BLANK_GROUP_COLS;
-		len_subj = max_subj;
-		spaces = "  ";
-	} else {
-		len_from = 0;
-		len_subj = (max_subj + max_from + 2) - BLANK_GROUP_COLS;
-		spaces = "";
-	}
-
-	/* which information should be displayed? */
-	if (tinrc.show_info == SHOW_INFO_NOTHING)
-		len_subj += 11;
-	else if (tinrc.show_info == SHOW_INFO_LINES)
-		len_subj += 6;
-	else if (tinrc.show_info == SHOW_INFO_SCORE)
-		len_subj += 5;
-}
-
-
-void
-toggle_subject_from(
-	void)
-{
-	if (++CURR_GROUP.attribute->show_author > SHOW_FROM_BOTH)
-		CURR_GROUP.attribute->show_author = SHOW_FROM_NONE;
-
-	set_subj_from_size(cCOLS);
-}
-
-
 /*
  *	Builds the correct header for multipart messages when sorting via
  *	THREAD_MULTI.
@@ -1172,38 +1114,89 @@ build_multipart_header(
 /*
  * Build subject line given an index into base[].
  *
- * WARNING: the routine is tightly coupled with draw_line() in the sense
- * that draw_line() expects build_sline() to place the article mark
- * (ART_MARK_READ, ART_MARK_SELECTED, etc) at MARK_OFFSET in the
- * screen[].col.
- * So, if you change the format used in this routine, be sure to check
- * that the value of MARK_OFFSET (tin.h) is still correct.
+ * WARNING: some other code expects to find the article mark (ART_MARK_READ,
+ * ART_MARK_SELECTED, etc) at MARK_OFFSET from beginning of the line.
+ * So, if you change the format used in this routine, be sure to check that
+ * the value of MARK_OFFSET (tin.h) is still correct.
  * Yes, this is somewhat kludgy.
  */
 static void
 build_sline(
 	int i)
 {
+	const char *spaces = "XXXX";
 	char from[HEADER_LEN];
 	char new_resps[8];
 	char art_cnt[10];
 	char arts_sub[255];
 	int respnum;
 	int n, j;
+	int len_from;
+	int len_subj;
 	struct t_art_stat sbuf;
-#ifdef USE_CURSES
-	char buffer[BUFSIZ];	/* FIXME: allocate? */
-#else
 	char *buffer;
-#endif /* USE_CURSES */
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 	size_t len;
 	wchar_t format[32];
 	wchar_t wbuffer[LEN];
-	wchar_t tmp_subj[256], tmp_subj2[256];
-	wchar_t tmp_from[HEADER_LEN], tmp_from2[HEADER_LEN];
+	wchar_t *tmp_subj = NULL, *tmp_subj2;
+	wchar_t *tmp_from = NULL, *tmp_from2;
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
+	/* set len_from and len_subj */
+	{
+		int max_from;
+		int max_subj;
+		int num_cols = cCOLS - 1;
+
+		max_subj = ((curr_group->attribute->show_author == SHOW_FROM_BOTH) ? ((num_cols / 2) - 4): ((num_cols / 2) + 3));
+		max_from = (num_cols - max_subj) - 17;
+
+		if (curr_group->attribute->show_author != SHOW_FROM_BOTH) {
+			if (max_from > 25) {
+				max_subj += max_from - 25;
+				max_from = 25;
+			}
+		}
+
+		if (curr_group->attribute->show_author != SHOW_FROM_NONE) {
+			len_from = max_from - BLANK_GROUP_COLS;
+			len_subj = max_subj;
+			spaces = "  ";
+		} else {
+			len_from = 0;
+			len_subj = (max_subj + max_from + 2) - BLANK_GROUP_COLS;
+			spaces = "";
+		}
+
+		/* which information should be displayed? */
+		switch (curr_group->attribute->show_info) {
+			case SHOW_INFO_NOTHING:
+				len_subj += 11;
+				break;
+
+			case SHOW_INFO_LINES:
+				len_subj += 6;
+				break;
+
+			case SHOW_INFO_SCORE:
+				len_subj += 5;
+				break;
+		}
+	}
+
+#ifdef USE_CURSES
+	/*
+	 * Allocate line buffer
+	 * make it the same size like in !USE_CURSES case to simplify the code
+	 */
+#	if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		buffer = my_malloc(cCOLS * MB_CUR_MAX + 2);
+#	else
+		buffer = my_malloc(cCOLS + 2);
+#	endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+#endif /* USE_CURSES */
+
 	from[0] = '\0';
 	respnum = (int) base[i];
 
@@ -1212,7 +1205,7 @@ build_sline(
 	/*
 	 * n is number of articles in this thread
 	 */
-	n = ((CURR_GROUP.attribute->show_only_unread) ? (sbuf.unread + sbuf.seen) : sbuf.total);
+	n = ((curr_group->attribute->show_only_unread) ? (sbuf.unread + sbuf.seen) : sbuf.total);
 	/*
 	 * if you like to see the number of responses excluding the first
 	 *	art in thread - add the following:
@@ -1222,35 +1215,36 @@ build_sline(
 	if ((j = line_is_tagged(respnum)))
 		strcpy(new_resps, tin_ltoa(j, 3));
 	else
-		sprintf(new_resps, "  %c", sbuf.art_mark);
+		snprintf(new_resps, sizeof(new_resps), "  %c", sbuf.art_mark);
 
 	/*
 	 * Find index of first unread in this thread
 	 */
 	j = (sbuf.unread) ? next_unread(respnum) : respnum;
 
-	if (tinrc.show_info == SHOW_INFO_LINES || tinrc.show_info == SHOW_INFO_BOTH) {
+	if (curr_group->attribute->show_info == SHOW_INFO_LINES || curr_group->attribute->show_info == SHOW_INFO_BOTH) {
 		if (n > 1) { /* change this to (n > 0) if you do a n-- above */
 			if (arts[j].line_count != -1) {
 				char tmp_buffer[4];
-				strcpy(tmp_buffer, tin_ltoa(n, 3));
-				sprintf(art_cnt, "%s %s ", tmp_buffer, tin_ltoa(arts[j].line_count, 4));
+
+				STRCPY(tmp_buffer, tin_ltoa(n, 3));
+				snprintf(art_cnt, sizeof(art_cnt), "%s %s ", tmp_buffer, tin_ltoa(arts[j].line_count, 4));
 			} else
-				sprintf(art_cnt, "%s    ? ", tin_ltoa(n, 3));
+				snprintf(art_cnt, sizeof(art_cnt), "%s    ? ", tin_ltoa(n, 3));
 		} else {
 			if (arts[j].line_count != -1)
-				sprintf(art_cnt, "    %s ", tin_ltoa(arts[j].line_count, 4));
+				snprintf(art_cnt, sizeof(art_cnt), "    %s ", tin_ltoa(arts[j].line_count, 4));
 			else
 				strcpy(art_cnt, "       ? ");
 		}
 	} else {
 		if (n > 1) /* change this to (n > 0) if you do a n-- above */
-			sprintf(art_cnt, "%s ", tin_ltoa(n, 3));
+			snprintf(art_cnt, sizeof(art_cnt), "%s ", tin_ltoa(n, 3));
 		else
 			strcpy(art_cnt, "    ");
 	}
 
-	if (CURR_GROUP.attribute->show_author != SHOW_FROM_NONE)
+	if (curr_group->attribute->show_author != SHOW_FROM_NONE)
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 		/* ignore len_from for now, we truncate it later */
 		get_author(FALSE, &arts[j], from, sizeof(from) - 1);
@@ -1268,16 +1262,53 @@ build_sline(
 #endif /* !USE_CURSES */
 
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	mbstowcs(tmp_subj2, arts_sub, ARRAY_SIZE(tmp_subj2) - 1);
-	mbstowcs(tmp_from2, from, ARRAY_SIZE(tmp_from2) - 1);
-	tmp_subj2[ARRAY_SIZE(tmp_subj2) - 1] = (wchar_t) '\0';
-	tmp_from2[ARRAY_SIZE(tmp_from2) - 1] = (wchar_t) '\0';
-
 	/* format subject and from */
-	wcspart(tmp_subj, tmp_subj2, len_subj - 12, ARRAY_SIZE(tmp_subj), TRUE);
-	wcspart(tmp_from, tmp_from2, len_from, ARRAY_SIZE(tmp_from), TRUE);
+	if ((tmp_subj2 = char2wchar_t(arts_sub)) != NULL) {
+		tmp_subj = wcspart(tmp_subj2, len_subj - 12, TRUE);
+		free(tmp_subj2);
+	} else {
+		wchar_t wc[1] = {0};
 
-	if (tinrc.show_info == SHOW_INFO_SCORE || tinrc.show_info == SHOW_INFO_BOTH) {
+		tmp_subj = wcspart(wc, len_subj - 12, TRUE);
+	}
+
+	if ((tmp_from2 = char2wchar_t(from)) != NULL) {
+		tmp_from = wcspart(tmp_from2, len_from, TRUE);
+		free(tmp_from2);
+	} else {
+		wchar_t wc[1] = {0};
+
+		tmp_from = wcspart(wc, len_from, TRUE);
+	}
+
+#	if 0 /* use additional space if !draw_arrow - usefull? */
+	if (!tinrc.draw_arrow) {
+		if (curr_group->attribute->show_info == SHOW_INFO_SCORE || curr_group->attribute->show_info == SHOW_INFO_BOTH) {
+			mbstowcs(format, "%s %s %s%6d %-ls%s%-ls", ARRAY_SIZE(format) - 1);
+			swprintf(wbuffer, ARRAY_SIZE(wbuffer) - 1, format,
+				 tin_ltoa(i + 1, 6), new_resps, art_cnt, sbuf.score, tmp_subj,
+				 spaces, tmp_from);
+		} else {
+			mbstowcs(format, "%s %s %s %-ls%s%-ls", ARRAY_SIZE(format) - 1);
+			swprintf(wbuffer, ARRAY_SIZE(wbuffer) - 1, format,
+				 tin_ltoa(i + 1, 6), new_resps, art_cnt, tmp_subj,
+				 spaces, tmp_from);
+		}
+	} else {
+		if (curr_group->attribute->show_info == SHOW_INFO_SCORE || curr_group->attribute->show_info == SHOW_INFO_BOTH) {
+			mbstowcs(format, "  %s %s %s%6d %-ls%s%-ls", ARRAY_SIZE(format) - 1);
+			swprintf(wbuffer, ARRAY_SIZE(wbuffer) - 1, format,
+				 tin_ltoa(i + 1, 4), new_resps, art_cnt, sbuf.score, tmp_subj,
+				 spaces, tmp_from);
+		} else {
+			mbstowcs(format, "  %s %s %s %-ls%s%-ls", ARRAY_SIZE(format) - 1);
+			swprintf(wbuffer, ARRAY_SIZE(wbuffer) - 1, format,
+				 tin_ltoa(i + 1, 4), new_resps, art_cnt, tmp_subj,
+				 spaces, tmp_from);
+		}
+	}
+#	else
+	if (curr_group->attribute->show_info == SHOW_INFO_SCORE || curr_group->attribute->show_info == SHOW_INFO_BOTH) {
 		mbstowcs(format, "  %s %s %s%6d %-ls%s%-ls", ARRAY_SIZE(format) - 1);
 		swprintf(wbuffer, ARRAY_SIZE(wbuffer) - 1, format,
 			 tin_ltoa(i + 1, 4), new_resps, art_cnt, sbuf.score, tmp_subj,
@@ -1288,36 +1319,66 @@ build_sline(
 			 tin_ltoa(i + 1, 4), new_resps, art_cnt, tmp_subj,
 			 spaces, tmp_from);
 	}
+#	endif /* 0 */
+
+	FreeIfNeeded(tmp_subj);
+	FreeIfNeeded(tmp_from);
 
-#	ifdef USE_CURSES
-	if ((len = wcstombs(buffer, wbuffer, BUFSIZ - 1)) == (size_t) -1)
-#	else
 	if ((len = wcstombs(buffer, wbuffer, cCOLS * MB_CUR_MAX)) == (size_t) -1)
-#	endif /* USE_CURSES */
 		len = 0;
 	buffer[len] = '\0';
 #else
 	arts_sub[len_subj - 12 + 1] = '\0';
 
-	if (tinrc.show_info == SHOW_INFO_SCORE || tinrc.show_info == SHOW_INFO_BOTH)
-		sprintf(buffer, "  %s %s %s%6d %-*.*s%s%-*.*s",
+#	if 0 /* use additional space if !draw_arrow - usefull? */
+	if (!tinrc.draw_arrow) {
+		if (curr_group->attribute->show_info == SHOW_INFO_SCORE || curr_group->attribute->show_info == SHOW_INFO_BOTH)
+			snprintf(buffer, cCOLS + 1, "%s %s %s%6d %-*.*s%s%-*.*s",
+				 tin_ltoa(i + 1, 6), new_resps, art_cnt, sbuf.score,
+				 len_subj - 12, len_subj - 12, arts_sub,
+				 spaces, len_from, len_from, from);
+		else
+			snprintf(buffer, cCOLS + 1, "%s %s %s%-*.*s%s%-*.*s",
+				 tin_ltoa(i + 1, 6), new_resps, art_cnt,
+				 len_subj - 12, len_subj - 12, arts_sub,
+				 spaces, len_from, len_from, from);
+	} else {
+		if (curr_group->attribute->show_info == SHOW_INFO_SCORE || curr_group->attribute->show_info == SHOW_INFO_BOTH)
+			snprintf(buffer, cCOLS + 1, "  %s %s %s%6d %-*.*s%s%-*.*s",
+				 tin_ltoa(i + 1, 4), new_resps, art_cnt, sbuf.score,
+				 len_subj - 12, len_subj - 12, arts_sub,
+				 spaces, len_from, len_from, from);
+		else
+			snprintf(buffer, cCOLS + 1, "  %s %s %s%-*.*s%s%-*.*s",
+				 tin_ltoa(i + 1, 4), new_resps, art_cnt,
+				 len_subj - 12, len_subj - 12, arts_sub,
+				 spaces, len_from, len_from, from);
+	}
+#	else
+	if (curr_group->attribute->show_info == SHOW_INFO_SCORE || curr_group->attribute->show_info == SHOW_INFO_BOTH)
+		snprintf(buffer, cCOLS + 1, "  %s %s %s%6d %-*.*s%s%-*.*s",
 			 tin_ltoa(i + 1, 4), new_resps, art_cnt, sbuf.score,
 			 len_subj - 12, len_subj - 12, arts_sub,
 			 spaces, len_from, len_from, from);
 	else
-		sprintf(buffer, "  %s %s %s%-*.*s%s%-*.*s",
+		snprintf(buffer, cCOLS + 1, "  %s %s %s%-*.*s%s%-*.*s",
 			 tin_ltoa(i + 1, 4), new_resps, art_cnt,
 			 len_subj - 12, len_subj - 12, arts_sub,
 			 spaces, len_from, len_from, from);
+#	endif /* 0 */
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
-#ifdef USE_CURSES
 	/*
 	 * protect display from non-displayable characters (e.g., form-feed)
 	 * and write line.
 	 */
 	WriteLine(INDEX2LNUM(i), convert_to_printable(buffer));
+
+#ifdef USE_CURSES
+	free(buffer);
 #endif /* USE_CURSES */
+	if (sbuf.art_mark == tinrc.art_marked_selected)
+		draw_mark_selected(i);
 }
 
 
@@ -1327,14 +1388,12 @@ show_group_title(
 {
 	char buf[LEN], tmp[LEN];
 	int i, art_cnt = 0, recent_art_cnt = 0, selected_art_cnt = 0, read_selected_art_cnt = 0, killed_art_cnt = 0;
-	struct t_group currgrp;
 
-	currgrp = CURR_GROUP;
 	for_each_art(i) {
 		if (arts[i].thread == ART_EXPIRED)
 			continue;
 
-		if (currgrp.attribute->show_only_unread) {
+		if (curr_group->attribute->show_only_unread) {
 			if (arts[i].status != ART_READ) {
 				art_cnt++;
 				if (tinrc.recent_time && ((time((time_t) 0) - arts[i].date) < (tinrc.recent_time * DAY)))
@@ -1363,23 +1422,23 @@ show_group_title(
 	 */
 	/* group name and thread count */
 	snprintf(buf, sizeof(buf), "%s (%d%c",
-		currgrp.name, grpmenu.max,
-		*txt_threading[currgrp.attribute->thread_arts]);
+		curr_group->name, grpmenu.max,
+		*txt_threading[curr_group->attribute->thread_arts]);
 
 	/* article count */
 	if (tinrc.getart_limit)
 		snprintf(tmp, sizeof(tmp), " %d/%d%c",
 			tinrc.getart_limit, art_cnt,
-			(currgrp.attribute->show_only_unread ? tinrc.art_marked_unread : tinrc.art_marked_read));
+			(curr_group->attribute->show_only_unread ? tinrc.art_marked_unread : tinrc.art_marked_read));
 	else
 		snprintf(tmp, sizeof(tmp), " %d%c",
 			art_cnt,
-			(currgrp.attribute->show_only_unread ? tinrc.art_marked_unread : tinrc.art_marked_read));
+			(curr_group->attribute->show_only_unread ? tinrc.art_marked_unread : tinrc.art_marked_read));
 	if (sizeof(buf) > strlen(buf) + strlen(tmp))
 		strcat(buf, tmp);
 
 	/* selected articles */
-	if (currgrp.attribute->show_only_unread)
+	if (curr_group->attribute->show_only_unread)
 		snprintf(tmp, sizeof(tmp), " %d%c",
 			selected_art_cnt, tinrc.art_marked_selected);
 	else
@@ -1406,7 +1465,7 @@ show_group_title(
 
 	/* group flag */
 	snprintf(tmp, sizeof(tmp), ") %c",
-		group_flag(currgrp.moderated));
+		group_flag(curr_group->moderated));
 	if (sizeof(buf) > strlen(buf) + strlen(tmp))
 		strcat(buf, tmp);
 
@@ -1424,8 +1483,7 @@ show_group_title(
  */
 static int
 do_search(
-	int type,
-	t_bool forward,
+	t_function func,
 	t_bool repeat)
 {
 	int start, n;
@@ -1436,9 +1494,10 @@ do_search(
 	/*
 	 * Not intuitive to search current thread in fwd search
 	 */
-	start = (forward && grpmenu.curr < grpmenu.max - 1) ? prev_response((int) base[grpmenu.curr + 1]) : (int) base[grpmenu.curr];
+	start = ((func == GLOBAL_SEARCH_SUBJECT_FORWARD || func == GLOBAL_SEARCH_AUTHOR_FORWARD)
+		&& grpmenu.curr < grpmenu.max - 1) ? prev_response((int) base[grpmenu.curr + 1]) : (int) base[grpmenu.curr];
 
-	if ((n = search(type, start, forward, repeat)) != -1) {
+	if ((n = search(func, start, repeat)) != -1) {
 		grpmenu.curr = which_thread(n);
 
 		/*
@@ -1492,7 +1551,7 @@ enter_thread(
 	}
 
 	forever {
-		switch (i = thread_page(&CURR_GROUP, (int) base[grpmenu.curr], depth, page)) {
+		switch (i = thread_page(curr_group, (int) base[grpmenu.curr], depth, page)) {
 			case GRP_QUIT:						/* 'Q'uit */
 			case GRP_RETSELECT:					/* Back to selection screen */
 				return i;
@@ -1562,31 +1621,31 @@ tab_pressed(
  */
 static int
 group_catchup(
-	int ch)
+	t_function func)
 {
 	char buf[LEN];
 	int pyn = 1;
 
-	if (num_of_tagged_arts && prompt_yn(cLINES, _(txt_catchup_despite_tags), TRUE) != 1)
+	if (num_of_tagged_arts && prompt_yn(_(txt_catchup_despite_tags), TRUE) != 1)
 		return 0;
 
-	snprintf(buf, sizeof(buf), _(txt_mark_arts_read), (ch == iKeyGroupCatchupNextUnread) ? _(txt_enter_next_unread_group) : "");
+	snprintf(buf, sizeof(buf), _(txt_mark_arts_read), (func == CATCHUP_NEXT_UNREAD) ? _(txt_enter_next_unread_group) : "");
 
-	if (!CURR_GROUP.newsrc.num_unread || (!TINRC_CONFIRM_ACTION) || (pyn = prompt_yn(cLINES, buf, TRUE)) == 1)
-		grp_mark_read(&CURR_GROUP, arts);
+	if (!curr_group->newsrc.num_unread || (!TINRC_CONFIRM_ACTION) || (pyn = prompt_yn(buf, TRUE)) == 1)
+		grp_mark_read(curr_group, arts);
 
-	switch (ch) {
-		case iKeyGroupCatchup:				/* 'c' */
+	switch (func) {
+		case CATCHUP:				/* 'c' */
 			if (pyn == 1)
 				return GRP_NEXT;
 			break;
 
-		case iKeyGroupCatchupNextUnread:	/* 'C' */
+		case CATCHUP_NEXT_UNREAD:			/* 'C' */
 			if (pyn == 1)
 				return GRP_NEXTUNREAD;
 			break;
 
-		case iKeyCatchupLeft:				/* <- group catchup on exit */
+		case SPECIAL_CATCHUP_LEFT:				/* <- group catchup on exit */
 			switch (pyn) {
 				case -1:					/* ESCAPE - do nothing */
 					break;
@@ -1638,7 +1697,7 @@ mark_thd_read(
 	t_bool range_active)
 {
 	char keytagged[MAXKEYLEN], keycurrent[MAXKEYLEN], keyquit[MAXKEYLEN];
-	int ch = iKeyMarkReadCur;
+	t_function func = MARK_READ_CURRENT;
 	int n, cnt = 0;
 	int tmp_num_of_tagged_arts = num_of_tagged_arts;
 
@@ -1649,20 +1708,19 @@ mark_thd_read(
 
 	/* Don't prompt if there's an active range or if prompting is turned off */
 	if (!range_active && !tinrc.mark_ignore_tags && got_tagged_unread_arts()) {
-		ch = prompt_slk_response(iKeyMarkReadTag,
-				&menukeymap.mark_read_tagged_current,
+		func = prompt_slk_response(MARK_READ_TAGGED, mark_read_keys,
 				_(txt_mark_thread_read_tagged_current),
-				printascii(keytagged, map_to_local(iKeyMarkReadTag, &menukeymap.mark_read_tagged_current)),
-				printascii(keycurrent, map_to_local(iKeyMarkReadCur, &menukeymap.mark_read_tagged_current)),
-				printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.mark_read_tagged_current)));
+				printascii(keytagged, func_to_key(MARK_READ_TAGGED, mark_read_keys)),
+				printascii(keycurrent, func_to_key(MARK_READ_CURRENT, mark_read_keys)),
+				printascii(keyquit, func_to_key(GLOBAL_QUIT, mark_read_keys)));
 	}
 
-	switch (ch) {
-		case iKeyMarkReadTag: /* mark tagged unread articles/threads as read */
+	switch (func) {
+		case MARK_READ_TAGGED: /* mark tagged unread articles/threads as read */
 			cnt = mark_tagged_read(group);
 			break;
 
-		case iKeyMarkReadCur: /* mark current thread/range as read */
+		case MARK_READ_CURRENT: /* mark current thread/range as read */
 			/*
 			 * If a range is active, use it.
 			 */
@@ -1682,9 +1740,11 @@ mark_thd_read(
 				thd_mark_read(group, base[grpmenu.curr]);
 			break;
 
-		case iKeyQuit: /* cancel operation */
-		case iKeyAbort:
+		case GLOBAL_QUIT: /* cancel operation */
+		case GLOBAL_ABORT:
+		default:
 			return;
+			/* NOTREACHED */
 			break;
 	}
 
@@ -1696,12 +1756,10 @@ mark_thd_read(
 	/*
 	 * Refresh current line or, if necessary, whole group page
 	 */
-	if (range_active || ch == iKeyMarkReadTag)
+	if (range_active || func == MARK_READ_TAGGED)
 		show_group_page();
-	else {
+	else
 		build_sline(grpmenu.curr);
-		draw_line(grpmenu.curr, MAGIC);
-	}
 
 	/*
 	 * Move cursor to next unread
@@ -1720,6 +1778,6 @@ mark_thd_read(
 
 	move_to_item(n);
 
-	if (ch == iKeyMarkReadTag)
+	if (func == MARK_READ_TAGGED)
 		info_message(_(txt_marked_tagged_arts_as_read), cnt, tmp_num_of_tagged_arts, PLURAL(tmp_num_of_tagged_arts, txt_article));
 }
diff -Nurp tin-1.6.2/src/hashstr.c tin-1.8.0/src/hashstr.c
--- tin-1.6.2/src/hashstr.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/hashstr.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : hashstr.c
  *  Author    : I. Lea & R. Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 1994-12-01
+ *  Updated   : 2003-09-19
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
 
  * All rights reserved.
  *
@@ -55,12 +55,7 @@
  */
 #define HASHNODE_TABLE_SIZE	2411
 
-#ifdef M_AMIGA
-	static struct t_hashnode **table = 0;
-#else
-	static struct t_hashnode *table[HASHNODE_TABLE_SIZE];
-#endif /* M_AMIGA */
-
+static struct t_hashnode *table[HASHNODE_TABLE_SIZE];
 static struct t_hashnode *add_string(const char *s);
 
 char *
@@ -73,7 +68,7 @@ hash_str(
 	struct t_hashnode **p;	/* used to descend the spillover structs */
 
 	if (s == NULL)
-		return (char *) 0;
+		return NULL;
 
 	h = 0;
 	while (*t) {
@@ -132,11 +127,6 @@ hash_init(
 {
 	int i;
 
-#ifdef M_AMIGA
-	if (!table)
-		table = my_malloc(HASHNODE_TABLE_SIZE * sizeof(void *));
-#endif /* M_AMIGA */
-
 	for (i = 0; i < HASHNODE_TABLE_SIZE; i++)
 		table[i] = (struct t_hashnode *) 0;
 }
@@ -149,11 +139,6 @@ hash_reclaim(
 	int i;
 	struct t_hashnode *p, *next;
 
-#ifdef M_AMIGA
-	if (!table)
-		return;
-#endif /* M_AMIGA */
-
 	for (i = 0; i < HASHNODE_TABLE_SIZE; i++) {
 		if (table[i] != NULL) {
 			p = table[i];
diff -Nurp tin-1.6.2/src/header.c tin-1.8.0/src/header.c
--- tin-1.6.2/src/header.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/header.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,9 +3,9 @@
  *  Module    : header.c
  *  Author    : Urs Janssen <urs@tin.org>
  *  Created   : 1997-03-10
- *  Updated   : 2003-03-27
+ *  Updated   : 2005-07-09
  *
- * Copyright (c) 1997-2003 Urs Janssen <urs@tin.org>
+ * Copyright (c) 1997-2006 Urs Janssen <urs@tin.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -56,11 +56,6 @@ get_host_name(
 
 #ifdef HAVE_GETHOSTNAME
 	gethostname(hostname, sizeof(hostname) - 1);
-#else
-#	ifdef M_AMIGA
-	if ((ptr = getenv("NodeName")) != NULL)
-		strncpy(hostname, ptr, sizeof(hostname) - 1);
-#	endif /* M_AMIGA */
 #endif /* HAVE_GETHOSTNAME */
 #ifdef HAVE_SYS_UTSNAME_H
 	if (!*hostname)
@@ -85,7 +80,7 @@ get_host_name(
 /*
  * find domainname - check DOMAIN_NAME
  * TODO: check /etc/defaultdomain as a last resort?
- *       there is M_UNIX/M_AMIGA specific code in here, but no VMS
+ *       there is M_UNIX specific code in here, but no VMS
  *       alternative
  */
 const char *
@@ -97,28 +92,12 @@ get_domain_name(
 	char buff[MAXHOSTNAMELEN + 1];
 	static char domain[8192];
 
-#	ifdef M_AMIGA
-/*
- * Damn compiler bugs...
- * Without this hack, SASC 6.55 produces a TST.B d16(pc),
- * which is illegal on a 68000
- */
-static const char *domain_name_hack = DOMAIN_NAME;
-#		undef DOMAIN_NAME
-#		define DOMAIN_NAME domain_name_hack
-#	endif /* M_AMIGA */
-
 	domain[0] = '\0';
 
 	if (strlen(DOMAIN_NAME))
 		strcpy(domain, DOMAIN_NAME);
 
-#	ifdef M_AMIGA
-	if (strchr(domain, ':')) /* absolute AmigaOS paths contain ':', RFC-hostnames don't */
-#	else
-	if (domain[0] == '/' && domain[1])
-#	endif /* M_AMIGA */
-	{
+	if (domain[0] == '/' && domain[1]) {
 		/* read domainname from specified file */
 		if ((fp = fopen(domain, "r")) != NULL) {
 			while (fgets(buff, (int) sizeof(buff), fp) != NULL) {
@@ -130,11 +109,7 @@ static const char *domain_name_hack = DO
 					strcpy(domain, buff);
 				}
 			}
-#	ifdef M_AMIGA
-			if (strchr(domain, ':'))	/* ':' is not allowed in domainames -> file was empty */
-#	else
 			if (domain[0] == '/')	/* '/' is not allowed in domainames -> file was empty */
-#	endif /* M_AMIGA */
 				domain[0] = '\0';
 
 			fclose(fp);
@@ -179,8 +154,9 @@ get_fqdn(
 
 #	ifdef HAVE_INET_ADDR
 	if ('0' <= *name && *name <= '9') {
-		in.s_addr = inet_addr(name);
-		if ((hp = gethostbyaddr((char *) &in.s_addr, 4, AF_INET)))
+		in_addr_t addr = inet_addr(name);
+
+		if ((hp = gethostbyaddr((char *) &addr, 4, AF_INET)))
 			in.s_addr = (*hp->h_addr);
 		return (hp && strchr(hp->h_name, '.') ? hp->h_name : inet_ntoa(in));
 	}
@@ -189,7 +165,7 @@ get_fqdn(
 		if ((hp = gethostbyaddr(hp->h_addr, hp->h_length, hp->h_addrtype)))
 			in.s_addr = (*hp->h_addr);
 
-	sprintf(fqdn, "%s", hp
+	snprintf(fqdn, sizeof(fqdn), "%s", hp
 		? strchr(hp->h_name, '.')
 			? hp->h_name : inet_ntoa(in)
 		: "");
@@ -219,7 +195,7 @@ get_fqdn(
 				}
 			}
 			if (domain)
-				sprintf(fqdn, "%s.%s", name, strip_line(domain));
+				snprintf(fqdn, sizeof(fqdn), "%s.%s", name, strip_line(domain));
 
 			fclose(inf);
 		}
@@ -255,35 +231,25 @@ get_user_name(
 {
 	static char username[128];
 	struct passwd *pw;
-#if defined(M_AMIGA) || defined(VMS)
+#ifdef VMS
 	char *p;
-#endif /* M_AMIGA  || VMS */
+#endif /* VMS */
 
 	username[0] = '\0';
 
-#	ifdef M_AMIGA
-	if ((p = getenv("USERNAME"))) {
-		STRCPY(username, p);
-	}
-#	else
-#		ifndef VMS
+#ifndef VMS
 	if ((pw = getpwuid(getuid())) != NULL)
 		strcpy(username, pw->pw_name);
 	else
-#		else
+#else
 	if (((p = getlogin()) != NULL) && strlen(p)) {
 		if ((pw = getpwnam(p)) != NULL)
 			strcpy(username, pw->pw_name);
 	}
-#		endif /* !VMS */
-#	endif /* M_AMIGA */
+#endif /* !VMS */
 
 	if (!*username) {
-#	ifndef M_AMIGA
 		error_message(_(txt_error_passwd_missing));
-#	else
-		error_message(_(txt_env_var_not_found), "USERNAME");
-#	endif /* !M_AMIGA */
 		tin_done(EXIT_FAILURE);
 	}
 
@@ -407,9 +373,9 @@ build_sender(
 			strcat(sender, ptr);
 			strcat(sender, ">");
 		} else
-			return (char *) 0;
+			return NULL;
 	} else
-		return (char *) 0;
+		return NULL;
 
 	return sender;
 }
diff -Nurp tin-1.6.2/src/help.c tin-1.8.0/src/help.c
--- tin-1.6.2/src/help.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/help.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : help.c
  *  Author    : I. Lea
  *  Created   : 1991-04-01
- *  Updated   : 2003-05-15
+ *  Updated   : 2005-07-02
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,401 +41,396 @@
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
 
 
 typedef struct thp {
 	constext *helptext;
-	char key;
+	t_function func;
 } t_help_page;
 
 /*
  * local prototypes
  */
-static void make_help_page(FILE *fp, const t_help_page *helppage, const t_menukeys *menukeys);
+static void make_help_page(FILE *fp, const t_help_page *helppage, const struct keylist keys);
 
 
 static constext txt_help_empty_line[] = "";
 
 static t_help_page select_help_page[] = {
-	{ txt_help_title_navi, 0 },
-	{ txt_help_global_page_down, iKeyPageDown },
-	{ txt_help_global_page_down, iKeyPageDown2 },
-	{ txt_help_global_page_down, iKeyPageDown3 },
-	{ txt_help_global_page_up, iKeyPageUp2 },
-	{ txt_help_global_page_up, iKeyPageUp },
-	{ txt_help_global_page_up, iKeyPageUp3 },
-	{ txt_help_global_line_down, iKeyDown2 },
-	{ txt_help_global_line_down, iKeyDown },
-	{ txt_help_global_line_up, iKeyUp2 },
-	{ txt_help_global_line_up, iKeyUp },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_select_first_group, iKeyFirstPage },
-	{ txt_help_select_last_group, iKeyLastPage },
-	{ txt_help_select_group_by_num, 0 },
-	{ txt_help_select_goto_group, iKeySelectGoto },
-	{ txt_help_select_next_unread_group, iKeySelectNextUnreadGrp },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_select_search_group_forwards, iKeySearchSubjF },
-	{ txt_help_select_search_group_backwards, iKeySearchSubjB },
-	{ txt_help_select_search_group_comment, 0 },
-	{ txt_help_global_search_repeat, iKeySearchRepeat },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_title_disp, 0 },
-	{ txt_help_select_toggle_read_groups, iKeySelectToggleReadDisplay },
-	{ txt_help_global_toggle_info_line, iKeyToggleInfoLastLine },
-	{ txt_help_select_toggle_descriptions, iKeySelectToggleDescriptions },
-	{ txt_help_global_toggle_inverse_video, iKeyToggleInverseVideo },
+	{ txt_help_title_navi, NOT_ASSIGNED },
+	{ txt_help_global_page_down, GLOBAL_PAGE_DOWN },
+	{ txt_help_global_page_up, GLOBAL_PAGE_UP },
+	{ txt_help_global_line_down, GLOBAL_LINE_DOWN },
+	{ txt_help_global_line_up, GLOBAL_LINE_UP },
+	{ txt_help_global_scroll_down, GLOBAL_SCROLL_DOWN },
+	{ txt_help_global_scroll_up, GLOBAL_SCROLL_UP },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_select_first_group, GLOBAL_FIRST_PAGE },
+	{ txt_help_select_last_group, GLOBAL_LAST_PAGE },
+	{ txt_help_select_group_by_num, NOT_ASSIGNED },
+	{ txt_help_select_goto_group, SELECT_GOTO },
+	{ txt_help_select_next_unread_group, SELECT_NEXT_UNREAD_GROUP },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_select_search_group_forwards, GLOBAL_SEARCH_SUBJECT_FORWARD },
+	{ txt_help_select_search_group_backwards, GLOBAL_SEARCH_SUBJECT_BACKWARD },
+	{ txt_help_select_search_group_comment, NOT_ASSIGNED },
+	{ txt_help_global_search_repeat, GLOBAL_SEARCH_REPEAT },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_title_disp, NOT_ASSIGNED },
+	{ txt_help_select_toggle_read_groups, SELECT_TOGGLE_READ_DISPLAY },
+	{ txt_help_global_toggle_info_line, GLOBAL_TOGGLE_INFO_LAST_LINE },
+	{ txt_help_select_toggle_descriptions, SELECT_TOGGLE_DESCRIPTIONS },
+	{ txt_help_global_toggle_inverse_video, GLOBAL_TOGGLE_INVERSE_VIDEO },
 #ifdef HAVE_COLOR
-	{ txt_help_global_toggle_color, iKeyToggleColor },
+	{ txt_help_global_toggle_color, GLOBAL_TOGGLE_COLOR },
 #endif /* HAVE_COLOR */
-	{ txt_help_empty_line, 0 },
-	{ txt_help_select_sort_active, iKeySelectSortActive },
-	{ txt_help_select_yank_active, iKeySelectYankActive },
-	{ txt_help_select_sync_with_active, iKeySelectSyncWithActive },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_title_ops, 0 },
-	{ txt_help_select_read_group, iKeySelectReadGrp },
-	{ txt_help_select_next_unread_group, iKeySelectEnterNextUnreadGrp2 },
-	{ txt_help_select_next_unread_group, iKeySelectEnterNextUnreadGrp },
-	{ txt_help_global_post, iKeyPost },
-	{ txt_help_global_post_postponed, iKeyPostponed2 },
-	{ txt_help_global_post_postponed, iKeyPostponed },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_select_group_range, iKeySetRange },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_select_catchup, iKeySelectCatchup },
-	{ txt_help_select_catchup_next_unread, iKeySelectCatchupNextUnread },
-	{ txt_help_select_mark_group_unread, iKeySelectMarkGrpUnread },
-	{ txt_help_select_mark_group_unread, iKeySelectMarkGrpUnread2 },
-	{ txt_help_select_subscribe, iKeySelectSubscribe },
-	{ txt_help_select_unsubscribe, iKeySelectUnsubscribe },
-	{ txt_help_select_subscribe_pattern, iKeySelectSubscribePat },
-	{ txt_help_select_unsubscribe_pattern, iKeySelectUnsubscribePat },
-	{ txt_help_select_move_group, iKeySelectMoveGrp },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_title_misc, 0 },
-	{ txt_help_select_quit, iKeyQuit },
-	{ txt_help_global_quit_tin, iKeyQuitTin },
-	{ txt_help_select_quit_no_write, iKeySelectQuitNoWrite },
-	{ txt_help_global_help, iKeyHelp },
-	{ txt_help_global_toggle_mini_help, iKeyToggleHelpDisplay },
-	{ txt_help_global_option_menu, iKeyOptionMenu },
-	{ txt_help_global_esc, iKeyAbort },
-	{ txt_help_global_redraw_screen, iKeyRedrawScr },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_select_sort_active, SELECT_SORT_ACTIVE },
+	{ txt_help_select_yank_active, SELECT_YANK_ACTIVE },
+	{ txt_help_select_sync_with_active, SELECT_SYNC_WITH_ACTIVE },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_title_ops, NOT_ASSIGNED },
+	{ txt_help_select_read_group, SELECT_ENTER_GROUP },
+	{ txt_help_select_next_unread_group, SELECT_ENTER_NEXT_UNREAD_GROUP },
+#ifndef NO_POSTING
+	{ txt_help_global_post, GLOBAL_POST },
+	{ txt_help_global_post_postponed, GLOBAL_POSTPONED },
+#endif /* NO_POSTING */
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_select_group_range, GLOBAL_SET_RANGE },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_select_catchup, CATCHUP },
+	{ txt_help_select_catchup_next_unread, CATCHUP_NEXT_UNREAD },
+	{ txt_help_select_mark_group_unread, SELECT_MARK_GROUP_UNREAD },
+	{ txt_help_select_subscribe, SELECT_SUBSCRIBE },
+	{ txt_help_select_unsubscribe, SELECT_UNSUBSCRIBE },
+	{ txt_help_select_subscribe_pattern, SELECT_SUBSCRIBE_PATTERN },
+	{ txt_help_select_unsubscribe_pattern, SELECT_UNSUBSCRIBE_PATTERN },
+	{ txt_help_select_move_group, SELECT_MOVE_GROUP },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_edit_filter, GLOBAL_EDIT_FILTER},
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_title_misc, NOT_ASSIGNED },
+	{ txt_help_select_quit, GLOBAL_QUIT },
+	{ txt_help_global_quit_tin, GLOBAL_QUIT_TIN },
+	{ txt_help_select_quit_no_write, SELECT_QUIT_NO_WRITE },
+	{ txt_help_global_help, GLOBAL_HELP },
+	{ txt_help_global_toggle_mini_help, GLOBAL_TOGGLE_HELP_DISPLAY },
+	{ txt_help_global_option_menu, GLOBAL_OPTION_MENU },
+	{ txt_help_global_esc, GLOBAL_ABORT },
+	{ txt_help_global_redraw_screen, GLOBAL_REDRAW_SCREEN },
 #ifndef NO_SHELL_ESCAPE
-	{ txt_help_global_shell_escape, iKeyShellEscape },
+	{ txt_help_global_shell_escape, GLOBAL_SHELL_ESCAPE },
 #endif /* !NO_SHELL_ESCAPE */
-	{ txt_help_global_posting_history, iKeyDisplayPostHist },
-	{ txt_help_select_reset_newsrc, iKeySelectResetNewsrc },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_version, iKeyVersion },
-	{ txt_help_bug_report, iKeySelectBugReport },
-	{ NULL, 0 }
+	{ txt_help_global_posting_history, GLOBAL_DISPLAY_POST_HISTORY },
+	{ txt_help_select_reset_newsrc, SELECT_RESET_NEWSRC },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_version, GLOBAL_VERSION },
+	{ txt_help_bug_report, GLOBAL_BUGREPORT },
+	{ NULL, NOT_ASSIGNED }
 };
 
 static t_help_page group_help_page[] = {
-	{ txt_help_title_navi, 0 },
-	{ txt_help_global_page_down, iKeyPageDown },
-	{ txt_help_global_page_down, iKeyPageDown2 },
-	{ txt_help_global_page_down, iKeyPageDown3 },
-	{ txt_help_global_page_up, iKeyPageUp2 },
-	{ txt_help_global_page_up, iKeyPageUp },
-	{ txt_help_global_page_up, iKeyPageUp3 },
-	{ txt_help_global_line_down, iKeyDown2 },
-	{ txt_help_global_line_down, iKeyDown },
-	{ txt_help_global_line_up, iKeyUp2 },
-	{ txt_help_global_line_up, iKeyUp },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_group_first_thread, iKeyFirstPage },
-	{ txt_help_group_last_thread, iKeyLastPage },
-	{ txt_help_group_thread_by_num, 0 },
-	{ txt_help_group_goto_group, iKeyGroupGoto },
-	{ txt_help_group_next, iKeyGroupNextGroup },
-	{ txt_help_group_prev, iKeyGroupPrevGroup },
-	{ txt_help_group_next_unread_art, iKeyGroupNextUnreadArt },
-	{ txt_help_group_prev_unread_art, iKeyGroupPrevUnreadArt },
-	{ txt_help_global_last_art, iKeyLastViewed },
-	{ txt_help_global_lookup_art, iKeyLookupMessage },
-	{ txt_help_group_list_thread, iKeyGroupListThd },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_search_subj_forwards, iKeySearchSubjF },
-	{ txt_help_global_search_subj_backwards, iKeySearchSubjB },
-	{ txt_help_global_search_auth_forwards, iKeySearchAuthF },
-	{ txt_help_global_search_auth_backwards, iKeySearchAuthB },
-	{ txt_help_global_search_body, iKeySearchBody },
-	{ txt_help_global_search_body_comment, 0 },
-	{ txt_help_global_search_repeat, iKeySearchRepeat },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_title_disp, 0 },
-	{ txt_help_group_toggle_read_articles, iKeyGroupToggleReadUnread },
-	{ txt_help_global_toggle_info_line, iKeyToggleInfoLastLine },
-	{ txt_help_group_toggle_subj_display, iKeyGroupToggleSubjDisplay },
-	{ txt_help_global_toggle_inverse_video, iKeyToggleInverseVideo },
+	{ txt_help_title_navi, NOT_ASSIGNED },
+	{ txt_help_global_page_down, GLOBAL_PAGE_DOWN },
+	{ txt_help_global_page_up, GLOBAL_PAGE_UP },
+	{ txt_help_global_line_down, GLOBAL_LINE_DOWN },
+	{ txt_help_global_line_up, GLOBAL_LINE_UP },
+	{ txt_help_global_scroll_down, GLOBAL_SCROLL_DOWN },
+	{ txt_help_global_scroll_up, GLOBAL_SCROLL_UP },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_group_first_thread, GLOBAL_FIRST_PAGE },
+	{ txt_help_group_last_thread, GLOBAL_LAST_PAGE },
+	{ txt_help_group_thread_by_num, NOT_ASSIGNED },
+	{ txt_help_select_goto_group, GROUP_GOTO },
+	{ txt_help_group_next, GROUP_NEXT_GROUP },
+	{ txt_help_group_prev, GROUP_PREVIOUS_GROUP },
+	{ txt_help_article_next_unread, GROUP_NEXT_UNREAD_ARTICLE },
+	{ txt_help_article_prev_unread, GROUP_PREVIOUS_UNREAD_ARTICLE },
+	{ txt_help_global_last_art, GLOBAL_LAST_VIEWED },
+	{ txt_help_global_lookup_art, GLOBAL_LOOKUP_MESSAGEID },
+	{ txt_help_group_list_thread, GROUP_LIST_THREAD },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_search_subj_forwards, GLOBAL_SEARCH_SUBJECT_FORWARD },
+	{ txt_help_global_search_subj_backwards, GLOBAL_SEARCH_SUBJECT_BACKWARD },
+	{ txt_help_global_search_auth_forwards, GLOBAL_SEARCH_AUTHOR_FORWARD },
+	{ txt_help_global_search_auth_backwards, GLOBAL_SEARCH_AUTHOR_BACKWARD },
+	{ txt_help_global_search_body, GLOBAL_SEARCH_BODY },
+	{ txt_help_global_search_body_comment, NOT_ASSIGNED },
+	{ txt_help_global_search_repeat, GLOBAL_SEARCH_REPEAT },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_title_disp, NOT_ASSIGNED },
+	{ txt_help_group_toggle_read_articles, GROUP_TOGGLE_READ_UNREAD },
+	{ txt_help_global_toggle_info_line, GLOBAL_TOGGLE_INFO_LAST_LINE },
+	{ txt_help_select_toggle_descriptions, SELECT_TOGGLE_DESCRIPTIONS },
+	{ txt_help_global_toggle_inverse_video, GLOBAL_TOGGLE_INVERSE_VIDEO },
 #ifdef HAVE_COLOR
-	{ txt_help_global_toggle_color, iKeyToggleColor },
+	{ txt_help_global_toggle_color, GLOBAL_TOGGLE_COLOR },
 #endif /* HAVE_COLOR */
-	{ txt_help_empty_line, 0 },
-	{ txt_help_group_toggle_threading, iKeyGroupToggleThreading },
-	{ txt_help_group_mark_unsel_art_read, iKeyGroupMarkUnselArtRead },
-	{ txt_help_group_toggle_getart_limit, iKeyGroupToggleGetartLimit },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_title_ops, 0 },
-	{ txt_help_group_read_article, iKeyGroupReadBasenote },
-	{ txt_help_group_next_unread_article, iKeyGroupNextUnreadArtOrGrp },
-	{ txt_help_global_post, iKeyPost },
-	{ txt_help_global_post_postponed, iKeyPostponed2 },
-	{ txt_help_global_post_postponed, iKeyPostponed },
-	{ txt_help_group_repost, iKeyGroupRepost },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_article_range, iKeySetRange },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_mail, iKeyGroupMail },
-	{ txt_help_global_save, iKeyGroupSave },
-	{ txt_help_global_auto_save, iKeyGroupAutoSave },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_toggle_subj_display, GROUP_TOGGLE_SUBJECT_DISPLAY},
+	{ txt_help_group_toggle_threading, GROUP_TOGGLE_THREADING },
+	{ txt_help_group_mark_unsel_art_read, GROUP_MARK_UNSELECTED_ARTICLES_READ },
+	{ txt_help_group_toggle_getart_limit, GROUP_TOGGLE_GET_ARTICLES_LIMIT },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_title_ops, NOT_ASSIGNED },
+	{ txt_help_thread_read_article, GROUP_READ_BASENOTE },
+	{ txt_help_article_next_unread, GROUP_NEXT_UNREAD_ARTICLE_OR_GROUP },
+#ifndef NO_POSTING
+	{ txt_help_global_post, GLOBAL_POST },
+	{ txt_help_global_post_postponed, GLOBAL_POSTPONED },
+	{ txt_help_article_repost, GROUP_REPOST },
+#endif /* NO_POSTING */
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_article_range, GLOBAL_SET_RANGE },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_mail, GROUP_MAIL },
+	{ txt_help_global_save, GROUP_SAVE },
+	{ txt_help_global_auto_save, GROUP_AUTOSAVE },
 #ifndef DONT_HAVE_PIPING
-	{ txt_help_global_pipe, iKeyPipe },
+	{ txt_help_global_pipe, GLOBAL_PIPE },
 #endif /* !DONT_HAVE_PIPING */
 #ifndef DISABLE_PRINTING
-	{ txt_help_global_print, iKeyPrint },
+	{ txt_help_global_print, GLOBAL_PRINT },
 #endif /* !DISABLE_PRINTING */
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_tag, iKeyGroupTag },
-	{ txt_help_group_tag_parts, iKeyGroupTagParts },
-	{ txt_help_group_untag_thread, iKeyGroupUntag },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_group_mark_thread_read, iKeyGroupMarkThdRead },
-	{ txt_help_group_catchup, iKeyGroupCatchup },
-	{ txt_help_group_catchup_next, iKeyGroupCatchupNextUnread },
-	{ txt_help_group_mark_article_unread, iKeyGroupMarkArtUnread },
-	{ txt_help_group_mark_thread_unread, iKeyGroupMarkThdUnread },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_group_select_all, iKeyGroupDoAutoSel },
-	{ txt_help_group_select_thread, iKeyGroupSelThd },
-	{ txt_help_group_select_thread_pattern, iKeyGroupSelPattern },
-	{ txt_help_group_select_thread_if_unread_selected, iKeyGroupSelThdIfUnreadSelected },
-	{ txt_help_group_toggle_thread_selection, iKeyGroupToggleThdSel },
-	{ txt_help_group_reverse_thread_selection, iKeyGroupReverseSel },
-	{ txt_help_group_undo_thread_selection, iKeyGroupUndoSel },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_article_autoselect, iKeyGroupAutoSel },
-	{ txt_help_article_autokill, iKeyGroupKill },
-	{ txt_help_article_quick_select, iKeyGroupQuickAutoSel },
-	{ txt_help_article_quick_kill, iKeyGroupQuickKill },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_title_misc, 0 },
-	{ txt_help_global_previous_menu, iKeyQuit },
-	{ txt_help_global_quit_tin, iKeyQuitTin },
-	{ txt_help_global_help, iKeyHelp },
-	{ txt_help_global_toggle_mini_help, iKeyToggleHelpDisplay },
-	{ txt_help_global_option_menu, iKeyOptionMenu },
-	{ txt_help_global_esc, iKeyAbort },
-	{ txt_help_global_redraw_screen, iKeyRedrawScr },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_tag, GROUP_TAG },
+	{ txt_help_group_tag_parts, GROUP_TAG_PARTS },
+	{ txt_help_group_untag_thread, GROUP_UNTAG },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_group_mark_thread_read, GROUP_MARK_THREAD_READ },
+	{ txt_help_group_catchup, CATCHUP },
+	{ txt_help_group_catchup_next, CATCHUP_NEXT_UNREAD },
+	{ txt_help_group_mark_article_unread, MARK_ARTICLE_UNREAD },
+	{ txt_help_group_mark_thread_unread, MARK_THREAD_UNREAD },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_group_select_all, GROUP_DO_AUTOSELECT },
+	{ txt_help_group_select_thread, GROUP_SELECT_THREAD },
+	{ txt_help_group_select_thread_pattern, GROUP_SELECT_PATTERN },
+	{ txt_help_group_select_thread_if_unread_selected, GROUP_SELECT_THREAD_IF_UNREAD_SELECTED },
+	{ txt_help_group_toggle_thread_selection, GROUP_TOGGLE_SELECT_THREAD },
+	{ txt_help_group_reverse_thread_selection, GROUP_REVERSE_SELECTIONS },
+	{ txt_help_group_undo_thread_selection, GROUP_UNDO_SELECTIONS },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_article_autoselect, GLOBAL_MENU_FILTER_SELECT },
+	{ txt_help_article_autokill, GLOBAL_MENU_FILTER_KILL },
+	{ txt_help_article_quick_select, GLOBAL_QUICK_FILTER_SELECT },
+	{ txt_help_article_quick_kill, GLOBAL_QUICK_FILTER_KILL },
+	{ txt_help_global_edit_filter, GLOBAL_EDIT_FILTER},
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_title_misc, NOT_ASSIGNED },
+	{ txt_help_global_previous_menu, GLOBAL_QUIT },
+	{ txt_help_global_quit_tin, GLOBAL_QUIT_TIN },
+	{ txt_help_global_help, GLOBAL_HELP },
+	{ txt_help_global_toggle_mini_help, GLOBAL_TOGGLE_HELP_DISPLAY },
+	{ txt_help_global_option_menu, GLOBAL_OPTION_MENU },
+	{ txt_help_global_esc, GLOBAL_ABORT },
+	{ txt_help_global_redraw_screen, GLOBAL_REDRAW_SCREEN },
 #ifndef NO_SHELL_ESCAPE
-	{ txt_help_global_shell_escape, iKeyShellEscape },
+	{ txt_help_global_shell_escape, GLOBAL_SHELL_ESCAPE },
 #endif /* !NO_SHELL_ESCAPE */
-	{ txt_help_global_posting_history, iKeyDisplayPostHist },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_version, iKeyVersion },
-	{ txt_help_bug_report, iKeyGroupBugReport },
-	{ NULL, 0 }
+	{ txt_help_global_posting_history, GLOBAL_DISPLAY_POST_HISTORY },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_version, GLOBAL_VERSION },
+	{ txt_help_bug_report, GLOBAL_BUGREPORT },
+	{ NULL, NOT_ASSIGNED }
 };
 
 static t_help_page thread_help_page[] = {
-	{ txt_help_title_navi, 0 },
-	{ txt_help_global_page_down, iKeyPageDown },
-	{ txt_help_global_page_down, iKeyPageDown2 },
-	{ txt_help_global_page_down, iKeyPageDown3 },
-	{ txt_help_global_page_up, iKeyPageUp2 },
-	{ txt_help_global_page_up, iKeyPageUp },
-	{ txt_help_global_page_up, iKeyPageUp3 },
-	{ txt_help_global_line_down, iKeyDown2 },
-	{ txt_help_global_line_down, iKeyDown },
-	{ txt_help_global_line_up, iKeyUp2 },
-	{ txt_help_global_line_up, iKeyUp },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_thread_first_article, iKeyFirstPage },
-	{ txt_help_thread_last_article, iKeyLastPage },
-	{ txt_help_thread_article_by_num, 0 },
-	{ txt_help_global_last_art, iKeyLastViewed },
-	{ txt_help_global_lookup_art, iKeyLookupMessage },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_search_subj_forwards, iKeySearchSubjF },
-	{ txt_help_global_search_subj_backwards, iKeySearchSubjB },
-	{ txt_help_global_search_auth_forwards, iKeySearchAuthF },
-	{ txt_help_global_search_auth_backwards, iKeySearchAuthB },
-	{ txt_help_global_search_body, iKeySearchBody },
-	{ txt_help_global_search_body_comment, 0 },
-	{ txt_help_global_search_repeat, iKeySearchRepeat },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_title_disp, 0 },
-	{ txt_help_global_toggle_info_line, iKeyToggleInfoLastLine },
-	{ txt_help_thread_toggle_subj_display, iKeyThreadToggleSubjDisplay },
-	{ txt_help_global_toggle_inverse_video, iKeyToggleInverseVideo },
+	{ txt_help_title_navi, NOT_ASSIGNED },
+	{ txt_help_global_page_down, GLOBAL_PAGE_DOWN },
+	{ txt_help_global_page_up, GLOBAL_PAGE_UP },
+	{ txt_help_global_line_down, GLOBAL_LINE_DOWN },
+	{ txt_help_global_line_up, GLOBAL_LINE_UP },
+	{ txt_help_global_scroll_down, GLOBAL_SCROLL_DOWN },
+	{ txt_help_global_scroll_up, GLOBAL_SCROLL_UP },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_thread_first_article, GLOBAL_FIRST_PAGE },
+	{ txt_help_thread_last_article, GLOBAL_LAST_PAGE },
+	{ txt_help_thread_article_by_num, NOT_ASSIGNED },
+	{ txt_help_global_last_art, GLOBAL_LAST_VIEWED },
+	{ txt_help_global_lookup_art, GLOBAL_LOOKUP_MESSAGEID },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_search_subj_forwards, GLOBAL_SEARCH_SUBJECT_FORWARD },
+	{ txt_help_global_search_subj_backwards, GLOBAL_SEARCH_SUBJECT_BACKWARD },
+	{ txt_help_global_search_auth_forwards, GLOBAL_SEARCH_AUTHOR_FORWARD },
+	{ txt_help_global_search_auth_backwards, GLOBAL_SEARCH_AUTHOR_BACKWARD },
+	{ txt_help_global_search_body, GLOBAL_SEARCH_BODY },
+	{ txt_help_global_search_body_comment, NOT_ASSIGNED },
+	{ txt_help_global_search_repeat, GLOBAL_SEARCH_REPEAT },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_title_disp, NOT_ASSIGNED },
+	{ txt_help_global_toggle_info_line, GLOBAL_TOGGLE_INFO_LAST_LINE },
+	{ txt_help_global_toggle_subj_display, THREAD_TOGGLE_SUBJECT_DISPLAY},
+	{ txt_help_global_toggle_inverse_video, GLOBAL_TOGGLE_INVERSE_VIDEO },
 #ifdef HAVE_COLOR
-	{ txt_help_global_toggle_color, iKeyToggleColor },
+	{ txt_help_global_toggle_color, GLOBAL_TOGGLE_COLOR },
 #endif /* HAVE_COLOR */
-	{ txt_help_empty_line, 0 },
-	{ txt_help_title_ops, 0 },
-	{ txt_help_thread_read_article, iKeyThreadReadArt },
-	{ txt_help_article_read_next_unread, iKeyThreadReadNextArtOrThread },
-	{ txt_help_global_post, iKeyPost },
-	{ txt_help_global_post_postponed, iKeyPostponed2 },
-	{ txt_help_global_post_postponed, iKeyPostponed },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_article_range, iKeySetRange },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_mail, iKeyThreadMail },
-	{ txt_help_global_save, iKeyThreadSave },
-	{ txt_help_global_auto_save, iKeyThreadAutoSave },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_tag, iKeyThreadTag },
-	{ txt_help_group_untag_thread, iKeyThreadUntag },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_thread_mark_article_read, iKeyThreadMarkArtRead },
-	{ txt_help_thread_catchup, iKeyThreadCatchup },
-	{ txt_help_thread_catchup_next_unread, iKeyThreadCatchupNextUnread },
-	{ txt_help_group_mark_article_unread, iKeyGroupMarkArtUnread },
-	{ txt_help_group_mark_thread_unread, iKeyGroupMarkThdUnread },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_group_select_thread, iKeyThreadSelArt },
-	{ txt_help_group_toggle_thread_selection, iKeyThreadToggleArtSel },
-	{ txt_help_group_reverse_thread_selection, iKeyThreadReverseSel },
-	{ txt_help_group_undo_thread_selection, iKeyThreadUndoSel },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_title_misc, 0 },
-	{ txt_help_global_previous_menu, iKeyQuit },
-	{ txt_help_global_quit_tin, iKeyQuitTin },
-	{ txt_help_global_help, iKeyHelp },
-	{ txt_help_global_toggle_mini_help, iKeyToggleHelpDisplay },
-	{ txt_help_global_option_menu, iKeyOptionMenu },
-	{ txt_help_global_esc, iKeyAbort },
-	{ txt_help_global_redraw_screen, iKeyRedrawScr },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_title_ops, NOT_ASSIGNED },
+	{ txt_help_thread_read_article, THREAD_READ_ARTICLE },
+	{ txt_help_article_next_unread, THREAD_READ_NEXT_ARTICLE_OR_THREAD },
+#ifndef NO_POSTING
+	{ txt_help_global_post, GLOBAL_POST },
+	{ txt_help_global_post_postponed, GLOBAL_POSTPONED },
+#endif /* NO_POSTING */
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_article_range, GLOBAL_SET_RANGE },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_mail, THREAD_MAIL },
+	{ txt_help_global_save, THREAD_SAVE },
+	{ txt_help_global_auto_save, THREAD_AUTOSAVE },
+#ifndef DONT_HAVE_PIPING
+	{ txt_help_global_pipe, GLOBAL_PIPE },
+#endif /* !DONT_HAVE_PIPING */
+#ifndef DISABLE_PRINTING
+	{ txt_help_global_print, GLOBAL_PRINT },
+#endif /* !DISABLE_PRINTING */
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_tag, THREAD_TAG },
+	{ txt_help_group_untag_thread, THREAD_UNTAG },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_thread_mark_article_read, THREAD_MARK_ARTICLE_READ },
+	{ txt_help_thread_catchup, CATCHUP },
+	{ txt_help_thread_catchup_next_unread, CATCHUP_NEXT_UNREAD },
+	{ txt_help_group_mark_article_unread, MARK_ARTICLE_UNREAD },
+	{ txt_help_group_mark_thread_unread, MARK_THREAD_UNREAD },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_group_select_thread, THREAD_SELECT_ARTICLE },
+	{ txt_help_group_toggle_thread_selection, THREAD_TOGGLE_ARTICLE_SELECTION },
+	{ txt_help_group_reverse_thread_selection, THREAD_REVERSE_SELECTIONS },
+	{ txt_help_group_undo_thread_selection, THREAD_UNDO_SELECTIONS },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_article_autoselect, GLOBAL_MENU_FILTER_SELECT },
+	{ txt_help_article_autokill, GLOBAL_MENU_FILTER_KILL },
+	{ txt_help_global_edit_filter, GLOBAL_EDIT_FILTER },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_title_misc, NOT_ASSIGNED },
+	{ txt_help_global_previous_menu, GLOBAL_QUIT },
+	{ txt_help_global_quit_tin, GLOBAL_QUIT_TIN },
+	{ txt_help_global_help, GLOBAL_HELP },
+	{ txt_help_global_toggle_mini_help, GLOBAL_TOGGLE_HELP_DISPLAY },
+	{ txt_help_global_option_menu, GLOBAL_OPTION_MENU },
+	{ txt_help_global_esc, GLOBAL_ABORT },
+	{ txt_help_global_redraw_screen, GLOBAL_REDRAW_SCREEN },
 #ifndef NO_SHELL_ESCAPE
-	{ txt_help_global_shell_escape, iKeyShellEscape },
+	{ txt_help_global_shell_escape, GLOBAL_SHELL_ESCAPE },
 #endif /* !NO_SHELL_ESCAPE */
-	{ txt_help_global_posting_history, iKeyDisplayPostHist },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_version, iKeyVersion },
-	{ txt_help_bug_report, iKeyThreadBugReport },
-	{ NULL, 0 }
+	{ txt_help_global_posting_history, GLOBAL_DISPLAY_POST_HISTORY },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_version, GLOBAL_VERSION },
+	{ txt_help_bug_report, GLOBAL_BUGREPORT },
+	{ NULL, NOT_ASSIGNED }
 };
 
 static t_help_page page_help_page[] = {
-	{ txt_help_title_navi, 0 },
-	{ txt_help_global_page_down, iKeyPageDown },
-	{ txt_help_global_page_down, iKeyPageDown2 },
-	{ txt_help_global_page_down, iKeyPageDown3 },
-	{ txt_help_global_page_up, iKeyPageUp2 },
-	{ txt_help_global_page_up, iKeyPageUp },
-	{ txt_help_global_page_up, iKeyPageUp3 },
-	{ txt_help_global_line_down, iKeyDown2 },
-	{ txt_help_global_line_down, iKeyDown },
-	{ txt_help_global_line_up, iKeyUp2 },
-	{ txt_help_global_line_up, iKeyUp },
-	{ txt_help_article_first_page, iKeyFirstPage },
-	{ txt_help_article_last_page, iKeyLastPage },
-	{ txt_help_article_first_page, iKeyPageFirstPage },
-	{ txt_help_article_last_page, iKeyPageLastPage },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_article_by_num, 0 },
-	{ txt_help_article_next_thread, iKeyPageNextThd },
-	{ txt_help_article_read_next_unread, iKeyPageNextUnread },
-	{ txt_help_article_next, iKeyPageNextArt },
-	{ txt_help_article_next_unread, iKeyPageNextUnreadArt },
-	{ txt_help_article_prev, iKeyPagePrevArt },
-	{ txt_help_article_prev_unread, iKeyPagePrevUnreadArt },
-	{ txt_help_article_first_in_thread, iKeyPageTopThd },
-	{ txt_help_article_last_in_thread, iKeyPageBotThd },
-	{ txt_help_global_last_art, iKeyLastViewed },
-	{ txt_help_group_list_thread, iKeyPageListThd },
-	{ txt_help_article_parent, iKeyPageGotoParent },
-	{ txt_help_global_lookup_art, iKeyLookupMessage },
-	{ txt_help_article_quit_to_select_level, iKeyPageGroupSel },
-	{ txt_help_article_skip_quote, iKeyPageSkipIncludedText },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_article_search_forwards, iKeySearchSubjF },
-	{ txt_help_article_search_backwards, iKeySearchSubjB },
-	{ txt_help_global_search_auth_forwards, iKeySearchAuthF },
-	{ txt_help_global_search_auth_backwards, iKeySearchAuthB },
-	{ txt_help_global_search_body, iKeySearchBody },
-	{ txt_help_global_search_body_comment, 0 },
-	{ txt_help_global_search_repeat, iKeySearchRepeat },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_title_disp, 0 },
-	{ txt_help_global_toggle_info_line, iKeyToggleInfoLastLine },
-	{ txt_help_article_toggle_rot13, iKeyPageToggleRot },
-	{ txt_help_global_toggle_inverse_video, iKeyToggleInverseVideo },
-	{ txt_help_article_show_raw, iKeyPageToggleHeaders },
+	{ txt_help_title_navi, NOT_ASSIGNED },
+	{ txt_help_global_page_down, GLOBAL_PAGE_DOWN },
+	{ txt_help_global_page_down, PAGE_PAGE_DOWN3 },
+	{ txt_help_global_page_up, GLOBAL_PAGE_UP },
+	{ txt_help_global_line_down, GLOBAL_LINE_DOWN },
+	{ txt_help_global_line_up, GLOBAL_LINE_UP },
+	{ txt_help_article_first_page, GLOBAL_FIRST_PAGE },
+	{ txt_help_article_last_page, GLOBAL_LAST_PAGE },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_article_by_num, NOT_ASSIGNED },
+	{ txt_help_article_next_thread, PAGE_NEXT_THREAD },
+	{ txt_help_article_next_unread, PAGE_NEXT_UNREAD },
+	{ txt_help_article_next, PAGE_NEXT_ARTICLE },
+	{ txt_help_article_next_unread, PAGE_NEXT_UNREAD_ARTICLE },
+	{ txt_help_article_prev, PAGE_PREVIOUS_ARTICLE },
+	{ txt_help_article_prev_unread, PAGE_PREVIOUS_UNREAD_ARTICLE },
+	{ txt_help_article_first_in_thread, PAGE_TOP_THREAD },
+	{ txt_help_article_last_in_thread, PAGE_BOTTOM_THREAD },
+	{ txt_help_global_last_art, GLOBAL_LAST_VIEWED },
+	{ txt_help_group_list_thread, PAGE_LIST_THREAD },
+	{ txt_help_article_parent, PAGE_GOTO_PARENT },
+	{ txt_help_global_lookup_art, GLOBAL_LOOKUP_MESSAGEID },
+	{ txt_help_article_quit_to_select_level, PAGE_GROUP_SELECT },
+	{ txt_help_article_skip_quote, PAGE_SKIP_INCLUDED_TEXT },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_article_search_forwards, GLOBAL_SEARCH_SUBJECT_FORWARD },
+	{ txt_help_article_search_backwards, GLOBAL_SEARCH_SUBJECT_BACKWARD },
+	{ txt_help_global_search_auth_forwards, GLOBAL_SEARCH_AUTHOR_FORWARD },
+	{ txt_help_global_search_auth_backwards, GLOBAL_SEARCH_AUTHOR_BACKWARD },
+	{ txt_help_global_search_body, GLOBAL_SEARCH_BODY },
+	{ txt_help_global_search_body_comment, NOT_ASSIGNED },
+	{ txt_help_global_search_repeat, GLOBAL_SEARCH_REPEAT },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_title_disp, NOT_ASSIGNED },
+	{ txt_help_global_toggle_info_line, GLOBAL_TOGGLE_INFO_LAST_LINE },
+	{ txt_help_article_toggle_rot13, PAGE_TOGGLE_ROT13 },
+	{ txt_help_global_toggle_inverse_video, GLOBAL_TOGGLE_INVERSE_VIDEO },
+	{ txt_help_article_show_raw, PAGE_TOGGLE_HEADERS },
 #ifdef HAVE_COLOR
-	{ txt_help_global_toggle_color, iKeyToggleColor },
+	{ txt_help_global_toggle_color, GLOBAL_TOGGLE_COLOR },
 #endif /* HAVE_COLOR */
-	{ txt_help_article_toggle_highlight, iKeyPageToggleHighlight },
-	{ txt_help_article_toggle_tex2iso, iKeyPageToggleTex2iso },
-	{ txt_help_article_toggle_tabwidth, iKeyPageToggleTabs },
-	{ txt_help_article_toggle_uue, iKeyPageToggleUue },
-	{ txt_help_article_toggle_formfeed, iKeyPageReveal },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_title_ops, 0 },
-	{ txt_help_global_post, iKeyPost },
-	{ txt_help_global_post_postponed, iKeyPostponed2 },
-	{ txt_help_global_post_postponed, iKeyPostponed },
-	{ txt_help_article_followup, iKeyPageFollowupQuote },
-	{ txt_help_article_followup_no_quote, iKeyPageFollowup },
-	{ txt_help_article_followup_with_header, iKeyPageFollowupQuoteHeaders },
-	{ txt_help_article_repost, iKeyPageRepost },
-	{ txt_help_article_reply, iKeyPageReplyQuote },
-	{ txt_help_article_reply_no_quote, iKeyPageReply },
-	{ txt_help_article_reply_with_header, iKeyPageReplyQuoteHeaders },
-	{ txt_help_article_edit, iKeyPageEditArticle },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_mail, iKeyPageMail },
-	{ txt_help_global_save, iKeyPageSave },
-	{ txt_help_global_auto_save, iKeyPageAutoSave },
+	{ txt_help_article_toggle_highlight, PAGE_TOGGLE_HIGHLIGHTING },
+	{ txt_help_article_toggle_tex2iso, PAGE_TOGGLE_TEX2ISO },
+	{ txt_help_article_toggle_tabwidth, PAGE_TOGGLE_TABS },
+	{ txt_help_article_toggle_uue, PAGE_TOGGLE_UUE },
+	{ txt_help_article_toggle_formfeed, PAGE_REVEAL },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_title_ops, NOT_ASSIGNED },
+#ifndef NO_POSTING
+	{ txt_help_global_post, GLOBAL_POST },
+	{ txt_help_global_post_postponed, GLOBAL_POSTPONED },
+	{ txt_help_article_followup, PAGE_FOLLOWUP_QUOTE },
+	{ txt_help_article_followup_no_quote, PAGE_FOLLOWUP },
+	{ txt_help_article_followup_with_header, PAGE_FOLLOWUP_QUOTE_HEADERS },
+	{ txt_help_article_repost, PAGE_REPOST },
+	{ txt_help_article_cancel, PAGE_CANCEL },
+#endif /* NO_POSTING */
+	{ txt_help_article_reply, PAGE_REPLY_QUOTE },
+	{ txt_help_article_reply_no_quote, PAGE_REPLY },
+	{ txt_help_article_reply_with_header, PAGE_REPLY_QUOTE_HEADERS },
+	{ txt_help_article_edit, PAGE_EDIT_ARTICLE },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_mail, PAGE_MAIL },
+	{ txt_help_global_save, PAGE_SAVE },
+	{ txt_help_global_auto_save, PAGE_AUTOSAVE },
 #ifndef DONT_HAVE_PIPING
-	{ txt_help_global_pipe, iKeyPipe },
+	{ txt_help_global_pipe, GLOBAL_PIPE },
 #endif /* !DONT_HAVE_PIPING */
 #ifndef DISABLE_PRINTING
-	{ txt_help_global_print, iKeyPrint },
+	{ txt_help_global_print, GLOBAL_PRINT },
 #endif /* !DISABLE_PRINTING */
-	{ txt_help_article_view_attachments, iKeyPageViewAttach },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_tag, iKeyPageTag },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_article_mark_thread_read, iKeyPageKillThd },
-	{ txt_help_thread_catchup, iKeyPageCatchup },
-	{ txt_help_thread_catchup_next_unread, iKeyPageCatchupNextUnread },
-	{ txt_help_group_mark_article_unread, iKeyGroupMarkArtUnread },
-	{ txt_help_group_mark_thread_unread, iKeyGroupMarkThdUnread },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_article_autoselect, iKeyPageAutoSel },
-	{ txt_help_article_autokill, iKeyPageAutoKill },
-	{ txt_help_article_quick_select, iKeyPageQuickAutoSel },
-	{ txt_help_article_quick_kill, iKeyPageQuickKill },
-	{ txt_help_article_cancel, iKeyPageCancel },
-	{ txt_help_empty_line, 0 },
-	{ txt_help_title_misc, 0 },
-	{ txt_help_article_browse_urls, iKeyPageViewUrl },
-	{ txt_help_global_previous_menu, iKeyQuit },
-	{ txt_help_global_quit_tin, iKeyQuitTin },
-	{ txt_help_global_help, iKeyHelp },
-	{ txt_help_global_toggle_mini_help, iKeyToggleHelpDisplay },
-	{ txt_help_global_option_menu, iKeyOptionMenu },
-	{ txt_help_global_esc, iKeyAbort },
-	{ txt_help_global_redraw_screen, iKeyRedrawScr },
+	{ txt_help_article_view_attachments, PAGE_VIEW_ATTACHMENTS },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_tag, PAGE_TAG },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_article_mark_thread_read, PAGE_MARK_THREAD_READ },
+	{ txt_help_thread_catchup, CATCHUP },
+	{ txt_help_thread_catchup_next_unread, CATCHUP_NEXT_UNREAD },
+	{ txt_help_group_mark_article_unread, MARK_ARTICLE_UNREAD },
+	{ txt_help_group_mark_thread_unread, MARK_THREAD_UNREAD },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_article_autoselect, GLOBAL_MENU_FILTER_SELECT },
+	{ txt_help_article_autokill, GLOBAL_MENU_FILTER_KILL },
+	{ txt_help_article_quick_select, GLOBAL_QUICK_FILTER_SELECT },
+	{ txt_help_article_quick_kill, GLOBAL_QUICK_FILTER_KILL },
+	{ txt_help_global_edit_filter, GLOBAL_EDIT_FILTER },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_title_misc, NOT_ASSIGNED },
+	{ txt_help_article_browse_urls, PAGE_VIEW_URL },
+	{ txt_help_global_previous_menu, GLOBAL_QUIT },
+	{ txt_help_global_quit_tin, GLOBAL_QUIT_TIN },
+	{ txt_help_global_help, GLOBAL_HELP },
+	{ txt_help_global_toggle_mini_help, GLOBAL_TOGGLE_HELP_DISPLAY },
+	{ txt_help_global_option_menu, GLOBAL_OPTION_MENU },
+	{ txt_help_global_esc, GLOBAL_ABORT },
+	{ txt_help_global_redraw_screen, GLOBAL_REDRAW_SCREEN },
 #ifndef NO_SHELL_ESCAPE
-	{ txt_help_global_shell_escape, iKeyShellEscape },
+	{ txt_help_global_shell_escape, GLOBAL_SHELL_ESCAPE },
 #endif /* !NO_SHELL_ESCAPE */
-	{ txt_help_global_posting_history, iKeyDisplayPostHist },
+	{ txt_help_global_posting_history, GLOBAL_DISPLAY_POST_HISTORY },
 #ifdef HAVE_PGP_GPG
-	{ txt_help_empty_line, 0 },
-	{ txt_help_article_pgp, iKeyPagePGPCheckArticle },
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_article_pgp, PAGE_PGP_CHECK_ARTICLE },
 #endif /* HAVE_PGP_GPG */
-	{ txt_help_empty_line, 0 },
-	{ txt_help_global_version, iKeyVersion },
-	{ NULL, 0 }
+	{ txt_help_empty_line, NOT_ASSIGNED },
+	{ txt_help_global_version, GLOBAL_VERSION },
+	{ NULL, NOT_ASSIGNED }
 };
 
 
@@ -443,42 +438,57 @@ static void
 make_help_page(
 	FILE *fp,
 	const t_help_page *helppage,
-	const t_menukeys *menukeys)
+	const struct keylist keys)
 {
-	char *buf;
+	char *buf = my_malloc(LEN);
+	char *last = my_malloc(LEN);
 	char key[MAXKEYLEN];
 	/*
 	 * length is only needed to pass it to expand_ctrl_chars()
 	 * we have no need for the value
 	 */
 	int length;
-
-	buf = my_malloc(LEN);
+	size_t i;
 
 	if (!helppage)
 		return;
 
+	last[0] = '\0';
+
 	while (helppage->helptext) {
-		/*
-		 * as expand_ctrl_chars() may has shrinked buf
-		 * make sure buf is large enough to contain the helpline
-		 */
-		buf = my_realloc(buf, LEN);
-
-		if (helppage->key == 0) {
-			if (!strlen(helppage->helptext))	/* avoid empty string translations */
-				snprintf(buf, LEN, "%s", helppage->helptext);
+		if (helppage->func == NOT_ASSIGNED) {
+			/*
+			 * as expand_ctrl_chars() may has shrinked buf
+			 * make sure buf is large enough to contain the helpline
+			 */
+			buf = my_realloc(buf, LEN);
+
+			if (!strlen(helppage->helptext))	/* avoid translation of empty strings */
+				snprintf(buf, LEN, "\n");
 			else
 				snprintf(buf, LEN, "%s", _(helppage->helptext));
-		} else
-			snprintf(buf, LEN, "%s\t  %s", printascii(key, map_to_local(helppage->key, menukeys)), _(helppage->helptext));
-		buf[LEN - 1] = '\0';
-		expand_ctrl_chars(&buf, &length, 8);
-		fprintf(fp, "%s", buf);
+			buf[LEN - 1] = '\0';
+			expand_ctrl_chars(&buf, &length, 8);
+			fprintf(fp, "%s", buf);
+		} else {
+			for (i = 0; i < keys.used; i++) {
+				if (keys.list[i].function == helppage->func && keys.list[i].key) {
+					buf = my_realloc(buf, LEN);
+					snprintf(buf, LEN, "%s\t  %s", printascii(key, keys.list[i].key), _(helppage->helptext));
+					buf[LEN - 1] = '\0';
+					expand_ctrl_chars(&buf, &length, 8);
+					if (strcmp(last, buf)) {
+						fprintf(fp, "%s", buf);
+						strncpy(last, buf, LEN);
+					}
+				}
+			}
+		}
 		helppage++;
 	}
 
 	free(buf);
+	free(last);
 }
 
 
@@ -494,19 +504,19 @@ show_help_page(
 
 	switch (level) {
 		case SELECT_LEVEL:
-			make_help_page(fp, select_help_page, &menukeymap.select_nav);
+			make_help_page(fp, select_help_page, select_keys);
 			break;
 
 		case GROUP_LEVEL:
-			make_help_page(fp, group_help_page, &menukeymap.group_nav);
+			make_help_page(fp, group_help_page, group_keys);
 			break;
 
 		case THREAD_LEVEL:
-			make_help_page(fp, thread_help_page, &menukeymap.thread_nav);
+			make_help_page(fp, thread_help_page, thread_keys);
 			break;
 
 		case PAGE_LEVEL:
-			make_help_page(fp, page_help_page, &menukeymap.page_nav);
+			make_help_page(fp, page_help_page, page_keys);
 			break;
 
 		case INFO_PAGER:
@@ -544,116 +554,116 @@ show_mini_help(
 	switch (level) {
 		case SELECT_LEVEL:
 			snprintf(buf, bufs, _(txt_mini_select_1),
-				printascii(key[0], map_to_local(iKeySelectEnterNextUnreadGrp, &menukeymap.select_nav)),
-				printascii(key[1], map_to_local(iKeySelectGoto, &menukeymap.select_nav)),
-				printascii(key[2], map_to_local(iKeySearchSubjF, &menukeymap.select_nav)),
-				printascii(key[3], map_to_local(iKeySelectCatchup, &menukeymap.select_nav)));
+				printascii(key[0], func_to_key(SELECT_ENTER_NEXT_UNREAD_GROUP, select_keys)),
+				printascii(key[1], func_to_key(SELECT_GOTO, select_keys)),
+				printascii(key[2], func_to_key(GLOBAL_SEARCH_SUBJECT_FORWARD, select_keys)),
+				printascii(key[3], func_to_key(CATCHUP, select_keys)));
 			center_line(line, FALSE, buf);
 			snprintf(buf, bufs, _(txt_mini_select_2),
-				printascii(key[0], map_to_local(iKeyDown2, &menukeymap.select_nav)),
-				printascii(key[1], map_to_local(iKeyUp2, &menukeymap.select_nav)),
-				printascii(key[2], map_to_local(iKeyHelp, &menukeymap.select_nav)),
-				printascii(key[3], map_to_local(iKeySelectMoveGrp, &menukeymap.select_nav)),
-				printascii(key[4], map_to_local(iKeyQuit, &menukeymap.select_nav)),
-				printascii(key[5], map_to_local(iKeySelectToggleReadDisplay, &menukeymap.select_nav)));
+				printascii(key[0], func_to_key(GLOBAL_LINE_DOWN, select_keys)),
+				printascii(key[1], func_to_key(GLOBAL_LINE_UP, select_keys)),
+				printascii(key[2], func_to_key(GLOBAL_HELP, select_keys)),
+				printascii(key[3], func_to_key(SELECT_MOVE_GROUP, select_keys)),
+				printascii(key[4], func_to_key(GLOBAL_QUIT, select_keys)),
+				printascii(key[5], func_to_key(SELECT_TOGGLE_READ_DISPLAY, select_keys)));
 			center_line(line + 1, FALSE, buf);
 			snprintf(buf, bufs, _(txt_mini_select_3),
-				printascii(key[0], map_to_local(iKeySelectSubscribe, &menukeymap.select_nav)),
-				printascii(key[1], map_to_local(iKeySelectSubscribePat, &menukeymap.select_nav)),
-				printascii(key[2], map_to_local(iKeySelectUnsubscribe, &menukeymap.select_nav)),
-				printascii(key[3], map_to_local(iKeySelectUnsubscribePat, &menukeymap.select_nav)),
-				printascii(key[4], map_to_local(iKeySelectYankActive, &menukeymap.select_nav)));
+				printascii(key[0], func_to_key(SELECT_SUBSCRIBE, select_keys)),
+				printascii(key[1], func_to_key(SELECT_SUBSCRIBE_PATTERN, select_keys)),
+				printascii(key[2], func_to_key(SELECT_UNSUBSCRIBE, select_keys)),
+				printascii(key[3], func_to_key(SELECT_UNSUBSCRIBE_PATTERN, select_keys)),
+				printascii(key[4], func_to_key(SELECT_YANK_ACTIVE, select_keys)));
 			center_line(line + 2, FALSE, buf);
 			break;
 
 		case GROUP_LEVEL:
 			snprintf(buf, bufs, _(txt_mini_group_1),
-				printascii(key[0], map_to_local(iKeyGroupNextUnreadArtOrGrp, &menukeymap.group_nav)),
-				printascii(key[1], map_to_local(iKeySearchSubjF, &menukeymap.group_nav)),
-				printascii(key[2], map_to_local(iKeyGroupKill, &menukeymap.group_nav)));
+				printascii(key[0], func_to_key(GROUP_NEXT_UNREAD_ARTICLE_OR_GROUP, group_keys)),
+				printascii(key[1], func_to_key(GLOBAL_SEARCH_SUBJECT_FORWARD, group_keys)),
+				printascii(key[2], func_to_key(GLOBAL_MENU_FILTER_KILL, group_keys)));
 			center_line(line, FALSE, buf);
 			snprintf(buf, bufs, _(txt_mini_group_2),
-				printascii(key[0], map_to_local(iKeySearchAuthF, &menukeymap.group_nav)),
-				printascii(key[1], map_to_local(iKeyGroupCatchup, &menukeymap.group_nav)),
-				printascii(key[2], map_to_local(iKeyDown2, &menukeymap.group_nav)),
-				printascii(key[3], map_to_local(iKeyUp2, &menukeymap.group_nav)),
-				printascii(key[4], map_to_local(iKeyGroupMarkThdRead, &menukeymap.group_nav)),
-				printascii(key[5], map_to_local(iKeyGroupListThd, &menukeymap.group_nav)));
+				printascii(key[0], func_to_key(GLOBAL_SEARCH_AUTHOR_FORWARD, group_keys)),
+				printascii(key[1], func_to_key(CATCHUP, group_keys)),
+				printascii(key[2], func_to_key(GLOBAL_LINE_DOWN, group_keys)),
+				printascii(key[3], func_to_key(GLOBAL_LINE_UP, group_keys)),
+				printascii(key[4], func_to_key(GROUP_MARK_THREAD_READ, group_keys)),
+				printascii(key[5], func_to_key(GROUP_LIST_THREAD, group_keys)));
 			center_line(line + 1, FALSE, buf);
 			snprintf(buf, bufs, _(txt_mini_group_3),
 #ifndef DONT_HAVE_PIPING
-				printascii(key[0], map_to_local(iKeyPipe, &menukeymap.group_nav)),
+				printascii(key[0], func_to_key(GLOBAL_PIPE, group_keys)),
 #endif /* !DONT_HAVE_PIPING */
-				printascii(key[1], map_to_local(iKeyGroupMail, &menukeymap.group_nav)),
+				printascii(key[1], func_to_key(GROUP_MAIL, group_keys)),
 #ifndef DISABLE_PRINTING
-				printascii(key[2], map_to_local(iKeyPrint, &menukeymap.group_nav)),
+				printascii(key[2], func_to_key(GLOBAL_PRINT, group_keys)),
 #endif /* !DISABLE_PRINTING */
-				printascii(key[3], map_to_local(iKeyQuit, &menukeymap.group_nav)),
-				printascii(key[4], map_to_local(iKeyGroupToggleReadUnread, &menukeymap.group_nav)),
-				printascii(key[5], map_to_local(iKeyGroupSave, &menukeymap.group_nav)),
-				printascii(key[6], map_to_local(iKeyGroupTag, &menukeymap.group_nav)),
-				printascii(key[7], map_to_local(iKeyPost, &menukeymap.group_nav)));
+				printascii(key[3], func_to_key(GLOBAL_QUIT, group_keys)),
+				printascii(key[4], func_to_key(GROUP_TOGGLE_READ_UNREAD, group_keys)),
+				printascii(key[5], func_to_key(GROUP_SAVE, group_keys)),
+				printascii(key[6], func_to_key(GROUP_TAG, group_keys)),
+				printascii(key[7], func_to_key(GLOBAL_POST, group_keys)));
 			center_line(line + 2, FALSE, buf);
 			break;
 
 		case THREAD_LEVEL:
 			snprintf(buf, bufs, _(txt_mini_thread_1),
-				printascii(key[0], map_to_local(iKeyThreadReadNextArtOrThread, &menukeymap.thread_nav)),
-				printascii(key[1], map_to_local(iKeyThreadCatchup, &menukeymap.thread_nav)),
-				printascii(key[2], map_to_local(iKeyThreadToggleSubjDisplay, &menukeymap.thread_nav)));
+				printascii(key[0], func_to_key(THREAD_READ_NEXT_ARTICLE_OR_THREAD, thread_keys)),
+				printascii(key[1], func_to_key(CATCHUP, thread_keys)),
+				printascii(key[2], func_to_key(THREAD_TOGGLE_SUBJECT_DISPLAY, thread_keys)));
 			center_line(line, FALSE, buf);
 			snprintf(buf, bufs, _(txt_mini_thread_2),
-				printascii(key[0], map_to_local(iKeyHelp, &menukeymap.thread_nav)),
-				printascii(key[1], map_to_local(iKeyDown2, &menukeymap.thread_nav)),
-				printascii(key[2], map_to_local(iKeyUp2, &menukeymap.thread_nav)),
-				printascii(key[3], map_to_local(iKeyQuit, &menukeymap.thread_nav)),
-				printascii(key[4], map_to_local(iKeyThreadTag, &menukeymap.thread_nav)),
-				printascii(key[5], map_to_local(iKeyThreadMarkArtUnread, &menukeymap.thread_nav)));
+				printascii(key[0], func_to_key(GLOBAL_HELP, thread_keys)),
+				printascii(key[1], func_to_key(GLOBAL_LINE_DOWN, thread_keys)),
+				printascii(key[2], func_to_key(GLOBAL_LINE_UP, thread_keys)),
+				printascii(key[3], func_to_key(GLOBAL_QUIT, thread_keys)),
+				printascii(key[4], func_to_key(THREAD_TAG, thread_keys)),
+				printascii(key[5], func_to_key(MARK_ARTICLE_UNREAD, thread_keys)));
 			center_line(line + 1, FALSE, buf);
 			break;
 
 		case PAGE_LEVEL:
 			snprintf(buf, bufs, _(txt_mini_page_1),
-				printascii(key[0], map_to_local(iKeyPageNextUnread, &menukeymap.page_nav)),
-				printascii(key[1], map_to_local(iKeySearchSubjF, &menukeymap.page_nav)),
-				printascii(key[2], map_to_local(iKeyPageAutoKill, &menukeymap.page_nav)));
+				printascii(key[0], func_to_key(PAGE_NEXT_UNREAD, page_keys)),
+				printascii(key[1], func_to_key(GLOBAL_SEARCH_SUBJECT_FORWARD, page_keys)),
+				printascii(key[2], func_to_key(GLOBAL_MENU_FILTER_KILL, page_keys)));
 			center_line(line, FALSE, buf);
 			snprintf(buf, bufs, _(txt_mini_page_2),
-				printascii(key[0], map_to_local(iKeySearchAuthF, &menukeymap.page_nav)),
-				printascii(key[1], map_to_local(iKeySearchBody, &menukeymap.page_nav)),
-				printascii(key[2], map_to_local(iKeyPageCatchup, &menukeymap.page_nav)),
-				printascii(key[3], map_to_local(iKeyPageFollowupQuote, &menukeymap.page_nav)),
-				printascii(key[4], map_to_local(iKeyPageKillThd, &menukeymap.page_nav)));
+				printascii(key[0], func_to_key(GLOBAL_SEARCH_AUTHOR_FORWARD, page_keys)),
+				printascii(key[1], func_to_key(GLOBAL_SEARCH_BODY, page_keys)),
+				printascii(key[2], func_to_key(CATCHUP, page_keys)),
+				printascii(key[3], func_to_key(PAGE_FOLLOWUP_QUOTE, page_keys)),
+				printascii(key[4], func_to_key(PAGE_MARK_THREAD_READ, page_keys)));
 			center_line(line + 1, FALSE, buf);
 			snprintf(buf, bufs, _(txt_mini_page_3),
 #ifndef DONT_HAVE_PIPING
-				printascii(key[0], map_to_local(iKeyPipe, &menukeymap.page_nav)),
+				printascii(key[0], func_to_key(GLOBAL_PIPE, page_keys)),
 #endif /* !DONT_HAVE_PIPING */
-				printascii(key[1], map_to_local(iKeyPageMail, &menukeymap.page_nav)),
+				printascii(key[1], func_to_key(PAGE_MAIL, page_keys)),
 #ifndef DISABLE_PRINTING
-				printascii(key[2], map_to_local(iKeyPrint, &menukeymap.page_nav)),
+				printascii(key[2], func_to_key(GLOBAL_PRINT, page_keys)),
 #endif /* !DISABLE_PRINTING */
-				printascii(key[3], map_to_local(iKeyQuit, &menukeymap.page_nav)),
-				printascii(key[4], map_to_local(iKeyPageReplyQuote, &menukeymap.page_nav)),
-				printascii(key[5], map_to_local(iKeyPageSave, &menukeymap.page_nav)),
-				printascii(key[6], map_to_local(iKeyPageTag, &menukeymap.page_nav)),
-				printascii(key[7], map_to_local(iKeyPost, &menukeymap.page_nav)));
+				printascii(key[3], func_to_key(GLOBAL_QUIT, page_keys)),
+				printascii(key[4], func_to_key(PAGE_REPLY_QUOTE, page_keys)),
+				printascii(key[5], func_to_key(PAGE_SAVE, page_keys)),
+				printascii(key[6], func_to_key(PAGE_TAG, page_keys)),
+				printascii(key[7], func_to_key(GLOBAL_POST, page_keys)));
 			center_line(line + 2, FALSE, buf);
 			break;
 
 		case INFO_PAGER:
 			snprintf(buf, bufs, _(txt_mini_info_1),
-				printascii(key[0], map_to_local(iKeyUp, &menukeymap.info_nav)),
-				printascii(key[1], map_to_local(iKeyDown, &menukeymap.info_nav)),
-				printascii(key[2], map_to_local(iKeyPageUp, &menukeymap.info_nav)),
-				printascii(key[3], map_to_local(iKeyPageDown, &menukeymap.info_nav)),
-				printascii(key[4], map_to_local(iKeyFirstPage, &menukeymap.info_nav)),
-				printascii(key[5], map_to_local(iKeyLastPage, &menukeymap.info_nav)));
+				printascii(key[0], func_to_key(GLOBAL_LINE_UP, info_keys)),
+				printascii(key[1], func_to_key(GLOBAL_LINE_DOWN, info_keys)),
+				printascii(key[2], func_to_key(GLOBAL_PAGE_UP, info_keys)),
+				printascii(key[3], func_to_key(GLOBAL_PAGE_DOWN, info_keys)),
+				printascii(key[4], func_to_key(GLOBAL_FIRST_PAGE, info_keys)),
+				printascii(key[5], func_to_key(GLOBAL_LAST_PAGE, info_keys)));
 			center_line(line, FALSE, buf);
 			snprintf(buf, bufs, _(txt_mini_info_2),
-				printascii(key[0], map_to_local(iKeySearchSubjF, &menukeymap.info_nav)),
-				printascii(key[1], map_to_local(iKeySearchSubjB, &menukeymap.info_nav)),
-				printascii(key[2], map_to_local(iKeyQuit, &menukeymap.info_nav)));
+				printascii(key[0], func_to_key(GLOBAL_SEARCH_SUBJECT_FORWARD, info_keys)),
+				printascii(key[1], func_to_key(GLOBAL_SEARCH_SUBJECT_BACKWARD, info_keys)),
+				printascii(key[2], func_to_key(GLOBAL_QUIT, info_keys)));
 			center_line(line + 1, FALSE, buf);
 			break;
 
diff -Nurp tin-1.6.2/src/inews.c tin-1.8.0/src/inews.c
--- tin-1.6.2/src/inews.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/inews.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : inews.c
  *  Author    : I. Lea
  *  Created   : 1992-03-17
- *  Updated   : 2003-05-01
+ *  Updated   : 2005-02-12
  *  Notes     : NNTP built in version of inews
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -83,6 +83,8 @@
 
 /*
  * Submit an article using the NNTP POST command
+ *
+ * TODO: remove mailheaders (To, Cc, Bcc, ...)?
  */
 #ifdef NNTP_INEWS
 static t_bool
@@ -391,12 +393,14 @@ submit_news_file(
 {
 	char buf[PATH_LEN];
 	char *cp = buf;
+	char *fcc;
 	t_bool ret_code;
 	t_bool ismail = FALSE;
 
 	a_message_id[0] = '\0';
 
-	checknadd_headers(name);
+	fcc = checknadd_headers(name);
+	FreeIfNeeded(fcc); /* we don't use it at the moment */
 
 	rfc15211522_encode(name, txt_mime_encodings[tinrc.post_mime_encoding], group, tinrc.post_8bit_header, ismail);
 
@@ -426,10 +430,10 @@ submit_news_file(
 
 #ifdef NNTP_INEWS
 			if (!ret_code && read_news_via_nntp && !read_saved_news && 0 != strcasecmp(tinrc.inews_prog, INTERNAL_CMD)) {
-				if (prompt_yn(cLINES, _(txt_post_via_builtin_inews), TRUE)) {
+				if (prompt_yn(_(txt_post_via_builtin_inews), TRUE)) {
 					ret_code = submit_inews(name, group, a_message_id);
 					if (ret_code) {
-						if (prompt_yn(cLINES, _(txt_post_via_builtin_inews_only), TRUE) == 1)
+						if (prompt_yn(_(txt_post_via_builtin_inews_only), TRUE) == 1)
 							strcpy(tinrc.inews_prog, INTERNAL_CMD);
 					}
 				}
@@ -474,11 +478,11 @@ sender_needed(
 
 	snprintf(sender_line, sizeof(sender_line), "Sender: %s", sender);
 
-#ifdef CHARSET_CONVERSION
+#	ifdef CHARSET_CONVERSION
 	p = rfc1522_encode(sender_line, group ? txt_mime_charsets[group->attribute->mm_network_charset] : txt_mime_charsets[tinrc.mm_network_charset], FALSE);
-#else
+#	else
 	p = rfc1522_encode(sender_line, tinrc.mm_charset, FALSE);
-#endif /* CHARSET_CONVERSION */
+#	endif /* CHARSET_CONVERSION */
 	if (GNKSA_OK != gnksa_do_check_from(p + 8, sender_addr, sender_name)) {
 		free(p);
 		return -2;
diff -Nurp tin-1.6.2/src/init.c tin-1.8.0/src/init.c
--- tin-1.6.2/src/init.c	2003-08-27 23:16:56.000000000 +0200
+++ tin-1.8.0/src/init.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : init.c
  *  Author    : I. Lea
  *  Created   : 1991-04-01
- *  Updated   : 2003-08-10
+ *  Updated   : 2005-08-14
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,9 +44,6 @@
 #ifndef included_trace_h
 #	include "trace.h"
 #endif /* !included_trace_h */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
 #ifndef VERSION_H
 #	include "version.h"
 #endif /* !VERSION_H */
@@ -58,6 +55,9 @@
  * local prototypes
  */
 static int read_site_config(void);
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	static t_bool utf8_pcre(void);
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 #ifdef HAVE_COLOR
 	static void preinit_colors(void);
 #endif /* HAVE_COLOR */
@@ -66,7 +66,7 @@ static int read_site_config(void);
 char **news_headers_to_display_array;	/* array of which headers to display */
 char **news_headers_to_not_display_array;	/* array of which headers to not display */
 char active_times_file[PATH_LEN];
-char article[PATH_LEN];			/* ~/TIN_ARTICLE_NAME file */
+char article_name[PATH_LEN];			/* ~/TIN_ARTICLE_NAME file */
 char bug_nntpserver1[PATH_LEN];		/* welcome message of NNTP server used */
 char bug_nntpserver2[PATH_LEN];		/* welcome message of NNTP server used */
 char cmdline_nntpserver[PATH_LEN];
@@ -79,7 +79,6 @@ char domain_name[MAXHOSTNAMELEN];
 char global_attributes_file[PATH_LEN];
 char global_config_file[PATH_LEN];
 char homedir[PATH_LEN];
-char host_name[MAXHOSTNAMELEN];
 char index_maildir[PATH_LEN];
 char index_newsdir[PATH_LEN];	/* directory for private overview data */
 char index_savedir[PATH_LEN];
@@ -92,7 +91,6 @@ char local_newsgroups_file[PATH_LEN];	/*
 char local_newsrctable_file[PATH_LEN];
 char lock_file[PATH_LEN];		/* contains name of index lock file */
 char filter_file[PATH_LEN];
-char mail_active_file[PATH_LEN];
 char mail_news_user[LEN];		/* mail new news to this user address */
 char mailbox[PATH_LEN];			/* system mailbox for each user */
 char mailer[PATH_LEN];			/* mail program */
@@ -111,6 +109,7 @@ char tin_progname[PATH_LEN];		/* program
 char txt_help_bug_report[LEN];		/* address to send bug reports to */
 char userid[PATH_LEN];
 #ifdef HAVE_MH_MAIL_HANDLING
+	char mail_active_file[PATH_LEN];
 	char mailgroups_file[PATH_LEN];
 #endif /* HAVE_MH_MAIL_HANDLING */
 #ifndef NNTP_ONLY
@@ -122,20 +121,17 @@ char userid[PATH_LEN];
 	char rcdir_asfile[PATH_LEN];	/* rcdir expressed as dev:[dir]tin.dir, for stat() */
 #endif /* VMS */
 
-int groupname_len = 0;			/* 'runtime' copy of groupname_max_len */
+t_function last_search;	/* for repeated search */
 int hist_last[HIST_MAXNUM + 1];
 int hist_pos[HIST_MAXNUM + 1];
-int i_key_search_last;			/* for repeated search */
 int iso2asc_supported;			/* Convert ISO-Latin1 to Ascii */
 int num_headers_to_display;		/* num headers to display -- swp */
 int num_headers_to_not_display;		/* num headers to not display -- swp */
 int system_status;
 int xmouse, xrow, xcol;			/* xterm button pressing information */
 
-mode_t real_umask;
 pid_t process_id;			/* Useful to have around for .suffixes */
 
-t_bool (*wildcard_func) (const char *str, char *patt, t_bool icase);		/* Wildcard matching function */
 t_bool batch_mode;			/* update index files only mode */
 t_bool check_for_new_newsgroups;	/* don't check for new newsgroups */
 t_bool cmd_line;			/* batch / interactive mode */
@@ -276,7 +272,7 @@ struct t_config tinrc = {
 	FILTER_SUBJ_CASE_SENSITIVE,		/* default_filter_kill_header */
 	FILTER_SUBJ_CASE_SENSITIVE,		/* default_filter_select_header */
 	0,		/* default_move_group */
-	iKeySaveAppendFile,		/* default_save_mode */
+	'a',		/* default_save_mode */
 	0,		/* getart_limit */
 	2,		/* recent_time */
 	32,		/* groupname_max_length */
@@ -292,6 +288,7 @@ struct t_config tinrc = {
 	SORT_THREADS_BY_SCORE_DESCEND,		/* sort_threads_type */
 	BOGUS_SHOW,		/* strip_bogus */
 	THREAD_BOTH,		/* thread_articles */
+	THREAD_PERC_DEFAULT,	/* thread_perc */
 	THREAD_SCORE_MAX,	/* thread_score */
 	0,		/* Default to wildmat, not regex */
 	-50,		/* score_limit_kill */
@@ -318,6 +315,7 @@ struct t_config tinrc = {
 	0,		/* col_quote3 (initialised later) */
 	0,		/* col_response (initialised later) */
 	0,		/* col_signature (initialised later) */
+	0,		/* col_urls (initialised later) */
 	0,		/* col_subject (initialised later) */
 	0,		/* col_text (initialised later) */
 	0,		/* col_title (initialised later) */
@@ -328,6 +326,7 @@ struct t_config tinrc = {
 	5,		/* mono_markslash */
 	3,		/* mono_markstroke */
 	TRUE,		/* word_highlight */
+	TRUE,		/* url_highlight */
 	0,		/* wrap_column */
 #ifdef HAVE_COLOR
 	FALSE,		/* use_color */
@@ -374,7 +373,7 @@ struct t_config tinrc = {
 	FALSE,		/* prompt_followupto */
 	QUOTE_COMPRESS|QUOTE_EMPTY,	/* quote_style */
 	TRUE,		/* show_description */
-	1,		/* show_infos */
+	SHOW_INFO_LINES,		/* show_info */
 	TRUE,		/* show_only_unread_arts */
 	FALSE,		/* show_only_unread_groups */
 	TRUE,		/* show_signatures */
@@ -393,7 +392,7 @@ struct t_config tinrc = {
 	TRUE,		/* thread_catchup_on_exit */
 	TRUE,		/* unlink_article */
 	"",		/* inews_prog */
-	FALSE,		/* use_mailreader_i */
+	INTERACTIVE_NONE,		/* interactive_mailer */
 	FALSE,		/* use_mouse */
 #ifdef HAVE_KEYPAD
 	FALSE,		/* use_keypad */
@@ -408,9 +407,56 @@ struct t_config tinrc = {
 #ifdef XFACE_ABLE
 	FALSE,		/* use_slrnface */
 #endif /* XFACE_ABLE */
-	TRUE		/* default_filter_select_global */
+	TRUE,		/* default_filter_select_global */
+	DEFAULT_DATE_FORMAT,	/* date_format */
+#ifdef HAVE_UNICODE_NORMALIZATION
+	NORMALIZE_NFKC,		/* normalization form */
+#endif /* HAVE_UNICODE_NORMALIZATION */
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && defined(HAVE_UNICODE_UBIDI_H) && !defined(NO_LOCALE)
+	FALSE		/* render_bidi */
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && HAVE_UNICODE_UBIDI_H && !NO_LOCALE */
 };
 
+struct t_capabilities nntp_caps = {
+	0, /* type (none, LIST EXTENSIONS, CAPABILITIES) */
+	0, /* CAPABILITIES version */
+	FALSE, /* MODE-READER: "MODE READER" */
+	FALSE, /* READER: "ARTICLE", "BODY" */
+	FALSE, /* POST */
+	FALSE, /* LIST: "LIST ACTIVE" */
+	FALSE, /* LIST: "LIST ACTIVE.TIMES" */
+	FALSE, /* LIST: "LIST DISTRIB.PATS" */
+	FALSE, /* LIST: "LIST HEADERS" */
+	FALSE, /* LIST: "LIST NEWSGROUPS" */
+	FALSE, /* LIST: "LIST OVERVIEW.FMT" */
+	FALSE, /* LIST: "LIST MOTD" */
+	FALSE, /* LIST: "LIST SUBSCRIPTIONS" */
+	FALSE, /* LIST: "LIST DISTRIBUTIONS" */
+	FALSE, /* LIST: "LIST MODERATORS" */
+	FALSE, /* XPAT */
+	FALSE, /* HDR: "HDR", "LIST HEADERS" */
+	NULL, /* [X]HDR */
+	FALSE, /* OVER: "OVER", "LIST OVERVIEW.FMT" */
+	FALSE, /* OVER: "OVER mid" */
+	NULL, /* [X]OVER */
+	FALSE, /* NEWNEWS */
+	NULL, /* IMPLEMENTATION */
+	FALSE, /* STARTTLS */
+	FALSE, /* AUTHINFO USER/PASS */
+	FALSE, /* AUTHINFO SASL */
+#if 0
+	FALSE, /* SASL CRAM-MD5 */
+	FALSE, /* SASL DIGEST-MD5 */
+	FALSE, /* SASL PLAIN */
+	FALSE, /* SASL GSSAPI */
+	FALSE, /* SASL EXTERNAL */
+	FALSE, /* STREAMING: "MODE STREAM", "CHECK", "TAKETHIS" */
+	FALSE /* IHAVE */
+#endif /* 0 */
+};
+
+static mode_t real_umask;
+
 #ifdef HAVE_COLOR
 
 #	define DFT_FORE -1
@@ -440,6 +486,7 @@ static const struct {
 	{ &tinrc.col_quote3,      4 },
 	{ &tinrc.col_response,    2 },
 	{ &tinrc.col_signature,   4 },
+	{ &tinrc.col_urls,       -1 },
 	{ &tinrc.col_subject,     6 },
 	{ &tinrc.col_text,       DFT_FORE },
 	{ &tinrc.col_title,       4 },
@@ -491,30 +538,27 @@ void
 init_selfinfo(
 	void)
 {
+	FILE *fp;
 	char *ptr;
 	const char *cptr;
-	FILE *fp;
 	struct stat sb;
-#ifndef M_AMIGA
 	struct passwd *myentry;
-#endif /* !M_AMIGA */
 
-	host_name[0] = '\0';
 	domain_name[0] = '\0';
 
-#ifndef M_AMIGA /* TODO: why do we exclude M_AMIGA here but not in main.c:read_cmd_line_options() */
-#	if defined(HAVE_SYS_UTSNAME_H) && defined(HAVE_UNAME)
-	if (uname(&system_info) < 0) {
+#ifdef HAVE_SYS_UTSNAME_H
+#	ifdef HAVE_UNAME
+	if (uname(&system_info) != -1)
+		;
+	else
+#	endif /* HAVE_UNAME */
+	{
 		strcpy(system_info.sysname, "unknown");
 		*system_info.machine = '\0';
 		*system_info.release = '\0';
 		*system_info.nodename = '\0';
 	}
-#	endif /* HAVE_SYS_UTSNAME_H && HAVE_UNAME */
-#endif /* !M_AMIGA */
-
-	if ((cptr = get_host_name()) != NULL)
-		strcpy(host_name, cptr);
+#endif /* HAVE_SYS_UTSNAME_H */
 
 #ifdef DOMAIN_NAME
 	if ((cptr = get_domain_name()) != NULL)
@@ -523,8 +567,8 @@ init_selfinfo(
 
 #ifdef HAVE_GETHOSTBYNAME
 	if (domain_name[0] == '\0') {
-		cptr = ((host_name[0] == '\0') ? get_fqdn((char *) 0) : get_fqdn(host_name));
-		if (cptr != (char *) 0)
+		cptr = get_fqdn(get_host_name());
+		if (cptr != NULL)
 			strcpy(domain_name, cptr);
 	}
 #endif /* HAVE_GETHOSTBYNAME */
@@ -534,46 +578,33 @@ init_selfinfo(
 	real_umask = umask(0);
 	(void) umask(real_umask);
 
-#ifndef M_AMIGA
-#	ifndef VMS
+#ifndef VMS
 	if ((myentry = getpwuid(getuid())) == NULL) {
 		error_message(_(txt_error_passwd_missing));
 		giveup();
 	}
-#	else
+#else
 	if (((ptr = getlogin()) != NULL) && strlen(ptr))
 		myentry = getpwnam(ptr);
 	else {
 		error_message(_(txt_error_passwd_missing));
 		giveup();
 	}
-#	endif /* !VMS */
+#endif /* !VMS */
 
 	strcpy(userid, myentry->pw_name);
 
-#	ifdef VMS
+#ifdef VMS
 	lower(userid);
-#	endif /* VMS */
-
-#else
-	if ((ptr = getenv("USERNAME")) == NULL) {
-		error_message(_(txt_env_var_not_found), "USERNAME");
-		giveup();
-	}
-	my_strncpy(userid, ptr, sizeof(userid) - 1);
-#endif /* !M_AMIGA */
+#endif /* VMS */
 
 	if (((ptr = getenv("TIN_HOMEDIR")) != NULL) && strlen(ptr)) {
 		my_strncpy(homedir, ptr, sizeof(homedir) - 1);
 	} else if (((ptr = getenv("HOME")) != NULL) && strlen(ptr)) {
 		my_strncpy(homedir, ptr, sizeof(homedir) - 1);
-	}
-#ifndef M_AMIGA
-	else if (strlen(myentry->pw_dir)) {
+	} else if (strlen(myentry->pw_dir)) {
 		strncpy(homedir, myentry->pw_dir, sizeof(homedir) - 1);
-	}
-#endif /* !M_AMIGA */
-	 else
+	} else
 		strncpy(homedir, TMPDIR, sizeof(homedir) - 1);
 
 	cmdline_nntpserver[0] = '\0';
@@ -604,7 +635,6 @@ init_selfinfo(
 	reread_active_for_posted_arts = TRUE;
 	batch_mode = FALSE;
 	check_for_new_newsgroups = TRUE;
-	wildcard_func = wildmat;
 
 #ifdef HAVE_COLOR
 	preinit_colors();
@@ -618,10 +648,10 @@ init_selfinfo(
 	index_savedir[0] = '\0';
 	newsrc[0] = '\0';
 
-	sprintf(page_header, "%s %s release %s (\"%s\") [%s%s]",
-		tin_progname, VERSION, RELEASEDATE, RELEASENAME, OSNAME,
+	snprintf(page_header, sizeof(page_header), "%s %s release %s (\"%s\") [%s%s]",
+		PRODUCT, VERSION, RELEASEDATE, RELEASENAME, OSNAME,
 		(iso2asc_supported >= 0 ? " ISO2ASC" : ""));
-	sprintf(cvers, txt_copyright_notice, page_header);
+	snprintf(cvers, sizeof(cvers), txt_copyright_notice, page_header);
 
 	default_organization[0] = '\0';
 	news_headers_to_display_array = ulBuildArgv(tinrc.news_headers_to_display, &num_headers_to_display);
@@ -662,11 +692,6 @@ init_selfinfo(
 	subscriptions_file[0] = '\0';
 
 	/*
-	 * Setup default keymaps
-	 */
-	build_keymaps();
-
-	/*
 	 * read the global site config file to override some default
 	 * values given at compile time
 	 */
@@ -683,14 +708,6 @@ init_selfinfo(
 	}
 
 	/*
-	 * Amiga uses assigns which end in a ':' and won't work with a '/'
-	 * tacked on after them: e.g. we want UULIB:active, and not
-	 * UULIB:/active. For this reason I have changed the sprintf calls
-	 * to joinpath. This is defined to sprintf(result,"%s/%s",dir,file)
-	 * on all UNIX systems.
-	 */
-
-	/*
 	 * only set the following variables if they weren't set from within
 	 * read_site_config()
 	 *
@@ -768,15 +785,11 @@ init_selfinfo(
 	my_strncpy(mailer, get_val(ENV_VAR_MAILER, DEFAULT_MAILER), sizeof(mailer) - 1);
 #ifndef DISABLE_PRINTING
 	strcpy(tinrc.printer, DEFAULT_PRINTER);
-#	ifdef M_AMIGA
-	if (tin_bbs_mode)
-		strcpy(tinrc.printer, DEFAULT_BBS_PRINTER);
-#	endif /* M_AMIGA */
 #endif /* !DISABLE_PRINTING */
 	strcpy(tinrc.inews_prog, PATH_INEWS);
-	joinpath(article, homedir, TIN_ARTICLE_NAME);
+	joinpath(article_name, homedir, TIN_ARTICLE_NAME);
 #ifdef APPEND_PID
-	snprintf(article + strlen(article), sizeof(article) - strlen(article), ".%d", (int) process_id);
+	snprintf(article_name + strlen(article_name), sizeof(article_name) - strlen(article_name), ".%d", (int) process_id);
 #endif /* APPEND_PID */
 	joinpath(dead_article, homedir, "dead.article");
 	joinpath(dead_articles, homedir, "dead.articles");
@@ -798,8 +811,9 @@ init_selfinfo(
 	joinpath(filter_file, rcdir, FILTER_FILE);
 	joinpath(local_input_history_file, rcdir, INPUT_HISTORY_FILE);
 	joinpath(local_newsrctable_file, rcdir, NEWSRCTABLE_FILE);
-	joinpath(local_newsgroups_file, rcdir, NEWSGROUPS_FILE);
+#ifdef HAVE_MH_MAIL_HANDLING
 	joinpath(mail_active_file, rcdir, ACTIVE_MAIL_FILE);
+#endif /* HAVE_MH_MAIL_HANDLING */
 #ifdef VMS
 	joinpath(mailbox, DEFAULT_MAILBOX, "MAIL.TXT");
 #else
@@ -835,7 +849,7 @@ init_selfinfo(
 		write_attributes_file(local_attributes_file);
 
 	init_postinfo();
-	sprintf(txt_help_bug_report, _(txt_help_bug), bug_addr);
+	snprintf(txt_help_bug_report, sizeof(txt_help_bug_report), _(txt_help_bug), bug_addr);
 
 #ifdef HAVE_PGP_GPG
 	init_pgp();
@@ -935,8 +949,34 @@ postinit_regexp(
 	if (!strlen(tinrc.strip_re_regex))
 		STRCPY(tinrc.strip_re_regex, DEFAULT_STRIP_RE_REGEX);
 	compile_regex(tinrc.strip_re_regex, &strip_re_regex, PCRE_ANCHORED);
-	if (!strlen(tinrc.strip_was_regex))
-		STRCPY(tinrc.strip_was_regex, DEFAULT_STRIP_WAS_REGEX);
+
+	if (strlen(tinrc.strip_was_regex)) {
+		/*
+		 * try to be clever, if we still use the initial default value
+		 * convert it to our needs
+		 *
+		 * TODO: a global soultion
+		 */
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+			if (IS_LOCAL_CHARSET("UTF-8") && utf8_pcre()) {
+				if (!strcmp(tinrc.strip_was_regex, DEFAULT_STRIP_WAS_REGEX))
+					STRCPY(tinrc.strip_was_regex, DEFAULT_U8_STRIP_WAS_REGEX);
+			} else {
+				if (!strcmp(tinrc.strip_was_regex, DEFAULT_U8_STRIP_WAS_REGEX))
+					STRCPY(tinrc.strip_was_regex, DEFAULT_STRIP_WAS_REGEX);
+			}
+#else
+			if (!strcmp(tinrc.strip_was_regex, DEFAULT_U8_STRIP_WAS_REGEX))
+				STRCPY(tinrc.strip_was_regex, DEFAULT_STRIP_WAS_REGEX);
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	} else {
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		if (IS_LOCAL_CHARSET("UTF-8") && utf8_pcre())
+			STRCPY(tinrc.strip_was_regex, DEFAULT_U8_STRIP_WAS_REGEX);
+		else
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+			STRCPY(tinrc.strip_was_regex, DEFAULT_STRIP_WAS_REGEX);
+	}
 	compile_regex(tinrc.strip_was_regex, &strip_was_regex, 0);
 
 #ifdef HAVE_COLOR
@@ -973,3 +1013,19 @@ postinit_regexp(
 
 	compile_regex(SHAR_REGEX, &shar_regex, PCRE_ANCHORED);
 }
+
+
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+static t_bool
+utf8_pcre(
+	void)
+{
+	int i = 0;
+
+#	if (defined(PCRE_MAJOR) && PCRE_MAJOR >= 4)
+	(void) pcre_config(PCRE_CONFIG_UTF8, &i);
+#	endif /* PCRE_MAJOR && PCRE_MAJOR >= $*/
+
+	return (i ? TRUE : FALSE);
+}
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
diff -Nurp tin-1.6.2/src/joinpath.c tin-1.8.0/src/joinpath.c
--- tin-1.6.2/src/joinpath.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/joinpath.c	2005-12-02 12:07:36.000000000 +0100
@@ -1,12 +1,12 @@
 /*
  *  Project   : tin - a Usenet reader
  *  Module    : joinpath.c
- *  Author    : Thomas Dickey <dickey@herndon4.his.com>
+ *  Author    : Thomas Dickey <dickey@invisible-island.net>
  *  Created   : 1997-01-10
- *  Updated   : 1997-01-10
+ *  Updated   : 2003-09-19
  *  Notes     :
  *
- * Copyright (c) 1997-2003 Thomas Dickey <dickey@herndon4.his.com>
+ * Copyright (c) 1997-2006 Thomas Dickey <dickey@invisible-island.net>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -43,36 +43,15 @@
  * Concatenate dir+file, ensuring that we don't introduce extra '/', since some
  * systems (e.g., Apollo) use "//" for special purposes.
  * TODO: ../vms/vmsfile.c defines joinpath, VMS should be guarded here
- * TODO: ../amiga/amiga.c defines a joinpath, plus this section is ifndef AMIGA
- *      so can we junk the #ifdef __amigaos from this code?
  */
-#ifndef M_AMIGA
 void
 joinpath(
 	char *result,
 	const char *dir,
 	const char *file)
 {
-#	ifdef __amigaos
-	int i = 0, tmp = 0, tmp2 = 1;
-#	endif /* __amigaos */
-#	ifdef M_UNIX
 	(void) strcpy(result, dir);
 	if (result[0] == '\0' || result[strlen(result) - 1] != '/')
 		(void) strcat(result, "/");
 	(void) strcat(result, BlankIfNull(file));
-#	endif /* M_UNIX */
-/*
- * JK - horrible hack to convert "/foo/baz/bar" to "foo:baz/bar" (editors bug with *NIX-paths)
- * "foo:baz/bar" -styled paths should always work on Amiga
- */
-#	ifdef __amigaos
-	if (result[0] == '/')
-		while ((result[tmp++] = result[tmp2++]) != 0)
-			;
-	while (result[i] != '/' && result[i] != ':')
-		i++;
-	result[i] = ':';
-#	endif /* __amigaos */
 }
-#endif /* !M_AMIGA */
diff -Nurp tin-1.6.2/src/keymap.c tin-1.8.0/src/keymap.c
--- tin-1.6.2/src/keymap.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/keymap.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : keymap.c
  *  Author    : D. Nimmich, J. Faultless
  *  Created   : 2000-05-25
- *  Updated   : 2003-05-14
+ *  Updated   : 2005-10-19
  *  Notes     : This file contains key mapping routines and variables.
  *
- * Copyright (c) 2000-2003 Dirk Nimmich <nimmich@muenster.de>
+ * Copyright (c) 2000-2006 Dirk Nimmich <nimmich@muenster.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -37,765 +37,182 @@
 #ifndef TIN_H
 #	include "tin.h"
 #endif /* !TIN_H */
-#ifndef KEYMAP_H
-#	include "keymap.h"
-#endif /* !KEYMAP_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
-
-static size_t keymapsize(t_keynode *ptr[]);
-static t_bool check_duplicates(t_keynode *keyptr1, t_keynode *keyptr2);
-static t_bool processkey(t_keynode *keyptr, char *kname, char key);
-
-char *ch_post_process;
-
-static struct keymap Key = {
-	{	/* Global keys */
-		{ 0, 0, "" },
-		{ iKeyPageUp, iKeyPageUp, "PageUp" },
-		{ iKeyPageDown, iKeyPageDown, "PageDown" },
-		{ iKeyPageDown2, iKeyPageDown2, "PageDown2" },
-		{ iKeyRedrawScr, iKeyRedrawScr, "RedrawScr" },
-		{ iKeyDown, iKeyDown, "Down" },
-		{ iKeyPostponed, iKeyPostponed, "Postponed" },
-		{ iKeyUp, iKeyUp, "Up" },
-		{ iKeyPageUp2, iKeyPageUp2, "PageUp2" },
-		{ iKeyAbort, iKeyAbort, "" },			/* Was "Abort", but we don't allow rebinding the <ESC> key */
-		{ iKeyPageDown3, iKeyPageDown3, "PageDown3" },
-#ifndef NO_SHELL_ESCAPE
-		{ iKeyShellEscape, iKeyShellEscape, "ShellEscape" },
-#endif /* !NO_SHELL_ESCAPE */
-		{ iKeySetRange, iKeySetRange, "SetRange" },
-		{ iKeyLastPage, iKeyLastPage, "LastPage" },
-#ifdef HAVE_COLOR
-		{ iKeyToggleColor, iKeyToggleColor, "ToggleColor" },
-#endif /* HAVE_COLOR */
-		{ iKeyLastViewed, iKeyLastViewed, "LastViewed" },
-		{ iKeySearchSubjF, iKeySearchSubjF, "SearchSubjF" },
-		{ '0', '0', "" },	/* We don't allow redefinition of digits */
-		{ '1', '1', "" },
-		{ '2', '2', "" },
-		{ '3', '3', "" },
-		{ '4', '4', "" },
-		{ '5', '5', "" },
-		{ '6', '6', "" },
-		{ '7', '7', "" },
-		{ '8', '8', "" },
-		{ '9', '9', "" },
-		{ iKeySearchSubjB, iKeySearchSubjB, "SearchSubjB" },
-		{ iKeySearchRepeat, iKeySearchRepeat, "SearchRepeat" },
-		{ iKeySearchAuthB, iKeySearchAuthB, "SearchAuthB" },
-		{ iKeySearchBody, iKeySearchBody, "SearchBody" },
-		{ iKeyToggleHelpDisplay, iKeyToggleHelpDisplay, "ToggleHelpDisplay" },
-		{ iKeyToggleInverseVideo, iKeyToggleInverseVideo, "ToggleInverseVideo" },
-		{ iKeyLookupMessage, iKeyLookupMessage, "LookupMessage" },
-		{ iKeyOptionMenu, iKeyOptionMenu, "OptionMenu" },
-		{ iKeyPostponed2, iKeyPostponed2, "Postponed2" },
-		{ iKeyQuitTin, iKeyQuitTin, "QuitTin" },
-		{ iKeyDisplayPostHist, iKeyDisplayPostHist, "DisplayPostHist" },
-		{ iKeyFirstPage, iKeyFirstPage, "FirstPage" },
-		{ iKeySearchAuthF, iKeySearchAuthF, "SearchAuthF" },
-		{ iKeyPageUp3, iKeyPageUp3, "PageUp3" },
-		{ iKeyHelp, iKeyHelp, "Help" },
-		{ iKeyToggleInfoLastLine, iKeyToggleInfoLastLine, "ToggleInfoLastLine" },
-		{ iKeyDown2, iKeyDown2, "Down2" },
-		{ iKeyUp2, iKeyUp2, "Up2" },
-#ifndef DISABLE_PRINTING
-		{ iKeyPrint, iKeyPrint, "Print" },
-#endif /* !DISABLE_PRINTING */
-		{ iKeyQuit, iKeyQuit, "Quit" },
-		{ iKeyVersion, iKeyVersion, "Version" },
-		{ iKeyPost, iKeyPost, "Post" },
-		{ iKeyPipe, iKeyPipe, "Pipe" },
-		/*
-		 * The following two are "internal" keys that don't have a real
-		 * mapping.
-		 */
-		{ iKeyCatchupLeft, iKeyCatchupLeft, "" },
-		{ iKeyMouseToggle, iKeyMouseToggle, "" },
-		{ 0, 0, NULL }
-	},
-	{
-		{ 0, 0, "Config" },
-		{ iKeyConfigFirstPage2, iKeyConfigFirstPage2, "FirstPage2" },
-		{ iKeyConfigLastPage2, iKeyConfigLastPage2, "LastPage2" },
-		{ iKeyConfigNoSave, iKeyConfigNoSave, "NoSave" },
-		{ iKeyConfigSelect, iKeyConfigSelect, "Select" },
-		{ iKeyConfigSelect2, iKeyConfigSelect2, "Select2" },
-		{ 0, 0, NULL }
-	},
-	{
-		{ 0, 0, "Feed" },
-		{ iKeyFeedArt, iKeyFeedArt, "Art" },
-		{ iKeyFeedHot, iKeyFeedHot, "Hot" },
-		{ iKeyFeedPat, iKeyFeedPat, "Pat" },
-		{ iKeyFeedRepost, iKeyFeedRepost, "Repost" },
-		{ iKeyFeedSupersede, iKeyFeedSupersede, "Supersede" },
-		{ iKeyFeedTag, iKeyFeedTag, "Tag" },
-		{ iKeyFeedThd, iKeyFeedThd, "Thd" },
-		{ 0, 0, NULL }
-	},
-	{
-		{ 0, 0, "Filter" },
-		{ iKeyFilterEdit, iKeyFilterEdit, "Edit" },
-		{ iKeyFilterSave, iKeyFilterSave, "Save" },
-		{ 0, 0, NULL }
-	},
-	{	/* Group keys */
-		{ 0, 0, "Group" },
-		{ iKeyGroupAutoSel, iKeyGroupAutoSel, "AutoSel" },
-		{ iKeyGroupNextUnreadArtOrGrp, iKeyGroupNextUnreadArtOrGrp, "NextUnreadArtOrGrp" },
-		{ iKeyGroupReadBasenote, iKeyGroupReadBasenote, "ReadBasenote" },
-		{ iKeyGroupKill, iKeyGroupKill, "Kill" },
-		{ iKeyGroupReadBasenote2, iKeyGroupReadBasenote2, "ReadBasenote2" },
-		{ iKeyGroupSelThd, iKeyGroupSelThd, "SelThd" },
-		{ iKeyGroupDoAutoSel, iKeyGroupDoAutoSel, "DoAutoSel" },
-		{ iKeyGroupToggleThdSel, iKeyGroupToggleThdSel, "ToggleThdSel" },
-		{ iKeyGroupSelThdIfUnreadSelected, iKeyGroupSelThdIfUnreadSelected, "SelThdIfUnreadSelected" },
-		{ iKeyGroupSelPattern, iKeyGroupSelPattern, "SelPattern" },
-		{ iKeyGroupReverseSel, iKeyGroupReverseSel, "ReverseSel" },
-		{ iKeyGroupCatchupNextUnread, iKeyGroupCatchupNextUnread, "CatchupNextUnread" },
-		{ iKeyGroupEditFilter, iKeyGroupEditFilter, "EditFilter" },
-		{ iKeyGroupToggleGetartLimit, iKeyGroupToggleGetartLimit, "ToggleGetartLimit" },
-		{ iKeyGroupMarkThdRead, iKeyGroupMarkThdRead, "MarkThdRead" },
-		{ iKeyGroupNextUnreadArt, iKeyGroupNextUnreadArt, "NextUnreadArt" },
-		{ iKeyGroupPrevUnreadArt, iKeyGroupPrevUnreadArt, "PrevUnreadArt" },
-		{ iKeyGroupBugReport, iKeyGroupBugReport, "BugReport" },
-		{ iKeyGroupAutoSave, iKeyGroupAutoSave, "AutoSave" },
-		{ iKeyGroupTagParts, iKeyGroupTagParts, "TagParts" },
-		{ iKeyGroupUntag, iKeyGroupUntag, "Untag" },
-		{ iKeyGroupMarkUnselArtRead, iKeyGroupMarkUnselArtRead, "MarkUnselArtRead" },
-		{ iKeyGroupMarkThdUnread, iKeyGroupMarkThdUnread, "MarkThdUnread" },
-		{ iKeyGroupQuickAutoSel, iKeyGroupQuickAutoSel, "QuickAutoSel" },
-		{ iKeyGroupQuickKill, iKeyGroupQuickKill, "QuickKill" },
-		{ iKeyGroupCatchup, iKeyGroupCatchup, "Catchup" },
-		{ iKeyGroupToggleSubjDisplay, iKeyGroupToggleSubjDisplay, "ToggleSubjDisplay" },
-		{ iKeyGroupGoto, iKeyGroupGoto, "Goto" },
-		{ iKeyGroupListThd, iKeyGroupListThd, "ListThd" },
-		{ iKeyGroupMail, iKeyGroupMail, "Mail" },
-		{ iKeyGroupNextGroup, iKeyGroupNextGroup, "NextGroup" },
-		{ iKeyGroupPrevGroup, iKeyGroupPrevGroup, "PrevGroup" },
-		{ iKeyGroupToggleReadUnread, iKeyGroupToggleReadUnread, "ToggleReadUnread" },
-		{ iKeyGroupSave, iKeyGroupSave, "Save" },
-		{ iKeyGroupTag, iKeyGroupTag, "Tag" },
-		{ iKeyGroupToggleThreading, iKeyGroupToggleThreading, "ToggleThreading" },
-		{ iKeyGroupRepost, iKeyGroupRepost, "Repost" },
-		{ iKeyGroupMarkArtUnread, iKeyGroupMarkArtUnread, "MarkArtUnread" },
-		{ iKeyGroupUndoSel, iKeyGroupUndoSel, "UndoSel" },
-		{ 0, 0, NULL }
-	},
-	{
-		{ 0, 0, "Help" },
-		{ iKeyHelpFirstPage2, iKeyHelpFirstPage2, "FirstPage2" },
-		{ iKeyHelpLastPage2, iKeyHelpLastPage2, "LastPage2" },
-		{ 0, 0, NULL }
-	},
-	{
-	{ 0, 0, "MarkRead" },
-		{ iKeyMarkReadTag, iKeyMarkReadTag, "Tag" },
-		{ iKeyMarkReadCur, iKeyMarkReadCur, "Cur" },
-		{ 0, 0, NULL }
-	},
-	{
-		{ 0, 0, "Nrctbl" },
-		{ iKeyNrctblAlternative, iKeyNrctblAlternative, "Alternative" },
-		{ iKeyNrctblCreate, iKeyNrctblCreate, "Create" },
-		{ iKeyNrctblDefault, iKeyNrctblDefault, "Default" },
-		{ iKeyNrctblQuit, iKeyNrctblQuit, "Quit" },
-		{ 0, 0, NULL }
-	},
-	{	/* Page keys */
-		{ 0, 0, "Page" },
-		{ iKeyPageAutoSel, iKeyPageAutoSel, "AutoSel" },
-		{ iKeyPageReplyQuoteHeaders, iKeyPageReplyQuoteHeaders, "ReplyQuoteHeaders" },
-#ifdef HAVE_PGP_GPG
-		{ iKeyPagePGPCheckArticle, iKeyPagePGPCheckArticle, "PGPCheckArticle" },
-#endif /* HAVE_PGP_GPG */
-		{ iKeyPageToggleHeaders, iKeyPageToggleHeaders, "ToggleHeaders" },
-		{ iKeyPageNextUnread, iKeyPageNextUnread, "NextUnread" },
-		{ iKeyPageNextThd, iKeyPageNextThd, "NextThd" },
-		{ iKeyPageAutoKill, iKeyPageAutoKill, "AutoKill" },
-		{ iKeyPageNextThd2, iKeyPageNextThd2, "NextThd2" },
-		{ iKeyPageToggleTabs, iKeyPageToggleTabs, "ToggleTabs" },
-		{ iKeyPageFollowupQuoteHeaders, iKeyPageFollowupQuoteHeaders, "FollowupQuoteHeaders" },
-		{ iKeyPageToggleTex2iso, iKeyPageToggleTex2iso, "ToggleTex2iso" },
-		{ iKeyPageToggleRot, iKeyPageToggleRot, "ToggleRot" },
-		{ iKeyPageToggleUue, iKeyPageToggleUue, "ToggleUue" },
-		{ iKeyPageReveal, iKeyPageReveal, "Reveal" },
-		{ iKeyPageSkipIncludedText, iKeyPageSkipIncludedText, "SkipIncludedText" },
-		{ iKeyPageTopThd, iKeyPageTopThd, "TopThd" },
-		{ iKeyPageBotThd, iKeyPageBotThd, "BotThd" },
-		{ iKeyPageCatchupNextUnread, iKeyPageCatchupNextUnread, "CatchupNextUnread" },
-		{ iKeyPageCancel, iKeyPageCancel, "Cancel" },
-		{ iKeyPageEditFilter, iKeyPageEditFilter, "EditFilter" },
-		{ iKeyPageFollowup, iKeyPageFollowup, "Followup" },
-		{ iKeyPageLastPage, iKeyPageLastPage, "LastPage" },
-		{ iKeyPageKillThd, iKeyPageKillThd, "KillThd" },
-		{ iKeyPageNextUnreadArt, iKeyPageNextUnreadArt, "NextUnreadArt" },
-		{ iKeyPagePrevUnreadArt, iKeyPagePrevUnreadArt, "PrevUnreadArt" },
-		{ iKeyPageReply, iKeyPageReply, "Reply" },
-		{ iKeyPageAutoSave, iKeyPageAutoSave, "AutoSave" },
-		{ iKeyPageGroupSel, iKeyPageGroupSel, "GroupSel" },
-		{ iKeyPageViewUrl, iKeyPageViewUrl, "ViewUrl" },
-		{ iKeyPageViewAttach, iKeyPageViewAttach, "ViewAttach" },
-		{ iKeyPageMarkThdUnread, iKeyPageMarkThdUnread, "MarkThdUnread" },
-		{ iKeyPageQuickAutoSel, iKeyPageQuickAutoSel, "QuickAutoSel" },
-		{ iKeyPageQuickKill, iKeyPageQuickKill, "QuickKill" },
-		{ iKeyPageToggleHighlight, iKeyPageToggleHighlight, "ToggleHighlight" },
-		{ iKeyPageCatchup, iKeyPageCatchup, "Catchup" },
-		{ iKeyPageEditArticle, iKeyPageEditArticle, "EditArticle" },
-		{ iKeyPageFollowupQuote, iKeyPageFollowupQuote, "FollowupQuote" },
-		{ iKeyPageFirstPage, iKeyPageFirstPage, "FirstPage" },
-		{ iKeyPageListThd, iKeyPageListThd, "ListThd" },
-		{ iKeyPageMail, iKeyPageMail, "Mail" },
-		{ iKeyPageNextArt, iKeyPageNextArt, "NextArt" },
-		{ iKeyPagePrevArt, iKeyPagePrevArt, "PrevArt" },
-		{ iKeyPageReplyQuote, iKeyPageReplyQuote, "ReplyQuote" },
-		{ iKeyPageSave, iKeyPageSave, "Save" },
-		{ iKeyPageTag, iKeyPageTag, "Tag" },
-		{ iKeyPageGotoParent, iKeyPageGotoParent, "GotoParent" },
-		{ iKeyPageRepost, iKeyPageRepost, "Repost" },
-		{ iKeyPageMarkArtUnread, iKeyPageMarkArtUnread, "MarkArtUnread" },
-		{ 0, 0, NULL }
-	},
-	{
-		{ 0, 0, "Pgp" },
-		{ iKeyPgpEncSign, iKeyPgpEncSign, "EncSign" },
-		{ iKeyPgpEncrypt, iKeyPgpEncrypt, "Encrypt" },
-		{ iKeyPgpIncludekey, iKeyPgpIncludekey, "Includekey" },
-		{ iKeyPgpSign, iKeyPgpSign, "Sign" },
-		{ 0, 0, NULL }
-	},
-	{ /* Post keys */
-		{ 0, 0, "Post" },
-		{ iKeyPostCancel, iKeyPostCancel, "Cancel" },
-		{ iKeyPostEdit, iKeyPostEdit, "Edit" },
-#ifdef HAVE_PGP_GPG
-		{ iKeyPostPGP, iKeyPostPGP, "PGP" },
-#endif /* HAVE_PGP_GPG */
-#ifdef HAVE_ISPELL
-		{ iKeyPostIspell, iKeyPostIspell, "Ispell" },
-#endif /* HAVE_ISPELL */
-		{ iKeyPostAbort, iKeyPostAbort, "Abort" },
-		{ iKeyPostContinue, iKeyPostContinue, "Continue" },
-		{ iKeyPostIgnore, iKeyPostIgnore, "Ignore" },
-		{ iKeyPostMail, iKeyPostMail, "Mail" },
-		{ iKeyPostPost2, iKeyPostPost2, "Post2" },
-		{ iKeyPostPost3, iKeyPostPost3, "Post3" },
-		{ iKeyPostPostpone, iKeyPostPostpone, "Postpone" },
-		{ iKeyPostSend, iKeyPostSend, "Send" },
-		{ iKeyPostSend2, iKeyPostSend2, "Send2" },
-		{ iKeyPostSupersede, iKeyPostSupersede, "Supersede" },
-		{ 0, 0, NULL }
-	},
-	{
-		{ 0, 0, "Postpone" },
-		{ iKeyPostponeAll, iKeyPostponeAll, "All" },
-		{ iKeyPostponeOverride, iKeyPostponeOverride, "Override" },
-		{ 0, 0, NULL }
-	},
-	{
-		{ 0, 0, "PProc" },
-		{ iKeyPProcNo, iKeyPProcNo, "No" },
-		{ iKeyPProcShar, iKeyPProcShar, "Shar" },
-		{ iKeyPProcYes, iKeyPProcYes, "Yes" },
-		{ 0, 0, NULL }
-	},
-	{
-		{ 0, 0, "Prompt" },
-		{ iKeyPromptNo, iKeyPromptNo, "No" },
-		{ iKeyPromptYes, iKeyPromptYes, "Yes" },
-		{ 0, 0, NULL }
-	},
-	{
-		{ 0, 0, "Save" },
-		{ iKeySaveAppendFile, iKeySaveAppendFile, "AppendFile" },
-		{ iKeySaveOverwriteFile, iKeySaveOverwriteFile, "OverwriteFile" },
-		{ 0, 0, NULL }
-	},
-	{	/* Select keys */
-		{ 0, 0, "Select" },
-		{ iKeySelectEnterNextUnreadGrp, iKeySelectEnterNextUnreadGrp, "EnterNextUnreadGrp" },
-		{ iKeySelectReadGrp, iKeySelectReadGrp, "ReadGrp" },
-		{ iKeySelectReadGrp2, iKeySelectReadGrp2, "ReadGrp2" },
-		{ iKeySelectResetNewsrc, iKeySelectResetNewsrc, "ResetNewsrc" },
-		{ iKeySelectSortActive, iKeySelectSortActive, "SortActive" },
-		{ iKeySelectCatchupNextUnread, iKeySelectCatchupNextUnread, "CatchupNextUnread" },
-		{ iKeySelectNextUnreadGrp, iKeySelectNextUnreadGrp, "NextUnreadGrp" },
-		{ iKeySelectBugReport, iKeySelectBugReport, "BugReport" },
-		{ iKeySelectSubscribePat, iKeySelectSubscribePat, "SubscribePat" },
-		{ iKeySelectUnsubscribePat, iKeySelectUnsubscribePat, "UnsubscribePat" },
-		{ iKeySelectQuitNoWrite, iKeySelectQuitNoWrite, "QuitNoWrite" },
-		{ iKeySelectSyncWithActive, iKeySelectSyncWithActive, "SyncWithActive" },
-		{ iKeySelectMarkGrpUnread2, iKeySelectMarkGrpUnread2, "MarkGrpUnread2" },
-		{ iKeySelectCatchup, iKeySelectCatchup, "Catchup" },
-		{ iKeySelectToggleDescriptions, iKeySelectToggleDescriptions, "ToggleDescriptions" },
-		{ iKeySelectGoto, iKeySelectGoto, "Goto" },
-		{ iKeySelectMoveGrp, iKeySelectMoveGrp, "MoveGrp" },
-		{ iKeySelectEnterNextUnreadGrp2, iKeySelectEnterNextUnreadGrp2, "EnterNextUnreadGrp2" },
-		{ iKeySelectToggleReadDisplay, iKeySelectToggleReadDisplay, "ToggleReadDisplay" },
-		{ iKeySelectSubscribe, iKeySelectSubscribe, "Subscribe" },
-		{ iKeySelectUnsubscribe, iKeySelectUnsubscribe, "Unsubscribe" },
-		{ iKeySelectYankActive, iKeySelectYankActive, "YankActive" },
-		{ iKeySelectMarkGrpUnread, iKeySelectMarkGrpUnread, "MarkGrpUnread" },
-		{ 0, 0, NULL }
-	},
-	{	/* Thread keys */
-		{ 0, 0, "Thread" },
-		{ iKeyThreadReadNextArtOrThread, iKeyThreadReadNextArtOrThread, "ReadNextArtOrThread" },
-		{ iKeyThreadReadArt, iKeyThreadReadArt, "ReadArt" },
-		{ iKeyThreadReadArt2, iKeyThreadReadArt2, "ReadArt2" },
-		{ iKeyThreadSelArt, iKeyThreadSelArt, "SelArt" },
-		{ iKeyThreadToggleArtSel, iKeyThreadToggleArtSel, "ToggleArtSel" },
-		{ iKeyThreadReverseSel, iKeyThreadReverseSel, "ReverseSel" },
-		{ iKeyThreadCatchupNextUnread, iKeyThreadCatchupNextUnread, "CatchupNextUnread" },
-		{ iKeyThreadMarkArtRead, iKeyThreadMarkArtRead, "MarkArtRead" },
-		{ iKeyThreadBugReport, iKeyThreadBugReport, "BugReport" },
-		{ iKeyThreadAutoSave, iKeyThreadAutoSave, "AutoSave" },
-		{ iKeyThreadUntag, iKeyThreadUntag, "Untag" },
-		{ iKeyThreadMarkThdUnread, iKeyThreadMarkThdUnread, "MarkThdUnread" },
-		{ iKeyThreadCatchup, iKeyThreadCatchup, "Catchup" },
-		{ iKeyThreadToggleSubjDisplay, iKeyThreadToggleSubjDisplay, "ToggleSubjDisplay" },
-		{ iKeyThreadMail, iKeyThreadMail, "Mail" },
-		{ iKeyThreadSave, iKeyThreadSave, "Save" },
-		{ iKeyThreadTag, iKeyThreadTag, "Tag" },
-		{ iKeyThreadMarkArtUnread, iKeyThreadMarkArtUnread, "MarkArtUnread" },
-		{ iKeyThreadUndoSel, iKeyThreadUndoSel, "UndoSel" },
-		{ 0, 0, NULL }
-	}
-};
-
-/* NULL terminated list of pointers to the start of all the keygroups */
-static t_keynode *keygroups[] = {
-	&Key.Global.tag,		/* It is important that global be 1st for duplicate checking */
-	&Key.Config.tag,
-	&Key.Feed.tag,
-	&Key.Filter.tag,
-	&Key.Group.tag,
-	&Key.Help.tag,
-	&Key.Nrctbl.tag,
-	&Key.Page.tag,
-	&Key.Pgp.tag,
-	&Key.Post.tag,
-	&Key.Postpone.tag,
-	&Key.PProc.tag,
-	&Key.Prompt.tag,
-	&Key.Save.tag,
-	&Key.Select.tag,
-	&Key.Thread.tag,
-	NULL
-};
-
-/* Keymaps for various menus and screens */
-
-static t_keynode *keys_config_change[] = {
-	&Key.Global.Quit, &Key.Config.NoSave, &Key.Global.Up, &Key.Global.Up2,
-	&Key.Global.Down, &Key.Global.Down2, &Key.Global.FirstPage,
-	&Key.Config.FirstPage2, &Key.Global.LastPage, &Key.Config.LastPage2,
-	&Key.Global.PageUp, &Key.Global.PageUp2, &Key.Global.PageUp3,
-	&Key.Global.PageDown, &Key.Global.PageDown2, &Key.Global.PageDown3,
-	&Key.Global.SearchSubjF, &Key.Global.SearchSubjB, &Key.Global.SearchRepeat, &Key.Config.Select,
-	&Key.Config.Select2, &Key.Global.RedrawScr, &Key.Global.One,
-	&Key.Global.Two, &Key.Global.Three, &Key.Global.Four, &Key.Global.Five,
-	&Key.Global.Six, &Key.Global.Seven, &Key.Global.Eight, &Key.Global.Nine,
-	NULL };
-
-static t_keynode *keys_feed_art_thread_regex_tag[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Feed.Art, &Key.Feed.Hot,
-	&Key.Feed.Thd, &Key.Feed.Tag, &Key.Feed.Pat, NULL };
+#ifndef VERSION_H
+#	include "version.h"
+#endif /* !VERSION_H */
 
 /*
- * WARNING!
- *
- * Don't change the order of these items if you are not fully aware of the
- * side effects! The order from PProc.None onwards corresponds to the
- * enumeration of the post processing types defined in tin.h (POST_PROC_*
- * #defines) which is also used as the index stored in the post_process_type
- * tinrc variable.
- *
- * If you want to add keys that are not used to start any post processing
- * action, insert it before &Key.PProc.None. Change the index of
- * &menukeymap.feed_post_process_type.defaultkeys[] at the end of
- * build_keymaps() so that it always points to the key for no post
- * processing.
- *
- * If you want to add keys that are used for post processing, put them at
- * the end (before the NULL entry).
- *
- * If you want to delete a post processing key and add a new one, have in
- * mind that this will probably confuse users who are upgrading from an
- * older tin because the new action replaces the old one.
+ * local prototypes
  */
-static t_keynode *keys_feed_post_process_type[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.PProc.No, &Key.PProc.Shar,
-	&Key.PProc.Yes,
-	NULL };
-
-static t_keynode *keys_feed_supersede_article[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Feed.Repost, &Key.Feed.Supersede,
-	NULL };
-
-static t_keynode *keys_filter_quit_edit_save[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Filter.Edit, &Key.Filter.Save,
-	NULL };
-
-static t_keynode *keys_group_nav[] = {
-	&Key.Global.Abort, &Key.Global.One, &Key.Global.Two, &Key.Global.Three,
-	&Key.Global.Four, &Key.Global.Five, &Key.Global.Six, &Key.Global.Seven,
-	&Key.Global.Eight, &Key.Global.Nine,
-#ifndef NO_SHELL_ESCAPE
-	&Key.Global.ShellEscape,
-#endif /* !NO_SHELL_ESCAPE */
-	&Key.Global.FirstPage, &Key.Global.LastPage, &Key.Global.LastViewed,
-	&Key.Global.Pipe, &Key.Group.Mail,
-#ifndef DISABLE_PRINTING
-	&Key.Global.Print,
-#endif /* !DISABLE_PRINTING */
-	&Key.Group.Repost, &Key.Group.Save, &Key.Group.AutoSave,
-	&Key.Global.SetRange, &Key.Global.SearchAuthF, &Key.Global.SearchAuthB,
-	&Key.Global.SearchSubjF, &Key.Global.SearchSubjB, &Key.Global.SearchRepeat, &Key.Global.SearchBody,
-	&Key.Group.ReadBasenote, &Key.Group.ReadBasenote2,
-	&Key.Group.NextUnreadArtOrGrp, &Key.Global.PageDown, &Key.Global.PageDown2,
-	&Key.Global.PageDown3, &Key.Group.AutoSel, &Key.Group.Kill,
-	&Key.Group.EditFilter, &Key.Group.QuickAutoSel, &Key.Group.QuickKill,
-	&Key.Global.RedrawScr, &Key.Global.Down, &Key.Global.Down2,
-	&Key.Global.Up, &Key.Global.Up2, &Key.Global.PageUp, &Key.Global.PageUp2,
-	&Key.Global.PageUp3, &Key.Global.CatchupLeft, &Key.Group.Catchup,
-	&Key.Group.CatchupNextUnread, &Key.Group.ToggleSubjDisplay,
-	&Key.Group.Goto, &Key.Global.Help, &Key.Global.ToggleHelpDisplay,
-	&Key.Global.ToggleInverseVideo,
-#ifdef HAVE_COLOR
-	&Key.Global.ToggleColor,
-#endif /* HAVE_COLOR */
-	&Key.Group.MarkThdRead, &Key.Group.ListThd, &Key.Global.LookupMessage,
-	&Key.Global.OptionMenu, &Key.Group.NextGroup, &Key.Group.NextUnreadArt,
-	&Key.Group.PrevUnreadArt, &Key.Group.PrevGroup, &Key.Global.Quit,
-	&Key.Global.QuitTin, &Key.Group.ToggleReadUnread,
-	&Key.Group.ToggleGetartLimit, &Key.Group.BugReport, &Key.Group.TagParts,
-	&Key.Group.Tag, &Key.Group.ToggleThreading, &Key.Group.Untag,
-	&Key.Global.Version, &Key.Global.Post, &Key.Global.Postponed,
-	&Key.Global.Postponed2, &Key.Global.DisplayPostHist,
-	&Key.Group.MarkArtUnread, &Key.Group.MarkThdUnread, &Key.Group.SelThd,
-	&Key.Group.ToggleThdSel, &Key.Group.ReverseSel, &Key.Group.UndoSel,
-	&Key.Group.SelPattern, &Key.Group.SelThdIfUnreadSelected,
-	&Key.Group.MarkUnselArtRead, &Key.Group.DoAutoSel,
-	&Key.Global.ToggleInfoLastLine, NULL };
-
-static t_keynode *keys_info_nav[] = {
-	&Key.Global.Abort, &Key.Global.MouseToggle, &Key.Global.Up,
-	&Key.Global.Up2, &Key.Global.Down, &Key.Global.Down2, &Key.Global.PageDown,
-	&Key.Global.PageDown2, &Key.Global.PageDown3, &Key.Global.PageUp,
-	&Key.Global.PageUp2, &Key.Global.PageUp3, &Key.Global.FirstPage,
-	&Key.Help.FirstPage2, &Key.Global.LastPage, &Key.Help.LastPage2,
-	&Key.Global.ToggleHelpDisplay, &Key.Global.SearchSubjF,
-	&Key.Global.SearchSubjB, &Key.Global.SearchRepeat, &Key.Global.Quit, NULL };
-
-static t_keynode *keys_mark_read_tagged_current[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.MarkRead.Tag,
-	&Key.MarkRead.Cur, NULL };
-
-static t_keynode *keys_nrctbl_create[] = {
-	&Key.Global.Abort, &Key.Nrctbl.Quit, &Key.Nrctbl.Alternative,
-	&Key.Nrctbl.Create, &Key.Nrctbl.Default, NULL };
-
-static t_keynode *keys_page_nav[] = {
-	&Key.Global.Abort, &Key.Global.Zero, &Key.Global.One, &Key.Global.Two,
-	&Key.Global.Three, &Key.Global.Four, &Key.Global.Five, &Key.Global.Six,
-	&Key.Global.Seven, &Key.Global.Eight, &Key.Global.Nine,
-#ifndef NO_SHELL_ESCAPE
-	&Key.Global.ShellEscape,
-#endif /* !NO_SHELL_ESCAPE */
-	&Key.Global.MouseToggle, &Key.Global.PageUp, &Key.Global.PageUp2,
-	&Key.Global.PageUp3, &Key.Global.PageDown, &Key.Global.PageDown2,
-	&Key.Global.PageDown3, &Key.Page.NextUnread, &Key.Global.FirstPage,
-	&Key.Page.FirstPage2, &Key.Global.LastPage, &Key.Page.LastPage2,
-	&Key.Global.Up, &Key.Global.Up2, &Key.Global.Down, &Key.Global.Down2,
-	&Key.Global.LastViewed, &Key.Global.LookupMessage, &Key.Page.GotoParent,
-	&Key.Global.Pipe, &Key.Page.Mail,
-#ifndef DISABLE_PRINTING
-	&Key.Global.Print,
-#endif /* !DISABLE_PRINTING */
-	&Key.Page.Repost, &Key.Page.Save, &Key.Page.AutoSave,
-	&Key.Global.SearchAuthF, &Key.Global.SearchAuthB, &Key.Global.SearchSubjF,
-	&Key.Global.SearchSubjB, &Key.Global.SearchRepeat, &Key.Global.SearchBody,
-	&Key.Page.TopThd, &Key.Page.BotThd, &Key.Page.NextThd, &Key.Page.NextThd2,
-#ifdef HAVE_PGP_GPG
-	&Key.Page.PGPCheckArticle,
-#endif /* HAVE_PGP_GPG */
-	&Key.Page.ToggleHeaders, &Key.Page.ToggleTex2iso, &Key.Page.ToggleTabs,
-	&Key.Page.ToggleUue, &Key.Page.Reveal, &Key.Page.QuickAutoSel,
-	&Key.Page.QuickKill, &Key.Page.AutoSel, &Key.Page.AutoKill,
-	&Key.Page.EditFilter, &Key.Global.RedrawScr, &Key.Page.ToggleRot,
-	&Key.Page.Catchup, &Key.Page.CatchupNextUnread, &Key.Page.MarkThdUnread,
-	&Key.Page.Cancel, &Key.Page.EditArticle, &Key.Page.FollowupQuote,
-	&Key.Page.FollowupQuoteHeaders, &Key.Page.Followup, &Key.Global.Help,
-	&Key.Global.ToggleHelpDisplay, &Key.Global.Quit,
-	&Key.Global.ToggleInverseVideo,
-#ifdef HAVE_COLOR
-	&Key.Global.ToggleColor,
-#endif /* HAVE_COLOR */
-	&Key.Page.ListThd, &Key.Global.OptionMenu, &Key.Page.NextArt,
-	&Key.Page.KillThd, &Key.Page.NextUnreadArt, &Key.Page.PrevArt,
-	&Key.Page.PrevUnreadArt, &Key.Global.QuitTin, &Key.Page.ReplyQuote,
-	&Key.Page.ReplyQuoteHeaders, &Key.Page.Reply, &Key.Page.Tag,
-	&Key.Page.GroupSel, &Key.Global.Version, &Key.Global.Post,
-	&Key.Global.Postponed, &Key.Global.Postponed2, &Key.Global.DisplayPostHist,
-	&Key.Page.MarkArtUnread, &Key.Page.SkipIncludedText,
-	&Key.Global.ToggleInfoLastLine,
-	&Key.Page.ToggleHighlight,
-	&Key.Page.ViewAttach, &Key.Page.ViewUrl, NULL };
-
-static t_keynode *keys_pgp_mail[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Pgp.EncSign, &Key.Pgp.Encrypt,
-	&Key.Pgp.Sign, NULL };
-
-static t_keynode *keys_pgp_news[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Pgp.Includekey, &Key.Pgp.Sign,
-	NULL };
-
-static t_keynode *keys_post_cancel[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Post.Cancel, &Key.Post.Edit,
-	NULL };
-
-static t_keynode *keys_post_cont[] = {
-	&Key.Global.Abort, &Key.Post.Abort, &Key.Post.Continue, NULL };
-
-static t_keynode *keys_post_delete[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Post.Cancel, &Key.Post.Supersede,
-	NULL };
-
-static t_keynode *keys_post_edit[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Post.Edit, &Key.Post.Postpone,
-	NULL };
-
-static t_keynode *keys_post_edit_ext[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Post.Edit,
-	&Key.Global.OptionMenu, NULL };
-
-static t_keynode *keys_post_ignore_fupto[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Post.Ignore, &Key.Global.Post,
-	&Key.Post.Post2, &Key.Post.Post3, NULL };
-
-static t_keynode *keys_post_mail_fup[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Global.Post, &Key.Post.Post2,
-	&Key.Post.Post3, &Key.Post.Mail, NULL };
-
-static t_keynode *keys_post_post[] = {
-	&Key.Global.Abort, &Key.Global.Quit,
-#ifdef HAVE_PGP_GPG
-	&Key.Post.PGP,
-#endif /* HAVE_PGP_GPG */
-#ifdef HAVE_ISPELL
-	&Key.Post.Ispell,
-#endif /* HAVE_ISPELL */
-	&Key.Post.Edit, &Key.Global.Post, &Key.Post.Post2, &Key.Post.Post3,
-	&Key.Global.OptionMenu,
-	&Key.Post.Postpone, NULL };
-
-static t_keynode *keys_post_postpone[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Prompt.Yes,
-	&Key.Postpone.All, &Key.Postpone.Override, &Key.Prompt.No, NULL };
-
-static t_keynode *keys_post_send[] = {
-	&Key.Global.Abort, &Key.Global.Quit,
+static void add_default_key(struct keylist *key_list, const char *keys, t_function func);
+static void add_global_keys(struct keylist *keys);
+static void free_keylist(struct keylist *keys);
+static void upgrade_keymap_file(char *old);
+static t_bool process_keys(t_function func, const char *keys, struct keylist *kl);
+static t_bool process_mapping(char *keyname, char *keys);
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	static t_bool add_key(struct keylist *keys, const wchar_t key, t_function func, t_bool override);
+#else
+	static t_bool add_key(struct keylist *keys, const char key, t_function func, t_bool override);
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+
+struct keylist feed_post_process_keys = { NULL, 0, 0 };
+struct keylist feed_supersede_article_keys = { NULL, 0, 0 };
+struct keylist feed_type_keys = { NULL, 0, 0 };
+struct keylist filter_keys = { NULL, 0, 0 };
+struct keylist group_keys = { NULL, 0, 0 };
+struct keylist info_keys = { NULL, 0, 0 };
+struct keylist mark_read_keys = { NULL, 0, 0 };
+struct keylist option_menu_keys = { NULL, 0, 0 };
+struct keylist page_keys = { NULL, 0, 0 };
 #ifdef HAVE_PGP_GPG
-	&Key.Post.PGP,
+	struct keylist pgp_mail_keys = { NULL, 0, 0 };
+	struct keylist pgp_news_keys = { NULL, 0, 0 };
 #endif /* HAVE_PGP_GPG */
-#ifdef HAVE_ISPELL
-	&Key.Post.Ispell,
-#endif /* HAVE_ISPELL */
-	&Key.Post.Edit, &Key.Post.Send, &Key.Post.Send2, NULL };
-
-static t_keynode *keys_prompt_yn[] = {
-	&Key.Global.Abort, &Key.Prompt.Yes, &Key.Prompt.No, NULL };
-
-static t_keynode *keys_save_append_overwrite_quit[] = {
-	&Key.Global.Abort, &Key.Global.Quit, &Key.Save.AppendFile,
-	&Key.Save.OverwriteFile, NULL };
-
-static t_keynode *keys_select_nav[] = {
-	&Key.Global.Abort, &Key.Global.One, &Key.Global.Two, &Key.Global.Three,
-	&Key.Global.Four, &Key.Global.Five, &Key.Global.Six, &Key.Global.Seven,
-	&Key.Global.Eight, &Key.Global.Nine,
-#ifndef NO_SHELL_ESCAPE
-	&Key.Global.ShellEscape,
-#endif /* NO_SHELL_ESCAPE */
-	&Key.Global.FirstPage, &Key.Global.LastPage, &Key.Global.PageUp,
-	&Key.Global.PageUp2, &Key.Global.PageUp3, &Key.Global.PageDown,
-	&Key.Global.PageDown2, &Key.Global.PageDown3, &Key.Global.Up,
-	&Key.Global.Up2, &Key.Global.Down, &Key.Global.Down2, &Key.Global.SetRange,
-	&Key.Global.SearchSubjF, &Key.Global.SearchSubjB, &Key.Global.SearchRepeat,
-	&Key.Select.ReadGrp, &Key.Select.ReadGrp2, &Key.Select.EnterNextUnreadGrp,
-	&Key.Select.EnterNextUnreadGrp2, &Key.Global.RedrawScr,
-	&Key.Select.ResetNewsrc, &Key.Select.SortActive, &Key.Select.Catchup,
-	&Key.Select.CatchupNextUnread, &Key.Select.ToggleDescriptions,
-	&Key.Select.Goto, &Key.Global.Help, &Key.Global.ToggleHelpDisplay,
-	&Key.Global.ToggleInverseVideo,
-#ifdef HAVE_COLOR
-	&Key.Global.ToggleColor,
-#endif /* HAVE_COLOR */
-	&Key.Global.ToggleInfoLastLine, &Key.Select.MoveGrp,
-	&Key.Global.OptionMenu, &Key.Select.NextUnreadGrp, &Key.Global.Quit,
-	&Key.Global.QuitTin, &Key.Select.QuitNoWrite,
-	&Key.Select.ToggleReadDisplay, &Key.Select.BugReport,
-	&Key.Select.Subscribe, &Key.Select.SubscribePat, &Key.Select.Unsubscribe,
-	&Key.Select.UnsubscribePat, &Key.Global.Version, &Key.Global.Post,
-	&Key.Global.Postponed, &Key.Global.Postponed2, &Key.Global.DisplayPostHist,
-	&Key.Select.YankActive, &Key.Select.SyncWithActive,
-	&Key.Select.MarkGrpUnread, &Key.Select.MarkGrpUnread2, NULL };
-
-static t_keynode *keys_thread_nav[] = {
-	&Key.Global.Abort, &Key.Global.One, &Key.Global.Two, &Key.Global.Three,
-	&Key.Global.Four, &Key.Global.Five, &Key.Global.Six, &Key.Global.Seven,
-	&Key.Global.Eight, &Key.Global.Nine,
-#ifndef NO_SHELL_ESCAPE
-	&Key.Global.ShellEscape,
-#endif /* !NO_SHELL_ESCAPE */
-	&Key.Global.FirstPage, &Key.Global.LastPage, &Key.Global.LastViewed,
-	&Key.Global.SetRange, &Key.Global.Pipe, &Key.Thread.Mail,
-	&Key.Thread.Save, &Key.Thread.AutoSave, &Key.Thread.ReadArt,
-	&Key.Thread.ReadArt2, &Key.Thread.ReadNextArtOrThread, &Key.Global.Post,
-	&Key.Global.RedrawScr, &Key.Global.Down, &Key.Global.Down2,
-	&Key.Global.Up, &Key.Global.Up2, &Key.Global.PageUp, &Key.Global.PageUp2,
-	&Key.Global.PageUp3, &Key.Global.PageDown, &Key.Global.PageDown2,
-	&Key.Global.PageDown3, &Key.Global.CatchupLeft, &Key.Thread.Catchup,
-	&Key.Thread.CatchupNextUnread, &Key.Thread.MarkArtRead,
-	&Key.Thread.ToggleSubjDisplay, &Key.Global.Help,
-	&Key.Global.LookupMessage, &Key.Global.SearchBody,
-	&Key.Global.SearchSubjF, &Key.Global.SearchSubjB, &Key.Global.SearchRepeat,
-	&Key.Global.SearchAuthF, &Key.Global.SearchAuthB,
-	&Key.Global.ToggleHelpDisplay, &Key.Global.ToggleInverseVideo,
-#ifdef HAVE_COLOR
-	&Key.Global.ToggleColor,
-#endif /* HAVE_COLOR */
-	&Key.Global.OptionMenu,
-	&Key.Global.Quit, &Key.Global.QuitTin, &Key.Thread.Tag,
-	&Key.Thread.BugReport, &Key.Thread.Untag, &Key.Global.Version,
-	&Key.Thread.MarkArtUnread, &Key.Thread.MarkThdUnread, &Key.Thread.SelArt,
-	&Key.Thread.ToggleArtSel, &Key.Thread.ReverseSel, &Key.Thread.UndoSel,
-	&Key.Global.Postponed, &Key.Global.Postponed2, &Key.Global.DisplayPostHist,
-	&Key.Global.ToggleInfoLastLine, NULL };
-
-t_menukeymap menukeymap = {
-	{ keys_config_change, NULL, NULL },
-	{ keys_feed_art_thread_regex_tag, NULL, NULL },
-	{ keys_feed_post_process_type, NULL, NULL },
-	{ keys_feed_supersede_article, NULL, NULL },
-	{ keys_filter_quit_edit_save, NULL, NULL },
-	{ keys_group_nav, NULL, NULL },
-	{ keys_info_nav, NULL, NULL },
-	{ keys_mark_read_tagged_current, NULL, NULL },
-	{ keys_nrctbl_create, NULL, NULL },
-	{ keys_page_nav, NULL, NULL },
-	{ keys_pgp_mail, NULL, NULL },
-	{ keys_pgp_news, NULL, NULL },
-	{ keys_post_cancel, NULL, NULL },
-	{ keys_post_cont, NULL, NULL },
-	{ keys_post_delete, NULL, NULL },
-	{ keys_post_edit, NULL, NULL },
-	{ keys_post_edit_ext, NULL, NULL },
-	{ keys_post_ignore_fupto, NULL, NULL },
-	{ keys_post_mail_fup, NULL, NULL },
-	{ keys_post_post, NULL, NULL },
-	{ keys_post_postpone, NULL, NULL },
-	{ keys_post_send, NULL, NULL },
-	{ keys_prompt_yn, NULL, NULL },
-	{ keys_save_append_overwrite_quit, NULL, NULL },
-	{ keys_select_nav, NULL, NULL },
-	{ keys_thread_nav, NULL, NULL }
-};
+struct keylist post_cancel_keys = { NULL, 0, 0 };
+struct keylist post_continue_keys = { NULL, 0, 0 };
+struct keylist post_delete_keys = { NULL, 0, 0 };
+struct keylist post_edit_keys = { NULL, 0, 0 };
+struct keylist post_edit_ext_keys = { NULL, 0, 0 };
+struct keylist post_ignore_fupto_keys = { NULL, 0, 0 };
+struct keylist post_mail_fup_keys = { NULL, 0, 0 };
+struct keylist post_post_keys = { NULL, 0, 0 };
+struct keylist post_postpone_keys = { NULL, 0, 0 };
+struct keylist post_send_keys = { NULL, 0, 0 };
+struct keylist prompt_keys = { NULL, 0, 0 };
+struct keylist save_append_overwrite_keys = { NULL, 0, 0 };
+struct keylist select_keys = { NULL, 0, 0 };
+struct keylist thread_keys = { NULL, 0, 0 };
 
 
 /*
- * Return the number of keys in a menu
+ * lookup the associated function to the specified key
  */
-static size_t
-keymapsize(
-	t_keynode *ptr[])
+t_function
+key_to_func(
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	const wchar_t key,
+#else
+	const char key,
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	const struct keylist keys)
 {
-	size_t i = 0;
-
-	if (!ptr)
-		return i;
+	size_t i;
 
-	while (*ptr) {
-		i++;
-		ptr++;
+	for (i = 0; i < keys.used; i++) {
+		if (keys.list[i].key == key)
+			return keys.list[i].function;
 	}
-	return i;
+
+	return NOT_ASSIGNED;
 }
 
 
 /*
- * Compile keymaps for faster access and conversion
+ * lookup the associated key to the specified function
  */
-void
-build_keymaps(
-	void)
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+wchar_t
+#else
+char
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+func_to_key(
+	t_function func,
+	const struct keylist keys)
 {
-	char *dkey, *lkey;
-	int cnt = sizeof(menukeymap) / sizeof(t_menukeys);
-	size_t size;
-	t_keynode *keyptr;
-	t_menukeys *menuptr = &menukeymap.config_change;
-
-	while (cnt--) {
-		size = keymapsize(menuptr->keys);
-		if (menuptr->defaultkeys)
-			menuptr->defaultkeys = my_realloc(menuptr->defaultkeys, size + 1);
-		else
-			menuptr->defaultkeys = my_malloc(size + 1);
-		if (menuptr->localkeys)
-			menuptr->localkeys = my_realloc(menuptr->localkeys, size + 1);
-		else
-			menuptr->localkeys = my_malloc(size + 1);
-		dkey = menuptr->defaultkeys;
-		lkey = menuptr->localkeys;
-		dkey[size] = '\0';
-		lkey[size] = '\0';
-		while (size--) {
-			keyptr = menuptr->keys[size];
-			dkey[size] = keyptr->defaultkey;
-			lkey[size] = keyptr->localkey;
-		}
-		menuptr++;
+	size_t i;
+
+	for (i = 0; i < keys.used; i++) {
+		if (keys.list[i].function == func)
+			return keys.list[i].key;
 	}
-	ch_post_process = &menukeymap.feed_post_process_type.defaultkeys[2];
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	return (wchar_t) '?';
+#else
+	return '?';
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 }
 
 
 /*
- * convert a local key to the internal (default) mapping
+ * adds a key to a keylist
+ * default_key: TRUE if a default key should be added
+ * returns TRUE if the key was succesfully added else FALSE
  */
-int
-map_to_default(
+static t_bool
+add_key(
+	struct keylist *keys,
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	const wchar_t key,
+#else
 	const char key,
-	const t_menukeys *menukeys)
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	t_function func,
+	t_bool override)
 {
-	char *ptr = strchr(menukeys->localkeys, key);
+	size_t i;
+	struct keynode *entry = NULL;
 
-	if (ptr)
-		return menukeys->defaultkeys[ptr - menukeys->localkeys];
+	/* is a function already associated with this key */
+	for (i = 0; i < keys->used; i++) {
+		if (keys->list[i].key == key)
+			entry = &keys->list[i];
+	}
+
+	if (entry != NULL) {
+		if (override) {
+			entry->function = func;
+			return TRUE;
+		} else
+			return FALSE;
+	} else {
+		/* add a new entry */
+		if (keys->used >= keys->max) {
+			if (keys->list == NULL) {
+				keys->max = 1;
+				keys->list = my_malloc(keys->max * sizeof(struct keynode));
+			} else {
+				keys->max++;
+				keys->list = my_realloc(keys->list, keys->max * sizeof(struct keynode));
+			}
+		}
+		keys->list[keys->used].key = key;
+		keys->list[keys->used].function = func;
+		keys->used++;
 
-	return 0;
+		return TRUE;
+	}
 }
 
 
 /*
- * convert an internal (default) key to a local one
+ * FIXME:
+ * as long as we use only ASCII for default keys no need to change 'keys' to wchar_t
  */
-int
-map_to_local(
-	const char key,
-	const t_menukeys *menukeys)
+static void
+add_default_key(
+	struct keylist *key_list,
+	const char *keys,
+	t_function func)
 {
-	char *ptr = strchr(menukeys->defaultkeys, key);
+	const char *key = keys;
+	/* check if the function has already a key assigned before we add the default one */
+	if (func_to_key(func, *key_list) != '?')
+		return;
+
+	for (; *key != '\0'; key++)
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		add_key(key_list, (wchar_t) *key, func, FALSE);
+#else
+		add_key(key_list, *key, func, FALSE);
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+}
 
-	if (ptr)
-		return menukeys->localkeys[ptr - menukeys->defaultkeys];
 
-	return 0;
+static void
+free_keylist(struct keylist *keys) {
+	FreeAndNull(keys->list);
+	keys->used = keys->max = 0;
 }
 
 
@@ -806,38 +223,80 @@ void
 free_keymaps(
 	void)
 {
-	int cnt = sizeof(menukeymap) / sizeof(t_menukeys);
-	t_menukeys *menuptr = &menukeymap.config_change;
-
-	while (cnt--) {
-		FreeIfNeeded(menuptr->localkeys);
-		FreeIfNeeded(menuptr->defaultkeys);
-		menuptr++;
-	}
+	free_keylist(&select_keys);
+	free_keylist(&group_keys);
+	free_keylist(&thread_keys);
+	free_keylist(&option_menu_keys);
+	free_keylist(&page_keys);
+	free_keylist(&info_keys);
+	free_keylist(&post_send_keys);
+	free_keylist(&post_edit_keys);
+	free_keylist(&post_edit_ext_keys);
+	free_keylist(&post_post_keys);
+	free_keylist(&post_postpone_keys);
+	free_keylist(&post_mail_fup_keys);
+	free_keylist(&post_ignore_fupto_keys);
+	free_keylist(&post_continue_keys);
+	free_keylist(&post_delete_keys);
+	free_keylist(&post_cancel_keys);
+	free_keylist(&filter_keys);
+	free_keylist(&mark_read_keys);
+#ifdef HAVE_PGP_GPG
+	free_keylist(&pgp_mail_keys);
+	free_keylist(&pgp_news_keys);
+#endif /* HAVE_PGP_GPG */
+	free_keylist(&save_append_overwrite_keys);
+	free_keylist(&feed_type_keys);
+	free_keylist(&feed_post_process_keys);
+	free_keylist(&feed_supersede_article_keys);
+	free_keylist(&prompt_keys);
 }
 
 
 /*
  * Render ch in human readable ASCII
  * Is there no lib function to do this ?
+ * *buf must have a size of at least MAXKEYLEN
  */
 char *
 printascii(
 	char *buf,
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wint_t ch)
+#else
 	int ch)
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 {
-	if ((ch == 0) || isgraph(ch)) {	/* Regular printables */
+	if (ch == 0)
+		strcpy(buf, _("NULL"));
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	else if (iswgraph(ch)) {	/* Regular printables */
+		int i = wctomb(buf, ch);
+
+		if (i > 0)
+			buf[i] = '\0';
+		else
+			buf[0] = '\0';
+	}
+#else
+	else if (isgraph(ch)) {		/* Regular printables */
 		buf[0] = ch;
 		buf[1] = '\0';
-	} else if (ch == '\t') {	/* TAB */
+	}
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	else if (ch == '\t') {	/* TAB */
 		strcpy(buf, _(txt_tab));
 	} else if ((ch == '\n') || (ch == '\r')) {	/* LF, CR */
 		strcpy(buf, _(txt_cr));
 	} else if (ch == ESC) {		/* Escape */
 		strcpy(buf, _(txt_esc));
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	} else if (iswcntrl(ch)) {	/* Control keys */
+#else
 	} else if (iscntrl(ch)) {	/* Control keys */
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 		buf[0] = '^';
-		buf[1] = (ch & 0xFF) + '@';
+		buf[1] = ((int) ch & 0xFF) + '@';
 		buf[2] = '\0';
 	} else if (ch == ' ')		/* SPACE */
 		strcpy(buf, _(txt_space));
@@ -848,71 +307,11 @@ printascii(
 }
 
 
+#define KEYSEPS		" \t\n"
 /*
- * Find any key clashes between groups keyptr1 and keyptr2. This is just an
- * ascending brute force search. We need a pointer to the tag node in order
- * to report errors correctly, the pointers start 1 above this on the first
- * key definition. If we are checking against the same keygroup, then ptr2
- * starts at (ptr1+1) else the algorithm doesn't work!
- */
-static t_bool
-check_duplicates(
-	t_keynode *keyptr1,
-	t_keynode *keyptr2)
-{
-	char buf[10];
-	t_keynode *ptr1, *ptr2;
-
-	for (ptr1 = keyptr1 + 1; ptr1->localkey != '\0'; ++ptr1) {
-		for (ptr2 = (keyptr1 == keyptr2) ? ptr1 + 1 : keyptr2 + 1; ptr2->localkey != '\0'; ++ptr2) {
-			if (ptr1->localkey == ptr2->localkey) {
-				wait_message(0, _(txt_keymap_conflict), printascii(buf, ptr1->localkey), keyptr1->t, ptr1->t, keyptr2->t, ptr2->t);
-				return FALSE;
-			}
-		}
-	}
-	return TRUE;
-}
-
-
-/*
- * Try and lookup a key description. If found, make the assignment
+ * read the keymap file
+ * returns TRUE if the keymap file was read without an error else FALSE
  */
-static t_bool
-processkey(
-	t_keynode *keyptr,		/* Where in map to start search */
-	char *kname,				/* Keyname we're searching for */
-	char key)					/* Key to assign to keyname if found */
-{
-	char buf[LEN];
-	int i;
-#ifdef DEBUG
-	char was[10], is[10];
-#endif /* DEBUG */
-
-	strcpy(buf, keyptr->t);	/* Preload the groupname for speed */
-	keyptr++;						/* Advance to 1st key */
-	i = strlen(buf);
-
-	for (; keyptr->t != NULL; ++keyptr) {
-		strcpy(buf + i, keyptr->t);
-
-		if (strcasecmp(kname, buf) == 0) {
-#ifdef DEBUG
-			fprintf(stderr, _(txt_keymap_redef), buf, printascii(was, keyptr->localkey), printascii(is, key));
-#endif /* DEBUG */
-			keyptr->localkey = key;
-			return TRUE;
-		}
-	}
-
-	return FALSE;
-}
-
-
-#define KEYSEPS		" \t\n"
-/* TODO: -> tin.h */
-#define KEYMAP_FILE	"keymap"
 t_bool
 read_keymap_file(
 	void)
@@ -921,8 +320,7 @@ read_keymap_file(
 	char *line, *keydef, *kname;
 	char *map, *ptr;
 	char buf[LEN], buff[NAME_LEN + 1];
-	char key;
-	int i;
+	int upgrade = RC_CHECK;
 	t_bool ret = TRUE;
 
 	/*
@@ -962,6 +360,22 @@ read_keymap_file(
 	if (!fp)
 		return TRUE; /* no keymap file is not an error */
 
+	map = my_strdup(buf); /* remember keymap-name */
+
+	/* check if keymap file is uptodate */
+	while ((line = fgets(buf, sizeof(buf), fp)) != NULL) {
+		if (line[0] == '#' && upgrade == RC_CHECK) {
+			if ((upgrade = check_upgrade(line, "# Keymap file V", KEYMAP_VERSION)) == RC_UPGRADE) {
+				fclose(fp);
+				upgrade_keymap_file(map);
+				upgrade = RC_IGNORE;
+				fp = fopen(map, "r");
+			}
+			break;
+		}
+	}
+
+	free_keymaps();
 	while ((line = fgets(buf, sizeof(buf), fp)) != NULL) {
 		/*
 		 * Ignore blank and comment lines
@@ -969,17 +383,74 @@ read_keymap_file(
 		if (line[0] == '#' || line[0] == '\n')
 			continue;
 
-		kname = strtok(line, KEYSEPS);
-		keydef = strtok(NULL, KEYSEPS);
+		if ((kname = strsep(&line, KEYSEPS)) != NULL) {
+			keydef = str_trim(line);
+			/*
+			 * Warn about basic syntax errors
+			 */
+			if (keydef == NULL || !strlen(keydef)) {
+				wait_message(0, _(txt_keymap_missing_key), kname);
+				ret = FALSE;
+				continue;
+			}
+		} else
+			continue;
 
 		/*
-		 * Warn about basic syntax errors
+		 * TODO: useful? shared keymaps (NFS-Home) may differ
+		 * depending on the OS (i.e. on tin has color the other has not)
 		 */
-		if (keydef == NULL) {
-			wait_message(0, _(txt_keymap_missing_key), kname);
+		if (!process_mapping(kname, keydef)) {
+			wait_message(0, _(txt_keymap_invalid_name), kname);
+			prompt_continue();
+			ret = FALSE;
+			continue;
+		}
+
+	}
+	fclose(fp);
+	setup_default_keys();
+	if (upgrade != RC_IGNORE)
+		upgrade_prompt_quit(upgrade, map);
+
+	free(map);
+	return ret;
+}
+
+
+/*
+ * associate the keys with the internal function and add them to the keylist
+ * returns TRUE if all keys could be recognized else FALSE
+ */
+static t_bool
+process_keys(
+	t_function func,
+	const char *keys,
+	struct keylist *kl)
+{
+	char *keydef, *tmp;
+	t_bool error, ret = TRUE;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wchar_t *wkeydef;
+	wchar_t key;
+#else
+	char key;
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+
+	tmp = my_strdup(keys);		/* don't change "keys" */
+	keydef = strtok(tmp, KEYSEPS);
+
+	while (keydef != NULL) {
+		error = FALSE;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		if ((wkeydef = char2wchar_t(keydef)) == NULL) {
+			wait_message(1, _(txt_invalid_multibyte_sequence));
 			ret = FALSE;
+
+			keydef = strtok(NULL, KEYSEPS);
 			continue;
 		}
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 		/*
 		 * Parse the key sequence into 'key'
@@ -988,18 +459,19 @@ read_keymap_file(
 		 * TAB -> ^I
 		 * SPACE -> ' '
 		 */
-		if (strlen(keydef) > 1)
-			switch (keydef[0]) {
-				case '^':
-					if (!(isupper((int)(unsigned char) keydef[1]))) {
-						wait_message(0, _(txt_keymap_invalid_key), keydef);
-						ret = FALSE;
-						continue;
-					}
-					key = ctrl(keydef[1]);
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		if (wcslen(wkeydef) > 1) {
+			switch (wkeydef[0])	/* Only test 1st char - crude but effective */
+#else
+		if (strlen(keydef) > 1) {
+			switch (keydef[0])	/* Only test 1st char - crude but effective */
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+			{
+				case 'N':
+					key = '\0';
 					break;
 
-				case 'S':		/* Only test 1st char - crude but effective */
+				case 'S':
 					key = ' ';
 					break;
 
@@ -1007,45 +479,2240 @@ read_keymap_file(
 					key = ctrl('I');
 					break;
 
+				case '^':
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+					/* allow only ^A to ^Z */
+					if (wkeydef[1] >= 'A' && wkeydef[1] <= 'Z') {
+						key = ctrl(wkeydef[1]);
+						break;
+					}
+#else
+					if (isupper((int)(unsigned char) keydef[1])) {
+						key = ctrl(keydef[1]);
+						break;
+					}
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+					/* FALLTHROUGH */
 				default:
 					wait_message(0, _(txt_keymap_invalid_key), keydef);
 					ret = FALSE;
-					continue;
+					error = TRUE;
+					break;
+			}
+		} else {
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+			if (iswdigit(key = wkeydef[0]))
+#else
+			if (isdigit(key = keydef[0]))
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+			{
+				wait_message(0, _(txt_keymap_invalid_key), keydef);
+				ret = FALSE;
+				error = TRUE;
 			}
-		else
-			key = keydef[0];
-
-		/*
-		 * Try and locate the tagline in each keygroup
-		 */
-		for (i = 0; keygroups[i] != NULL; ++i) {
-			if (processkey(keygroups[i], kname, key))
-				break;
-		}
-
-		/*
-		 * TODO: useful? shared keymaps (NFS-Home) may differ
-		 * depending on the OS (i.e. on tin has color the other has not)
-		 */
-		if (keygroups[i] == NULL) {
-			wait_message(0, _(txt_keymap_invalid_name), kname);
-			ret = FALSE;
-			continue;
 		}
 
-	}
+		if (!error)
+			add_key(kl, key, func, TRUE);
 
-	/*
-	 * Check for duplicates in each keygroup and vs. the global group
-	 */
-	for (i = 0; keygroups[i] != NULL; ++i) {
-		if (!(check_duplicates(keygroups[i], keygroups[i])))
-			ret = FALSE;
-		if (i != 0 && !(check_duplicates(keygroups[i], keygroups[0])))
-			ret = FALSE;
+		keydef = strtok(NULL, KEYSEPS);
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		FreeIfNeeded(wkeydef);
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 	}
+	free(tmp);
 
-	fclose(fp);
-	build_keymaps();
 	return ret;
 }
+
+
+/*
+ * map a keyname to the internal function name and assign the keys
+ * returns TRUE if a mapping was found else FALSE
+ */
+static t_bool
+process_mapping(
+	char *keyname,				/* Keyname we're searching for */
+	char *keys)				/* Key to assign to keyname if found */
+{
+	switch (keyname[0]) {
+		case 'B':
+			if (strcmp(keyname, "BugReport") == 0) {
+				process_keys(GLOBAL_BUGREPORT, keys, &group_keys);
+				process_keys(GLOBAL_BUGREPORT, keys, &select_keys);
+				process_keys(GLOBAL_BUGREPORT, keys, &thread_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'C':
+			if (strcmp(keyname, "Catchup") == 0) {
+				process_keys(CATCHUP, keys, &group_keys);
+				process_keys(CATCHUP, keys, &page_keys);
+				process_keys(CATCHUP, keys, &select_keys);
+				process_keys(CATCHUP, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "CatchupNextUnread") == 0) {
+				process_keys(CATCHUP_NEXT_UNREAD, keys, &group_keys);
+				process_keys(CATCHUP_NEXT_UNREAD, keys, &page_keys);
+				process_keys(CATCHUP_NEXT_UNREAD, keys, &select_keys);
+				process_keys(CATCHUP_NEXT_UNREAD, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ConfigFirstPage") == 0) {
+				process_keys(GLOBAL_FIRST_PAGE, keys, &option_menu_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ConfigLastPage") == 0) {
+				process_keys(GLOBAL_LAST_PAGE, keys, &option_menu_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ConfigNoSave") == 0) {
+				process_keys(CONFIG_NO_SAVE, keys, &option_menu_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ConfigSelect") == 0) {
+				process_keys(CONFIG_SELECT, keys, &option_menu_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'D':
+			if (strcmp(keyname, "DisplayPostHist") == 0) {
+				process_keys(GLOBAL_DISPLAY_POST_HISTORY, keys, &group_keys);
+				process_keys(GLOBAL_DISPLAY_POST_HISTORY, keys, &page_keys);
+				process_keys(GLOBAL_DISPLAY_POST_HISTORY, keys, &select_keys);
+				process_keys(GLOBAL_DISPLAY_POST_HISTORY, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "Down") == 0) {
+				process_keys(GLOBAL_LINE_DOWN, keys, &group_keys);
+				process_keys(GLOBAL_LINE_DOWN, keys, &info_keys);
+				process_keys(GLOBAL_LINE_DOWN, keys, &option_menu_keys);
+				process_keys(GLOBAL_LINE_DOWN, keys, &page_keys);
+				process_keys(GLOBAL_LINE_DOWN, keys, &select_keys);
+				process_keys(GLOBAL_LINE_DOWN, keys, &thread_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'E':
+			if (strcmp(keyname, "EditFilter") == 0) {
+				process_keys(GLOBAL_EDIT_FILTER, keys, &group_keys);
+				process_keys(GLOBAL_EDIT_FILTER, keys, &page_keys);
+				process_keys(GLOBAL_EDIT_FILTER, keys, &select_keys);
+				process_keys(GLOBAL_EDIT_FILTER, keys, &thread_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'F':
+			if (strcmp(keyname, "FeedArt") == 0) {
+				process_keys(FEED_ARTICLE, keys, &feed_type_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "FeedHot") == 0) {
+				process_keys(FEED_HOT, keys, &feed_type_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "FeedPat") == 0) {
+				process_keys(FEED_PATTERN, keys, &feed_type_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "FeedRepost") == 0) {
+				process_keys(FEED_KEY_REPOST, keys, &feed_supersede_article_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "FeedSupersede") == 0) {
+				process_keys(FEED_SUPERSEDE, keys, &feed_supersede_article_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "FeedTag") == 0) {
+				process_keys(FEED_TAGGED, keys, &feed_type_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "FeedThd") == 0) {
+				process_keys(FEED_THREAD, keys, &feed_type_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "FilterEdit") == 0) {
+				process_keys(FILTER_EDIT, keys, &filter_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "FilterSave") == 0) {
+				process_keys(FILTER_SAVE, keys, &filter_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "FirstPage") == 0) {
+				process_keys(GLOBAL_FIRST_PAGE, keys, &group_keys);
+				process_keys(GLOBAL_FIRST_PAGE, keys, &info_keys);
+				process_keys(GLOBAL_FIRST_PAGE, keys, &option_menu_keys);
+				process_keys(GLOBAL_FIRST_PAGE, keys, &page_keys);
+				process_keys(GLOBAL_FIRST_PAGE, keys, &select_keys);
+				process_keys(GLOBAL_FIRST_PAGE, keys, &thread_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'G':
+			if (strcmp(keyname, "GroupAutoSave") == 0) {
+				process_keys(GROUP_AUTOSAVE, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupDoAutoSel") == 0) {
+				process_keys(GROUP_DO_AUTOSELECT, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupGoto") == 0) {
+				process_keys(GROUP_GOTO, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupListThd") == 0) {
+				process_keys(GROUP_LIST_THREAD, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupMail") == 0) {
+				process_keys(GROUP_MAIL, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupMarkThdRead") == 0) {
+				process_keys(GROUP_MARK_THREAD_READ, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupMarkUnselArtRead") == 0) {
+				process_keys(GROUP_MARK_UNSELECTED_ARTICLES_READ, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupNextGroup") == 0) {
+				process_keys(GROUP_NEXT_GROUP, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupNextUnreadArt") == 0) {
+				process_keys(GROUP_NEXT_UNREAD_ARTICLE, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupNextUnreadArtOrGrp") == 0) {
+				process_keys(GROUP_NEXT_UNREAD_ARTICLE_OR_GROUP, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupPrevGroup") == 0) {
+				process_keys(GROUP_PREVIOUS_GROUP, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupPrevUnreadArt") == 0) {
+				process_keys(GROUP_PREVIOUS_UNREAD_ARTICLE, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupReadBasenote") == 0) {
+				process_keys(GROUP_READ_BASENOTE, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupRepost") == 0) {
+				process_keys(GROUP_REPOST, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupReverseSel") == 0) {
+				process_keys(GROUP_REVERSE_SELECTIONS, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupSave") == 0) {
+				process_keys(GROUP_SAVE, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupSelPattern") == 0) {
+				process_keys(GROUP_SELECT_PATTERN, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupSelThd") == 0) {
+				process_keys(GROUP_SELECT_THREAD, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupSelThdIfUnreadSelected") == 0) {
+				process_keys(GROUP_SELECT_THREAD_IF_UNREAD_SELECTED, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupTag") == 0) {
+				process_keys(GROUP_TAG, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupTagParts") == 0) {
+				process_keys(GROUP_TAG_PARTS, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupToggleGetartLimit") == 0) {
+				process_keys(GROUP_TOGGLE_GET_ARTICLES_LIMIT, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupToggleReadUnread") == 0) {
+				process_keys(GROUP_TOGGLE_READ_UNREAD, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupToggleSubjDisplay") == 0) {
+				process_keys(GROUP_TOGGLE_SUBJECT_DISPLAY, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupToggleThdSel") == 0) {
+				process_keys(GROUP_TOGGLE_SELECT_THREAD, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupToggleThreading") == 0) {
+				process_keys(GROUP_TOGGLE_THREADING, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupUndoSel") == 0) {
+				process_keys(GROUP_UNDO_SELECTIONS, keys, &group_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "GroupUntag") == 0) {
+				process_keys(GROUP_UNTAG, keys, &group_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'H':
+			if (strcmp(keyname, "Help") == 0) {
+				process_keys(GLOBAL_HELP, keys, &group_keys);
+				process_keys(GLOBAL_HELP, keys, &page_keys);
+				process_keys(GLOBAL_HELP, keys, &select_keys);
+				process_keys(GLOBAL_HELP, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "HelpFirstPage") == 0) {
+				process_keys(GLOBAL_FIRST_PAGE, keys, &info_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "HelpLastPage") == 0) {
+				process_keys(GLOBAL_LAST_PAGE, keys, &info_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'L':
+			if (strcmp(keyname, "LastPage") == 0) {
+				process_keys(GLOBAL_LAST_PAGE, keys, &group_keys);
+				process_keys(GLOBAL_LAST_PAGE, keys, &info_keys);
+				process_keys(GLOBAL_LAST_PAGE, keys, &option_menu_keys);
+				process_keys(GLOBAL_LAST_PAGE, keys, &page_keys);
+				process_keys(GLOBAL_LAST_PAGE, keys, &select_keys);
+				process_keys(GLOBAL_LAST_PAGE, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "LastViewed") == 0) {
+				process_keys(GLOBAL_LAST_VIEWED, keys, &group_keys);
+				process_keys(GLOBAL_LAST_VIEWED, keys, &page_keys);
+				process_keys(GLOBAL_LAST_VIEWED, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "LookupMessage") == 0) {
+				process_keys(GLOBAL_LOOKUP_MESSAGEID, keys, &group_keys);
+				process_keys(GLOBAL_LOOKUP_MESSAGEID, keys, &page_keys);
+				process_keys(GLOBAL_LOOKUP_MESSAGEID, keys, &thread_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'M':
+			if (strcmp(keyname, "MarkReadCur") == 0) {
+				process_keys(MARK_READ_CURRENT, keys, &mark_read_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "MarkReadTag") == 0) {
+				process_keys(MARK_READ_TAGGED, keys, &mark_read_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "MarkArticleUnread") == 0) {
+				process_keys(MARK_ARTICLE_UNREAD, keys, &group_keys);
+				process_keys(MARK_ARTICLE_UNREAD, keys, &page_keys);
+				process_keys(MARK_ARTICLE_UNREAD, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "MarkThreadUnread") == 0) {
+				process_keys(MARK_THREAD_UNREAD, keys, &group_keys);
+				process_keys(MARK_THREAD_UNREAD, keys, &page_keys);
+				process_keys(MARK_THREAD_UNREAD, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "MenuFilterKill") == 0) {
+				process_keys(GLOBAL_MENU_FILTER_KILL, keys, &group_keys);
+				process_keys(GLOBAL_MENU_FILTER_KILL, keys, &page_keys);
+				process_keys(GLOBAL_MENU_FILTER_KILL, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "MenuFilterSelect") == 0) {
+				process_keys(GLOBAL_MENU_FILTER_SELECT, keys, &group_keys);
+				process_keys(GLOBAL_MENU_FILTER_SELECT, keys, &page_keys);
+				process_keys(GLOBAL_MENU_FILTER_SELECT, keys, &thread_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'O':
+			if (strcmp(keyname, "OptionMenu") == 0) {
+				process_keys(GLOBAL_OPTION_MENU, keys, &group_keys);
+				process_keys(GLOBAL_OPTION_MENU, keys, &page_keys);
+				process_keys(GLOBAL_OPTION_MENU, keys, &post_edit_ext_keys);
+				process_keys(GLOBAL_OPTION_MENU, keys, &post_post_keys);
+				process_keys(GLOBAL_OPTION_MENU, keys, &select_keys);
+				process_keys(GLOBAL_OPTION_MENU, keys, &thread_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'P':
+			if (strcmp(keyname, "PageAutoSave") == 0) {
+				process_keys(PAGE_AUTOSAVE, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageBotThd") == 0) {
+				process_keys(PAGE_BOTTOM_THREAD, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageCancel") == 0) {
+				process_keys(PAGE_CANCEL, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageDown") == 0) {
+				process_keys(GLOBAL_PAGE_DOWN, keys, &group_keys);
+				process_keys(GLOBAL_PAGE_DOWN, keys, &info_keys);
+				process_keys(GLOBAL_PAGE_DOWN, keys, &option_menu_keys);
+				process_keys(GLOBAL_PAGE_DOWN, keys, &page_keys);
+				process_keys(GLOBAL_PAGE_DOWN, keys, &select_keys);
+				process_keys(GLOBAL_PAGE_DOWN, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageDown3") == 0) {
+				process_keys(GLOBAL_PAGE_DOWN, keys, &group_keys);
+				process_keys(GLOBAL_PAGE_DOWN, keys, &info_keys);
+				process_keys(GLOBAL_PAGE_DOWN, keys, &option_menu_keys);
+				process_keys(GLOBAL_PAGE_DOWN, keys, &select_keys);
+				process_keys(GLOBAL_PAGE_DOWN, keys, &thread_keys);
+				process_keys(PAGE_PAGE_DOWN3, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageEditArticle") == 0) {
+				process_keys(PAGE_EDIT_ARTICLE, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageFirstPage") == 0) {
+				process_keys(GLOBAL_FIRST_PAGE, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageFollowup") == 0) {
+				process_keys(PAGE_FOLLOWUP, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageFollowupQuote") == 0) {
+				process_keys(PAGE_FOLLOWUP_QUOTE, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageFollowupQuoteHeaders") == 0) {
+				process_keys(PAGE_FOLLOWUP_QUOTE_HEADERS, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageGotoParent") == 0) {
+				process_keys(PAGE_GOTO_PARENT, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageGroupSel") == 0) {
+				process_keys(PAGE_GROUP_SELECT, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageLastPage") == 0) {
+				process_keys(GLOBAL_LAST_PAGE, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageListThd") == 0) {
+				process_keys(PAGE_LIST_THREAD, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageKillThd") == 0) {
+				process_keys(PAGE_MARK_THREAD_READ, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageMail") == 0) {
+				process_keys(PAGE_MAIL, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageNextArt") == 0) {
+				process_keys(PAGE_NEXT_ARTICLE, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageNextThd") == 0) {
+				process_keys(PAGE_NEXT_THREAD, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageNextUnread") == 0) {
+				process_keys(PAGE_NEXT_UNREAD, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageNextUnreadArt") == 0) {
+				process_keys(PAGE_NEXT_UNREAD_ARTICLE, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PagePGPCheckArticle") == 0) {
+#ifdef HAVE_PGP_GPG
+				process_keys(PAGE_PGP_CHECK_ARTICLE, keys, &page_keys);
+#endif /* HAVE_PGP_GPG */
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PagePrevArt") == 0) {
+				process_keys(PAGE_PREVIOUS_ARTICLE, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PagePrevUnreadArt") == 0) {
+				process_keys(PAGE_PREVIOUS_UNREAD_ARTICLE, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageReply") == 0) {
+				process_keys(PAGE_REPLY, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageReplyQuote") == 0) {
+				process_keys(PAGE_REPLY_QUOTE, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageReplyQuoteHeaders") == 0) {
+				process_keys(PAGE_REPLY_QUOTE_HEADERS, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageRepost") == 0) {
+				process_keys(PAGE_REPOST, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageReveal") == 0) {
+				process_keys(PAGE_REVEAL, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageSave") == 0) {
+				process_keys(PAGE_SAVE, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageSkipIncludedText") == 0) {
+				process_keys(PAGE_SKIP_INCLUDED_TEXT, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageTag") == 0) {
+				process_keys(PAGE_TAG, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageTopThd") == 0) {
+				process_keys(PAGE_TOP_THREAD, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageToggleHeaders") == 0) {
+				process_keys(PAGE_TOGGLE_HEADERS, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageToggleHighlight") == 0) {
+				process_keys(PAGE_TOGGLE_HIGHLIGHTING, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageToggleRot") == 0) {
+				process_keys(PAGE_TOGGLE_ROT13, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageToggleTabs") == 0) {
+				process_keys(PAGE_TOGGLE_TABS, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageToggleTex2iso") == 0) {
+				process_keys(PAGE_TOGGLE_TEX2ISO, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageToggleUue") == 0) {
+				process_keys(PAGE_TOGGLE_UUE, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageUp") == 0) {
+				process_keys(GLOBAL_PAGE_UP, keys, &group_keys);
+				process_keys(GLOBAL_PAGE_UP, keys, &info_keys);
+				process_keys(GLOBAL_PAGE_UP, keys, &option_menu_keys);
+				process_keys(GLOBAL_PAGE_UP, keys, &page_keys);
+				process_keys(GLOBAL_PAGE_UP, keys, &select_keys);
+				process_keys(GLOBAL_PAGE_UP, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageViewAttach") == 0) {
+				process_keys(PAGE_VIEW_ATTACHMENTS, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PageViewUrl") == 0) {
+				process_keys(PAGE_VIEW_URL, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PgpEncrypt") == 0) {
+#ifdef HAVE_PGP_GPG
+				process_keys(PGP_KEY_ENCRYPT, keys, &pgp_mail_keys);
+#endif /* HAVE_PGP_GPG */
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PgpEncSign") == 0) {
+#ifdef HAVE_PGP_GPG
+				process_keys(PGP_KEY_ENCRYPT_SIGN, keys, &pgp_mail_keys);
+#endif /* HAVE_PGP_GPG */
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PgpIncludekey") == 0) {
+#ifdef HAVE_PGP_GPG
+				process_keys(PGP_INCLUDE_KEY, keys, &pgp_news_keys);
+#endif /* HAVE_PGP_GPG */
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PgpSign") == 0) {
+#ifdef HAVE_PGP_GPG
+				process_keys(PGP_KEY_SIGN, keys, &pgp_news_keys);
+				process_keys(PGP_KEY_SIGN, keys, &pgp_mail_keys);
+#endif /* HAVE_PGP_GPG */
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "Pipe") == 0) {
+				process_keys(GLOBAL_PIPE, keys, &group_keys);
+				process_keys(GLOBAL_PIPE, keys, &page_keys);
+				process_keys(GLOBAL_PIPE, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "Post") == 0) {
+				process_keys(GLOBAL_POST, keys, &group_keys);
+				process_keys(GLOBAL_POST, keys, &page_keys);
+				process_keys(GLOBAL_POST, keys, &post_ignore_fupto_keys);
+				process_keys(GLOBAL_POST, keys, &post_mail_fup_keys);
+				process_keys(GLOBAL_POST, keys, &post_post_keys);
+				process_keys(GLOBAL_POST, keys, &select_keys);
+				process_keys(GLOBAL_POST, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostAbort") == 0) {
+				process_keys(POST_ABORT, keys, &post_continue_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostCancel") == 0) {
+				process_keys(POST_CANCEL, keys, &post_cancel_keys);
+				process_keys(POST_CANCEL, keys, &post_delete_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostContinue") == 0) {
+				process_keys(POST_CONTINUE, keys, &post_continue_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostEdit") == 0) {
+				process_keys(POST_EDIT, keys, &post_cancel_keys);
+				process_keys(POST_EDIT, keys, &post_edit_keys);
+				process_keys(POST_EDIT, keys, &post_edit_ext_keys);
+				process_keys(POST_EDIT, keys, &post_post_keys);
+				process_keys(POST_EDIT, keys, &post_send_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostIgnore") == 0) {
+				process_keys(POST_IGNORE_FUPTO, keys, &post_ignore_fupto_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostIspell") == 0) {
+#ifdef HAVE_ISPELL
+				process_keys(POST_ISPELL, keys, &post_post_keys);
+				process_keys(POST_ISPELL, keys, &post_send_keys);
+#endif /* HAVE_ISPELL */
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostMail") == 0) {
+				process_keys(POST_MAIL, keys, &post_mail_fup_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostPGP") == 0) {
+#ifdef HAVE_PGP_GPG
+				process_keys(POST_PGP, keys, &post_post_keys);
+				process_keys(POST_PGP, keys, &post_send_keys);
+#endif /* HAVE_PGP_GPG */
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostponeAll") == 0) {
+				process_keys(POSTPONE_ALL, keys, &post_postpone_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "Postponed") == 0) {
+				process_keys(GLOBAL_POSTPONED, keys, &group_keys);
+				process_keys(GLOBAL_POSTPONED, keys, &page_keys);
+				process_keys(GLOBAL_POSTPONED, keys, &select_keys);
+				process_keys(GLOBAL_POSTPONED, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostponeOverride") == 0) {
+				process_keys(POSTPONE_OVERRIDE, keys, &post_postpone_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostPost") == 0) {
+				process_keys(GLOBAL_POST, keys, &post_ignore_fupto_keys);
+				process_keys(GLOBAL_POST, keys, &post_mail_fup_keys);
+				process_keys(GLOBAL_POST, keys, &post_post_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostPostpone") == 0) {
+				process_keys(POST_POSTPONE, keys, &post_edit_keys);
+				process_keys(POST_POSTPONE, keys, &post_post_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostSend") == 0) {
+				process_keys(POST_SEND, keys, &post_send_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PostSupersede") == 0) {
+				process_keys(POST_SUPERSEDE, keys, &post_delete_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PProcNo") == 0) {
+				process_keys(POSTPROCESS_NO, keys, &feed_post_process_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PProcShar") == 0) {
+				process_keys(POSTPROCESS_SHAR, keys, &feed_post_process_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PProcYes") == 0) {
+				process_keys(POSTPROCESS_YES, keys, &feed_post_process_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "Print") == 0) {
+#ifndef DISABLE_PRINTING
+				process_keys(GLOBAL_PRINT, keys, &group_keys);
+				process_keys(GLOBAL_PRINT, keys, &page_keys);
+				process_keys(GLOBAL_PRINT, keys, &thread_keys);
+#endif /* !DISABLE_PRINTING */
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PromptNo") == 0) {
+				process_keys(PROMPT_NO, keys, &post_postpone_keys);
+				process_keys(PROMPT_NO, keys, &prompt_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "PromptYes") == 0) {
+				process_keys(PROMPT_YES, keys, &post_postpone_keys);
+				process_keys(PROMPT_YES, keys, &prompt_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'Q':
+			if (strcmp(keyname, "QuickFilterKill") == 0) {
+				process_keys(GLOBAL_QUICK_FILTER_KILL, keys, &group_keys);
+				process_keys(GLOBAL_QUICK_FILTER_KILL, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "QuickFilterSelect") == 0) {
+				process_keys(GLOBAL_QUICK_FILTER_SELECT, keys, &group_keys);
+				process_keys(GLOBAL_QUICK_FILTER_SELECT, keys, &page_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "Quit") == 0) {
+				process_keys(GLOBAL_QUIT, keys, &feed_post_process_keys);
+				process_keys(GLOBAL_QUIT, keys, &feed_supersede_article_keys);
+				process_keys(GLOBAL_QUIT, keys, &feed_type_keys);
+				process_keys(GLOBAL_QUIT, keys, &filter_keys);
+				process_keys(GLOBAL_QUIT, keys, &group_keys);
+				process_keys(GLOBAL_QUIT, keys, &info_keys);
+				process_keys(GLOBAL_QUIT, keys, &mark_read_keys);
+				process_keys(GLOBAL_QUIT, keys, &option_menu_keys);
+				process_keys(GLOBAL_QUIT, keys, &page_keys);
+#ifdef HAVE_PGP_GPG
+				process_keys(GLOBAL_QUIT, keys, &pgp_mail_keys);
+				process_keys(GLOBAL_QUIT, keys, &pgp_news_keys);
+#endif /* HAVE_PGP_GPG */
+				process_keys(GLOBAL_QUIT, keys, &post_cancel_keys);
+				process_keys(GLOBAL_QUIT, keys, &post_continue_keys);
+				process_keys(GLOBAL_QUIT, keys, &post_delete_keys);
+				process_keys(GLOBAL_QUIT, keys, &post_edit_keys);
+				process_keys(GLOBAL_QUIT, keys, &post_edit_ext_keys);
+				process_keys(GLOBAL_QUIT, keys, &post_ignore_fupto_keys);
+				process_keys(GLOBAL_QUIT, keys, &post_mail_fup_keys);
+				process_keys(GLOBAL_QUIT, keys, &post_post_keys);
+				process_keys(GLOBAL_QUIT, keys, &post_postpone_keys);
+				process_keys(GLOBAL_QUIT, keys, &post_send_keys);
+				process_keys(GLOBAL_QUIT, keys, &prompt_keys);
+				process_keys(GLOBAL_QUIT, keys, &save_append_overwrite_keys);
+				process_keys(GLOBAL_QUIT, keys, &select_keys);
+				process_keys(GLOBAL_QUIT, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "QuitTin") == 0) {
+				process_keys(GLOBAL_QUIT_TIN, keys, &group_keys);
+				process_keys(GLOBAL_QUIT_TIN, keys, &page_keys);
+				process_keys(GLOBAL_QUIT_TIN, keys, &select_keys);
+				process_keys(GLOBAL_QUIT_TIN, keys, &thread_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'R':
+			if (strcmp(keyname, "RedrawScr") == 0) {
+				process_keys(GLOBAL_REDRAW_SCREEN, keys, &group_keys);
+				process_keys(GLOBAL_REDRAW_SCREEN, keys, &option_menu_keys);
+				process_keys(GLOBAL_REDRAW_SCREEN, keys, &page_keys);
+				process_keys(GLOBAL_REDRAW_SCREEN, keys, &select_keys);
+				process_keys(GLOBAL_REDRAW_SCREEN, keys, &thread_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'S':
+			if (strcmp(keyname, "SaveAppendFile") == 0) {
+				process_keys(SAVE_APPEND_FILE, keys, &save_append_overwrite_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SaveOverwriteFile") == 0) {
+				process_keys(SAVE_OVERWRITE_FILE, keys, &save_append_overwrite_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ScrollDown") == 0) {
+				process_keys(GLOBAL_SCROLL_DOWN, keys, &group_keys);
+				process_keys(GLOBAL_SCROLL_DOWN, keys, &option_menu_keys);
+				process_keys(GLOBAL_SCROLL_DOWN, keys, &select_keys);
+				process_keys(GLOBAL_SCROLL_DOWN, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ScrollUp") == 0) {
+				process_keys(GLOBAL_SCROLL_UP, keys, &group_keys);
+				process_keys(GLOBAL_SCROLL_UP, keys, &option_menu_keys);
+				process_keys(GLOBAL_SCROLL_UP, keys, &select_keys);
+				process_keys(GLOBAL_SCROLL_UP, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SearchAuthB") == 0) {
+				process_keys(GLOBAL_SEARCH_AUTHOR_BACKWARD, keys, &group_keys);
+				process_keys(GLOBAL_SEARCH_AUTHOR_BACKWARD, keys, &page_keys);
+				process_keys(GLOBAL_SEARCH_AUTHOR_BACKWARD, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SearchAuthF") == 0) {
+				process_keys(GLOBAL_SEARCH_AUTHOR_FORWARD, keys, &group_keys);
+				process_keys(GLOBAL_SEARCH_AUTHOR_FORWARD, keys, &page_keys);
+				process_keys(GLOBAL_SEARCH_AUTHOR_FORWARD, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SearchBody") == 0) {
+				process_keys(GLOBAL_SEARCH_BODY, keys, &group_keys);
+				process_keys(GLOBAL_SEARCH_BODY, keys, &page_keys);
+				process_keys(GLOBAL_SEARCH_BODY, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SearchRepeat") == 0) {
+				process_keys(GLOBAL_SEARCH_REPEAT, keys, &group_keys);
+				process_keys(GLOBAL_SEARCH_REPEAT, keys, &info_keys);
+				process_keys(GLOBAL_SEARCH_REPEAT, keys, &option_menu_keys);
+				process_keys(GLOBAL_SEARCH_REPEAT, keys, &page_keys);
+				process_keys(GLOBAL_SEARCH_REPEAT, keys, &select_keys);
+				process_keys(GLOBAL_SEARCH_REPEAT, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SearchSubjB") == 0) {
+				process_keys(GLOBAL_SEARCH_SUBJECT_BACKWARD, keys, &group_keys);
+				process_keys(GLOBAL_SEARCH_SUBJECT_BACKWARD, keys, &info_keys);
+				process_keys(GLOBAL_SEARCH_SUBJECT_BACKWARD, keys, &option_menu_keys);
+				process_keys(GLOBAL_SEARCH_SUBJECT_BACKWARD, keys, &page_keys);
+				process_keys(GLOBAL_SEARCH_SUBJECT_BACKWARD, keys, &select_keys);
+				process_keys(GLOBAL_SEARCH_SUBJECT_BACKWARD, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SearchSubjF") == 0) {
+				process_keys(GLOBAL_SEARCH_SUBJECT_FORWARD, keys, &group_keys);
+				process_keys(GLOBAL_SEARCH_SUBJECT_FORWARD, keys, &info_keys);
+				process_keys(GLOBAL_SEARCH_SUBJECT_FORWARD, keys, &option_menu_keys);
+				process_keys(GLOBAL_SEARCH_SUBJECT_FORWARD, keys, &page_keys);
+				process_keys(GLOBAL_SEARCH_SUBJECT_FORWARD, keys, &select_keys);
+				process_keys(GLOBAL_SEARCH_SUBJECT_FORWARD, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectEnterNextUnreadGrp") == 0) {
+				process_keys(SELECT_ENTER_NEXT_UNREAD_GROUP, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectGoto") == 0) {
+				process_keys(SELECT_GOTO, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectMarkGrpUnread") == 0) {
+				process_keys(SELECT_MARK_GROUP_UNREAD, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectMoveGrp") == 0) {
+				process_keys(SELECT_MOVE_GROUP, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectNextUnreadGrp") == 0) {
+				process_keys(SELECT_NEXT_UNREAD_GROUP, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectQuitNoWrite") == 0) {
+				process_keys(SELECT_QUIT_NO_WRITE, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectReadGrp") == 0) {
+				process_keys(SELECT_ENTER_GROUP, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectResetNewsrc") == 0) {
+				process_keys(SELECT_RESET_NEWSRC, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectSortActive") == 0) {
+				process_keys(SELECT_SORT_ACTIVE, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectSubscribe") == 0) {
+				process_keys(SELECT_SUBSCRIBE, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectSubscribePat") == 0) {
+				process_keys(SELECT_SUBSCRIBE_PATTERN, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectSyncWithActive") == 0) {
+				process_keys(SELECT_SYNC_WITH_ACTIVE, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectToggleDescriptions") == 0) {
+				process_keys(SELECT_TOGGLE_DESCRIPTIONS, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectToggleReadDisplay") == 0) {
+				process_keys(SELECT_TOGGLE_READ_DISPLAY, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectUnsubscribe") == 0) {
+				process_keys(SELECT_UNSUBSCRIBE, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectUnsubscribePat") == 0) {
+				process_keys(SELECT_UNSUBSCRIBE_PATTERN, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SelectYankActive") == 0) {
+				process_keys(SELECT_YANK_ACTIVE, keys, &select_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "SetRange") == 0) {
+				process_keys(GLOBAL_SET_RANGE, keys, &group_keys);
+				process_keys(GLOBAL_SET_RANGE, keys, &select_keys);
+				process_keys(GLOBAL_SET_RANGE, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ShellEscape") == 0) {
+#ifndef NO_SHELL_ESCAPE
+				process_keys(GLOBAL_SHELL_ESCAPE, keys, &group_keys);
+				process_keys(GLOBAL_SHELL_ESCAPE, keys, &page_keys);
+				process_keys(GLOBAL_SHELL_ESCAPE, keys, &select_keys);
+				process_keys(GLOBAL_SHELL_ESCAPE, keys, &thread_keys);
+#endif /* !NO_SHELL_ESCAPE */
+
+				return TRUE;
+			}
+			break;
+
+		case 'T':
+			if (strcmp(keyname, "ThreadAutoSave") == 0) {
+				process_keys(THREAD_AUTOSAVE, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ThreadMail") == 0) {
+				process_keys(THREAD_MAIL, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ThreadMarkArtRead") == 0) {
+				process_keys(THREAD_MARK_ARTICLE_READ, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ThreadReadArt") == 0) {
+				process_keys(THREAD_READ_ARTICLE, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ThreadReadNextArtOrThread") == 0) {
+				process_keys(THREAD_READ_NEXT_ARTICLE_OR_THREAD, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ThreadReverseSel") == 0) {
+				process_keys(THREAD_REVERSE_SELECTIONS, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ThreadSave") == 0) {
+				process_keys(THREAD_SAVE, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ThreadSelArt") == 0) {
+				process_keys(THREAD_SELECT_ARTICLE, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ThreadTag") == 0) {
+				process_keys(THREAD_TAG, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ThreadToggleArtSel") == 0) {
+				process_keys(THREAD_TOGGLE_ARTICLE_SELECTION, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ThreadToggleSubjDisplay") == 0) {
+				process_keys(THREAD_TOGGLE_SUBJECT_DISPLAY, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ThreadUndoSel") == 0) {
+				process_keys(THREAD_UNDO_SELECTIONS, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ThreadUntag") == 0) {
+				process_keys(THREAD_UNTAG, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ToggleColor") == 0) {
+#ifdef HAVE_COLOR
+				process_keys(GLOBAL_TOGGLE_COLOR, keys, &group_keys);
+				process_keys(GLOBAL_TOGGLE_COLOR, keys, &page_keys);
+				process_keys(GLOBAL_TOGGLE_COLOR, keys, &select_keys);
+				process_keys(GLOBAL_TOGGLE_COLOR, keys, &thread_keys);
+#endif /* HAVE_COLOR */
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ToggleHelpDisplay") == 0) {
+				process_keys(GLOBAL_TOGGLE_HELP_DISPLAY, keys, &group_keys);
+				process_keys(GLOBAL_TOGGLE_HELP_DISPLAY, keys, &info_keys);
+				process_keys(GLOBAL_TOGGLE_HELP_DISPLAY, keys, &page_keys);
+				process_keys(GLOBAL_TOGGLE_HELP_DISPLAY, keys, &select_keys);
+				process_keys(GLOBAL_TOGGLE_HELP_DISPLAY, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ToggleInfoLastLine") == 0) {
+				process_keys(GLOBAL_TOGGLE_INFO_LAST_LINE, keys, &group_keys);
+				process_keys(GLOBAL_TOGGLE_INFO_LAST_LINE, keys, &page_keys);
+				process_keys(GLOBAL_TOGGLE_INFO_LAST_LINE, keys, &select_keys);
+				process_keys(GLOBAL_TOGGLE_INFO_LAST_LINE, keys, &thread_keys);
+
+				return TRUE;
+			}
+			if (strcmp(keyname, "ToggleInverseVideo") == 0) {
+				process_keys(GLOBAL_TOGGLE_INVERSE_VIDEO, keys, &group_keys);
+				process_keys(GLOBAL_TOGGLE_INVERSE_VIDEO, keys, &page_keys);
+				process_keys(GLOBAL_TOGGLE_INVERSE_VIDEO, keys, &select_keys);
+				process_keys(GLOBAL_TOGGLE_INVERSE_VIDEO, keys, &thread_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'U':
+			if (strcmp(keyname, "Up") == 0) {
+				process_keys(GLOBAL_LINE_UP, keys, &group_keys);
+				process_keys(GLOBAL_LINE_UP, keys, &info_keys);
+				process_keys(GLOBAL_LINE_UP, keys, &option_menu_keys);
+				process_keys(GLOBAL_LINE_UP, keys, &page_keys);
+				process_keys(GLOBAL_LINE_UP, keys, &select_keys);
+				process_keys(GLOBAL_LINE_UP, keys, &thread_keys);
+
+				return TRUE;
+			}
+			break;
+
+		case 'V':
+			if (strcmp(keyname, "Version") == 0) {
+				process_keys(GLOBAL_VERSION, keys, &group_keys);
+				process_keys(GLOBAL_VERSION, keys, &page_keys);
+				process_keys(GLOBAL_VERSION, keys, &select_keys);
+				process_keys(GLOBAL_VERSION, keys, &thread_keys);
+
+				return TRUE;
+			}
+			break;
+
+		default:
+			break;
+	}
+
+	return FALSE;
+}
+
+
+/*
+ * upgrades the keymap file to the current version
+ */
+static void
+upgrade_keymap_file(
+	char *old)
+{
+	FILE *oldfp, *newfp;
+	char *line, *backup;
+	const char *keyname, *keydef;
+	char new[NAME_LEN + 1], buf[LEN];
+	char *bugreport[3] = { NULL, NULL, NULL };
+	char *catchup[4] = { NULL, NULL, NULL, NULL };
+	char *catchup_next_unread[4] = { NULL, NULL, NULL, NULL };
+	char *config_select[2] = { NULL, NULL };
+	char *edit_filter[2] = { NULL, NULL };
+	char *down[2] = { NULL, NULL };
+	char *groupreadbasenote[2] = { NULL, NULL };
+	char *mark_article_unread[3] = { NULL, NULL, NULL };
+	char *mark_thread_unread[3] = { NULL, NULL, NULL };
+	char *menu_filter_kill[3] = { NULL, NULL, NULL };
+	char *menu_filter_select[3] = { NULL, NULL, NULL };
+	char *pagedown[2] = { NULL, NULL };
+	char *pagenextthd[2] = { NULL, NULL };
+	char *pageup[3] = { NULL, NULL, NULL };
+	char *postponed[2] = { NULL, NULL };
+	char *postpost[3] = { NULL, NULL, NULL };
+	char *postsend[2] = { NULL, NULL };
+	char *quick_filter_kill[2] = { NULL, NULL };
+	char *quick_filter_select[2] = { NULL, NULL };
+	char *selectentergroup[2] = { NULL, NULL };
+	char *selectmarkgrpunread[2] = { NULL, NULL };
+	char *selectreadgrp[2] = { NULL, NULL };
+	char *threadreadart[2] = { NULL, NULL };
+	char *up[2] = { NULL, NULL };
+
+	if ((oldfp = fopen(old, "r")) == NULL)
+		return;
+
+	snprintf(new, sizeof(new), "%s.%d", old, (int) process_id);
+	if ((newfp = fopen(new, "w")) == NULL) {
+		fclose(oldfp);
+		return;
+	}
+	fprintf(newfp, "# Keymap file V%s for the TIN newsreader\n", KEYMAP_VERSION);
+
+	forever {
+		line = fgets(buf, sizeof(buf), oldfp);
+
+		if (line == NULL || line[0] == '\n') {
+			/*
+			 * we are at the end of a block or file
+			 * write out the merged lines (if available)
+			 */
+			if (config_select[0] || config_select[1]) {
+				fprintf(newfp, "ConfigSelect\t\t");
+				if (config_select[0])
+					fprintf(newfp, "\t%s", config_select[0]);
+				if (config_select[1])
+					fprintf(newfp, "\t%s", config_select[1]);
+				fprintf(newfp, "\n");
+				FreeAndNull(config_select[0]);
+				FreeAndNull(config_select[1]);
+			}
+			if (down[0] || down[1]) {
+				fprintf(newfp, "Down\t\t\t");
+				if (down[0])
+					fprintf(newfp, "\t%s", down[0]);
+				if (down[1])
+					fprintf(newfp, "\t%s", down[1]);
+				fprintf(newfp, "\n");
+				FreeAndNull(down[0]);
+				FreeAndNull(down[1]);
+			}
+			if (groupreadbasenote[0] || groupreadbasenote[1]) {
+				fprintf(newfp, "GroupReadBasenote\t");
+				if (groupreadbasenote[0])
+					fprintf(newfp, "\t%s", groupreadbasenote[0]);
+				if (groupreadbasenote[1])
+					fprintf(newfp, "\t%s", groupreadbasenote[1]);
+				fprintf(newfp, "\n");
+				FreeAndNull(groupreadbasenote[0]);
+				FreeAndNull(groupreadbasenote[1]);
+			}
+			if (pagedown[0] || pagedown[1]) {
+				fprintf(newfp, "PageDown\t\t");
+				if (pagedown[0])
+					fprintf(newfp, "\t%s", pagedown[0]);
+				if (pagedown[1])
+					fprintf(newfp, "\t%s", pagedown[1]);
+				fprintf(newfp, "\n");
+				FreeAndNull(pagedown[0]);
+				FreeAndNull(pagedown[1]);
+			}
+			if (pagenextthd[0] || pagenextthd[1]) {
+				fprintf(newfp, "PageNextThd\t\t");
+				if (pagenextthd[0])
+					fprintf(newfp, "\t%s", pagenextthd[0]);
+				if (pagenextthd[1])
+					fprintf(newfp, "\t%s", pagenextthd[1]);
+				fprintf(newfp, "\n");
+				FreeAndNull(pagenextthd[0]);
+				FreeAndNull(pagenextthd[1]);
+			}
+			if (pageup[0] || pageup[1] || pageup[2]) {
+				fprintf(newfp, "PageUp\t\t\t");
+				if (pageup[0])
+					fprintf(newfp, "\t%s", pageup[0]);
+				if (pageup[1])
+					fprintf(newfp, "\t%s", pageup[1]);
+				if (pageup[2])
+					fprintf(newfp, "\t%s", pageup[2]);
+				fprintf(newfp, "\n");
+				FreeAndNull(pageup[0]);
+				FreeAndNull(pageup[1]);
+				FreeAndNull(pageup[2]);
+			}
+			if (postponed[0] || postponed[1]) {
+				fprintf(newfp, "Postponed\t\t");
+				if (postponed[0])
+					fprintf(newfp, "\t%s", postponed[0]);
+				if (postponed[1])
+					fprintf(newfp, "\t%s", postponed[1]);
+				fprintf(newfp, "\n");
+				FreeAndNull(postponed[0]);
+				FreeAndNull(postponed[1]);
+			}
+			if (postpost[0] || postpost[1] || postpost[2]) {
+				fprintf(newfp, "PostPost\t\t");
+				if (postpost[0])
+					fprintf(newfp, "\t%s", postpost[0]);
+				if (postpost[1])
+					fprintf(newfp, "\t%s", postpost[1]);
+				if (postpost[2])
+					fprintf(newfp, "\t%s", postpost[2]);
+				fprintf(newfp, "\n");
+				FreeAndNull(postpost[0]);
+				FreeAndNull(postpost[1]);
+				FreeAndNull(postpost[2]);
+			}
+			if (postsend[0] || postsend[1]) {
+				fprintf(newfp, "PostSend\t\t");
+				if (postsend[0])
+					fprintf(newfp, "\t%s", postsend[0]);
+				if (postsend[1])
+					fprintf(newfp, "\t%s", postsend[1]);
+				fprintf(newfp, "\n");
+				FreeAndNull(postsend[0]);
+				FreeAndNull(postsend[1]);
+			}
+			if (selectentergroup[0] || selectentergroup[1]) {
+				fprintf(newfp, "SelectEnterNextUnreadGrp");
+				if (selectentergroup[0])
+					fprintf(newfp, "\t%s", selectentergroup[0]);
+				if (selectentergroup[1])
+					fprintf(newfp, "\t%s", selectentergroup[1]);
+				fprintf(newfp, "\n");
+				FreeAndNull(selectentergroup[0]);
+				FreeAndNull(selectentergroup[1]);
+			}
+			if (selectmarkgrpunread[0] || selectmarkgrpunread[1]) {
+				fprintf(newfp, "SelectMarkGrpUnread\t");
+				if (selectmarkgrpunread[0])
+					fprintf(newfp, "\t%s", selectmarkgrpunread[0]);
+				if (selectmarkgrpunread[1])
+					fprintf(newfp, "\t%s", selectmarkgrpunread[1]);
+				fprintf(newfp, "\n");
+				FreeAndNull(selectmarkgrpunread[0]);
+				FreeAndNull(selectmarkgrpunread[1]);
+			}
+			if (selectreadgrp[0] || selectreadgrp[1]) {
+				fprintf(newfp, "SelectReadGrp\t\t");
+				if (selectreadgrp[0])
+					fprintf(newfp, "\t%s", selectreadgrp[0]);
+				if (selectreadgrp[1])
+					fprintf(newfp, "\t%s", selectreadgrp[1]);
+				fprintf(newfp, "\n");
+				FreeAndNull(selectreadgrp[0]);
+				FreeAndNull(selectreadgrp[1]);
+			}
+			if (threadreadart[0] || threadreadart[1]) {
+				fprintf(newfp, "ThreadReadArt\t\t");
+				if (threadreadart[0])
+					fprintf(newfp, "\t%s", threadreadart[0]);
+				if (threadreadart[1])
+					fprintf(newfp, "\t%s", threadreadart[1]);
+				fprintf(newfp, "\n");
+				FreeAndNull(threadreadart[0]);
+				FreeAndNull(threadreadart[1]);
+			}
+			if (up[0] || up[1]) {
+				fprintf(newfp, "Up\t\t\t");
+				if (up[0])
+					fprintf(newfp, "\t%s", up[0]);
+				if (up[1])
+					fprintf(newfp, "\t%s", up[1]);
+				fprintf(newfp, "\n");
+				FreeAndNull(up[0]);
+				FreeAndNull(up[1]);
+			}
+			if (line == NULL)
+				break;	/* jump out of the while loop */
+			else {
+				fprintf(newfp, "\n");
+				continue;
+			}
+		}
+
+		if (line[0] == '#') {
+			if (strncmp(line, "# Keymap file V", strlen("# Keymap file V")) != 0)
+				fprintf(newfp, "%s", line);
+			continue;
+		}
+
+		backup = my_strdup(line);
+
+		if ((keyname = strsep(&line, KEYSEPS)) == NULL) {
+			free(backup);
+			continue;
+		}
+		if ((keydef = str_trim(line)) == NULL)
+			keydef = "";
+
+		switch (keyname[0]) {
+			case 'C':
+				if (strcmp(keyname, "ConfigFirstPage2") == 0)
+					fprintf(newfp, "ConfigFirstPage\t\t\t%s\n", keydef);
+				else if (strcmp(keyname, "ConfigLastPage2") == 0)
+					fprintf(newfp, "ConfigLastPage\t\t\t%s\n", keydef);
+				else if (strcmp(keyname, "ConfigSelect") == 0)
+					config_select[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "ConfigSelect2") == 0)
+					config_select[1] = my_strdup(keydef);
+				else
+					fprintf(newfp, "%s", backup);
+				break;
+
+			case 'D':
+				if (strcmp(keyname, "Down") == 0)
+					down[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "Down2") == 0)
+					down[1] = my_strdup(keydef);
+				else
+					fprintf(newfp, "%s", backup);
+				break;
+
+			case 'G':
+				if (strcmp(keyname, "GroupAutoSel") == 0)
+					menu_filter_select[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "GroupQuickAutoSel") == 0)
+					quick_filter_select[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "GroupQuickKill") == 0)
+					quick_filter_kill[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "GroupKill") == 0)
+					menu_filter_kill[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "GroupReadBasenote") == 0)
+					groupreadbasenote[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "GroupReadBasenote2") == 0)
+					groupreadbasenote[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "GroupEditFilter") == 0)
+					edit_filter[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "GroupBugReport") == 0)
+					bugreport[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "GroupMarkArtUnread") == 0)
+					mark_article_unread[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "GroupMarkThdUnread") == 0)
+					mark_thread_unread[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "GroupCatchup") == 0)
+					catchup[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "GroupCatchupNextUnread") == 0)
+					catchup_next_unread[0] = my_strdup(keydef);
+				else
+					fprintf(newfp, "%s", backup);
+				break;
+
+			case 'H':
+				if (strcmp(keyname, "HelpFirstPage2") == 0)
+					fprintf(newfp, "HelpFirstPage\t\t\t%s\n", keydef);
+				else if (strcmp(keyname, "HelpLastPage2") == 0)
+					fprintf(newfp, "HelpLastPage\t\t\t%s\n", keydef);
+				else
+					fprintf(newfp, "%s", backup);
+				break;
+
+			case 'N':
+				/* Nrc* got removed */
+				if (strcmp(keyname, "NrctblCreate") == 0)
+					;
+				else if (strcmp(keyname, "NrctblDefault") == 0)
+					;
+				else if (strcmp(keyname, "NrctblAlternative") == 0)
+					;
+				else if (strcmp(keyname, "NrctblQuit") == 0)
+					;
+				else
+					fprintf(newfp, "%s", backup);
+				break;
+
+			case 'P':
+				if (strcmp(keyname, "PageAutoSel") == 0)
+					menu_filter_select[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageQuickAutoSel") == 0)
+					quick_filter_select[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageQuickKill") == 0)
+					quick_filter_kill[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageAutoKill") == 0)
+					menu_filter_kill[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageDown") == 0)
+					pagedown[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageDown2") == 0)
+					pagedown[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageEditFilter") == 0)
+					edit_filter[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageNextThd") == 0)
+					pagenextthd[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageNextThd2") == 0)
+					pagenextthd[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageUp") == 0)
+					pageup[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageUp2") == 0)
+					pageup[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageUp3") == 0)
+					pageup[2] = my_strdup(keydef);
+				else if (strcmp(keyname, "Postponed") == 0)
+					postponed[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "Postponed2") == 0)
+					postponed[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PostPost") == 0)
+					postpost[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "PostPost2") == 0)
+					postpost[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PostPost3") == 0)
+					postpost[2] = my_strdup(keydef);
+				else if (strcmp(keyname, "PostSend") == 0)
+					postsend[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "PostSend2") == 0)
+					postsend[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageMarkArtUnread") == 0)
+					mark_article_unread[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageMarkThdUnread") == 0)
+					mark_thread_unread[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageCatchup") == 0)
+					catchup[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PageCatchupNextUnread") == 0)
+					catchup_next_unread[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "PromptNo") == 0 || strcmp(keyname, "PromptYes") == 0) {
+					if (strlen(keydef) == 1 && islower(keydef[0]))
+						fprintf(newfp, "%s\t\t\t%c\t%c\n", keyname, keydef[0], toupper(keydef[0]));
+					else
+						fprintf(newfp, "%s", backup);
+				} else
+					fprintf(newfp, "%s", backup);
+				break;
+
+			case 'S':
+				if (strcmp(keyname, "SelectEditFilter") == 0)
+					;
+				else if (strcmp(keyname, "SelectEnterNextUnreadGrp") == 0)
+					selectentergroup[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "SelectEnterNextUnreadGrp2") == 0)
+					selectentergroup[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "SelectMarkGrpUnread") == 0)
+					selectmarkgrpunread[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "SelectMarkGrpUnread2") == 0)
+					selectmarkgrpunread[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "SelectReadGrp") == 0)
+					selectreadgrp[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "SelectReadGrp2") == 0)
+					selectreadgrp[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "SelectBugReport") == 0)
+					bugreport[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "SelectCatchup") == 0)
+					catchup[2] = my_strdup(keydef);
+				else if (strcmp(keyname, "SelectCatchupNextUnread") == 0)
+					catchup_next_unread[2] = my_strdup(keydef);
+				else
+					fprintf(newfp, "%s", backup);
+				break;
+
+			case 'T':
+				if (strcmp(keyname, "ThreadEditFilter") == 0)
+					;
+				else if (strcmp(keyname, "ThreadAutoSel") == 0)
+					menu_filter_select[2] = my_strdup(keydef);
+				else if (strcmp(keyname, "ThreadKill") == 0)
+					menu_filter_kill[2] = my_strdup(keydef);
+				else if (strcmp(keyname, "ThreadReadArt") == 0)
+					threadreadart[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "ThreadReadArt2") == 0)
+					threadreadart[1] = my_strdup(keydef);
+				else if (strcmp(keyname, "ThreadBugReport") == 0)
+					bugreport[2] = my_strdup(keydef);
+				else if (strcmp(keyname, "ThreadMarkArtUnread") == 0)
+					mark_article_unread[2] = my_strdup(keydef);
+				else if (strcmp(keyname, "ThreadMarkThdUnread") == 0)
+					mark_thread_unread[2] = my_strdup(keydef);
+				else if (strcmp(keyname, "ThreadCatchup") == 0)
+					catchup[3] = my_strdup(keydef);
+				else if (strcmp(keyname, "ThreadCatchupNextUnread") == 0)
+					catchup_next_unread[3] = my_strdup(keydef);
+				else
+					fprintf(newfp, "%s", backup);
+				break;
+
+			case 'U':
+				if (strcmp(keyname, "Up") == 0)
+					up[0] = my_strdup(keydef);
+				else if (strcmp(keyname, "Up2") == 0)
+					up[1] = my_strdup(keydef);
+				else
+					fprintf(newfp, "%s", backup);
+				break;
+
+			default:
+				fprintf(newfp, "%s", backup);
+		}
+		free(backup);
+	}
+	fprintf(newfp, "\n#####\n");
+	/* joined/renamed keys from different sections */
+	if (bugreport[0] || bugreport[1] || bugreport[2]) {
+		fprintf(newfp, "BugReport\t");
+		if (bugreport[0] && bugreport[1] && !strcmp(bugreport[0], bugreport[1]))
+			FreeAndNull(bugreport[1]);
+		if (bugreport[0] && bugreport[2] && !strcmp(bugreport[0], bugreport[2]))
+			FreeAndNull(bugreport[2]);
+		if (bugreport[1] && bugreport[2] && !strcmp(bugreport[1], bugreport[2]))
+			FreeAndNull(bugreport[2]);
+		if (bugreport[0])
+			fprintf(newfp, "\t%s", bugreport[0]);
+		if (bugreport[1])
+			fprintf(newfp, "\t%s", bugreport[1]);
+		if (bugreport[2])
+			fprintf(newfp, "\t%s", bugreport[2]);
+		fprintf(newfp, "\n");
+		FreeAndNull(bugreport[0]);
+		FreeAndNull(bugreport[1]);
+		FreeAndNull(bugreport[2]);
+	}
+	if (catchup[0] || catchup[1] || catchup[2] || catchup[3]) {
+		fprintf(newfp, "Catchup\t");
+		if (catchup[0] && catchup[1] && !strcmp(catchup[0], catchup[1]))
+			FreeAndNull(catchup[1]);
+		if (catchup[0] && catchup[2] && !strcmp(catchup[0], catchup[2]))
+			FreeAndNull(catchup[2]);
+		if (catchup[0] && catchup[3] && !strcmp(catchup[0], catchup[3]))
+			FreeAndNull(catchup[3]);
+		if (catchup[1] && catchup[2] && !strcmp(catchup[1], catchup[2]))
+			FreeAndNull(catchup[2]);
+		if (catchup[1] && catchup[3] && !strcmp(catchup[1], catchup[3]))
+			FreeAndNull(catchup[3]);
+		if (catchup[2] && catchup[3] && !strcmp(catchup[2], catchup[3]))
+			FreeAndNull(catchup[3]);
+		if (catchup[0])
+			fprintf(newfp, "\t%s", catchup[0]);
+		if (catchup[1])
+			fprintf(newfp, "\t%s", catchup[1]);
+		if (catchup[2])
+			fprintf(newfp, "\t%s", catchup[2]);
+		if (catchup[3])
+			fprintf(newfp, "\t%s", catchup[3]);
+		fprintf(newfp, "\n");
+		FreeAndNull(catchup[0]);
+		FreeAndNull(catchup[1]);
+		FreeAndNull(catchup[2]);
+		FreeAndNull(catchup[3]);
+	}
+	if (catchup_next_unread[0] || catchup_next_unread[1] || catchup_next_unread[2] || catchup_next_unread[3]) {
+		fprintf(newfp, "CatchupNextUnread\t");
+		if (catchup_next_unread[0] && catchup_next_unread[1] && !strcmp(catchup_next_unread[0], catchup_next_unread[1]))
+			FreeAndNull(catchup_next_unread[1]);
+		if (catchup_next_unread[0] && catchup_next_unread[2] && !strcmp(catchup_next_unread[0], catchup_next_unread[2]))
+			FreeAndNull(catchup_next_unread[2]);
+		if (catchup_next_unread[0] && catchup_next_unread[3] && !strcmp(catchup_next_unread[0], catchup_next_unread[3]))
+			FreeAndNull(catchup_next_unread[3]);
+		if (catchup_next_unread[1] && catchup_next_unread[2] && !strcmp(catchup_next_unread[1], catchup_next_unread[2]))
+			FreeAndNull(catchup_next_unread[2]);
+		if (catchup_next_unread[1] && catchup_next_unread[3] && !strcmp(catchup_next_unread[1], catchup_next_unread[3]))
+			FreeAndNull(catchup_next_unread[3]);
+		if (catchup_next_unread[2] && catchup_next_unread[3] && !strcmp(catchup_next_unread[2], catchup_next_unread[3]))
+			FreeAndNull(catchup_next_unread[3]);
+		if (catchup_next_unread[0])
+			fprintf(newfp, "\t%s", catchup_next_unread[0]);
+		if (catchup_next_unread[1])
+			fprintf(newfp, "\t%s", catchup_next_unread[1]);
+		if (catchup_next_unread[2])
+			fprintf(newfp, "\t%s", catchup_next_unread[2]);
+		if (catchup_next_unread[3])
+			fprintf(newfp, "\t%s", catchup_next_unread[3]);
+		fprintf(newfp, "\n");
+		FreeAndNull(catchup_next_unread[0]);
+		FreeAndNull(catchup_next_unread[1]);
+		FreeAndNull(catchup_next_unread[2]);
+		FreeAndNull(catchup_next_unread[3]);
+	}
+	if (edit_filter[0] || edit_filter[1]) {
+		fprintf(newfp, "EditFilter\t");
+		if (edit_filter[0])
+			fprintf(newfp, "\t%s", edit_filter[0]);
+		if (edit_filter[1] && edit_filter[0] && strcmp(edit_filter[0], edit_filter[1]))
+			fprintf(newfp, "\t%s", edit_filter[1]);
+		fprintf(newfp, "\n");
+		FreeAndNull(edit_filter[0]);
+		FreeAndNull(edit_filter[1]);
+	}
+	if (mark_article_unread[0] || mark_article_unread[1] || mark_article_unread[2]) {
+		fprintf(newfp, "MarkArticleUnread\t");
+		if (mark_article_unread[0] && mark_article_unread[1] && !strcmp(mark_article_unread[0], mark_article_unread[1]))
+			FreeAndNull(mark_article_unread[1]);
+		if (mark_article_unread[0] && mark_article_unread[2] && !strcmp(mark_article_unread[0], mark_article_unread[2]))
+			FreeAndNull(mark_article_unread[2]);
+		if (mark_article_unread[1] && mark_article_unread[2] && !strcmp(mark_article_unread[1], mark_article_unread[2]))
+			FreeAndNull(mark_article_unread[2]);
+		if (mark_article_unread[0])
+			fprintf(newfp, "\t%s", mark_article_unread[0]);
+		if (mark_article_unread[1])
+			fprintf(newfp, "\t%s", mark_article_unread[1]);
+		if (mark_article_unread[2])
+			fprintf(newfp, "\t%s", mark_article_unread[2]);
+		fprintf(newfp, "\n");
+		FreeAndNull(mark_article_unread[0]);
+		FreeAndNull(mark_article_unread[1]);
+		FreeAndNull(mark_article_unread[2]);
+	}
+	if (mark_thread_unread[0] || mark_thread_unread[1] || mark_thread_unread[2]) {
+		fprintf(newfp, "MarkThreadUnread\t");
+		if (mark_thread_unread[0] && mark_thread_unread[1] && !strcmp(mark_thread_unread[0], mark_thread_unread[1]))
+			FreeAndNull(mark_thread_unread[1]);
+		if (mark_thread_unread[0] && mark_thread_unread[2] && !strcmp(mark_thread_unread[0], mark_thread_unread[2]))
+			FreeAndNull(mark_thread_unread[2]);
+		if (mark_thread_unread[1] && mark_thread_unread[2] && !strcmp(mark_thread_unread[1], mark_thread_unread[2]))
+			FreeAndNull(mark_thread_unread[2]);
+		if (mark_thread_unread[0])
+			fprintf(newfp, "\t%s", mark_thread_unread[0]);
+		if (mark_thread_unread[1])
+			fprintf(newfp, "\t%s", mark_thread_unread[1]);
+		if (mark_thread_unread[2])
+			fprintf(newfp, "\t%s", mark_thread_unread[2]);
+		fprintf(newfp, "\n");
+		FreeAndNull(mark_thread_unread[0]);
+		FreeAndNull(mark_thread_unread[1]);
+		FreeAndNull(mark_thread_unread[2]);
+	}
+	if (menu_filter_kill[0] || menu_filter_kill[1] || menu_filter_kill[2]) {
+		fprintf(newfp, "MenuFilterKill\t");
+		if (menu_filter_kill[0] && menu_filter_kill[1] && !strcmp(menu_filter_kill[0], menu_filter_kill[1]))
+			FreeAndNull(menu_filter_kill[1]);
+		if (menu_filter_kill[0] && menu_filter_kill[2] && !strcmp(menu_filter_kill[0], menu_filter_kill[2]))
+			FreeAndNull(menu_filter_kill[2]);
+		if (menu_filter_kill[1] && menu_filter_kill[2] && !strcmp(menu_filter_kill[1], menu_filter_kill[2]))
+			FreeAndNull(menu_filter_kill[2]);
+		if (menu_filter_kill[0])
+			fprintf(newfp, "\t%s", menu_filter_kill[0]);
+		if (menu_filter_kill[1])
+			fprintf(newfp, "\t%s", menu_filter_kill[1]);
+		if (menu_filter_kill[2])
+			fprintf(newfp, "\t%s", menu_filter_kill[2]);
+		fprintf(newfp, "\n");
+		FreeAndNull(menu_filter_kill[0]);
+		FreeAndNull(menu_filter_kill[1]);
+		FreeAndNull(menu_filter_kill[2]);
+	}
+	if (menu_filter_select[0] || menu_filter_select[1] || menu_filter_select[2]) {
+		fprintf(newfp, "MenuFilterSelect\t");
+		if (menu_filter_select[0] && menu_filter_select[1] && !strcmp(menu_filter_select[0], menu_filter_select[1]))
+			FreeAndNull(menu_filter_select[1]);
+		if (menu_filter_select[0] && menu_filter_select[2] && !strcmp(menu_filter_select[0], menu_filter_select[2]))
+			FreeAndNull(menu_filter_select[2]);
+		if (menu_filter_select[1] && menu_filter_select[2] && !strcmp(menu_filter_select[1], menu_filter_select[2]))
+			FreeAndNull(menu_filter_select[2]);
+		if (menu_filter_select[0])
+			fprintf(newfp, "\t%s", menu_filter_select[0]);
+		if (menu_filter_select[1])
+			fprintf(newfp, "\t%s", menu_filter_select[1]);
+		if (menu_filter_select[2])
+			fprintf(newfp, "\t%s", menu_filter_select[2]);
+		fprintf(newfp, "\n");
+		FreeAndNull(menu_filter_select[0]);
+		FreeAndNull(menu_filter_select[1]);
+		FreeAndNull(menu_filter_select[2]);
+	}
+	if (quick_filter_kill[0] || quick_filter_kill[1]) {
+		fprintf(newfp, "QuickFilterKill\t");
+		if (quick_filter_kill[0])
+			fprintf(newfp, "\t%s", quick_filter_kill[0]);
+		if (quick_filter_kill[1] && quick_filter_kill[0] && strcmp(quick_filter_kill[0], quick_filter_kill[1]))
+			fprintf(newfp, "\t%s", quick_filter_kill[1]);
+		fprintf(newfp, "\n");
+		FreeAndNull(quick_filter_kill[0]);
+		FreeAndNull(quick_filter_kill[1]);
+	}
+	if (quick_filter_select[0] || quick_filter_select[1]) {
+		fprintf(newfp, "QuickFilterSelect\t");
+		if (quick_filter_select[0])
+			fprintf(newfp, "\t%s", quick_filter_select[0]);
+		if (quick_filter_select[1] && quick_filter_select[0] && strcmp(quick_filter_select[0], quick_filter_select[1]))
+			fprintf(newfp, "\t%s", quick_filter_select[1]);
+		fprintf(newfp, "\n");
+		FreeAndNull(quick_filter_select[0]);
+		FreeAndNull(quick_filter_select[1]);
+	}
+
+	fclose(oldfp);
+	fclose(newfp);
+	rename(new, old);
+	wait_message(0, _(txt_keymap_upgraded), KEYMAP_VERSION);
+	prompt_continue();
+
+	return;
+}
+
+
+/*
+ * add the default key bindings for still free keys
+ */
+void
+setup_default_keys(
+	void)
+{
+	/* select level */
+	add_global_keys(&select_keys);
+	add_default_key(&select_keys, " ", GLOBAL_PAGE_DOWN);
+	add_default_key(&select_keys, "\n\r", SELECT_ENTER_GROUP);
+	add_default_key(&select_keys, "", SELECT_RESET_NEWSRC);
+	add_default_key(&select_keys, "c", CATCHUP);
+	add_default_key(&select_keys, "d", SELECT_TOGGLE_DESCRIPTIONS);
+	add_default_key(&select_keys, "g", SELECT_GOTO);
+	add_default_key(&select_keys, "m", SELECT_MOVE_GROUP);
+	add_default_key(&select_keys, "n\t", SELECT_ENTER_NEXT_UNREAD_GROUP);
+	add_default_key(&select_keys, "r", SELECT_TOGGLE_READ_DISPLAY);
+	add_default_key(&select_keys, "s", SELECT_SUBSCRIBE);
+	add_default_key(&select_keys, "u", SELECT_UNSUBSCRIBE);
+	add_default_key(&select_keys, "y", SELECT_YANK_ACTIVE);
+	add_default_key(&select_keys, "z", SELECT_MARK_GROUP_UNREAD);
+	add_default_key(&select_keys, "C", CATCHUP_NEXT_UNREAD);
+	add_default_key(&select_keys, "E", GLOBAL_EDIT_FILTER);
+	add_default_key(&select_keys, "N", SELECT_NEXT_UNREAD_GROUP);
+	add_default_key(&select_keys, "S", SELECT_SUBSCRIBE_PATTERN);
+	add_default_key(&select_keys, "U", SELECT_UNSUBSCRIBE_PATTERN);
+	add_default_key(&select_keys, "X", SELECT_QUIT_NO_WRITE);
+	add_default_key(&select_keys, "Y", SELECT_SYNC_WITH_ACTIVE);
+	add_default_key(&select_keys, "Z", SELECT_MARK_GROUP_UNREAD);
+	add_default_key(&select_keys, ".", SELECT_SORT_ACTIVE);
+	add_default_key(&select_keys, ">", GLOBAL_SCROLL_DOWN);
+	add_default_key(&select_keys, "<", GLOBAL_SCROLL_UP);
+
+	/* group level */
+	add_global_keys(&group_keys);
+	add_default_key(&group_keys, " ", GLOBAL_PAGE_DOWN);
+	add_default_key(&group_keys, "", GLOBAL_MENU_FILTER_SELECT);
+	add_default_key(&group_keys, "\n\r", GROUP_READ_BASENOTE);
+	add_default_key(&group_keys, "", GLOBAL_MENU_FILTER_KILL);
+	add_default_key(&group_keys, "a", GLOBAL_SEARCH_AUTHOR_FORWARD);
+	add_default_key(&group_keys, "c", CATCHUP);
+	add_default_key(&group_keys, "d", GROUP_TOGGLE_SUBJECT_DISPLAY);
+	add_default_key(&group_keys, "g", GROUP_GOTO);
+	add_default_key(&group_keys, "l", GROUP_LIST_THREAD);
+	add_default_key(&group_keys, "m", GROUP_MAIL);
+	add_default_key(&group_keys, "n", GROUP_NEXT_GROUP);
+#ifndef DISABLE_PRINTING
+	add_default_key(&group_keys, "o", GLOBAL_PRINT);
+#endif /* !DISABLE_PRINTING */
+	add_default_key(&group_keys, "p", GROUP_PREVIOUS_GROUP);
+	add_default_key(&group_keys, "r", GROUP_TOGGLE_READ_UNREAD);
+	add_default_key(&group_keys, "s", GROUP_SAVE);
+	add_default_key(&group_keys, "t", GROUP_TAG);
+	add_default_key(&group_keys, "u", GROUP_TOGGLE_THREADING);
+	add_default_key(&group_keys, "x", GROUP_REPOST);
+	add_default_key(&group_keys, "z", MARK_ARTICLE_UNREAD);
+	add_default_key(&group_keys, "A", GLOBAL_SEARCH_AUTHOR_BACKWARD);
+	add_default_key(&group_keys, "B", GLOBAL_SEARCH_BODY);
+	add_default_key(&group_keys, "C", CATCHUP_NEXT_UNREAD);
+	add_default_key(&group_keys, "E", GLOBAL_EDIT_FILTER);
+	add_default_key(&group_keys, "G", GROUP_TOGGLE_GET_ARTICLES_LIMIT);
+	add_default_key(&group_keys, "K", GROUP_MARK_THREAD_READ);
+	add_default_key(&group_keys, "L", GLOBAL_LOOKUP_MESSAGEID);
+	add_default_key(&group_keys, "N", GROUP_NEXT_UNREAD_ARTICLE);
+	add_default_key(&group_keys, "P", GROUP_PREVIOUS_UNREAD_ARTICLE);
+	add_default_key(&group_keys, "S", GROUP_AUTOSAVE);
+	add_default_key(&group_keys, "T", GROUP_TAG_PARTS);
+	add_default_key(&group_keys, "U", GROUP_UNTAG);
+	add_default_key(&group_keys, "X", GROUP_MARK_UNSELECTED_ARTICLES_READ);
+	add_default_key(&group_keys, "Z", MARK_THREAD_UNREAD);
+	add_default_key(&group_keys, "\t", GROUP_NEXT_UNREAD_ARTICLE_OR_GROUP);
+	add_default_key(&group_keys, "-", GLOBAL_LAST_VIEWED);
+	add_default_key(&group_keys, "|", GLOBAL_PIPE);
+	add_default_key(&group_keys, "[", GLOBAL_QUICK_FILTER_SELECT);
+	add_default_key(&group_keys, "]", GLOBAL_QUICK_FILTER_KILL);
+	add_default_key(&group_keys, "*", GROUP_SELECT_THREAD);
+	add_default_key(&group_keys, ".", GROUP_TOGGLE_SELECT_THREAD);
+	add_default_key(&group_keys, "@", GROUP_REVERSE_SELECTIONS);
+	add_default_key(&group_keys, "~", GROUP_UNDO_SELECTIONS);
+	add_default_key(&group_keys, "=", GROUP_SELECT_PATTERN);
+	add_default_key(&group_keys, ";", GROUP_SELECT_THREAD_IF_UNREAD_SELECTED);
+	add_default_key(&group_keys, "+", GROUP_DO_AUTOSELECT);
+	add_default_key(&group_keys, ">", GLOBAL_SCROLL_DOWN);
+	add_default_key(&group_keys, "<", GLOBAL_SCROLL_UP);
+
+	/* thread keys */
+	add_global_keys(&thread_keys);
+	add_default_key(&thread_keys, " ", GLOBAL_PAGE_DOWN);
+	add_default_key(&thread_keys, "", GLOBAL_MENU_FILTER_SELECT);
+	add_default_key(&thread_keys, "", GLOBAL_MENU_FILTER_KILL);
+	add_default_key(&thread_keys, "\n\r", THREAD_READ_ARTICLE);
+	add_default_key(&thread_keys, "a", GLOBAL_SEARCH_AUTHOR_FORWARD);
+	add_default_key(&thread_keys, "c", CATCHUP);
+	add_default_key(&thread_keys, "d", THREAD_TOGGLE_SUBJECT_DISPLAY);
+	add_default_key(&thread_keys, "m", THREAD_MAIL);
+#ifndef DISABLE_PRINTING
+	add_default_key(&thread_keys, "o", GLOBAL_PRINT);
+#endif /* !DISABLE_PRINTING */
+	add_default_key(&thread_keys, "s", THREAD_SAVE);
+	add_default_key(&thread_keys, "t", THREAD_TAG);
+	add_default_key(&thread_keys, "z", MARK_ARTICLE_UNREAD);
+	add_default_key(&thread_keys, "A", GLOBAL_SEARCH_AUTHOR_BACKWARD);
+	add_default_key(&thread_keys, "B", GLOBAL_SEARCH_BODY);
+	add_default_key(&thread_keys, "C", CATCHUP_NEXT_UNREAD);
+	add_default_key(&thread_keys, "E", GLOBAL_EDIT_FILTER);
+	add_default_key(&thread_keys, "K", THREAD_MARK_ARTICLE_READ);
+	add_default_key(&thread_keys, "L", GLOBAL_LOOKUP_MESSAGEID);
+	add_default_key(&thread_keys, "S", THREAD_AUTOSAVE);
+	add_default_key(&thread_keys, "U", THREAD_UNTAG);
+	add_default_key(&thread_keys, "Z", MARK_THREAD_UNREAD);
+	add_default_key(&thread_keys, "\t", THREAD_READ_NEXT_ARTICLE_OR_THREAD);
+	add_default_key(&thread_keys, "-", GLOBAL_LAST_VIEWED);
+	add_default_key(&thread_keys, "|", GLOBAL_PIPE);
+	add_default_key(&thread_keys, "*", THREAD_SELECT_ARTICLE);
+	add_default_key(&thread_keys, ".", THREAD_TOGGLE_ARTICLE_SELECTION);
+	add_default_key(&thread_keys, "@", THREAD_REVERSE_SELECTIONS);
+	add_default_key(&thread_keys, "~", THREAD_UNDO_SELECTIONS);
+	add_default_key(&thread_keys, ">", GLOBAL_SCROLL_DOWN);
+	add_default_key(&thread_keys, "<", GLOBAL_SCROLL_UP);
+
+	/* page level */
+	add_global_keys(&page_keys);
+	add_default_key(&page_keys, "", GLOBAL_PAGE_DOWN);
+	add_default_key(&page_keys, "", GLOBAL_MENU_FILTER_SELECT);
+	add_default_key(&page_keys, "", PAGE_REPLY_QUOTE_HEADERS);
+#ifdef HAVE_PGP_GPG
+	add_default_key(&page_keys, "", PAGE_PGP_CHECK_ARTICLE);
+#endif /* HAVE_PGP_GPG */
+	add_default_key(&page_keys, "", PAGE_TOGGLE_HEADERS);
+	add_default_key(&page_keys, "", GLOBAL_MENU_FILTER_KILL);
+	add_default_key(&page_keys, "\n\r", PAGE_NEXT_THREAD);
+	add_default_key(&page_keys, "", PAGE_TOGGLE_TABS);
+	add_default_key(&page_keys, "", PAGE_FOLLOWUP_QUOTE_HEADERS);
+	add_default_key(&page_keys, "a", GLOBAL_SEARCH_AUTHOR_FORWARD);
+	add_default_key(&page_keys, "c", CATCHUP);
+	add_default_key(&page_keys, "e", PAGE_EDIT_ARTICLE);
+	add_default_key(&page_keys, "f", PAGE_FOLLOWUP_QUOTE);
+	add_default_key(&page_keys, "g", GLOBAL_FIRST_PAGE);
+	add_default_key(&page_keys, "l", PAGE_LIST_THREAD);
+	add_default_key(&page_keys, "m", PAGE_MAIL);
+	add_default_key(&page_keys, "n", PAGE_NEXT_ARTICLE);
+#ifndef DISABLE_PRINTING
+	add_default_key(&page_keys, "o", GLOBAL_PRINT);
+#endif /* !DISABLE_PRINTING */
+	add_default_key(&page_keys, "p", PAGE_PREVIOUS_ARTICLE);
+	add_default_key(&page_keys, "r", PAGE_REPLY_QUOTE);
+	add_default_key(&page_keys, "s", PAGE_SAVE);
+	add_default_key(&page_keys, "t", PAGE_TAG);
+	add_default_key(&page_keys, "u", PAGE_GOTO_PARENT);
+	add_default_key(&page_keys, "x", PAGE_REPOST);
+	add_default_key(&page_keys, "z", MARK_ARTICLE_UNREAD);
+	add_default_key(&page_keys, "A", GLOBAL_SEARCH_AUTHOR_BACKWARD);
+	add_default_key(&page_keys, "B", GLOBAL_SEARCH_BODY);
+	add_default_key(&page_keys, "C", CATCHUP_NEXT_UNREAD);
+	add_default_key(&page_keys, "D", PAGE_CANCEL);
+	add_default_key(&page_keys, "E", GLOBAL_EDIT_FILTER);
+	add_default_key(&page_keys, "F", PAGE_FOLLOWUP);
+	add_default_key(&page_keys, "G", GLOBAL_LAST_PAGE);
+	add_default_key(&page_keys, "K", PAGE_MARK_THREAD_READ);
+	add_default_key(&page_keys, "L", GLOBAL_LOOKUP_MESSAGEID);
+	add_default_key(&page_keys, "N", PAGE_NEXT_UNREAD_ARTICLE);
+	add_default_key(&page_keys, "P", PAGE_PREVIOUS_UNREAD_ARTICLE);
+	add_default_key(&page_keys, "R", PAGE_REPLY);
+	add_default_key(&page_keys, "S", PAGE_AUTOSAVE);
+	add_default_key(&page_keys, "T", PAGE_GROUP_SELECT);
+	add_default_key(&page_keys, "U", PAGE_VIEW_URL);
+	add_default_key(&page_keys, "V", PAGE_VIEW_ATTACHMENTS);
+	add_default_key(&page_keys, "Z", MARK_THREAD_UNREAD);
+	add_default_key(&page_keys, "\t", PAGE_NEXT_UNREAD);
+	add_default_key(&page_keys, " ", PAGE_PAGE_DOWN3);
+	add_default_key(&page_keys, "-", GLOBAL_LAST_VIEWED);
+	add_default_key(&page_keys, "|", GLOBAL_PIPE);
+	add_default_key(&page_keys, "<", PAGE_TOP_THREAD);
+	add_default_key(&page_keys, ">", PAGE_BOTTOM_THREAD);
+	add_default_key(&page_keys, "\"", PAGE_TOGGLE_TEX2ISO);
+	add_default_key(&page_keys, "(", PAGE_TOGGLE_UUE);
+	add_default_key(&page_keys, ")", PAGE_REVEAL);
+	add_default_key(&page_keys, "[", GLOBAL_QUICK_FILTER_SELECT);
+	add_default_key(&page_keys, "]", GLOBAL_QUICK_FILTER_KILL);
+	add_default_key(&page_keys, "%", PAGE_TOGGLE_ROT13);
+	add_default_key(&page_keys, ":", PAGE_SKIP_INCLUDED_TEXT);
+	add_default_key(&page_keys, "_", PAGE_TOGGLE_HIGHLIGHTING);
+
+	/* info pager */
+	add_default_key(&info_keys, "", GLOBAL_ABORT);
+	add_default_key(&info_keys, "j", GLOBAL_LINE_DOWN);
+	add_default_key(&info_keys, "k", GLOBAL_LINE_UP);
+	add_default_key(&info_keys, " ", GLOBAL_PAGE_DOWN);
+	add_default_key(&info_keys, "b", GLOBAL_PAGE_UP);
+	add_default_key(&info_keys, "g^", GLOBAL_FIRST_PAGE);
+	add_default_key(&info_keys, "G$", GLOBAL_LAST_PAGE);
+	add_default_key(&info_keys, "q", GLOBAL_QUIT);
+	add_default_key(&info_keys, "H", GLOBAL_TOGGLE_HELP_DISPLAY);
+	add_default_key(&info_keys, "/", GLOBAL_SEARCH_SUBJECT_FORWARD);
+	add_default_key(&info_keys, "?", GLOBAL_SEARCH_SUBJECT_BACKWARD);
+	add_default_key(&info_keys, "\\", GLOBAL_SEARCH_REPEAT);
+
+	/* options menu */
+	add_default_key(&option_menu_keys, "1", DIGIT_1);
+	add_default_key(&option_menu_keys, "2", DIGIT_2);
+	add_default_key(&option_menu_keys, "3", DIGIT_3);
+	add_default_key(&option_menu_keys, "4", DIGIT_4);
+	add_default_key(&option_menu_keys, "5", DIGIT_5);
+	add_default_key(&option_menu_keys, "6", DIGIT_6);
+	add_default_key(&option_menu_keys, "7", DIGIT_7);
+	add_default_key(&option_menu_keys, "8", DIGIT_8);
+	add_default_key(&option_menu_keys, "9", DIGIT_9);
+	add_default_key(&option_menu_keys, "b", GLOBAL_PAGE_UP);
+	add_default_key(&option_menu_keys, " ", GLOBAL_PAGE_DOWN);
+	add_default_key(&option_menu_keys, "\n\r", CONFIG_SELECT);
+	add_default_key(&option_menu_keys, "", GLOBAL_REDRAW_SCREEN);
+	add_default_key(&option_menu_keys, "j", GLOBAL_LINE_DOWN);
+	add_default_key(&option_menu_keys, "k", GLOBAL_LINE_UP);
+	add_default_key(&option_menu_keys, "g^", GLOBAL_FIRST_PAGE);
+	add_default_key(&option_menu_keys, "G$", GLOBAL_LAST_PAGE);
+	add_default_key(&option_menu_keys, "q", GLOBAL_QUIT);
+	add_default_key(&option_menu_keys, "v", GLOBAL_VERSION);
+	add_default_key(&option_menu_keys, "Q", CONFIG_NO_SAVE);
+	add_default_key(&option_menu_keys, ">", GLOBAL_SCROLL_DOWN);
+	add_default_key(&option_menu_keys, "<", GLOBAL_SCROLL_UP);
+	add_default_key(&option_menu_keys, "/", GLOBAL_SEARCH_SUBJECT_FORWARD);
+	add_default_key(&option_menu_keys, "?", GLOBAL_SEARCH_SUBJECT_BACKWARD);
+	add_default_key(&option_menu_keys, "\\", GLOBAL_SEARCH_REPEAT);
+
+	/* prompt keys */
+	add_default_key(&prompt_keys, "", GLOBAL_ABORT);
+	add_default_key(&prompt_keys, "nN", PROMPT_NO);
+	add_default_key(&prompt_keys, "q", GLOBAL_QUIT);
+	add_default_key(&prompt_keys, "yY", PROMPT_YES);
+
+	/* post keys */
+	add_default_key(&post_send_keys, "", GLOBAL_ABORT);
+	add_default_key(&post_send_keys, "e", POST_EDIT);
+#ifdef HAVE_PGP_GPG
+	add_default_key(&post_send_keys, "g", POST_PGP);
+#endif /* HAVE_PGP_GPG */
+#ifdef HAVE_ISPELL
+	add_default_key(&post_send_keys, "i", POST_ISPELL);
+#endif /* HAVE_ISPELL */
+	add_default_key(&post_send_keys, "q", GLOBAL_QUIT);
+	add_default_key(&post_send_keys, "s", POST_SEND);
+
+	add_default_key(&post_edit_keys, "", GLOBAL_ABORT);
+	add_default_key(&post_edit_keys, "e", POST_EDIT);
+	add_default_key(&post_edit_keys, "o", POST_POSTPONE);
+	add_default_key(&post_edit_keys, "q", GLOBAL_QUIT);
+
+	add_default_key(&post_edit_ext_keys, "", GLOBAL_ABORT);
+	add_default_key(&post_edit_ext_keys, "e", POST_EDIT);
+	add_default_key(&post_edit_ext_keys, "q", GLOBAL_QUIT);
+	add_default_key(&post_edit_ext_keys, "M", GLOBAL_OPTION_MENU);
+
+	add_default_key(&post_post_keys, "", GLOBAL_ABORT);
+	add_default_key(&post_post_keys, "e", POST_EDIT);
+#ifdef HAVE_PGP_GPG
+	add_default_key(&post_post_keys, "g", POST_PGP);
+#endif /* HAVE_PGP_GPG */
+#ifdef HAVE_ISPELL
+	add_default_key(&post_post_keys, "i", POST_ISPELL);
+#endif /* HAVE_ISPELL */
+	add_default_key(&post_post_keys, "o", POST_POSTPONE);
+	add_default_key(&post_post_keys, "p", GLOBAL_POST);
+	add_default_key(&post_post_keys, "q", GLOBAL_QUIT);
+	add_default_key(&post_post_keys, "M", GLOBAL_OPTION_MENU);
+
+	add_default_key(&post_postpone_keys, "", GLOBAL_ABORT);
+	add_default_key(&post_postpone_keys, "n", PROMPT_NO);
+	add_default_key(&post_postpone_keys, "q", GLOBAL_QUIT);
+	add_default_key(&post_postpone_keys, "y", PROMPT_YES);
+	add_default_key(&post_postpone_keys, "A", POSTPONE_ALL);
+	add_default_key(&post_postpone_keys, "Y", POSTPONE_OVERRIDE);
+
+	add_default_key(&post_mail_fup_keys, "", GLOBAL_ABORT);
+	add_default_key(&post_mail_fup_keys, "m", POST_MAIL);
+	add_default_key(&post_mail_fup_keys, "p", GLOBAL_POST);
+	add_default_key(&post_mail_fup_keys, "q", GLOBAL_QUIT);
+
+	add_default_key(&post_ignore_fupto_keys, "", GLOBAL_ABORT);
+	add_default_key(&post_ignore_fupto_keys, "i", POST_IGNORE_FUPTO);
+	add_default_key(&post_ignore_fupto_keys, "p", GLOBAL_POST);
+	add_default_key(&post_ignore_fupto_keys, "q", GLOBAL_QUIT);
+
+	add_default_key(&post_continue_keys, "", GLOBAL_ABORT);
+	add_default_key(&post_continue_keys, "a", POST_ABORT);
+	add_default_key(&post_continue_keys, "c", POST_CONTINUE);
+	add_default_key(&post_continue_keys, "q", GLOBAL_QUIT);
+
+	add_default_key(&post_delete_keys, "", GLOBAL_ABORT);
+	add_default_key(&post_delete_keys, "d", POST_CANCEL);
+	add_default_key(&post_delete_keys, "q", GLOBAL_QUIT);
+	add_default_key(&post_delete_keys, "s", POST_SUPERSEDE);
+
+	add_default_key(&post_cancel_keys, "", GLOBAL_ABORT);
+	add_default_key(&post_cancel_keys, "e", POST_EDIT);
+	add_default_key(&post_cancel_keys, "d", POST_CANCEL);
+	add_default_key(&post_cancel_keys, "q", GLOBAL_QUIT);
+
+	/* feed keys */
+	add_default_key(&feed_post_process_keys, "", GLOBAL_ABORT);
+	add_default_key(&feed_post_process_keys, "n", POSTPROCESS_NO);
+	add_default_key(&feed_post_process_keys, "s", POSTPROCESS_SHAR);
+	add_default_key(&feed_post_process_keys, "y", POSTPROCESS_YES);
+	add_default_key(&feed_post_process_keys, "q", GLOBAL_QUIT);
+
+	add_default_key(&feed_type_keys, "", GLOBAL_ABORT);
+	add_default_key(&feed_type_keys, "a", FEED_ARTICLE);
+	add_default_key(&feed_type_keys, "h", FEED_HOT);
+	add_default_key(&feed_type_keys, "p", FEED_PATTERN);
+	add_default_key(&feed_type_keys, "q", GLOBAL_QUIT);
+	add_default_key(&feed_type_keys, "t", FEED_THREAD);
+	add_default_key(&feed_type_keys, "T", FEED_TAGGED);
+
+	add_default_key(&feed_supersede_article_keys, "", GLOBAL_ABORT);
+	add_default_key(&feed_supersede_article_keys, "q", GLOBAL_QUIT);
+	add_default_key(&feed_supersede_article_keys, "r", FEED_KEY_REPOST);
+	add_default_key(&feed_supersede_article_keys, "s", FEED_SUPERSEDE);
+
+	/* filter keys */
+	add_default_key(&filter_keys, "", GLOBAL_ABORT);
+	add_default_key(&filter_keys, "e", FILTER_EDIT);
+	add_default_key(&filter_keys, "q", GLOBAL_QUIT);
+	add_default_key(&filter_keys, "s", FILTER_SAVE);
+
+	/* mark read */
+	add_default_key(&mark_read_keys, "", GLOBAL_ABORT);
+	add_default_key(&mark_read_keys, "c", MARK_READ_CURRENT);
+	add_default_key(&mark_read_keys, "q", GLOBAL_QUIT);
+	add_default_key(&mark_read_keys, "t", MARK_READ_TAGGED);
+
+#ifdef HAVE_PGP_GPG
+	/* pgp mail */
+	add_default_key(&pgp_mail_keys, "", GLOBAL_ABORT);
+	add_default_key(&pgp_mail_keys, "b", PGP_KEY_ENCRYPT_SIGN);
+	add_default_key(&pgp_mail_keys, "e", PGP_KEY_ENCRYPT);
+	add_default_key(&pgp_mail_keys, "q", GLOBAL_QUIT);
+	add_default_key(&pgp_mail_keys, "s", PGP_KEY_SIGN);
+
+	/* pgp news */
+	add_default_key(&pgp_news_keys, "", GLOBAL_ABORT);
+	add_default_key(&pgp_news_keys, "i", PGP_INCLUDE_KEY);
+	add_default_key(&pgp_news_keys, "q", GLOBAL_QUIT);
+	add_default_key(&pgp_news_keys, "s", PGP_KEY_SIGN);
+#endif /* HAVE_PGP_GPG */
+
+	/* save */
+	add_default_key(&save_append_overwrite_keys, "", GLOBAL_ABORT);
+	add_default_key(&save_append_overwrite_keys, "a", SAVE_APPEND_FILE);
+	add_default_key(&save_append_overwrite_keys, "o", SAVE_OVERWRITE_FILE);
+	add_default_key(&save_append_overwrite_keys, "q", GLOBAL_QUIT);
+}
+
+
+/*
+ * used to add the common keys of SELECT_LEVEL, GROUP_LEVEL, THREAD_LEVEL
+ * and PAGE_LEVEL
+ */
+static void
+add_global_keys(
+	struct keylist *keys)
+{
+	add_default_key(keys, "", GLOBAL_ABORT);
+	add_default_key(keys, "0", DIGIT_0);
+	add_default_key(keys, "1", DIGIT_1);
+	add_default_key(keys, "2", DIGIT_2);
+	add_default_key(keys, "3", DIGIT_3);
+	add_default_key(keys, "4", DIGIT_4);
+	add_default_key(keys, "5", DIGIT_5);
+	add_default_key(keys, "6", DIGIT_6);
+	add_default_key(keys, "7", DIGIT_7);
+	add_default_key(keys, "8", DIGIT_8);
+	add_default_key(keys, "9", DIGIT_9);
+	add_default_key(keys, "b", GLOBAL_PAGE_UP);
+	add_default_key(keys, "", GLOBAL_REDRAW_SCREEN);
+	add_default_key(keys, "j", GLOBAL_LINE_DOWN);
+	add_default_key(keys, "k", GLOBAL_LINE_UP);
+	add_default_key(keys, "O", GLOBAL_POSTPONED);
+	add_default_key(keys, "h", GLOBAL_HELP);
+	add_default_key(keys, "i", GLOBAL_TOGGLE_INFO_LAST_LINE);
+	add_default_key(keys, "q", GLOBAL_QUIT);
+	add_default_key(keys, "v", GLOBAL_VERSION);
+	add_default_key(keys, "w", GLOBAL_POST);
+	add_default_key(keys, "H", GLOBAL_TOGGLE_HELP_DISPLAY);
+	add_default_key(keys, "I", GLOBAL_TOGGLE_INVERSE_VIDEO);
+	add_default_key(keys, "M", GLOBAL_OPTION_MENU);
+	add_default_key(keys, "Q", GLOBAL_QUIT_TIN);
+	add_default_key(keys, "R", GLOBAL_BUGREPORT);
+	add_default_key(keys, "W", GLOBAL_DISPLAY_POST_HISTORY);
+	add_default_key(keys, "^", GLOBAL_FIRST_PAGE);
+	add_default_key(keys, "$", GLOBAL_LAST_PAGE);
+	add_default_key(keys, "/", GLOBAL_SEARCH_SUBJECT_FORWARD);
+	add_default_key(keys, "?", GLOBAL_SEARCH_SUBJECT_BACKWARD);
+	add_default_key(keys, "\\", GLOBAL_SEARCH_REPEAT);
+	add_default_key(keys, "#", GLOBAL_SET_RANGE);
+#ifndef NO_SHELL_ESCAPE
+	add_default_key(keys, "!", GLOBAL_SHELL_ESCAPE);
+#endif /* NO_SHELL_ESCAPE */
+#ifdef HAVE_COLOR
+	add_default_key(keys, "&", GLOBAL_TOGGLE_COLOR);
+#endif /* HAVE COLOR */
+}
diff -Nurp tin-1.6.2/src/lang.c tin-1.8.0/src/lang.c
--- tin-1.6.2/src/lang.c	2003-08-27 23:17:21.000000000 +0200
+++ tin-1.8.0/src/lang.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : lang.c
  *  Author    : I. Lea
  *  Created   : 1991-04-01
- *  Updated   : 2003-08-10
+ *  Updated   : 2005-10-19
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -39,7 +39,7 @@
 #	include "tin.h"
 #endif /* !TIN_H */
 
-constext txt_1_resp[] = N_("1 Response%s");
+constext txt_1_resp[] = N_("1 Response");
 constext txt_7bit[] = "7bit";
 constext txt_8bit[] = "8bit";
 
@@ -94,7 +94,7 @@ constext txt_base_article_range[] = N_("
 constext txt_batch_update_unavail[] = N_("%s: Updating of index files not supported\n");
 constext txt_begin_of_art[] = N_("*** Beginning of article ***");
 
-constext txt_cancel_article[] = N_("Cancel (delete) or supersede (overwrite) article [%%.*s]? (%s/%s/%s): ");
+constext txt_cancel_article[] = N_("Cancel (delete) or supersede (overwrite) article [%%s]? (%s/%s/%s): ");
 constext txt_cancelling_art[] = N_("Cancelling article...");
 constext txt_cannot_create_uniq_name[] = "Can't create unique tempfile-name";
 constext txt_cannot_create[] = N_("Cannot create %s");
@@ -115,8 +115,10 @@ constext txt_check_article[] = N_("Check
 constext txt_checking_new_groups[] = N_("Checking for new groups... ");
 constext txt_checking_for_news[] = N_("Checking for news...");
 constext txt_choose_post_process_type[] = N_("Post-process %s=no, %s=yes, %s=shar, %s=quit: ");
-constext txt_color_off[] = N_("ANSI color disabled");
-constext txt_color_on[] = N_("ANSI color enabled");
+#ifdef HAVE_COLOR
+	constext txt_color_off[] = N_("ANSI color disabled");
+	constext txt_color_on[] = N_("ANSI color enabled");
+#endif /* HAVE_COLOR */
 constext txt_command_failed[] = N_("Command failed: %s");
 constext txt_confirm_select_on_exit[] = N_("Mark not selected articles read?");
 constext txt_connecting[] = N_("Connecting to %s...");
@@ -224,6 +226,8 @@ constext txt_filter_rule_created[] = N_(
 constext txt_feed_pattern[] = N_("Enter pattern [%s]> ");
 constext txt_followup_newsgroups[] = N_("\nYou requested followups to your article to go to the following %s:\n");
 constext txt_followup_poster[] = N_("  %s\t Answers will be directed to you by mail.\n");
+constext txt_forwarded[] = N_("-- forwarded message --\n");
+constext txt_forwarded_end[] = N_("-- end of forwarded message --\n");
 constext txt_filter_file[] = N_("# Format:\n\
 #   comment=STRING    Optional. Multiple lines allowed. Comments must be placed\n\
 #                     at the beginning of a rule, or they will be moved to the\n\
@@ -256,8 +260,10 @@ constext txt_from_line_only_case[] = N_(
 constext txt_gethostbyname[] = N_("%s%s: Unknown host.\n");
 constext txt_global[] = N_("global ");
 constext txt_group_aliased[] = N_("Please use %.100s instead");
+constext txt_group_bogus[] = N_("%s is bogus");
 constext txt_group_is_moderated[] = N_("Group %s is moderated. Continue?");
 constext txt_group_plural[] = N_("groups");
+constext txt_group_rereading[] = N_("Rereading %s...");
 constext txt_group_select_com[] = N_("Top Level Commands");
 constext txt_group_selection[] = N_("Group Selection");
 constext txt_group_singular[] = N_("group");
@@ -276,7 +282,7 @@ constext txt_help_article_autokill[] = N
 constext txt_help_article_autoselect[] = N_("auto-select (hot) an article via a menu");
 constext txt_help_article_browse_urls[] = N_("Browse URLs in article");
 constext txt_help_article_by_num[] = N_("0 - 9\t  display article by number in current thread");
-constext txt_help_article_cancel[] = N_("cancel (delete) current article; must have been posted by you");
+constext txt_help_article_cancel[] = N_("cancel (delete) or supersede (overwrite) current article");
 constext txt_help_article_edit[] = N_("edit article (mail-groups only)");
 constext txt_help_article_first_in_thread[] = N_("display first article in current thread");
 constext txt_help_article_first_page[] = N_("display first page of article");
@@ -295,7 +301,6 @@ constext txt_help_article_prev_unread[] 
 constext txt_help_article_quick_kill[] = N_("quickly kill an article using defaults");
 constext txt_help_article_quick_select[] = N_("quickly auto-select (hot) an article using defaults");
 constext txt_help_article_quit_to_select_level[] = N_("return to group selection level");
-constext txt_help_article_read_next_unread[] = N_("display next unread article");
 constext txt_help_article_reply[] = N_("reply through mail to author");
 constext txt_help_article_reply_no_quote[] = N_("reply through mail (don't copy text) to author");
 constext txt_help_article_reply_with_header[] = N_("reply through mail to author quoting complete headers");
@@ -314,6 +319,7 @@ constext txt_help_article_view_attachmen
 constext txt_help_bug[] = N_("report bug or comment via mail to %s");
 constext txt_help_global_article_range[] = N_("choose range of articles to be affected by next command");
 constext txt_help_global_esc[] = N_("escape from command prompt");
+constext txt_help_global_edit_filter[] = N_("edit filter file");
 constext txt_help_global_help[] = N_("get help");
 constext txt_help_global_last_art[] = N_("display last article viewed");
 constext txt_help_global_line_down[] = N_("down one line");
@@ -331,6 +337,8 @@ constext txt_help_global_quit_tin[] = N_
 constext txt_help_global_redraw_screen[] = N_("redraw page");
 constext txt_help_global_save[] = N_("save article/thread/hot/pattern/tagged articles to file");
 constext txt_help_global_auto_save[] = N_("save marked articles automatically without user prompts");
+constext txt_help_global_scroll_down[] = N_("scroll the screen one line down");
+constext txt_help_global_scroll_up[] = N_("scroll the screen one line up");
 constext txt_help_global_search_auth_backwards[] = N_("search for articles by author backwards");
 constext txt_help_global_search_auth_forwards[] = N_("search for articles by author forwards");
 constext txt_help_global_search_body[] = N_("search all articles for a given string (this may take some time)");
@@ -342,11 +350,11 @@ constext txt_help_global_tag[] = N_("tag
 constext txt_help_global_toggle_info_line[] = N_("toggle info message in last line (subject/description)");
 constext txt_help_global_toggle_inverse_video[] = N_("toggle inverse video");
 constext txt_help_global_toggle_mini_help[] = N_("toggle mini help menu display");
+constext txt_help_global_toggle_subj_display[] = N_("cycle the display of authors email address, real name, both or neither");
 constext txt_help_global_version[] = N_("show version information");
 constext txt_help_group_catchup[] = N_("mark all articles as read and return to group selection menu");
 constext txt_help_group_catchup_next[] = N_("mark all articles as read and enter next group with unread articles");
 constext txt_help_group_first_thread[] = N_("choose first thread in list");
-constext txt_help_group_goto_group[] = N_("choose group by name");
 constext txt_help_group_last_thread[] = N_("choose last thread in list");
 constext txt_help_group_list_thread[] = N_("list articles within current thread (bring up Thread sub-menu)");
 constext txt_help_group_mark_article_unread[] = N_("mark article as unread");
@@ -354,12 +362,7 @@ constext txt_help_group_mark_thread_read
 constext txt_help_group_mark_thread_unread[] = N_("mark thread as unread");
 constext txt_help_group_mark_unsel_art_read[] = N_("toggle display of all/selected articles");
 constext txt_help_group_next[] = N_("display next group");
-constext txt_help_group_next_unread_art[] = N_("display next unread article");
-constext txt_help_group_next_unread_article[] = N_("display next unread article");
 constext txt_help_group_prev[] = N_("display previous group");
-constext txt_help_group_prev_unread_art[] = N_("display previous unread article");
-constext txt_help_group_read_article[] = N_("read chosen article");
-constext txt_help_group_repost[] = N_("repost chosen article to another group");
 constext txt_help_group_reverse_thread_selection[] = N_("toggle all selections (all articles)");
 constext txt_help_group_select_all[] = N_("select group (make \"hot\")");
 constext txt_help_group_select_thread[] = N_("select thread");
@@ -369,7 +372,6 @@ constext txt_help_group_tag_parts[] = N_
 constext txt_help_group_thread_by_num[] = N_("0 - 9\t  choose thread by number");
 constext txt_help_group_toggle_getart_limit[] = N_("toggle limit number of articles to get, and reload");
 constext txt_help_group_toggle_read_articles[] = N_("toggle display of all/unread articles");
-constext txt_help_group_toggle_subj_display[] = N_("cycle the display of authors email address, real name, both or neither");
 constext txt_help_group_toggle_thread_selection[] = N_("toggle selection of thread");
 constext txt_help_group_toggle_threading[] = N_("cycle through threading options available");
 constext txt_help_group_undo_thread_selection[] = N_("undo all selections (all articles)");
@@ -407,7 +409,6 @@ constext txt_help_thread_first_article[]
 constext txt_help_thread_last_article[] = N_("choose last article in list");
 constext txt_help_thread_mark_article_read[] = N_("mark article or tagged articles as read and move cursor to next unread article");
 constext txt_help_thread_read_article[] = N_("read chosen article");
-constext txt_help_thread_toggle_subj_display[] = N_("cycle the display of authors email address, real name, both or neither");
 constext txt_help_title_disp[] = N_("Display properties\n------------------");
 constext txt_help_title_misc[] = N_("Miscellaneous\n-------------");
 constext txt_help_title_navi[] = N_("Moving around\n-------------");
@@ -450,6 +451,9 @@ of %s to be configured via a menu.\n\n\
 For more information read the manual page, README, INSTALL, TODO and FTP files.\n\
 Please send bug-reports/comments to %s with the 'R' command.\n");
 constext txt_invalid_from[] = N_("Invalid  From: %s  line. Read the INSTALL file again.");
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	constext txt_invalid_multibyte_sequence[] = N_("Invalid multibyte sequence found\n");
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 constext txt_invalid_sender[] = N_("Invalid  Sender:-header %s");
 constext txt_inverse_off[] = N_("Inverse video disabled");
 constext txt_inverse_on[] = N_("Inverse video enabled");
@@ -457,13 +461,13 @@ constext txt_inverse_on[] = N_("Inverse 
 constext txt_keymap_missing_key[] = N_("Missing definition for %s\n");
 constext txt_keymap_invalid_key[] = N_("Invalid key definition '%s'\n");
 constext txt_keymap_invalid_name[] = N_("Invalid keyname '%s'\n");
-constext txt_keymap_conflict[] = N_("Key '%s' is defined for both %s%s and %s%s\n");
-constext txt_kill_from[] = N_("Kill From:     [%-*.*s] (y/n): ");
+constext txt_keymap_upgraded[] = N_("Keymap file was upgraded to version %s\n");
+constext txt_kill_from[] = N_("Kill From:     [%s] (y/n): ");
 constext txt_kill_lines[] = N_("Kill Lines: (</>num): ");
 constext txt_kill_menu[] = N_("Kill Article Menu");
-constext txt_kill_msgid[] = N_("Kill Msg-Id:   [%-*.*s] (f/l/o/n): ");
+constext txt_kill_msgid[] = N_("Kill Msg-Id:   [%s] (f/l/o/n): ");
 constext txt_kill_scope[] = N_("Kill pattern scope  : ");
-constext txt_kill_subj[] = N_("Kill Subject:  [%-*.*s] (y/n): ");
+constext txt_kill_subj[] = N_("Kill Subject:  [%s] (y/n): ");
 constext txt_kill_text[] = N_("Kill text pattern   : ");
 constext txt_kill_time[] = N_("Kill time in days   : ");
 
@@ -472,7 +476,7 @@ constext txt_last_resp[] = N_("-- Last r
 constext txt_lines[] = N_("Lines %s  ");
 
 constext txt_msgid_line_only[] = N_("Message-ID: line              ");
-constext txt_mail[] = "Mail";
+constext txt_mail[] = N_("Mail");
 constext txt_mailbox[] = N_("mailbox ");
 constext txt_mail_art_to[] = N_("Mail article(s) to [%.*s]> ");
 constext txt_mail_log_to[] = N_("Mailing log to %s\n");
@@ -487,7 +491,7 @@ constext txt_marked_as_unread[] = N_("%s
 constext txt_marked_tagged_arts_as_read[] = N_("Marked %d of %d tagged %s as read");
 constext txt_mark_arts_read[] = N_("Mark all articles as read%s?");
 constext txt_mark_art_read_tagged_current[] = N_("Mark %s=tagged articles, %s=current article, %s=quit: ");
-constext txt_mark_group_read[] = N_("Mark group %.*s as read?");
+constext txt_mark_group_read[] = N_("Mark group %s as read?");
 constext txt_mark_thread_read[] = N_("Mark thread as read%s?");
 constext txt_mark_thread_read_tagged_current[] = N_("Mark %s=tagged articles/threads, %s=current thread, %s=quit: ");
 constext txt_matching_cmd_line_groups[] = N_("Matching %s groups...");
@@ -532,16 +536,17 @@ constext txt_no_newsgroups[] = N_("No ne
 constext txt_no_next_unread_art[] = N_("No next unread article");
 constext txt_no_prev_group[] = N_("No previous group");
 constext txt_no_prev_unread_art[] = N_("No previous unread article");
-constext txt_no_resp[] = N_("No responses%s");
 constext txt_no_responses[] = N_("No responses");
 constext txt_no_resps_in_thread[] = N_("No responses to list in current thread");
 constext txt_no_search_string[] = N_("No search string");
 constext txt_no_subject[] = N_("No subject");
-constext txt_no_term_clear_eol[] = N_("%s: Terminal must have clear to end-of-line (ce)\n");
-constext txt_no_term_clear_eos[] = N_("%s: Terminal must have clear to end-of-screen (cd)\n");
-constext txt_no_term_clearscreen[] = N_("%s: Terminal must have clearscreen (cl) capability\n");
-constext txt_no_term_cursor_motion[] = N_("%s: Terminal must have cursor motion (cm)\n");
-constext txt_no_term_set[] = N_("%s: TERM variable must be set to use screen capabilities\n");
+#ifndef USE_CURSES
+	constext txt_no_term_clear_eol[] = N_("%s: Terminal must have clear to end-of-line (ce)\n");
+	constext txt_no_term_clear_eos[] = N_("%s: Terminal must have clear to end-of-screen (cd)\n");
+	constext txt_no_term_clearscreen[] = N_("%s: Terminal must have clearscreen (cl) capability\n");
+	constext txt_no_term_cursor_motion[] = N_("%s: Terminal must have cursor motion (cm)\n");
+	constext txt_no_term_set[] = N_("%s: TERM variable must be set to use screen capabilities\n");
+#endif /* !USE_CURSES */
 constext txt_no_viewer_found[] = N_("No viewer found for %s/%s\n");
 constext txt_not_exist[] = N_("Newsgroup does not exist on this server");
 constext txt_not_in_active_file[] = N_("Group %s not found in active file");
@@ -574,7 +579,7 @@ constext txt_post_processing_finished[] 
 constext txt_post_subject[] = N_("Post subject [%s]> ");
 constext txt_posted_info_file[] = N_("# Summary of mailed/posted messages viewable by 'W' command from within tin.\n");
 constext txt_posting[] = N_("Posting article...");
-constext txt_postpone_repost[] = N_("Post postponed articles [%%.*s]? (%s/%s/%s/%s/%s): ");
+constext txt_postpone_repost[] = N_("Post postponed articles [%%s]? (%s/%s/%s/%s/%s): ");
 constext txt_prefix_hot[] = N_("Hot %s");
 constext txt_prefix_tagged[] = N_("Tagged %s");
 constext txt_prefix_untagged[] = N_("Untagged %s");
@@ -587,7 +592,7 @@ constext txt_prompt_see_postponed[] = N_
 constext txt_quick_filter_kill[] = N_("Add quick kill filter?");
 constext txt_quick_filter_select[] = N_("Add quick selection filter?");
 constext txt_quit[] = N_("Do you really want to quit?");
-constext txt_quit_cancel[] = N_("%s=edit cancel message, %s=quit, %s=delete (cancel) [%%.*s]: ");
+constext txt_quit_cancel[] = N_("%s=edit cancel message, %s=quit, %s=delete (cancel) [%%s]: ");
 constext txt_quit_despite_tags[] = N_("You have tagged articles in this group - quit anyway?");
 constext txt_quit_edit_postpone[] = N_("%s=quit, %s=edit, %s=postpone: ");
 constext txt_quit_edit_save_kill[] = N_("%s=quit %s=edit %s=save kill description: ");
@@ -611,6 +616,9 @@ constext txt_reading_news_active_file[] 
 constext txt_reading_news_newsrc_file[] = N_("Reading groups from newsrc file... ");
 constext txt_reading_newsgroups_file[] = N_("Reading newsgroups file... ");
 constext txt_reading_newsrc[] = N_("Reading newsrc file...");
+#ifdef HAVE_GETTIMEOFDAY
+	constext txt_remaining[] = N_("(%d:%02d remaining)");
+#endif /* HAVE_GETTIMEOFDAY */
 constext txt_remove_bogus[] = N_("Bogus group %s removed.");
 constext txt_rename_error[] = N_("Error: rename %s to %s");
 constext txt_reply_to_author[] = N_("Reply to author...");
@@ -620,15 +628,15 @@ constext txt_repost_group[] = N_("Repost
 constext txt_reset_newsrc[] = N_("Reset newsrc?");
 constext txt_resp_redirect[] = N_("Responses have been directed to the following newsgroups");
 constext txt_resp_to_poster[] = N_("Responses have been directed to poster. %s=mail, %s=post, %s=quit: ");
-constext txt_resp_x_of_n[] = N_("RespNo %4d of %4d%s");
+constext txt_resp_x_of_n[] = N_("RespNo %4d of %4d");
 constext txt_return_key[] = N_("Press <RETURN> to continue...");
 
-constext txt_select_from[] = N_("Select From    [%-*.*s] (y/n): ");
+constext txt_select_from[] = N_("Select From    [%s] (y/n): ");
 constext txt_select_lines[] = N_("Select Lines: (</>num): ");
 constext txt_select_menu[] = N_("Auto-select Article Menu");
-constext txt_select_msgid[] = N_("Select Msg-Id  [%-*.*s] (f/l/o/n): ");
+constext txt_select_msgid[] = N_("Select Msg-Id  [%s] (f/l/o/n): ");
 constext txt_select_scope[] = N_("Select pattern scope: ");
-constext txt_select_subj[] = N_("Select Subject [%-*.*s] (y/n): ");
+constext txt_select_subj[] = N_("Select Subject [%s] (y/n): ");
 constext txt_select_text[] = N_("Select text pattern : ");
 constext txt_select_time[] = N_("Select time in days   : ");
 constext txt_serverconfig_header[] = N_("# %s server configuration file\n\
@@ -653,7 +661,9 @@ constext txt_saved_to[] = N_("-- %s save
 constext txt_saved_to_range[] = N_("-- %s saved to %s - %s --");
 constext txt_saving[] = N_("Saving...");
 constext txt_screen_init_failed[] = N_("%s: Screen initialization failed");
-constext txt_screen_too_small[] = N_("%s: screen is too small\n");
+#ifndef USE_CURSES
+	constext txt_screen_too_small[] = N_("%s: screen is too small\n");
+#endif /* !USE_CURSES */
 constext txt_screen_too_small_exiting[] = N_("screen is too small, %s is exiting\n");
 constext txt_search_backwards[] = N_("Search backwards [%s]> ");
 constext txt_search_body[] = N_("Search body [%s]> ");
@@ -676,13 +686,14 @@ constext txt_subscribe_pattern[] = N_("E
 constext txt_subscribed_num_groups[] = N_("subscribed to %d groups");
 constext txt_subscribed_to[] = N_("Subscribed to %s");
 constext txt_subscribing[] = N_("Subscribing... ");
-constext txt_supersede_article[] = N_("Repost or supersede article(s) [%%.*s]? (%s/%s/%s): ");
+constext txt_supersede_article[] = N_("Repost or supersede article(s) [%%s]? (%s/%s/%s): ");
 constext txt_supersede_group[] = N_("Supersede article(s) to group(s) [%s]> ");
 constext txt_superseding_art[] = N_("Superseding article ...");
 constext txt_suspended_message[] = N_("\nStopped. Type 'fg' to restart %s\n");
 
 constext txt_time_default_days[] = N_("%d days");
 constext txt_tab[] = N_("<TAB>");
+constext txt_tex[] = N_("TeX ");
 constext txt_tinrc_defaults[] = N_("# Default action/prompt strings\n");
 constext txt_tinrc_filter[] = N_("# Defaults for quick (1 key) kill & auto-selection filters\n\
 # header=NUM  0,1=Subject: 2,3=From: 4=Message-ID: & full References: line\n\
@@ -704,10 +715,12 @@ constext txt_thread_upper[] = N_("Thread
 constext txt_thread_com[] = N_("Thread Level Commands");
 constext txt_thread_marked_as_deselected[] = N_("Thread deselected");
 constext txt_thread_marked_as_selected[] = N_("Thread selected");
-constext txt_thread_plural[] = N_("threads");
+#if 0 /* unused */
+	constext txt_thread_plural[] = N_("threads");
+#endif /* 0 */
 constext txt_thread_range[] = N_("Thread range");
 constext txt_thread_singular[] = N_("thread");
-constext txt_thread_x_of_n[] = N_("%sThread %4s of %4s");
+constext txt_thread_x_of_n[] = N_("Thread %4s of %4s");
 constext txt_threading_arts[] = N_("Threading articles...");
 constext txt_toggled_high[] = N_("Toggled word highlighting %s");
 constext txt_toggled_rot13[] = N_("Toggled rot13 encoding");
@@ -801,7 +814,7 @@ constext txt_warn_suspicious_mail[] = N_
 constext txt_warn_wrong_sig_format[] = N_("\nWarning: Signatures should start with '-- \\n' not with '--\\n'.\n");
 constext txt_writing_attributes_file[] = N_("Writing attributes file...");
 
-constext txt_x_resp[] = N_("%d Responses%s");
+constext txt_x_resp[] = N_("%d Responses");
 
 constext txt_yanked_groups[] = N_("Added %d %s");
 constext txt_yanked_none[] = N_("No unsubscribed groups to show");
@@ -823,7 +836,6 @@ Warning: Posting is in %s and contains c
 #endif /* CHARSET_CONVERSION */
 
 #ifdef DEBUG
-	constext txt_keymap_redef[] = N_("Redefined key %s '%s' -> '%s'\n");
 	constext txt_usage_debug[] = N_("  -D       debug mode 1=NNTP 2=ALL");
 #endif /* DEBUG */
 
@@ -838,14 +850,26 @@ Warning: Posting is in %s and contains c
 
 #ifdef HAVE_COLOR
 	constext txt_help_global_toggle_color[] = N_("toggle color");
-	constext txt_tinrc_colors[] = N_("# For color-adjust use the following numbers\n\
-#  0-black       1-red         2-green        3-brown\n\
-#  4-blue        5-pink        6-cyan         7-white\n\
+	constext txt_tinrc_colors[] = N_("# Changing colors of several screen parts\n\
+# Possible values are:\n\
+#  -1 = default (white for foreground and black for background)\n\
+#   0 = black\n\
+#   1 = red\n\
+#   2 = green\n\
+#   3 = brown\n\
+#   4 = blue\n\
+#   5 = pink\n\
+#   6 = cyan\n\
+#   7 = white\n\
 # These are *only* for foreground:\n\
-#  8-gray        9-lightred   10-lightgreen  11-yellow\n\
-# 12-lightblue  13-lightpink  14-lightcyan   15-lightwhite\n\
-# A '-1' is interpreted as default (foreground normally is white, and\n\
-# background black)\n\n");
+#   8 = gray\n\
+#   9 = light red\n\
+#  10 = light green\n\
+#  11 = yellow\n\
+#  12 = light blue\n\
+#  13 = light pink\n\
+#  14 = light cyan\n\
+#  15 = light white\n\n");
 	constext txt_usage_toggle_color[] = N_("  -a       toggle color flag");
 #endif /* HAVE_COLOR */
 
@@ -867,7 +891,9 @@ Warning: Posting is in %s and contains c
 	constext txt_libuu_error_no_data[] = N_("No data.");
 	constext txt_libuu_error_unknown[] = N_("Unknown error.");
 #else
-	constext txt_checksum_of_file[] = N_("\tChecksum of %s (%ld %s)");
+#	if defined(M_UNIX) && defined(HAVE_SUM) && !defined(DONT_HAVE_PIPING)
+		constext txt_checksum_of_file[] = N_("\tChecksum of %s (%ld %s)");
+#	endif /* M_UNIX && HAVE_SUM && !DONT_HAVE_PIPING */
 #endif /* HAVE_LIBUU */
 
 #ifdef HAVE_MH_MAIL_HANDLING
@@ -884,33 +910,27 @@ Warning: Posting is in %s and contains c
 	constext txt_pgp_nothing[] = N_("Article not signed and no public keys found");
 #	ifdef HAVE_ISPELL
 		constext txt_quit_edit_post[] = N_("%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone: ");
-		constext txt_quit_edit_send[] = N_("%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%.*s]: ");
-		constext txt_quit_edit_xpost[] = N_("%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%.*s]: ");
+		constext txt_quit_edit_send[] = N_("%s=quit, %s=edit, %s=ispell, %s=pgp, %s=send [%%s]: ");
+		constext txt_quit_edit_xpost[] = N_("%s=quit, %s=edit, %s=ispell, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: ");
 #	else
 	constext txt_quit_edit_post[] = N_("%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone: ");
-	constext txt_quit_edit_send[] = N_("%s=quit, %s=edit, %s=pgp, %s=send [%%.*s]: ");
-	constext txt_quit_edit_xpost[] = N_("%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%.*s]: ");
+	constext txt_quit_edit_send[] = N_("%s=quit, %s=edit, %s=pgp, %s=send [%%s]: ");
+	constext txt_quit_edit_xpost[] = N_("%s=quit, %s=edit, %s=pgp, %s=menu, %s=post, %s=postpone [%%s]: ");
 #	endif /* HAVE_ISPELL */
 #else
 #	ifdef HAVE_ISPELL
 		constext txt_quit_edit_post[] = N_("%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone: ");
-		constext txt_quit_edit_send[] = N_("%s=quit, %s=edit, %s=ispell, %s=send [%%.*s]: ");
-		constext txt_quit_edit_xpost[] = N_("%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%.*s]: ");
+		constext txt_quit_edit_send[] = N_("%s=quit, %s=edit, %s=ispell, %s=send [%%s]: ");
+		constext txt_quit_edit_xpost[] = N_("%s=quit, %s=edit, %s=ispell, %s=menu, %s=post, %s=postpone [%%s]: ");
 #	else
 		constext txt_quit_edit_post[] = N_("%s=quit, %s=edit, %s=menu, %s=post, %s=postpone: ");
-		constext txt_quit_edit_send[] = N_("%s=quit, %s=edit, %s=send [%%.*s]: ");
-		constext txt_quit_edit_xpost[] = N_("%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%.*s]: ");
+		constext txt_quit_edit_send[] = N_("%s=quit, %s=edit, %s=send [%%s]: ");
+		constext txt_quit_edit_xpost[] = N_("%s=quit, %s=edit, %s=menu, %s=post, %s=postpone [%%s]: ");
 #	endif /* HAVE_ISPELL */
 #endif /* HAVE_PGP_GPG */
 
-#ifdef M_AMIGA
-	constext txt_copyright_notice[] = "%s (c) Copyright 1991-2003 Iain Lea & Mark Tomlinson.";
-	constext txt_env_var_not_found[] = N_("Environment variable %s not found. Set and retry...");
-	constext txt_usage_bbs_mode[] = N_("  -B       BBS mode. File operations limited to home directories.");
-#endif /* M_AMIGA */
-
 #ifdef M_UNIX
-	constext txt_copyright_notice[] = "%s (c) Copyright 1991-2003 Iain Lea.";
+	constext txt_copyright_notice[] = "%s (c) Copyright 1991-2006 Iain Lea.";
 #endif /* M_UNIX */
 
 #ifdef NNTP_ABLE
@@ -962,7 +982,7 @@ Tin will try to use XHDR XREF instead (s
 #endif /* NNTP_INEWS */
 
 #ifdef VMS
-	constext txt_copyright_notice[] = "%s (c) Copyright 1991-2003 Iain Lea & Tod McQuillin & other.";
+	constext txt_copyright_notice[] = "%s (c) Copyright 1991-2006 Iain Lea & Tod McQuillin & other.";
 #endif /* VMS */
 
 #ifndef DISABLE_PRINTING
@@ -1020,9 +1040,9 @@ Warning: The \"%s:\" line has spaces in 
 	constext txt_shell_escape[] = N_("Enter shell command [%s]> ");
 #endif /* !NO_SHELL_ESCAPE */
 
-#if defined(M_UNIX) && !defined(USE_TERMINFO)
+#if !defined(USE_CURSES) && defined(M_UNIX) && !defined(USE_TERMINFO)
 	constext txt_cannot_get_term_entry[] = N_("%s: Can't get entry for TERM\n");
-#endif /* M_UNIX && !USE_TERMINFO */
+#endif /* !USE_CURSES && M_UNIX && !USE_TERMINFO */
 
 #if defined(HAVE_POLL) || defined(HAVE_SELECT)
 	constext txt_group[] = N_("Group %.*s ('q' to quit)...");
@@ -1042,7 +1062,7 @@ Warning: The \"%s:\" line has spaces in 
 #	else
 		constext txt_mini_group_3[] = N_("%s=mail; %s=print; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post");
 		constext txt_mini_page_3[] = N_("%s=mail; %s=print; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post");
-#	endif /* DONT_HAVE_PIPING */
+#	endif /* !DONT_HAVE_PIPING */
 #else
 #	ifndef DONT_HAVE_PIPING
 		constext txt_mini_group_3[] = N_("%s=pipe; %s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post");
@@ -1050,8 +1070,8 @@ Warning: The \"%s:\" line has spaces in 
 #	else
 		constext txt_mini_group_3[] = N_("%s=mail; %s=quit; %s=toggle all/unread; %s=save; %s=tag; %s=post");
 		constext txt_mini_page_3[] = N_("%s=mail; %s=quit; %s=reply mail; %s=save; %s=tag; %s=post");
-#	endif /* DONT_HAVE_PIPING */
-#endif /* DISABLE_PRINTING */
+#	endif /* !DONT_HAVE_PIPING */
+#endif /* !DISABLE_PRINTING */
 
 #ifdef HAVE_COLOR
 #	ifdef USE_CURSES
@@ -1078,7 +1098,8 @@ constext *txt_threading[] = {
 	N_("Subject"),
 	N_("References"),
 	N_("Both Subject and References"),
-	N_("Multipart Subject")
+	N_("Multipart Subject"),
+	N_("Percentage Match")
 };
 
 /*
@@ -1285,17 +1306,42 @@ constext *txt_mailbox_formats[] = {
 	"MMDF"
 };
 
+/* interactive mailers */
+constext *txt_interactive_mailers[] = {
+	N_("no"),
+	N_("with headers"),
+	N_("without headers")
+};
+
+#ifdef HAVE_UNICODE_NORMALIZATION
+constext *txt_normalization_forms[] = {
+	N_("None"),
+#	ifdef HAVE_LIBICUUC
+	N_("NFKC"),
+	N_("NFKD"),
+	N_("NFC"),
+	N_("NFD")
+#	else
+#		ifdef HAVE_LIBIDN
+	N_("NFKC")
+#		endif /* HAVE_LIBIDN */
+#	endif /* HAVE_LIBICUUC */
+};
+#endif /* HAVE_UNICODE_NORMALIZATION */
+
 struct opttxt txt_display_options = {
 	NULL,
 	N_("Display Options"),
 	NULL
 };
 
+#ifdef HAVE_COLOR
 struct opttxt txt_color_options = {
 	NULL,
 	N_("Color Options"),
 	NULL
 };
+#endif /* HAVE_COLOR */
 
 struct opttxt txt_getart_limit_options = {
 	NULL,
@@ -1329,227 +1375,279 @@ struct opttxt txt_filtering_options = {
 
 struct opttxt txt_beginner_level = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Show mini menu & posting etiquette :"),
+	N_("Show mini menu & posting etiquette"),
 	N_("# If ON show a mini menu of useful commands at each level\n\
 # and posting etiquette after composing an article\n")
 };
 
 struct opttxt txt_show_description = {
 	N_("Show short description for each newsgroup. <SPACE> toggles & <CR> sets."),
-	N_("Show description of each newsgroup :"),
+	N_("Show description of each newsgroup"),
 	N_("# If ON show group description text after newsgroup name at\n\
 # group selection level\n")
 };
 
 struct opttxt txt_show_author = {
 	N_("Show Subject & From (author) fields in group menu. <SPACE> toggles & <CR> sets."),
-	N_("In group menu, show author by      :"),
-	N_("# Part of from field to display 0) none 1) address 2) full name 3) both\n")
+	N_("In group menu, show author by"),
+	N_("# Part of from field to display\n\
+# Possible values are (the default is marked with *):\n\
+#   0 = none\n\
+#   1 = address\n\
+# * 2 = full name\n\
+#   3 = both\n")
 };
 
 struct opttxt txt_draw_arrow = {
 	N_("Draw -> or highlighted bar for selection. <SPACE> toggles & <CR> sets."),
-	N_("Draw -> instead of highlighted bar :"),
+	N_("Draw -> instead of highlighted bar"),
 	N_("# If ON use -> otherwise highlighted bar for selection\n")
 };
 
 struct opttxt txt_inverse_okay = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Use inverse video for page headers :"),
+	N_("Use inverse video for page headers"),
 	N_("# If ON use inverse video for page headers at different levels\n")
 };
 
 struct opttxt txt_thread_articles = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Thread articles by                 :"),
-	N_("# Thread articles on 0=(nothing) 1=(Subject) 2=(References) 3=(Both)\n\
-# 4=(Multipart Subject).\n")
+	N_("Thread articles by"),
+	N_("# Thread articles by ...\n\
+# Possible values are (the default is marked with *):\n\
+#   0 = nothing\n\
+#   1 = Subject\n\
+#   2 = References\n\
+# * 3 = Both (Subject and References)\n\
+#   4 = Multipart Subject\n\
+#   5 = Percentage Match\n")
+};
+
+struct opttxt txt_thread_perc = {
+	N_("Enter percentage match required to thread together. <CR> sets."),
+	N_("Thread percentage match"),
+	N_("# Thread percentage match...\n\
+# the percentage of characters in the subject of an article that must match\n\
+# a base article for both those articles to be considered to belong to the\n\
+# same thread. This option is an integer percentage, eg. 80, no decimals may\n\
+# follow. If 80 is used here, then 80%% of the characters must match exactly,\n\
+# no insertion of a character, for the two articles to be put in the same\n\
+# thread. eg. 'happy' and 'harpy' would match, but 'harpie', 'happie' and\n\
+# 'harppy' would be threaded separately from 'happy'\n")
 };
 
 struct opttxt txt_thread_score = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Score of a thread                  :"),
-	N_("# Thread score 0=(Max) 1=(Sum) 2=(Average)\n")
+	N_("Score of a thread"),
+	N_("# Thread score\n\
+# Possible values are (the default is marked with *):\n\
+# * 0 = max\n\
+#   1 = sum\n\
+#   2 = average\n")
 };
 
 struct opttxt txt_sort_article_type = {
 	N_("Sort articles by Subject, From, Date or Score. <SPACE> toggles & <CR> sets."),
-	N_("Sort articles by                   :"),
-	N_("# Sort articles by 0=(nothing) 1=(Subject descend) 2=(Subject ascend)\n\
-# 3=(From descend) 4=(From ascend) 5=(Date descend) 6=(Date ascend)\n\
-# 7=(Score descend) 8=(Score ascend) 9=(Lines descend) 10=(Lines ascend).\n")
+	N_("Sort articles by"),
+	N_("# Sort articles by ...\n\
+# Possible values are (the default is marked with *):\n\
+#   0 = nothing\n\
+#   1 = Subject descending\n\
+#   2 = Subject ascending\n\
+#   3 = From descending\n\
+#   4 = From ascending\n\
+#   5 = Date descending\n\
+# * 6 = Date ascending\n\
+#   7 = Score descending\n\
+#   8 = Score ascending\n\
+#   9 = Lines descending\n\
+#  10 = Lines ascending\n")
 };
 
 struct opttxt txt_sort_threads_type = {
 	N_("Sort threads by Nothing or Score. <SPACE> toggles & <CR> sets."),
-	N_("Sort threads by                    :"),
-	N_("# Sort thread by 0=(nothing) 1=(Score descend) 2=(Score ascend)\n")
+	N_("Sort threads by"),
+	N_("# Sort thread by ...\n\
+# Possible values are (the default is marked with *):\n\
+#   0 = nothing\n\
+# * 1 = Score descending\n\
+#   2 = Score ascending\n")
 };
 
 struct opttxt txt_pos_first_unread = {
 	N_("Put cursor at first/last unread art in groups. <SPACE> toggles & <CR> sets."),
-	N_("Goto first unread article in group :"),
+	N_("Goto first unread article in group"),
 	N_("# If ON put cursor at first unread art in group otherwise last art\n")
 };
 
 struct opttxt txt_show_only_unread_arts = {
 	N_("Show all articles or only unread articles. <SPACE> toggles & <CR> sets."),
-	N_("Show only unread articles          :"),
+	N_("Show only unread articles"),
 	N_("# If ON show only new/unread articles otherwise show all.\n")
 };
 
 struct opttxt txt_show_only_unread_groups = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Show only groups with unread arts  :"),
+	N_("Show only groups with unread arts"),
 	N_("# If ON show only subscribed to groups that contain unread articles.\n")
 };
 
 struct opttxt txt_kill_level = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Filter which articles              :"),
-	N_("# 0=(Only kill unread articles)\n\
-# 1=(Kill all articles and show in threads marked with K)\n\
-# 2=(Kill all articles and never show them).\n")
+	N_("Filter which articles"),
+	N_("# Filter which articles\n\
+# Possible values are (the default is marked with *):\n\
+# * 0 = only kill unread articles\n\
+#   1 = kill all articles and show in threads marked with K\n\
+#   2 = kill all articles and never show them\n")
 };
 
 struct opttxt txt_tab_goto_next_unread = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Tab goes to next unread article    :"),
+	N_("Tab goes to next unread article"),
 	N_("# If ON the TAB command will go to next unread article at article viewer level\n")
 };
 
 struct opttxt txt_space_goto_next_unread = {
 	N_("Scrolling with <SPACE> past the end of an art. jumps to the next unread one."),
-	N_("Space goes to next unread article  :"),
+	N_("Space goes to next unread article"),
 	N_("# If ON the SPACE command will go to next unread article at article viewer\n\
 # level when the end of the article is reached (rn-style pager)\n")
 };
 
 struct opttxt txt_pgdn_goto_next = {
 	N_("Scrolling with <PGDN>/<DOWN> past the end of an art. jumps to the unread one."),
-	N_("PgDn goes to next unread article   :"),
+	N_("PgDn goes to next unread article"),
 	N_("# If ON the PGDN or DOWN command will go to next unread article when\n\
 # pressed at end of message\n")
 };
 
 struct opttxt txt_auto_list_thread = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("List thread using right arrow key  :"),
+	N_("List thread using right arrow key"),
 	N_("# If ON automatically list thread when entering it using right arrow key.\n")
 };
 
 struct opttxt txt_art_marked_deleted = {
 	N_("Enter character to indicate deleted articles. <CR> sets, <ESC> cancels."),
-	N_("Character to show deleted articles :"),
+	N_("Character to show deleted articles"),
 	N_("# Character used to show that an art was deleted (default 'D')\n\
 # _ is turned into ' '\n")
 };
 
 struct opttxt txt_art_marked_inrange = {
 	N_("Enter character to indicate articles in a range. <CR> sets, <ESC> cancels."),
-	N_("Character to show inrange articles :"),
+	N_("Character to show inrange articles"),
 	N_("# Character used to show that an art is in a range (default '#')\n\
 # _ is turned into ' '\n")
 };
 
 struct opttxt txt_art_marked_return = {
 	N_("Enter character to indicate that article will return. <CR> sets, <ESC> cancels."),
-	N_("Character to show returning arts   :"),
+	N_("Character to show returning arts"),
 	N_("# Character used to show that an art will return (default '-')\n\
 # _ is turned into ' '\n")
 };
 
 struct opttxt txt_art_marked_selected = {
 	N_("Enter character to indicate selected articles. <CR> sets, <ESC> cancels."),
-	N_("Character to show selected articles:"),
+	N_("Character to show selected articles"),
 	N_("# Character used to show that an art was auto-selected (default '*')\n\
 # _ is turned into ' '\n")
 };
 
 struct opttxt txt_art_marked_recent = {
 	N_("Enter character to indicate recent articles. <CR> sets, <ESC> cancels."),
-	N_("Character to show recent articles  :"),
+	N_("Character to show recent articles"),
 	N_("# Character used to show that an art is recent (default 'o')\n\
 # _ is turned into ' '\n")
 };
 
 struct opttxt txt_art_marked_unread = {
 	N_("Enter character to indicate unread articles. <CR> sets, <ESC> cancels."),
-	N_("Character to show unread articles  :"),
+	N_("Character to show unread articles"),
 	N_("# Character used to show that an art is unread (default '+')\n\
 # _ is turned into ' '\n")
 };
 
 struct opttxt txt_art_marked_read = {
 	N_("Enter character to indicate read articles. <CR> sets, <ESC> cancels."),
-	N_("Character to show read articles    :"),
+	N_("Character to show read articles"),
 	N_("# Character used to show that an art was read (default ' ')\n\
 # _ is turned into ' '\n")
 };
 
 struct opttxt txt_art_marked_killed = {
 	N_("Enter character to indicate killed articles. <CR> sets, <ESC> cancels."),
-	N_("Character to show killed articles  :"),
+	N_("Character to show killed articles"),
 	N_("# Character used to show that an art was killed (default 'K')\n\
 # kill_level must be set accordingly, _ is turned into ' '\n")
 };
 
 struct opttxt txt_art_marked_read_selected = {
 	N_("Enter character to indicate read selected articles. <CR> sets, <ESC> cancels."),
-	N_("Character to show readselected arts:"),
+	N_("Character to show readselected arts"),
 	N_("# Character used to show that an art was selected before read (default ':')\n\
 # kill_level must be set accordingly, _ is turned into ' '\n")
 };
 
 struct opttxt txt_groupname_max_length = {
 	N_("Enter maximum length of newsgroup names displayed. <CR> sets."),
-	N_("Max. length of group names shown   :"),
+	N_("Max. length of group names shown"),
 	N_("# Maximum length of the names of newsgroups displayed\n")
 };
 
 struct opttxt txt_show_info = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Show lines/score in listings       :"),
+	N_("Show lines/score in listings"),
 	N_("# What informations should be displayed in article/thread listing\n\
-# 0 = nothing, 1 = lines, 2 = score, 3 = lines & score\n")
+# Possible values are (the default is marked with *):\n\
+#   0 = nothing\n\
+# * 1 = lines\n\
+#   2 = score\n\
+#   3 = lines & score\n")
 };
 
 struct opttxt txt_scroll_lines = {
 	N_("0 = full page scrolling, -1 = show previous last line as first on next page, -2 = half page"),
-	N_("Number of lines to scroll in pager :"),
+	N_("Number of lines to scroll in pager"),
 	N_("# Number of lines that cursor-up/down will scroll in article pager\n\
-# eg, 1+ = line-by-line, 0 = page-by-page (traditional behavior),\n\
-# -1 = the top/bottom line is carried over onto the next page,\n\
-# -2 = half-page scrolling\n")
+# Possible values are (the default is marked with *):\n\
+#  -2 = half-page scrolling\n\
+#  -1 = the top/bottom line is carried over onto the next page\n\
+#   0 = page-by-page (traditional behavior)\n\
+# * 1 = line-by-line\n\
+#   2 or greater = scroll by 2 or more lines (only in the pager)\n")
 };
 
 struct opttxt txt_show_signatures = {
 	N_("Display signatures. <SPACE> toggles & <CR> sets."),
-	N_("Display signatures                 :"),
+	N_("Display signatures"),
 	N_("# If OFF don't show signatures when displaying articles\n")
 };
 
 struct opttxt txt_hide_uue = {
 	N_("Display uuencoded data as tagged attachments. <SPACE> toggles & <CR> sets."),
-	N_("Display uue data as an attachment  :"),
+	N_("Display uue data as an attachment"),
 	N_("# Handling of uuencoded data in the pager\n\
-# 0 = display raw uuencoded data\n\
-# 1 = uuencoded data will be condensed to a single tag line showing\n\
-#     size and filename, similar to how MIME attachments are displayed\n\
-# 2 = as for 1, but any line that looks like uuencoded data will be folded\n\
-#     into a tag line.\n")
+# Possible values are (the default is marked with *):\n\
+# * 0 = no, display raw uuencoded data\n\
+#   1 = yes, uuencoded data will be condensed to a single tag line showing\n\
+#       size and filename, similar to how MIME attachments are displayed\n\
+#   2 = hide all, as for 1, but any line that looks like uuencoded data will\n\
+#       be folded into a tag line.\n")
 };
 
 struct opttxt txt_tex2iso_conv = {
 	N_("Decode German style TeX umlaut codes to ISO. <SPACE> toggles & <CR> sets."),
-	N_("Display \"a as Umlaut-a             :"),
+	N_("Display \"a as Umlaut-a"),
 	N_("# If ON decode German style TeX umlaut codes to ISO and\n\
 # show \"a as Umlaut-a, etc.\n")
 };
 
 struct opttxt txt_news_headers_to_display = {
 	N_("Space separated list of header fields"),
-	N_("Display these header fields (or *) :"),
+	N_("Display these header fields (or *)"),
 	N_("# Which news headers you wish to see. If you want to see _all_ the headers,\n\
 # place an '*' as this value. This is the only way a wildcard can be used.\n\
 # If you enter 'X-' as the value, you will see all headers beginning with\n\
@@ -1559,7 +1657,7 @@ struct opttxt txt_news_headers_to_displa
 
 struct opttxt txt_news_headers_to_not_display = {
 	N_("Space separated list of header fields"),
-	N_("Do not display these header fields :"),
+	N_("Do not display these header fields"),
 	N_("# Same as 'news_headers_to_display' except it denotes the opposite.\n\
 # An example of using both options might be if you thought X- headers were\n\
 # A Good Thing(tm), but thought Alan and Pape were miscreants...well then you\n\
@@ -1571,14 +1669,14 @@ struct opttxt txt_news_headers_to_not_di
 
 struct opttxt txt_alternative_handling = {
 	N_("Do you want to enable automatic handling of multipart/alternative articles?"),
-	N_("Skip multipart/alternative parts   :"),
+	N_("Skip multipart/alternative parts"),
 	N_("# If ON strip multipart/alternative messages automatically\n")
 };
 
 #ifdef HAVE_COLOR
 struct opttxt txt_quote_regex = {
 	N_("A regex used to decide which lines to show in col_quote."),
-	N_("Regex used to show quoted lines    :"),
+	N_("Regex used to show quoted lines"),
 	N_("# A regular expression that tin will use to decide which lines are\n\
 # quoted when viewing articles. Quoted lines are shown in col_quote.\n\
 # If you leave this blank, tin will use a built in default.\n")
@@ -1586,7 +1684,7 @@ struct opttxt txt_quote_regex = {
 
 struct opttxt txt_quote_regex2 = {
 	N_("A regex used to decide which lines to show in col_quote2."),
-	N_("Regex used to show twice quoted l. :"),
+	N_("Regex used to show twice quoted l."),
 	N_("# A regular expression that tin will use to decide which lines are\n\
 # quoted twice. Twice quoted lines are shown in col_quote2.\n\
 # If you leave this blank, tin will use a built in default.\n")
@@ -1594,7 +1692,7 @@ struct opttxt txt_quote_regex2 = {
 
 struct opttxt txt_quote_regex3 = {
 	N_("A regex used to decide which lines to show in col_quote3."),
-	N_("Regex used to show >= 3 times q.l. :"),
+	N_("Regex used to show >= 3 times q.l."),
 	N_("# A regular expression that tin will use to decide which lines are\n\
 # quoted >=3 times. >=3 times quoted lines are shown in col_quote3.\n\
 # If you leave this blank, tin will use a built in default.\n")
@@ -1603,7 +1701,7 @@ struct opttxt txt_quote_regex3 = {
 
 struct opttxt txt_slashes_regex = {
 	N_("A regex used to decide which words to show in col_markslashes."),
-	N_("Regex used to highlight /slashes/  :"),
+	N_("Regex used to highlight /slashes/"),
 	N_("# A regular expression that tin will use to decide which words\n\
 # bounded by '/' are to be shown in col_markslashes.\n\
 # If you leave this blank, tin will use a built in default.\n")
@@ -1611,7 +1709,7 @@ struct opttxt txt_slashes_regex = {
 
 struct opttxt txt_stars_regex = {
 	N_("A regex used to decide which words to show in col_markstars."),
-	N_("Regex used to highlight *stars*    :"),
+	N_("Regex used to highlight *stars*"),
 	N_("# A regular expression that tin will use to decide which words\n\
 # bounded by '*' are to be shown in col_markstars.\n\
 # If you leave this blank, tin will use a built in default.\n")
@@ -1619,7 +1717,7 @@ struct opttxt txt_stars_regex = {
 
 struct opttxt txt_strokes_regex = {
 	N_("A regex used to decide which words to show in col_markstroke."),
-	N_("Regex used to highlight -strokes-  :"),
+	N_("Regex used to highlight -strokes-"),
 	N_("# A regular expression that tin will use to decide which words\n\
 # bounded by '-' are to be shown in col_markstroke.\n\
 # If you leave this blank, tin will use a built in default.\n")
@@ -1627,7 +1725,7 @@ struct opttxt txt_strokes_regex = {
 
 struct opttxt txt_underscores_regex = {
 	N_("A regex used to decide which words to show in col_markdash."),
-	N_("Regex used to highlight _underline_:"),
+	N_("Regex used to highlight _underline_"),
 	N_("# A regular expression that tin will use to decide which words\n\
 # bounded by '_' are to be shown in col_markdash.\n\
 # If you leave this blank, tin will use a built in default.\n")
@@ -1635,21 +1733,21 @@ struct opttxt txt_underscores_regex = {
 
 struct opttxt txt_strip_re_regex = {
 	N_("A regex used to find Subject prefixes to remove.  Use '|' as separator."),
-	N_("Regex with Subject prefixes        :"),
+	N_("Regex with Subject prefixes"),
 	N_("# A regular expression that tin will use to find Subject prefixes\n\
 # which will be removed before showing the header.\n")
 };
 
 struct opttxt txt_strip_was_regex = {
 	N_("A regex used to find Subject suffixes to remove.  Use '|' as separator."),
-	N_("Regex with Subject suffixes        :"),
+	N_("Regex with Subject suffixes"),
 	N_("# A regular expression that tin will use to find Subject suffixes\n\
 # which will be removed when replying or posting followup.\n")
 };
 
 struct opttxt txt_metamail_prog = {
 	N_("Enter name and options for external MIME viewer, --internal for built-in viewer"),
-	N_("MIME binary content viewer         :"),
+	N_("MIME binary content viewer"),
 	N_("# If --internal automatically use the built in MIME viewer for non-text\n\
 # parts of articles.\n\
 # Otherwise specify an external viewer program (eg, metamail) or leave blank\n\
@@ -1658,108 +1756,111 @@ struct opttxt txt_metamail_prog = {
 
 struct opttxt txt_ask_for_metamail = {
 	N_("Confirm before starting non-text viewing program"),
-	N_("Ask before using MIME viewer       :"),
+	N_("Ask before using MIME viewer"),
 	N_("# If ON tin will ask before using metamail to display MIME messages\n\
 # this only happens if metamail_prog is set to something\n")
 };
 
 struct opttxt txt_catchup_read_groups = {
 	N_("Ask to mark groups read when quitting. <SPACE> toggles & <CR> sets."),
-	N_("Catchup read groups when quitting  :"),
+	N_("Catchup read groups when quitting"),
 	N_("# If ON ask user if read groups should all be marked read\n")
 };
 
 struct opttxt txt_group_catchup_on_exit = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Catchup group using left key       :"),
+	N_("Catchup group using left key"),
 	N_("# If ON catchup group/thread when leaving with the left arrow key.\n")
 };
 
 struct opttxt txt_thread_catchup_on_exit = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Catchup thread by using left key   :"),
+	N_("Catchup thread by using left key"),
 	""
 };
 
 struct opttxt txt_confirm_choice = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Which actions require confirmation :"),
+	N_("Which actions require confirmation"),
 	N_("# What should we ask confirmation for.\n")
 };
 
 struct opttxt txt_mark_ignore_tags = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("'Mark article read' ignores tags   :"),
+	N_("'Mark article read' ignores tags"),
 	N_("# If ON the 'Mark article read' function marks only the current article.\n")
 };
 
 struct opttxt txt_url_handler = {
 	N_("Program to run to open URL's, <CR> sets, <ESC> cancels."),
-	N_("Program that opens URL's           :"),
+	N_("Program that opens URL's"),
 	N_("# The program used to open URL's. The actual URL will be appended\n")
 };
 
 struct opttxt txt_use_mouse = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Use mouse in xterm                 :"),
+	N_("Use mouse in xterm"),
 	N_("# If ON enable mouse key support on xterm terminals\n")
 };
 
 #ifdef HAVE_KEYPAD
 struct opttxt txt_use_keypad = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Use scroll keys on keypad          :"),
+	N_("Use scroll keys on keypad"),
 	N_("# If ON enable scroll keys on terminals that support it\n")
 };
 #endif /* HAVE_KEYPAD */
 
 struct opttxt txt_getart_limit = {
 	N_("Enter maximum number of article to get. <CR> sets."),
-	N_("Number of articles to get          :"),
+	N_("Number of articles to get"),
 	N_("# Number of articles to get (0=no limit), if negative sets maximum number\n\
 # of already read articles to be read before first unread one\n")
 };
 
 struct opttxt txt_recent_time = {
 	N_("Enter number of days article is considered recent. <CR> sets."),
-	N_("Article recentness time limit      :"),
+	N_("Article recentness time limit"),
 	N_("# Number of days in which article is considered recent, (0=OFF)\n")
 };
 
 struct opttxt txt_wildcard = {
 	N_("WILDMAT for normal wildcards, REGEX for full regular expression matching."),
-	N_("Wildcard matching                  :"),
-	N_("# Wildcard matching 0=(wildmat) 1=(regex)\n")
+	N_("Wildcard matching"),
+	N_("# Wildcard matching\n\
+# Possible values are (the default is marked with *):\n\
+# * 0 = wildmat\n\
+#   1 = regex\n")
 };
 
 struct opttxt txt_score_limit_kill = {
 	N_("Enter minimal score before an article is marked killed. <CR> sets."),
-	N_("Score limit (kill)                 :"),
+	N_("Score limit (kill)"),
 	N_("# Score limit before an article is marked killed\n")
 };
 
 struct opttxt txt_score_kill = {
 	N_("Enter default score to kill articles. <CR> sets."),
-	N_("Default score to kill articles     :"),
+	N_("Default score to kill articles"),
 	N_("# Default score to kill articles\n")
 };
 
 struct opttxt txt_score_limit_select = {
 	N_("Enter minimal score before an article is marked hot. <CR> sets."),
-	N_("Score limit (select)               :"),
+	N_("Score limit (select)"),
 	N_("# Score limit before an article is marked hot\n")
 };
 
 struct opttxt txt_score_select = {
 	N_("Enter default score to select articles. <CR> sets."),
-	N_("Default score to select articles   :"),
+	N_("Default score to select articles"),
 	N_("# Default score to select articles\n")
 };
 
 #ifdef XFACE_ABLE
 struct opttxt txt_use_slrnface = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Use slrnface to show ''X-Face:''s  :"),
+	N_("Use slrnface to show ''X-Face:''s"),
 	N_("# If ON using slrnface(1) to interpret the ''X-Face:'' header.\n\
 # Only useful when running in an xterm.\n")
 };
@@ -1768,214 +1869,259 @@ struct opttxt txt_use_slrnface = {
 #ifdef HAVE_COLOR
 struct opttxt txt_use_color = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Use ANSI color                     :"),
+	N_("Use ANSI color"),
 	N_("# If ON using ANSI-color\n")
 };
 
 struct opttxt txt_col_normal = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Standard foreground color          :"),
-	N_("# Standard foreground color\n")
+	N_("Standard foreground color"),
+	N_("# Standard foreground color\n\
+# Default: -1 (default color)\n")
 };
 
 struct opttxt txt_col_back = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Standard background color          :"),
-	N_("# Standard-Background-Color\n")
+	N_("Standard background color"),
+	N_("# Standard background color\n\
+# Default: -1 (default color)\n")
 };
 
 struct opttxt txt_col_invers_bg = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color for inverse text (background):"),
-	N_("# Color of background for inverse text\n")
+	N_("Color for inverse text (background)"),
+	N_("# Color of background for inverse text\n\
+# Default: 4 (blue)\n")
 };
 
 struct opttxt txt_col_invers_fg = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color for inverse text (foreground):"),
-	N_("# Color of foreground for inverse text\n")
+	N_("Color for inverse text (foreground)"),
+	N_("# Color of foreground for inverse text\n\
+# Default: 7 (white)\n")
 };
 
 struct opttxt txt_col_text = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of text lines                :"),
-	N_("# Color of text-lines\n")
+	N_("Color of text lines"),
+	N_("# Color of text lines\n\
+# Default: -1 (default color)\n")
 };
 
 struct opttxt txt_col_minihelp = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of mini help menu            :"),
-	N_("# Color of mini help menu\n")
+	N_("Color of mini help menu"),
+	N_("# Color of mini help menu\n\
+# Default: 3 (brown)\n")
 };
 
 struct opttxt txt_col_help = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of help text                 :"),
-	N_("# Color of help pages\n")
+	N_("Color of help text"),
+	N_("# Color of help pages\n\
+# Default: -1 (default color)\n")
 };
 
 struct opttxt txt_col_message = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of status messages           :"),
-	N_("# Color of messages in last line\n")
+	N_("Color of status messages"),
+	N_("# Color of messages in last line\n\
+# Default: 6 (cyan)\n")
 };
 
 struct opttxt txt_col_quote = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of quoted lines              :"),
-	N_("# Color of quote-lines\n")
+	N_("Color of quoted lines"),
+	N_("# Color of quote-lines\n\
+# Default: 2 (green)\n")
 };
 
 struct opttxt txt_col_quote2 = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of twice quoted line         :"),
-	N_("# Color of twice quoted lines\n")
+	N_("Color of twice quoted line"),
+	N_("# Color of twice quoted lines\n\
+# Default: 3 (brown)\n")
 };
 
 struct opttxt txt_col_quote3 = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of =>3 times quoted line     :"),
-	N_("# Color of >=3 times quoted lines\n")
+	N_("Color of =>3 times quoted line"),
+	N_("# Color of >=3 times quoted lines\n\
+# Default: 4 (blue)\n")
 };
 
 struct opttxt txt_col_head = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of article header lines      :"),
-	N_("# Color of header-lines\n")
+	N_("Color of article header lines"),
+	N_("# Color of header-lines\n\
+# Default: 2 (green)\n")
 };
 
 struct opttxt txt_col_newsheaders = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of actual news header fields :"),
-	N_("# Color of actual news header fields\n")
+	N_("Color of actual news header fields"),
+	N_("# Color of actual news header fields\n\
+# Default: 9 (light red)\n")
 };
 
 struct opttxt txt_col_subject = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of article subject lines     :"),
-	N_("# Color of article subject\n")
+	N_("Color of article subject lines"),
+	N_("# Color of article subject\n\
+# Default: 6 (cyan)\n")
 };
 
 struct opttxt txt_col_response = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of response counter          :"),
-	N_("# Color of response counter\n")
+	N_("Color of response counter"),
+	N_("# Color of response counter\n\
+# Default: 2 (green)\n")
 };
 
 struct opttxt txt_col_from = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of sender (From:)            :"),
-	N_("# Color of sender (From:)\n")
+	N_("Color of sender (From:)"),
+	N_("# Color of sender (From:)\n\
+# Default: 2 (green)\n")
 };
 
 struct opttxt txt_col_title = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of help/mail sign            :"),
-	N_("# Color of Help/Mail-Sign\n")
+	N_("Color of help/mail sign"),
+	N_("# Color of Help/Mail-Sign\n\
+# Default: 4 (blue)\n")
 };
 
 struct opttxt txt_col_signature = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of signatures                :"),
-	N_("# Color of signature\n")
+	N_("Color of signatures"),
+	N_("# Color of signature\n\
+# Default: 4 (blue)\n")
+};
+
+struct opttxt txt_col_urls = {
+	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
+	N_("Color of highlighted URLs"),
+	N_("# Color of highlighted URLs\n\
+# Default: -1 (default color)\n")
 };
 
 struct opttxt txt_col_markstar = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of highlighting with *stars* :"),
-	N_("# Color of word highlighting. There are four possibilities\n\
-# in articles: *stars*, /slashes/, _underdashes_ and -strokes-.\n")
+	N_("Color of highlighting with *stars*"),
+	N_("# Color of word highlighting with *stars*\n\
+# Default: 11 (yellow)\n")
 };
 
 struct opttxt txt_col_markdash = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of highlighting with _dash_  :"),
-	""
+	N_("Color of highlighting with _dash_"),
+	N_("# Color of word highlighting with _dash_\n\
+# Default: 13 (light pink)\n")
 };
 
 struct opttxt txt_col_markslash = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of highlighting with /slash/ :"),
-	""
+	N_("Color of highlighting with /slash/"),
+	N_("# Color of word highlighting with /slash/\n\
+# Default: 14 (light cyan)\n")
 };
 
 struct opttxt txt_col_markstroke = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Color of highlighting with -stroke-:"),
-	""
+	N_("Color of highlighting with -stroke-"),
+	N_("# Color of word highlighting with -stroke-\n\
+# Default: 12 (light blue)\n")
 };
 #endif /* HAVE_COLOR */
 
 struct opttxt txt_mono_markstar = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Attr. of highlighting with *stars* :"),
-	N_("# Attribute of word highlighting on mono terminals.\n\
-# There are four possibilities in articles:\n\
-# *stars*, /slashes/, _underdashes_ and -strokes-.\n\
-# The possible values are:\n\
-# 0 - Normal, 1 - Underline, 2 - Best highlighting,\n\
-# 3 - Reverse video, 4 - Blinking, 5 - Half bright, 6 - Bold\n")
+	N_("Attr. of highlighting with *stars*"),
+	N_("# Attributes of word highlighting on mono terminals\n\
+# Possible values are:\n\
+#   0 = Normal\n\
+#   1 = Underline\n\
+#   2 = Best highlighting\n\
+#   3 = Reverse video\n\
+#   4 = Blinking\n\
+#   5 = Half bright\n\
+#   6 = Bold\n\n\
+# Attribute of word highlighting with *stars*\n\
+# Default: 6 (bold)\n")
 };
 
 struct opttxt txt_mono_markdash = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Attr. of highlighting with _dash_  :"),
-	""
+	N_("Attr. of highlighting with _dash_"),
+	N_("# Attribute of word highlighting with _dash_\n\
+# Default: 2 (best highlighting)\n")
 };
 
 struct opttxt txt_mono_markslash = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Attr. of highlighting with /slash/ :"),
-	""
+	N_("Attr. of highlighting with /slash/"),
+	N_("# Attribute of word highlighting with /slash/\n\
+# Default: 5 (half bright)\n")
 };
 
 struct opttxt txt_mono_markstroke = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Attr. of highlighting with -stroke-:"),
-	""
+	N_("Attr. of highlighting with -stroke-"),
+	N_("# Attribute of word highlighting with -stroke-\n\
+# Default: 3 (reverse video)\n")
+};
+
+struct opttxt txt_url_highlight = {
+	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
+	N_("URL highlighting in message body"),
+	N_("# Enable URL highlighting?\n")
 };
 
 struct opttxt txt_word_highlight = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Word highlighting in message body  :"),
+	N_("Word highlighting in message body"),
 	N_("# Enable word highlighting?\n")
 };
 
 struct opttxt txt_word_h_display_marks = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("What to display instead of mark    :"),
+	N_("What to display instead of mark"),
 	N_("# Should the leading and ending stars and dashes also be displayed,\n\
 # even when they are highlighting marks?\n\
-# 0 - no    1 - yes, display mark    2 - print a space instead\n")
+# Possible values are (the default is marked with *):\n\
+#   0 = no\n\
+#   1 = yes, display mark\n\
+# * 2 = print a space instead\n")
 };
 
 struct opttxt txt_wrap_column = {
 	N_("Enter column number to wrap article lines to in the pager. <CR> sets."),
-	N_("Page line wrap column              :"),
+	N_("Page line wrap column"),
 	N_("# Wrap article lines at column\n")
 };
 
 struct opttxt txt_wrap_on_next_unread = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Wrap around threads on next unread :"),
+	N_("Wrap around threads on next unread"),
 	N_("# If ON wrap around threads on searching next unread article\n")
 };
 
 struct opttxt txt_mail_address = {
 	N_("Enter default mail address (and fullname). <CR> sets."),
-	N_("Mail address (and fullname)        :"),
+	N_("Mail address (and fullname)"),
 	N_("# User's mail address (and fullname), if not username@host (fullname)\n")
 };
 
 struct opttxt txt_prompt_followupto = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Show empty Followup-To in editor   :"),
+	N_("Show empty Followup-To in editor"),
 	N_("# If ON show empty Followup-To header when editing an article\n")
 };
 
 struct opttxt txt_sigfile = {
 	N_("Enter path/! command/--none to create your default signature. <CR> sets."),
-	N_("Create signature from path/command :"),
+	N_("Create signature from path/command"),
 	N_("# Signature path (random sigs)/file to be used when posting/replying\n\
 # default_sigfile=file       appends file as signature\n\
 # default_sigfile=!command   executes external command to generate a signature\n\
@@ -1984,40 +2130,41 @@ struct opttxt txt_sigfile = {
 
 struct opttxt txt_sigdashes = {
 	N_("Prepend signature with \"-- \" on own line. <SPACE> toggles & <CR> sets."),
-	N_("Prepend signature with \"-- \"       :"),
+	N_("Prepend signature with \"-- \""),
 	N_("# If ON prepend the signature with dashes '\\n-- \\n'\n")
 };
 
 struct opttxt txt_signature_repost = {
 	N_("Add signature when reposting articles. <SPACE> toggles & <CR> sets."),
-	N_("Add signature when reposting       :"),
+	N_("Add signature when reposting"),
 	N_("# If ON add signature to reposted articles\n")
 };
 
 struct opttxt txt_quote_chars = {
 	N_("Enter quotation marks, %s or %S for author's initials."),
-	N_("Characters used as quote-marks     :"),
+	N_("Characters used as quote-marks"),
 	N_("# Characters used in quoting to followups and replies.\n\
 # '_' is replaced by ' ', %%s, %%S are replaced by author's initials.\n")
 };
 
 struct opttxt txt_quote_style = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Quoting behavior                   :"),
+	N_("Quoting behavior"),
 	N_("# How quoting should be handled when following up or replying.\n\
-# 0 = Nothing special\n\
-# 1 = Compress quotes\n\
-# 2 = Quote signatures\n\
-# 3 = Compress quotes, quote signatures\n\
-# 4 = Quote empty lines\n\
-# 5 = Compress quotes, quote empty lines\n\
-# 6 = Quote signatures, quote empty lines\n\
-# 7 = Compress quotes, quote signatures, quote empty lines\n")
+# Possible values are (the default is marked with *):\n\
+#   0 = Nothing special\n\
+#   1 = Compress quotes\n\
+#   2 = Quote signatures\n\
+#   3 = Compress quotes, quote signatures\n\
+#   4 = Quote empty lines\n\
+# * 5 = Compress quotes, quote empty lines\n\
+#   6 = Quote signatures, quote empty lines\n\
+#   7 = Compress quotes, quote signatures, quote empty lines\n")
 };
 
 struct opttxt txt_news_quote_format = {
 	N_("%A Addr %D Date %F Addr+Name %G Groupname %M Message-ID %N Name %C First Name"),
-	N_("Quote line when following up       :"),
+	N_("Quote line when following up"),
 	N_("# Format of quote line when mailing/posting/following-up an article\n\
 # %%A Address    %%D Date   %%F Addr+Name   %%G Groupname   %%M Message-ID\n\
 # %%N Full Name  %%C First Name   %%I Initials\n")
@@ -2025,25 +2172,26 @@ struct opttxt txt_news_quote_format = {
 
 struct opttxt txt_xpost_quote_format = {
 	N_("%A Addr %D Date %F Addr+Name %G Groupname %M Message-ID %N Name %C First Name"),
-	N_("Quote line when cross-posting      :"),
+	N_("Quote line when cross-posting"),
 	""
 };
 
 struct opttxt txt_mail_quote_format = {
 	N_("%A Addr %D Date %F Addr+Name %G Groupname %M Message-ID %N Name %C First Name"),
-	N_("Quote line when mailing            :"),
+	N_("Quote line when mailing"),
 	""
 };
 
 struct opttxt txt_advertising = {
 	N_("If ON, include User-Agent: header. <SPACE> toggles & <CR> sets."),
-	N_("Insert 'User-Agent:'-header        :"),
+	N_("Insert 'User-Agent:'-header"),
 	N_("# If ON include advertising User-Agent: header\n")
 };
 
+#ifndef CHARSET_CONVERSION
 struct opttxt txt_mm_charset = {
 	N_("Enter charset name for MIME (e.g. US-ASCII, ISO-8859-1, EUC-KR), <CR> to set."),
-	N_("MM_CHARSET                         :"),
+	N_("MM_CHARSET"),
 	N_("# Charset supported locally which is also used for MIME header and\n\
 # Content-Type header.\n\
 # If not set, the value of the environment variable MM_CHARSET is used.\n\
@@ -2051,24 +2199,23 @@ struct opttxt txt_mm_charset = {
 # If MIME_STRICT_CHARSET is defined at compile-time, charset other than\n\
 # mm_charset is considered not displayable and represented as '?'.\n")
 };
-
-#ifdef CHARSET_CONVERSION
+#else
 struct opttxt txt_mm_network_charset = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("MM_NETWORK_CHARSET                 :"),
+	N_("MM_NETWORK_CHARSET"),
 	N_("# Charset used for MIME (Content-Type) header in postings.\n")
 };
-#endif /* CHARSET_CONVERSION */
+#endif /* !CHARSET_CONVERSION */
 
 struct opttxt txt_mailbox_format = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Mailbox format                     :"),
+	N_("Mailbox format"),
 	N_("# Format of the mailbox.\n")
 };
 
 struct opttxt txt_post_mime_encoding = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("MIME encoding in news messages     :"),
+	N_("MIME encoding in news messages"),
 	N_("# MIME encoding (8bit, base64, quoted-printable, 7bit) of the body\n\
 # for mails and posts, if necessary. QP is efficient for most European\n\
 # character sets (ISO-8859-X) with small fraction of non-US-ASCII chars,\n\
@@ -2078,7 +2225,7 @@ struct opttxt txt_post_mime_encoding = {
 
 struct opttxt txt_post_8bit_header = {
 	N_("Don't change unless you know what you are doing. <ESC> cancels."),
-	N_("Use 8bit characters in news headers:"),
+	N_("Use 8bit characters in news headers"),
 	N_("# If ON, 8bit characters in news headers are NOT encoded.\n\
 # default is OFF. Thus 8bit characters are encoded by default.\n\
 # 8bit chars in header are encoded regardless of the value of this\n\
@@ -2087,19 +2234,19 @@ struct opttxt txt_post_8bit_header = {
 
 struct opttxt txt_post_process_view = {
 	N_("Auto-view post-processed files <SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("View post-processed files          :"),
+	N_("View post-processed files"),
 	N_("# If set, post processed files will be opened in a viewer\n")
 };
 
 struct opttxt txt_mail_mime_encoding = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("MIME encoding in mail messages     :"),
+	N_("MIME encoding in mail messages"),
 	""
 };
 
 struct opttxt txt_mail_8bit_header = {
 	N_("Don't change unless you know what you are doing. <ESC> cancels."),
-	N_("Use 8bit characters in mail headers:"),
+	N_("Use 8bit characters in mail headers"),
 	N_("# If ON, 8bit characters in mail headers are NOT encoded.\n\
 # default is OFF. Thus 8bit characters are encoded by default.\n\
 # 8bit chars in headers are encoded regardless of the value of this parameter\n\
@@ -2110,14 +2257,14 @@ struct opttxt txt_mail_8bit_header = {
 
 struct opttxt txt_strip_blanks = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Strip blanks from ends of lines    :"),
+	N_("Strip blanks from ends of lines"),
 	N_("# If ON strip blanks from ends of lines for faster display on slow terminals.\n")
 };
 
 #ifdef HAVE_ICONV_OPEN_TRANSLIT
 struct opttxt txt_translit = {
 	N_("If ON, use transliteration. <SPACE> toggles & <CR> sets."),
-	N_("Transliteration                    :"),
+	N_("Transliteration"),
 	N_("# If ON, use //TRANSLIT extension. This means that when a character cannot\n\
 # be represented in the in the target character set, it can be approximated\n\
 # through one or several similarly looking characters.\n")
@@ -2126,182 +2273,218 @@ struct opttxt txt_translit = {
 
 struct opttxt txt_auto_cc = {
 	N_("Send you a carbon copy automatically. <SPACE> toggles & <CR> sets."),
-	N_("Send you a cc automatically        :"),
+	N_("Send you a cc automatically"),
 	N_("# If ON automatically put your name in the Cc: field when mailing an article\n")
 };
 
 struct opttxt txt_auto_bcc = {
 	N_("Send you a blind carbon copy automatically. <SPACE> toggles & <CR> sets."),
-	N_("Send you a blind cc automatically  :"),
+	N_("Send you a blind cc automatically"),
 	N_("# If ON automatically put your name in the Bcc: field when mailing an article\n")
 };
 
 struct opttxt txt_spamtrap_warning_addresses = {
 	N_("Enter address elements about which you want to be warned. <CR> sets."),
-	N_("Spamtrap warning address parts     :"),
+	N_("Spamtrap warning address parts"),
 	N_("# A comma-delimited list of address-parts you want to be warned\n\
 # about when trying to reply by email.\n")
 };
 
 struct opttxt txt_filter_days = {
 	N_("Enter default number of days a filter entry will be valid. <CR> sets."),
-	N_("No. of days a filter entry is valid:"),
+	N_("No. of days a filter entry is valid"),
 	N_("# Number of days a short term filter will be active\n")
 };
 
 struct opttxt txt_add_posted_to_filter = {
 	N_("Add posted articles to filter. <SPACE> toggles & <CR> sets."),
-	N_("Add posted articles to filter      :"),
+	N_("Add posted articles to filter"),
 	N_("# If ON add posted articles which start a new thread to filter for\n# highlighting follow-ups\n")
 };
 
 struct opttxt txt_maildir = {
 	N_("The directory where articles/threads are to be saved in mailbox format."),
-	N_("Mail directory                     :"),
+	N_("Mail directory"),
 	N_("# (-m) directory where articles/threads are saved in mailbox format\n")
 };
 
 struct opttxt txt_batch_save = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Save articles in batch mode (-S)   :"),
+	N_("Save articles in batch mode (-S)"),
 	N_("# If ON articles/threads will be saved in batch mode when save -S\n\
 # or mail (-M/-N) is specified on the command line\n")
 };
 
 struct opttxt txt_savedir = {
 	N_("The directory where you want articles/threads saved."),
-	N_("Directory to save arts/threads in  :"),
+	N_("Directory to save arts/threads in"),
 	N_("# Directory where articles/threads are saved\n")
 };
 
 struct opttxt txt_auto_save = {
 	N_("Auto save article/thread by Archive-name: header. <SPACE> toggles & <CR> sets."),
-	N_("Use Archive-name: header for save  :"),
+	N_("Use Archive-name: header for save"),
 	N_("# If ON articles/threads with Archive-name: in mail header will\n\
 # be automatically saved with the Archive-name & part/patch no.\n")
 };
 
 struct opttxt txt_mark_saved_read = {
 	N_("Mark saved articles/threads as read. <SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Mark saved articles/threads as read:"),
+	N_("Mark saved articles/threads as read"),
 	N_("# If ON mark articles that are saved as read\n")
 };
 
 struct opttxt txt_post_process = {
 	N_("Do post processing (eg. extract attachments) for saved articles."),
-	N_("Post process saved articles        :"),
+	N_("Post process saved articles"),
 	N_("# Perform post processing (saving binary attachments) from saved articles.\n\
-# 0=(no) 1=(yes) 2=(extract shell archives (shar) only)\n")
+# Possible values are (the default is marked with *):\n\
+# * 0 = no\n\
+#   1 = extract shell archives (shar) only\n\
+#   2 = yes\n")
 };
 
 struct opttxt txt_process_only_unread = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Process only unread articles       :"),
+	N_("Process only unread articles"),
 	N_("# If ON only save/print/pipe/mail unread articles (tagged articles excepted)\n")
 };
 
 #ifndef DISABLE_PRINTING
 struct opttxt txt_print_header = {
 	N_("Print all or just part of header. <SPACE> toggles & <CR> sets."),
-	N_("Print all headers when printing    :"),
+	N_("Print all headers when printing"),
 	N_("# If ON print all of article header otherwise just the important lines\n")
 };
 
 struct opttxt txt_printer = {
 	N_("The printer program with options that is to be used to print articles/threads."),
-	N_("Printer program with options       :"),
+	N_("Printer program with options"),
 	N_("# Print program with parameters used to print articles/threads\n"),
 };
 #endif /* !DISABLE_PRINTING */
 
 struct opttxt txt_force_screen_redraw = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Force redraw after certain commands:"),
+	N_("Force redraw after certain commands"),
 	N_("# If ON a screen redraw will always be done after certain external commands\n")
 };
 
 struct opttxt txt_start_editor_offset = {
 	N_("Start editor with line offset. <SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Start editor with line offset      :"),
+	N_("Start editor with line offset"),
 	N_("# If ON editor will be started with cursor offset into the file\n\
 # otherwise the cursor will be positioned at the first line\n")
 };
 
 struct opttxt txt_editor_format = {
 	N_("Enter %E for editor, %F for filename, %N for line-number, <CR> to set."),
-	N_("Invocation of your editor          :"),
+	N_("Invocation of your editor"),
 	N_("# Format of editor line including parameters\n\
 # %%E Editor  %%F Filename  %%N Linenumber\n")
 };
 
 struct opttxt txt_inews_prog = {
 	N_("Enter name and options for external-inews, --internal for internal inews"),
-	N_("External inews                     :"),
+	N_("External inews"),
 	N_("# If --internal use the built in mini inews for posting via NNTP\n# otherwise use an external inews program\n"),
 };
 
 struct opttxt txt_mailer_format = {
 	N_("Enter %M for mailer, %S for subject, %T for to, %F for filename, <CR> to set."),
-	N_("Invocation of your mail command    :"),
+	N_("Invocation of your mail command"),
 	N_("# Format of mailer line including parameters\n\
-# %%M Mailer  %%S Subject  %%T To  %%F Filename  %%U User (AmigaDOS)\n\
+# %%M Mailer  %%S Subject  %%T To  %%F Filename\n\
 # ie. to use elm as your mailer:    elm -s \"%%S\" \"%%T\" < %%F\n\
 # ie. elm interactive          :    elm -i %%F -s \"%%S\" \"%%T\"\n")
 };
 
-struct opttxt txt_use_mailreader_i = {
+struct opttxt txt_interactive_mailer = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Use interactive mail reader        :"),
-	N_("# Interactive mailreader: if ON mailreader will be invoked earlier for\n\
-# reply so you can use more of its features (eg. MIME, pgp, ...)\n\
-# this option has to suit default_mailer_format\n")
+	N_("Use interactive mail reader"),
+	N_("# Interactive mailreader\n\
+# Possible values are (the default is marked with *):\n\
+# * 0 = no interactive mailreader\n\
+#   1 = use interactive mailreader with headers in file\n\
+#   2 = use interactive mailreader without headers in file\n")
 };
 
 struct opttxt txt_unlink_article = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Remove ~/.article after posting    :"),
+	N_("Remove ~/.article after posting"),
 	N_("# If ON remove ~/.article after posting.\n")
 };
 
 struct opttxt txt_posted_articles_file = {
 	N_("Filename for all posted articles, <CR> sets, no filename=do not save."),
-	N_("Filename for posted articles       :"),
+	N_("Filename for posted articles"),
 	N_("# Filename where to keep all postings (default posted)\n\
 # If no filename is set then postings will not be saved\n")
 };
 
 struct opttxt txt_keep_dead_articles = {
 	N_("Keep all failed articles in ~/dead.articles. <SPACE> toggles & <CR> sets."),
-	N_("Keep failed arts in ~/dead.articles:"),
+	N_("Keep failed arts in ~/dead.articles"),
 	N_("# If ON keep all failed postings in ~/dead.articles\n")
 };
 
 struct opttxt txt_strip_newsrc = {
 	N_("Do you want to strip unsubscribed groups from .newsrc"),
-	N_("No unsubscribed groups in newsrc   :"),
+	N_("No unsubscribed groups in newsrc"),
 	N_("# If ON strip unsubscribed groups from newsrc\n")
 };
 
 struct opttxt txt_strip_bogus = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Remove bogus groups from newsrc    :"),
-	N_("# What to do with bogus groups in newsrc file\n# 0=(Keep) 1=(Remove) 2=(Highlight with D on selection screen).\n")
+	N_("Remove bogus groups from newsrc"),
+	N_("# What to do with bogus groups in newsrc file\n\
+# Possible values are (the default is marked with *):\n\
+# * 0 = keep\n\
+#   1 = remove\n\
+#   2 = highlight with D on selection screen\n")
 };
 
 struct opttxt txt_reread_active_file_secs = {
 	N_("Enter number of seconds until active file will be reread. <CR> sets."),
-	N_("Interval in secs to reread active  :"),
+	N_("Interval in secs to reread active"),
 	N_("# Time interval in seconds between rereading the active file (0=never)\n")
 };
 
 struct opttxt txt_auto_reconnect = {
 	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
-	N_("Reconnect to server automatically  :"),
+	N_("Reconnect to server automatically"),
 	N_("# If ON automatically reconnect to NNTP server if the connection is broken\n")
 };
 
 struct opttxt txt_cache_overview_files = {
 	N_("Create local copies of NNTP overview files. <SPACE> toggles & <CR> sets."),
-	N_("Cache NNTP overview files locally  :"),
+	N_("Cache NNTP overview files locally"),
 	N_("# If ON, create local copies of NNTP overview files.\n")
 };
+
+struct opttxt txt_date_format = {
+	N_("Enter format string. <CR> sets, <ESC> cancels."),
+	N_("Format string for display of dates"),
+	N_("# Format string for date representation\n")
+};
+
+#ifdef HAVE_UNICODE_NORMALIZATION
+struct opttxt txt_normalization_form = {
+	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
+	N_("Unicode normalization form"),
+	N_("# Unicode normalization form\n\
+# Possible values are (the default is marked with *):\n\
+#   0 = None\n\
+# * 1 = NFKC\n\
+#   2 = NFKD\n\
+#   3 = NFC\n\
+#   4 = NFD\n")
+};
+#endif /* HAVE_UNICODE_NORMALIZATION */
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && defined(HAVE_UNICODE_UBIDI_H) && !defined(NO_LOCALE)
+struct opttxt txt_render_bidi = {
+	N_("<SPACE> toggles, <CR> sets, <ESC> cancels."),
+	N_("Render BiDi"),
+	N_("# If ON, bi-directional text is rendered by tin\n")
+};
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && HAVE_UNICODE_UBIDI_H && !NO_LOCALE */
diff -Nurp tin-1.6.2/src/langinfo.c tin-1.8.0/src/langinfo.c
--- tin-1.6.2/src/langinfo.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/langinfo.c	2005-12-02 12:07:36.000000000 +0100
@@ -41,16 +41,17 @@
 #	endif /* !TIN_H */
 #endif /* 0 */
 
-#ifndef HAVE_LANGINFO_CODESET
-#	define C_CODESET "US-ASCII"     /* Return this as the encoding of the
+#ifndef NO_LOCALE
+#	ifndef HAVE_LANGINFO_CODESET
+#		define C_CODESET "US-ASCII"     /* Return this as the encoding of the
 				  * C/POSIX locale. Could as well one day
 				  * become "UTF-8". */
 
-#	define digit(x) ((x) >= '0' && (x) <= '9')
+#		define digit(x) ((x) >= '0' && (x) <= '9')
 
 static char buf[16];
 
-char *
+const char *
 tin_nl_langinfo(
 	nl_item item)
 {
@@ -115,11 +116,19 @@ tin_nl_langinfo(
   }
   return C_CODESET;
 }
-#else
-char *
+#	else
+const char *
 tin_nl_langinfo(
 	nl_item item)
 {
 	return nl_langinfo(item);
 }
-#endif /* !HAVE_LANGINFO_CODESET */
+#	endif /* !HAVE_LANGINFO_CODESET */
+#else
+static void no_langinfo(void);
+static void
+no_langinfo(	/* ANSI C requires non-empty source file */
+	void)
+{
+}
+#endif /* !NO_LOCALE */
diff -Nurp tin-1.6.2/src/list.c tin-1.8.0/src/list.c
--- tin-1.6.2/src/list.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/list.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : list.c
  *  Author    : I. Lea
  *  Created   : 1993-12-18
- *  Updated   : 2002-05-13
+ *  Updated   : 2005-07-20
  *  Notes     : Low level functions handling the active[] list and its group_hash index
  *
- * Copyright (c) 1993-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1993-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,9 +38,11 @@
 #ifndef TIN_H
 #	include "tin.h"
 #endif /* !TIN_H */
-#ifndef TCURSES_H
-#	include "tcurses.h"
-#endif /* !TCURSES_H */
+#ifdef DEBUG
+#	ifndef TCURSES_H
+#		include "tcurses.h"
+#	endif /* !TCURSES_H */
+#endif /* DEBUG */
 
 static int group_hash[TABLE_SIZE];	/* group name --> active[] */
 
@@ -93,7 +95,9 @@ hash_groupname(
 		}
 	}
 	hash_value = hash % prime;
+#	ifdef DEBUG
 /*	my_printf("hash=[%s] [%ld]\n", group, hash_value); */
+#	endif /* DEBUG */
 #else
 	unsigned long hash_value = 0L;
 	unsigned int len = 0;
diff -Nurp tin-1.6.2/src/lock.c tin-1.8.0/src/lock.c
--- tin-1.6.2/src/lock.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/lock.c	2005-12-02 12:07:36.000000000 +0100
@@ -6,7 +6,7 @@
  *  Updated   : 2003-05-16
  *  Notes     :
  *
- * Copyright (c) 1998-2003 Urs Janssen <urs@tin.org>
+ * Copyright (c) 1998-2006 Urs Janssen <urs@tin.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -62,7 +62,7 @@
  *
  * try to lock a file descriptor with fcntl(), flock() or lockf()
  *
- * returncodes:
+ * return codes:
  *  0 = file locked successfully
  * -1 = some error occured
  */
@@ -105,7 +105,7 @@ fd_lock(
  * check for an existing lock on file descriptor with fcntl(), lockf()
  * or flock()
  *
- * returncodes:
+ * return codes:
  *  0 = file is not locked
  *  1 = file is locked
  * -1 = some error occured
@@ -167,7 +167,7 @@ test_fd_lock(
  *
  * try to unlock a file descriptor with fcntl(), lockf() or flock()
  *
- * returncodes:
+ * return codes:
  *  0 = file unlocked successfully
  * -1 = some error occured
  */
@@ -209,7 +209,7 @@ fd_unlock(
  *
  * try to lock filename via dotfile locking
  *
- * returncodes:
+ * return codes:
  *  TRUE  = file locked successfully
  *  FALSE = some error occured
  */
@@ -219,16 +219,15 @@ t_bool dot_lock(
 	char tempfile[PATH_LEN];
 	char lockfile[PATH_LEN];
 	char base_dir[PATH_LEN];
-	int dot_fd = -1;
+	int dot_fd;
 	struct stat statbuf;
 	t_bool rval = FALSE;
 
 	dir_name(filename, base_dir);
 	if (!strcmp(filename, base_dir)) /* no filename portion */
 		return rval;
-	if ((dot_fd = my_tmpfile(tempfile, sizeof(tempfile) - 1, TRUE, base_dir)) == -1) {
+	if ((dot_fd = my_tmpfile(tempfile, sizeof(tempfile) - 1, TRUE, base_dir)) == -1)
 		return rval;
-	}
 	snprintf(lockfile, sizeof(lockfile), "%s%s", filename, LOCK_SUFFIX);
 
 #ifdef HAVE_LINK
@@ -256,7 +255,7 @@ t_bool dot_lock(
 /*
  * try to remove a dotlock for filename
  *
- * returncodes:
+ * return codes:
  *  TRUE  = file unlocked successfully
  *  FALSE = some error occured
  */
diff -Nurp tin-1.6.2/src/mail.c tin-1.8.0/src/mail.c
--- tin-1.6.2/src/mail.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/mail.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : mail.c
  *  Author    : I. Lea
  *  Created   : 1992-10-02
- *  Updated   : 2003-03-24
+ *  Updated   : 2005-08-14
  *  Notes     : Mail handling routines for creating pseudo newsgroups
  *
- * Copyright (c) 1992-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1992-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -45,17 +45,42 @@
 /*
  * local prototypes
  */
+static FILE *open_newsgroups_fp(void);
 static void read_groups_descriptions(FILE *fp, FILE *fp_save);
 static void read_newsgroups_file(t_bool verb);
 #ifdef HAVE_MH_MAIL_HANDLING
+	static FILE *open_mail_active_fp(const char *mode);
+	static FILE *open_mailgroups_fp(void);
 	static void read_mailgroups_file(t_bool verb);
 #endif /* HAVE_MH_MAIL_HANDLING */
 
 
+#ifdef HAVE_MH_MAIL_HANDLING
+/*
+ * Open the mail active file locally
+ */
+static FILE *
+open_mail_active_fp(
+	const char *mode)
+{
+	return fopen(mail_active_file, mode);
+}
+
+
+/*
+ * Open mail groups description file locally
+ */
+static FILE *
+open_mailgroups_fp(
+	void)
+{
+	return fopen(mailgroups_file, "r");
+}
+
+
 /*
  * Load the mail active file into active[]
  */
-#ifdef HAVE_MH_MAIL_HANDLING
 void
 read_mail_active_file(
 	void)
@@ -116,8 +141,8 @@ read_mail_active_file(
 		strfpath(my_spooldir, buf2, sizeof(buf2) - 1, ptr);
 		ptr->spooldir = my_strdup(buf2);
 		group_get_art_info(ptr->spooldir, buf, GROUP_TYPE_MAIL, &ptr->count, &ptr->xmax, &ptr->xmin);
-		ptr->aliasedto = (char *) 0;
-		ptr->description = (char *) 0;
+		ptr->aliasedto = NULL;
+		ptr->description = NULL;
 		ptr->moderated = 'y';
 		ptr->type = GROUP_TYPE_MAIL;
 		ptr->inrange = FALSE;
@@ -214,16 +239,46 @@ read_mailgroups_file(
 
 
 /*
- * read group descriptions for news (and mailgroups)
+ * If reading via NNTP the newsgroups file will be saved to ~/.tin/newsgroups
+ * so that any subsequent rereads on the active file will not have to waste
+ * net bandwidth and the local copy of the newsgroups file can be accessed.
  */
-void
-read_descriptions(
-	t_bool verb)
+static FILE *
+open_newsgroups_fp(
+	void)
 {
-#ifdef HAVE_MH_MAIL_HANDLING
-	read_mailgroups_file(verb);
-#endif /* HAVE_MH_MAIL_HANDLING */
-	read_newsgroups_file(verb);
+#ifdef NNTP_ABLE
+	FILE *result;
+
+	if (read_news_via_nntp && !read_saved_news) {
+		if (read_local_newsgroups_file) {
+			struct stat buf;
+
+			if (!stat(local_newsgroups_file, &buf)) {
+				if (buf.st_size > 0) {
+					if ((result = fopen(local_newsgroups_file, "r")) != NULL) {
+#	ifdef DEBUG
+						debug_nntp("open_newsgroups_fp", "Using local copy of newsgroups file");
+#	endif /* DEBUG */
+						return result;
+					}
+				} else
+					unlink(local_newsgroups_file);
+			}
+		}
+#	if 0 /* TODO: */
+		if (list_newsgroups_wildmat_supported && newsrc_active
+		    && !list_active && num_active < some_useful_limit) {
+			for_each_group(i) {
+				snprintf(buff, sizeof(buff), "LIST NEWSGROUPS %s", active[i].name);
+				nntp_command(buff, OK_LIST, NULL, 0);
+			}
+		} else
+#	endif /* 0 */
+		return (nntp_command("LIST NEWSGROUPS", OK_GROUPS, NULL, 0));
+	} else
+#endif /* NNTP_ABLE */
+		return fopen(newsgroups_file, "r");
 }
 
 
@@ -242,8 +297,12 @@ read_newsgroups_file(
 		if (!batch_mode && verb)
 			wait_message(0, _(txt_reading_newsgroups_file));
 
-		if (read_news_via_nntp && !read_local_newsgroups_file && !no_write)
-			fp_save = fopen(local_newsgroups_file, "w" FOPEN_OPTS);
+		if (read_news_via_nntp && !no_write) {
+			struct stat buf;
+
+			if (stat(local_newsgroups_file, &buf) || !read_local_newsgroups_file)
+				fp_save = fopen(local_newsgroups_file, "w" FOPEN_OPTS);
+		}
 
 		read_groups_descriptions(fp, fp_save);
 
@@ -261,6 +320,20 @@ read_newsgroups_file(
 
 
 /*
+ * read group descriptions for news (and mailgroups)
+ */
+void
+read_descriptions(
+	t_bool verb)
+{
+#ifdef HAVE_MH_MAIL_HANDLING
+	read_mailgroups_file(verb);
+#endif /* HAVE_MH_MAIL_HANDLING */
+	read_newsgroups_file(verb);
+}
+
+
+/*
  * Read groups descriptions from opened file & make local backup copy
  * of all groups that don't have a 'x' in the active file moderated
  * field & if reading groups of type GROUP_TYPE_NEWS.
@@ -273,7 +346,7 @@ read_groups_descriptions(
 	FILE *fp_save)
 {
 	char *p, *q, *ptr;
-	char *groupname = (char *) 0;
+	char *groupname = NULL;
 	int count = 0;
 	size_t space = 0;
 	struct t_group *group;
@@ -289,7 +362,7 @@ read_groups_descriptions(
 		 * newsgroups file to only subscribed-to groups when tin is called
 		 * with the "-q" option.
 		 */
-		if ((fp_save != NULL) && read_news_via_nntp && !read_local_newsgroups_file)
+		if ((fp_save != NULL) && read_news_via_nntp)
 			fprintf(fp_save, "%s\n", ptr);
 
 		if (!space) { /* initial malloc */
@@ -334,7 +407,7 @@ read_groups_descriptions(
 		if (++count % 100 == 0)
 			spin_cursor();
 	}
-	free(groupname);
+	FreeIfNeeded(groupname);
 }
 
 
@@ -403,13 +476,12 @@ grp_del_mail_art(
 	struct t_article *article)
 {
 
-	if (article->delete_it) {
-		art_mark_undeleted(article);
+	if (article->delete_it)
 		info_message(_(txt_art_undeleted));
-	} else {
-		art_mark_deleted(article);
+	else
 		info_message(_(txt_art_deleted));
-	}
+
+	article->delete_it = bool_not(article->delete_it);
 }
 
 
@@ -448,7 +520,7 @@ grp_del_mail_arts(
 #if 0
 /*
  * current tin's build_references() is changed to free msgid and refs,
- * therefore we cannot call write_nov_file after it. I simply commented
+ * therefore we cannot call write_overview after it. I simply commented
  * out this codes, NovFile will update at next time.
  */
 /*
@@ -456,7 +528,7 @@ grp_del_mail_arts(
  * the active[] entry for the group and rewrite the mail.active file
  */
 		if (update_index_file)
-			write_nov_file(group);
+			write_overview(group);
 #endif /* 0 */
 	}
 }
diff -Nurp tin-1.6.2/src/main.c tin-1.8.0/src/main.c
--- tin-1.6.2/src/main.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/main.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : main.c
  *  Author    : I. Lea & R. Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 2003-07-22
+ *  Updated   : 2005-08-14
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -45,17 +45,6 @@
 #	include "version.h"
 #endif /* !VERSION_H */
 
-#if defined(M_AMIGA) && defined(__SASC_650)
-	extern int _WBArg;
-	extern char **_WBArgv;
-	char __stdiowin[] = "con:0/12/640/200/TIN " VERSION;
-	char __stdiov37[] = "/AUTO/NOCLOSE";
-#else
-#	ifdef VMS
-	int debug;
-#	endif /* VMS */
-#endif /* M_AMIGA && __SASC_650 */
-
 signed long int read_newsrc_lines = -1;
 
 static char **cmdargs;
@@ -112,16 +101,6 @@ main(
 
 	debug = 0;	/* debug OFF */
 
-#if defined(M_AMIGA) && defined(__SASC)
-	/* Call tzset() here! */
-	_TZ = "GMT0";
-	tzset();
-	if (argc == 0) { /* we are running from the Workbench */
-		argc = _WBArgc;
-		argv = _WBArgv;
-	}
-#endif /* M_AMIGA && __SASC */
-
 	base_name(argv[0], tin_progname);
 #ifdef VMS
 	argv[0] = tin_progname;
@@ -150,6 +129,7 @@ main(
 	hash_init();
 	init_selfinfo();
 	init_group_hash();
+	setup_default_keys(); /* preinit keybindings */
 
 	/*
 	 * Read user local & global config files
@@ -207,9 +187,9 @@ main(
 
 	/*
 	 * exit early - unfortunately we can't do that in read_cmd_line_options()
-	 * as xover_cmd is set in nntp_open()
+	 * as nntp_caps.over_cmd is set in nntp_open()
 	 */
-	if (update_index && xover_cmd && !tinrc.cache_overview_files) {
+	if (update_index && nntp_caps.over_cmd && !tinrc.cache_overview_files) {
 		error_message(_(txt_batch_update_unavail), tin_progname);
 		giveup();
 	}
@@ -217,7 +197,7 @@ main(
 	/*
 	 * Check if overview indexes contain Xref: lines
 	 */
-	if (xover_cmd)
+	if (nntp_caps.over_cmd)
 		xref_supported = overview_xref_support();
 
 #ifdef DEBUG_NEWSRC
@@ -226,25 +206,28 @@ main(
 
 		joinpath(file, TMPDIR, "BITMAP");
 		unlink(file);
-		/* vNewsrcTestHarness(); */
+#	if 0
+		newsrc_test_harness();
+#	endif /* 0 */
 	}
 #endif /* DEBUG_NEWSRC */
 
-	if (!batch_mode) {
+	/*
+	 * avoid empty regexp, we also need to do this in batch_mode
+	 * as read_overview() calls eat_re() which uses a regexp to
+	 * modify the subject *sigh*
+	 */
+	postinit_regexp();
+
+	if (!(batch_mode || post_postponed_and_exit)) {
 		/*
 		 * Read user specific keybindings and input history
 		 */
 		wait_message(0, _(txt_reading_keymap_file));
-		if (!read_keymap_file())
-			prompt_continue();
+		read_keymap_file();
 		read_input_history_file();
 
 		/*
-		 * avoid empty regexp
-		 */
-		postinit_regexp();
-
-		/*
 		 * Load the mail & news active files into active[]
 		 *
 		 * create_save_active_file cannot write to active.save
@@ -305,8 +288,11 @@ main(
 	/*
 	 * Read text descriptions for mail and/or news groups
 	 */
-	if (show_description && !batch_mode)
+	if (show_description && !batch_mode) {
+		no_write = tmp_no_write; /* restore original value */
 		read_descriptions(TRUE);
+		no_write = TRUE; /* disable newsrc updates */
+	}
 
 	/*
 	 * TODO: what has write_config_file() to do with create_mail_save_dirs ()
@@ -349,7 +335,7 @@ main(
 	 * Check/start if any new/unread articles
 	 */
 	if (check_any_unread)
-		exit(check_start_save_any_news(CHECK_ANY_NEWS, catchup));
+		tin_done(check_start_save_any_news(CHECK_ANY_NEWS, catchup));
 
 	if (start_any_unread) {
 		batch_mode = TRUE;			/* Suppress some unwanted on-screen garbage */
@@ -418,11 +404,7 @@ main(
 /*
  * process command line options
  */
-#ifndef M_AMIGA
-#	define OPTIONS "aAcdD:f:G:g:hHI:lm:M:nNop:qQrRs:SuvVwxXzZ"
-#else
-#	define OPTIONS "BcdD:f:G:hHI:lm:M:nNop:qQrRs:SuvVwxXzZ"
-#endif /* M_AMIGA */
+#define OPTIONS "aAcdD:f:g:G:hHI:lm:M:nNop:qQrRs:SuvVwxXzZ"
 
 static void
 read_cmd_line_options(
@@ -436,36 +418,30 @@ read_cmd_line_options(
 
 	while ((ch = getopt(argc, argv, OPTIONS)) != -1) {
 		switch (ch) {
-#ifndef M_AMIGA
 			case 'a':
-#	ifdef HAVE_COLOR
+#ifdef HAVE_COLOR
 				use_color = bool_not(use_color);
-#	else
+#else
 				error_message(_(txt_option_not_enabled), "-DHAVE_COLOR");
 				giveup();
 				/* keep lint quiet: */
 				/* NOTREACHED */
-#	endif /* HAVE_COLOR */
+#endif /* HAVE_COLOR */
 				break;
 
 			case 'A':
-#	ifdef NNTP_ABLE
+#ifdef NNTP_ABLE
 				force_auth_on_conn_open = TRUE;
-#	else
+#else
 				error_message(_(txt_option_not_enabled), "-DNNTP_ABLE");
 				giveup();
 				/* keep lint quiet: */
 				/* NOTREACHED */
-#	endif /* NNTP_ABLE */
-				break;
-#else
-			case 'B':
-				tin_bbs_mode = TRUE;
+#endif /* NNTP_ABLE */
 				break;
-#endif /* !M_AMIGA */
 
 			case 'c':
-				/* TODO: should -c enter batch-mode? */
+				batch_mode = TRUE;
 				catchup = TRUE;
 				break;
 
@@ -494,19 +470,17 @@ read_cmd_line_options(
 				tinrc.getart_limit = atoi(optarg);
 				break;
 
-#ifndef M_AMIGA
 			case 'g':	/* select alternative NNTP-server, implies -r */
-#	ifdef NNTP_ABLE
+#ifdef NNTP_ABLE
 				my_strncpy(cmdline_nntpserver, optarg, sizeof(cmdline_nntpserver) - 1);
 				read_news_via_nntp = TRUE;
-#	else
+#else
 				error_message(_(txt_option_not_enabled), "-DNNTP_ABLE");
 				giveup();
 				/* keep lint quiet: */
 				/* NOTREACHED */
-#	endif /* NNTP_ABLE */
+#endif /* NNTP_ABLE */
 				break;
-#endif /* !M_AMIGA */
 
 			case 'H':
 				show_intro_page();
@@ -544,6 +518,10 @@ read_cmd_line_options(
 
 			case 'o':	/* post postponed articles & exit */
 #ifndef NO_POSTING
+				/*
+				 * TODO: autoposting currently does some screen output, so we
+				 *       can't set batch_mode
+				 */
 				post_postponed_and_exit = TRUE;
 				check_for_new_newsgroups = FALSE;
 #else
@@ -551,7 +529,7 @@ read_cmd_line_options(
 				giveup();
 				/* keep lint quiet: */
 				/* NOTREACHED */
-#endif /* NO_POSTING */
+#endif /* !NO_POSTING */
 				break;
 
 			case 'p': /* implies -r */
@@ -615,230 +593,7 @@ read_cmd_line_options(
 				break;
 
 			case 'V':
-#if defined(__DATE__) && defined(__TIME__)
-				error_message(_("Version: %s release %s (\"%s\") %s %s"),
-					VERSION, RELEASEDATE, RELEASENAME, __DATE__, __TIME__);
-#else
-				error_message(_("Version: %s release %s (\"%s\")"),
-					VERSION, RELEASEDATE, RELEASENAME);
-#endif /* __DATE__ && __TIME__ */
-/*
- * FIXME: make the rest below a function (i.e. to fill a struct), so we
- * can also use it inside post.c:mail_bug_report()
- */
-#ifdef SYSTEM_NAME
-				error_message("Platform:");
-				error_message("\tOS-Name  = \"%s\"", SYSTEM_NAME);
-#endif /* SYSTEM_NAME */
-#ifdef TIN_CC
-				error_message("Compiler:");
-				error_message("\tCC       = \"%s\"", TIN_CC);
-#	ifdef TIN_CFLAGS
-				error_message("\tCFLAGS   = \"%s\"", TIN_CFLAGS);
-#	endif /* TIN_CFLAGS */
-#	ifdef TIN_CPP
-				error_message("\tCPP      = \"%s\"", TIN_CPP);
-#	endif /* TIN_CPP */
-#	ifdef TIN_CPPFLAGS
-				error_message("\tCPPFLAGS = \"%s\"", TIN_CPPFLAGS);
-#	endif /* TIN_CPPFLAGS */
-#endif /* TIN_CC */
-
-#ifdef TIN_LD
-				error_message("Linker and Libraries:");
-				error_message("\tLD       = \"%s\"", TIN_LD);
-#	ifdef TIN_LDFLAGS
-				error_message("\tLDFLAGS  = \"%s\"", TIN_LDFLAGS);
-#	endif /* TIN_LDFLAGS */
-
-#	ifdef TIN_LIBS
-				error_message("\tLIBS     = \"%s\"", TIN_LIBS);
-#	endif /* TIN_LIBS */
-#endif /* TIN_LD */
-
-				error_message("Characteristics:");
-				error_message("\t"
-/* TODO: complete list and do some useful grouping */
-#ifdef NNTP_ONLY
-				"+NNTP_ONLY "
-#else
-#	ifdef NNTP_ABLE
-				"+NNTP_ABLE "
-#	else
-				"-NNTP_ABLE "
-#	endif /* NNTP_ABLE */
-#endif /* NNTP_ONLY */
-#ifdef NO_POSTING
-				"+NO_POSTING "
-#else
-				"-NO_POSTING "
-#endif /* NO_POSTING */
-#ifdef BROKEN_LISTGROUP
-				"+BROKEN_LISTGROUP "
-#else
-				"-BROKEN_LISTGROUP "
-#endif /* BROKEN_LISTGROUP */
-#ifdef XHDR_XREF
-				"+XHDR_XREF"
-#else
-				"-XHDR_XREF"
-#endif /* XHDR_XREF */
-				"\n\t"
-#ifdef HAVE_FASCIST_NEWSADMIN
-				"+HAVE_FASCIST_NEWSADMIN "
-#else
-				"-HAVE_FASCIST_NEWSADMIN "
-#endif /* HAVE_FASCIST_NEWSADMIN */
-#ifdef ENABLE_IPV6
-				"+ENABLE_IPV6 "
-#else
-				"-ENABLE_IPV6 "
-#endif /* ENABLE_IPV6 */
-#ifdef HAVE_COREFILE
-				"+HAVE_COREFILE"
-#else
-				"-HAVE_COREFILE"
-#endif /* HAVE_COREFILE */
-				"\n\t"
-#ifdef NO_SHELL_ESCAPE
-				"+NO_SHELL_ESCAPE "
-#else
-				"-NO_SHELL_ESCAPE "
-#endif /* NO_SHELL_ESCAPE */
-#ifdef DISABLE_PRINTING
-				"+DISABLE_PRINTING "
-#else
-				"-DISABLE_PRINTING "
-#endif /* DISABLE_PRINTING */
-#ifdef DONT_HAVE_PIPING
-				"+DONT_HAVE_PIPING "
-#else
-				"-DONT_HAVE_PIPING "
-#endif /* DONT_HAVE_PIPING */
-#ifdef NO_ETIQUETTE
-				"+NO_ETIQUETTE"
-#else
-				"-NO_ETIQUETTE"
-#endif /* NO_ETIQUETTE */
-				"\n\t"
-#ifdef HAVE_LONG_FILE_NAMES
-				"+HAVE_LONG_FILE_NAMES "
-#else
-				"-HAVE_LONG_FILE_NAMES "
-#endif /* HAVE_LONG_FILE_NAMES */
-#ifdef APPEND_PID
-				"+APPEND_PID "
-#else
-				"-APPEND_PID "
-#endif /* APPEND_PID */
-#ifdef HAVE_MH_MAIL_HANDLING
-				"+HAVE_MH_MAIL_HANDLING"
-#else
-				"-HAVE_MH_MAIL_HANDLING"
-#endif /* HAVE_MH_MAIL_HANDLING */
-				"\n\t"
-#ifdef HAVE_ISPELL
-				"+HAVE_ISPELL "
-#else
-				"-HAVE_ISPELL "
-#endif /* HAVE_ISPELL */
-#ifdef HAVE_METAMAIL
-				"+HAVE_METAMAIL "
-#else
-				"-HAVE_METAMAIL "
-#endif /* HAVE_METAMAIL */
-#ifdef HAVE_SUM
-				"+HAVE_SUM"
-#else
-				"-HAVE_SUM"
-#endif /* HAVE_SUM */
-				"\n\t"
-#ifdef HAVE_COLOR
-				"+HAVE_COLOR "
-#else
-				"-HAVE_COLOR "
-#endif /* HAVE_COLOR */
-#ifdef HAVE_PGP
-				"+HAVE_PGP "
-#else
-				"-HAVE_PGP "
-#endif /* HAVE_PGP */
-#ifdef HAVE_PGPK
-				"+HAVE_PGPK "
-#else
-				"-HAVE_PGPK "
-#endif /* HAVE_PGPK */
-#ifdef HAVE_GPG
-				"+HAVE_GPG"
-#else
-				"-HAVE_GPG"
-#endif /* HAVE_GPG */
-				"\n\t"
-#ifdef MIME_BREAK_LONG_LINES
-				"+MIME_BREAK_LONG_LINES "
-#else
-				"-MIME_BREAK_LONG_LINES "
-#endif /* MIME_BREAK_LONG_LINES */
-#ifdef MIME_STRICT_CHARSET
-				"+MIME_STRICT_CHARSET "
-#else
-				"-MIME_STRICT_CHARSET "
-#endif /* MIME_STRICT_CHARSET */
-#ifdef CHARSET_CONVERSION
-				"+CHARSET_CONVERSION"
-#else
-				"-CHARSET_CONVERSION"
-#endif /* CHARSET_CONVERSION */
-				"\n\t"
-#ifdef MULTIBYTE_ABLE
-				"+MULTIBYTE_ABLE "
-#else
-				"-MULTIBYTE_ABLE "
-#endif /* MULTIBYTE_ABLE */
-#ifdef NO_LOCALE
-				"+NO_LOCALE"
-#else
-				"-NO_LOCALE"
-#endif /* NO_LOCALE */
-				"\n\t"
-#ifdef USE_CANLOCK
-				"+USE_CANLOCK "
-#else
-				"-USE_CANLOCK "
-#endif /* USE_CANLOCK */
-#ifdef EVIL_INSIDE
-				"+EVIL_INSIDE "
-#else
-				"-EVIL_INSIDE "
-#endif /* EVIL_INSIDE */
-#ifdef FORGERY
-				"+FORGERY "
-#else
-				"-FORGERY "
-#endif /* FORGERY */
-#ifdef TINC_DNS
-				"+TINC_DNS "
-#else
-				"-TINC_DNS "
-#endif /* TINC_DNS */
-#ifdef ENFORCE_RFC1034
-				"+ENFORCE_RFC1034"
-#else
-				"-ENFORCE_RFC1034"
-#endif /* ENFORCE_RFC1034 */
-				);
-				error_message("\t"
-#ifdef REQUIRE_BRACKETS_IN_DOMAIN_LITERAL
-				"+REQUIRE_BRACKETS_IN_DOMAIN_LITERAL "
-#else
-				"-REQUIRE_BRACKETS_IN_DOMAIN_LITERAL "
-#endif /* REQUIRE_BRACKETS_IN_DOMAIN_LITERAL */
-#ifdef FOLLOW_USEFOR_DRAFT
-				"+FOLLOW_USEFOR_DRAFT"
-#else
-				"-FOLLOW_USEFOR_DRAFT"
-#endif /* FOLLOW_USEFOR_DRAFT */
-				);
+				tin_version_info(stderr);
 				exit(EXIT_SUCCESS);
 				/* keep lint quiet: */
 				/* FALLTHROUGH */
@@ -852,7 +607,7 @@ read_cmd_line_options(
 				giveup();
 				/* keep lint quiet: */
 				/* NOTREACHED */
-#endif /* NO_POSTING */
+#endif /* !NO_POSTING */
 				break;
 
 #if 0
@@ -897,12 +652,9 @@ read_cmd_line_options(
 			get_newsrcname(newsrc, uts.nodename);
 #else
 			char nodenamebuf[256]; /* SUSv2 limit; better use HOST_NAME_MAX */
-#	if defined(HAVE_GETHOSTNAME) && !defined(M_AMIGA)
+#ifdef HAVE_GETHOSTNAME
 			(void) gethostname(nodenamebuf, sizeof(nodenamebuf));
-#	else
-			/* TODO: document $NodeName */
-			my_strncpy(nodenamebuf, get_val("NodeName", "PROBLEM_WITH_NODE_NAME"), sizeof(nodenamebuf) - 1);
-#	endif /* HAVE_GETHOSTNAME && !M_AMIGA */
+#endif /* HAVE_GETHOSTNAME */
 			get_newsrcname(newsrc, nodenamebuf);
 #endif /* HAVE_SYS_UTSNAME_H && HAVE_UNAME */
 		}
@@ -952,16 +704,12 @@ usage(
 {
 	error_message(_(txt_usage_tin), theProgname);
 
-#ifndef M_AMIGA
-#	ifdef HAVE_COLOR
+#ifdef HAVE_COLOR
 		error_message(_(txt_usage_toggle_color));
-#	endif /* HAVE_COLOR */
-#	ifdef NNTP_ABLE
+#endif /* HAVE_COLOR */
+#ifdef NNTP_ABLE
 		error_message(_(txt_usage_force_authentication));
-#	endif /* NNTP_ABLE */
-#else
-	error_message(_(txt_usage_bbs_mode));
-#endif /* !M_AMIGA */
+#endif /* NNTP_ABLE */
 
 	error_message(_(txt_usage_catchup));
 	error_message(_(txt_usage_dont_show_descriptions));
@@ -973,11 +721,9 @@ usage(
 	error_message(_(txt_usage_newsrc_file), newsrc);
 	error_message(_(txt_usage_getart_limit));
 
-#ifndef M_AMIGA
-#	ifdef NNTP_ABLE
-		error_message(_(txt_usage_newsserver), get_val("NNTPSERVER", NNTP_DEFAULT_SERVER));
-#	endif /* NNTP_ABLE */
-#endif /* !M_AMIGA */
+#ifdef NNTP_ABLE
+	error_message(_(txt_usage_newsserver), get_val("NNTPSERVER", NNTP_DEFAULT_SERVER));
+#endif /* NNTP_ABLE */
 
 	error_message(_(txt_usage_help_message));
 	error_message(_(txt_usage_help_information), theProgname);
diff -Nurp tin-1.6.2/src/makecfg.c tin-1.8.0/src/makecfg.c
--- tin-1.6.2/src/makecfg.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/makecfg.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : makecfg.c
  *  Author    : Thomas E. Dickey
  *  Created   : 1997-08-23
- *  Updated   : 2001-11-10
- *  Notes     : #defines and structs for config.c
+ *  Updated   : 2005-06-21
+ *  Notes     : #defines and structs for options_menu.c
  *
- * Copyright (c) 1997-2003 Thomas E. Dickey <dickey@invisible-island.net>
+ * Copyright (c) 1997-2006 Thomas E. Dickey <dickey@invisible-island.net>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -36,6 +36,7 @@
 
 
 #define __BUILD__
+#define PROTO_H 1	/* don't include proto.h */
 #ifndef TIN_H
 #	include "tin.h"
 #endif /* !TIN_H */
@@ -204,17 +205,7 @@ generate_tbl(
 {
 	static const char *const table_1[] =
 	{
-		 ""
-		,"enum option_enum {"
-		,0
-	};
-	static const char *const table_2[] =
-	{
-		"\tVERY_LAST_OPT };"
-		,""
-		,"#define LAST_OPT VERY_LAST_OPT - 1"
-		,"#define OPT_ARG_COLUMN	9"
-		,""
+		""
 		,"#define OPT_TITLE     0"
 		,"#define OPT_ON_OFF    1"
 		,"#define OPT_LIST      2"
@@ -225,7 +216,7 @@ generate_tbl(
 		,"struct t_option option_table[]={"
 		,0
 	};
-	static const char *const table_3[] =
+	static const char *const table_2[] =
 	{
 		"};"
 		,0
@@ -235,28 +226,8 @@ generate_tbl(
 	MYDATA *p;
 	char temp[BUFSIZ];
 
-	/* generate enumerated type */
-	write_it(ofp, table_1);
-	for (p = all_data; p != 0; p = p->link) {
-		if (p->name[0] == '#')
-			fprintf(ofp, "%s\n", p->name);
-		else {
-			char *s = p->name;
-
-			fprintf(ofp, "\tOPT_");
-			while (*s != '\0') {
-				fprintf(ofp, "%c",
-					 isalpha ((unsigned char)*s) && islower((unsigned char)*s)
-					 ? toupper ((unsigned char)*s)
-					 : *s);
-				s++;
-			}
-			fprintf(ofp, ",\n");
-		}
-	}
-
 	/* generate the access table */
-	write_it(ofp, table_2);
+	write_it(ofp, table_1);
 	for (p = all_data; p != 0; p = p->link) {
 		if (p->name[0] == '#')
 			fprintf(ofp, "%s\n", p->name);
@@ -290,7 +261,46 @@ generate_tbl(
 		}
 	}
 
-	write_it(ofp, table_3);
+	write_it(ofp, table_2);
+}
+
+static void
+generate_enum(
+	FILE *ofp2)
+{
+	MYDATA *p;
+
+	static const char *const table_1[] = {
+		"enum option_enum {",
+		0
+	};
+	static const char *const table_2[] = {
+		"\tSIGNAL_HANDLER };",
+		"",
+		"#define LAST_OPT SIGNAL_HANDLER - 1",
+		0
+	};
+
+	/* generate enumerated type */
+	write_it(ofp2, table_1);
+	for (p = all_data; p != 0; p = p->link) {
+		if (p->name[0] == '#')
+			fprintf(ofp2, "%s\n", p->name);
+		else {
+			char *s = p->name;
+
+			fprintf(ofp2, "\tOPT_");
+			while (*s != '\0') {
+				fprintf(ofp2, "%c",
+					 isalpha ((unsigned char)*s) && islower((unsigned char)*s)
+					 ? toupper ((unsigned char)*s)
+					 : *s);
+				s++;
+			}
+			fprintf(ofp2, ",\n");
+		}
+	}
+	write_it(ofp2, table_2);
 }
 
 static void
@@ -377,7 +387,8 @@ generate_ptr(
 static void
 makecfg(
 	FILE *ifp,
-	FILE *ofp)
+	FILE *ofp,
+	FILE *ofp2)
 {
 	char buffer[BUFSIZ];
 	MYDATA *p, *q;
@@ -386,8 +397,8 @@ makecfg(
 	{
 		"/* This file is generated by MAKECFG */"
 		,""
-		,"#ifndef TINTBL_H"
-		,"#define TINTBL_H 1"
+		,"#ifndef TINCFG_H"
+		,"#define TINCFG_H 1"
 		,""
 		,"/* Macros for defining symbolic offsets that can be ifdef'd */"
 		,"#undef OINX"
@@ -426,9 +437,22 @@ makecfg(
 		,"#undef OEND"
 		,"#undef OTYP"
 		,""
-		,"#endif /* TINTBL_H */"
+		,"#endif /* TINCFG_H */"
 		,0
 	};
+	static const char *const table_3[] = {
+		"/* This file is generated by MAKECFG */",
+		"",
+		"#ifndef OPTIONS_MENU_H",
+		"#define OPTIONS_MENU_H 1",
+		"",
+		0
+	};
+	static const char *const table_4[] = {
+		"",
+		"#endif /* OPTIONS_MENU_H */",
+		0
+	};
 
 	/*
 	 * Process the input file.
@@ -473,6 +497,16 @@ makecfg(
 	write_it(ofp, table_2);
 
 	fclose(ofp);
+
+	if (ofp2) {
+		write_it(ofp2, table_3);
+
+		generate_enum(ofp2);
+
+		write_it(ofp2, table_4);
+
+		fclose(ofp2);
+	}
 }
 
 int
@@ -482,12 +516,13 @@ main(
 {
 	FILE *input = stdin;
 	FILE *output = stdout;
+	FILE *output2 = open_it("options_menu.h", "w");
 
 	if (argc > 1)
 		input = open_it(argv[1], "r");
 	if (argc > 2)
 		output = open_it(argv[2], "w");
-	makecfg(input, output);
+	makecfg(input, output, output2);
 
 	return (0);
 }
diff -Nurp tin-1.6.2/src/memory.c tin-1.8.0/src/memory.c
--- tin-1.6.2/src/memory.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/memory.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : memory.c
  *  Author    : I. Lea & R. Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 2003-05-10
+ *  Updated   : 2005-07-02
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,20 +38,18 @@
 #ifndef TIN_H
 #	include "tin.h"
 #endif /* !TIN_H */
-#ifndef RFC2046_H
-#	include "rfc2046.h"
-#endif /* !RFC2046_H */
+
 
 /*
- * Dynamic arrays maximum & current sizes
+ * Dynamic arrays maximum (initialized in init_alloc()) & current sizes
  * num_* values are one past top of used part of array
  */
-int max_active = 0;
+int max_active;
 int num_active = -1;
-int max_newnews = 0;
+int max_newnews;
 int num_newnews = 0;
-int max_art = 0;
-int max_save = 0;
+int max_art;
+int max_save;
 int num_save = 0;
 
 /*
@@ -87,7 +85,7 @@ init_alloc(
 	/*
 	 * active file arrays
 	 */
-	max_active = get_active_num();
+	max_active = DEFAULT_ACTIVE_NUM;
 	max_newnews = DEFAULT_NEWNEWS_NUM;
 
 	active = my_malloc(sizeof(*active) * max_active);
@@ -204,40 +202,40 @@ free_all_arrays(
 	free_active_arrays();
 	free_global_arrays();
 
-	if (!batch_mode) {
 #ifdef HAVE_COLOR
-		FreeIfNeeded(quote_regex.re);
-		FreeIfNeeded(quote_regex.extra);
-		FreeIfNeeded(quote_regex2.re);
-		FreeIfNeeded(quote_regex2.extra);
-		FreeIfNeeded(quote_regex3.re);
-		FreeIfNeeded(quote_regex3.extra);
+	FreeIfNeeded(quote_regex.re);
+	FreeIfNeeded(quote_regex.extra);
+	FreeIfNeeded(quote_regex2.re);
+	FreeIfNeeded(quote_regex2.extra);
+	FreeIfNeeded(quote_regex3.re);
+	FreeIfNeeded(quote_regex3.extra);
 #endif /* HAVE_COLOR */
-		FreeIfNeeded(slashes_regex.re);
-		FreeIfNeeded(slashes_regex.extra);
-		FreeIfNeeded(stars_regex.re);
-		FreeIfNeeded(stars_regex.extra);
-		FreeIfNeeded(strokes_regex.re);
-		FreeIfNeeded(strokes_regex.extra);
-		FreeIfNeeded(underscores_regex.re);
-		FreeIfNeeded(underscores_regex.extra);
-		FreeIfNeeded(strip_re_regex.re);
-		FreeIfNeeded(strip_re_regex.extra);
-		FreeIfNeeded(strip_was_regex.re);
-		FreeIfNeeded(strip_was_regex.extra);
-		FreeIfNeeded(uubegin_regex.re);
-		FreeIfNeeded(uubegin_regex.extra);
-		FreeIfNeeded(uubody_regex.re);
-		FreeIfNeeded(uubody_regex.extra);
-		FreeIfNeeded(url_regex.re);
-		FreeIfNeeded(url_regex.extra);
-		FreeIfNeeded(mail_regex.re);
-		FreeIfNeeded(mail_regex.extra);
-		FreeIfNeeded(news_regex.re);
-		FreeIfNeeded(news_regex.extra);
-		FreeIfNeeded(shar_regex.re);
-		FreeIfNeeded(shar_regex.extra);
+	FreeIfNeeded(slashes_regex.re);
+	FreeIfNeeded(slashes_regex.extra);
+	FreeIfNeeded(stars_regex.re);
+	FreeIfNeeded(stars_regex.extra);
+	FreeIfNeeded(strokes_regex.re);
+	FreeIfNeeded(strokes_regex.extra);
+	FreeIfNeeded(underscores_regex.re);
+	FreeIfNeeded(underscores_regex.extra);
+	FreeIfNeeded(strip_re_regex.re);
+	FreeIfNeeded(strip_re_regex.extra);
+	FreeIfNeeded(strip_was_regex.re);
+	FreeIfNeeded(strip_was_regex.extra);
+	FreeIfNeeded(uubegin_regex.re);
+	FreeIfNeeded(uubegin_regex.extra);
+	FreeIfNeeded(uubody_regex.re);
+	FreeIfNeeded(uubody_regex.extra);
+	FreeIfNeeded(url_regex.re);
+	FreeIfNeeded(url_regex.extra);
+	FreeIfNeeded(mail_regex.re);
+	FreeIfNeeded(mail_regex.extra);
+	FreeIfNeeded(news_regex.re);
+	FreeIfNeeded(news_regex.extra);
+	FreeIfNeeded(shar_regex.re);
+	FreeIfNeeded(shar_regex.extra);
 
+	if (!batch_mode) {
 		free_keymaps();
 		free_input_history();
 	}
@@ -254,6 +252,8 @@ free_all_arrays(
 		FreeAndNull(newnews);
 	}
 
+	FreeAndNull(nntp_caps.implementation);
+
 	tin_fgets(NULL, FALSE);
 }
 
@@ -325,6 +325,8 @@ free_attributes_array(
 
 			FreeAndNull(group->attribute->followup_to);
 
+			FreeAndNull(group->attribute->fcc);
+
 			FreeAndNull(group->attribute->mailing_list);
 			FreeAndNull(group->attribute->x_headers);
 			FreeAndNull(group->attribute->x_body);
@@ -362,6 +364,8 @@ free_attributes_array(
 
 	FreeAndNull(glob_attributes.followup_to);
 
+	FreeAndNull(glob_attributes.fcc);
+
 	FreeAndNull(glob_attributes.mailing_list);
 	FreeAndNull(glob_attributes.x_headers);
 	FreeAndNull(glob_attributes.x_body);
@@ -476,7 +480,7 @@ my_malloc1(
 	void *p;
 
 #ifdef DEBUG
-	vDbgPrintMalloc(TRUE, file, line, size);
+	debug_print_malloc(TRUE, file, line, size);
 #endif /* DEBUG */
 
 	if ((p = malloc(size)) == NULL) {
@@ -500,7 +504,7 @@ my_calloc1(
 	void *p;
 
 #ifdef DEBUG
-	vDbgPrintMalloc(TRUE, file, line, nmemb * size);
+	debug_print_malloc(TRUE, file, line, nmemb * size);
 #endif /* DEBUG */
 
 	if ((p = calloc(nmemb, size)) == NULL) {
@@ -519,7 +523,7 @@ my_realloc1(
 	size_t size)
 {
 #ifdef DEBUG
-	vDbgPrintMalloc(FALSE, file, line, size);
+	debug_print_malloc(FALSE, file, line, size);
 #endif /* DEBUG */
 
 	p = ((!p) ? (calloc(1, size)) : realloc(p, size));
diff -Nurp tin-1.6.2/src/mimetypes.c tin-1.8.0/src/mimetypes.c
--- tin-1.6.2/src/mimetypes.c	2003-08-26 14:36:27.000000000 +0200
+++ tin-1.8.0/src/mimetypes.c	2005-12-02 12:07:36.000000000 +0100
@@ -6,7 +6,7 @@
  *  Updated   : 2003-08-26
  *  Notes     : mime.types handling
  *
- * Copyright (c) 2000-2003 Jason Faultless <jason@altarstone.com>
+ * Copyright (c) 2000-2006 Jason Faultless <jason@altarstone.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff -Nurp tin-1.6.2/src/misc.c tin-1.8.0/src/misc.c
--- tin-1.6.2/src/misc.c	2003-08-24 02:42:38.000000000 +0200
+++ tin-1.8.0/src/misc.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : misc.c
  *  Author    : I. Lea & R. Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 2003-08-24
+ *  Updated   : 2005-08-14
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,6 +38,9 @@
 #ifndef TIN_H
 #	include "tin.h"
 #endif /* !TIN_H */
+#ifndef VERSION_H
+#	include "version.h"
+#endif /* !VERSION_H */
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
@@ -47,9 +50,14 @@
 #ifndef TIN_POLICY_H
 #	include "policy.h"
 #endif /* !TIN_POLICY_H */
-#ifndef RFC2046_H
-#	include "rfc2046.h"
-#endif /* !RFC2046_H */
+
+#if defined(HAVE_IDNA_H) && !defined(_IDNA_H)
+#	include <idna.h>
+#endif /* HAVE_IDNA_H && !_IDNA_H */
+#if defined(HAVE_STRINGPREP_H) && !defined(_STRINGPREP_H)
+#	include <stringprep.h>
+#endif /* HAVE_STRINGPREP_H & !_STRINGPREP_H */
+
 
 /*
  * defines to control GNKSA-checks behavior:
@@ -72,12 +80,12 @@ static int gnksa_dequote_plainphrase(cha
 static int strfeditor(char *editor, int linenum, const char *filename, char *s, size_t maxsize, char *format);
 static void write_input_history_file(void);
 #ifdef CHARSET_CONVERSION
-	static char *utf8_valid(char *line);
 	static t_bool buffer_to_local(char **line, int *max_line_len, const char *network_charset, const char *local_charset);
 #endif /* CHARSET_CONVERSION */
-#if (defined(MIME_STRICT_CHARSET) && !defined(NO_LOCALE)) || defined(CHARSET_CONVERSION)
-	static void buffer_to_ascii(char *c);
-#endif /* (MIME_STRICT_CHARSET && !NO_LOCALE) || CHARSET_CONVERSION */
+#if 0 /* currently unused */
+	static t_bool stat_article(long art, const char *group_path);
+#endif /* 0 */
+
 
 /*
  * generate tmp-filename
@@ -188,7 +196,7 @@ copy_fp(
  * try to backup filename as backupname. on success backupname has the same
  * permissions as filename.
  *
- * returncodes:
+ * return codes:
  * TRUE  = backup complete or source file was missing
  * FALSE = backup failed
  */
@@ -277,7 +285,7 @@ copy_body(
 	 */
 	if (tinrc.quote_style & QUOTE_COMPRESS) {
 		if (strstr(prefix, "%s"))
-			sprintf(prefixbuf, prefix, initl);
+			snprintf(prefixbuf, sizeof(prefixbuf), prefix, initl);
 		else {
 			/* strip tailing space from quote-char for quoting quoted lines */
 			strcpy(prefixbuf, prefix);
@@ -285,7 +293,7 @@ copy_body(
 				prefixbuf[strlen(prefixbuf) - 1] = '\0';
 		}
 	} else
-		sprintf(prefixbuf, prefix, initl);
+		snprintf(prefixbuf, sizeof(prefixbuf), prefix, initl);
 
 	/*
 	 * if raw_data is true, the signature is exceptionally quoted, even if
@@ -319,7 +327,7 @@ copy_body(
 					retcode = fprintf(fp_op, "%s\n", ((tinrc.quote_style & QUOTE_EMPTY) ? prefixbuf : ""));
 		} else {		/* no initials in quote_string, just copy */
 			if ((buf[0] != '\n') || (tinrc.quote_style & QUOTE_EMPTY))
-				retcode = fprintf(fp_op, "%s%s", ((buf[0] == '>' || buf[0] == ' ') ? prefixbuf : prefix), buf);  /* use blank-stripped quote string if line is already quoted or beginns with a space */
+				retcode = fprintf(fp_op, "%s%s", ((buf[0] == '>' || buf[0] == ' ') ? prefixbuf : prefix), buf);	/* use blank-stripped quote string if line is already quoted or beginns with a space */
 			else
 				retcode = fprintf(fp_op, "\n");
 		}
@@ -462,13 +470,16 @@ void
 shell_escape(
 	void)
 {
-	char *p;
+	char *p, *tmp;
 	char shell[LEN];
 
-	sprintf(mesg, _(txt_shell_escape), tinrc.default_shell_command);
+	tmp = fmt_string(_(txt_shell_escape), tinrc.default_shell_command);
 
-	if (!prompt_string(mesg, shell, HIST_SHELL_COMMAND))
+	if (!prompt_string(tmp, shell, HIST_SHELL_COMMAND)) {
+		free(tmp);
 		return;
+	}
+	free(tmp);
 
 	for (p = shell; *p && isspace((int) *p); p++)
 		continue;
@@ -481,8 +492,9 @@ shell_escape(
 	}
 
 	ClearScreen();
-	sprintf(mesg, _(txt_shell_command), p);
-	center_line(0, TRUE, mesg);
+	tmp = fmt_string(_(txt_shell_command), p);
+	center_line(0, TRUE, tmp);
+	free(tmp);
 	MoveCursor(INDEX_TOP, 0);
 
 	(void) invoke_cmd(p);
@@ -539,7 +551,7 @@ tin_done(
 			group = &active[my_group[i]];
 			if (group->read_during_session) {
 				if (ask) {
-					if (prompt_yn(cLINES, _(txt_catchup_all_read_groups), FALSE) == 1) {
+					if (prompt_yn(_(txt_catchup_all_read_groups), FALSE) == 1) {
 						ask = FALSE;
 						tinrc.thread_articles = THREAD_NONE;	/* speeds up index loading */
 					} else
@@ -556,7 +568,8 @@ tin_done(
 	 * chance to try again
 	 */
 	if (!no_write) {
-		forever {
+		i = 3; /* max retries */
+		while (i--) {
 			if (((wrote_newsrc_lines = write_newsrc()) >= 0L) && (wrote_newsrc_lines >= read_newsrc_lines)) {
 				if (!batch_mode || verbose)
 					my_fputs(_(txt_newsrc_saved), stdout);
@@ -575,7 +588,7 @@ tin_done(
 			}
 
 			if (!batch_mode) {
-				if (!prompt_yn(cLINES, _(txt_newsrc_again), TRUE))
+				if (prompt_yn(_(txt_newsrc_again), TRUE) <= 0)
 					break;
 			}
 		}
@@ -654,7 +667,7 @@ my_mkdir(
 	char buf[LEN];
 	struct stat sb;
 
-	sprintf(buf, "mkdir %s", path); /* redirect stderr to /dev/null? use invoke_cmd()? */
+	snprintf(buf, sizeof(buf), "mkdir %s", path); /* redirect stderr to /dev/null? use invoke_cmd()? */
 	if (stat(path, &sb) == -1) {
 		system(buf);
 		return chmod(path, mode);
@@ -757,26 +770,6 @@ rename_file(
 #endif /* VMS */
 
 
-#ifdef M_AMIGA
-/*
- * AmigaOS now has links. Better not to use them as not everybody has new ROMS
- */
-void
-rename_file(
-	char *old_filename,
-	char *new_filename)
-{
-	char buf[1024];
-
-	unlink(new_filename);
-	if (rename(old_filename, new_filename) == EOF)
-		perror_message(_(txt_rename_error), old_filename, new_filename);
-
-	return;
-}
-#endif /* M_AMIGA */
-
-
 /*
  * Note that we exit screen/curses mode when invoking
  * external commands
@@ -813,16 +806,21 @@ invoke_cmd(
 		need_resize = cYes;		/* Flag a redraw */
 	}
 
-#ifdef VMS
-	success = (ret != 0);
+#ifdef IGNORE_SYSTEM_STATUS
+	return TRUE;
 #else
-	success = (ret == 0);
-#endif /* VMS */
+
+#	ifdef VMS
+		success = (ret != 0);
+#	else
+		success = (ret == 0);
+#	endif /* VMS */
 
 	if (!success || system_status != 0)
 		error_message(_(txt_command_failed), nam);
 
 	return success;
+#endif /* IGNORE_SYSTEM_STATUS */
 }
 
 
@@ -832,6 +830,10 @@ draw_percent_mark(
 	long max_num)
 {
 	char buf[32]; /* should be big enough */
+	int len;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wchar_t *wbuf;
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 	if (NOTESLINES <= 0)
 		return;
@@ -841,7 +843,14 @@ draw_percent_mark(
 
 	clear_message();
 	snprintf(buf, sizeof(buf), "%s(%d%%) [%ld/%ld]", _(txt_more), (int) (cur_num * 100 / max_num), cur_num, max_num);
-	MoveCursor(cLINES, (cCOLS - (int) strlen(buf)) - (1 + BLANK_PAGE_COLS));
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	if ((wbuf = char2wchar_t(buf)) != NULL) {
+		len = wcswidth(wbuf, wcslen(wbuf) + 1);
+		free(wbuf);
+	} else
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+		len = (int) strlen(buf);
+	MoveCursor(cLINES, cCOLS - len - (1 + BLANK_PAGE_COLS));
 	StartInverse();
 	my_fputs(buf, stdout);
 	my_flush();
@@ -900,60 +909,48 @@ dir_name(
 
 /*
  * Return TRUE if new mail has arrived
+ *
+ * TODO: why not cache the mailbox_name?
  */
+#define MAILDIR_NEW	"/new"
 t_bool
 mail_check(
 	void)
 {
 	const char *mailbox_name;
 	struct stat buf;
-#ifdef M_AMIGA
-	static long mbox_size = 0;
-#endif /* M_AMIGA */
 
 	mailbox_name = get_val("MAIL", mailbox);
 
-#ifdef M_AMIGA
-	/*
-	 * Since AmigaDOS does not distinguish between atime and mtime
-	 * we have to find some other way to figure out if the mailbox
-	 * was modified (to bad that Iain removed the mail_setup() and
-	 * mail_check() scheme used prior to 1.30 260694 which worked also
-	 * on AmigaDOS). (R. Luebke 10.7.1994)
-	 */
-
-	/* this is only a first try, but it seems to work :) */
+	if (mailbox_name != 0 && stat(mailbox_name, &buf) >= 0) {
+		if ((int) (buf.st_mode & S_IFMT) == (int) S_IFDIR) { /* maildir setup */
+			DIR *dirp;
+			char *maildir_box;
+			struct dirent *dp;
 
-	if (mailbox_name != 0) {
-		if (stat(mailbox_name, &buf) >= 0) {
-			if (buf.st_size > 0) {
-				if (buf.st_size > mbox_size) {
-					mbox_size = buf.st_size;
+			maildir_box = my_malloc(strlen(mailbox_name) + strlen(MAILDIR_NEW) + 1);
+#ifdef VMS
+			joindir(maildir_box, mailbox_name, MAILDIR_NEW);
+#else
+			joinpath(maildir_box, mailbox_name, MAILDIR_NEW);
+#endif /* VMS */
+			if (!(dirp = opendir(maildir_box))) {
+				free(maildir_box);
+				return FALSE;
+			}
+			free(maildir_box);
+			while ((dp = readdir(dirp)) != NULL) {
+				if ((strcmp(dp->d_name, ".")) && (strcmp(dp->d_name, ".."))) {
+					closedir(dirp);
 					return TRUE;
-				} else
-					/*
-					 * at this point we have to calculate how much the
-					 * mailbox has to grow until we say "new mail"
-					 * Unfortunately, some MUAs write status information
-					 * back to the users mailbox. This is a size increase
-					 * and would result in "new mail" if we only look for some
-					 * size increase. The mbox_size calculation below works
-					 * for me for some time now (I use AmigaELM).
-					 * Probably there is a better method, if you know one
-					 * you are welcome... :-)
-					 * I think a constant offset is more accurate today,
-					 * 1k is the average size of mail-headers alone in each
-					 * message I receive. (obw)
-					 */
-					mbox_size = buf.st_size + 1024;
-			} else
-				mbox_size = 0;
+				}
+			}
+			closedir(dirp);
+		} else {
+			if (buf.st_atime < buf.st_mtime && buf.st_size > 0)
+				return TRUE;
 		}
 	}
-#else
-	if (mailbox_name != 0 && stat(mailbox_name, &buf) >= 0 && buf.st_atime < buf.st_mtime && buf.st_size > 0)
-		return TRUE;
-#endif /* M_AMIGA */
 	return FALSE;
 }
 
@@ -972,7 +969,7 @@ eat_re(
 	char *s,
 	t_bool eat_was)
 {
-	int data, slen;
+	int data;
 	int offsets[6];
 	int size_offsets = ARRAY_SIZE(offsets);
 
@@ -980,15 +977,13 @@ eat_re(
 		return "<No subject>"; /* also used in art.c:parse_headers() */
 
 	do {
-		slen = strlen(s);
-		data = pcre_exec(strip_re_regex.re, strip_re_regex.extra, s, slen, 0, 0, offsets, size_offsets);
+		data = pcre_exec(strip_re_regex.re, strip_re_regex.extra, s, strlen(s), 0, 0, offsets, size_offsets);
 		if (offsets[0] == 0)
 			s += offsets[1];
 	} while (data > 0);
 
 	if (eat_was) do {
-		slen = strlen(s);
-		data = pcre_exec(strip_was_regex.re, strip_was_regex.extra, s, slen, 0, 0, offsets, size_offsets);
+		data = pcre_exec(strip_was_regex.re, strip_was_regex.extra, s, strlen(s), 0, 0, offsets, size_offsets);
 		if (offsets[0] > 0)
 			s[offsets[0]] = '\0';
 	} while (data > 0);
@@ -1036,24 +1031,25 @@ get_author(
 	char *str,
 	size_t len)
 {
+	char *p = idna_decode(art->from);
 	int author;
 
-	author = ((thread && !show_subject) ? SHOW_FROM_BOTH : CURR_GROUP.attribute->show_author);
+	author = ((thread && !show_subject) ? SHOW_FROM_BOTH : curr_group->attribute->show_author);
 
 	switch (author) {
 		case SHOW_FROM_ADDR:
-			strncpy(str, art->from, len);
+			strncpy(str, p, len);
 			break;
 
 		case SHOW_FROM_NAME:
-			strncpy(str, (art->name ? art->name : art->from), len);
+			strncpy(str, (art->name ? art->name : p), len);
 			break;
 
 		case SHOW_FROM_BOTH:
 			if (art->name)
-				snprintf(str, len, "%s <%s>", art->name, art->from);
+				snprintf(str, len, "%s <%s>", art->name, p);
 			else
-				strncpy(str, art->from, len);
+				strncpy(str, p, len);
 			break;
 
 		case SHOW_FROM_NONE:
@@ -1062,6 +1058,7 @@ get_author(
 			break;
 	}
 
+	free(p);
 	*(str + len) = '\0';				/* NULL terminate */
 }
 
@@ -1481,9 +1478,7 @@ _strfpath(
 	char tbuf[PATH_LEN];
 	char *envptr;
 	int i;
-#ifndef M_AMIGA
 	struct passwd *pwd;
-#endif /* !M_AMIGA */
 	t_bool is_mailbox = FALSE;
 
 	if (str == NULL || format == NULL || maxsize == 0)
@@ -1516,7 +1511,6 @@ _strfpath(
 						break;
 
 					default:	/* some other users homedir */
-#ifndef M_AMIGA
 						i = 0;
 						while (*format && *format != '/')
 							tbuf[i++] = *format++;
@@ -1529,11 +1523,6 @@ _strfpath(
 							return 0;
 						} else
 							sprintf(tbuf, "%s/", pwd->pw_dir);
-#else
-						/* Amiga has no other users */
-						return 0;
-						/* NOTREACHED */
-#endif /* !M_AMIGA */
 						break;
 				}
 				if ((str = strfpath_cp(str, tbuf, endp)) == NULL)
@@ -1791,6 +1780,13 @@ strfmailer(
 	if (dest == NULL || format == NULL || maxsize == 0)
 		return 0;
 
+	/*
+	 * TODO: shouldn't we better check for no % OR format > maxsize?
+	 *       as no replacemnt doesn't make sense (hardcoded To, Subject
+	 *       and filename) and the resulting string usuly is longer after
+	 *       replacemnts were done (nobody uses enough %% to make the
+	 *       result shorter than the input).
+	 */
 	if (strchr(format, '%') == NULL && strlen(format) + 1 >= maxsize)
 		return 0;
 
@@ -1881,7 +1877,7 @@ strfmailer(
 
 				case 'S':	/* Subject */
 					/* don't MIME encode Subject if using external mail client */
-					if (tinrc.use_mailreader_i)
+					if (INTERACTIVE_NONE != tinrc.interactive_mailer)
 						strncpy(tbuf, escape_shell_meta(subject, quote_area), sizeof(tbuf) - 1);
 					else {
 #ifdef CHARSET_CONVERSION
@@ -1898,7 +1894,7 @@ strfmailer(
 
 				case 'T':	/* To */
 					/* don't MIME encode To if using external mail client */
-					if (tinrc.use_mailreader_i)
+					if (INTERACTIVE_NONE != tinrc.interactive_mailer)
 						strncpy(tbuf, escape_shell_meta(to, quote_area), sizeof(tbuf) - 1);
 					else {
 #ifdef CHARSET_CONVERSION
@@ -1915,7 +1911,7 @@ strfmailer(
 
 				case 'U':	/* User */
 					/* don't MIME encode User if using external mail client */
-					if (tinrc.use_mailreader_i)
+					if (INTERACTIVE_NONE != tinrc.interactive_mailer)
 						strncpy(tbuf, userid, sizeof(tbuf) - 1);
 					else {
 #ifdef CHARSET_CONVERSION
@@ -2057,15 +2053,12 @@ cleanup_tmp_files(
 #if 0
 	char acNovFile[PATH_LEN];
 
-	if (xover_cmd && !tinrc.cache_overview_files) {
-		sprintf(acNovFile, "%s%d.idx", TMPDIR, (int) process_id);
+	if (nntp_caps.over_cmd && !tinrc.cache_overview_files) {
+		snprintf(acNovFile, sizeof(acNovFile), "%s%d.idx", TMPDIR, (int) process_id);
 		unlink(acNovFile);
 	}
 #endif /* 0 */
 
-	if (!tinrc.cache_overview_files)
-		unlink(local_newsgroups_file);
-
 	if (batch_mode)
 		unlink(lock_file);
 }
@@ -2108,7 +2101,7 @@ file_size(
  * returns mtime
  * -1 in case of an error (file not found, or !S_IFREG)
  */
-long /* we use long (not time_t) here for FILE_CHANGED() macro */
+long /* we use long (not time_t) here */
 file_mtime(
 	const char *file)
 {
@@ -2391,15 +2384,13 @@ buffer_to_local(
 				char *tmpbuf, *tbuf;
 				ICONV_CONST char *cur_inbuf;
 				int used;
-				size_t inbytesleft;
-				size_t unknown_bytesleft;
+				size_t inbytesleft = 1;
+				size_t unknown_bytesleft = 4;
 				size_t tmpbytesleft, tsize;
 				size_t outbytesleft, osize;
 				size_t cur_obl, cur_ibl;
 				size_t result;
 
-				inbytesleft = 1;
-				unknown_bytesleft = 4;
 				unknown_ucs4 = unknown_buf;
 
 				/* convert '?' from ASCII to UCS-4 */
@@ -2473,7 +2464,7 @@ buffer_to_local(
 								 * outbuf was too small
 								 * As some input could be converted successfully
 								 * and we don`t know where the last complete char
-								 * ends, redo the last conversation completely.
+								 * ends, redo the last conversion completely.
 								 */
 								/* resize the output buffer */
 								obuf = my_realloc(obuf, osize * 2 + 1);
@@ -2575,18 +2566,20 @@ buffer_to_network(
 #endif /* CHARSET_CONVERSION */
 
 
-#if (defined(MIME_STRICT_CHARSET) && !defined(NO_LOCALE)) || defined(CHARSET_CONVERSION)
-static void
+char *
 buffer_to_ascii(
 	char *c)
 {
-	while (*c != '\0') { /* reduce to US-ASCII, other non-prints are filtered later */
+	char *a = c;
+
+	while (*c != '\0') {
+		/* reduce to US-ASCII, other non-prints are filtered later */
 		if ((unsigned char) *c >= 128)
 			*c = '?';
 		c++;
 	}
+	return a;
 }
-#endif /* (MIME_STRICT_CHARSET && !NO_LOCALE) || CHARSET_CONVERSION */
 
 
 /*
@@ -3425,7 +3418,15 @@ gnksa_split_from(
 		}
 	}
 
+	/*
+	 * if we allow <> as From: we must disallow <> as Mesage-ID,
+	 * see code in post.c:check_article_to_be_posted()
+	 */
+#if 0
+	if (!strchr(address, '@') && *address) /* check for From: without an @ but allow <> */
+#else
 	if (!strchr(address, '@')) /* check for From: without an @ */
+#endif /* 0 */
 		return GNKSA_ATSIGN_MISSING;
 
 	/* split successful */
@@ -3566,7 +3567,7 @@ strip_line(
 }
 
 
-#ifdef CHARSET_CONVERSION
+#if defined(CHARSET_CONVERSION) || (defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE))
 /*
  * 'check' a given UTF-8 strig and '?'-out illegal sequences
  * TODO: is this check complete?
@@ -3581,7 +3582,7 @@ strip_line(
  * UTF8-4          = %xF0 %x90-BF 2*UTF8-1 / %xF1-F3 3*UTF8-1 /
  *                   %xF4 %x80-8F 2*UTF8-1
  */
-static char *
+char *
 utf8_valid(
 	char *line)
 {
@@ -3606,88 +3607,95 @@ utf8_valid(
 			numc++;
 		} while ((d <<= 1) & 0x80);	/* get sequence length */
 
-		d = *c;
-		e = *(c + 1);
-
-		switch (numc) {
-			case 2:
-				/* out of range or sequences which would also fit into 1 byte */
-				if (d < 0xc2 || d > 0xdf)
-					illegal = TRUE;
-				break;
+		d = 1;
+		while (d < numc) {
+			if (*(c + d) == '\0' || *(c + d) == '\n')
+				illegal = TRUE;
+			d--;
+		}
 
-			case 3:
-				f = *(c + 2);
-				/* out of range or sequences which would also fit into 2 bytes */
-				if (d < 0xe0 || d > 0xef || (d == 0xe0 && e < 0xa0))
-					illegal = TRUE;
-				/* U+D800 ... U+DFFF */
-				if (d == 0xed && e > 0x9f)
-					illegal = TRUE;
-				/* U+FDD0 ... U+FDEF */
-				if (d == 0xef && e == 0xb7 && (f >= 0x90 && f <= 0xaf))
-					illegal = TRUE;
-				/* U+FFFE, U+FFFF */
-				if (d == 0xef && e == 0xbf && (f == 0xbe || f == 0xbf))
-					illegal = TRUE;
-				break;
+		if (!illegal) {
+			d = *c;
+			e = *(c + 1);
 
-			case 4:
-				f = *(c + 2);
-				g = *(c + 3);
-				/* out of range or sequences which would also fit into 3 bytes */
-				if (d < 0xf0 || d > 0xf7 || (d == 0xf0 && e < 0x90))
-					illegal = TRUE;
-				/* largest current used sequence */
-				if ((d == 0xf4 && e > 0x8f) || d > 0xf4)
-					illegal = TRUE;
-				/* Unicode 3.1 noncharacters */
-				/* U+1FFFE, U+1FFFF, U+2FFFE, U+2FFFF, U+3FFFE, U+3FFFF; (Unicode 3.1) */
-				if (d == 0xf0 && (e == 0x9f || e == 0xaf || e == 0xbf) && f == 0xbf && (g == 0xbe || g == 0xbf))
-					illegal = TRUE;
-				/* Unicode 3.1 noncharacters */
-				/* U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE, U+6FFFF, U+7FFFE, U+7FFFF */
-				/* U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF, U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF */
-				/* U+CFFFE, U+CFFFF, U+DFFFE, U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF */
-				if ((d == 0xf1 || d == 0xf2 || d == 0xf3) && (e == 0x8f || e == 0x9f || e == 0xaf || e == 0xbf) && f == 0xbf && (g == 0xbe || g == 0xbf))
-					illegal = TRUE;
-				/* Unicode 3.1 noncharacters */
-				/* U+10FFFE, U+10FFFF */
-				if (d == 0xf4 && e == 0x8f && f == 0xbf && (g == 0xbe || g == 0xbf))
-					illegal = TRUE;
-				break;
+			switch (numc) {
+				case 2:
+					/* out of range or sequences which would also fit into 1 byte */
+					if (d < 0xc2 || d > 0xdf)
+						illegal = TRUE;
+					break;
+
+				case 3:
+					f = *(c + 2);
+					/* out of range or sequences which would also fit into 2 bytes */
+					if (d < 0xe0 || d > 0xef || (d == 0xe0 && e < 0xa0))
+						illegal = TRUE;
+					/* U+D800 ... U+DFFF */
+					if (d == 0xed && e > 0x9f)
+						illegal = TRUE;
+					/* U+FDD0 ... U+FDEF */
+					if (d == 0xef && e == 0xb7 && (f >= 0x90 && f <= 0xaf))
+						illegal = TRUE;
+					/* U+FFFE, U+FFFF */
+					if (d == 0xef && e == 0xbf && (f == 0xbe || f == 0xbf))
+						illegal = TRUE;
+					break;
+
+				case 4:
+					f = *(c + 2);
+					g = *(c + 3);
+					/* out of range or sequences which would also fit into 3 bytes */
+					if (d < 0xf0 || d > 0xf7 || (d == 0xf0 && e < 0x90))
+						illegal = TRUE;
+					/* largest current used sequence */
+					if ((d == 0xf4 && e > 0x8f) || d > 0xf4)
+						illegal = TRUE;
+					/* Unicode 3.1 noncharacters */
+					/* U+1FFFE, U+1FFFF, U+2FFFE, U+2FFFF, U+3FFFE, U+3FFFF; (Unicode 3.1) */
+					if (d == 0xf0 && (e == 0x9f || e == 0xaf || e == 0xbf) && f == 0xbf && (g == 0xbe || g == 0xbf))
+						illegal = TRUE;
+					/* Unicode 3.1 noncharacters */
+					/* U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE, U+6FFFF, U+7FFFE, U+7FFFF */
+					/* U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF, U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF */
+					/* U+CFFFE, U+CFFFF, U+DFFFE, U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF */
+					if ((d == 0xf1 || d == 0xf2 || d == 0xf3) && (e == 0x8f || e == 0x9f || e == 0xaf || e == 0xbf) && f == 0xbf && (g == 0xbe || g == 0xbf))
+						illegal = TRUE;
+					/* Unicode 3.1 noncharacters */
+					/* U+10FFFE, U+10FFFF */
+					if (d == 0xf4 && e == 0x8f && f == 0xbf && (g == 0xbe || g == 0xbf))
+						illegal = TRUE;
+					break;
 
 #	if 0	/* currently not used, see also check above */
-			case 5:
-				/* out of range or sequences which would also fit into 4 bytes */
-				if (d < 0xf8 || d > 0xfb || (d == 0xf8 && e < 0x88))
-					illegal = TRUE;
-				break;
+				case 5:
+					/* out of range or sequences which would also fit into 4 bytes */
+					if (d < 0xf8 || d > 0xfb || (d == 0xf8 && e < 0x88))
+						illegal = TRUE;
+					break;
 
-			case 6:
-				/* out of range or sequences which would also fit into 5 bytes */
-				if (d < 0xfc || d > 0xfd || (d == 0xfc && e < 0x84))
-					illegal = TRUE;
-				break;
+				case 6:
+					/* out of range or sequences which would also fit into 5 bytes */
+					if (d < 0xfc || d > 0xfd || (d == 0xfc && e < 0x84))
+						illegal = TRUE;
+					break;
 #	endif /* 0 */
 
-			default:
-				/*
-				 * with the check for plain US-ASCII above all other sequence
-				 * length are illegal.
-				 */
-				illegal = TRUE;
-				break;
-		}
-
-		if (!illegal) {
-			for (d = 1; d < numc; d++) {
-				e = *(c + d);
-				if (e < 0x80 || e > 0xbf || *(c + d) == '\0' || *(c + d) == '\n')
+				default:
+					/*
+					 * with the check for plain US-ASCII above all other sequence
+					 * length are illegal.
+					 */
 					illegal = TRUE;
+					break;
 			}
 		}
 
+		for (d = 1; d < numc && !illegal; d++) {
+			e = *(c + d);
+			if (e < 0x80 || e > 0xbf || e == '\0' || e == '\n')
+				illegal = TRUE;
+		}
+
 		if (!illegal)
 			c += numc; /* skip over valid sequence */
 		else {
@@ -3702,4 +3710,320 @@ utf8_valid(
 	}
 	return line;
 }
+#endif /* CHARSET_CONVERSION || (MULTIBYTE_ABLE && !NO_LOCALE) */
+
+
+char *idna_decode(
+	char *in)
+{
+	char *out = my_strdup(in);
+
+#if defined(HAVE_LIBIDN) && defined(HAVE_IDNA_TO_UNICODE_LZLZ)
+	if (stringprep_check_version("0.3.0")) {
+		char *q, *r = NULL;
+
+		if ((q = strrchr(out, '@')))
+			q++;
+		else
+			q = out;
+#	ifdef HAVE_IDNA_USE_STD3_ASCII_RULES
+		if (!idna_to_unicode_lzlz(q, &r, IDNA_USE_STD3_ASCII_RULES))
+#	else
+		if (!idna_to_unicode_lzlz(q, &r, 0))
+#	endif /* HAVE_IDNA_USE_STD3_ASCII_RULES */
+			strcpy(q, r);
+		FreeIfNeeded(r);
+	}
+#endif /* HAVE_LIBIDN && HAVE_IDNA_TO_UNICODE_LZLZ */
+
+	return out;
+}
+
+
+int
+tin_version_info(
+	FILE *fp)
+{
+	int wlines = 0;	/* written lines */
+
+#if defined(__DATE__) && defined(__TIME__)
+	fprintf(fp, _("Version: %s %s release %s (\"%s\") %s %s\n"),
+		PRODUCT, VERSION, RELEASEDATE, RELEASENAME, __DATE__, __TIME__);
+#else
+	fprintf(fp, _("Version: %s %s release %s (\"%s\")\n"),
+	       PRODUCT, VERSION, RELEASEDATE, RELEASENAME);
+#endif /* __DATE__ && __TIME__ */
+	wlines++;
+
+#ifdef SYSTEM_NAME
+	fprintf(fp, "Platform:\n");
+	fprintf(fp, "\tOS-Name  = \"%s\"\n", SYSTEM_NAME);
+	wlines += 2;
+#endif /* SYSTEM_NAME */
+
+#ifdef TIN_CC
+	fprintf(fp, "Compiler:\n");
+	fprintf(fp, "\tCC       = \"%s\"\n", TIN_CC);
+	wlines += 2;
+#	ifdef TIN_CFLAGS
+		fprintf(fp, "\tCFLAGS   = \"%s\"\n", TIN_CFLAGS);
+		wlines++;
+#	endif /* TIN_CFLAGS */
+#	ifdef TIN_CPP
+		fprintf(fp, "\tCPP      = \"%s\"\n", TIN_CPP);
+		wlines++;
+#	endif /* TIN_CPP */
+#	ifdef TIN_CPPFLAGS
+		fprintf(fp, "\tCPPFLAGS = \"%s\"\n", TIN_CPPFLAGS);
+		wlines++;
+#	endif /* TIN_CPPFLAGS */
+#endif /* TIN_CC */
+
+#ifdef TIN_LD
+	fprintf(fp, "Linker and Libraries:\n");
+	fprintf(fp, "\tLD       = \"%s\"\n", TIN_LD);
+	wlines += 2;
+#	ifdef TIN_LDFLAGS
+		fprintf(fp, "\tLDFLAGS  = \"%s\"\n", TIN_LDFLAGS);
+		wlines++;
+#	endif /* TIN_LDFLAGS */
+#	ifdef TIN_LIBS
+		fprintf(fp, "\tLIBS     = \"%s\"\n", TIN_LIBS);
+		wlines++;
+#	endif /* TIN_LIBS */
+#endif /* TIN_LD */
+	fprintf(fp, "\tPCRE     = \"%s\"\n", pcre_version());
+	wlines++;
+
+	fprintf(fp, "Characteristics:\n\t"
+/* TODO: complete list and do some useful grouping */
+#ifdef NNTP_ONLY
+			"+NNTP_ONLY "
+#else
+#	ifdef NNTP_ABLE
+			"+NNTP_ABLE "
+#	else
+			"-NNTP_ABLE "
+#	endif /* NNTP_ABLE */
+#endif /* NNTP_ONLY */
+#ifdef NO_POSTING
+			"+NO_POSTING "
+#else
+			"-NO_POSTING "
+#endif /* NO_POSTING */
+#ifdef BROKEN_LISTGROUP
+			"+BROKEN_LISTGROUP "
+#else
+			"-BROKEN_LISTGROUP "
+#endif /* BROKEN_LISTGROUP */
+#ifdef XHDR_XREF
+			"+XHDR_XREF"
+#else
+			"-XHDR_XREF"
+#endif /* XHDR_XREF */
+			"\n\t"
+#ifdef HAVE_FASCIST_NEWSADMIN
+			"+HAVE_FASCIST_NEWSADMIN "
+#else
+			"-HAVE_FASCIST_NEWSADMIN "
+#endif /* HAVE_FASCIST_NEWSADMIN */
+#ifdef ENABLE_IPV6
+			"+ENABLE_IPV6 "
+#else
+			"-ENABLE_IPV6 "
+#endif /* ENABLE_IPV6 */
+#ifdef HAVE_COREFILE
+			"+HAVE_COREFILE"
+#else
+			"-HAVE_COREFILE"
+#endif /* HAVE_COREFILE */
+			"\n\t"
+#ifdef NO_SHELL_ESCAPE
+			"+NO_SHELL_ESCAPE "
+#else
+			"-NO_SHELL_ESCAPE "
+#endif /* NO_SHELL_ESCAPE */
+#ifdef DISABLE_PRINTING
+			"+DISABLE_PRINTING "
+#else
+			"-DISABLE_PRINTING "
+#endif /* DISABLE_PRINTING */
+#ifdef DONT_HAVE_PIPING
+			"+DONT_HAVE_PIPING "
+#else
+			"-DONT_HAVE_PIPING "
+#endif /* DONT_HAVE_PIPING */
+#ifdef NO_ETIQUETTE
+			"+NO_ETIQUETTE"
+#else
+			"-NO_ETIQUETTE"
+#endif /* NO_ETIQUETTE */
+			"\n\t"
+#ifdef HAVE_LONG_FILE_NAMES
+			"+HAVE_LONG_FILE_NAMES "
+#else
+			"-HAVE_LONG_FILE_NAMES "
+#endif /* HAVE_LONG_FILE_NAMES */
+#ifdef APPEND_PID
+			"+APPEND_PID "
+#else
+			"-APPEND_PID "
+#endif /* APPEND_PID */
+#ifdef HAVE_MH_MAIL_HANDLING
+			"+HAVE_MH_MAIL_HANDLING"
+#else
+			"-HAVE_MH_MAIL_HANDLING"
+#endif /* HAVE_MH_MAIL_HANDLING */
+			"\n\t"
+#ifdef HAVE_ISPELL
+			"+HAVE_ISPELL "
+#else
+			"-HAVE_ISPELL "
+#endif /* HAVE_ISPELL */
+#ifdef HAVE_METAMAIL
+			"+HAVE_METAMAIL "
+#else
+			"-HAVE_METAMAIL "
+#endif /* HAVE_METAMAIL */
+#ifdef HAVE_SUM
+			"+HAVE_SUM"
+#else
+			"-HAVE_SUM"
+#endif /* HAVE_SUM */
+			"\n\t"
+#ifdef HAVE_COLOR
+			"+HAVE_COLOR "
+#else
+			"-HAVE_COLOR "
+#endif /* HAVE_COLOR */
+#ifdef HAVE_PGP
+			"+HAVE_PGP "
+#else
+			"-HAVE_PGP "
+#endif /* HAVE_PGP */
+#ifdef HAVE_PGPK
+			"+HAVE_PGPK "
+#else
+			"-HAVE_PGPK "
+#endif /* HAVE_PGPK */
+#ifdef HAVE_GPG
+			"+HAVE_GPG"
+#else
+			"-HAVE_GPG"
+#endif /* HAVE_GPG */
+			"\n\t"
+#ifdef MIME_BREAK_LONG_LINES
+			"+MIME_BREAK_LONG_LINES "
+#else
+			"-MIME_BREAK_LONG_LINES "
+#endif /* MIME_BREAK_LONG_LINES */
+#ifdef MIME_STRICT_CHARSET
+			"+MIME_STRICT_CHARSET "
+#else
+			"-MIME_STRICT_CHARSET "
+#endif /* MIME_STRICT_CHARSET */
+#ifdef CHARSET_CONVERSION
+			"+CHARSET_CONVERSION"
+#else
+			"-CHARSET_CONVERSION"
 #endif /* CHARSET_CONVERSION */
+			"\n\t"
+#ifdef MULTIBYTE_ABLE
+			"+MULTIBYTE_ABLE "
+#else
+			"-MULTIBYTE_ABLE "
+#endif /* MULTIBYTE_ABLE */
+#ifdef NO_LOCALE
+			"+NO_LOCALE"
+#else
+			"-NO_LOCALE"
+#endif /* NO_LOCALE */
+			"\n\t"
+#ifdef USE_CANLOCK
+			"+USE_CANLOCK "
+#else
+			"-USE_CANLOCK "
+#endif /* USE_CANLOCK */
+#ifdef EVIL_INSIDE
+			"+EVIL_INSIDE "
+#else
+			"-EVIL_INSIDE "
+#endif /* EVIL_INSIDE */
+#ifdef FORGERY
+			"+FORGERY "
+#else
+			"-FORGERY "
+#endif /* FORGERY */
+#ifdef TINC_DNS
+			"+TINC_DNS "
+#else
+			"-TINC_DNS "
+#endif /* TINC_DNS */
+#ifdef ENFORCE_RFC1034
+			"+ENFORCE_RFC1034"
+#else
+			"-ENFORCE_RFC1034"
+#endif /* ENFORCE_RFC1034 */
+			"\n\t"
+#ifdef REQUIRE_BRACKETS_IN_DOMAIN_LITERAL
+			"+REQUIRE_BRACKETS_IN_DOMAIN_LITERAL "
+#else
+			"-REQUIRE_BRACKETS_IN_DOMAIN_LITERAL "
+#endif /* REQUIRE_BRACKETS_IN_DOMAIN_LITERAL */
+#ifdef FOLLOW_USEFOR_DRAFT
+			"+FOLLOW_USEFOR_DRAFT"
+#else
+			"-FOLLOW_USEFOR_DRAFT"
+#endif /* FOLLOW_USEFOR_DRAFT */
+			"\n");
+	wlines += 11;
+
+	fflush(fp);
+	return wlines;
+}
+
+
+void
+draw_mark_selected(
+	int i)
+{
+	MoveCursor(INDEX2LNUM(i), MARK_OFFSET);
+	StartInverse();	/* ToggleInverse() doesn't work correct with ncurses4.x */
+	my_fputc(tinrc.art_marked_selected, stdout);
+	EndInverse();	/* ToggleInverse() doesn't work correct with ncurses4.x */
+	return;
+}
+
+
+#if 0
+/*
+ * Stat a mail/news article to see if it still exists
+ */
+static t_bool
+stat_article(
+	long art,
+	const char *group_path)
+{
+	char buf[NNTP_STRLEN];
+	struct t_group currgrp;
+
+	currgrp = CURR_GROUP;
+
+#	ifdef NNTP_ABLE
+	if (read_news_via_nntp && currgrp.type == GROUP_TYPE_NEWS) {
+		snprintf(buf, sizeof(buf), "STAT %ld", art);
+		return (nntp_command(buf, OK_NOTEXT, NULL, 0) != NULL);
+	} else
+#	endif /* NNTP_ABLE */
+	{
+		struct stat sb;
+
+		joinpath(buf, currgrp.spooldir, group_path);
+		snprintf(&buf[strlen(buf)], sizeof(buf), "/%ld", art);
+
+		return (stat(buf, &sb) != -1);
+	}
+}
+#endif /* 0 */
+
+
diff -Nurp tin-1.6.2/src/my_tmpfile.c tin-1.8.0/src/my_tmpfile.c
--- tin-1.6.2/src/my_tmpfile.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/my_tmpfile.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : my_tmpfile.c
  *  Author    : Urs Janssen <urs@tin.org>
  *  Created   : 2001-03-11
- *  Updated   : 2001-04-23
+ *  Updated   : 2004-06-30
  *  Notes     :
  *
- * Copyright (c) 2001-2003 Urs Janssen <urs@tin.org>
+ * Copyright (c) 2001-2006 Urs Janssen <urs@tin.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,10 +44,10 @@
  *
  * try to create a uniq tmp-file descriptor
  *
- * returncodes:
+ * return codes:
  * >0 = file descriptor of tmpfile
  *      if need_name is set to true and/or we have to unlink the file
- *      ourself. filename is set to the name of the tmp file located in
+ *      ourself filename is set to the name of the tmp file located in
  *      base_dir
  * -1 = some error occured
  */
@@ -65,7 +65,8 @@ my_tmpfile(
 
 	if (filename != NULL && name_size > 0) {
 		if (!need_name) {
-			FILE *fp = (FILE *) 0;
+			FILE *fp;
+
 			if ((fp = tmpfile()) != NULL)
 				fd = fileno(fp);
 #ifdef DEBUG
diff -Nurp tin-1.6.2/src/newsrc.c tin-1.8.0/src/newsrc.c
--- tin-1.6.2/src/newsrc.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/newsrc.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : newsrc.c
  *  Author    : I. Lea & R. Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 2003-06-29
+ *  Updated   : 2005-05-04
  *  Notes     : ArtCount = (ArtMax - ArtMin) + 1  [could have holes]
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -43,21 +43,24 @@
 #endif /* !TCURSES_H */
 #ifndef TNNTP_H
 #	include "tnntp.h"
-#endif /* TNNTP_H */
-
-#define BITS_TO_BYTES(n)	((size_t) ((n + NBITS - 1) / NBITS))
+#endif /* !TNNTP_H */
+#ifndef NEWSRC_H
+#	include "newsrc.h"
+#endif /* !NEWSRC_H */
 
 static mode_t newsrc_mode = 0;
 
 /*
  * Local prototypes
  */
+static FILE *open_subscription_fp(void);
 static char *parse_newsrc_line(char *line, int *sub);
 static char *parse_subseq(struct t_group *group, char *seq, long *low, long *high, int *sum);
 static char *parse_get_seq(char *seq, long *low, long *high);
 static int write_newsrc_line(FILE *fp, char *line);
 static t_bool create_newsrc(char *newsrc_file);
 static void auto_subscribe_groups(char *newsrc_file);
+static void get_subscribe_info(struct t_group *grp);
 static void parse_bitmap_seq(struct t_group *group, char *seq);
 static void print_bitmap_seq(FILE *fp, struct t_group *group);
 
@@ -88,7 +91,7 @@ read_newsrc(
 		selmenu.max = skip_newgroups();
 
 	/*
-	 * make a .newsrc if one doesn't exist & auto subscribe to set groups
+	 * make a .newsrc if none exist & auto subscribe to set groups
 	 */
 	if (stat(newsrc_file, &statbuf) == -1) {
 		if (!create_newsrc(newsrc_file))
@@ -269,6 +272,28 @@ create_newsrc(
 
 
 /*
+ * Get a list of default groups to subscribe to
+ */
+static FILE *
+open_subscription_fp(
+	void)
+{
+	if (!read_saved_news) {
+#ifdef NNTP_ABLE
+		if (read_news_via_nntp) {
+			/* if (nntp_caps.type = 2 && !nntp_caps.list_subscriptions)
+				return NULL;
+			else */
+				return (nntp_command("LIST SUBSCRIPTIONS", OK_GROUPS, NULL, 0));
+		} else
+#endif /* NNTP_ABLE */
+			return (fopen(subscriptions_file, "r"));
+	} else
+		return NULL;
+}
+
+
+/*
  * Automatically subscribe user to newsgroups specified in
  * NEWSLIBDIR/subscriptions (locally) or same file but from NNTP
  * server (LIST SUBSCRIPTIONS) and create .newsrc
@@ -331,7 +356,7 @@ backup_newsrc(
 	else
 #endif /* NNTP_ABLE */
 	{
-		STRCPY(filebuf, nntp_server);
+		STRCPY(filebuf, quote_space_to_dash(nntp_server));
 	}
 	JOINPATH(dirbuf, rcdir, filebuf);
 	joinpath(filebuf, dirbuf, OLDNEWSRC_FILE);
@@ -348,6 +373,123 @@ backup_newsrc(
 
 
 /*
+ * Find the total, max & min articles number for specified group
+ * Use nntp GROUP command or read local spool
+ * Return 0, or -error
+ */
+int
+group_get_art_info(
+	char *tin_spooldir,
+	char *groupname,
+	int grouptype,
+	long *art_count,
+	long *art_max,
+	long *art_min)
+{
+	DIR *dir;
+	DIR_BUF *direntry;
+	char buf[NNTP_STRLEN];
+	long artnum;
+
+	if (read_news_via_nntp && grouptype == GROUP_TYPE_NEWS) {
+#ifdef NNTP_ABLE
+		char line[NNTP_STRLEN];
+
+		snprintf(buf, sizeof(buf), "GROUP %s", groupname);
+#	ifdef DEBUG
+		debug_nntp("group_get_art_info", buf);
+#	endif /* DEBUG */
+		put_server(buf);
+
+		switch (get_respcode(line, sizeof(line))) {
+			case OK_GROUP:
+				if (sscanf(line, "%ld %ld %ld", art_count, art_min, art_max) != 3)
+					error_message(_(txt_error_invalid_response_to_group), line);
+				break;
+
+			case ERR_NOGROUP:
+				*art_count = 0;
+				*art_min = 1;
+				*art_max = 0;
+				return -ERR_NOGROUP;
+
+			case ERR_ACCESS:
+				error_message("%s%s", cCRLF, line);
+				tin_done(NNTP_ERROR_EXIT);
+				/* keep lint quiet: */
+				/* NOTREACHED */
+				break;
+
+			default:
+#	ifdef DEBUG
+				debug_nntp("NOT_OK", line);
+#	endif /* DEBUG */
+				return -1;
+		}
+#else
+		my_fprintf(stderr, _("Unreachable?\n"));
+		return 0;
+#endif /* NNTP_ABLE */
+	} else {
+		*art_count = 0;
+		*art_min = 1;
+		*art_max = 0;
+
+		make_base_group_path(tin_spooldir, groupname, buf);
+
+		if ((dir = opendir(buf)) != NULL) {
+			while ((direntry = readdir(dir)) != NULL) {
+				artnum = atol(direntry->d_name); /* should be '\0' terminated... */
+				if (artnum >= 1) {
+					if (artnum > *art_max) {
+						*art_max = artnum;
+						if (*art_min == 0)
+							*art_min = artnum;
+					} else if (artnum < *art_min)
+						*art_min = artnum;
+					(*art_count)++;
+				}
+			}
+			CLOSEDIR(dir);
+		} else
+			return -1;
+	}
+
+	return 0;
+}
+
+
+/*
+ * Get and fixup (if needed) the counters for a newly subscribed group
+ */
+static void
+get_subscribe_info(
+	struct t_group *grp)
+{
+	long oldmin = grp->xmin;
+	long oldmax = grp->xmax;
+
+	group_get_art_info(grp->spooldir, grp->name, grp->type, &grp->count, &grp->xmax, &grp->xmin);
+
+	if (grp->newsrc.num_unread > grp->count) {
+#ifdef DEBUG
+		my_printf(cCRLF "Unread WRONG %s unread=[%ld] count=[%ld]", grp->name, grp->newsrc.num_unread, grp->count);
+		my_flush();
+#endif /* DEBUG */
+		grp->newsrc.num_unread = grp->count;
+	}
+
+	if (grp->xmin != oldmin || grp->xmax != oldmax) {
+		expand_bitmap(grp, 0);
+#ifdef DEBUG
+		my_printf(cCRLF "Min/Max DIFF %s old=[%ld-%ld] new=[%ld-%ld]", grp->name, oldmin, oldmax, grp->xmin, grp->xmax);
+		my_flush();
+#endif /* DEBUG */
+	}
+}
+
+
+/*
  * Subscribe/unsubscribe to a group in .newsrc.
  * This involves rewriting the .newsrc with the new info
  * If get_info is set we are allowed to issue NNTP commands if needed
@@ -398,7 +540,7 @@ subscribe(
 			if (sub_state == SUBSCRIBED) {
 				fprintf(newfp, "%s%c ", group->name, sub_state);
 				if (get_info) {
-					vGet1GrpArtInfo(group);
+					get_subscribe_info(group);
 					print_bitmap_seq(newfp, group);
 				} else /* we are not allowed to issue NNTP cmds during AUTOSUBSCRIBE loop */
 					fprintf(newfp, "1\n");
@@ -538,10 +680,7 @@ grp_mark_unread(
 	if (group->xmin > 0)
 		group->newsrc.xmin = group->xmin;
 
-	bitlength = (group->newsrc.xmax - group->newsrc.xmin) + 1;
-
-	if (bitlength < 0)
-		bitlength = 0;
+	bitlength = MAX(0, group->newsrc.xmax - group->newsrc.xmin + 1);
 
 	if (bitlength > 0)
 		newbitmap = my_malloc(BITS_TO_BYTES(bitlength));
@@ -616,7 +755,8 @@ parse_bitmap_seq(
 #ifdef DEBUG_NEWSRC
 	{
 		char buf[NEWSRC_LINE];
-		sprintf(buf, "Parsing [%s%c %.*s]", group->name, SUB_CHAR(group->subscribed), (int) (NEWSRC_LINE - strlen(group->name) - 20), ptr);
+
+		snprintf(buf, sizeof(buf), "Parsing [%s%c %.*s]", group->name, SUB_CHAR(group->subscribed), (int) (NEWSRC_LINE - strlen(group->name) - 20), ptr);
 		debug_print_comment(buf);
 		debug_print_bitmap(group, NULL);
 	}
@@ -858,7 +998,7 @@ parse_unread_arts(
 		 * check for wrong article numbers in the overview
 		 *
 		 * TODO: check disabled as we currently catch the artnum > high_mark
-		 *       case in read_nov_file() where we might be able to
+		 *       case in read_overview() where we might be able to
 		 *       fix the broken artnum (via xref:-parsing). currently
 		 *       we just skip the art there.
 		 */
@@ -993,16 +1133,16 @@ pos_group_in_newsrc(
 
 #ifdef VMS
 	joinpath(buf, TMPDIR, "subrc");
-	sprintf(sub, "%s.%d", buf, (int) process_id);
+	snprintf(sub, sizeof(sub), "%s.%d", buf, (int) process_id);
 
 	joinpath(buf, TMPDIR, "unsubrc");
-	sprintf(unsub, "%s.%d", buf, (int) process_id);
+	snprintf(unsub, sizeof(unsub), "%s.%d", buf, (int) process_id);
 #else
 	joinpath(buf, TMPDIR, ".subrc");
-	sprintf(sub, "%s.%d", buf, (int) process_id);
+	snprintf(sub, sizeof(sub), "%s.%d", buf, (int) process_id);
 
 	joinpath(buf, TMPDIR, ".unsubrc");
-	sprintf(unsub, "%s.%d", buf, (int) process_id);
+	snprintf(unsub, sizeof(unsub), "%s.%d", buf, (int) process_id);
 #endif /* !VMS */
 
 	if ((fp_sub = fopen(sub, "w" FOPEN_OPTS)) == NULL)
@@ -1248,16 +1388,15 @@ expand_bitmap(
 		debug_print_comment("expand_bitmap: group->newsrc.xbitmap == NULL");
 #endif /* DEBUG_NEWSRC */
 	} else if (need_full_copy) {
-		t_bitmap *newbitmap;
-		newbitmap = my_malloc(BITS_TO_BYTES(bitlen));
+		t_bitmap *newbitmap = my_malloc(BITS_TO_BYTES(bitlen));
 
 		/* Copy over old bitmap */
 		/* TODO: change to use shift */
 		for (tmp = group->newsrc.xmin; tmp <= group->newsrc.xmax; tmp++) {
-			if (NTEST(group->newsrc.xbitmap, tmp - group->newsrc.xmin))
-				NSET1(newbitmap, tmp - first);
-			else
+			if (NTEST(group->newsrc.xbitmap, tmp - group->newsrc.xmin) == ART_READ)
 				NSET0(newbitmap, tmp - first);
+			else
+				NSET1(newbitmap, tmp - first);
 		}
 
 		/* Mark earlier articles as read, updating num_unread */
@@ -1344,72 +1483,55 @@ art_mark(
 	struct t_article *art,
 	int flag)
 {
-	if (art != NULL) {
-		switch (flag) {
-			case ART_READ:
-				if (group != NULL) {
-					if (art->artnum >= group->newsrc.xmin && art->artnum <= group->newsrc.xmax)
-						NSET0(group->newsrc.xbitmap, art->artnum - group->newsrc.xmin);
+	if (art == NULL)
+		return;
+
+	switch (flag) {
+		case ART_READ:
+			if (group != NULL) {
+				if (art->artnum >= group->newsrc.xmin && art->artnum <= group->newsrc.xmax)
+					NSET0(group->newsrc.xbitmap, art->artnum - group->newsrc.xmin);
 #ifdef DEBUG_NEWSRC
-					debug_print_bitmap(group, art);
+				debug_print_bitmap(group, art);
 #endif /* DEBUG_NEWSRC */
-				}
-				if ((art->status == ART_UNREAD) || (art->status == ART_WILL_RETURN)) {
-					art_mark_xref_read(art);
+			}
+			if ((art->status == ART_UNREAD) || (art->status == ART_WILL_RETURN)) {
+				art_mark_xref_read(art);
 
-					if (group != NULL && group->newsrc.num_unread)
-						group->newsrc.num_unread--;
+				if (group != NULL && group->newsrc.num_unread)
+					group->newsrc.num_unread--;
 
-					art->status = ART_READ;
-				}
-				break;
+				art->status = ART_READ;
+			}
+			break;
 
-			case ART_UNREAD:
-			case ART_WILL_RETURN:
-				if (art->status == ART_READ) {
-					if (group != NULL)
-						group->newsrc.num_unread++;
+		case ART_UNREAD:
+		case ART_WILL_RETURN:
+			if (art->status == ART_READ) {
+				if (group != NULL)
+					group->newsrc.num_unread++;
 
-					art->status = flag;
-				}
-				if (group != NULL) {
-					if (art->artnum < group->newsrc.xmin)
-						expand_bitmap(group, art->artnum);
-					else {
-						NSET1(group->newsrc.xbitmap, art->artnum - group->newsrc.xmin);
+				art->status = flag;
+			}
+			if (group != NULL) {
+				if (art->artnum < group->newsrc.xmin)
+					expand_bitmap(group, art->artnum);
+				else {
+					NSET1(group->newsrc.xbitmap, art->artnum - group->newsrc.xmin);
 #ifdef DEBUG_NEWSRC
-						debug_print_bitmap(group, art);
+					debug_print_bitmap(group, art);
 #endif /* DEBUG_NEWSRC */
-					}
 				}
-				break;
+			}
+			break;
 
-			default:
-				break;
-		}
+		default:
+			break;
 	}
 }
 
 
 void
-art_mark_deleted(
-	struct t_article *art)
-{
-	if (art != NULL)
-		art->delete_it = TRUE;
-}
-
-
-void
-art_mark_undeleted(
-	struct t_article *art)
-{
-	if (art != NULL)
-		art->delete_it = FALSE;
-}
-
-
-void
 set_default_bitmap(
 	struct t_group *group)
 {
@@ -1432,22 +1554,18 @@ set_default_bitmap(
 
 /* TEST harness */
 #ifdef DEBUG_NEWSRC
-
-#	ifdef DEBUG_NEWSRC_FIXME	/* something's broken here */
-		static void set_bitmap_range_read(struct t_newsrc *newsrc, long beg, long end);
-		static void set_bitmap_range_unread(struct t_newsrc *newsrc, long beg, long end);
-#	endif /* DEBUG_NEWSRC_FIXME */
+#	if 0
+static void set_bitmap_range_read(struct t_newsrc *my_newsrc, long beg, long end);
+static void set_bitmap_range_unread(struct t_newsrc *my_newsrc, long beg, long end);
 
 void
-vNewsrcTestHarness(
+newsrc_test_harness(
 	void)
 {
+	FILE *fp = NULL;
 	char seq[20000];
-	char *temp_file = NULL;
-	FILE *fp;
 	int i;
 	int retry = 10; /* max. retrys */
-	int fd;
 	long rng_min, rng_max;
 	struct t_group group;
 
@@ -1470,7 +1588,7 @@ vNewsrcTestHarness(
 
 	strcpy(seq, get_val("TIN_SEQ", ""));
 
-	my_printf("\nENV Min=[%ld] Max=[%ld] Rng=[%ld-%ld] Count=[%ld] Seq=[%s]\n",
+	fprintf(stderr, "\nENV Min=[%ld] Max=[%ld] Rng=[%ld-%ld] Count=[%ld] Seq=[%s]\n",
 		group.xmin, group.xmax, rng_min, rng_max, group.count, seq);
 
 	for (i = 0; i < 3; i++) {
@@ -1485,74 +1603,65 @@ vNewsrcTestHarness(
 		while (retry) {
 		/* FIXME - this is secure now, but doesn't write any debug output */
 		/* (it didn't before too) */
-			if ((temp_file = my_tempnam("", "NEWSRC")) != NULL) {
-				if ((fd = open (temp_file, (O_CREAT|O_EXCL), (S_IRUSR|S_IWUSR))) != -1) {
-					if ((fp = fopen(temp_file, "w")) != NULL) {
-						my_printf("\n%d. PARSE Seq=[%s]\n", i + 1, seq);
-						parse_bitmap_seq(&group, seq);
-						debug_print_newsrc(&group.newsrc, stdout);
-						print_bitmap_seq(fp, &group);
-						my_printf("   PRINT Seq=[");
-						print_bitmap_seq(stdout, &group);
-						fclose(fp);
-					} else
-						retry--;
-					close(fd);
-					break;
-				} else
-					retry--;
+			if ((fp = tmpfile()) != NULL) {
+				fprintf(stderr, "\n%d. PARSE Seq=[%s]\n", i + 1, seq);
+				parse_bitmap_seq(&group, seq);
+				debug_print_newsrc(&group.newsrc, stderr);
+				print_bitmap_seq(fp, &group);
+				fprintf(stderr, "   PRINT Seq=");
+				print_bitmap_seq(stderr, &group);
+				rewind(fp);
+				break;
 			} else
 				retry--;
 		}
 
-		debug_print_newsrc(&group.newsrc, stdout);
+		debug_print_newsrc(&group.newsrc, stderr);
 
-		if (!retry)
+		if (!retry || !fp)
 			error_message(_(txt_cannot_create_uniq_name));
 		else {
-			fp = fopen(temp_file, "r");
 			fgets(seq, (int) sizeof(seq), fp);
 			seq[strlen(seq) - 1] = '\0';
 			fclose(fp);
 		}
 	}
-#	ifdef DEBUG_NEWSRC_FIXME	/* something's broken here */
 	set_bitmap_range_read(&group.newsrc, rng_min, rng_max);
-	debug_print_newsrc(&group.newsrc, stdout);
+	debug_print_newsrc(&group.newsrc, stderr);
 
 	set_bitmap_range_unread(&group.newsrc, rng_min, rng_max);
-	debug_print_newsrc(&group.newsrc, stdout);
-
-	NSETBLK0(group.newsrc.xbitmap, group.newsrc.xbitlen);
-	debug_print_newsrc(&group.newsrc, stdout);
+	debug_print_newsrc(&group.newsrc, stderr);
 
-	NSETBLK1(group.newsrc.xbitmap, group.newsrc.xbitlen);
-	debug_print_newsrc(&group.newsrc, stdout);
-#	endif /* DEBUG_NEWSRC_FIXME */
+	if (group.newsrc.xbitmap != NULL)
+		NSETBLK0(group.newsrc.xbitmap, group.newsrc.xbitlen);
+	debug_print_newsrc(&group.newsrc, stderr);
+
+	if (group.newsrc.xbitmap != NULL)
+		NSETBLK1(group.newsrc.xbitmap, group.newsrc.xbitlen);
+	debug_print_newsrc(&group.newsrc, stderr);
 	my_printf("\n");
 }
 
 
-#	ifdef DEBUG_NEWSRC_FIXME	/* something's broken here */
 static void
 set_bitmap_range_read(
-	struct t_newsrc *newsrc,
+	struct t_newsrc *my_newsrc,
 	long beg,
 	long end)
 {
 	long length, offset;
 
-	if (beg >= newsrc->xmin && end <= newsrc->xmax) {
-		offset = beg - newsrc->xmin;
-		length = end - newsrc->xmin;
+	if (beg >= my_newsrc->xmin && end <= my_newsrc->xmax) {
+		offset = beg - my_newsrc->xmin;
+		length = end - my_newsrc->xmin;
 
-my_printf("\nRNG Min-Max=[%ld-%ld] Beg-End=[%ld-%ld] OFF=[%ld] LEN=[%ld]\n",
-newsrc->xmin, newsrc->xmax, beg, end, offset, length);
+fprintf(stderr, "\nRNG Min-Max=[%ld-%ld] Beg-End=[%ld-%ld] OFF=[%ld] LEN=[%ld]\n",
+my_newsrc->xmin, my_newsrc->xmax, beg, end, offset, length);
 
 		if (beg == end) {
-			NSET0(newsrc->xbitmap, offset);
+			NSET0(my_newsrc->xbitmap, offset);
 		} else {
-			NSETRNG0(newsrc->xbitmap, offset, length);
+			NSETRNG0(my_newsrc->xbitmap, offset, length);
 		}
 	}
 }
@@ -1560,24 +1669,25 @@ newsrc->xmin, newsrc->xmax, beg, end, of
 
 static void
 set_bitmap_range_unread(
-	struct t_newsrc *newsrc,
+	struct t_newsrc *my_newsrc,
 	long beg,
 	long end)
 {
 	long length, offset;
 
-	if (beg >= newsrc->xmin && end <= newsrc->xmax) {
-		offset = beg - newsrc->xmin;
-		length = end - newsrc->xmin;
+	if (beg >= my_newsrc->xmin && end <= my_newsrc->xmax) {
+		offset = beg - my_newsrc->xmin;
+		length = end - my_newsrc->xmin;
 
-my_printf("\nRNG Min-Max=[%ld-%ld] Beg-End=[%ld-%ld] OFF=[%ld] LEN=[%ld]\n", newsrc->xmin, newsrc->xmax, beg, end, offset, length);
+fprintf(stderr, "\nRNG Min-Max=[%ld-%ld] Beg-End=[%ld-%ld] OFF=[%ld] LEN=[%ld]\n",
+my_newsrc->xmin, my_newsrc->xmax, beg, end, offset, length);
 
 		if (beg == end) {
-			NSET1(newsrc->xbitmap, offset);
+			NSET1(my_newsrc->xbitmap, offset);
 		} else {
-			NSETRNG1(newsrc->xbitmap, offset, length);
+			NSETRNG1(my_newsrc->xbitmap, offset, length);
 		}
 	}
 }
-#	endif /* DEBUG_NEWSRC_FIXME */
+#	endif /* 0 */
 #endif /* DEBUG_NEWSRC */
diff -Nurp tin-1.6.2/src/nntplib.c tin-1.8.0/src/nntplib.c
--- tin-1.6.2/src/nntplib.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/nntplib.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,7 +3,7 @@
  *  Module    : nntplib.c
  *  Author    : S. Barber & I. Lea
  *  Created   : 1991-01-12
- *  Updated   : 2003-06-29
+ *  Updated   : 2005-11-17
  *  Notes     : NNTP client routines taken from clientlib.c 1.5.11 (1991-02-10)
  *  Copyright : (c) Copyright 1991-99 by Stan Barber & Iain Lea
  *              Permission is hereby granted to copy, reproduce, redistribute
@@ -29,46 +29,56 @@
 #	undef VMS
 #endif /* VMS */
 
-/* Copy of last NNTP command sent, so we can retry it if needed */
-char last_put[NNTP_STRLEN];
+char *nntp_server = NULL;
+#ifdef NO_POSTING
+	t_bool can_post = FALSE;
+#else
+	t_bool can_post = TRUE;
+#endif /* NO_POSTING */
 
 /* Flag to show whether tin did reconnect in last get_server() */
 t_bool reconnected_in_last_get_server = FALSE;
 
-/* Set so we don't reconnect just to QUIT */
-t_bool quitting = FALSE;
-
 static TCP *nntp_rd_fp = NULL;
 static TCP *nntp_wr_fp = NULL;
 
+#ifdef NNTP_ABLE
+	/* Copy of last NNTP command sent, so we can retry it if needed */
+	static char last_put[NNTP_STRLEN];
+	static constext *xover_cmds = "XOVER";
+#	if 0 /* currently not used */
+	static constext *xhdr_cmds = "XHDR";
+#	endif /* 0 */
+	enum extension_type { NO, LIST_EXTENSIONS, CAPABILITIES };
+	/* Set so we don't reconnect just to QUIT */
+	static t_bool quitting = FALSE;
+#endif /* NNTP_ABLE */
 
 /*
  * local prototypes
  */
 #ifdef NNTP_ABLE
+	static int mode_reader(t_bool *sec);
+	static int new_nntp_command(const char *command, int success, char *message, size_t mlen);
 	static int reconnect(int retry);
+	static int server_init(char *machine, const char *cservice, int port, char *text, size_t mlen);
+	static int check_extensions(t_bool *sec);
+	static void close_server(void);
+	static void list_motd(void);
 #	ifdef INET6
 		static int get_tcp6_socket(char *machine, unsigned short port);
 #	else
 		static int get_tcp_socket(char *machine, char *service, unsigned short port);
 #	endif /* INET6 */
-#endif /* NNTP_ABLE */
-
-#ifdef NNTP_ABLE
-/* Close the NNTP connection with prejudice */
-#	define NNTP_HARD_CLOSE					\
-		if (nntp_wr_fp)						\
-			s_fclose(nntp_wr_fp);			\
-		if (nntp_rd_fp)						\
-			s_fclose(nntp_rd_fp);			\
-		nntp_rd_fp = nntp_wr_fp = NULL;
+#	ifdef DECNET
+		static int get_dnet_socket(char *machine, char *service);
+#	endif /* DECNET */
 #endif /* NNTP_ABLE */
 
 
 /*
  * Return the actual fd in use for the nntp read-side socket
- * This is a bit of a leak of internal state, but it's use is very
- * localised
+ * This is a leak of internal state and should go away if possible
  */
 FILE *
 get_nntp_fp(
@@ -114,7 +124,7 @@ getserverbyfile(
 	char *new_env;
 	static char *old_env = NULL;
 #	endif /* !HAVE_SETENV && HAVE_PUTENV */
-#endif
+#endif /* NNTP_ABLE */
 	if (!read_news_via_nntp) {
 		STRCPY(buf, "local");	/* what if a server is named "local"? */
 		return buf;
@@ -130,7 +140,7 @@ getserverbyfile(
 		setenv("NNTPSERVER", buf, 1);
 #	else
 #		ifdef HAVE_PUTENV
-		sprintf(tmpbuf, "NNTPSERVER=%s", buf);
+		snprintf(tmpbuf, sizeof(tmpbuf), "NNTPSERVER=%s", buf);
 		new_env = my_strdup(tmpbuf);
 		putenv(new_env);
 		FreeIfNeeded(old_env);
@@ -146,7 +156,7 @@ getserverbyfile(
 	}
 
 	if (file == NULL)
-		return (char *) 0;
+		return NULL;
 
 	if ((fp = fopen(file, "r")) != NULL) {
 
@@ -182,7 +192,7 @@ getserverbyfile(
 #	endif /* NNTP_DEFAULT_SERVER */
 
 #endif /* NNTP_ABLE */
-	return (char *) 0;	/* No entry */
+	return NULL;	/* No entry */
 }
 
 
@@ -202,7 +212,7 @@ getserverbyfile(
  *			"text" is updated to contain the rest of response string from server
  */
 #ifdef NNTP_ABLE
-int
+static int
 server_init(
 	char *machine,
 	const char *cservice,	/* usually a literal */
@@ -212,17 +222,12 @@ server_init(
 {
 #	ifndef INET6
 	char temp[256];
-	char *service = strncpy(temp, cservice, 255); /* ...calls non-const funcs */
+	char *service = strncpy(temp, cservice, sizeof(temp) - 1); /* ...calls non-const funcs */
 #	endif /* !INET6 */
 #	ifndef VMS
 	int sockt_rd, sockt_wr;
 #	endif /* !VMS */
 
-#	ifdef M_AMIGA
-	if (!s_init())		/* some initialisation ... */
-		return -1;
-#	endif /* M_AMIGA */
-
 #	ifdef DECNET
 	char *cp;
 
@@ -331,7 +336,7 @@ get_tcp_socket(
 	else
 		strcpy(device, "/dev/tcp");
 
-	if ((s = t_open(device, O_RDWR, (struct t_info *) 0)) < 0){
+	if ((s = t_open(device, O_RDWR, (struct t_info *) 0)) < 0) {
 		t_error(txt_error_topen);
 		return -EPROTO;
 	}
@@ -365,7 +370,7 @@ get_tcp_socket(
 	 * Allocate a t_call structure and initialize it.
 	 * Let t_alloc() initialize the addr structure of the t_call structure.
 	 */
-	if ((callptr = (struct t_call *) t_alloc(s, T_CALL, T_ADDR)) == NULL){
+	if ((callptr = (struct t_call *) t_alloc(s, T_CALL, T_ADDR)) == NULL) {
 		t_error("t_alloc");
 		t_close(s);
 		return -EPROTO;
@@ -399,7 +404,7 @@ get_tcp_socket(
 
 	t_free((char *) callptr, T_CALL);
 
-	if (ioctl(s, I_POP, (char *) 0) < 0) {
+	if (ioctl(s, I_POP, NULL) < 0) {
 		perror("I_POP(timod)");
 		t_close(s);
 		return -EPROTO;
@@ -625,8 +630,8 @@ get_tcp6_socket(
 #		endif /* PF_UNSPEC */
 #	endif /* AF_UNSPEC */
 	memset(&hints, 0, sizeof(hints));
-/*	hints.ai_flags    = AI_CANONNAME; */
-	hints.ai_family   = ADDRFAM;
+/*	hints.ai_flags = AI_CANONNAME; */
+	hints.ai_family = ADDRFAM;
 	hints.ai_socktype = SOCK_STREAM;
 	res = (struct addrinfo *) 0;
 	res0 = (struct addrinfo *) 0;
@@ -639,7 +644,7 @@ get_tcp6_socket(
 	for (res = res0; res; res = res->ai_next) {
 		if ((s = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) < 0)
 			continue;
-		if (connect(s, res->ai_addr, res->ai_addrlen) < 0)
+		if (connect(s, res->ai_addr, res->ai_addrlen) != 0)
 			close(s);
 		else {
 			err = 0;
@@ -649,6 +654,9 @@ get_tcp6_socket(
 	if (res0 != NULL)
 		freeaddrinfo(res0);
 	if (err < 0) {
+		/*
+		 * TODO: issue a more usefull error-message
+		 */
 		my_fprintf(stderr, _(txt_error_socket_or_connect_problem));
 		return -1;
 	}
@@ -671,7 +679,7 @@ get_tcp6_socket(
  *
  *	Errors:		Printed via nerror.
  */
-int
+static int
 get_dnet_socket(
 	char *machine,
 	char *service)
@@ -695,6 +703,7 @@ get_dnet_socket(
 			sdn.sdn_add.a_addr[0] = node % 256;
 			sdn.sdn_add.a_addr[1] = node / 256;
 			break;
+
 		default:
 			if ((np = getnodebyname(machine)) == NULL) {
 				my_fprintf(stderr, _(txt_gethostbyname), "", machine);
@@ -732,6 +741,11 @@ get_dnet_socket(
 #endif /* DECNET */
 
 
+/*----------------------------------------------------------------------
+ * Ideally the code after this point should be the only interface to the
+ * NNTP internals...
+ */
+
 /*
  * u_put_server -- send data to the server. Do not flush output.
  */
@@ -755,13 +769,12 @@ u_put_server(
  * Returns: Nothing.
  *
  *	Side effects: Talks to the server.
- *			Closes connection if things are not right.
+ *	              Closes connection if things are not right.
  *
  * Note: This routine flushes the buffer each time it is called. For large
- *	      transmissions (i.e., posting news) don't use it. Instead, do the
- *	      fprintf's yourself, and then a final fflush.
+ *       transmissions (i.e., posting news) don't use it. Instead, do the
+ *       fprintf's yourself, and then a final fflush.
  *       Only cache commands, don't cache data transmissions.
- *
  */
 void
 put_server(
@@ -778,7 +791,8 @@ put_server(
 		 * remember the last command we wrote to be able to resend it after a
 		 * reconnect. reconnection is handled by get_server()
 		 */
-		strcpy(last_put, string);
+		if (last_put != string)
+			STRCPY(last_put, string);
 	}
 	(void) s_flush(nntp_wr_fp);
 }
@@ -796,8 +810,14 @@ reconnect(
 
 	/*
 	 * Tear down current connection
+	 * Close the NNTP connection with prejudice
 	 */
-	NNTP_HARD_CLOSE;
+	if (nntp_wr_fp)
+		s_fclose(nntp_wr_fp);
+	if (nntp_rd_fp)
+		s_fclose(nntp_rd_fp);
+	nntp_rd_fp = nntp_wr_fp = NULL;
+
 	if (!tinrc.auto_reconnect)
 		ring_bell();
 
@@ -807,7 +827,7 @@ reconnect(
 	 * Exit tin if the user says no to reconnect. The exit code stops tin from trying
 	 * to disconnect again - the connection is already dead
 	 */
-	if (!tinrc.auto_reconnect && prompt_yn(cLINES, _(txt_reconnect_to_news_server), TRUE) != 1)
+	if (!tinrc.auto_reconnect && prompt_yn(_(txt_reconnect_to_news_server), TRUE) != 1)
 		tin_done(NNTP_ERROR_EXIT);		/* user said no to reconnect */
 
 	clear_message();
@@ -820,7 +840,7 @@ reconnect(
 		 */
 		if (curr_group != NULL) {
 			DEBUG_IO((stderr, _("Rejoin current group\n")));
-			sprintf(last_put, "GROUP %s", curr_group->name);
+			snprintf(last_put, sizeof(last_put), "GROUP %s", curr_group->name);
 			put_server(last_put);
 			s_gets(last_put, NNTP_STRLEN, nntp_rd_fp);
 #		ifdef DEBUG
@@ -910,7 +930,7 @@ get_server(
  *       than just "." (i.e. transfer statistics) present it to the user?
  *
  */
-void
+static void
 close_server(
 	void)
 {
@@ -931,254 +951,825 @@ close_server(
 #endif /* !VMS */
 
 
-#ifdef DEBUG
+#ifdef NNTP_ABLE
 /*
- * NNTP strings for get_respcode()
+ * Try and use CAPABILITIES/LIST EXTENSIONS here. Get this list before
+ * issuing other NNTP commands because the correct methods may be mentioned
+ * in the list of extensions.
+ *
+ * Sets up: t_capabilities nntp_caps
  */
-const char *
-nntp_respcode(
-	int respcode)
+static int
+check_extensions(
+	t_bool *sec)
 {
-#	ifdef NNTP_ABLE
-	static const char *text;
+	char *ptr;
+	int ret = 0;
+#	if 0 /* "CAPABILITIES" will replace "LIST EXTENSIONS" */
+	FILE *fp;
+	char *d;
 
-	switch (respcode) {
-		case 0:
-			text = "";
-			break;
+	if ((fp = nntp_command("CAPABILITIES", INF_CAPABILITIES, NULL, 0)) != NULL) {
+		nntp_caps.type = CAPABILITIES;
+		while ((ptr = tin_fgets(fp, FALSE)) != NULL) {
+#		ifdef DEBUG
+			debug_nntp("<<<", ptr);
+#		endif /* DEBUG */
+			/* look for version number(s) */
+			if (!nntp_caps.version && nntp_caps.type == CAPABILITIES) {
+				if (!strcasecmp(ptr, "VERSION")) {
+					d = ptr + 7;
+					d = strpbrk(d, " \t");
+					while (d != NULL && (d + 1 < (ptr + strlen(ptr)))) {
+						d++;
+						nntp_caps.version = MAX(nntp_caps.version, (unsigned int) atoi(d));
+						d = strpbrk(d, " \t");
+					}
+				}
+			}
+			/* we currently only support CAPABILITIES VERSION 2 */
+			if (nntp_caps.version == 2) {
+				/*
+				 * check for LIST variants - this code is untested
+				 */
+				if (!strcasecmp(ptr, "LIST")) {
+					d = ptr + 4;
+					d = strpbrk(d, " \t");
+					while (d != NULL && (d + 1 < (ptr + strlen(ptr)))) {
+						d++;
+						if (!strcasecmp(d, "ACTIVE.TIMES"))
+							nntp_caps.list_active_times = TRUE;
+						else if (!strcasecmp(d, "ACTIVE"))
+							nntp_caps.list_active_times = TRUE;
+						else if (!strcasecmp(d, "DISTRIB.PATS"))
+							nntp_caps.list_distrib_pats = TRUE;
+						else if (!strcasecmp(d, "DISTRIBUTIONS")) /* LIST DISTRIBUTIONS, "private" extension, RFC 2980 */
+							nntp_caps.list_distributions = TRUE;
+						else if (!strcasecmp(d, "HEADERS"))
+							nntp_caps.list_headers = TRUE; /* HDR requires LIST HEADERS, but not vice versa */
+						else if (!strcasecmp(d, "NEWSGROUPS"))
+							nntp_caps.list_newsgroups = TRUE;
+						else if (!strcasecmp(d, "OVERVIEW.FMT")) /* OVER requires OVERVIEW.FMT, but not vice versa */
+							nntp_caps.list_overview_fmt = TRUE;
+						else if (!strcasecmp(d, "MOTD")) /* "private" extension */
+							nntp_caps.list_motd = TRUE;
+						else if (!strcasecmp(d, "SUBSCRIPTIONS")) /* "private" extension, RFC 2980 */
+							nntp_caps.list_subscriptions = TRUE;
+						else if (!strcasecmp(d, "MODERATORS")) /* "private" extension */
+							nntp_caps.list_moderators = TRUE;
+						d = strpbrk(d, " \t");
+					}
+				} else if (!strcasecmp(ptr, "IMPLEMENTATION"))
+					nntp_caps.implementation = my_strdup(ptr + 14);
+				else if (!strcasecmp(ptr, "MODE-READER")) {
+					if (!nntp_caps.reader)
+						nntp_caps.mode_reader = TRUE;
+				} else if (!strcasecmp(ptr, "READER")) {
+					nntp_caps.reader = TRUE;
+					nntp_caps.mode_reader = FALSE;
+				} else if (!strcasecmp(d, "POST"))
+					nntp_caps.post = TRUE;
+				else if (!strcasecmp(ptr, "NEWNEWS"))
+					nntp_caps.newnews = TRUE;
+				else if (!strcasecmp(ptr, "XPAT")) /* extension, RFC 2980 */
+					nntp_caps.xpat = TRUE;
+				else if (!strcasecmp(ptr, "STARTTLS"))
+					nntp_caps.starttls = TRUE;
+				/*
+				 * NOTE: if we saw OVER, LIST OVERVIEW.FMT _must_ be implemented
+				 */
+				else if (!strcasecmp(ptr, &xover_cmds[1])) {
+					nntp_caps.over = TRUE;
+					nntp_caps.list_overview_fmt = TRUE;
+					nntp_caps.over_cmd = &xover_cmds[1];
+					d = ptr + strlen(&xover_cmds[1]);
+					d = strpbrk(d, " \t");
+					while (d != NULL && (d + 1 < (ptr + strlen(ptr)))) {
+						d++;
+						if (!strcasecmp(d, "MSGID"))
+							nntp_caps.over_msgid = TRUE;
+						d = strpbrk(d, " \t");
+					}
+				} else if (!strcasecmp(ptr, "AUTHINFO")) {
+					d = ptr + 8;
+					d = strpbrk(d, " \t");
+					while (d != NULL && (d + 1 < (ptr + strlen(ptr)))) {
+						d++;
+						if (!strcasecmp(d, "USER"))
+							nntp_caps.authinfo_user = TRUE;
+						if (!strcasecmp(d, "SASL"))
+							nntp_caps.authinfo_sasl = TRUE;
+						d = strpbrk(d, " \t");
+					}
+				}
+#		if 0
+				/*
+				 * NOTE: if we saw HDR, LIST HEADERS _must_ be implemented
+				 */
+				else if (!strcasecmp(ptr, &xhdr_cmds[1])) {
+						nntp_caps.hdr_cmd = &xhdr_cmds[1];
+						nntp_caps.hdr = TRUE;
+						nntp_caps.list_headers = TRUE;
+				}
+				else if (!strcasecmp(ptr, "IHAVE"))
+						nntp_caps.ihave = TRUE;
+#		endif /* 0 */
+				/*
+				 * TODO: SASL, STREAMING
+				 */
+			} else
+				nntp_caps.type = NO;
+		}
+	}
+#		ifdef DEBUG
+	debug_print_nntp_extensions();
+#		endif /* DEBUG */
+	if (!*sec && !nntp_caps.reader) {
+		if (nntp_caps.type == CAPABILITIES && !nntp_caps.mode_reader)
+			return -1; /* no mode-switching and no reader mode, give up */
+		if ((ret = mode_reader(&*sec)) != 0)
+			return ret;
+		else if (nntp_caps.type == CAPABILITIES) /* 2nd pass */
+			ret = check_extensions(&*sec);
+	}
 
-		case INF_HELP:
-			text = _("100  Help text on way");
-			break;
+#	else
 
-		case INF_AUTH:
-			text = _("180  Authorization capabilities");
-			break;
+	/*
+	 * "LIST EXTENSIONS" is somewhat troublesome as there are a lot
+	 * of broken implementations out there and it is a multiline response
+	 */
+	if (nntp_caps.type == NO) {
+		char buf[NNTP_STRLEN];
+		int i;
+
+		buf[0] = '\0';
+		i = new_nntp_command("LIST EXTENSIONS", OK_EXTENSIONS, buf, sizeof(buf));
+		switch (i) {
+			case 215:	/* Netscape-Collabra/3.52 (badly broken); NetWare-News-Server/5.1 */
+#		ifdef DEBUG
+				debug_nntp("LIST EXTENSIONS", "skipping data");
+#		endif /* DEBUG */
+				while ((ptr = tin_fgets(FAKE_NNTP_FP, FALSE)) != NULL)
+					;
+				break;
+
+			case OK_EXTENSIONS:	/* as defined draft-ietf-nntpext-base-27.txt */
+			case 205:	/* M$ Exchange 5.5 */
+				nntp_caps.type = LIST_EXTENSIONS;
+				while ((ptr = tin_fgets(FAKE_NNTP_FP, FALSE)) != NULL) {
+					if (nntp_caps.type == LIST_EXTENSIONS) {
+#		ifdef DEBUG
+						debug_nntp("<<<", ptr);
+#		endif /* DEBUG */
+						/*
+						 * some servers (e.g. Hamster 1.3) have leading spaces in
+						 * the extension list
+						 */
+						str_trim(ptr);
+						/*
+						 * Check for (X)OVER
+						 * XOVER should not be listed in EXTENSIONS (but sometimes
+						 * is) checking for it if OVER is not found does no harm.
+						 */
+						if (!nntp_caps.over_cmd) {
+							for (i = 1; i >= 0; i--) {
+								if (strcasecmp(ptr, &xover_cmds[i]) == 0) {
+									nntp_caps.over_cmd = &xover_cmds[i];
+									break;
+								}
+							}
+						}
+					}
+				}
+				/*
+				 * as the server did support LIST EXTENSIONS it's likely that it
+				 * also can do LIST MOTD (we don't bother to parse the LIST
+				 * EXTENSIONS output for MOTD as it never was standartizised;
+				 * draft-ietf-nntpext-base-24.txt only described OVER, HDR and
+				 * LISTGROUP).
+				 */
+				nntp_caps.list_motd = TRUE;
+				break;
 
-		case INF_DEBUG:
-			text = _("199  Debug output");
-			break;
+			default:
+				break;
+		}
+#		ifdef DEBUG
+		debug_print_nntp_extensions();
+#		endif /* DEBUG */
+		if (!*sec)
+			ret = mode_reader(&*sec);
+	}
+#	endif /* 0 */
+	return ret;
+}
 
-		case OK_CANPOST:
-			text = _("200  Hello; you can post");
-			break;
 
-		case OK_NOPOST:
-			text = _("201  Hello; you can't post");
-			break;
+/*
+ * Switch INN into NNRP mode with 'mode reader'
+ */
+static int
+mode_reader(
+	t_bool *sec)
+{
+	int ret = 0;
 
-		case OK_SLAVE:
-			text = _("202  Slave status noted");
-			break;
+	if (!nntp_caps.reader) {
+		char line[NNTP_STRLEN];
+#ifdef DEBUG
+		debug_nntp("mode_reader", "mode reader");
+#endif /* DEBUG */
+		DEBUG_IO((stderr, "nntp_command(MODE READER)\n"));
+		put_server("MODE READER");
 
-		case OK_GOODBYE:
-			text = _("205  Closing connection");
-			break;
+		/*
+		 * According to the latest NNTP draft (May 2005), MODE READER may only
+		 * return the following response codes:
+		 *
+		 *   200 (OK_CANPOST)     Hello, you can post
+		 *   201 (OK_NOPOST)      Hello, you can't post
+		 *  (202 (OK_NOIHAVE)     discussed on the itef mailinglist; withdrawn)
+		 *  (203 (OK_NOPOSTIHAVE) discussed on the itef mailinglist; withdrawn)
+		 *   502 (ERR_ACCESS)     Service unavailable
+		 *
+		 * However, there may be old servers out there that do not implement this
+		 * command and therefore return ERR_COMMAND (500). Unfortunately there
+		 * are some new servers out there (i.e. INN 2.4.0 (20020220 prerelease)
+		 * which do return ERR_COMMAND if they are feed only servers.
+		 */
 
-		case OK_GROUP:
-			text = _("211  Group selected");
-			break;
+		switch ((ret = get_respcode(line, sizeof(line)))) {
+			case OK_CANPOST:
+	/*		case OK_NOIHAVE: */
+				can_post = TRUE && !force_no_post;
+				*sec = TRUE;
+				ret = 0;
+				break;
+
+			case OK_NOPOST:
+	/*		case OK_NOPOSTIHAVE: */
+				can_post = FALSE;
+				*sec = TRUE;
+				ret = 0;
+				break;
+
+			case ERR_GOODBYE:
+			case ERR_ACCESS:
+				error_message(line);
+				return ret;
+
+			case ERR_COMMAND:
+			default:
+				break;
+		}
+	}
+	return ret;
+}
+#endif /* NNTP_ABLE */
 
-		/* case OK_MOTD: */
-		case OK_GROUPS:
-			text = _("215  Newsgroups follow");
-			break;
 
-#if 0 /* obsolete */
-		case OK_XINDEX:
-			text = _("218  Group index file follows");
-			break;
-#endif /* 0 */
+/*
+ * Open a connection to the NNTP server. Authenticate if necessary or
+ * desired, and test if the server supports XOVER.
+ * Returns: 0	success
+ *        > 0	NNTP error response code
+ *        < 0	-errno from system call or similar error
+ */
+int
+nntp_open(
+	void)
+{
+#ifdef NNTP_ABLE
+	char *linep;
+	char line[NNTP_STRLEN];
+	int i, ret;
+	t_bool sec = FALSE;
+	/* It appears that is_reconnect guards code that should be run only once */
+	static t_bool is_reconnect = FALSE;
 
-		case OK_ARTICLE:
-			text = _("220  Article (head & body) follows");
-			break;
+	if (!read_news_via_nntp)
+		return 0;
 
-		case OK_HEAD:
-			text = _("221  Head follows");
-			break;
+#	ifdef DEBUG
+	debug_nntp("nntp_open", "BEGIN");
+#	endif /* DEBUG */
+
+	if (nntp_server == NULL) {
+		error_message(_(txt_cannot_get_nntp_server_name));
+		error_message(_(txt_server_name_in_file_env_var), NNTP_SERVER_FILE);
+		return -EHOSTUNREACH;
+	}
 
-		case OK_BODY:
-			text = _("222  Body follows");
-			break;
+	if (!batch_mode) {
+		if (nntp_tcp_port != IPPORT_NNTP)
+			wait_message(0, _(txt_connecting_port), nntp_server, nntp_tcp_port);
+		else
+			wait_message(0, _(txt_connecting), nntp_server);
+	}
 
-		case OK_NOTEXT:
-			text = _("223  No text sent -- stat, next, last");
-			break;
+#	ifdef DEBUG
+	debug_nntp("nntp_open", nntp_server);
+#	endif /* DEBUG */
 
-		case OK_NEWNEWS:
-			text = _("230  New articles by message-id follow");
-			break;
+	ret = server_init(nntp_server, NNTP_TCP_NAME, nntp_tcp_port, line, sizeof(line));
+	DEBUG_IO((stderr, "server_init returns %d,%s\n", ret, line));
 
-		case OK_NEWGROUPS:
-			text = _("231  New newsgroups follow");
-			break;
+	if (!batch_mode && ret >= 0 && cmd_line)
+		my_fputc('\n', stdout);
 
-		case OK_XFERED:
-			text = _("235  Article transferred successfully");
-			break;
+#	ifdef DEBUG
+	debug_nntp("nntp_open", line);
+#	endif /* DEBUG */
 
-		case OK_POSTED:
-			text = _("240  Article posted successfully");
-			break;
+	switch (ret) {
+		/*
+		 * ret < 0 : some error from system call
+		 * ret > 0 : NNTP response code
+		 *
+		 * According to the ietf-nntp mailinglist:
+		 *   200 you may (try to) do anything
+		 *   201 you may not POST
+		 *  (202 you may not IHAVE)
+		 *  (203 you may not do EITHER)
+		 *   All unrecognised 200 series codes should be assumed as success.
+		 *   All unrecognised 300 series codes should be assumed as notice to continue.
+		 *   All unrecognised 400 series codes should be assumed as temporary error.
+		 *   All unrecognised 500 series codes should be assumed as error.
+		 */
 
-		case OK_AUTHSYS:
-			text = _("280  Authorization system ok");
+		case OK_CANPOST:
+/*		case OK_NOIHAVE: */
+			can_post = TRUE && !force_no_post;
 			break;
 
-		case OK_AUTH:
-			text = _("281  Authorization (user/pass) ok");
+		case OK_NOPOST:
+/*		case OK_NOPOSTIHAVE: */
+			can_post = FALSE;
 			break;
 
-		case OK_BIN:
-			text = _("282  binary data follows");
-			break;
+		default:
+			if (ret >= 200 && ret <= 299) {
+				can_post = TRUE && !force_no_post;
+				break;
+			}
+			if (ret < 0)
+				error_message(_(txt_failed_to_connect_to_server), nntp_server);
+			else
+				error_message(line);
+
+			return ret;
+	}
+	if (!is_reconnect) {
+		/* remove leading whitespace and save server's initial response */
+		linep = line;
+		while (isspace((int) *linep))
+			linep++;
 
-		case OK_SPLIST:
-			text = _("283  spooldir list follows");
-			break;
+		STRCPY(bug_nntpserver1, linep);
+	}
 
-		case OK_SPSWITCH:
-			text = _("284  Switching to a different spooldir");
-			break;
+	/*
+	 * Find out which NNTP extensions are available
+	 * TODO: The authentication method required may be mentioned in the list of
+	 *       extensions. (For details about authentication methods, see
+	 *       draft-ietf-nntpext-authinfo-07.txt).
+	 */
+	if ((ret = check_extensions(&sec)))
+		return ret; /* required "MODE READER" failed, exit */
 
-		case OK_SPNOCHANGE:
-			text = _("285  Still using same spooldir");
-			break;
+	/*
+	 * If the user wants us to authenticate on connection startup, do it now.
+	 * Some news servers return "201 no posting" first, but after successful
+	 * authentication you get a "200 posting allowed". To find out if we are
+	 * allowed to post after authentication issue a "MODE READER" again and
+	 * interpret the response code.
+	 */
+	if (force_auth_on_conn_open) {
+#	ifdef DEBUG
+		debug_nntp("nntp_open", "authenticate");
+#	endif /* DEBUG */
+		authenticate(nntp_server, userid, TRUE);
+		if ((ret = mode_reader(&sec)))
+			return ret; /* "MODE READER" failed, exit */
+	}
+
+	if (!is_reconnect) {
+		/* Inform user if he cannot post */
+		if (!can_post && !batch_mode)
+			wait_message(0, "%s\n", _(txt_cannot_post));
+
+		/* Remove leading white space and save server's second response */
+		linep = line;
+		while (isspace((int) *linep))
+			linep++;
 
-		case OK_SPLDIRCUR:
-			text = _("286  Current spooldir");
-			break;
+		STRCPY(bug_nntpserver2, linep);
 
-		case OK_SPLDIRAVL:
-			text = _("287  Available spooldir");
-			break;
+		/*
+		 * Show user last server response line, do some nice formatting if
+		 * response is longer than a screen wide.
+		 *
+		 * TODO: This only breaks the line once, but the response could be
+		 * longer than two lines ...
+		 */
+		if (!batch_mode || verbose) {
+			char *chr1, *chr2;
+			int j;
+
+			j = atoi(get_val("COLUMNS", "80"));
+			chr1 = my_strdup((sec ? bug_nntpserver2 : bug_nntpserver1));
+
+			if (((int) strlen(chr1)) >= j) {
+				chr2 = chr1 + strlen(chr1) - 1;
+				while (chr2 - chr1 >= j)
+					chr2--;
+				while (chr2 > chr1 && *chr2 != ' ')
+					chr2--;
+				if (chr2 != chr1)
+					*chr2 = '\n';
+			}
 
-		case OK_SPLDIRERR:
-			text = _("288  Unavailable spooldir or invalid entry");
-			break;
+			wait_message(0, "%s\n", chr1);
+			free(chr1);
+		}
+	}
 
-		case CONT_XFER:
-			text = _("335  Continue to send article");
-			break;
+	/*
+	 * If LIST EXTENSIONS failed, check if NNTP supports XOVER or OVER command
+	 * (successor of XOVER as of latest NNTP Draft (Jan 2002)
+	 * We have to check that we _don't_ get an ERR_COMMAND
+	 */
+	if (nntp_caps.type == NO) {
+		int j = 0;
 
-		case CONT_POST:
-			text = _("340  Continue to post article");
-			break;
+		for (i = 0; i < 2 && j >= 0; i++) {
+			j = new_nntp_command(&xover_cmds[i], ERR_NCING, line, sizeof(line));
+			switch (j) {
+				case ERR_COMMAND:
+					break;
+
+				case 224:	/* unexpected multiline ok, e.g.: Synchronet 3.13 NNTP Service 1.92 */
+					nntp_caps.over_cmd = &xover_cmds[i];
+#	ifdef DEBUG
+					debug_nntp(&xover_cmds[i], "skipping data");
+#	endif /* DEBUG */
+					while ((linep = tin_fgets(FAKE_NNTP_FP, FALSE)) != NULL)
+						;
+					j = -1;
+					break;
+
+				default:
+					nntp_caps.over_cmd = &xover_cmds[i];
+					j = -1;
+					break;
+			}
+		}
+	} else {
+		if (!nntp_caps.over_cmd) {
+			/*
+			 * CAPABILITIES/LIST EXTENSIONS didn't mention OVER or XOVER, try
+			 * XOVER
+			 */
+			i = new_nntp_command(xover_cmds, ERR_NCING, line, sizeof(line));
 
-		case NEED_AUTHINFO:
-			text = _("380  authorization is required");
-			break;
+			switch (i) {
+				case ERR_COMMAND:
+					break;
+
+				case 224:	/* unexpected multiline ok, e.g.: Synchronet 3.13 NNTP Service 1.92 */
+					nntp_caps.over_cmd = xover_cmds;
+#	ifdef DEBUG
+					debug_nntp(xover_cmds, "skipping data");
+#	endif /* DEBUG */
+					while ((linep = tin_fgets(FAKE_NNTP_FP, FALSE)) != NULL)
+						;
+					break;
+
+				default:
+					nntp_caps.over_cmd = xover_cmds;
+					break;
+			}
+		}
+#	if 0 /* unused */
+		if (!nntp_caps.hdr_cmd) {
+			/*
+			 * LIST EXTENSIONS didn't mention HDR or XHDR, try
+			 * XHDR
+			 */
+			if (!nntp_command(xhdr_cmds, ERR_COMMAND, NULL, 0))
+				nntp_caps.hdr_cmd = xhdr_cmds;
+		}
+#	endif /* 0 */
+	}
 
-		case NEED_AUTHDATA:
-			text = _("381  <type> authorization data required");
-			break;
+	if (!nntp_caps.over_cmd) {
+		if (!is_reconnect && !batch_mode) {
+			wait_message(2, _(txt_no_xover_support));
 
-		case ERR_GOODBYE:
-			text = _("400  Have to hang up for some reason");
-			break;
+			if (tinrc.cache_overview_files)
+				wait_message(2, _(txt_caching_on));
+			else
+				wait_message(2, _(txt_caching_off));
+		}
+#	if 0
+	} else {
+		/*
+		 * TODO: issue warning if old index files found?
+		 *	      in index_newsdir?
+		 */
+#	endif /* 0 */
+	}
 
-		case ERR_NOGROUP:
-			text = _("411  No such newsgroup");
-			break;
+#	if 0
+	/*
+	 * TODO: if we're using -n, check for LIST NEWSGROUPS <wildmat>
+	 * see also comments in open_newsgroups_fp()
+	 */
+	if (newsrc_active && !list_active) { /* -n */
+		/* code goes here */
+	}
+#	endif /* 0 */
 
-		case ERR_NCING:
-			text = _("412  Not currently in newsgroup");
-			break;
+	if (!is_reconnect && !batch_mode && show_description && check_for_new_newsgroups) {
+		/*
+		 * TODO:
+		 * - document that "-d" and/or "-q" turns off "LIST MOTD" (or add
+		 *   a tinrc var to turn LIST MOTD on/off)
+		 */
+		if (nntp_caps.list_motd)
+			list_motd();
+	}
 
-		case ERR_XINDEX:
-			text = _("418  No index file for this group");
-			break;
+	is_reconnect = TRUE;
 
-		case ERR_NOCRNT:
-			text = _("420  No current article selected");
-			break;
+#endif /* NNTP_ABLE */
 
-		case ERR_NONEXT:
-			text = _("421  No next article in this group");
-			break;
+	DEBUG_IO((stderr, "nntp_open okay\n"));
+	return 0;
+}
 
-		case ERR_NOPREV:
-			text = _("422  No previous article in this group");
-			break;
 
-		case ERR_NOARTIG:
-			text = _("423  No such article in this group");
-			break;
+/*
+ * 'Public' function to shutdown the NNTP connection
+ */
+void
+nntp_close(
+	void)
+{
+#ifdef NNTP_ABLE
+	if (read_news_via_nntp) {
+#	ifdef DEBUG
+		debug_nntp("nntp_close", "END");
+#	endif /* DEBUG */
+		close_server();
+	}
+#endif /* NNTP_ABLE */
+}
 
-		case ERR_NOART:
-			text = _("430  No such article at all");
-			break;
 
-		case ERR_GOTIT:
-			text = _("435  Already got that article, don't send");
-			break;
+/*
+ * Get a response code from the server.
+ * Returns:
+ *	+ve NNTP return code
+ *	-1  on an error or user abort. We don't differentiate.
+ * If 'message' is not NULL, then any trailing text after the response
+ * code is copied into it.
+ * Does not perform authentication if required; use get_respcode()
+ * instead.
+ */
+int
+get_only_respcode(
+	char *message,
+	size_t mlen)
+{
+	int respcode = 0;
+#ifdef NNTP_ABLE
+	char *ptr, *end;
 
-		case ERR_XFERFAIL:
-			text = _("436  Transfer failed");
-			break;
+	ptr = tin_fgets(FAKE_NNTP_FP, FALSE);
 
-		case ERR_XFERRJCT:
-			text = _("437  Article rejected, don't resend");
-			break;
+	if (tin_errno || ptr == NULL) {
+#	ifdef DEBUG
+		debug_nntp("<<<", "Error: tin_error<>0 or ptr==NULL in get_only_respcode()");
+#	endif /* DEBUG */
+		return -1;
+	}
 
-		case ERR_NOPOST:
-			text = _("440  Posting not allowed");
-			break;
+#	ifdef DEBUG
+	debug_nntp("<<<", ptr);
+#	endif /* DEBUG */
+	respcode = (int) strtol(ptr, &end, 10);
+	DEBUG_IO((stderr, "get_only_respcode(%d)\n", respcode));
 
-		case ERR_POSTFAIL:
-			text = _("441  Posting failed");
-			break;
+	/* TODO: reconnect on ERR_FAULT? */
+	if ((respcode == ERR_FAULT || respcode == ERR_GOODBYE || respcode == OK_GOODBYE) && last_put[0] != '\0' && strcmp(last_put, "QUIT")) {
+		/*
+		 * Maybe server timed out.
+		 * If so, retrying will force a reconnect.
+		 */
+#	ifdef DEBUG
+		debug_nntp("get_only_respcode", "timeout");
+#	endif /* DEBUG */
+		put_server(last_put);
+		ptr = tin_fgets(FAKE_NNTP_FP, FALSE);
+
+		if (tin_errno) {
+#	ifdef DEBUG
+			debug_nntp("<<<", "Error: tin_errno <> 0");
+#	endif /* DEBUG */
+			return -1;
+		}
 
-		case ERR_NOAUTH:
-			text = _("480  authorization required for command");
-			break;
+#	ifdef DEBUG
+		debug_nntp("<<<", ptr);
+#	endif /* DEBUG */
+		respcode = (int) strtol(ptr, &end, 10);
+		DEBUG_IO((stderr, "get_only_respcode(%d)\n", respcode));
+	}
+	if (message != NULL && mlen > 1)		/* Pass out the rest of the text */
+		my_strncpy(message, end, mlen - 1);
 
-		case ERR_AUTHSYS:
-			text = _("481  Authorization system invalid");
-			break;
+#endif /* NNTP_ABLE */
+	return respcode;
+}
 
-		case ERR_AUTHREJ:
-			text = _("482  Authorization data rejected");
-			break;
 
-		case ERR_INVALIAS:
-			text = _("483  Invalid alias on spooldir cmd");
-			break;
+/*
+ * Get a response code from the server.
+ * Returns:
+ *	+ve NNTP return code
+ *	-1  on an error
+ * If 'message' is not NULL, then any trailing text after the response
+ *	code is copied into it.
+ * Performs authentication if required and repeats the last command if
+ * necessary after a timeout.
+ */
+int
+get_respcode(
+	char *message,
+	size_t mlen)
+{
+	int respcode = 0;
+#ifdef NNTP_ABLE
+	char savebuf[NNTP_STRLEN];
+	char *ptr, *end;
 
-		case ERR_INVNOSPDIR:
-			text = _("484  No spooldir file found");
-			break;
+	respcode = get_only_respcode(message, mlen);
+	if ((respcode == ERR_NOAUTH) || (respcode == NEED_AUTHINFO)) {
+		/*
+		 * Server requires authentication.
+		 */
+#	ifdef DEBUG
+		debug_nntp("get_respcode", "authentication");
+#	endif /* DEBUG */
+		strncpy(savebuf, last_put, sizeof(savebuf) - 1);		/* Take copy, as authenticate() will clobber this */
 
-		case ERR_COMMAND:
-			text = _("500  Command not recognized");
-			break;
+		if (authenticate(nntp_server, userid, FALSE)) {
+			strcpy(last_put, savebuf);
 
-		case ERR_CMDSYN:
-			text = _("501  Command syntax error");
-			break;
+			put_server(last_put);
+			ptr = tin_fgets(FAKE_NNTP_FP, FALSE);
 
-		case ERR_ACCESS:
-			text = _("502  Access to server denied");
-			break;
+			if (tin_errno) {
+#	ifdef DEBUG
+				debug_nntp("<<<", "Error: tin_errno <> 0");
+#	endif /* DEBUG */
+				return -1;
+			}
 
-		/* case ERR_MOTD: */
-		case ERR_FAULT:
-			text = _("503  Program fault, command not performed");
-			break;
+#	ifdef DEBUG
+			debug_nntp("<<<", ptr);
+#	endif /* DEBUG */
+			respcode = (int) strtol(ptr, &end, 10);
+			if (message != NULL && mlen > 1)				/* Pass out the rest of the text */
+				strncpy(message, end, mlen - 1);
 
-		case ERR_AUTHBAD:
-			text = _("580  Authorization Failed");
+		} else {
+			error_message(_(txt_auth_failed), ERR_ACCESS);
+			/*	return -1; */
+			tin_done(EXIT_FAILURE);
+		}
+	}
+#endif /* NNTP_ABLE */
+	return respcode;
+}
+
+
+#ifdef NNTP_ABLE
+/*
+ * Do an NNTP command. Send command to server, and read the reply.
+ * If the reply code matches success, then return an open file stream
+ * Return NULL if we did not see the response we wanted.
+ * If message is not NULL, then the trailing text of the reply string is
+ * copied into it for the caller to process.
+ */
+FILE *
+nntp_command(
+	const char *command,
+	int success,
+	char *message,
+	size_t mlen)
+{
+DEBUG_IO((stderr, "nntp_command(%s)\n", command));
+#	ifdef DEBUG
+	debug_nntp("nntp command", command);
+#	endif /* DEBUG */
+	put_server(command);
+
+	if (!bool_equal(dangerous_signal_exit, TRUE)) {
+		if (get_respcode(message, mlen) != success) {
+#	ifdef DEBUG
+			debug_nntp(command, "NOT_OK");
+#	endif /* DEBUG */
+			/* error_message("%s", message); */
+			return (FILE *) 0;
+		}
+	}
+#	ifdef DEBUG
+	debug_nntp(command, "OK");
+#	endif /* DEBUG */
+	return FAKE_NNTP_FP;
+}
+
+
+/*
+ * same as above, but with a slightly more usefull return code.
+ * TODO: use it instead of nntp_command in the rest of the code
+ *       (wherever it is more usefull).
+ */
+static int
+new_nntp_command(
+	const char *command,
+	int success,
+	char *message,
+	size_t mlen)
+{
+	int respcode = 0;
+
+DEBUG_IO((stderr, "nntp_command(%s)\n", command));
+#	ifdef DEBUG
+	debug_nntp("nntp command", command);
+#	endif /* DEBUG */
+	put_server(command);
+
+	if (!bool_equal(dangerous_signal_exit, TRUE)) {
+		if ((respcode = get_respcode(message, mlen)) != success) {
+#	ifdef DEBUG
+			debug_nntp(command, "NOT_OK - Expected: %d, got: %d", success, respcode);
+#	endif /* DEBUG */
+			return respcode;
+		}
+	}
+#	ifdef DEBUG
+	debug_nntp(command, "OK");
+#	endif /* DEBUG */
+	return respcode;
+}
+
+
+static void
+list_motd(
+	void)
+{
+	char *ptr;
+	char buf[NNTP_STRLEN];
+	int i;
+	unsigned int l = 0;
+
+	buf[0] = '\0';
+	i = new_nntp_command("LIST MOTD", OK_MOTD, buf, sizeof(buf));
+
+	switch (i) {
+		case OK_MOTD:
+#	ifdef HAVE_COLOR
+			fcol(tinrc.col_message);
+#	endif /* HAVE_COLOR */
+			while ((ptr = tin_fgets(FAKE_NNTP_FP, FALSE)) != NULL) {
+#	ifdef DEBUG
+				debug_nntp("<<<", ptr);
+#	endif /* DEBUG */
+				/*
+				 * TODO: - store a hash value of the entire motd in the server-rc
+				 *         and only if it differs from the old value display the
+				 *         motd?
+				 *       - use some sort of pager?
+				 *       - -> lang.c
+				 */
+				my_printf("%s%s\n", _("MOTD: "), ptr);
+				l++;
+			}
+#	ifdef HAVE_COLOR
+			fcol(tinrc.col_normal);
+#	endif /* HAVE_COLOR */
+			if (l) {
+				my_flush();
+				sleep((l >> 1) | 0x01);
+			}
 			break;
 
-		default:
-			text = _("Unknown NNTP response code");
+		default:	/* common response codes are 500, 501, 503 */
 			break;
 	}
-	return text;
-
-#	else
-	return "";
-#	endif /* NNTP_ABLE */
 }
-#endif /* DEBUG */
+#endif /* NNTP_ABLE */
diff -Nurp tin-1.6.2/src/nrctbl.c tin-1.8.0/src/nrctbl.c
--- tin-1.6.2/src/nrctbl.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/nrctbl.c	2005-12-02 12:07:36.000000000 +0100
@@ -3,13 +3,13 @@
  *  Module    : nrctbl.c
  *  Author    : Sven Paulus <sven@tin.org>
  *  Created   : 1996-10-06
- *  Updated   : 2003-01-18
+ *  Updated   : 2005-07-02
  *  Notes     : This module does the NNTP server name lookup in
  *              ~/.tin/newsrctable and returns the real hostname
  *              and the name of the newsrc file for a given
  *              alias of the server.
  *
- * Copyright (c) 1996-2003 Sven Paulus <sven@tin.org>
+ * Copyright (c) 1996-2006 Sven Paulus <sven@tin.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -47,9 +47,7 @@
 #ifndef VERSION_H
 #	include "version.h"
 #endif /* !VERSION_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
+
 
 /*
  * local prototypes
@@ -169,7 +167,7 @@ get_newsrcname(
 			int error = 0;
 
 			if (!strfpath(name_found, tmp_newsrc, sizeof(tmp_newsrc), NULL)) {
-					my_fprintf(stderr, _("couldn't expand %s\n"), name_found);
+					my_fprintf(stderr, _("couldn't expand %s\n"), name_found); /* TODO: -> lang.c */
 					error = 1;
 			} else {
 				if (tmp_newsrc[0] == '/')
@@ -204,37 +202,41 @@ get_newsrcname(
 				}
 			}
 			if (error) {
-				char ch;
-				char default_ch = map_to_local(iKeyNrctblAlternative, &menukeymap.nrctbl_create);
+				char ch, default_ch = 'a';
 
 				do {
 					/* very ugly code, but curses is not initialized yet */
 					if (error >= 2) {
-						default_ch = map_to_local(iKeyNrctblCreate, &menukeymap.nrctbl_create);
+						default_ch = 'c';
 						printf("%s%c\b", _(txt_nrctbl_create), default_ch);
 					} else
 						printf("%s%c\b", _(txt_nrctbl_default), default_ch);
 
 					if ((ch = (char) ReadCh()) == '\r' || ch == '\n')
 						ch = default_ch;
-				} while (!strchr(menukeymap.nrctbl_create.localkeys, ch));
+				} while (ch != ESC && ch != 'a' && ch != 'c' && ch != 'd' && ch != 'q');
 				printf("%c\n", ch);
 
-				switch (map_to_default(ch, &menukeymap.nrctbl_create)) {
-					case iKeyNrctblCreate:
+				/* NOTE: these keys can not be remapped */
+				switch (ch) {
+					case 'c':
 						/* FIXME this doesn't check if we could create the file */
 						return TRUE;
 
-					case iKeyNrctblDefault:
+					case 'd':
 						joinpath(newsrc_name, homedir, ".newsrc");
 						return TRUE;
 
-					case iKeyNrctblAlternative:
-						sprintf(name_found, ".newsrc-%s", nntpserver_name);
+					case 'a':
+						/*
+						 * FIXME this (e.g. the location of the alternativce name)
+						 * is not documented in the man page
+						 */
+						snprintf(name_found, sizeof(name_found), ".newsrc-%s", nntpserver_name);
 						joinpath(newsrc_name, homedir, name_found);
 						return TRUE;
 
-					case iKeyNrctblQuit:
+					case 'q':
 						exit(EXIT_SUCCESS);
 						/* keep lint quiet: */
 						/* FALLTHROUGH */
diff -Nurp tin-1.6.2/src/open.c tin-1.8.0/src/open.c
--- tin-1.6.2/src/open.c	2003-08-15 17:45:27.000000000 +0200
+++ tin-1.8.0/src/open.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,1121 +0,0 @@
-/*
- *  Project   : tin - a Usenet reader
- *  Module    : open.c
- *  Author    : I. Lea & R. Skrenta
- *  Created   : 1991-04-01
- *  Updated   : 2003-08-15
- *  Notes     : Routines to make reading news locally (ie. /var/spool/news)
- *              or via NNTP transparent
- *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote
- *    products derived from this software without specific prior written
- *    permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#ifndef TIN_H
-#	include "tin.h"
-#endif /* !TIN_H */
-#ifndef TCURSES_H
-#	include "tcurses.h"
-#endif /* !TCURSES_H */
-#ifndef TNNTP_H
-#	include "tnntp.h"
-#endif /* !TNNTP_H */
-
-
-/*
- * local prototypes
- */
-static int base_comp(t_comptype p1, t_comptype p2);
-#if 0 /* currently unused */
-	static FILE *open_xhdr_fp(char *header, long min, long max);
-	static t_bool stat_article(long art, const char *group_path);
-#endif /* 0 */
-
-
-long head_next;
-
-#ifdef NO_POSTING
-	t_bool can_post = FALSE;
-#else
-	t_bool can_post = TRUE;
-#endif /* NO_POSTING */
-
-char *nntp_server = NULL;
-char *xover_cmd = NULL;
-#ifdef NNTP_ABLE
-	static char txt_xover_buff[] = "XOVER";
-#endif /* NNTP_ABLE */
-
-/*
- * Open a connection to the NNTP server. Authenticate if necessary or
- * desired, and test if the server supports XOVER.
- * Returns: 0	success
- *        > 0	NNTP error response code
- *        < 0	-errno from system call or similar error
- */
-int
-nntp_open(
-	void)
-{
-#ifdef NNTP_ABLE
-	char *linep;
-	char line[NNTP_STRLEN];
-	int i, ret;
-	t_bool sec = FALSE;
-	/* It appears that is_reconnect guards code that should be run only once */
-	static t_bool is_reconnect = FALSE;
-
-	if (!read_news_via_nntp)
-		return 0;
-
-#	ifdef DEBUG
-	debug_nntp("nntp_open", "BEGIN");
-#	endif /* DEBUG */
-
-	if (nntp_server == NULL) {
-		error_message(_(txt_cannot_get_nntp_server_name));
-		error_message(_(txt_server_name_in_file_env_var), NNTP_SERVER_FILE);
-		return -EHOSTUNREACH;
-	}
-
-	if (!batch_mode) {
-		if (nntp_tcp_port != IPPORT_NNTP)
-			wait_message(0, _(txt_connecting_port), nntp_server, nntp_tcp_port);
-		else
-			wait_message(0, _(txt_connecting), nntp_server);
-	}
-
-#	ifdef DEBUG
-	debug_nntp("nntp_open", nntp_server);
-#	endif /* DEBUG */
-
-	ret = server_init(nntp_server, NNTP_TCP_NAME, nntp_tcp_port, line, sizeof(line));
-	DEBUG_IO((stderr, "server_init returns %d,%s\n", ret, line));
-
-	if (!batch_mode && ret >= 0 && cmd_line)
-		my_fputc('\n', stdout);
-
-#	ifdef DEBUG
-	debug_nntp("nntp_open", line);
-#	endif /* DEBUG */
-
-	switch (ret) {
-		/*
-		 * ret < 0 : some error from system call
-		 * ret > 0 : NNTP response code
-		 *
-		 * According to the ietf-nntp mailinglist:
-		 *   200 you may (try to) do anything
-		 *   201 you may not POST
-		 *  (202 you may not IHAVE)
-		 *  (203 you may not do EITHER)
-		 *   All unrecognised 200 series codes should be assumed as success.
-		 *   All unrecognised 300 series codes should be assumed as notice to continue.
-		 *   All unrecognised 400 series codes should be assumed as temporary error.
-		 *   All unrecognised 500 series codes should be assumed as error.
-		 */
-
-		case OK_CANPOST:
-/*		case OK_NOIHAVE: */
-			can_post = TRUE && !force_no_post;
-			break;
-
-		case OK_NOPOST:
-/*		case OK_NOPOSTIHAVE: */
-			can_post = FALSE;
-			break;
-
-		default:
-			if (ret >= 200 && ret <= 299) {
-				can_post = TRUE && !force_no_post;
-				break;
-			}
-			if (ret < 0)
-				error_message(_(txt_failed_to_connect_to_server), nntp_server);
-			else
-				error_message(line);
-
-			return ret;
-	}
-	if (!is_reconnect) {
-		/* remove leading whitespace and save server's initial response */
-		linep = line;
-		while (isspace((int) *linep))
-			linep++;
-
-		STRCPY(bug_nntpserver1, linep);
-	}
-
-	/*
-	 * Switch INN into NNRP mode with 'mode reader'
-	 */
-
-#	ifdef DEBUG
-	debug_nntp("nntp_open", "mode reader");
-#	endif /* DEBUG */
-	DEBUG_IO((stderr, "nntp_command(MODE READER)\n"));
-	put_server("MODE READER");
-
-	/*
-	 * According to the latest NNTP draft (Jan 2002), MODE READER may only
-	 * return the following response codes:
-	 *
-	 *   200 (OK_CANPOST)     Hello, you can post
-	 *   201 (OK_NOPOST)      Hello, you can't post
-	 *  (202 (OK_NOIHAVE)     discussed on the itef mailinglist)
-	 *  (203 (OK_NOPOSTIHAVE) discussed on the itef mailinglist)
-	 *   400 (ERR_GOODBYE)    Service temporarily unavailable
-	 *   502 (ERR_ACCESS)     Service unavailable
-	 *
-	 * However, there may be old servers out there that do not implement this
-	 * command and therefore return ERR_COMMAND (500). Unfortunately there
-	 * are some new servers out there (i.e. INN 2.4.0 (20020220 prerelease)
-	 * which do return ERR_COMMAND if they are feed only servers.
-	 */
-
-	switch ((ret = get_respcode(line, sizeof(line)))) {
-		case OK_CANPOST:
-/*		case OK_NOIHAVE: */
-			can_post = TRUE && !force_no_post;
-			sec = TRUE;
-			break;
-
-		case OK_NOPOST:
-/*		case OK_NOPOSTIHAVE: */
-			can_post = FALSE;
-			sec = TRUE;
-			break;
-
-		case ERR_GOODBYE:
-		case ERR_ACCESS:
-			error_message(line);
-			return ret;
-
-		case ERR_COMMAND:
-		default:
-			break;
-
-	}
-
-	/*
-	 * NOTE: Latest NNTP draft (Jan 2002) states that LIST EXTENSIONS should
-	 *       be used to find out what commands are supported.
-	 *
-	 * TODO: Implement LIST EXTENSIONS here. Get this list before issuing
-	 *       authentication because the authentication method required may be
-	 *       mentioned in the list of extensions. (For details about
-	 *       authentication methods, see draft-newman-nntpext-auth-01.txt.)
-	 */
-
-	/*
-	 * If the user wants us to authenticate on connection startup, do it now.
-	 * Some news servers return "201 no posting" first, but after successful
-	 * authentication you get a "200 posting allowed". To find out if we are
-	 * allowed to post after authentication issue a "MODE READER" again and
-	 * interpret the response code.
-	 */
-
-	if (force_auth_on_conn_open) {
-#	ifdef DEBUG
-		debug_nntp("nntp_open", "authenticate");
-#	endif /* DEBUG */
-		authenticate(nntp_server, userid, TRUE);
-		put_server("MODE READER");
-		switch ((ret = get_respcode(line, sizeof(line)))) {
-			case OK_CANPOST:
-/*			case OK_NOIHAVE: */
-				can_post = TRUE && !force_no_post;
-				sec = TRUE;
-				break;
-
-			case OK_NOPOST:
-/*			case OK_NOPOSTIHAVE: */
-				can_post = FALSE;
-				sec = TRUE;
-				break;
-
-			case ERR_GOODBYE:
-			case ERR_ACCESS:
-				error_message(line);
-				return ret;
-
-			case ERR_COMMAND:	/* Uh-oh ... now we don't know if posting */
-			default:				/* is allowed or not ... so use last 200 */
-				break;			/* or 201 response to decide. */
-
-		}
-	}
-
-	if (!is_reconnect) {
-		/* Inform user if he cannot post */
-		if (!can_post && !batch_mode)
-			wait_message(0, "%s\n", _(txt_cannot_post));
-
-		/* Remove leading white space and save server's second response */
-		linep = line;
-		while (isspace((int) *linep))
-			linep++;
-
-		STRCPY(bug_nntpserver2, linep);
-
-		/*
-		 * Show user last server response line, do some nice formatting if
-		 * response is longer than a screen wide.
-		 *
-		 * TODO: This only breaks the line once, but the response could be
-		 * longer than two lines ...
-		 */
-		if (!batch_mode || verbose) {
-			char *chr1, *chr2;
-			int j;
-
-			j = atoi(get_val("COLUMNS", "80"));
-			chr1 = my_strdup((sec ? bug_nntpserver2 : bug_nntpserver1));
-
-			if (((int) strlen(chr1)) >= j) {
-				chr2 = chr1 + strlen(chr1) - 1;
-				while (chr2 - chr1 >= j)
-					chr2--;
-				while (chr2 > chr1 && *chr2 != ' ')
-					chr2--;
-				if (chr2 != chr1)
-					*chr2 = '\n';
-			}
-
-			wait_message(0, "%s\n", chr1);
-			free(chr1);
-		}
-	}
-
-	/*
-	 * Check if NNTP supports XOVER or OVER command (successor of XOVER as of
-	 * latest NNTP Draft (Jan 2002); ie, we _don't_ get an ERR_COMMAND
-	 * Could use (i=1;i>=0;i--) to give OVER higher priority than XOVER
-	 *
-	 * TODO: Don't try (X)OVER if listed in LIST EXTENSIONS.
-	 */
-	for (i = 0; i < 2; i++) {
-		xover_cmd = &txt_xover_buff[i];
-		if (!nntp_command(xover_cmd, ERR_COMMAND, NULL, 0))
-			break;
-	}
-
-	if (i == 2)	{	/* ie XOVER and OVER gave ERR_COMMAND */
-		xover_cmd = NULL;
-		if (!is_reconnect && !batch_mode) {
-			wait_message(2, _(txt_no_xover_support));
-
-			if (tinrc.cache_overview_files)
-				wait_message(2, _(txt_caching_on));
-			else
-				wait_message(2, _(txt_caching_off));
-		}
-	} else {
-		/* TODO: issue warning if old index files found? */
-		/*		 in index_newsdir ? */
-	}
-
-#	if 0 /* TODO: */
-	/* if we're using -n, check for LIST NEWSGROUPS <wildmat> */
-	if (newsrc_active && !list_active) { /* -n */
-		/* code goes here */
-	}
-#	endif /* 0 */
-
-	is_reconnect = TRUE;
-
-#endif /* NNTP_ABLE */
-
-	DEBUG_IO((stderr, "nntp_open okay\n"));
-	return 0;
-}
-
-
-void
-nntp_close(
-	void)
-{
-#ifdef NNTP_ABLE
-	if (read_news_via_nntp) {
-#	ifdef DEBUG
-		debug_nntp("nntp_close", "END");
-#	endif /* DEBUG */
-		close_server();
-	}
-#endif /* NNTP_ABLE */
-}
-
-
-/*
- * Get a response code from the server.
- * Returns:
- * 	+ve NNTP return code
- * 	-1  on an error or user abort. We don't differentiate.
- * If 'message' is not NULL, then any trailing text after the response
- * code is copied into it.
- * Does not perform authentication if required; use get_respcode()
- * instead.
- */
-int
-get_only_respcode(
-	char *message,
-	size_t mlen)
-{
-	int respcode = 0;
-#ifdef NNTP_ABLE
-	char *ptr, *end;
-
-	ptr = tin_fgets(FAKE_NNTP_FP, FALSE);
-
-	if (tin_errno || ptr == NULL) {
-#	ifdef DEBUG
-		debug_nntp("<<<", "Error: tin_error<>0 or ptr==NULL in get_only_respcode()");
-#	endif /* DEBUG */
-		return -1;
-	}
-
-#	ifdef DEBUG
-	debug_nntp("<<<", ptr);
-#	endif /* DEBUG */
-	respcode = (int) strtol(ptr, &end, 10);
-	DEBUG_IO((stderr, "get_only_respcode(%d)\n", respcode));
-
-	/* TODO: reconnect on ERR_FAULT? */
-	if ((respcode == ERR_FAULT || respcode == ERR_GOODBYE || respcode == OK_GOODBYE) && last_put[0] != '\0' && strcmp(last_put, "QUIT")) {
-		/*
-		 * Maybe server timed out.
-		 * If so, retrying will force a reconnect.
-		 */
-#	ifdef DEBUG
-		debug_nntp("get_only_respcode", "timeout");
-#	endif /* DEBUG */
-		put_server(last_put);
-		ptr = tin_fgets(FAKE_NNTP_FP, FALSE);
-
-		if (tin_errno) {
-#	ifdef DEBUG
-			debug_nntp("<<<", "Error: tin_errno <> 0");
-#	endif /* DEBUG */
-			return -1;
-		}
-
-#	ifdef DEBUG
-		debug_nntp("<<<", ptr);
-#	endif /* DEBUG */
-		respcode = (int) strtol(ptr, &end, 10);
-		DEBUG_IO((stderr, "get_only_respcode(%d)\n", respcode));
-	}
-	if (message != NULL && mlen > 1)		/* Pass out the rest of the text */
-		my_strncpy(message, end, mlen - 1);
-
-#endif /* NNTP_ABLE */
-	return respcode;
-}
-
-
-/*
- * Get a response code from the server.
- * Returns:
- * 	+ve NNTP return code
- * 	-1  on an error
- * If 'message' is not NULL, then any trailing text after the response
- *	code is copied into it.
- * Performs authentication if required and repeats the last command if
- * necessary after a timeout.
- */
-int
-get_respcode(
-	char *message,
-	size_t mlen)
-{
-	int respcode = 0;
-#ifdef NNTP_ABLE
-	char savebuf[NNTP_STRLEN];
-	char *ptr, *end;
-
-	respcode = get_only_respcode(message, mlen);
-	if ((respcode == ERR_NOAUTH) || (respcode == NEED_AUTHINFO)) {
-		/*
-		 * Server requires authentication.
-		 */
-#	ifdef DEBUG
-		debug_nntp("get_respcode", "authentication");
-#	endif /* DEBUG */
-		strncpy(savebuf, last_put, sizeof(savebuf) - 1);		/* Take copy, as authenticate() will clobber this */
-
-		if (authenticate(nntp_server, userid, FALSE)) {
-			strcpy(last_put, savebuf);
-
-			put_server(last_put);
-			ptr = tin_fgets(FAKE_NNTP_FP, FALSE);
-
-			if (tin_errno) {
-#	ifdef DEBUG
-				debug_nntp("<<<", "Error: tin_errno <> 0");
-#	endif /* DEBUG */
-				return -1;
-			}
-
-#	ifdef DEBUG
-			debug_nntp("<<<", ptr);
-#	endif /* DEBUG */
-			respcode = (int) strtol(ptr, &end, 10);
-			if (message != NULL && mlen > 1)				/* Pass out the rest of the text */
-				strncpy(message, end, mlen - 1);
-
-		} else {
-			error_message(_(txt_auth_failed), ERR_ACCESS);
-			/*	return -1; */
-			tin_done(EXIT_FAILURE);
-		}
-	}
-#endif /* NNTP_ABLE */
-	return respcode;
-}
-
-
-#ifdef NNTP_ABLE
-/*
- * Do an NNTP command. Send command to server, and read the reply.
- * If the reply code matches success, then return an open file stream
- * Return NULL if we did not see the response we wanted.
- * If message is not NULL, then the trailing text of the reply string is
- * copied into it for the caller to process.
- */
-FILE *
-nntp_command(
-	const char *command,
-	int success,
-	char *message,
-	size_t mlen)
-{
-DEBUG_IO((stderr, "nntp_command(%s)\n", command));
-#	ifdef DEBUG
-	debug_nntp("nntp command", command);
-#	endif /* DEBUG */
-	put_server(command);
-
-	if (!bool_equal(dangerous_signal_exit, TRUE)) {
-		if (get_respcode(message, mlen) != success) {
-#	ifdef DEBUG
-			debug_nntp(command, "NOT_OK");
-#	endif /* DEBUG */
-			/* error_message("%s", message); */
-			return (FILE *) 0;
-		}
-	}
-#	ifdef DEBUG
-	debug_nntp(command, "OK");
-#	endif /* DEBUG */
-	return FAKE_NNTP_FP;
-}
-#endif /* NNTP_ABLE */
-
-
-/*
- * Open the news active file locally or send the LIST command
- */
-FILE *
-open_news_active_fp(
-	void)
-{
-#ifdef NNTP_ABLE
-	if (read_news_via_nntp && !read_saved_news)
-		return (nntp_command("LIST", OK_GROUPS, NULL, 0));
-	else
-#endif /* NNTP_ABLE */
-		return (fopen(news_active_file, "r"));
-}
-
-
-/*
- * Open the NEWSLIBDIR/overview.fmt file locally or send LIST OVERVIEW.FMT
- */
-FILE *
-open_overview_fmt_fp(
-	void)
-{
-	char line[NNTP_STRLEN];
-
-#ifdef NNTP_ABLE
-	if (read_news_via_nntp && !read_saved_news) {
-		if (!xover_cmd)
-			return (FILE *) 0;
-
-		sprintf(line, "LIST %s", OVERVIEW_FMT);
-		return (nntp_command(line, OK_GROUPS, NULL, 0));
-	} else {
-#endif /* NNTP_ABLE */
-		joinpath(line, libdir, OVERVIEW_FMT);
-		return (fopen(line, "r"));
-#ifdef NNTP_ABLE
-	}
-#endif /* NNTP_ABLE */
-}
-
-
-/*
- * Open the active.times file locally or send the NEWGROUPS command
- *
- * NEWGROUPS yymmdd hhmmss
- */
-FILE *
-open_newgroups_fp(
-	int idx)
-{
-#ifdef NNTP_ABLE
-	char line[NNTP_STRLEN];
-	struct tm *ngtm;
-
-	if (read_news_via_nntp && !read_saved_news) {
-		if (idx == -1)
-			return (FILE *) 0;
-
-		ngtm = localtime(&newnews[idx].time);
-	/*
-	 * in the current draft NEWGROUPS is allowed to take a 4 digit year
-	 * componennt - but even with a 2 digit year componennt it is y2k
-	 * compilant... we should switch over to ngtm->tm_year + 1900
-	 * after most of the server could handle the new format
-	 */
-		snprintf(line, sizeof(line), "NEWGROUPS %02d%02d%02d %02d%02d%02d",
-			ngtm->tm_year % 100, ngtm->tm_mon + 1, ngtm->tm_mday,
-			ngtm->tm_hour, ngtm->tm_min, ngtm->tm_sec);
-
-		return (nntp_command(line, OK_NEWGROUPS, NULL, 0));
-	} else
-#endif /* NNTP_ABLE */
-		return (fopen(active_times_file, "r"));
-}
-
-
-/*
- * Get a list of default groups to subscribe to
- */
-/* TODO: fixme/checkme
- *      - logic seems to be wrong, NNTP_ABLE && read_saved_news
- *        looks for a local subscriptions_file, but read_saved_news doesn't
- *        require a local server... (a missing subscriptions_file doesn't
- *        cause any trouble, we just have to bother with the read_saved_news
- *        and a existing local subscriptions_file file case).
- *        open_newgroups_fp() uses the same logic.
- */
-FILE *
-open_subscription_fp(
-	void)
-{
-#ifdef NNTP_ABLE
-	if (read_news_via_nntp && !read_saved_news)
-		return (nntp_command("LIST SUBSCRIPTIONS", OK_GROUPS, NULL, 0));
-	else
-#endif /* NNTP_ABLE */
-		return (fopen(subscriptions_file, "r"));
-}
-
-
-#ifdef HAVE_MH_MAIL_HANDLING
-/*
- * Open the mail active file locally
- */
-FILE *
-open_mail_active_fp(
-	const char *mode)
-{
-	return fopen(mail_active_file, mode);
-}
-
-
-/*
- * Open mail groups description file locally
- */
-FILE *
-open_mailgroups_fp(
-	void)
-{
-	return fopen(mailgroups_file, "r");
-}
-#endif /* HAVE_MH_MAIL_HANDLING */
-
-
-/*
- * If reading via NNTP the newsgroups file will be saved to ~/.tin/newsgroups
- * so that any subsequent rereads on the active file will not have to waste
- * net bandwidth and the local copy of the newsgroups file can be accessed.
- */
-FILE *
-open_newsgroups_fp(
-	void)
-{
-#ifdef NNTP_ABLE
-	FILE *result;
-	if (read_news_via_nntp && !read_saved_news) {
-		if (read_local_newsgroups_file) {
-			result = fopen(local_newsgroups_file, "r");
-			if (result != NULL) {
-#	ifdef DEBUG
-				debug_nntp("open_newsgroups_fp", "Using local copy of newsgroups file");
-#	endif /* DEBUG */
-				return result;
-			}
-			read_local_newsgroups_file = FALSE;
-		}
-#	if 0 /* TODO: */
-		if (list_newsgroups_wildmat_supported && newsrc_active
-		    && !list_active
-		    && num_active < some_useful_limit) {
-			for_each_group(i) {
-				sprintf(buff, "LIST NEWSGROUPS %s", active[i].name);
-				nntp_command(buff, OK_LIST, NULL, 0);
-			}
-		} else
-#	endif /* 0 */
-		return (nntp_command("LIST NEWSGROUPS", OK_GROUPS, NULL, 0));
-	} else
-#endif /* NNTP_ABLE */
-		return fopen(newsgroups_file, "r");
-}
-
-
-/*
- * Open an article for reading just the header
- */
-FILE *
-open_art_header(
-	long art)
-{
-	char buf[NNTP_STRLEN];
-#ifdef NNTP_ABLE
-	FILE *fp;
-
-	if (read_news_via_nntp && CURR_GROUP.type == GROUP_TYPE_NEWS) {
-		/*
-		 * Don't bother requesting if we have not got there yet.
-		 * This is a big win if the group has got holes in it (ie. if 000's
-		 * of articles have expired between active files min & max values).
-		 */
-		if (art < head_next)
-			return (FILE *) 0;
-
-		sprintf(buf, "HEAD %ld", art);
-		if ((fp = nntp_command(buf, OK_HEAD, NULL, 0)) != NULL)
-			return fp;
-
-		/*
-		 * HEAD failed, try to find NEXT
-		 *	Should return "223 artno message-id more text...."
-		 */
-		if (nntp_command("NEXT", OK_NOTEXT, buf, sizeof(buf)))
-			head_next = atoi(buf);		/* Set next art number */
-
-		return (FILE *) 0;
-	} else {
-#endif /* NNTP_ABLE */
-		sprintf(buf, "%ld", art);
-		return (fopen(buf, "r"));
-#ifdef NNTP_ABLE
-	}
-#endif /* NNTP_ABLE */
-}
-
-
-/*
- * Open a mail/news article. Do MIME decoding if necessary.
- * Return:
- *		A pointer to the open postprocessed file
- *		NULL pointer if article read fails in some way
- */
-FILE *
-open_art_fp(
-	struct t_group *group,
-	long art)
-{
-	FILE *art_fp = (FILE *) 0;
-	char buf[NNTP_STRLEN];
-
-#ifdef NNTP_ABLE
-	if (read_news_via_nntp && group->type == GROUP_TYPE_NEWS) {
-		snprintf(buf, sizeof(buf), "ARTICLE %ld", art);
-		art_fp = nntp_command(buf, OK_ARTICLE, NULL, 0);
-	} else {
-#endif /* NNTP_ABLE */
-		char pbuf[PATH_LEN];
-		char fbuf[NAME_LEN + 1];
-		char group_path[PATH_LEN];
-
-		make_group_path(group->name, group_path);
-		joinpath(buf, group->spooldir, group_path);
-		snprintf(fbuf, sizeof(fbuf), "%ld", art);
-		joinpath(pbuf, buf, fbuf);
-
-		art_fp = fopen(pbuf, "r");
-#ifdef NNTP_ABLE
-	}
-#endif /* NNTP_ABLE */
-
-	return art_fp;
-}
-
-
-/*
- *  Longword comparison routine for the qsort()
- */
-static int
-base_comp(
-	t_comptype p1,
-	t_comptype p2)
-{
-	const long *a = (const long *) p1;
-	const long *b = (const long *) p2;
-
-	if (*a < *b)
-		return -1;
-
-	if (*a > *b)
-		return 1;
-
-	return 0;
-}
-
-
-/*
- * via NNTP:
- *   Issue a LISTGROUP command
- *   Read the article numbers existing in the group into base[]
- *   If the LISTGROUP failed, issue a GROUP command. Use the results to
- *   create a less accurate version of base[]
- *	 This data will already be sorted
- *
- * on local spool:
- *   Read the spool dir to populate base[] as above. Sort it.
- *
- * Grow the arts[] and bitmaps as needed.
- * NB: the output will be sorted on artnum
- *
- * grpmenu.max is one past top.
- * Returns total number of articles in group, or -1 on error
- */
-long
-setup_hard_base(
-	struct t_group *group)
-{
-	char buf[NNTP_STRLEN];
-	long art;
-	long total = 0;
-
-	grpmenu.max = 0;
-
-	/*
-	 * If reading with NNTP, issue a LISTGROUP
-	 */
-	if (read_news_via_nntp && group->type == GROUP_TYPE_NEWS) {
-#ifdef NNTP_ABLE
-
-#	ifdef BROKEN_LISTGROUP
-		/*
-		 * Some nntp servers are broken and need an extra GROUP command
-		 * (reported by reorx@irc.pl). This affects (old?) versions of
-		 * nntpcache and leafnode. Usually this should not be needed.
-		 */
-		sprintf(buf, "GROUP %s", group->name);
-		if (nntp_command(buf, OK_GROUP, NULL, 0) == NULL)
-			return -1;
-#	endif /* BROKEN_LISTGROUP */
-
-		/*
-		 * See if LISTGROUP works
-		 */
-		sprintf(buf, "LISTGROUP %s", group->name);
-		if (nntp_command(buf, OK_GROUP, NULL, 0) != NULL) {
-			char *ptr;
-
-#	ifdef DEBUG
-			debug_nntp("setup_hard_base", buf);
-#	endif /* DEBUG */
-
-			while ((ptr = tin_fgets(FAKE_NNTP_FP, FALSE)) != NULL) {
-				if (grpmenu.max >= max_art)
-					expand_art();
-
-				base[grpmenu.max++] = atoi(ptr);
-			}
-
-			if (tin_errno)
-				return -1;
-
-		} else {
-			long start, last, count;
-			char line[NNTP_STRLEN];
-
-			/*
-			 * Handle the obscure case that the user aborted before the LISTGROUP
-			 * had a chance to respond
-			 */
-			if (tin_errno)
-				return -1;
-
-			/*
-			 * LISTGROUP failed, try a GROUP command instead
-			 */
-			sprintf(buf, "GROUP %s", group->name);
-			if (nntp_command(buf, OK_GROUP, line, sizeof(line)) == NULL)
-				return -1;
-
-			if (sscanf(line, "%ld %ld %ld", &count, &start, &last) != 3)
-				return -1;
-
-			total = count;
-
-			if (last - count > start)
-				count = last - start;
-
-			while (start <= last) {
-				if (grpmenu.max >= max_art)
-					expand_art();
-				base[grpmenu.max++] = start++;
-			}
-		}
-#endif /* NNTP_ABLE */
-	/*
-	 * Reading off local spool, read the directory files
-	 */
-	} else {
-		DIR *d;
-		DIR_BUF *e;
-
-		make_base_group_path(group->spooldir, group->name, buf);
-
-		if (access(buf, R_OK) != 0) {
-			error_message(_(txt_not_exist));
-			return -1;
-		}
-
-		if ((d = opendir(buf)) != NULL) {
-			while ((e = readdir(d)) != NULL) {
-				art = atol(e->d_name);
-				if (art >= 1) {
-					total++;
-					if (grpmenu.max >= max_art)
-						expand_art();
-					base[grpmenu.max++] = art;
-				}
-			}
-			CLOSEDIR(d);
-			qsort((char *) base, (size_t) grpmenu.max, sizeof(long), base_comp);
-		}
-	}
-
-	if (grpmenu.max) {
-		if (base[grpmenu.max - 1] > group->xmax)
-			group->xmax = base[grpmenu.max - 1];
-		expand_bitmap(group, base[0]);
-	}
-
-	return total;
-}
-
-
-void
-vGet1GrpArtInfo(
-	struct t_group *grp)
-{
-	long lMinOld = grp->xmin;
-	long lMaxOld = grp->xmax;
-
-	group_get_art_info(grp->spooldir, grp->name, grp->type, &grp->count, &grp->xmax, &grp->xmin);
-
-	if (grp->newsrc.num_unread > grp->count) {
-#ifdef DEBUG
-		my_printf(cCRLF "Unread WRONG %s unread=[%ld] count=[%ld]", grp->name, grp->newsrc.num_unread, grp->count);
-		my_flush();
-#endif /* DEBUG */
-		grp->newsrc.num_unread = grp->count;
-	}
-
-	if (grp->xmin != lMinOld || grp->xmax != lMaxOld) {
-		expand_bitmap(grp, 0);
-#ifdef DEBUG
-		my_printf(cCRLF "Min/Max DIFF %s old=[%ld-%ld] new=[%ld-%ld]", grp->name, lMinOld, lMaxOld, grp->xmin, grp->xmax);
-		my_flush();
-#endif /* DEBUG */
-	}
-}
-
-
-/*
- * Find the total, max & min articles number for specified group
- * Use nntp GROUP command or read local spool
- * Return 0, or -error
- */
-int
-group_get_art_info(
-	char *tin_spooldir,
-	char *groupname,
-	int grouptype,
-	long *art_count,
-	long *art_max,
-	long *art_min)
-{
-	DIR *dir;
-	DIR_BUF *direntry;
-	char buf[NNTP_STRLEN];
-	long artnum;
-#ifdef M_AMIGA
-	long artmin;
-	long artmax;
-
-	artmin = *art_min;
-	artmax = *art_max;
-#endif /* M_AMIGA */
-
-	if (read_news_via_nntp && grouptype == GROUP_TYPE_NEWS) {
-#ifdef NNTP_ABLE
-		char line[NNTP_STRLEN];
-
-		sprintf(buf, "GROUP %s", groupname);
-#	ifdef DEBUG
-		debug_nntp("group_get_art_info", buf);
-#	endif /* DEBUG */
-		put_server(buf);
-
-		switch (get_respcode(line, sizeof(line))) {
-
-			case OK_GROUP:
-				if (sscanf(line, "%ld %ld %ld", art_count, art_min, art_max) != 3)
-					error_message(_("Invalid response to GROUP command, %s"), line);
-				break;
-
-			case ERR_NOGROUP:
-				*art_count = 0;
-				*art_min = 1;
-				*art_max = 0;
-				return -ERR_NOGROUP;
-
-			case ERR_ACCESS:
-				error_message("%s%s", cCRLF, line);
-				tin_done(NNTP_ERROR_EXIT);
-				/* keep lint quiet: */
-				/* NOTREACHED */
-				break;
-
-			default:
-#	ifdef DEBUG
-				debug_nntp("NOT_OK", line);
-#	endif /* DEBUG */
-				return -1;
-		}
-#else
-		my_fprintf(stderr, _("Unreachable?\n"));
-		return 0;
-#endif /* NNTP_ABLE */
-	} else {
-#ifdef M_AMIGA
-		if (!artmin)
-			*art_min = 1;
-		*art_max = artmax;
-		*art_count = artmax - *art_min + 1;
-#else
-		*art_count = 0;
-		*art_min = 1;
-		*art_max = 0;
-
-		make_base_group_path(tin_spooldir, groupname, buf);
-
-		if ((dir = opendir(buf)) != NULL) {
-			while ((direntry = readdir(dir)) != NULL) {
-				artnum = atol(direntry->d_name); /* should be '\0' terminated... */
-				if (artnum >= 1) {
-					if (artnum > *art_max) {
-						*art_max = artnum;
-						if (*art_min == 0)
-							*art_min = artnum;
-					} else if (artnum < *art_min)
-						*art_min = artnum;
-					(*art_count)++;
-				}
-			}
-			CLOSEDIR(dir);
-		} else
-			return -1;
-#endif /* M_AMIGA */
-	}
-
-	return 0;
-}
-
-
-#if 0
-/*
- * Stat a mail/news article to see if it still exists
- */
-static t_bool
-stat_article(
-	long art,
-	const char *group_path)
-{
-	char buf[NNTP_STRLEN];
-	struct t_group currgrp;
-
-	currgrp = CURR_GROUP;
-
-#	ifdef NNTP_ABLE
-	if (read_news_via_nntp && currgrp.type == GROUP_TYPE_NEWS) {
-		sprintf(buf, "STAT %ld", art);
-		return (nntp_command(buf, OK_NOTEXT, NULL, 0) != NULL);
-	} else
-#	endif /* NNTP_ABLE */
-	{
-		struct stat sb;
-
-		joinpath(buf, currgrp.spooldir, group_path);
-		sprintf(&buf[strlen(buf)], "/%ld", art);
-
-		return (stat(buf, &sb) != -1);
-	}
-}
-#endif /* 0 */
-
-
-/* This will come in useful for filtering on non-overview hdr fields */
-#if 0
-static FILE *
-open_xhdr_fp(
-	char *header,
-	long min,
-	long max)
-{
-#	ifdef NNTP_ABLE
-	if (read_news_via_nntp && !read_saved_news) {
-		char buf[NNTP_STRLEN];
-
-		sprintf(buf, "XHDR %s %ld-%ld", header, min, max);
-		return (nntp_command(buf, OK_HEAD, NULL, 0));
-	} else
-#	endif /* NNTP_ABLE */
-		return (FILE *) 0;		/* Some trick implementation for local spool... */
-}
-#endif /* 0 */
diff -Nurp tin-1.6.2/src/options_menu.c tin-1.8.0/src/options_menu.c
--- tin-1.6.2/src/options_menu.c	1970-01-01 01:00:00.000000000 +0100
+++ tin-1.8.0/src/options_menu.c	2005-12-02 12:07:36.000000000 +0100
@@ -0,0 +1,1498 @@
+/*
+ *  Project   : tin - a Usenet reader
+ *  Module    : options_menu.c
+ *  Author    : Michael Bienia <michael@vorlon.ping.de>
+ *  Created   : 2004-09-05
+ *  Updated   : 2005-07-02
+ *  Notes     : Split from config.c
+ *
+ * Copyright (c) 2004-2006 Michael Bienia <michael@vorlon.ping.de>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior written
+ *    permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#ifndef TIN_H
+#	include "tin.h"
+#endif /* !TIN_H */
+#ifndef TINCFG_H
+#	include "tincfg.h"
+#endif /* !TINCFG_H */
+#ifndef TCURSES_H
+#	include "tcurses.h"
+#endif /* !TCURSES_H */
+
+
+#define option_lines_per_page (cLINES - INDEX_TOP - 3)
+
+static enum option_enum first_option_on_screen, last_option_on_screen;
+
+/*
+ * local prototypes
+ */
+static enum option_enum move_cursor(enum option_enum cur_option, t_bool down);
+static enum option_enum next_option(enum option_enum option, t_bool incl_titles);
+static enum option_enum opt_scroll_down(enum option_enum option);
+static enum option_enum opt_scroll_up(enum option_enum option);
+static enum option_enum prev_option(enum option_enum option, t_bool incl_titles);
+static enum option_enum set_option_num(int num);
+static int get_option_num(enum option_enum option);
+static t_bool option_is_title(enum option_enum option);
+static t_bool option_on_page(enum option_enum option);
+static t_function option_left(void);
+static t_function option_right(void);
+static void highlight_option(enum option_enum option);
+static void print_any_option(enum option_enum the_option);
+static void redraw_screen(enum option_enum option);
+static void repaint_option(enum option_enum option);
+static void set_first_option_on_screen(enum option_enum last_option);
+static void set_last_option_on_screen(enum option_enum first_option);
+static void show_config_page(void);
+static void unhighlight_option(enum option_enum option);
+#ifdef USE_CURSES
+	static void do_scroll(int jump);
+#endif /* USE_CURSES */
+
+
+/*
+ * returns the row on the screen of an option
+ * note: option should be on this page
+ */
+int
+option_row(
+	enum option_enum option)
+{
+	int i = 0;
+	enum option_enum j = first_option_on_screen;
+
+	while (j < option) {
+		if (option_is_visible(j))
+			i++;
+		j++;
+	}
+
+	return INDEX_TOP + i;
+}
+
+
+/*
+ * returns the number of an option
+ */
+static int
+get_option_num(
+	enum option_enum option)
+{
+	enum option_enum i;
+	int result = 0;
+
+	for (i = 0; i < option && result < LAST_OPT; i = next_option(i, FALSE))
+		result++;
+
+	return result;
+}
+
+
+/*
+ * returns the option with the given number
+ */
+static enum option_enum
+set_option_num(
+	int num)
+{
+	enum option_enum result = 0;
+
+	while (num > 0 && result < LAST_OPT) {
+		result = next_option(result, FALSE);
+		num--;
+	}
+	return result;
+}
+
+
+/*
+ * returns TRUE if an option is visible in the menu
+ */
+t_bool
+option_is_visible(
+	enum option_enum option)
+{
+	switch (option) {
+#ifdef HAVE_COLOR
+		case OPT_COL_BACK:
+		case OPT_COL_FROM:
+		case OPT_COL_HEAD:
+		case OPT_COL_HELP:
+		case OPT_COL_INVERS_BG:
+		case OPT_COL_INVERS_FG:
+		case OPT_COL_MESSAGE:
+		case OPT_COL_MINIHELP:
+		case OPT_COL_NEWSHEADERS:
+		case OPT_COL_NORMAL:
+		case OPT_COL_QUOTE:
+		case OPT_COL_QUOTE2:
+		case OPT_COL_QUOTE3:
+		case OPT_COL_RESPONSE:
+		case OPT_COL_SIGNATURE:
+		case OPT_COL_SUBJECT:
+		case OPT_COL_TEXT:
+		case OPT_COL_TITLE:
+		case OPT_COL_URLS:
+			return tinrc.use_color;
+
+		case OPT_COL_MARKSTAR:
+		case OPT_COL_MARKDASH:
+		case OPT_COL_MARKSLASH:
+		case OPT_COL_MARKSTROKE:
+			return tinrc.word_highlight && tinrc.use_color;
+#endif /* HAVE_COLOR */
+
+		case OPT_WORD_H_DISPLAY_MARKS:
+		case OPT_MONO_MARKSTAR:
+		case OPT_MONO_MARKDASH:
+		case OPT_MONO_MARKSLASH:
+		case OPT_MONO_MARKSTROKE:
+			return tinrc.word_highlight;
+
+		default:
+			return TRUE;
+	}
+}
+
+
+/*
+ * returns TRUE if option is OPT_TITLE else FALSE
+ */
+static t_bool
+option_is_title(
+	enum option_enum option)
+{
+	return option_table[option].var_type == OPT_TITLE;
+}
+
+
+/*
+ * returns TRUE if option is on the current page else FALSE
+ */
+static t_bool
+option_on_page(
+	enum option_enum option)
+{
+	return ((option >= first_option_on_screen) && (option <= last_option_on_screen));
+}
+
+
+char *
+fmt_option_prompt(
+	char *dst,
+	size_t len,
+	t_bool editing,
+	enum option_enum option)
+{
+	char *buf;
+	size_t option_width = MAX(35, cCOLS / 2 - 9);
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wchar_t *wbuf, *wbuf2;
+
+	/* convert the option text to wchar_t */
+	wbuf = char2wchar_t(_(option_table[option].txt->opt));
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+
+	if (!option_is_title(option)) {
+		int num = get_option_num(option);
+
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		if (wbuf != NULL) {
+			wbuf2 = wstrunc(wbuf, option_width);
+			if ((buf = wchar_t2char(wbuf2)) == NULL) {
+				/* conversion failed, truncate original string */
+				buf = strunc(_(option_table[option].txt->opt), option_width);
+				snprintf(dst, len, "%s %3d. %-*.*s: ", editing ? "->" : "  ", num, (int) option_width, (int) option_width, buf);
+			} else
+				snprintf(dst, len, "%s %3d. %-*.*s: ", editing ? "->" : "  ", num,
+					(int) (strlen(buf) + option_width - wcswidth(wbuf2, option_width + 1)),
+					(int) (strlen(buf) + option_width - wcswidth(wbuf2, option_width + 1)), buf);
+			free(wbuf2);
+		} else
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+		{
+			/* truncate original string */
+			buf = strunc(_(option_table[option].txt->opt), option_width);
+			snprintf(dst, len, "%s %3d. %-*.*s: ", editing ? "->" : "  ", num, (int) option_width, (int) option_width, buf);
+		}
+	} else {
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		if (wbuf != NULL) {
+			wbuf2 = wstrunc(wbuf, cCOLS - 3);
+			if ((buf = wchar_t2char(wbuf2)) == NULL)	/* conversion failed, truncate original string */
+				buf = strunc(_(option_table[option].txt->opt), cCOLS - 3);
+			free(wbuf2);
+		} else
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+			buf = strunc(_(option_table[option].txt->opt), cCOLS - 3);	/* truncate original string */
+		snprintf(dst, len, "  %s", buf);
+	}
+
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	FreeIfNeeded(wbuf);
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	FreeIfNeeded(buf);
+	return dst;
+}
+
+
+static void
+print_any_option(
+	enum option_enum option)
+{
+	constext **list;
+	char temp[LEN], *ptr, *ptr2;
+	int row = option_row(option);
+	size_t len = sizeof(temp) - 1;
+
+	MoveCursor(row, 0);
+
+	ptr = fmt_option_prompt(temp, len, FALSE, option);
+	ptr += strlen(temp);
+	len -= strlen(temp);
+
+	switch (option_table[option].var_type) {
+		case OPT_ON_OFF:
+			/* tailing space to overwrite any left over F from OFF */
+			snprintf(ptr, len, "%s ", print_boolean(*OPT_ON_OFF_list[option_table[option].var_index]));
+			break;
+
+		case OPT_LIST:
+			list = option_table[option].opt_list;
+			ptr2 = my_strdup(list[*(option_table[option].variable) + ((strcasecmp(_(list[0]), _(txt_default)) == 0) ? 1 : 0)]);
+			snprintf(ptr, len, "%s", _(ptr2));
+			free(ptr2);
+			break;
+
+		case OPT_STRING:
+			snprintf(ptr, len, "%s", OPT_STRING_list[option_table[option].var_index]);
+			break;
+
+		case OPT_NUM:
+			snprintf(ptr, len, "%d", *(option_table[option].variable));
+			break;
+
+		case OPT_CHAR:
+			snprintf(ptr, len, "%c", *OPT_CHAR_list[option_table[option].var_index]);
+			break;
+
+		default:
+			break;
+	}
+#ifdef USE_CURSES
+	my_printf("%.*s", cCOLS - 1, temp);
+	{
+		int y, x;
+
+		getyx(stdscr, y, x);
+		if (x < cCOLS)
+			clrtoeol();
+	}
+#else
+	my_printf("%.*s", cCOLS - 1, temp);
+	/* draw_arrow_mark() will read this back for repainting */
+	strncpy(screen[row - INDEX_TOP].col, temp, cCOLS);
+#endif /* USE_CURSES */
+}
+
+
+static void
+repaint_option(
+	enum option_enum option)
+{
+	if (option_on_page(option))
+		print_any_option(option);
+}
+
+
+#ifdef USE_CURSES
+static void
+do_scroll(
+	int jump)
+{
+	scrollok(stdscr, TRUE);
+	MoveCursor(INDEX_TOP, 0);
+	SetScrollRegion(INDEX_TOP, INDEX_TOP + option_lines_per_page - 1);
+	ScrollScreen(jump);
+	SetScrollRegion(0, LINES - 1);
+	scrollok(stdscr, FALSE);
+}
+#endif /* USE_CURSES */
+
+
+/*
+ * returns the option after moving 'move' positions up or down
+ * updates also first_option_on_screen and last_option_on screen accordingly
+ */
+static enum option_enum
+move_cursor(
+	enum option_enum cur_option,
+	t_bool down)
+{
+	enum option_enum old_option = cur_option;
+
+	if (down) {		/* move down */
+		do {
+			cur_option = next_option(cur_option, TRUE);
+			if (cur_option > last_option_on_screen) {
+				/* move the markers one option down */
+				last_option_on_screen = cur_option;
+				first_option_on_screen = next_option(first_option_on_screen, TRUE);
+#ifdef USE_CURSES
+				do_scroll(1);
+				print_any_option(cur_option);
+#else
+				show_config_page();
+#endif /* USE_CURSES */
+			} else if (cur_option < first_option_on_screen) {
+				/* wrap around: set to begin of option list */
+				first_option_on_screen = cur_option;
+				set_last_option_on_screen(cur_option);
+				show_config_page();
+			}
+		} while (option_is_title(cur_option) && old_option != cur_option);
+	} else {		/* move up */
+		do {
+			cur_option = prev_option(cur_option, TRUE);
+			if (cur_option < first_option_on_screen) {
+				/* move the markers one option up */
+				first_option_on_screen = cur_option;
+				last_option_on_screen = prev_option(last_option_on_screen, TRUE);
+#ifdef USE_CURSES
+				do_scroll(-1);
+				print_any_option(cur_option);
+#else
+				show_config_page();
+#endif /* USE_CURSES */
+			} else if (cur_option > last_option_on_screen) {
+				/* wrap around: set to end of option list */
+				last_option_on_screen = cur_option;
+				set_first_option_on_screen(cur_option);
+				show_config_page();
+			}
+		} while (option_is_title(cur_option) && old_option != cur_option);
+	}
+	return cur_option;
+}
+
+
+/*
+ * scroll the screen one line down
+ * the selected option is only moved if it is scrolled off the screen
+ */
+static enum option_enum
+opt_scroll_down(
+	enum option_enum option)
+{
+	if (last_option_on_screen < LAST_OPT) {
+		first_option_on_screen = next_option(first_option_on_screen, TRUE);
+		set_last_option_on_screen(first_option_on_screen);
+#ifdef USE_CURSES
+		do_scroll(1);
+		print_any_option(last_option_on_screen);
+		stow_cursor();
+#else
+		show_config_page();
+#endif /* USE_CURSES */
+		if (option < first_option_on_screen) {
+			option = first_option_on_screen;
+			if (option_is_title(option))
+				option = next_option(option, FALSE);
+#ifdef USE_CURSES
+			highlight_option(option);
+#endif /* USE_CURSES */
+		}
+#ifndef USE_CURSES
+		/* in the !USE_CURSES case we must always highlight the option */
+		highlight_option(option);
+#endif /* !USE_CURSES */
+	}
+	return option;
+}
+
+
+/*
+ * scroll the screen one line up
+ * the selected option is only moved if it is scrolled off the screen
+ */
+static enum option_enum
+opt_scroll_up(
+	enum option_enum option)
+{
+	if (first_option_on_screen > 0) {
+		first_option_on_screen = prev_option(first_option_on_screen, TRUE);
+		set_last_option_on_screen(first_option_on_screen);
+#ifdef USE_CURSES
+		do_scroll(-1);
+		print_any_option(first_option_on_screen);
+		stow_cursor();
+#else
+		show_config_page();
+#endif /* USE_CURSES */
+		if (option > last_option_on_screen) {
+			option = last_option_on_screen;
+			if (option_is_title(option))
+				option = prev_option(option, FALSE);
+#ifdef USE_CURSES
+			highlight_option(option);
+#endif /* USE_CURSES */
+		}
+#ifndef USE_CURSES
+		/* in the !USE_CURSES case we must always highlight the option */
+		highlight_option(option);
+#endif /* !USE_CURSES */
+	}
+	return option;
+}
+
+
+/*
+ * returns the next visible option
+ * if 'incl_titles' is TRUE titles are also returned else they are skipped
+ */
+static enum option_enum
+next_option(
+	enum option_enum option,
+	t_bool incl_titles)
+{
+	do {
+		option++;
+		if (option > LAST_OPT)
+			option = 0;
+	} while (!(option_is_visible(option) && (incl_titles || !option_is_title(option))));
+
+	return option;
+}
+
+
+/*
+ * returns the previous visible option
+ * if 'incl_titles' is TRUE titles are also returned else they are skipped
+ */
+static enum option_enum
+prev_option(
+	enum option_enum option,
+	t_bool incl_titles)
+{
+	do {
+		if (option == 0)
+			option = LAST_OPT;
+		else
+			option--;
+	} while (!(option_is_visible(option) && (incl_titles || !option_is_title(option))));
+
+	return option;
+}
+
+
+/*
+ * set first_option_on_screen in such way that 'last_option' will be
+ * the last option on the screen
+ */
+static void
+set_first_option_on_screen(
+	enum option_enum last_option)
+{
+	int i;
+
+	first_option_on_screen = last_option;
+	for (i = 1; i < option_lines_per_page && first_option_on_screen > 0; i++)
+		first_option_on_screen = prev_option(first_option_on_screen, TRUE);
+
+	/*
+	 * make sure that the first page is used completely
+	 */
+	if (first_option_on_screen == 0)
+		set_last_option_on_screen(0);
+}
+
+
+/*
+ * set last_option_on_screen in such way that 'first_option' will be
+ * the first option on the screen
+ */
+static void
+set_last_option_on_screen(
+	enum option_enum first_option)
+{
+	int i;
+
+	last_option_on_screen = first_option;
+	/*
+	 * on last page, there need not be option_lines_per_page options
+	 */
+	for (i = 1; i < option_lines_per_page && last_option_on_screen < LAST_OPT; i++)
+		last_option_on_screen = next_option(last_option_on_screen, TRUE);
+}
+
+
+static void
+highlight_option(
+	enum option_enum option)
+{
+	refresh_config_page(option); /* to keep refresh_config_page():last_option up-to-date */
+	draw_arrow_mark(option_row(option));
+	info_message("%s", _(option_table[option].txt->opt));
+}
+
+
+static void
+unhighlight_option(
+	enum option_enum option)
+{
+	/* Astonishing hack */
+	t_menu *savemenu = currmenu;
+	t_menu cfgmenu = { 0, 1, 0, NULL, NULL, NULL };
+
+	currmenu = &cfgmenu;
+	currmenu->curr = option_row(option) - INDEX_TOP;
+	erase_arrow();
+	currmenu = savemenu;
+	clear_message();
+}
+
+
+/*
+ * Refresh the config page which holds the actual option. If act_option is
+ * smaller zero fall back on the last given option (first option if there was
+ * no last option) and refresh the screen.
+ */
+void
+refresh_config_page(
+	enum option_enum act_option)
+{
+	static enum option_enum last_option = 0;
+	/* t_bool force_redraw = FALSE; */
+
+	if (act_option == SIGNAL_HANDLER) {	/* called by signal handler */
+		/* force_redraw = TRUE; */
+		act_option = last_option;
+		set_last_option_on_screen(first_option_on_screen); /* terminal size may have changed */
+		if (!option_on_page(last_option)) {
+			last_option_on_screen = last_option;
+			set_first_option_on_screen(last_option);
+		}
+		redraw_screen(last_option);
+	}
+	last_option = act_option;
+}
+
+
+static void
+redraw_screen(
+	enum option_enum option)
+{
+	my_retouch();
+	set_xclick_off();
+	show_config_page();
+	highlight_option(option);
+}
+
+
+/*
+ * show_menu_help
+ */
+void
+show_menu_help(
+	const char *help_message)
+{
+	MoveCursor(cLINES - 2, 0);
+	CleartoEOLN();
+	center_line(cLINES - 2, FALSE, _(help_message));
+}
+
+
+/*
+ * display current configuration page
+ */
+static void
+show_config_page(
+	void)
+{
+	enum option_enum i;
+
+	ClearScreen();
+	center_line(0, TRUE, _(txt_options_menu));
+
+	for (i = first_option_on_screen; i <= last_option_on_screen; i++) {
+		while (!option_is_visible(i))
+			i++;
+		if (i > LAST_OPT)
+			break;
+		print_any_option(i);
+	}
+
+	show_menu_help(txt_select_config_file_option);
+	my_flush();
+	stow_cursor();
+}
+
+
+/*
+ * Check if score_kill is <= score_limit_kill and if score_select >= score_limit_select
+ */
+void
+check_score_defaults(
+	void)
+{
+	if (tinrc.score_kill > tinrc.score_limit_kill)
+		tinrc.score_kill = tinrc.score_limit_kill;
+
+	if (tinrc.score_select < tinrc.score_limit_select)
+		tinrc.score_select = tinrc.score_limit_select;
+}
+
+
+static t_function
+option_left(
+	void)
+{
+	return GLOBAL_QUIT;
+}
+
+
+static t_function
+option_right(
+	void)
+{
+	return CONFIG_SELECT;
+}
+
+
+/*
+ * options menu so that the user can dynamically change parameters
+ *
+ * TODO: - why do we use ret_code when we never modify it?  what about calling
+ *         code which checks the return value?
+ *       - when we change something we need to update the related attributes
+ *         as well (see line 2009).
+ */
+int
+change_config_file(
+	struct t_group *group)
+{
+	enum option_enum option, old_option;
+	int ret_code = NO_FILTERING;
+	int mime_encoding = MIME_ENCODING_7BIT;
+	t_bool change_option = FALSE;
+	t_function func;
+
+	signal_context = cConfig;
+
+	option = 1;
+	first_option_on_screen = 0;
+	set_last_option_on_screen(0);
+
+	redraw_screen(option);
+	forever {
+		switch ((func = handle_keypad(option_left, option_right, NULL, option_menu_keys))) {
+			case GLOBAL_QUIT:
+				write_config_file(local_config_file);
+				/* FALLTHROUGH */
+			case CONFIG_NO_SAVE:
+				clear_note_area();
+				return ret_code;
+
+			case GLOBAL_LINE_UP:
+				unhighlight_option(option);
+				option = move_cursor(option, FALSE);
+				highlight_option(option);
+				break;
+
+			case GLOBAL_LINE_DOWN:
+				unhighlight_option(option);
+				option = move_cursor(option, TRUE);
+				highlight_option(option);
+				break;
+
+			case GLOBAL_FIRST_PAGE:
+				unhighlight_option(option);
+				option = 1;
+				first_option_on_screen = 0;
+				set_last_option_on_screen(0);
+				redraw_screen(option);
+				/* highlight_option(option); is already done by redraw_screen() */
+				break;
+
+			case GLOBAL_LAST_PAGE:
+				unhighlight_option(option);
+				option = LAST_OPT;
+				last_option_on_screen = LAST_OPT;
+				set_first_option_on_screen(LAST_OPT);
+				redraw_screen(option);
+				/* highlight_option(option); is already done by redraw_screen() */
+				break;
+
+			case GLOBAL_PAGE_UP:
+				unhighlight_option(option);
+				if (option != first_option_on_screen &&	!(option_is_title(first_option_on_screen) && option == next_option(first_option_on_screen, FALSE))) {
+					option = first_option_on_screen;
+					if (option_is_title(option))
+						option = next_option(option, FALSE);
+					highlight_option(option);
+					break;
+				} else if (tinrc.scroll_lines == -2 && first_option_on_screen != 0) {
+					int i = option_lines_per_page / 2;
+
+					for (; i > 0; i--) {
+						last_option_on_screen = prev_option(last_option_on_screen, TRUE);
+						if (last_option_on_screen == LAST_OPT)	/* end on wrap around */
+							break;
+					}
+				} else
+					last_option_on_screen = prev_option(first_option_on_screen, TRUE);
+
+				set_first_option_on_screen(last_option_on_screen);
+				if (last_option_on_screen == LAST_OPT)
+					option = last_option_on_screen;
+				else
+					option = first_option_on_screen;
+				if (option_is_title(option))
+					option = next_option(option, FALSE);
+				redraw_screen(option);
+				/* highlight_option(option); is already done by redraw_screen() */
+				break;
+
+			case GLOBAL_PAGE_DOWN:
+				unhighlight_option(option);
+				if (option == LAST_OPT) {
+					/* wrap around */
+					first_option_on_screen = 0;
+					option = 0;
+				} else {
+					enum option_enum old_first = first_option_on_screen;
+
+					if (tinrc.scroll_lines == -2) {
+						int i = option_lines_per_page / 2;
+
+						for (; i > 0; i--) {
+							first_option_on_screen = next_option(first_option_on_screen, TRUE);
+							if (first_option_on_screen == 0)	/* end on wrap_around */
+								break;
+						}
+					} else
+						first_option_on_screen = next_option(last_option_on_screen, TRUE);
+
+					if (first_option_on_screen == 0) {
+						first_option_on_screen = old_first;
+						option = LAST_OPT;
+						highlight_option(option);
+						break;
+					} else
+						option = first_option_on_screen;
+				}
+
+				set_last_option_on_screen(first_option_on_screen);
+				if (option_is_title(option))
+					option = next_option(option, FALSE);
+				redraw_screen(option);
+				/* highlight_option(option); is already done by redraw_screen() */
+				break;
+
+			case GLOBAL_SCROLL_UP:
+				option = opt_scroll_up(option);
+				break;
+
+			case GLOBAL_SCROLL_DOWN:
+				option = opt_scroll_down(option);
+				break;
+
+			case DIGIT_1:
+			case DIGIT_2:
+			case DIGIT_3:
+			case DIGIT_4:
+			case DIGIT_5:
+			case DIGIT_6:
+			case DIGIT_7:
+			case DIGIT_8:
+			case DIGIT_9:
+				unhighlight_option(option);
+				option = set_option_num(prompt_num(func_to_key(func, option_menu_keys), _(txt_enter_option_num)));
+				if (!option_on_page(option)) {
+					first_option_on_screen = option;
+					set_last_option_on_screen(option);
+					redraw_screen(option);
+				} else
+					highlight_option(option);
+				break;
+
+			case GLOBAL_SEARCH_SUBJECT_FORWARD:
+			case GLOBAL_SEARCH_SUBJECT_BACKWARD:
+			case GLOBAL_SEARCH_REPEAT:
+				if (func == GLOBAL_SEARCH_REPEAT && last_search != GLOBAL_SEARCH_SUBJECT_FORWARD && last_search != GLOBAL_SEARCH_SUBJECT_BACKWARD)
+					break;
+
+				old_option = option;
+				option = search_config((func == GLOBAL_SEARCH_SUBJECT_FORWARD), (func == GLOBAL_SEARCH_REPEAT), option, LAST_OPT);
+				if (option != old_option) {
+					unhighlight_option(old_option);
+					if (!option_on_page(option)) {
+						first_option_on_screen = option;
+						set_last_option_on_screen(option);
+						redraw_screen(option);
+					} else
+						highlight_option(option);
+				}
+				break;
+
+			case CONFIG_SELECT:
+				change_option = TRUE;
+				break;
+
+			case GLOBAL_REDRAW_SCREEN:
+				set_last_option_on_screen(first_option_on_screen);
+				redraw_screen(option);
+				break;
+
+			case GLOBAL_VERSION:
+				info_message(cvers);
+				break;
+
+			default:
+				break;
+		} /* switch (ch) */
+
+		if (change_option) {
+			switch (option_table[option].var_type) {
+				case OPT_ON_OFF:
+					switch (option) {
+						case OPT_ADD_POSTED_TO_FILTER:
+						case OPT_ADVERTISING:
+						case OPT_ALTERNATIVE_HANDLING:
+						case OPT_ASK_FOR_METAMAIL:
+						case OPT_AUTO_BCC:
+						case OPT_AUTO_CC:
+						case OPT_AUTO_LIST_THREAD:
+						case OPT_AUTO_RECONNECT:
+						case OPT_AUTO_SAVE:
+						case OPT_BATCH_SAVE:
+						case OPT_CACHE_OVERVIEW_FILES:
+						case OPT_CATCHUP_READ_GROUPS:
+						case OPT_FORCE_SCREEN_REDRAW:
+						case OPT_GROUP_CATCHUP_ON_EXIT:
+						case OPT_KEEP_DEAD_ARTICLES:
+						case OPT_MARK_IGNORE_TAGS:
+						case OPT_MARK_SAVED_READ:
+						case OPT_PGDN_GOTO_NEXT:
+						case OPT_POS_FIRST_UNREAD:
+						case OPT_POST_PROCESS_VIEW:
+#ifndef DISABLE_PRINTING
+						case OPT_PRINT_HEADER:
+#endif /*! DISABLE_PRINTING */
+						case OPT_PROCESS_ONLY_UNREAD:
+						case OPT_PROMPT_FOLLOWUPTO:
+						case OPT_SHOW_ONLY_UNREAD_GROUPS:
+						case OPT_SHOW_SIGNATURES:
+						case OPT_SIGDASHES:
+						case OPT_SIGNATURE_REPOST:
+						case OPT_SPACE_GOTO_NEXT_UNREAD:
+						case OPT_START_EDITOR_OFFSET:
+						case OPT_STRIP_BLANKS:
+						case OPT_STRIP_NEWSRC:
+						case OPT_TAB_GOTO_NEXT_UNREAD:
+						case OPT_TEX2ISO_CONV:
+						case OPT_THREAD_CATCHUP_ON_EXIT:
+#if defined(HAVE_ICONV_OPEN_TRANSLIT) && defined(CHARSET_CONVERSION)
+						case OPT_TRANSLIT:
+#endif /* HAVE_ICONV_OPEN_TRANSLIT && CHARSET_CONVERSION */
+						case OPT_UNLINK_ARTICLE:
+						case OPT_URL_HIGHLIGHT:
+#ifdef HAVE_KEYPAD
+						case OPT_USE_KEYPAD:
+#endif /* HAVE_KEYPAD */
+						case OPT_USE_MOUSE:
+						case OPT_WRAP_ON_NEXT_UNREAD:
+							prompt_option_on_off(option);
+							break;
+
+						/* show mini help menu */
+						case OPT_BEGINNER_LEVEL:
+							if (prompt_option_on_off(option))
+								set_noteslines(cLINES);
+							break;
+
+						/* show all arts or just new/unread arts */
+						case OPT_SHOW_ONLY_UNREAD_ARTS:
+							if (prompt_option_on_off(option) && group != NULL) {
+								make_threads(group, TRUE);
+								pos_first_unread_thread();
+							}
+							break;
+
+						/* draw -> / highlighted bar */
+						case OPT_DRAW_ARROW:
+							prompt_option_on_off(option);
+							unhighlight_option(option);
+							if (!tinrc.draw_arrow && !tinrc.inverse_okay) {
+								tinrc.inverse_okay = TRUE;
+								repaint_option(OPT_INVERSE_OKAY);
+							}
+							break;
+
+						/* draw inversed screen header lines */
+						/* draw inversed group/article/option line if draw_arrow is OFF */
+						case OPT_INVERSE_OKAY:
+							prompt_option_on_off(option);
+							unhighlight_option(option);
+							if (!tinrc.draw_arrow && !tinrc.inverse_okay) {
+								tinrc.draw_arrow = TRUE;	/* we don't want to navigate blindly */
+								repaint_option(OPT_DRAW_ARROW);
+							}
+							break;
+
+						case OPT_MAIL_8BIT_HEADER:
+							prompt_option_on_off(option);
+							if (strcasecmp(txt_mime_encodings[tinrc.mail_mime_encoding], txt_8bit)) {
+								tinrc.mail_8bit_header = FALSE;
+								print_any_option(OPT_MAIL_8BIT_HEADER);
+							}
+							break;
+
+						case OPT_POST_8BIT_HEADER:
+							prompt_option_on_off(option);
+							/* if post_mime_encoding != 8bit, post_8bit_header is disabled */
+							if (strcasecmp(txt_mime_encodings[tinrc.post_mime_encoding], txt_8bit)) {
+								tinrc.post_8bit_header = FALSE;
+								print_any_option(OPT_POST_8BIT_HEADER);
+							}
+							break;
+
+						/* show newsgroup description text next to newsgroups */
+						case OPT_SHOW_DESCRIPTION:
+							prompt_option_on_off(option);
+							show_description = tinrc.show_description;
+							if (show_description)			/* force reread of newgroups file */
+								read_descriptions(FALSE);
+							break;
+
+#ifdef HAVE_COLOR
+						/* use ANSI color */
+						case OPT_USE_COLOR:
+							prompt_option_on_off(option);
+#	ifdef USE_CURSES
+							if (!has_colors())
+								use_color = FALSE;
+							else
+#	endif /* USE_CURSES */
+								use_color = tinrc.use_color;
+							set_last_option_on_screen(first_option_on_screen);
+							redraw_screen(option);
+							break;
+#endif /* HAVE_COLOR */
+
+#ifdef XFACE_ABLE
+						/* use slrnface */
+						case OPT_USE_SLRNFACE:
+							if (prompt_option_on_off(option)) {
+								if (!tinrc.use_slrnface)
+									slrnface_stop();
+								else
+									slrnface_start();
+							}
+							break;
+#endif /* XFACE_ABLE */
+
+						/* word_highlight */
+						case OPT_WORD_HIGHLIGHT:
+							prompt_option_on_off(option);
+							word_highlight = tinrc.word_highlight;
+							set_last_option_on_screen(first_option_on_screen);
+							redraw_screen(option);
+							break;
+
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && defined(HAVE_UNICODE_UBIDI_H) && !defined(NO_LOCALE)
+						case OPT_RENDER_BIDI:
+							prompt_option_on_off(option);
+							break;
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && HAVE_UNICODE_UBIDI_H && !NO_LOCALE */
+
+						default:
+							break;
+					} /* switch (option) */
+					break;
+
+				case OPT_LIST:
+					switch (option) {
+#ifdef HAVE_COLOR
+						case OPT_COL_BACK:
+						case OPT_COL_FROM:
+						case OPT_COL_HEAD:
+						case OPT_COL_HELP:
+						case OPT_COL_INVERS_BG:
+						case OPT_COL_INVERS_FG:
+						case OPT_COL_MESSAGE:
+						case OPT_COL_MINIHELP:
+						case OPT_COL_NEWSHEADERS:
+						case OPT_COL_NORMAL:
+						case OPT_COL_QUOTE:
+						case OPT_COL_QUOTE2:
+						case OPT_COL_QUOTE3:
+						case OPT_COL_RESPONSE:
+						case OPT_COL_SIGNATURE:
+						case OPT_COL_SUBJECT:
+						case OPT_COL_TEXT:
+						case OPT_COL_TITLE:
+						case OPT_COL_MARKSTAR:
+						case OPT_COL_MARKDASH:
+						case OPT_COL_MARKSLASH:
+						case OPT_COL_MARKSTROKE:
+						case OPT_COL_URLS:
+#endif /* HAVE_COLOR */
+						case OPT_HIDE_UUE:
+						case OPT_INTERACTIVE_MAILER:
+						case OPT_WORD_H_DISPLAY_MARKS:
+						case OPT_MONO_MARKSTAR:
+						case OPT_MONO_MARKDASH:
+						case OPT_MONO_MARKSLASH:
+						case OPT_MONO_MARKSTROKE:
+						case OPT_CONFIRM_CHOICE:
+						case OPT_KILL_LEVEL:
+						case OPT_MAILBOX_FORMAT:
+						case OPT_SHOW_INFO:
+						case OPT_SORT_ARTICLE_TYPE:
+						case OPT_STRIP_BOGUS:
+#ifdef HAVE_UNICODE_NORMALIZATION
+						case OPT_NORMALIZATION_FORM:
+#endif /* HAVE_UNICODE_NORMALIZATION */
+						case OPT_QUOTE_STYLE:
+						case OPT_WILDCARD:
+							prompt_option_list(option);
+							break;
+
+						case OPT_THREAD_ARTICLES:
+							/*
+							 * If the threading strategy has changed, fix things
+							 * so that rethreading will occur
+							 */
+							if (prompt_option_list(option) && group != NULL) {
+								int n, old_base_art = base[grpmenu.curr];
+
+								group->attribute->thread_arts = tinrc.thread_articles;
+								make_threads(group, TRUE);
+								/* in non-empty groups update cursor position */
+								if (grpmenu.max > 0) {
+									if ((n = which_thread(old_base_art)) >= 0)
+										grpmenu.curr = n;
+								}
+							}
+							set_last_option_on_screen(first_option_on_screen);
+							redraw_screen(option);
+							clear_message();
+							break;
+
+						case OPT_SORT_THREADS_TYPE:
+							/*
+							 * If the sorting strategy of threads has changed, fix things
+							 * so that resorting will occur
+							 */
+							if (prompt_option_list(option) && group != NULL) {
+								group->attribute->sort_threads_type = tinrc.sort_threads_type;
+								make_threads(group, TRUE);
+							}
+							clear_message();
+							break;
+
+						case OPT_THREAD_SCORE:
+							/*
+							 * If the scoring of a thread has changed,
+							 * resort base[]
+							 */
+							if (prompt_option_list(option) && group != NULL)
+								find_base(group);
+							clear_message();
+							break;
+
+						case OPT_POST_PROCESS:
+							prompt_option_list(option);
+							glob_attributes.post_proc_type = tinrc.post_process;
+							if (group != NULL)
+								group->attribute->post_proc_type = tinrc.post_process;
+							break;
+
+						case OPT_SHOW_AUTHOR:
+							prompt_option_list(option);
+							if (group != NULL)
+								group->attribute->show_author = tinrc.show_author;
+							break;
+
+						case OPT_MAIL_MIME_ENCODING:
+						case OPT_POST_MIME_ENCODING:
+							prompt_option_list(option);
+							mime_encoding = *(option_table[option].variable);
+							/* do not use 8 bit headers if mime encoding is not 8bit */
+							if (strcasecmp(txt_mime_encodings[mime_encoding], txt_8bit)) {
+								if (option == (int) OPT_POST_MIME_ENCODING) {
+									tinrc.post_8bit_header = FALSE;
+									repaint_option(OPT_POST_8BIT_HEADER);
+								} else {
+									tinrc.mail_8bit_header = FALSE;
+									repaint_option(OPT_MAIL_8BIT_HEADER);
+								}
+							}
+							break;
+
+#ifdef CHARSET_CONVERSION
+						case OPT_MM_NETWORK_CHARSET:
+							if (prompt_option_list(option)) {
+								glob_attributes.mm_network_charset = tinrc.mm_network_charset;
+								if (group)
+									group->attribute->mm_network_charset = tinrc.mm_network_charset;
+#	ifdef NO_LOCALE
+								strcpy(tinrc.mm_local_charset, txt_mime_charsets[tinrc.mm_network_charset]);
+#	endif /* NO_LOCALE */
+							}
+							/*
+							 * check if we have selected a 7bit charset, otherwise
+							 * update encoding
+							 * we always do this (even if we did not change the
+							 * charset) to fixup flaws in the tinrc - once we do
+							 * the same while reading the tinrc this can go into
+							 * the != original_list_value case.
+							 */
+							{
+								int i;
+								t_bool change;
+
+								if (!strcasecmp(txt_mime_encodings[tinrc.post_mime_encoding], txt_7bit)) {
+									change = TRUE;
+									for (i = 0; *txt_mime_7bit_charsets[i]; i++) {
+										if (!strcasecmp(txt_mime_charsets[tinrc.mm_network_charset], txt_mime_7bit_charsets[i])) {
+											change = FALSE;
+											break;
+										}
+									}
+									if (change) {
+										tinrc.post_mime_encoding = MIME_ENCODING_8BIT;
+										repaint_option(OPT_POST_MIME_ENCODING);
+									}
+								} else { /* and vice versa, if we have a 7bit chaset but a !7bit encoding, fix that */
+									for (i = 0; *txt_mime_7bit_charsets[i]; i++) {
+										if (!strcasecmp(txt_mime_charsets[tinrc.mm_network_charset], txt_mime_7bit_charsets[i])) {
+											tinrc.mail_mime_encoding = tinrc.post_mime_encoding = MIME_ENCODING_7BIT;
+											tinrc.mail_8bit_header = tinrc.post_8bit_header = FALSE;
+											repaint_option(OPT_POST_MIME_ENCODING);
+											repaint_option(OPT_MAIL_MIME_ENCODING);
+											repaint_option(OPT_POST_8BIT_HEADER);
+											break;
+										}
+									}
+								}
+
+								if (!strcasecmp(txt_mime_encodings[tinrc.mail_mime_encoding], txt_7bit)) {
+									change = TRUE;
+									for (i = 0; *txt_mime_7bit_charsets[i]; i++) {
+										if (!strcasecmp(txt_mime_charsets[tinrc.mm_network_charset], txt_mime_7bit_charsets[i])) {
+											change = FALSE;
+											break;
+										}
+									}
+									if (change) {
+										tinrc.mail_mime_encoding = MIME_ENCODING_QP;
+										repaint_option(OPT_MAIL_MIME_ENCODING);
+									}
+								} else { /* and vice versa, if we have a 7bit chaset but a !7bit encoding, fix that */
+									for (i = 0; *txt_mime_7bit_charsets[i]; i++) {
+										if (!strcasecmp(txt_mime_charsets[tinrc.mm_network_charset], txt_mime_7bit_charsets[i])) {
+											tinrc.mail_mime_encoding = tinrc.post_mime_encoding = MIME_ENCODING_7BIT;
+											tinrc.mail_8bit_header = tinrc.post_8bit_header = FALSE;
+											repaint_option(OPT_POST_MIME_ENCODING);
+											repaint_option(OPT_MAIL_MIME_ENCODING);
+											repaint_option(OPT_POST_8BIT_HEADER);
+											break;
+										}
+									}
+								}
+							}
+							break;
+#endif /* CHARSET_CONVERSION */
+
+						default:
+							break;
+					} /* switch (option) */
+					break;
+
+				case OPT_STRING:
+					switch (option) {
+						case OPT_EDITOR_FORMAT:
+						case OPT_INEWS_PROG:
+						case OPT_MAILER_FORMAT:
+						case OPT_MAIL_ADDRESS:
+						case OPT_MAIL_QUOTE_FORMAT:
+						case OPT_METAMAIL_PROG:
+#ifndef CHARSET_CONVERSION
+						case OPT_MM_CHARSET:
+#endif /* !CHARSET_CONVERSION */
+						case OPT_NEWS_QUOTE_FORMAT:
+						case OPT_QUOTE_CHARS:
+						case OPT_SPAMTRAP_WARNING_ADDRESSES:
+						case OPT_URL_HANDLER:
+						case OPT_XPOST_QUOTE_FORMAT:
+							prompt_option_string(option);
+							break;
+
+						case OPT_NEWS_HEADERS_TO_DISPLAY:
+							prompt_option_string(option);
+							if (news_headers_to_display_array)
+								FreeIfNeeded(*news_headers_to_display_array);
+							FreeIfNeeded(news_headers_to_display_array);
+							news_headers_to_display_array = ulBuildArgv(tinrc.news_headers_to_display, &num_headers_to_display);
+							break;
+
+						case OPT_NEWS_HEADERS_TO_NOT_DISPLAY:
+							prompt_option_string(option);
+							if (news_headers_to_not_display_array)
+								FreeIfNeeded(*news_headers_to_not_display_array);
+							FreeIfNeeded(news_headers_to_not_display_array);
+							news_headers_to_not_display_array = ulBuildArgv(tinrc.news_headers_to_not_display, &num_headers_to_not_display);
+							break;
+
+#ifndef DISABLE_PRINTING
+						case OPT_PRINTER:
+#endif /* !DISABLE_PRINTING */
+						case OPT_MAILDIR:
+						case OPT_SAVEDIR:
+						case OPT_SIGFILE:
+						case OPT_POSTED_ARTICLES_FILE:
+							if (prompt_option_string(option)) {
+								char buf[PATH_LEN];
+
+								strfpath(tinrc.posted_articles_file, buf, sizeof(buf), &CURR_GROUP);
+								STRCPY(tinrc.posted_articles_file, buf);
+							}
+							break;
+
+#ifdef HAVE_COLOR
+						case OPT_QUOTE_REGEX:
+							prompt_option_string(option);
+							FreeIfNeeded(quote_regex.re);
+							FreeIfNeeded(quote_regex.extra);
+							if (!strlen(tinrc.quote_regex))
+								STRCPY(tinrc.quote_regex, DEFAULT_QUOTE_REGEX);
+							compile_regex(tinrc.quote_regex, &quote_regex, PCRE_CASELESS);
+							break;
+
+						case OPT_QUOTE_REGEX2:
+							prompt_option_string(option);
+							FreeIfNeeded(quote_regex2.re);
+							FreeIfNeeded(quote_regex2.extra);
+							if (!strlen(tinrc.quote_regex2))
+								STRCPY(tinrc.quote_regex2, DEFAULT_QUOTE_REGEX2);
+							compile_regex(tinrc.quote_regex2, &quote_regex2, PCRE_CASELESS);
+							break;
+
+						case OPT_QUOTE_REGEX3:
+							prompt_option_string(option);
+							FreeIfNeeded(quote_regex3.re);
+							FreeIfNeeded(quote_regex3.extra);
+							if (!strlen(tinrc.quote_regex3))
+								STRCPY(tinrc.quote_regex3, DEFAULT_QUOTE_REGEX3);
+							compile_regex(tinrc.quote_regex3, &quote_regex3, PCRE_CASELESS);
+							break;
+#endif /* HAVE_COLOR */
+
+						case OPT_SLASHES_REGEX:
+							prompt_option_string(option);
+							FreeIfNeeded(slashes_regex.re);
+							FreeIfNeeded(slashes_regex.extra);
+							if (!strlen(tinrc.slashes_regex))
+								STRCPY(tinrc.slashes_regex, DEFAULT_SLASHES_REGEX);
+							compile_regex(tinrc.slashes_regex, &slashes_regex, PCRE_CASELESS);
+							break;
+
+						case OPT_STARS_REGEX:
+							prompt_option_string(option);
+							FreeIfNeeded(stars_regex.re);
+							FreeIfNeeded(stars_regex.extra);
+							if (!strlen(tinrc.stars_regex))
+								STRCPY(tinrc.stars_regex, DEFAULT_STARS_REGEX);
+							compile_regex(tinrc.stars_regex, &stars_regex, PCRE_CASELESS);
+							break;
+
+						case OPT_STROKES_REGEX:
+							prompt_option_string(option);
+							FreeIfNeeded(strokes_regex.re);
+							FreeIfNeeded(strokes_regex.extra);
+							if (!strlen(tinrc.strokes_regex))
+								STRCPY(tinrc.strokes_regex, DEFAULT_STROKES_REGEX);
+							compile_regex(tinrc.strokes_regex, &strokes_regex, PCRE_CASELESS);
+							break;
+
+						case OPT_UNDERSCORES_REGEX:
+							prompt_option_string(option);
+							FreeIfNeeded(underscores_regex.re);
+							FreeIfNeeded(underscores_regex.extra);
+							if (!strlen(tinrc.underscores_regex))
+								STRCPY(tinrc.underscores_regex, DEFAULT_UNDERSCORES_REGEX);
+							compile_regex(tinrc.underscores_regex, &underscores_regex, PCRE_CASELESS);
+							break;
+
+						case OPT_STRIP_RE_REGEX:
+							prompt_option_string(option);
+							FreeIfNeeded(strip_re_regex.re);
+							FreeIfNeeded(strip_re_regex.extra);
+							if (!strlen(tinrc.strip_re_regex))
+								STRCPY(tinrc.strip_re_regex, DEFAULT_STRIP_RE_REGEX);
+							compile_regex(tinrc.strip_re_regex, &strip_re_regex, PCRE_ANCHORED);
+							break;
+
+						case OPT_STRIP_WAS_REGEX:
+							prompt_option_string(option);
+							FreeIfNeeded(strip_was_regex.re);
+							FreeIfNeeded(strip_was_regex.extra);
+							if (!strlen(tinrc.strip_was_regex)) {
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+								if (IS_LOCAL_CHARSET("UTF-8")) {
+#	if (defined(PCRE_MAJOR) && PCRE_MAJOR >= 4)
+									int i;
+
+									pcre_config(PCRE_CONFIG_UTF8, &i);
+									if (i)
+										STRCPY(tinrc.strip_was_regex, DEFAULT_U8_STRIP_WAS_REGEX);
+									else
+#	endif /* PCRE_MAJOR && PCRE_MAJOR >= 4 */
+										STRCPY(tinrc.strip_was_regex, DEFAULT_STRIP_WAS_REGEX);
+								} else
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+									STRCPY(tinrc.strip_was_regex, DEFAULT_STRIP_WAS_REGEX);
+							}
+							compile_regex(tinrc.strip_was_regex, &strip_was_regex, 0);
+							break;
+
+						case OPT_DATE_FORMAT:
+							prompt_option_string(option);
+							if (!strlen(tinrc.date_format)) {
+								STRCPY(tinrc.date_format, DEFAULT_DATE_FORMAT);
+							}
+							break;
+
+						default:
+							break;
+					} /* switch (option) */
+
+					break;
+
+				case OPT_NUM:
+					switch (option) {
+						case OPT_GETART_LIMIT:
+						case OPT_SCROLL_LINES:
+							prompt_option_num(option);
+							break;
+
+						case OPT_REREAD_ACTIVE_FILE_SECS:
+							prompt_option_num(option);
+							if (tinrc.reread_active_file_secs < 0)
+								tinrc.reread_active_file_secs = 0;
+							break;
+
+						case OPT_RECENT_TIME:
+							prompt_option_num(option);
+							if (tinrc.recent_time < 0)
+								tinrc.recent_time = 0;
+							break;
+
+						case OPT_GROUPNAME_MAX_LENGTH:
+							prompt_option_num(option);
+							if (tinrc.groupname_max_length < 0)
+								tinrc.groupname_max_length = 0;
+							break;
+
+						case OPT_FILTER_DAYS:
+							prompt_option_num(option);
+							if (tinrc.filter_days <= 0)
+								tinrc.filter_days = 1;
+							break;
+
+						case OPT_SCORE_LIMIT_KILL:
+						case OPT_SCORE_KILL:
+						case OPT_SCORE_LIMIT_SELECT:
+						case OPT_SCORE_SELECT:
+							prompt_option_num(option);
+							check_score_defaults();
+							if (group != NULL) {
+								unfilter_articles();
+								read_filter_file(filter_file);
+								if (filter_articles(group))
+									make_threads(group, FALSE);
+							}
+							redraw_screen(option);
+							break;
+
+						case OPT_THREAD_PERC:
+							prompt_option_num(option);
+							if (tinrc.thread_perc < 0 || tinrc.thread_perc > 100)
+								tinrc.thread_perc = THREAD_PERC_DEFAULT;
+							break;
+
+						case OPT_WRAP_COLUMN:
+							prompt_option_num(option);
+							/* recook if in an article is open */
+							if (pgart.raw)
+								resize_article(TRUE, &pgart);
+							break;
+
+						default:
+							break;
+					} /* switch (option) */
+					break;
+
+				case OPT_CHAR:
+					switch (option) {
+						/*
+						 * TODO: do DASH_TO_SPACE/SPACE_TO_DASH conversion here?
+						 */
+						case OPT_ART_MARKED_DELETED:
+						case OPT_ART_MARKED_INRANGE:
+						case OPT_ART_MARKED_RETURN:
+						case OPT_ART_MARKED_SELECTED:
+						case OPT_ART_MARKED_RECENT:
+						case OPT_ART_MARKED_UNREAD:
+						case OPT_ART_MARKED_READ:
+						case OPT_ART_MARKED_KILLED:
+						case OPT_ART_MARKED_READ_SELECTED:
+							prompt_option_char(option);
+							break;
+
+						default:
+							break;
+					} /* switch (option) */
+					break;
+
+				default:
+					break;
+			} /* switch (option_table[option].var_type) */
+			change_option = FALSE;
+			show_menu_help(txt_select_config_file_option);
+			repaint_option(option);
+			highlight_option(option);
+		} /* if (change_option) */
+	} /* forever */
+	/* NOTREACHED */
+	return ret_code;
+}
diff -Nurp tin-1.6.2/src/page.c tin-1.8.0/src/page.c
--- tin-1.6.2/src/page.c	2003-08-24 02:43:09.000000000 +0200
+++ tin-1.8.0/src/page.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : page.c
  *  Author    : I. Lea & R. Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 2003-08-24
+ *  Updated   : 2005-10-19
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,14 +41,15 @@
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
-#ifndef RFC2046_H
-#	include "rfc2046.h"
-#endif /* !RFC2046_H */
 
 
+#if defined(HAVE_IDNA_H) && !defined(_IDNA_H)
+#	include <idna.h>
+#endif /* HAVE_IDNA_H && !_IDNA_H */
+#if defined(HAVE_STRINGPREP_H) && !defined(_STRINGPREP_H)
+#	include <stringprep.h>
+#endif /* HAVE_STRINGPREP_H & !_STRINGPREP_H */
+
 /*
  * PAGE_HEADER is the size in lines of the article page header
  * ARTLINES is the number of lines available to display actual article text.
@@ -68,14 +69,9 @@ t_openartinfo pgart =	/* Global context 
 		NULL, NULL, NULL, NULL,
 	};
 
-int MORE_POS;			/* set in set_win_size() */
-int RIGHT_POS;			/* set in set_win_size() */
-
 int last_resp;			/* previous & current article # in arts[] for '-' command */
 int this_resp;
 
-static int tabwidth = 8;
-
 static struct t_header *note_h = &pgart.hdr;	/* Easy access to article headers */
 
 static FILE *info_file;
@@ -85,6 +81,7 @@ static int hide_uue;			/* set when uuenc
 static int num_info_lines;
 static int reveal_ctrl_l_lines;	/* number of lines (from top) with de-activated ^L */
 static int rotate;				/* 0=normal, 13=rot13 decode */
+static int tabwidth = 8;
 static int scroll_region_top;	/* first screen line for displayed message */
 static int search_line;			/* Line to commence next search from */
 static t_lineinfo *infoline = (t_lineinfo *) 0;
@@ -95,12 +92,14 @@ static t_bool reveal_ctrl_l;	/* set when
 /*
  * Local prototypes
  */
-static int handle_pager_keypad(t_menukeys *menukeys);
 static int load_article(int new_respnum, struct t_group *group);
 static int prompt_response(int ch, int curr_respnum);
 static int scroll_page(int dir);
 static t_bool deactivate_next_ctrl_l(void);
 static t_bool activate_last_ctrl_l(void);
+static t_function page_left(void);
+static t_function page_right(void);
+static t_function page_mouse_action(t_function (*left_action) (void), t_function (*right_action) (void));
 static void draw_page_header(const char *group);
 static void preprocess_info_message(FILE *info_fh);
 static void print_message_page(FILE *file, t_lineinfo *messageline, size_t messagelines, size_t base_line, size_t begin, size_t end, int help_level);
@@ -175,85 +174,52 @@ scroll_page(
 /*
  * Map keypad codes to standard keyboard characters
  */
-static int
-handle_pager_keypad(
-	t_menukeys *menukeys)
+static t_function
+page_left(
+	void)
 {
-	int ch = ReadCh();
-
-	switch (ch) {
-		case ESC:
-#	ifdef HAVE_KEY_PREFIX
-		case KEY_PREFIX:
-#	endif /* HAVE_KEY_PREFIX */
-			switch (get_arrow_key(ch)) {
-				case KEYMAP_UP:
-					ch = iKeyUp;
-					break;
-
-				case KEYMAP_DOWN:
-					ch = iKeyDown;
-					break;
-
-				case KEYMAP_LEFT:
-					ch = iKeyQuit;
-					break;
-
-				case KEYMAP_RIGHT:
-					ch = iKeyPageNextUnread;
-					break;
+	return GLOBAL_QUIT;
+}
 
-				case KEYMAP_PAGE_UP:
-					ch = iKeyPageUp;
-					break;
 
-				case KEYMAP_PAGE_DOWN:
-					ch = iKeyPageDown;
-					break;
+static t_function
+page_right(
+	void)
+{
+	return PAGE_NEXT_UNREAD;
+}
 
-				case KEYMAP_HOME:
-					ch = iKeyFirstPage;
-					break;
 
-				case KEYMAP_END:
-					ch = iKeyLastPage;
-					break;
+static t_function
+page_mouse_action(
+	t_function (*left_action) (void),
+	t_function (*right_action) (void))
+{
+	t_function func = NOT_ASSIGNED;
 
-				case KEYMAP_MOUSE:
-					switch (xmouse) {
-						case MOUSE_BUTTON_1:
-							if (xrow < PAGE_HEADER || xrow >= cLINES - 1)
-								ch = iKeyPageDown;
-							else
-								ch = iKeyPageNextUnread;
-							break;
-
-						case MOUSE_BUTTON_2:
-							if (xrow < PAGE_HEADER || xrow >= cLINES - 1)
-								ch = iKeyPageUp;
-							else
-								ch = iKeyQuit;
-							break;
-
-						case MOUSE_BUTTON_3:
-							ch = iKeyMouseToggle;
-							break;
+	switch (xmouse) {
+		case MOUSE_BUTTON_1:
+			if (xrow < PAGE_HEADER || xrow >= cLINES - 1)
+				func = GLOBAL_PAGE_DOWN;
+			else
+				func = right_action();
+			break;
 
-						default:
-							break;
-					}
-					break;
+		case MOUSE_BUTTON_2:
+			if (xrow < PAGE_HEADER || xrow >= cLINES - 1)
+				func = GLOBAL_PAGE_UP;
+			else
+				func = left_action();
+			break;
 
-				default:
-					break;
-			}
+		case MOUSE_BUTTON_3:
+			func = SPECIAL_MOUSE_TOGGLE;
 			break;
 
 		default:
-			ch = map_to_default(ch, menukeys);
 			break;
 	}
-	return ch;
+	return func;
 }
 
 
@@ -333,12 +299,13 @@ show_page(
 {
 	char buf[LEN];
 	char key[MAXKEYLEN];
-	int ch, i, n = 0;
+	int i, n = 0;
 	int filter_state = NO_FILTERING;
 	int old_sort_art_type = tinrc.sort_article_type;
 	int art_type = GROUP_TYPE_NEWS;
 	t_bool mouse_click_on = TRUE;
-	t_bool repeat_search = FALSE;
+	t_bool repeat_search;
+	t_function func;
 
 	filtered_articles = FALSE;	/* used in thread level */
 
@@ -361,23 +328,30 @@ show_page(
 	resize_article(TRUE, &pgart);
 
 	forever {
-		if ((ch = handle_pager_keypad(&menukeymap.page_nav)) == iKeySearchRepeat) {
-			ch = i_key_search_last;
+		if ((func = handle_keypad(page_left, page_right, page_mouse_action, page_keys)) == GLOBAL_SEARCH_REPEAT) {
+			func = last_search;
 			repeat_search = TRUE;
-		}
-		else
+		} else
 			repeat_search = FALSE;
 
-		switch (ch) {
-			case iKeyAbort:       /* Abort */
+		switch (func) {
+			case GLOBAL_ABORT:       /* Abort */
 				break;
 
-			case '0': case '1': case '2': case '3': case '4': case '5':
-			case '6': case '7': case '8': case '9':
+			case DIGIT_0:
+			case DIGIT_1:
+			case DIGIT_2:
+			case DIGIT_3:
+			case DIGIT_4:
+			case DIGIT_5:
+			case DIGIT_6:
+			case DIGIT_7:
+			case DIGIT_8:
+			case DIGIT_9:
 				if (!HAS_FOLLOWUPS(which_thread(this_resp)))
 					info_message(_(txt_no_responses));
 				else {
-					if ((n = prompt_response(ch, this_resp)) != -1) {
+					if ((n = prompt_response(func_to_key(func, page_keys), this_resp)) != -1) {
 						XFACE_CLEAR();
 						if ((i = load_article(n, group)) < 0)
 							return i;
@@ -386,14 +360,14 @@ show_page(
 				break;
 
 #ifndef NO_SHELL_ESCAPE
-			case iKeyShellEscape:
+			case GLOBAL_SHELL_ESCAPE:
 				XFACE_CLEAR();
 				shell_escape();
 				draw_page(group->name, 0);
 				break;
 #endif /* !NO_SHELL_ESCAPE */
 
-			case iKeyMouseToggle:
+			case SPECIAL_MOUSE_TOGGLE:
 				if (mouse_click_on)
 					set_xclick_off();
 				else
@@ -401,9 +375,7 @@ show_page(
 				mouse_click_on = bool_not(mouse_click_on);
 				break;
 
-			case iKeyPageUp:		/* page up */
-			case iKeyPageUp2:
-			case iKeyPageUp3:
+			case GLOBAL_PAGE_UP:
 				if (activate_last_ctrl_l())
 					draw_page(group->name, 0);
 				else {
@@ -416,32 +388,33 @@ show_page(
 				}
 				break;
 
-			case iKeyPageDown:		/* page down or next response */
-			case iKeyPageDown2:
-			case iKeyPageDown3:
-			case iKeyPageNextUnread:
-				if (!((ch == iKeyPageNextUnread) && tinrc.tab_goto_next_unread) && deactivate_next_ctrl_l())
+			case GLOBAL_PAGE_DOWN:		/* page down or next response */
+			case PAGE_NEXT_UNREAD:
+			case PAGE_PAGE_DOWN3:
+				if (!((func == PAGE_NEXT_UNREAD) && tinrc.tab_goto_next_unread) && deactivate_next_ctrl_l())
 					draw_page(group->name, 0);
 				else {
 					if (curr_line + ARTLINES >= artlines) {	/* End is already on screen */
-						switch (ch) {
-							case iKeyPageNextUnread:	/* <TAB> */
+						switch (func) {
+							case PAGE_NEXT_UNREAD:	/* <TAB> */
 								goto page_goto_next_unread;
 
-							case iKeyPageDown:
-							case iKeyPageDown2:
+							case GLOBAL_PAGE_DOWN:
 								if (tinrc.pgdn_goto_next)
 									goto page_goto_next_unread;
 								break;
 
-							case iKeyPageDown3:			/* <SPACE> */
+							case PAGE_PAGE_DOWN3:			/* <SPACE> */
 								if (tinrc.space_goto_next_unread)
 									goto page_goto_next_unread;
 								break;
+
+							default:		/* to keep gcc quiet */
+								break;
 						}
 						info_message(_(txt_end_of_art));
 					} else {
-						if ((ch == iKeyPageNextUnread) && tinrc.tab_goto_next_unread)
+						if ((func == PAGE_NEXT_UNREAD) && tinrc.tab_goto_next_unread)
 							goto page_goto_next_unread;
 
 						curr_line += (tinrc.scroll_lines == -2) ? ARTLINES / 2 : ARTLINES;
@@ -461,8 +434,7 @@ page_goto_next_unread:
 					return i;
 				break;
 
-			case iKeyFirstPage:		/* beginning of article */
-			case iKeyPageFirstPage:
+			case GLOBAL_FIRST_PAGE:		/* beginning of article */
 				if (reveal_ctrl_l_lines > -1 || curr_line != 0) {
 					reveal_ctrl_l_lines = -1;
 					curr_line = 0;
@@ -470,8 +442,7 @@ page_goto_next_unread:
 				}
 				break;
 
-			case iKeyLastPage:		/* end of article */
-			case iKeyPageLastPage:
+			case GLOBAL_LAST_PAGE:		/* end of article */
 				if (reveal_ctrl_l_lines < artlines - 1 || curr_line + ARTLINES != artlines) {
 					reveal_ctrl_l_lines = artlines - 1;
 					/* Display a full last page for neatness */
@@ -480,8 +451,7 @@ page_goto_next_unread:
 				}
 				break;
 
-			case iKeyUp:		/* line up */
-			case iKeyUp2:
+			case GLOBAL_LINE_UP:
 				if (activate_last_ctrl_l())
 					draw_page(group->name, 0);
 				else {
@@ -496,8 +466,7 @@ page_goto_next_unread:
 				}
 				break;
 
-			case iKeyDown:		/* line down */
-			case iKeyDown2:
+			case GLOBAL_LINE_DOWN:
 				if (deactivate_next_ctrl_l())
 					draw_page(group->name, 0);
 				else {
@@ -512,7 +481,7 @@ page_goto_next_unread:
 				}
 				break;
 
-			case iKeyLastViewed:	/* show last viewed article */
+			case GLOBAL_LAST_VIEWED:	/* show last viewed article */
 				if (last_resp < 0 || (which_thread(last_resp) == -1)) {
 					info_message(_(txt_no_last_message));
 					break;
@@ -523,7 +492,7 @@ page_goto_next_unread:
 				}
 				break;
 
-			case iKeyLookupMessage:			/* Goto article by Message-ID */
+			case GLOBAL_LOOKUP_MESSAGEID:			/* Goto article by Message-ID */
 				if ((n = prompt_msgid()) != ART_UNAVAILABLE) {
 					if ((i = load_article(n, group)) < 0) {
 						XFACE_CLEAR();
@@ -532,7 +501,7 @@ page_goto_next_unread:
 				}
 				break;
 
-			case iKeyPageGotoParent:		/* Goto parent of this article */
+			case PAGE_GOTO_PARENT:		/* Goto parent of this article */
 			{
 				struct t_msgid *parent = arts[this_resp].refptr->parent;
 
@@ -559,39 +528,39 @@ page_goto_next_unread:
 				break;
 			}
 
-			case iKeyPipe:		/* pipe article/thread/tagged arts to command */
+			case GLOBAL_PIPE:		/* pipe article/thread/tagged arts to command */
 				XFACE_SUPPRESS();
 				feed_articles(FEED_PIPE, PAGE_LEVEL, group, this_resp);
 				XFACE_SHOW();
 				break;
 
-			case iKeyPageMail:	/* mail article/thread/tagged articles to somebody */
+			case PAGE_MAIL:	/* mail article/thread/tagged articles to somebody */
 				XFACE_SUPPRESS();
 				feed_articles(FEED_MAIL, PAGE_LEVEL, group, this_resp);
 				XFACE_SHOW();
 				break;
 
 #ifndef DISABLE_PRINTING
-			case iKeyPrint:	/* output art/thread/tagged arts to printer */
+			case GLOBAL_PRINT:	/* output art/thread/tagged arts to printer */
 				XFACE_SUPPRESS();
 				feed_articles(FEED_PRINT, PAGE_LEVEL, group, this_resp);
 				XFACE_SHOW();
 				break;
 #endif /* !DISABLE_PRINTING */
 
-			case iKeyPageRepost:	/* repost current article */
+			case PAGE_REPOST:	/* repost current article */
 				XFACE_SUPPRESS();
 				feed_articles(FEED_REPOST, PAGE_LEVEL, group, this_resp);
 				XFACE_SHOW();
 				break;
 
-			case iKeyPageSave:	/* save article/thread/tagged articles */
+			case PAGE_SAVE:	/* save article/thread/tagged articles */
 				XFACE_SUPPRESS();
 				feed_articles(FEED_SAVE, PAGE_LEVEL, group, this_resp);
 				XFACE_SHOW();
 				break;
 
-			case iKeyPageAutoSave:	/* Auto-save articles without prompting */
+			case PAGE_AUTOSAVE:	/* Auto-save articles without prompting */
 				if (grpmenu.curr >= 0) {
 					XFACE_SUPPRESS();
 					feed_articles(FEED_AUTOSAVE, PAGE_LEVEL, group, (int) base[grpmenu.curr]);
@@ -599,19 +568,19 @@ page_goto_next_unread:
 				}
 				break;
 
-			case iKeySearchSubjF:	/* search in article */
-			case iKeySearchSubjB:
-				if ((i = search_article((ch == iKeySearchSubjF), repeat_search, search_line, artlines, artline, reveal_ctrl_l_lines, note_fp)) == -1)
+			case GLOBAL_SEARCH_SUBJECT_FORWARD:	/* search in article */
+			case GLOBAL_SEARCH_SUBJECT_BACKWARD:
+				if ((i = search_article((func == GLOBAL_SEARCH_SUBJECT_FORWARD), repeat_search, search_line, artlines, artline, reveal_ctrl_l_lines, note_fp)) == -1)
 					break;
 
-				if (ch == iKeySearchSubjB && !reveal_ctrl_l) {
+				if (func == GLOBAL_SEARCH_SUBJECT_BACKWARD && !reveal_ctrl_l) {
 					reveal_ctrl_l_lines = curr_line + ARTLINES - 1;
 					draw_page(group->name, 0);
 				}
 				process_search(&curr_line, artlines, ARTLINES, PAGE_LEVEL);
 				break;
 
-			case iKeySearchBody:	/* article body search */
+			case GLOBAL_SEARCH_BODY:	/* article body search */
 				if ((n = search_body(group, this_resp, repeat_search)) != -1) {
 					this_resp = n;			/* Stop load_article() changing context again */
 					if ((i = load_article(n, group)) < 0) {
@@ -622,7 +591,7 @@ page_goto_next_unread:
 				}
 				break;
 
-			case iKeyPageTopThd:	/* first article in current thread */
+			case PAGE_TOP_THREAD:	/* first article in current thread */
 				if (arts[this_resp].prev >= 0) {
 					if ((n = which_thread(this_resp)) >= 0 && base[n] != this_resp) {
 						assert(n < grpmenu.max);
@@ -634,7 +603,7 @@ page_goto_next_unread:
 				}
 				break;
 
-			case iKeyPageBotThd:	/* last article in current thread */
+			case PAGE_BOTTOM_THREAD:	/* last article in current thread */
 				for (i = this_resp; i >= 0; i = arts[i].thread)
 					n = i;
 
@@ -646,8 +615,7 @@ page_goto_next_unread:
 				}
 				break;
 
-			case iKeyPageNextThd:
-			case iKeyPageNextThd2:	/* start of next thread */
+			case PAGE_NEXT_THREAD:	/* start of next thread */
 				XFACE_CLEAR();
 				if ((n = next_thread(this_resp)) == -1)
 					return (which_thread(this_resp));
@@ -656,7 +624,7 @@ page_goto_next_unread:
 				break;
 
 #ifdef HAVE_PGP_GPG
-			case iKeyPagePGPCheckArticle:
+			case PAGE_PGP_CHECK_ARTICLE:
 				XFACE_SUPPRESS();
 				if (pgp_check_article(&pgart))
 					draw_page(group->name, 0);
@@ -664,28 +632,30 @@ page_goto_next_unread:
 				break;
 #endif /* HAVE_PGP_GPG */
 
-			case iKeyPageToggleHeaders:	/* toggle display of whole 'raw' article */
+			case PAGE_TOGGLE_HEADERS:	/* toggle display of whole 'raw' article */
 				XFACE_CLEAR();
 				toggle_raw(group);
 				break;
 
-			case iKeyPageToggleTex2iso:		/* toggle german TeX to ISO latin1 style conversion */
+			case PAGE_TOGGLE_TEX2ISO:		/* toggle german TeX to ISO latin1 style conversion */
 				if (((group->attribute->tex2iso_conv) = !(group->attribute->tex2iso_conv)))
 					pgart.tex2iso = is_art_tex_encoded(pgart.raw);
+				else
+					pgart.tex2iso = FALSE;
 
 				resize_article(TRUE, &pgart);	/* Also recooks it.. */
 				draw_page(group->name, 0);
 				info_message(_(txt_toggled_tex2iso), txt_onoff[group->attribute->tex2iso_conv != FALSE ? 1 : 0]);
 				break;
 
-			case iKeyPageToggleTabs:		/* toggle tab stops 8 vs 4 */
+			case PAGE_TOGGLE_TABS:		/* toggle tab stops 8 vs 4 */
 				tabwidth = (tabwidth == 8) ? 4 : 8;
 				resize_article(TRUE, &pgart);	/* Also recooks it.. */
 				draw_page(group->name, 0);
 				info_message(_(txt_toggled_tabwidth), tabwidth);
 				break;
 
-			case iKeyPageToggleUue:			/* toggle display of uuencoded sections */
+			case PAGE_TOGGLE_UUE:			/* toggle display of uuencoded sections */
 				hide_uue = (hide_uue + 1) % (UUE_ALL + 1);
 				resize_article(TRUE, &pgart);	/* Also recooks it.. */
 				/*
@@ -698,7 +668,7 @@ page_goto_next_unread:
 				/* TODO: info_message()? */
 				break;
 
-			case iKeyPageReveal:			/* toggle hiding after ^L */
+			case PAGE_REVEAL:			/* toggle hiding after ^L */
 				reveal_ctrl_l = bool_not(reveal_ctrl_l);
 				if (!reveal_ctrl_l) {	/* switched back to active ^L's */
 					reveal_ctrl_l_lines = -1;
@@ -709,25 +679,25 @@ page_goto_next_unread:
 				/* TODO: info_message()? */
 				break;
 
-			case iKeyPageQuickAutoSel:	/* quickly auto-select article */
-			case iKeyPageQuickKill:		/* quickly kill article */
-				if ((filtered_articles = quick_filter((ch == iKeyPageQuickKill) ? FILTER_KILL : FILTER_SELECT, group, &arts[this_resp])))
+			case GLOBAL_QUICK_FILTER_SELECT:	/* quickly auto-select article */
+			case GLOBAL_QUICK_FILTER_KILL:		/* quickly kill article */
+				if ((filtered_articles = quick_filter(func, group, &arts[this_resp])))
 					goto return_to_index;
 
 				draw_page(group->name, 0);
 				break;
 
-			case iKeyPageAutoSel:		/* auto-select article menu */
-			case iKeyPageAutoKill:		/* kill article menu */
+			case GLOBAL_MENU_FILTER_SELECT:		/* auto-select article menu */
+			case GLOBAL_MENU_FILTER_KILL:			/* kill article menu */
 				XFACE_CLEAR();
-				if (filter_menu((ch == iKeyPageAutoKill) ? FILTER_KILL : FILTER_SELECT, group, &arts[this_resp])) {
+				if (filter_menu(func, group, &arts[this_resp])) {
 					if ((filtered_articles = filter_articles(group)))
 						goto return_to_index;
 				}
 				draw_page(group->name, 0);
 				break;
 
-			case iKeyPageEditFilter:
+			case GLOBAL_EDIT_FILTER:
 				XFACE_CLEAR();
 				if (!invoke_editor(filter_file, FILTER_FILE_OFFSET))
 					break;
@@ -738,20 +708,20 @@ page_goto_next_unread:
 				draw_page(group->name, 0);
 				break;
 
-			case iKeyRedrawScr:		/* redraw current page of article */
+			case GLOBAL_REDRAW_SCREEN:		/* redraw current page of article */
 				my_retouch();
 				draw_page(group->name, 0);
 				break;
 
-			case iKeyPageToggleRot:	/* toggle rot-13 mode */
+			case PAGE_TOGGLE_ROT13:	/* toggle rot-13 mode */
 				rotate = rotate ? 0 : 13;
 				draw_page(group->name, 0);
 				info_message(_(txt_toggled_rot13));
 				break;
 
-			case iKeySearchAuthF:	/* author search forward */
-			case iKeySearchAuthB:	/* author search backward */
-				if ((n = search(SEARCH_AUTH, this_resp, (ch == iKeySearchAuthF), repeat_search)) < 0)
+			case GLOBAL_SEARCH_AUTHOR_FORWARD:	/* author search forward */
+			case GLOBAL_SEARCH_AUTHOR_BACKWARD:	/* author search backward */
+				if ((n = search(func, this_resp, repeat_search)) < 0)
 					break;
 				if ((i = load_article(n, group)) < 0) {
 					XFACE_CLEAR();
@@ -759,26 +729,30 @@ page_goto_next_unread:
 				}
 				break;
 
-			case iKeyPageCatchup:			/* catchup - mark read, goto next */
-			case iKeyPageCatchupNextUnread:	/* goto next unread */
-				snprintf(buf, sizeof(buf), _(txt_mark_thread_read), (ch == iKeyPageCatchupNextUnread) ? _(txt_enter_next_thread) : "");
-				if ((!TINRC_CONFIRM_ACTION) || prompt_yn(cLINES, buf, TRUE) == 1) {
+			case CATCHUP:			/* catchup - mark read, goto next */
+			case CATCHUP_NEXT_UNREAD:	/* goto next unread */
+				/*
+				 * TODO: if (group->attribute->thread_arts == THREAD_NONE)
+				 *       	snprintf(buf, sizeof(buf), _("Mark article as read%s?"), (func == CATCHUP_NEXT_UNREAD) ? _(" and enter next unread article") : "");
+				 *       else
+				 */
+				snprintf(buf, sizeof(buf), _(txt_mark_thread_read), (func == CATCHUP_NEXT_UNREAD) ? _(txt_enter_next_thread) : "");
+				if ((!TINRC_CONFIRM_ACTION) || prompt_yn(buf, TRUE) == 1) {
 					thd_mark_read(group, base[which_thread(this_resp)]);
 					XFACE_CLEAR();
-					return (ch == iKeyPageCatchupNextUnread) ? GRP_NEXTUNREAD : GRP_NEXT;
+					return (func == CATCHUP_NEXT_UNREAD) ? GRP_NEXTUNREAD : GRP_NEXT;
 				}
 				break;
 
-			case iKeyPageMarkThdUnread:
+			case MARK_THREAD_UNREAD:
 				thd_mark_unread(group, base[which_thread(this_resp)]);
-				/*
-				 * FIXME: replace txt_thread by txt_article_upper
-				 * if THREAD_NONE
-				 */
-				info_message(_(txt_marked_as_unread), _(txt_thread_upper));
+				if (group->attribute->thread_arts != THREAD_NONE)
+					info_message(_(txt_marked_as_unread), _(txt_thread_upper));
+				else
+					info_message(_(txt_marked_as_unread), _(txt_article_upper));
 				break;
 
-			case iKeyPageCancel:			/* cancel an article */
+			case PAGE_CANCEL:			/* cancel an article */
 				if (can_post || art_type != GROUP_TYPE_NEWS) {
 					XFACE_SUPPRESS();
 					if (cancel_article(group, &arts[this_resp], this_resp))
@@ -788,39 +762,39 @@ page_goto_next_unread:
 					info_message(_(txt_cannot_post));
 				break;
 
-			case iKeyPageEditArticle:		/* edit an article (mailgroup only) */
+			case PAGE_EDIT_ARTICLE:		/* edit an article (mailgroup only) */
 				XFACE_SUPPRESS();
 				if (art_edit(group, &arts[this_resp]))
 					draw_page(group->name, 0);
 				XFACE_SHOW();
 				break;
 
-			case iKeyPageFollowupQuote:		/* post a followup to this article */
-			case iKeyPageFollowupQuoteHeaders:
-			case iKeyPageFollowup:
+			case PAGE_FOLLOWUP_QUOTE:		/* post a followup to this article */
+			case PAGE_FOLLOWUP_QUOTE_HEADERS:
+			case PAGE_FOLLOWUP:
 				if (!can_post && art_type == GROUP_TYPE_NEWS) {
 					info_message(_(txt_cannot_post));
 					break;
 				}
 				XFACE_CLEAR();
 				(void) post_response(group->name, this_resp,
-				  (ch == iKeyPageFollowupQuote || ch == iKeyPageFollowupQuoteHeaders) ? TRUE : FALSE,
-				  ch == iKeyPageFollowupQuoteHeaders ? TRUE : FALSE, show_all_headers);
+				  (func == PAGE_FOLLOWUP_QUOTE || func == PAGE_FOLLOWUP_QUOTE_HEADERS) ? TRUE : FALSE,
+				  func == PAGE_FOLLOWUP_QUOTE_HEADERS ? TRUE : FALSE, show_all_headers);
 				draw_page(group->name, 0);
 				break;
 
-			case iKeyHelp:	/* help */
+			case GLOBAL_HELP:	/* help */
 				XFACE_CLEAR();
 				show_help_page(PAGE_LEVEL, _(txt_art_pager_com));
 				draw_page(group->name, 0);
 				break;
 
-			case iKeyToggleHelpDisplay:	/* toggle mini help menu */
+			case GLOBAL_TOGGLE_HELP_DISPLAY:	/* toggle mini help menu */
 				toggle_mini_help(PAGE_LEVEL);
 				draw_page(group->name, 0);
 				break;
 
-			case iKeyQuit:	/* return to index page */
+			case GLOBAL_QUIT:	/* return to index page */
 return_to_index:
 				XFACE_CLEAR();
 				if (filter_state == NO_FILTERING && tinrc.sort_article_type != old_sort_art_type)
@@ -840,14 +814,14 @@ return_to_index:
 				}
 				return i;
 
-			case iKeyToggleInverseVideo:	/* toggle inverse video */
+			case GLOBAL_TOGGLE_INVERSE_VIDEO:	/* toggle inverse video */
 				toggle_inverse_video();
 				draw_page(group->name, 0);
 				show_inverse_video_status();
 				break;
 
 #ifdef HAVE_COLOR
-			case iKeyToggleColor:		/* toggle color */
+			case GLOBAL_TOGGLE_COLOR:		/* toggle color */
 				if (toggle_color()) {
 					draw_page(group->name, 0);
 					show_color_status();
@@ -855,20 +829,19 @@ return_to_index:
 				break;
 #endif /* HAVE_COLOR */
 
-			case iKeyPageListThd:	/* -> thread page that this article is in */
+			case PAGE_LIST_THREAD:	/* -> thread page that this article is in */
 				XFACE_CLEAR();
 				fixup_thread(this_resp, FALSE);
 				return GRP_GOTOTHREAD;
 
-			case iKeyOptionMenu:	/* option menu */
+			case GLOBAL_OPTION_MENU:	/* option menu */
 				XFACE_CLEAR();
 				if (change_config_file(group) == FILTERING)
 					filter_state = FILTERING;
-				set_subj_from_size(cCOLS);
 				draw_page(group->name, 0);
 				break;
 
-			case iKeyPageNextArt:	/* skip to next article */
+			case PAGE_NEXT_ARTICLE:	/* skip to next article */
 				XFACE_CLEAR();
 				if ((n = next_response(this_resp)) == -1)
 					return (which_thread(this_resp));
@@ -877,7 +850,7 @@ return_to_index:
 					return i;
 				break;
 
-			case iKeyPageKillThd:	/* mark rest of thread as read */
+			case PAGE_MARK_THREAD_READ:	/* mark rest of thread as read */
 				thd_mark_read(group, this_resp);
 				if ((n = next_unread(next_response(this_resp))) == -1)
 					goto return_to_index;
@@ -887,10 +860,10 @@ return_to_index:
 				}
 				break;
 
-			case iKeyPageNextUnreadArt:	/* next unread article */
+			case PAGE_NEXT_UNREAD_ARTICLE:	/* next unread article */
 				goto page_goto_next_unread;
 
-			case iKeyPagePrevArt:	/* previous article */
+			case PAGE_PREVIOUS_ARTICLE:	/* previous article */
 				XFACE_CLEAR();
 				if ((n = prev_response(this_resp)) == -1)
 					return this_resp;
@@ -899,7 +872,7 @@ return_to_index:
 					return i;
 				break;
 
-			case iKeyPagePrevUnreadArt:	/* previous unread article */
+			case PAGE_PREVIOUS_UNREAD_ARTICLE:	/* previous unread article */
 				if ((n = prev_unread(prev_response(this_resp))) == -1)
 					info_message(_(txt_no_prev_unread_art));
 				else {
@@ -910,23 +883,23 @@ return_to_index:
 				}
 				break;
 
-			case iKeyQuitTin:	/* quit */
+			case GLOBAL_QUIT_TIN:	/* quit */
 				XFACE_CLEAR();
 				return GRP_QUIT;
 
-			case iKeyPageReplyQuote:	/* reply to author through mail */
-			case iKeyPageReplyQuoteHeaders:
-			case iKeyPageReply:
+			case PAGE_REPLY_QUOTE:	/* reply to author through mail */
+			case PAGE_REPLY_QUOTE_HEADERS:
+			case PAGE_REPLY:
 				XFACE_CLEAR();
-				mail_to_author(group->name, this_resp, (ch == iKeyPageReplyQuote || ch == iKeyPageReplyQuoteHeaders) ? TRUE : FALSE, ch == iKeyPageReplyQuoteHeaders ? TRUE : FALSE, show_all_headers);
+				mail_to_author(group->name, this_resp, (func == PAGE_REPLY_QUOTE || func == PAGE_REPLY_QUOTE_HEADERS) ? TRUE : FALSE, func == PAGE_REPLY_QUOTE_HEADERS ? TRUE : FALSE, show_all_headers);
 				draw_page(group->name, 0);
 				break;
 
-			case iKeyPageTag:	/* tag/untag article for saving */
+			case PAGE_TAG:	/* tag/untag article for saving */
 				tag_article(this_resp);
 				break;
 
-			case iKeyPageGroupSel:	/* return to group selection page */
+			case PAGE_GROUP_SELECT:	/* return to group selection page */
 				if (filter_state == FILTERING) {
 					filter_articles(group);
 					make_threads(group, FALSE);
@@ -934,19 +907,18 @@ return_to_index:
 				XFACE_CLEAR();
 				return GRP_RETSELECT;
 
-			case iKeyVersion:
+			case GLOBAL_VERSION:
 				info_message(cvers);
 				break;
 
-			case iKeyPost:	/* post a basenote */
+			case GLOBAL_POST:	/* post a basenote */
 				XFACE_SUPPRESS();
 				if (post_article(group->name))
 					draw_page(group->name, 0);
 				XFACE_SHOW();
 				break;
 
-			case iKeyPostponed:
-			case iKeyPostponed2:	/* post postponed article */
+			case GLOBAL_POSTPONED:	/* post postponed article */
 				if (can_post || art_type != GROUP_TYPE_NEWS) {
 					XFACE_SUPPRESS();
 					if (pickup_postponed_articles(FALSE, FALSE))
@@ -956,19 +928,19 @@ return_to_index:
 					info_message(_(txt_cannot_post));
 				break;
 
-			case iKeyDisplayPostHist:	/* display messages posted by user */
+			case GLOBAL_DISPLAY_POST_HISTORY:	/* display messages posted by user */
 				XFACE_SUPPRESS();
 				if (user_posted_messages())
 					draw_page(group->name, 0);
 				XFACE_SHOW();
 				break;
 
-			case iKeyPageMarkArtUnread:	/* mark article as unread(to return) */
+			case MARK_ARTICLE_UNREAD:	/* mark article as unread(to return) */
 				art_mark(group, &arts[this_resp], ART_WILL_RETURN);
 				info_message(_(txt_marked_as_unread), _(txt_article_upper));
 				break;
 
-			case iKeyPageSkipIncludedText:	/* skip included text */
+			case PAGE_SKIP_INCLUDED_TEXT:	/* skip included text */
 				for (i = curr_line; i < artlines; i++) {
 					if (!(artline[i].flags & (C_QUOTE1 | C_QUOTE2 | C_QUOTE3)))
 						break;
@@ -980,24 +952,24 @@ return_to_index:
 				}
 				break;
 
-			case iKeyToggleInfoLastLine: /* this is _not_ correct, we do not toggle status here */
+			case GLOBAL_TOGGLE_INFO_LAST_LINE: /* this is _not_ correct, we do not toggle status here */
 				info_message("%s", arts[this_resp].subject);
 				break;
 
-			case iKeyPageToggleHighlight:
+			case PAGE_TOGGLE_HIGHLIGHTING:
 				word_highlight = bool_not(word_highlight);
 				draw_page(group->name, 0);
 				info_message(_(txt_toggled_high), txt_onoff[word_highlight != FALSE ? 1 : 0]);
 				break;
 
-			case iKeyPageViewAttach:
+			case PAGE_VIEW_ATTACHMENTS:
 				XFACE_SUPPRESS();
 				decode_save_mime(&pgart, FALSE);
 				draw_page(group->name, 0);
 				XFACE_SHOW();
 				break;
 
-			case iKeyPageViewUrl:
+			case PAGE_VIEW_URL:
 				if (!show_all_headers) { /* cooked mode? */
 					XFACE_SUPPRESS();
 					resize_article(FALSE, &pgart); /* umbreak long lines */
@@ -1009,7 +981,7 @@ return_to_index:
 				break;
 
 			default:
-				info_message(_(txt_bad_command), printascii(key, map_to_local(iKeyHelp, &menukeymap.page_nav)));
+				info_message(_(txt_bad_command), printascii(key, func_to_key(GLOBAL_HELP, page_keys)));
 		}
 	}
 	/* NOTREACHED */
@@ -1032,9 +1004,6 @@ print_message_page(
 	int bytes;
 	size_t i = begin;
 	t_lineinfo *curr;
-#	if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	wchar_t wline[LEN];
-#	endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 	for (; i < end; i++) {
 		if (base_line + i >= messagelines)		/* ran out of message */
@@ -1046,34 +1015,19 @@ print_message_page(
 		if ((line = tin_fgets(file, FALSE)) == NULL)
 			break;	/* ran out of message */
 
-		bytes = strlen(line);
-#	if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-		if (mbstowcs(wline, line, ARRAY_SIZE(wline) - 1) != (size_t) -1) {
-			wline[ARRAY_SIZE(wline) - 1] = (wchar_t) '\0';
-			if (wcswidth(wline, ARRAY_SIZE(wline) - 1) >= cCOLS) {
-				int tmp;
-
-				wline[cCOLS] = (wint_t) '\0';
-				if ((tmp = (int) wcstombs(NULL, wline, 0)) > 0)
-					bytes = tmp;
-			}
-		} else
-#	endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-		{
-			if (IS_LOCAL_CHARSET("Big5"))
-				bytes = 2 * cCOLS;
-			else {
-				if ((int) strlen(line) >= cCOLS)
-					bytes = cCOLS;
-			}
+		/*
+		 * use the offsets gained while doing line wrapping to
+		 * determine the correct position to truncate the line
+		 */
+		if (base_line + i < messagelines - 1) {	/* not last line of message */
+			bytes = (curr + 1)->offset - curr->offset;
+			line[bytes] = '\0';
 		}
-		line[bytes] = '\0';
 
 		/*
 		 * rotN encoding on body and sig data only
 		 */
 		if ((rotate != 0) && (curr->flags & (C_BODY | C_SIG))) {
-			p = line;
 			for (p = line; *p; p++) {
 				if (*p >= 'A' && *p <= 'Z')
 					*p = (*p - 'A' + rotate) % 26 + 'A';
@@ -1089,19 +1043,33 @@ print_message_page(
 #endif /* !USE_CURSES */
 
 		MoveCursor(i + scroll_region_top, 0);
-		draw_pager_line(line, curr->flags);
+		draw_pager_line(line, curr->flags, show_all_headers);
 
 		/*
 		 * Highlight URL's and mail addresses
 		 */
-		if (curr->flags & C_URL)
-			highlight_regexes(i + scroll_region_top, &url_regex, -1);
+		if (tinrc.url_highlight) {
+			if (curr->flags & C_URL)
+#ifdef HAVE_COLOR
+				highlight_regexes(i + scroll_region_top, &url_regex, use_color ? tinrc.col_urls : -1);
+#else
+				highlight_regexes(i + scroll_region_top, &url_regex, -1);
+#endif /* HAVE_COLOR */
 
-		if (curr->flags & C_MAIL)
-			highlight_regexes(i + scroll_region_top, &mail_regex, -1);
+			if (curr->flags & C_MAIL)
+#ifdef HAVE_COLOR
+				highlight_regexes(i + scroll_region_top, &mail_regex, use_color ? tinrc.col_urls : -1);
+#else
+				highlight_regexes(i + scroll_region_top, &mail_regex, -1);
+#endif /* HAVE_COLOR */
 
-		if (curr->flags & C_NEWS)
-			highlight_regexes(i + scroll_region_top, &news_regex, -1);
+			if (curr->flags & C_NEWS)
+#ifdef HAVE_COLOR
+				highlight_regexes(i + scroll_region_top, &news_regex, use_color ? tinrc.col_urls : -1);
+#else
+				highlight_regexes(i + scroll_region_top, &news_regex, -1);
+#endif /* HAVE_COLOR */
+		}
 
 		/*
 		 * Highlight /slashes/, *stars*, _underscores_ and -strokes-
@@ -1194,10 +1162,25 @@ draw_page(
 	 * Print an appropriate footer
 	 */
 	if (curr_line + ARTLINES >= artlines) {
+		char buf[LEN];
+		int len;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		wchar_t *wbuf;
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+
+		STRCPY(buf, (arts[this_resp].thread != -1) ? _(txt_next_resp) : _(txt_last_resp));
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		if ((wbuf = char2wchar_t(buf)) != NULL) {
+			len = wcswidth(wbuf, wcslen(wbuf) + 1);
+			free(wbuf);
+		} else
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+			len = (int) strlen(buf);
+
 		clear_message();
-		MoveCursor(cLINES, MORE_POS - (5 + BLANK_PAGE_COLS));
+		MoveCursor(cLINES, cCOLS - len - (1 + BLANK_PAGE_COLS));
 		StartInverse();
-		my_fputs(((arts[this_resp].thread != -1) ? _(txt_next_resp) : _(txt_last_resp)), stdout);
+		my_fputs(buf, stdout);
 		my_flush();
 		EndInverse();
 	} else
@@ -1255,7 +1238,8 @@ invoke_metamail(
 	/* This is needed if we are viewing the raw art */
 	fseek(fp, offset, SEEK_SET);	/* goto old position */
 
-	MoveCursor(cLINES, MORE_POS - (5 + BLANK_PAGE_COLS));
+	/* FIXME: values do differ for different languages */
+	MoveCursor(cLINES, cCOLS - 20 - BLANK_PAGE_COLS);
 	StartInverse();
 	my_flush();
 	EndInverse();
@@ -1269,239 +1253,427 @@ static void
 draw_page_header(
 	const char *group)
 {
-	char buf[HEADER_LEN];
-	char tmp[LEN]; /* what if cCOLS is > LEN? */
-	int whichresp;
-	int x_resp;
-	int pos, i;
-	int grplen, maxlen, scrlen;
-	int mb_diff;
+	char *buf;
+	int i;
+	int whichresp, x_resp;
+	int len, right_len, center_pos, cur_pos;
+	size_t line_len;
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	wchar_t wtmp[HEADER_LEN];
-	wchar_t wbuf[HEADER_LEN];
+	wchar_t *fmt_resp, *fmt_thread, *wtmp, *wtmp2;
+#else
+	char *tmp;
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 	whichresp = which_response(this_resp);
 	x_resp = num_of_responses(which_thread(this_resp));
 
-	if (!my_strftime(buf, sizeof(buf), "%a, %d %b %Y %H:%M:%S",
-							localtime(&arts[this_resp].date)))
-		strcpy(buf, BlankIfNull(note_h->date));
+	line_len = LEN + 1;
+	buf = my_malloc(line_len);
+
+	if (!my_strftime(buf, line_len, tinrc.date_format, localtime(&arts[this_resp].date))) {
+		strncpy(buf, BlankIfNull(note_h->date), line_len);
+		buf[line_len - 1] = '\0';
+	}
 
-	/*
-	 * Work out how much room we have for group name, allow 1 space before and
-	 * after it
-	 */
-	grplen = strlen(group);
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	if (mbstowcs(wtmp, buf, ARRAY_SIZE(wtmp)) != (size_t) -1) {
-		wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-		scrlen = wcswidth(wtmp, ARRAY_SIZE(wtmp));
-	} else
-#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-		scrlen = strlen(buf);
-	maxlen = RIGHT_POS - scrlen - 2;
+	/* convert to wide-char format strings */
+	fmt_thread = char2wchar_t(_(txt_thread_x_of_n));
+	fmt_resp = char2wchar_t(_(txt_resp_x_of_n));
 
-	if (grplen < maxlen)
-		maxlen = grplen;
+	/*
+	 * determine the needed space for the text at the right hand margin
+	 * the formating info (%4s) needs 3 positions but we need 4 positions
+	 * on the screen for each counter.
+	 */
+	if (fmt_thread && fmt_resp)
+		right_len = MAX((wcswidth(fmt_thread, wcslen(fmt_thread)) - 6 + 8), (wcswidth(fmt_resp, wcslen(fmt_resp)) - 6 + 8));
+	else if (fmt_thread)
+		right_len = wcswidth(fmt_thread, wcslen(fmt_thread)) - 6 + 8;
+	else if (fmt_resp)
+		right_len = wcswidth(fmt_resp, wcslen(fmt_resp)) - 6 + 8;
+	else
+		right_len = 0;
+	FreeIfNeeded(fmt_thread);
+	FreeIfNeeded(fmt_resp);
 
 	/*
-	 * Aesthetics - Add 3 to compensate for the fact that
-	 * the left hand margin (date) is longer than the right hand margin
-	 * Add also a compensation for multi-byte charsets
+	 * first line
 	 */
-	mb_diff = strlen(buf) - scrlen;
-	pos = 3 + (cCOLS - maxlen) / 2;
+	cur_pos = 0;
 
-	for (i = strlen(buf); i < pos + mb_diff; i++)		/* Pad out to left */
-		buf[i] = ' ';
+#	ifdef HAVE_COLOR
+	fcol(tinrc.col_head);
+#	endif /* HAVE_COLOR */
 
-	buf[i] = '\0';
+	/* date */
+	if ((wtmp = char2wchar_t(buf)) != NULL) {
+		my_fputws(wtmp, stdout);
+		cur_pos += wcswidth(wtmp, wcslen(wtmp));
+		free(wtmp);
+	}
 
-	if (maxlen != grplen) {					/* ie groupname was too long */
-		strncat(buf, group, maxlen - 3);
-		strcat(buf, "...");
-	} else
-		strncat(buf, group, maxlen);
+	/*
+	 * determine max len for centered group name
+	 * allow one space before and after group name
+	 */
+	len = cCOLS - 2 * MAX(cur_pos, right_len) - 3;
 
-	for (i = strlen(buf); i < RIGHT_POS + mb_diff; i++)	/* Pad out to right */
-		buf[i] = ' ';
+	/* group name */
+	if ((wtmp = char2wchar_t(group)) != NULL) {
+		/* wconvert_to_printable(wtmp); */
+		if ((i = wcswidth(wtmp, wcslen(wtmp))) < len)
+			len = i;
+
+		center_pos = (cCOLS - len) / 2;
+
+		/* pad out to left */
+		for (; cur_pos < center_pos; cur_pos++)
+			my_fputc(' ', stdout);
+
+		wtmp2 = wstrunc(wtmp, len);
+		my_fputws(wtmp2, stdout);
+		cur_pos += wcswidth(wtmp2, wcslen(wtmp2));
+		free(wtmp2);
+		free(wtmp);
+	}
 
-	buf[i] = '\0';
+	/* pad out to right */
+	for (; cur_pos < cCOLS - right_len - 1; cur_pos++)
+		my_fputc(' ', stdout);
+
+	/* thread info */
+	/* can't eval tin_ltoa() more than once in a statement due to statics */
+	strcpy(buf, tin_ltoa(which_thread(this_resp) + 1, 4));
+	my_printf(_(txt_thread_x_of_n), buf, tin_ltoa(grpmenu.max, 4));
+
+	my_fputs(cCRLF, stdout);
+
+#	if 0
+	/* display a ruler for layout checking purposes */
+	my_fputs("....|....3....|....2....|....1....|....0....|....1....|....2....|....3....|....\n", stdout);
+#	endif /* 0 */
 
-#ifdef HAVE_COLOR
+	/*
+	 * second line
+	 */
+	cur_pos = 0;
+
+#	ifdef HAVE_COLOR
 	fcol(tinrc.col_head);
-#endif /* HAVE_COLOR */
+#	endif /* HAVE_COLOR */
+
+	/* line count */
+	if (arts[this_resp].line_count < 0)
+		strcpy(buf, "?");
+	else
+		snprintf(buf, line_len, "%-4d", arts[this_resp].line_count);
 
 	{
-		char x[5];
+		wchar_t *fmt;
 
-		/* Can't eval tin_ltoa() more than once in a statement due to statics */
-		strcpy(x, tin_ltoa(which_thread(this_resp) + 1, 4));
+		if ((fmt = char2wchar_t(_(txt_lines))) != NULL) {
+			wtmp = my_malloc(sizeof(wchar_t) * line_len);
+			swprintf(wtmp, line_len, fmt, buf);
+			my_fputws(wtmp, stdout);
+			cur_pos += wcswidth(wtmp, wcslen(wtmp));
+			free(fmt);
+			free(wtmp);
+		}
+	}
 
-		sprintf(tmp, _(txt_thread_x_of_n), buf, x, tin_ltoa(grpmenu.max, 4));
-#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-		if (mbstowcs(wtmp, tmp, ARRAY_SIZE(wtmp)) != (size_t) -1) {
-			wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-			wcspart(wbuf, wtmp, cCOLS - 1, ARRAY_SIZE(wbuf), FALSE);
-			wcstombs(tmp, wbuf, sizeof(tmp));
-		} else
-#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-			tmp[cCOLS - 1] = '\0'; /* FIXME: see also note in signal.c:set_win_size() */
-		strcat(tmp, cCRLF);
-		my_fputs(tmp, stdout);
+#	ifdef HAVE_COLOR
+	fcol(tinrc.col_subject);
+#	endif /* HAVE_COLOR */
+
+	/* tex2iso */
+	if (pgart.tex2iso) {
+		wtmp = char2wchar_t(_(txt_tex));
+		my_fputws(wtmp, stdout);
+		cur_pos += wcswidth(wtmp, wcslen(wtmp));
+		free(wtmp);
 	}
 
+	/* subject */
 	/*
-	 * An accurate line count will appear in the footer anyway
+	 * TODO: why do we fall back to arts[this_resp].subject if !note_h->subj?
+	 *       if !note_h->subj then the article just has no subject, no matter
+	 *       what the overview says.
 	 */
-	if (arts[this_resp].line_count < 0)
-		strcpy(tmp, "?");
-	else
-		sprintf(tmp, "%-4d", arts[this_resp].line_count);
+	strncpy(buf, (note_h->subj ? note_h->subj : arts[this_resp].subject), line_len);
+	buf[line_len - 1] = '\0';
+	if ((wtmp = char2wchar_t(buf)) != NULL) {
+		wtmp2 = wstrunc(wtmp, cCOLS - 2 * right_len - 3);
+
+		center_pos = (cCOLS - wcswidth(wtmp2, wcslen(wtmp2))) / 2;
+
+		/* pad out to left */
+		for (; cur_pos < center_pos; cur_pos++)
+			my_fputc(' ', stdout);
 
-#ifdef HAVE_COLOR
-	fcol(tinrc.col_head);
-#endif /* HAVE_COLOR */
+		StartInverse();
+		my_fputws(wtmp2, stdout);
+		EndInverse();
+		cur_pos += wcswidth(wtmp2, wcslen(wtmp2));
+		free(wtmp2);
+		free(wtmp);
+	}
 
-	sprintf(buf, _(txt_lines), tmp);
-#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	if (mbstowcs(wtmp, buf, ARRAY_SIZE(wtmp)) != (size_t) -1) {
-		wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-		i = wcswidth(wtmp, ARRAY_SIZE(wtmp));
+#	ifdef HAVE_COLOR
+	fcol(tinrc.col_response);
+#	endif /* HAVE_COLOR */
+
+	/* pad out to right */
+	for (; cur_pos < cCOLS - right_len - 1; cur_pos++)
+		my_fputc(' ', stdout);
+
+	if (whichresp)
+		my_printf(_(txt_resp_x_of_n), whichresp, x_resp);
+	else {
+		if (!x_resp)
+			my_printf(_(txt_no_responses));
+		else if (x_resp == 1)
+			my_printf(_(txt_1_resp));
+		else
+			my_printf(_(txt_x_resp), x_resp);
+	}
+	my_fputs(cCRLF, stdout);
+
+	/*
+	 * third line
+	 */
+	cur_pos = 0;
+
+#	ifdef HAVE_COLOR
+	fcol(tinrc.col_from);
+#	endif /* HAVE_COLOR */
+	/* from */
+	/*
+	 * TODO: don't use arts[this_resp].name/arts[this_resp].from
+	 *       split up note_h->from and use that instead as it might
+	 *       be different _if_ the overviews are broken
+	 */
+	{
+		char *p = idna_decode(arts[this_resp].from);
+
+		if (arts[this_resp].name)
+			snprintf(buf, line_len, "%s <%s>", arts[this_resp].name, p);
+		else {
+			strncpy(buf, p, line_len);
+			buf[line_len - 1] = '\0';
+		}
+		free(p);
+	}
+
+	if ((wtmp = char2wchar_t(buf)) != NULL) {
+		wtmp2 = wstrunc(wtmp, cCOLS - 1);
+		my_fputws(wtmp2, stdout);
+		cur_pos += wcswidth(wtmp2, wcslen(wtmp2));
+		free(wtmp2);
+		free(wtmp);
+	}
+
+	/* organization */
+	if ((wtmp = char2wchar_t(_(txt_at_s))) != NULL) {
+		len = wcswidth(wtmp, wcslen(wtmp));
+		free(wtmp);
 	} else
-#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-		i = strlen(buf);
+		len = 0;
+	if (note_h->org && cCOLS - cur_pos - 1 >= len - 2 + 3) {
+		/* we have enough space to print at least " at ..." */
+		snprintf(buf, line_len, _(txt_at_s), note_h->org);
+
+		if ((wtmp = char2wchar_t(buf)) != NULL) {
+			wconvert_to_printable(wtmp);
+			wtmp2 = wstrunc(wtmp, cCOLS - cur_pos - 1);
+
+			i = cCOLS - wcswidth(wtmp2, wcslen(wtmp2)) - 1;
+			for (; cur_pos < i; cur_pos++)
+				my_fputc(' ', stdout);
+
+			my_fputws(wtmp2, stdout);
+			free(wtmp2);
+			free(wtmp);
+		}
+	}
+
+	my_fputs(cCRLF, stdout);
+	my_fputs(cCRLF, stdout);
+
+#else /* !MULTIBYTE_ABLE || NO_LOCALE */
+	/*
+	 * determine the needed space for the text at the right hand margin
+	 * the formating info (%4s) needs 3 positions but we need 4 positions
+	 * on the screen for each counter
+	 */
+	right_len = MAX((strlen(_(txt_thread_x_of_n)) - 6 + 8), (strlen(_(txt_resp_x_of_n)) - 6 + 8));
+
+	/*
+	 * first line
+	 */
+	cur_pos = 0;
+
+#	ifdef HAVE_COLOR
+	fcol(tinrc.col_head);
+#	endif /* HAVE_COLOR */
+
+	/* date */
 	my_fputs(buf, stdout);
+	cur_pos += strlen(buf);
 
-#ifdef HAVE_COLOR
-	fcol(tinrc.col_subject);
-#endif /* HAVE_COLOR */
+	/*
+	 * determine max len for centered group name
+	 * allow one space before and after group name
+	 */
+	len = cCOLS - 2 * MAX(cur_pos, right_len) - 3;
+
+	/* group name */
+	if ((i = strlen(group)) < len)
+		len = i;
+
+	center_pos = (cCOLS - len) / 2;
+
+	/* pad out to left */
+	for (; cur_pos < center_pos; cur_pos++)
+		my_fputc(' ', stdout);
+
+	tmp = strunc(group, len);
+	my_fputs(tmp, stdout);
+	cur_pos += strlen(tmp);
+	free(tmp);
+
+	/* pad out to right */
+	for (; cur_pos < cCOLS - right_len - 1; cur_pos++)
+		my_fputc(' ', stdout);
+
+	/* thread info */
+	/* can't eval tin_ltoa() more than once in a statement due to statics */
+	strcpy(buf, tin_ltoa(which_thread(this_resp) + 1, 4));
+	my_printf(_(txt_thread_x_of_n), buf, tin_ltoa(grpmenu.max, 4));
+
+	my_fputs(cCRLF, stdout);
+
+#	if 0
+	/* display a ruler for layout checking purposes */
+	my_fputs("....|....3....|....2....|....1....|....0....|....1....|....2....|....3....|....\n", stdout);
+#	endif /* 0 */
 
 	/*
-	 * TODO: the "TeX "-text is keept in the header even after toggeling
-	 *       tex2iso off
+	 * second line
 	 */
+	cur_pos = 0;
+
+#	ifdef HAVE_COLOR
+	fcol(tinrc.col_head);
+#	endif /* HAVE_COLOR */
+
+	/* line count */
+	/* an accurate line count will appear in the footer anymay */
+	if (arts[this_resp].line_count < 0)
+		strcpy(buf, "?");
+	else
+		snprintf(buf, line_len, "%-4d", arts[this_resp].line_count);
+
+	tmp = my_malloc(line_len);
+	snprintf(tmp, line_len, _(txt_lines), buf);
+	my_fputs(tmp, stdout);
+	cur_pos += strlen(tmp);
+	free(tmp);
+
+#	ifdef HAVE_COLOR
+	fcol(tinrc.col_subject);
+#	endif /* HAVE_COLOR */
+
+	/* tex2iso */
 	if (pgart.tex2iso) {
-		strcpy(buf, "TeX ");
-		i += strlen(buf);
-		my_fputs(buf, stdout);
+		my_fputs(_(txt_tex), stdout);
+		cur_pos += strlen(_(txt_tex));
 	}
 
+	/* subject */
 	/*
 	 * TODO: why do we fall back to arts[this_resp].subject if !note_h->subj?
 	 *       if !note_h->subj then the article just has no subject, no matter
 	 *       what the overview says.
 	 */
-	strncpy(buf, (note_h->subj ? note_h->subj : arts[this_resp].subject), sizeof(buf) - 1);
-
-#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	if (mbstowcs(wtmp, buf, ARRAY_SIZE(wtmp)) != (size_t) -1) {
-		wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-		wcspart(wbuf, wtmp, RIGHT_POS - 5 - i, ARRAY_SIZE(wbuf), FALSE);
-		scrlen = wcswidth(wbuf, ARRAY_SIZE(wbuf));
-		wcstombs(buf, wbuf, sizeof(wbuf));
-	} else
-#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-	{
-		buf[RIGHT_POS - 5 - i] = '\0';
-		scrlen = (int) strlen(buf);
-	}
+	strncpy(buf, (note_h->subj ? note_h->subj : arts[this_resp].subject), line_len);
+	buf[line_len - 1] = '\0';
 
-	pos = ((cCOLS - scrlen) / 2) - 2;
+	tmp = strunc(buf, cCOLS - 2 * right_len - 3);
 
-	MoveCursor(1, ((pos > i) ? pos : i));
+	center_pos = (cCOLS - strlen(tmp)) / 2;
 
-	convert_to_printable(buf);
+	/* pad out to left */
+	for (; cur_pos < center_pos; cur_pos++)
+		my_fputc(' ', stdout);
 
 	StartInverse();
-	my_fputs(buf, stdout);
+	my_fputs(tmp, stdout);
 	EndInverse();
+	cur_pos += strlen(tmp);
+	free(tmp);
 
-#ifdef HAVE_COLOR
+#	ifdef HAVE_COLOR
 	fcol(tinrc.col_response);
-#endif /* HAVE_COLOR */
+#	endif /* HAVE_COLOR */
+
+	/* pad out to right */
+	for (; cur_pos < cCOLS - right_len - 1; cur_pos++)
+		my_fputc(' ', stdout);
 
-	MoveCursor(1, RIGHT_POS);
 	if (whichresp)
-		my_printf(_(txt_resp_x_of_n), whichresp, x_resp, cCRLF);
+		my_printf(_(txt_resp_x_of_n), whichresp, x_resp);
 	else {
 		if (!x_resp)
-			my_printf(_(txt_no_resp), cCRLF);
+			my_printf(_(txt_no_responses));
 		else if (x_resp == 1)
-			my_printf(_(txt_1_resp), cCRLF);
+			my_printf(_(txt_1_resp));
 		else
-			my_printf(_(txt_x_resp), x_resp, cCRLF);
+			my_printf(_(txt_x_resp), x_resp);
 	}
+	my_fputs(cCRLF, stdout);
+
+	/*
+	 * third line
+	 */
+	cur_pos = 0;
 
 #ifdef HAVE_COLOR
-	fcol(tinrc.col_normal);
+	fcol(tinrc.col_from);
 #endif /* HAVE_COLOR */
-
+	/* from */
 	/*
 	 * TODO: don't use arts[this_resp].name/arts[this_resp].from
 	 *       split up note_h->from and use that instead as it might
 	 *       be different _if_ the overviews are broken
 	 */
 	if (arts[this_resp].name)
-		snprintf(buf, sizeof(buf), "%s <%s>", arts[this_resp].name, arts[this_resp].from);
-	else
-		strncpy(buf, arts[this_resp].from, sizeof(buf));
-
-#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	if (mbstowcs(wtmp, buf, ARRAY_SIZE(wtmp) - 1) != (size_t) -1) {
-		wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-		wcspart(wbuf, wtmp, cCOLS - 1, ARRAY_SIZE(wbuf) - 1, FALSE);
-	} else
-#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-		buf[cCOLS - 1] = '\0';
-
-	if (note_h->org) {
-		snprintf(tmp, sizeof(tmp), _(txt_at_s), note_h->org);
-
-#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-		if (mbstowcs(wtmp, tmp, ARRAY_SIZE(wtmp)) != (size_t) -1) {
-			wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-			wconvert_to_printable(wtmp);
-
-			if (wcswidth(wbuf, ARRAY_SIZE(wbuf)) + wcswidth(wtmp, ARRAY_SIZE(wtmp)) >= cCOLS - 1) {
-				wcsncat(wbuf, wtmp, ARRAY_SIZE(wbuf) - wcslen(wbuf) - 1);
-				wcscpy(wtmp, wbuf);
-				wcspart(wbuf, wtmp, cCOLS - 1, ARRAY_SIZE(wbuf) - 1, FALSE);
-			} else {
-				int j = cCOLS - 1 - wcswidth(wtmp, ARRAY_SIZE(wtmp)) - wcswidth(wbuf, ARRAY_SIZE(wbuf));
-
-				pos = wcslen(wbuf);
-				for (i = 0; i < j; i++)
-					wbuf[pos + i] = (wchar_t) ' ';
-				wbuf[pos + i] = (wchar_t) '\0';
-				wcsncat(wbuf, wtmp, ARRAY_SIZE(wbuf) - wcslen(wbuf) - 1);
-			}
-		} else
-#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-			if ((int) strlen(buf) + (int) strlen(tmp) >= cCOLS - 1) {
-				strncat(buf, tmp, cCOLS - 1 - strlen(buf));
-				buf[cCOLS - 1] = '\0';
-			} else {
-				pos = cCOLS - 1 - (int) strlen(tmp);
-				for (i = strlen(buf); i < pos; i++)
-					buf[i] = ' ';
-				buf[i] = '\0';
-				strncat(buf, tmp, sizeof(buf) - 1);
-			}
+		snprintf(buf, line_len, "%s <%s>", arts[this_resp].name, arts[this_resp].from);
+	else {
+		strncpy(buf, arts[this_resp].from, line_len);
+		buf[line_len - 1] = '\0';
 	}
-#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	if (wcslen(wbuf))
-		wcstombs(buf, wbuf, sizeof(buf));
-#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
-	convert_to_printable(strip_line(buf));
-
-#ifdef HAVE_COLOR
-	fcol(tinrc.col_from);
-#endif /* HAVE_COLOR */
+	tmp = strunc(buf, cCOLS - 1);
+	my_fputs(tmp, stdout);
+	cur_pos += strlen(tmp);
+	free(tmp);
+
+	if (note_h->org && cCOLS - cur_pos - 1 >= (int) strlen(_(txt_at_s)) - 2 + 3) {
+		/* we have enough space to print at least " at ..." */
+		snprintf(buf, line_len, _(txt_at_s), note_h->org);
+
+		tmp = strunc(buf, cCOLS - cur_pos - 1);
+		len = cCOLS - (int) strlen(tmp) - 1;
+		for (; cur_pos < len; cur_pos++)
+			my_fputc(' ', stdout);
+		my_fputs(tmp, stdout);
+		free(tmp);
+	}
 
-	my_printf("%s%s%s", buf, cCRLF, cCRLF);
+	my_fputs(cCRLF, stdout);
+	my_fputs(cCRLF, stdout);
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	free(buf);
 
 #ifdef HAVE_COLOR
 	fcol(tinrc.col_normal);
@@ -1520,17 +1692,21 @@ load_article(
 	int new_respnum,
 	struct t_group *group)
 {
-	if (read_news_via_nntp)
-		wait_message(0, _(txt_reading_article));
-
 #ifdef DEBUG
-	fprintf(stderr, "load_art %s(new=%d, curr=%d)\n", (new_respnum == this_resp) ? "ALREADY OPEN!" : "", new_respnum, this_resp);
+	if (debug == 2)
+		fprintf(stderr, "load_art %s(new=%d, curr=%d)\n", (new_respnum == this_resp) ? "ALREADY OPEN!" : "", new_respnum, this_resp);
 #endif /* DEBUG */
 
 	if (new_respnum != this_resp) {
+		char *progress_mesg = my_strdup(_(txt_reading_article));
+		int ret;
+
 		art_close(&pgart);			/* close previously opened art in pager */
 
-		switch (art_open(TRUE, &arts[new_respnum], group, &pgart, TRUE)) {
+		ret = art_open(TRUE, &arts[new_respnum], group, &pgart, TRUE, progress_mesg);
+		free(progress_mesg);
+
+		switch (ret) {
 			case ART_UNAVAILABLE:
 				art_mark(group, &arts[new_respnum], ART_READ);
 				wait_message(1, _(txt_art_unavailable));
@@ -1572,7 +1748,8 @@ load_article(
 	note_fp = pgart.cooked;
 	artline = pgart.cookl;
 	artlines = pgart.cooked_lines;
-	search_line = -1;
+	search_line = 0;
+	reset_srch_offsets();
 	rotate = 0;			/* normal mode, not rot13 */
 	reveal_ctrl_l = FALSE;
 	reveal_ctrl_l_lines = -1;	/* all ^L's active */
@@ -1590,7 +1767,7 @@ load_article(
 		return 0;
 
 	if (tinrc.ask_for_metamail) {
-		if (prompt_yn(cLINES, _(txt_use_mime), TRUE) != 1)
+		if (prompt_yn(_(txt_use_mime), TRUE) != 1)
 			return 0;
 	}
 
@@ -1653,7 +1830,7 @@ process_search(
 
 	switch (help_level) {
 		case PAGE_LEVEL:
-			draw_page(CURR_GROUP.name, 0);
+			draw_page(curr_group->name, 0);
 			break;
 
 		case INFO_PAGER:
@@ -1701,11 +1878,10 @@ toggle_raw(
 			offset = ftell(pgart.raw);
 
 			while (NULL != (line = tin_fgets(pgart.raw, FALSE))) {
-				int num_chars;
+				int space;
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 				int num_bytes;
-				t_bool is_illegal;
-				wchar_t wline[LEN];
+				wchar_t wc;
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 				pgart.rawl[j].offset = offset;
@@ -1716,64 +1892,46 @@ toggle_raw(
 					pgart.rawl = my_realloc(pgart.rawl, sizeof(t_lineinfo) * chunk);
 				}
 
-#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-				is_illegal = TRUE;
-				if ((size_t) -1 != mbstowcs(wline, line, ARRAY_SIZE(wline) - 1)) {
-					wline[ARRAY_SIZE(wline) - 1] = (wchar_t) '\0';
-					num_chars = wcswidth(wline, ARRAY_SIZE(wline) -1);
-					is_illegal = FALSE;
-				} else
-#endif
-				{
-					if (IS_LOCAL_CHARSET("Big5")) {
-						char c;
-
-						num_chars = 0;
-						p = line;
-						while ((c = *p++)) {
-							num_chars++;
-							if (0 == (c & 0x7f))	/* ASCII char, only 1 byte */
-								continue;
-							if (*p)
-								p++;			/* Big5 char, takes 2 bytes */
-						}
-					} else
-						num_chars = (int) strlen(line);
-				}
-
-				if (num_chars <= cCOLS) {
-					offset = ftell(pgart.raw);
-					continue;	/* line fits on screen, next line */
-				}
-
-				/*
-				 * Line exceeds current column width; we need to split
-				 * over several screen lines
-				 */
 				p = line;
-				while (*p)
-				{
-					int space;
+				while (*p) {
+					space = cCOLS - 1;
 
-					space = cCOLS;
 					while ((space > 0) && *p) {
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-						if (!is_illegal) {
-							num_bytes = mbtowc(wline, p, MB_CUR_MAX);
-							if ((space -= wcwidth(wline[0])) < 0)
+						num_bytes = mbtowc(&wc, p, MB_CUR_MAX);
+						if (num_bytes != -1 && iswprint(wc)) {
+							if ((space -= wcwidth(wc)) < 0)
 								break;
 							p += num_bytes;
 							offset += num_bytes;
-						} else
-#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-						{
+						}
+#else
+						if (my_isprint((int) *p)) {
+							space--;
 							p++;
 							offset++;
-							if (IS_LOCAL_CHARSET("Big5") && ((*p & 0x7f) > 0)) {
-								p++;	/* non-ASCII chars take 2 bytes */
-								offset++;
-							}
+						}
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+						else if (IS_LOCAL_CHARSET("Big5") && (unsigned char) *p >= 0xa1 && (unsigned char) *p <= 0xfe && *(p + 1)) {
+							/*
+							 * Big5: ASCII chars are handled by the normal code
+							 * check only for 2-byte chars
+							 * TODO: should we also check if the second byte is
+							 * also valid?
+							 */
+							p += 2;
+							offset += 2;
 							space--;
+						} else {
+							/*
+							 * the current character can't be displayed print it as
+							 * an octal value (needs 4 columns) see also
+							 * color.c:draw_pager_line()
+							 */
+							if ((space -= 4) < 0)
+								break;
+							offset++;
+							p++;
 						}
 					}
 					/*
@@ -1783,8 +1941,7 @@ toggle_raw(
 					if (*p) {
 						pgart.rawl[j].offset = offset;
 						pgart.rawl[j].flags = 0;
-						j++;
-						if (j >= chunk) {
+						if (++j >= chunk) {
 							chunk += 50;
 							pgart.rawl = my_realloc(pgart.rawl, sizeof(t_lineinfo) * chunk);
 						}
@@ -1814,13 +1971,13 @@ static void
 process_url(
 	void)
 {
-	char buf[LEN];
 	char *ptr;
+	char buf[LEN];
+	char ubuf[LEN];
+	char url[LEN];
 	int i;
 	int offsets[6];
 	int offsets_size = ARRAY_SIZE(offsets);
-	char url[LEN];
-	char ubuf[LEN];
 
 	/*
 	 * TODO: handle mailto: and news: (not NNTP) URLs internally
@@ -1894,10 +2051,11 @@ info_pager(
 	const char *title,
 	t_bool wrap_at_ends)
 {
-	int ch;
 	int offset;
+	t_function func;
 
-	search_line = -1;
+	search_line = 0;
+	reset_srch_offsets();
 	info_file = info_fh;
 	info_title = title;
 	curr_info_line = 0;
@@ -1906,12 +2064,11 @@ info_pager(
 	display_info_page(0);
 
 	forever {
-		switch (ch = handle_pager_keypad(&menukeymap.info_nav)) {
-			case ESC:	/* common arrow keys */
+		switch (func = handle_keypad(page_left, page_right, page_mouse_action, info_keys)) {
+			case GLOBAL_ABORT:	/* common arrow keys */
 				break;
 
-			case iKeyUp:				/* line up */
-			case iKeyUp2:
+			case GLOBAL_LINE_UP:
 				if (num_info_lines <= NOTESLINES) {
 					info_message(_(txt_begin_of_art));
 					break;
@@ -1930,8 +2087,7 @@ info_pager(
 				display_info_page(offset);
 				break;
 
-			case iKeyDown:				/* line down */
-			case iKeyDown2:
+			case GLOBAL_LINE_DOWN:
 				if (num_info_lines <= NOTESLINES) {
 					info_message(_(txt_end_of_art));
 					break;
@@ -1950,9 +2106,7 @@ info_pager(
 				display_info_page(offset);
 				break;
 
-			case iKeyPageDown:			/* page down */
-			case iKeyPageDown2:
-			case iKeyPageDown3:
+			case GLOBAL_PAGE_DOWN:
 				if (num_info_lines <= NOTESLINES) {
 					info_message(_(txt_end_of_art));
 					break;
@@ -1970,9 +2124,7 @@ info_pager(
 				display_info_page(0);
 				break;
 
-			case iKeyPageUp:			/* page up */
-			case iKeyPageUp2:
-			case iKeyPageUp3:
+			case GLOBAL_PAGE_UP:
 				if (num_info_lines <= NOTESLINES) {
 					info_message(_(txt_begin_of_art));
 					break;
@@ -1990,16 +2142,14 @@ info_pager(
 				display_info_page(0);
 				break;
 
-			case iKeyFirstPage:			/* Home */
-			case iKeyHelpFirstPage2:
+			case GLOBAL_FIRST_PAGE:
 				if (curr_info_line) {
 					curr_info_line = 0;
 					display_info_page(0);
 				}
 				break;
 
-			case iKeyLastPage:			/* End */
-			case iKeyHelpLastPage2:
+			case GLOBAL_LAST_PAGE:
 				if (curr_info_line + NOTESLINES != num_info_lines) {
 					/* Display a full last page for neatness */
 					curr_info_line = num_info_lines - NOTESLINES;
@@ -2007,24 +2157,24 @@ info_pager(
 				}
 				break;
 
-			case iKeyToggleHelpDisplay:
+			case GLOBAL_TOGGLE_HELP_DISPLAY:
 				toggle_mini_help(INFO_PAGER);
 				display_info_page(0);
 				break;
 
-			case iKeySearchSubjF:
-			case iKeySearchSubjB:
-			case iKeySearchRepeat:
-				if (ch == iKeySearchRepeat && i_key_search_last != iKeySearchSubjF && i_key_search_last != iKeySearchSubjB)
+			case GLOBAL_SEARCH_SUBJECT_FORWARD:
+			case GLOBAL_SEARCH_SUBJECT_BACKWARD:
+			case GLOBAL_SEARCH_REPEAT:
+				if (func == GLOBAL_SEARCH_REPEAT && last_search != GLOBAL_SEARCH_SUBJECT_FORWARD && last_search != GLOBAL_SEARCH_SUBJECT_BACKWARD)
 					break;
 
-				if ((search_article((ch == iKeySearchSubjF), (ch == iKeySearchRepeat), search_line, num_info_lines, infoline, num_info_lines - 1, info_file)) == -1)
+				if ((search_article((func == GLOBAL_SEARCH_SUBJECT_FORWARD), (func == GLOBAL_SEARCH_REPEAT), search_line, num_info_lines, infoline, num_info_lines - 1, info_file)) == -1)
 					break;
 
 				process_search(&curr_info_line, num_info_lines, NOTESLINES, INFO_PAGER);
 				break;
 
-			case iKeyQuit:	/* quit */
+			case GLOBAL_QUIT:	/* quit */
 				ClearScreen();
 				return;
 
diff -Nurp tin-1.6.2/src/parsdate.y tin-1.8.0/src/parsdate.y
--- tin-1.6.2/src/parsdate.y	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/parsdate.y	2005-07-01 17:29:19.000000000 +0200
@@ -19,10 +19,10 @@
  *  Copyright : This code is in the public domain and has no copyright.
  */
 
-/* SUPPRESS 530 *//* Empty body for statement */
-/* SUPPRESS 593 on yyerrlab *//* Label was not used */
-/* SUPPRESS 593 on yynewstate *//* Label was not used */
-/* SUPPRESS 595 on yypvt *//* Automatic variable may be used before set */
+/* SUPPRESS 530 */ /* Empty body for statement */
+/* SUPPRESS 593 on yyerrlab */ /* Label was not used */
+/* SUPPRESS 593 on yynewstate */ /* Label was not used */
+/* SUPPRESS 595 on yypvt */ /* Automatic variable may be used before set */
 
 #include "tin.h"
 
@@ -544,7 +544,7 @@ Convert(
 	}
     if (Year < EPOCH || Year > END_OF_TIME
      || Month < 1 || Month > 12
-     /* NOSTRICT *//* conversion from long may lose accuracy */
+     /* NOSTRICT */ /* conversion from long may lose accuracy */
      || Day < 1 || Day > mp[(int)Month])
 	return -1;
 
@@ -774,7 +774,7 @@ GetTimeInfo(
 #endif	/* !defined(DONT_HAVE_TM_GMTOFF) */
 
     /* Get the basic time. */
-#if	defined(HAVE_GETTIMEOFDAY)
+#if defined(HAVE_GETTIMEOFDAY)
     if (gettimeofday(&tv, (struct timezone *)NULL) == -1)
 	return -1;
     Now->time = tv.tv_sec;
@@ -783,7 +783,7 @@ GetTimeInfo(
     /* Can't check for -1 since that might be a time, I guess. */
     (void)time(&Now->time);
     Now->usec = 0;
-#endif	/* defined(HAVE_GETTIMEOFDAY) */
+#endif /* defined(HAVE_GETTIMEOFDAY) */
 
     /* Now get the timezone if it's been an hour since the last time. */
     if (Now->time - LastTime > 60 * 60) {
@@ -839,7 +839,7 @@ parsedate(
     yyMonth = tm->tm_mon + 1;
     yyDay = tm->tm_mday;
     yyTimezone = now->tzone;
-    if(tm->tm_isdst)                   /* Correct timezone offset for DST */
+    if (tm->tm_isdst)                   /* Correct timezone offset for DST */
       yyTimezone += DST_OFFSET * 60;
     yyDSTmode = DSTmaybe;
     yyHour = 0;
diff -Nurp tin-1.6.2/src/pgp.c tin-1.8.0/src/pgp.c
--- tin-1.6.2/src/pgp.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/pgp.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : pgp.c
  *  Author    : Steven J. Madsen
  *  Created   : 1995-05-12
- *  Updated   : 2003-03-13
+ *  Updated   : 2005-07-02
  *  Notes     : PGP support
  *
- * Copyright (c) 1995-2003 Steven J. Madsen <steve@erinet.com>
+ * Copyright (c) 1995-2006 Steven J. Madsen <steve@erinet.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,14 +38,12 @@
 #ifndef TIN_H
 #	include "tin.h"
 #endif /* !TIN_H */
-#ifndef TCURSES_H
-#	include "tcurses.h"
-#endif /* !TCURSES_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
 
 #ifdef HAVE_PGP_GPG
+#	ifndef TCURSES_H
+#		include "tcurses.h"
+#	endif /* !TCURSES_H */
+
 
 /*
  * The first two args are typically the PGP command name and then $PGPOPTS
@@ -58,7 +56,7 @@
 #		define PGP_PUBRING	"pubring.pgp"
 #		define CHECK_SIGN	"%s %s -f <%s %s"
 #		define ADD_KEY		"%s %s -ka %s"
-#		define APPEND_KEY	"%s %s -kxa %s %s"
+#		define APPEND_KEY	"%s %s -kxa %s %s", PGPNAME, pgpopts, buf, keyfile
 #		define DO_ENCRYPT	"%s %s -ate %s %s", PGPNAME, pgpopts, pt, mailto
 #		define DO_SIGN		"%s %s -ats %s %s", PGPNAME, pgpopts, pt, mailto
 #		define DO_SIGN1		"%s %s -ats %s %s -u %s", PGPNAME, pgpopts, pt, mailto, mailfrom
@@ -72,7 +70,7 @@
 #		define PGP_PUBRING	"pubring.pkr"
 #		define CHECK_SIGN	"%sv %s -f <%s %s"
 #		define ADD_KEY		"%sk %s -a %s"
-#		define APPEND_KEY	"%sk %s -xa %s -o %s"
+#		define APPEND_KEY	"%sk %s -xa %s -o %s", PGPNAME, pgpopts, keyfile, buf
 #		define DO_ENCRYPT	"%se %s -at %s %s", PGPNAME, pgpopts, pt, mailto
 #		define DO_SIGN		"%ss %s -at %s %s", PGPNAME, pgpopts, pt, mailto
 #		define DO_SIGN1		"%ss %s -at %s %s -u %s", PGPNAME, pgpopts, pt, mailto, mailfrom
@@ -86,8 +84,8 @@
 #		define PGP_PUBRING	"pubring.gpg"
 #		define CHECK_SIGN	"%s %s --no-batch --decrypt <%s %s"
 #		define ADD_KEY		"%s %s --no-batch --import %s"
-#		define APPEND_KEY	"%s %s --no-batch --armor --output %s --export %s"
-#		define LOCAL_USER	"--local-user %s"
+#		define APPEND_KEY	"%s %s --no-batch --armor --output %s --export %s", PGPNAME, pgpopts, keyfile, buf
+/* #		define LOCAL_USER	"--local-user %s" */
 #		define DO_ENCRYPT	\
 "%s %s --textmode --armor --no-batch --output %s.asc --recipient %s --encrypt %s", \
 PGPNAME, pgpopts, pt, mailto, pt
@@ -120,14 +118,11 @@ PGPNAME, pgpopts, pt, mailto, mailfrom, 
 #	endif /* HAVE_LONG_FILE_NAMES */
 
 
-#	define PGP_SIGN 0x01
-#	define PGP_ENCRYPT 0x02
-
 /*
  * local prototypes
  */
 static t_bool pgp_available(void);
-static void do_pgp(int what, const char *file, const char *mail_to);
+static void do_pgp(t_function what, const char *file, const char *mail_to);
 static void join_files(const char *file);
 static void pgp_append_public_key(char *file);
 static void split_file(const char *file);
@@ -233,7 +228,7 @@ err_art:
 
 static void
 do_pgp(
-	int what,
+	t_function what,
 	const char *file,
 	const char *mail_to)
 {
@@ -248,24 +243,35 @@ do_pgp(
 	/*
 	 * <mailfrom> is valid only when signing and a local address exists
 	 */
-	if (what & PGP_SIGN) {
-		if ((CURR_GROUP.attribute->from) != NULL)
-			strip_name(CURR_GROUP.attribute->from, mailfrom);
-		if (strlen(mailfrom)) {
-			if (what & PGP_ENCRYPT)
-				sh_format(cmd, sizeof(cmd), DO_BOTH1);
-			else
+	if ((CURR_GROUP.attribute->from) != NULL)
+		strip_name(CURR_GROUP.attribute->from, mailfrom);
+
+	switch (what) {
+		case PGP_KEY_SIGN:
+			if (strlen(mailfrom))
 				sh_format(cmd, sizeof(cmd), DO_SIGN1);
-		} else {
-			if (what & PGP_ENCRYPT)
-				sh_format(cmd, sizeof(cmd), DO_BOTH);
 			else
 				sh_format(cmd, sizeof(cmd), DO_SIGN);
-		}
-	} else
-		sh_format(cmd, sizeof(cmd), DO_ENCRYPT);
+			invoke_cmd(cmd);
+			break;
+
+		case PGP_KEY_ENCRYPT_SIGN:
+			if (strlen(mailfrom))
+				sh_format(cmd, sizeof(cmd), DO_BOTH1);
+			else
+				sh_format(cmd, sizeof(cmd), DO_BOTH);
+			invoke_cmd(cmd);
+			break;
+
+		case PGP_KEY_ENCRYPT:
+			sh_format(cmd, sizeof(cmd), DO_ENCRYPT);
+			invoke_cmd(cmd);
+			break;
+
+		default:
+			break;
+	}
 
-	invoke_cmd(cmd);
 	join_files(file);
 }
 
@@ -280,7 +286,7 @@ pgp_append_public_key(
 	if ((CURR_GROUP.attribute->from) != NULL && strlen(CURR_GROUP.attribute->from))
 		strip_name(CURR_GROUP.attribute->from, buf);
 	else
-		snprintf(buf, sizeof(buf), "%s@%s", userid, host_name);
+		snprintf(buf, sizeof(buf), "%s@%s", userid, BlankIfNull(get_host_name()));
 
 	snprintf(keyfile, sizeof(keyfile), KEYFILE, TMPDIR, process_id);
 
@@ -288,8 +294,7 @@ pgp_append_public_key(
  * TODO: I'm guessing the pgp append key command creates 'keyfile' and that
  * we should remove it
  */
-	sh_format(cmd, sizeof(cmd), APPEND_KEY, PGPNAME, pgpopts, keyfile, buf);
-
+	sh_format(cmd, sizeof(cmd), APPEND_KEY);
 	if (invoke_cmd(cmd)) {
 		if ((fp = fopen(file, "a")) != NULL) {
 			if ((key = fopen(keyfile, "r")) != NULL) {
@@ -331,44 +336,41 @@ invoke_pgp_mail(
 	const char *nam,
 	char *mail_to)
 {
-	char ch, ch_default = iKeyPgpSign;
 	char keyboth[MAXKEYLEN], keyencrypt[MAXKEYLEN], keyquit[MAXKEYLEN];
 	char keysign[MAXKEYLEN];
+	t_function func, default_func = PGP_KEY_SIGN;
 
 	if (!pgp_available())
 		return;
 
-	ch = prompt_slk_response(ch_default, &menukeymap.pgp_mail,
-			_(txt_pgp_mail),
-			printascii(keyencrypt, map_to_local(iKeyPgpEncrypt, &menukeymap.pgp_mail)),
-			printascii(keysign, map_to_local(iKeyPgpSign, &menukeymap.pgp_mail)),
-			printascii(keyboth, map_to_local(iKeyPgpEncSign, &menukeymap.pgp_mail)),
-			printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.pgp_mail)));
-	switch (ch) {
-		case iKeyAbort:
-		case iKeyQuit:
-			break;
-
-		case iKeyPgpSign:
+	func = prompt_slk_response(default_func, pgp_mail_keys, _(txt_pgp_mail),
+			printascii(keyencrypt, func_to_key(PGP_KEY_ENCRYPT, pgp_mail_keys)),
+			printascii(keysign, func_to_key(PGP_KEY_SIGN, pgp_mail_keys)),
+			printascii(keyboth, func_to_key(PGP_KEY_ENCRYPT_SIGN, pgp_mail_keys)),
+			printascii(keyquit, func_to_key(GLOBAL_QUIT, pgp_mail_keys)));
+	switch (func) {
+		case PGP_KEY_SIGN:
 #ifdef HAVE_PGPK
 			ClearScreen();
 			MoveCursor(cLINES - 7, 0);
 #endif /* HAVE_PGPK */
-			do_pgp(PGP_SIGN, nam, NULL);
+			do_pgp(func, nam, NULL);
 			break;
 
-		case iKeyPgpEncSign:
+		case PGP_KEY_ENCRYPT_SIGN:
 #ifdef HAVE_PGPK
 			ClearScreen();
 			MoveCursor(cLINES - 7, 0);
 #endif /* HAVE_PGPK */
-			do_pgp(PGP_SIGN | PGP_ENCRYPT, nam, mail_to);
+			do_pgp(func, nam, mail_to);
 			break;
 
-		case iKeyPgpEncrypt:
-			do_pgp(PGP_ENCRYPT, nam, mail_to);
+		case PGP_KEY_ENCRYPT:
+			do_pgp(func, nam, mail_to);
 			break;
 
+		case GLOBAL_ABORT:
+		case GLOBAL_QUIT:
 		default:
 			break;
 	}
@@ -379,38 +381,37 @@ void
 invoke_pgp_news(
 	char *artfile)
 {
-	char ch, ch_default = iKeyPgpSign;
 	char keyinclude[MAXKEYLEN], keyquit[MAXKEYLEN], keysign[MAXKEYLEN];
+	t_function func, default_func = PGP_KEY_SIGN;
 
 	if (!pgp_available())
 		return;
 
-	ch = prompt_slk_response(ch_default, &menukeymap.pgp_news,
-				_(txt_pgp_news),
-				printascii(keysign, map_to_local(iKeyPgpSign, &menukeymap.pgp_news)),
-				printascii(keyinclude, map_to_local(iKeyPgpIncludekey, &menukeymap.pgp_news)),
-				printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.pgp_news)));
-	switch (ch) {
-		case iKeyAbort:
-		case iKeyQuit:
+	func = prompt_slk_response(default_func, pgp_news_keys, _(txt_pgp_news),
+				printascii(keysign, func_to_key(PGP_KEY_SIGN, pgp_news_keys)),
+				printascii(keyinclude, func_to_key(PGP_INCLUDE_KEY, pgp_news_keys)),
+				printascii(keyquit, func_to_key(GLOBAL_QUIT, pgp_news_keys)));
+	switch (func) {
+		case GLOBAL_ABORT:
+		case GLOBAL_QUIT:
 			break;
 
-		case iKeyPgpSign:
+		case PGP_KEY_SIGN:
 #ifdef HAVE_PGPK
 			info_message(" ");
 			MoveCursor(cLINES - 7, 0);
 			my_printf("\n");
 #endif /* HAVE_PGPK */
-			do_pgp(PGP_SIGN, artfile, NULL);
+			do_pgp(func, artfile, NULL);
 			break;
 
-		case iKeyPgpIncludekey:
+		case PGP_INCLUDE_KEY:
 #ifdef HAVE_PGPK
 			info_message(" ");
 			MoveCursor(cLINES - 7, 0);
 			my_printf("\n");
 #endif /* HAVE_PGPK */
-			do_pgp(PGP_SIGN, artfile, NULL);
+			do_pgp(PGP_KEY_SIGN, artfile, NULL);
 			pgp_append_public_key(artfile);
 			break;
 
@@ -471,8 +472,9 @@ pgp_check_article(
 		Raw(TRUE);
 	}
 
+	prompt_continue();
 	if (pgp_key) {
-		if (prompt_yn(cLINES, _(txt_pgp_add), FALSE) == 1) {
+		if (prompt_yn(_(txt_pgp_add), FALSE) == 1) {
 			Raw(FALSE);
 
 			sh_format(cmd, sizeof(cmd), ADD_KEY, PGPNAME, pgpopts, artfile);
@@ -482,7 +484,6 @@ pgp_check_article(
 		}
 	}
 
-	prompt_continue();
 	unlink(artfile);
 	return TRUE;
 }
diff -Nurp tin-1.6.2/src/post.c tin-1.8.0/src/post.c
--- tin-1.6.2/src/post.c	2003-08-10 15:31:03.000000000 +0200
+++ tin-1.8.0/src/post.c	2005-12-23 18:22:18.945845827 +0100
@@ -3,10 +3,10 @@
  *  Module    : post.c
  *  Author    : I. Lea
  *  Created   : 1991-04-01
- *  Updated   : 2003-08-10
+ *  Updated   : 2005-12-23
  *  Notes     : mail/post/replyto/followup/repost & cancel articles
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,12 +41,6 @@
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
-#ifndef RFC2046_H
-#	include "rfc2046.h"
-#endif /* !RFC2046_H */
 #ifndef VERSION_H
 #	include "version.h"
 #endif /* !VERSION_H */
@@ -115,7 +109,6 @@
 /* When prompting for subject, display no more than 20 characters */
 #define DISPLAY_SUBJECT_LEN 20
 
-extern char article[PATH_LEN];			/* Fixed path of the file holding temp. article */
 static int start_line_offset = 1;		/* used by invoke_editor for line no. */
 
 char bug_addr[LEN];			/* address to add send bug reports to */
@@ -134,28 +127,29 @@ static struct msg_header {
 static FILE *create_mail_headers(char *filename, const char *suffix, const char *to, const char *subject, struct t_header *extra_hdrs);
 static char **split_address_list(const char *addresses, unsigned int *cnt);
 static char *backup_article_name(const char *the_article);
-static char prompt_rejected(void);
-static char prompt_to_send(const char *subject);
 static int add_mail_quote(FILE *fp, int respnum);
 static int check_article_to_be_posted(const char *the_article, int art_type, struct t_group **group, t_bool art_unchanged);
-static unsigned int get_recipients(struct t_header *hdr, char *buf, size_t buflen);
-static int mail_loop(const char *filename, char ch, char *subject, const char *groupname, const char *prompt);
+static int mail_loop(const char *filename, t_function func, char *subject, const char *groupname, const char *prompt, FILE *articlefp);
 static int msg_add_x_body(FILE *fp_out, const char *body);
 static int msg_write_headers(FILE *fp);
-static int post_loop(int type, struct t_group *psGrp, char ch, const char *posting_msg, int art_type, int offset);
+static int post_loop(int type, struct t_group *group, t_function func, const char *posting_msg, int art_type, int offset);
+static unsigned int get_recipients(struct t_header *hdr, char *buf, size_t buflen);
 static size_t skip_id(const char *id);
 static struct t_group *check_moderated(const char *groups, int *art_type, const char *failmsg);
 static t_bool address_in_list(const char *addresses, const char *address);
 static t_bool append_mail(const char *the_article, const char *addr, const char *the_mailbox);
 static t_bool backup_article(const char *the_article);
 static t_bool check_for_spamtrap(const char *addr);
-static t_bool create_normal_article_headers(struct t_group *psGrp, const char *newsgroups, int art_type);
+static t_bool create_normal_article_headers(struct t_group *group, const char *newsgroups, int art_type);
 static t_bool damaged_id(const char *id);
 static t_bool fetch_postponed_article(const char tmp_file[], char subject[], char newsgroups[]);
+static t_bool insert_from_header(const char *infile);
 static t_bool is_crosspost(const char *xref);
 static t_bool must_include(const char *id);
-static t_bool repair_article(char *result, struct t_group *group);
-static t_bool submit_mail_file(const char *file, struct t_group *group);
+static t_bool repair_article(t_function *result, struct t_group *group);
+static t_bool submit_mail_file(const char *file, struct t_group *group, FILE *articlefp, t_bool include_text);
+static t_function prompt_rejected(void);
+static t_function prompt_to_send(const char *subject);
 static void add_headers(const char *infile, const char *a_message_id);
 static void appendid(char **where, const char **what);
 static void find_reply_to_addr(char *from_addr, t_bool parse, struct t_header *hdr);
@@ -173,19 +167,20 @@ static void update_posted_info_file(cons
 #ifdef FORGERY
 	static void make_path_header(char *line);
 #endif /* FORGERY */
-#ifndef M_AMIGA
-	static t_bool insert_from_header(const char *infile);
-#endif /* !M_AMIGA */
 #ifdef EVIL_INSIDE
 	static const char *build_messageid(void);
 	static char *radix32(unsigned long int num);
 #endif /* EVIL_INSIDE */
+#ifdef USE_CANLOCK
+	static const char *build_cankey(const char *messageid, const char *secret);
+#endif /* USE_CANLOCK */
 
 
-static char
+static t_function
 prompt_to_send(
 	const char *subject)
 {
+	char *smsg;
 	char buf[LEN];
 	char keyedit[MAXKEYLEN];
 	char keyquit[MAXKEYLEN];
@@ -196,24 +191,27 @@ prompt_to_send(
 #ifdef HAVE_PGP_GPG
 	char keypgp[MAXKEYLEN];
 #endif /* HAVE_PGP_GPG */
+	t_function func;
 
 	snprintf(buf, sizeof(buf), _(txt_quit_edit_send),
-					printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.post_send)),
-					printascii(keyedit, map_to_local(iKeyPostEdit, &menukeymap.post_send)),
+					printascii(keyquit, func_to_key(GLOBAL_QUIT, post_send_keys)),
+					printascii(keyedit, func_to_key(POST_EDIT, post_send_keys)),
 #ifdef HAVE_ISPELL
-					printascii(keyispell, map_to_local(iKeyPostIspell, &menukeymap.post_send)),
+					printascii(keyispell, func_to_key(POST_ISPELL, post_send_keys)),
 #endif /* HAVE_ISPELL */
 #ifdef HAVE_PGP_GPG
-					printascii(keypgp, map_to_local(iKeyPostPGP, &menukeymap.post_send)),
+					printascii(keypgp, func_to_key(POST_PGP, post_send_keys)),
 #endif /* HAVE_PGP_GPG */
-					printascii(keysend, map_to_local(iKeyPostSend, &menukeymap.post_send)));
+					printascii(keysend, func_to_key(POST_SEND, post_send_keys)));
 
-	return prompt_slk_response(iKeyPostSend, &menukeymap.post_send, "%s",
-				sized_message(buf, subject));
+	func = prompt_slk_response(POST_SEND, post_send_keys, "%s",
+				sized_message(&smsg, buf, subject));
+	free(smsg);
+	return func;
 }
 
 
-static char
+static t_function
 prompt_rejected(
 	void)
 {
@@ -226,11 +224,11 @@ prompt_rejected(
 	my_fflush(stderr);
 	Raw(TRUE);
 
-	return prompt_slk_response(iKeyPostEdit, &menukeymap.post_edit,
+	return prompt_slk_response(POST_EDIT, post_edit_keys,
 				_(txt_quit_edit_postpone),
-				printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.post_edit)),
-				printascii(keyedit, map_to_local(iKeyPostEdit, &menukeymap.post_edit)),
-				printascii(keypostpone, map_to_local(iKeyPostPostpone, &menukeymap.post_edit)));
+				printascii(keyquit, func_to_key(GLOBAL_QUIT, post_edit_keys)),
+				printascii(keyedit, func_to_key(POST_EDIT, post_edit_keys)),
+				printascii(keypostpone, func_to_key(POST_POSTPONE, post_edit_keys)));
 }
 
 
@@ -265,23 +263,22 @@ init_postinfo(
  */
 static t_bool
 repair_article(
-	char *result,
+	t_function *result,
 	struct t_group *group)
 {
 	char keyedit[MAXKEYLEN], keymenu[MAXKEYLEN], keyquit[MAXKEYLEN];
-	int ch;
+	t_function func;
 
-	ch = prompt_slk_response(iKeyPostEdit, &menukeymap.post_edit_ext,
-				_(txt_bad_article),
-				printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.post_edit_ext)),
-				printascii(keymenu, map_to_local(iKeyOptionMenu, &menukeymap.post_edit_ext)),
-				printascii(keyedit, map_to_local(iKeyPostEdit, &menukeymap.post_edit_ext)));
-
-	*result = ch;
-	if (ch == iKeyPostEdit) {
-		if (invoke_editor(article, start_line_offset))
+	func = prompt_slk_response(POST_EDIT, post_edit_ext_keys, _(txt_bad_article),
+				printascii(keyquit, func_to_key(GLOBAL_QUIT, post_edit_ext_keys)),
+				printascii(keymenu, func_to_key(GLOBAL_OPTION_MENU, post_edit_ext_keys)),
+				printascii(keyedit, func_to_key(POST_EDIT, post_edit_ext_keys)));
+
+	*result = func;
+	if (func == POST_EDIT) {
+		if (invoke_editor(article_name, start_line_offset))
 			return TRUE;
-	} else if (ch == iKeyOptionMenu) {
+	} else if (func == GLOBAL_OPTION_MENU) {
 		(void) change_config_file(group); /*OD:*/
 		return TRUE;
 	}
@@ -320,8 +317,8 @@ msg_init_headers(
 	int i;
 
 	for (i = 0; i < MAX_MSG_HEADERS; i++) {
-		msg_headers[i].name = (char *) 0;
-		msg_headers[i].text = (char *) 0;
+		msg_headers[i].name = NULL;
+		msg_headers[i].text = NULL;
 	}
 }
 
@@ -346,8 +343,8 @@ msg_add_header(
 {
 	const char *p;
 	char *ptr;
-	char *new_name = (char *) 0;
-	char *new_text = (char *) 0;
+	char *new_name;
+	char *new_text = NULL;
 	int i;
 	t_bool done = FALSE;
 
@@ -370,7 +367,7 @@ msg_add_header(
 					for (p = text; *p && (*p == ' ' || *p == '\t'); p++)
 						;
 					new_text = my_strdup(p);
-					ptr = strchr(new_text, '\n');
+					ptr = strrchr(new_text, '\n');
 					if (ptr)
 						*ptr = '\0';
 
@@ -389,7 +386,7 @@ msg_add_header(
 				for (p = text; *p && (*p == ' ' || *p == '\t'); p++)
 					;
 				new_text = my_strdup(p);
-				ptr = strchr(new_text, '\n');
+				ptr = strrchr(new_text, '\n');
 				if (ptr)
 					*ptr = '\0';
 
@@ -408,11 +405,16 @@ msg_write_headers(
 {
 	int i;
 	int wrote = 1;
+	char *p;
 
 	for (i = 0; i < MAX_MSG_HEADERS; i++) {
 		if (msg_headers[i].name) {
 			fprintf(fp, "%s: %s\n", msg_headers[i].name, BlankIfNull(msg_headers[i].text));
-			wrote++;
+			p = msg_headers[i].text;
+			do {
+				wrote++;
+				p = strchr(++p, '\n');
+			} while (p);
 		}
 	}
 	fputc('\n', fp);
@@ -727,7 +729,7 @@ check_article_to_be_posted(
 	char references[HEADER_LEN];
 	char subject[HEADER_LEN];
 	int cnt = 0;
-	int col, i = 0;
+	int col, i;
 	int errors = 0;
 	int warnings = 0;
 	int init = 1;
@@ -750,6 +752,7 @@ check_article_to_be_posted(
 	t_bool mime_7bit = TRUE;
 	t_bool mime_usascii = FALSE;
 	t_bool contains_8bit = FALSE;
+	int must_break_line = 0;
 #ifdef CHARSET_CONVERSION
 	t_bool charset_conversion_fails = FALSE;
 	int mmnwcharset = *group ? (*group)->attribute->mm_network_charset : tinrc.mm_network_charset;
@@ -898,8 +901,17 @@ check_article_to_be_posted(
 		}
 
 		if (cp - line == 10 && !strncasecmp(line, "Message-ID", 10)) {
+#if 0 /* see comment about "<>" in misc.c:gnksa_split_from() */
+			char addr[HEADER_LEN], name[HEADER_LEN];
+			int type;
+
+			i = gnksa_check_from(cp + 1);
+			gnksa_split_from(cp + 1, addr, name, &type);
+			if (((GNKSA_OK != i) && (GNKSA_LOCALPART_MISSING > i)) || !*addr) {
+#else
 			i = gnksa_check_from(cp + 1);
 			if ((GNKSA_OK != i) && (GNKSA_LOCALPART_MISSING > i)) {
+#endif /* 0 */
 				setup_check_article_screen(&init);
 				StartInverse();
 				my_fprintf(stderr, _(txt_error_bad_msgidfqdn), i);
@@ -920,6 +932,10 @@ check_article_to_be_posted(
 				saw_references = TRUE;
 		}
 
+		/*
+		 * TODO: also check for other illegal chars?
+		 *       a 'common' error is to use a semicolon instead of a comma.
+		 */
 		if (cp - line == 10 && !strncasecmp(line, "Newsgroups", 10)) {
 			found_newsgroups_lines++;
 			for (cp = line + 11; *cp == ' '; cp++)
@@ -1054,9 +1070,9 @@ check_article_to_be_posted(
 	if (found_newsgroups_lines > 1)
 		errors_catbp |= CA_ERROR_DUPLICATED_NEWSGROUPS;
 
-	if (!found_subject_lines) {
+	if (!found_subject_lines)
 		errors_catbp |= CA_ERROR_MISSING_SUBJECT;
-	} else {
+	else {
 		if (found_subject_lines > 1)
 			errors_catbp |= CA_ERROR_DUPLICATED_SUBJECT;
 	}
@@ -1098,14 +1114,39 @@ check_article_to_be_posted(
 		}
 #endif /* CHARSET_CONVERSION */
 
-		col = 0;
-		for (cp = line; *cp; cp++) {
-			if (!contains_8bit && !isascii(*cp))
-				contains_8bit = TRUE;
-			if (*cp == '\t')
-				col += 8 - (col % 8);
-			else
-				col++;
+		{
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+			int num_bytes, wc_width;
+			wchar_t wc;
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+
+			col = 0;
+			for (cp = line; *cp; ) {
+				if (*cp == '\t') {
+					col += 8 - (col % 8);
+					cp++;
+				} else {
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+					if ((num_bytes = mbtowc(&wc, cp, MB_CUR_MAX)) != -1) {
+						cp += num_bytes;
+						if (!contains_8bit && num_bytes > 1)
+							contains_8bit = TRUE;
+						if (iswprint(wc) && ((wc_width = wcwidth(wc)) != -1))
+							col += wc_width;
+						else
+							col++;
+					} else {
+						cp++;
+						col++;
+					}
+#else
+					if (!contains_8bit && !isascii(*cp))
+						contains_8bit = TRUE;
+					cp++;
+					col++;
+#endif /* MULTIBYTE_ABLE && ! NO_LOCALE */
+				}
+			}
 		}
 		if (col > MAX_COL && !got_long_line) {
 			setup_check_article_screen(&init);
@@ -1114,36 +1155,32 @@ check_article_to_be_posted(
 			got_long_line = TRUE;
 			warnings++;
 		}
-#if 0 /* disabled till 1.7.x */
+		if (strlen(line) > 998 && !must_break_line)
+			must_break_line = cnt;
+	}
+
+#if 1
 /*
- * TODO: cleanup, test me, move to the right location (after testing the
- *       whole body for 8bit chars), adjust and translate warings, ...
+ * TODO: cleanup, test me, move to the right location, strings -> lang.c, ...
  */
-		if (strlen(line) > 998 && strcasecmp(txt_mime_encodings[tinrc.post_mime_encoding], txt_base64)) {
-			setup_check_article_screen(&init);
+	if (must_break_line && strcasecmp(txt_mime_encodings[tinrc.post_mime_encoding], txt_base64)) {
+		setup_check_article_screen(&init);
 #	ifdef MIME_BREAK_LONG_LINES
-			if (contains_8bit) { /* we only know if the body contained 8bits till this line, that is not 100% correct */
-				if (strcasecmp(txt_mime_encodings[tinrc.post_mime_encoding], txt_quoted_printable)) {
-					my_fprintf(stderr, "Line %d is longer than 998 octets and should be folded, but\n", cnt);
-					my_fprintf(stderr, "encoding is neither set to %s nor to %s\n", txt_quoted_printable, txt_base64);
-				}
-			} else
+		if (contains_8bit) {
+			if (strcasecmp(txt_mime_encodings[tinrc.post_mime_encoding], txt_quoted_printable))
+				my_fprintf(stderr, _("Line %d is longer than 998 octets and should be folded, but\nencoding is neither set to %s nor to %s\n"), must_break_line, txt_quoted_printable, txt_base64);
+		} else
 #	endif /* MIME_BREAK_LONG_LINES */
-			{
-				if (!strcasecmp(txt_mime_encodings[tinrc.post_mime_encoding], txt_quoted_printable)) {
-					my_fprintf(stderr, "Line %d is longer than 998 octets, and should be folded, but\n", cnt);
-					my_fprintf(stderr, "encoding is set to %s without enabling MIME_BREAK_LONG_LINES or\n", txt_quoted_printable);
-					my_fprintf(stderr, "posting doesn't contain any 8bit chars and thus folding won't happen\n");
-				} else {
-					my_fprintf(stderr, "Line %d is longer than 998 octets, and should be folded, but\n", cnt);
-					my_fprintf(stderr, "encoding is not set to %s\n", txt_base64);
-				}
-			}
+		{
+			if (!strcasecmp(txt_mime_encodings[tinrc.post_mime_encoding], txt_quoted_printable))
+				my_fprintf(stderr, _("Line %d is longer than 998 octets, and should be folded, but\nencoding is set to %s without enabling MIME_BREAK_LONG_LINES or\nposting doesn't contain any 8bit chars and thus folding won't happen\n"), must_break_line, txt_quoted_printable);
+			else
+				my_fprintf(stderr, _("Line %d is longer than 998 octets, and should be folded, but\nencoding is not set to %s\n"), must_break_line, txt_base64);
+		}
 		my_fflush(stderr);
 		warnings++;
-		}
-#endif /* 0 */
 	}
+#endif /* 1 */
 
 	if (saw_sig_dashes > 1)
 		warnings_catbp |= CA_WARNING_MULTIPLE_SIGDASHES;
@@ -1201,7 +1238,7 @@ check_article_to_be_posted(
 		errors_catbp |= CA_ERROR_BAD_CHARSET;
 #else /* we catch this case later on again */
 		warnings_catbp |= CA_WARNING_CHARSET_CONVERSION;
-#endif /* CHARSET_CONVERSION */
+#endif /* !CHARSET_CONVERSION */
 
 	if (contains_8bit && mime_7bit)
 		errors_catbp |= CA_ERROR_BAD_ENCODING;
@@ -1434,16 +1471,17 @@ setup_check_article_screen(
 static int
 post_loop(
 	int type,				/* type of posting */
-	struct t_group *psGrp,
-	char ch,				/* default prompt char */
-	const char *posting_msg,/* displayed just prior to article submission */
+	struct t_group *group,
+	t_function func,
+	const char *posting_msg, /* displayed just prior to article submission */
 	int art_type,			/* news, mail etc. */
 	int offset)				/* editor start offset */
 {
 	char a_message_id[HEADER_LEN];	/* Message-ID of the article if known */
 	int ret_code = POSTED_NONE;
-	long artchanged = 0L;		/* artchanged work was not done in post_postponed_article */
 	int i = 1;
+	long artchanged;		/* artchanged work was not done in post_postponed_article */
+	struct t_group *ogroup = curr_group;
 	t_bool art_unchanged;
 
 	a_message_id[0] = '\0';
@@ -1451,90 +1489,96 @@ post_loop(
 	forever {
 post_article_loop:
 		art_unchanged = FALSE;
-		switch (ch) {
-			case iKeyPostEdit:
-				/* This was VERY different in repost_article
-				 * Code existed to recheck subject and restart editor, but
-				 * is not enabled
+		switch (func) {
+			case POST_EDIT:
+				/*
+				 * This was VERY different in repost_article Code existed to
+				 * recheck subject and restart editor, but is not enabled
 				 */
-				artchanged = FILE_CHANGED(article);
-				if (!invoke_editor(article, offset))
+				artchanged = file_mtime(article_name);
+				if (!invoke_editor(article_name, offset)) {
+					if (file_size(article_name) > 0L) {
+						if (artchanged != file_mtime(article_name)) {
+							unlink(backup_article_name(article_name));
+							rename_file(article_name, dead_article);
+							if (tinrc.keep_dead_articles)
+								append_file(dead_articles, dead_article);
+						}
+					}
 					goto post_article_postponed;
+				}
 				ret_code = POSTED_REDRAW;
 
 				/* This might be erroneous with posting postponed */
-				if (file_size(article) > 0L) {
-					if (artchanged == FILE_CHANGED(article))
+				if (file_size(article_name) > 0L) {
+					if (artchanged == file_mtime(article_name))
 						art_unchanged = TRUE;
-					while ((i = check_article_to_be_posted(article, art_type, &psGrp, art_unchanged)) == 1 && repair_article(&ch, psGrp))
+					while ((i = check_article_to_be_posted(article_name, art_type, &group, art_unchanged)) == 1 && repair_article(&func, group))
 						;
-					if (ch == iKeyPostEdit || ch == iKeyOptionMenu)
+					if (func == POST_EDIT || func == GLOBAL_OPTION_MENU)
 						break;
 				}
 				/* FALLTHROUGH */
 
-			case iKeyQuit:
-			case iKeyAbort:
+			case GLOBAL_QUIT:
+			case GLOBAL_ABORT:
 				if (tinrc.unlink_article) {
-#if 0 /* usefull */
+#if 0 /* usefull? */
 					if (tinrc.keep_dead_articles)
-						 append_file(dead_articles, dead_article);
+						append_file(dead_articles, dead_article);
 #endif /* 0 */
-					unlink(article);
+					unlink(article_name);
 				}
 				clear_message();
 				return ret_code;
 
-			case iKeyOptionMenu:
-				(void) change_config_file(psGrp);
-				while ((i = check_article_to_be_posted(article, art_type, &psGrp, art_unchanged) == 1) && repair_article(&ch, psGrp))
+			case GLOBAL_OPTION_MENU:
+				(void) change_config_file(group);
+				while ((i = check_article_to_be_posted(article_name, art_type, &group, art_unchanged) == 1) && repair_article(&func, group))
 					;
 				break;
 
 #ifdef HAVE_ISPELL
-			case iKeyPostIspell:
-				invoke_ispell(article, psGrp);
+			case POST_ISPELL:
+				invoke_ispell(article_name, group);
 				ret_code = POSTED_REDRAW; /* not all versions did this */
 				break;
 #endif /* HAVE_ISPELL */
 
 #ifdef HAVE_PGP_GPG
-			case iKeyPostPGP:
-				invoke_pgp_news(article);
+			case POST_PGP:
+				invoke_pgp_news(article_name);
 				break;
 #endif /* HAVE_PGP_GPG */
 
-			case iKeyPost:
-			case iKeyPostPost2:
-			case iKeyPostPost3:
+			case GLOBAL_POST:
 				wait_message(0, posting_msg);
-				backup_article(article);
+				backup_article(article_name);
 
 				/* Functions that didn't handle mail didn't do this */
 				if (art_type == GROUP_TYPE_NEWS) {
-					if (submit_news_file(article, psGrp, a_message_id))
+					if (submit_news_file(article_name, group, a_message_id))
 						ret_code = POSTED_OK;
 				} else {
-					if (submit_mail_file(article, psGrp)) /* mailing_list */
+					if (submit_mail_file(article_name, group, NULL, FALSE)) /* mailing_list */
 						ret_code = POSTED_OK;
 				}
 
 				if (ret_code == POSTED_OK) {
-					unlink(backup_article_name(article));
+					unlink(backup_article_name(article_name));
 					wait_message(2, _(txt_art_posted), *a_message_id ? a_message_id : "");
 					goto post_article_done;
 				} else {
-					if ((ch = prompt_rejected()) == iKeyPostPostpone)
+					if ((func = prompt_rejected()) == POST_POSTPONE)
 						/* reuse clean copy which didn't get modified by submit_news_file() */
-						postpone_article(backup_article_name(article));
-					else if (ch == iKeyPostEdit) {
+						postpone_article(backup_article_name(article_name));
+					else if (func == POST_EDIT) {
 						/* replace modified article with clean backup */
-						rename_file(backup_article_name(article), article);
-						ch = iKeyPostEdit;
+						rename_file(backup_article_name(article_name), article_name);
 						goto post_article_loop;
 					} else {
-						unlink(backup_article_name(article));
-						rename_file(article, dead_article);
+						unlink(backup_article_name(article_name));
+						rename_file(article_name, dead_article);
 						if (tinrc.keep_dead_articles)
 							append_file(dead_articles, dead_article);
 						wait_message(2, _(txt_art_rejected), dead_article);
@@ -1542,8 +1586,8 @@ post_article_loop:
 				return ret_code;
 				}
 
-			case iKeyPostPostpone:
-				postpone_article(article);
+			case POST_POSTPONE:
+				postpone_article(article_name);
 				goto post_article_postponed;
 
 			default:
@@ -1560,20 +1604,21 @@ post_article_loop:
 			char keypgp[MAXKEYLEN];
 #endif /* HAVE_PGP_GPG */
 
-			ch = prompt_slk_response((i ? iKeyPostEdit : art_unchanged ? iKeyPostPostpone : iKeyPostPost3),
-					&menukeymap.post_post, _(txt_quit_edit_post),
-					printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.post_post)),
-					printascii(keyedit, map_to_local(iKeyPostEdit, &menukeymap.post_post)),
+			func = prompt_slk_response((i ? POST_EDIT : art_unchanged ? POST_POSTPONE : GLOBAL_POST),
+					post_post_keys, _(txt_quit_edit_post),
+					printascii(keyquit, func_to_key(GLOBAL_QUIT, post_post_keys)),
+					printascii(keyedit, func_to_key(POST_EDIT, post_post_keys)),
 #ifdef HAVE_ISPELL
-					printascii(keyispell, map_to_local(iKeyPostIspell, &menukeymap.post_post)),
+					printascii(keyispell, func_to_key(POST_ISPELL, post_post_keys)),
 #endif /* HAVE_ISPELL */
 #ifdef HAVE_PGP_GPG
-					printascii(keypgp, map_to_local(iKeyPostPGP, &menukeymap.post_post)),
+					printascii(keypgp, func_to_key(POST_PGP, post_post_keys)),
 #endif /* HAVE_PGP_GPG */
-					printascii(keymenu, map_to_local(iKeyOptionMenu, &menukeymap.post_post)),
-					printascii(keypost, map_to_local(iKeyPostPost3, &menukeymap.post_post)),
-					printascii(keypostpone, map_to_local(iKeyPostPostpone, &menukeymap.post_post)));
+					printascii(keymenu, func_to_key(GLOBAL_OPTION_MENU, post_post_keys)),
+					printascii(keypost, func_to_key(GLOBAL_POST, post_post_keys)),
+					printascii(keypostpone, func_to_key(POST_POSTPONE, post_post_keys)));
 		} else {
+			char *smsg;
 			char buf[LEN];
 			char keyedit[MAXKEYLEN], keypost[MAXKEYLEN];
 			char keypostpone[MAXKEYLEN], keyquit[MAXKEYLEN];
@@ -1586,22 +1631,23 @@ post_article_loop:
 #endif /* HAVE_PGP_GPG */
 
 			snprintf(buf, sizeof(buf), _(txt_quit_edit_xpost),
-							printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.post_post)),
-							printascii(keyedit, map_to_local(iKeyPostEdit, &menukeymap.post_post)),
+					printascii(keyquit, func_to_key(GLOBAL_QUIT, post_post_keys)),
+					printascii(keyedit, func_to_key(POST_EDIT, post_post_keys)),
 #ifdef HAVE_ISPELL
-							printascii(keyispell, map_to_local(iKeyPostIspell, &menukeymap.post_post)),
+					printascii(keyispell, func_to_key(POST_ISPELL, post_post_keys)),
 #endif /* HAVE_ISPELL */
 #ifdef HAVE_PGP_GPG
-							printascii(keypgp, map_to_local(iKeyPostPGP, &menukeymap.post_post)),
+					printascii(keypgp, func_to_key(POST_PGP, post_post_keys)),
 #endif /* HAVE_PGP_GPG */
-							printascii(keymenu, map_to_local(iKeyOptionMenu, &menukeymap.post_post)),
-							printascii(keypost, map_to_local(iKeyPostPost3, &menukeymap.post_post)),
-							printascii(keypostpone, map_to_local(iKeyPostPostpone, &menukeymap.post_post)));
+					printascii(keymenu, func_to_key(GLOBAL_OPTION_MENU, post_post_keys)),
+					printascii(keypost, func_to_key(GLOBAL_POST, post_post_keys)),
+					printascii(keypostpone, func_to_key(POST_POSTPONE, post_post_keys)));
 
 			/* Superfluous force_command stuff not used in current code */
-			ch = ( /* force_command ? ch_default : */ prompt_slk_response(ch,
-						&menukeymap.post_post, "%s", sized_message(buf,
+			func = ( /* force_command ? ch_default : */ prompt_slk_response(func,
+						post_post_keys, "%s", sized_message(&smsg, buf,
 						"" /* TODO: was note_h.subj */ )));
+			free(smsg);
 		}
 	}
 
@@ -1612,10 +1658,10 @@ post_article_done:
 
 		memset(&header, 0, sizeof(struct t_header));
 
-		if ((art_fp = fopen(article, "r")) == NULL)
-			perror_message(_(txt_cannot_open), article);
+		if ((art_fp = fopen(article_name, "r")) == NULL)
+			perror_message(_(txt_cannot_open), article_name);
 		else {
-			curr_group = psGrp;
+			curr_group = group;
 			parse_rfc822_headers(&header, art_fp, NULL);
 			fclose(art_fp);
 		}
@@ -1637,8 +1683,8 @@ post_article_done:
 			 * FIXME: This logic is faithful to the original, but awful
 			 */
 			if (art_type == GROUP_TYPE_NEWS && tinrc.add_posted_to_filter && (type == POST_QUICK || type == POST_POSTPONED || type == POST_NORMAL)) {
-				if ((psGrp = group_find(header.newsgroups)) && (type != POST_POSTPONED || (type == POST_POSTPONED && !strchr(header.newsgroups, ',')))) {
-					quick_filter_select_posted_art(psGrp, header.subj, a_message_id);
+				if ((group = group_find(header.newsgroups)) && (type != POST_POSTPONED || (type == POST_POSTPONED && !strchr(header.newsgroups, ',')))) {
+					quick_filter_select_posted_art(group, header.subj, a_message_id);
 					if (type == POST_QUICK || (type == POST_POSTPONED && post_postponed_and_exit))
 						write_filter_file(filter_file);
 				}
@@ -1689,10 +1735,10 @@ post_article_done:
 			 * log Message-ID if given in a_message_id,
 			 * add Date:, remove empty headers
 			 */
-			add_headers(article, a_message_id);
-			if (!strfpath(posted_msgs_file, a_mailbox, sizeof(a_mailbox), psGrp))
+			add_headers(article_name, a_message_id);
+			if (!strfpath(posted_msgs_file, a_mailbox, sizeof(a_mailbox), group))
 				STRCPY(a_mailbox, posted_msgs_file);
-			if (!append_mail(article, userid, a_mailbox)) {
+			if (!append_mail(article_name, userid, a_mailbox)) {
 				/* TODO: error message */
 			}
 		}
@@ -1700,8 +1746,9 @@ post_article_done:
 	}
 
 post_article_postponed:
+	curr_group = ogroup;
 	if (tinrc.unlink_article)
-		unlink(article);
+		unlink(article_name);
 
 	return ret_code;
 }
@@ -1719,38 +1766,38 @@ check_moderated(
 	int *art_type,
 	const char *failmsg)
 {
-	char *group;
+	char *groupname;
 	char newsgroups[HEADER_LEN];
-	struct t_group *psGrp;
-	struct t_group *psretGrp = NULL;
+	struct t_group *group;
+	struct t_group *first_group = NULL;
 	int vnum = 0, bnum = 0;
 
 	/* Take copy - strtok() modifies its args */
 	STRCPY(newsgroups, groups);
 
-	group = strtok(newsgroups, ",");
+	groupname = strtok(newsgroups, ",");
 
 	do {
 		vnum++; /* number of newsgroups */
 
-		if (!(psGrp = group_find(group))) {
+		if (!(group = group_find(groupname))) {
 			bnum++;	/* number of bogus groups */
 			continue;
 		}
 
-		if (!psretGrp)				/* Save ptr to the 1st group */
-			psretGrp = psGrp;
+		if (!first_group)				/* Save ptr to the 1st group */
+			first_group = group;
 
 		/*
 		 * Testing for !attribute here is a useful check for other brokenness
 		 * Generally only bogus groups should have no attributes
 		 */
-		if (psGrp->bogus) {
-			error_message(_("%s is bogus"), group);
+		if (group->bogus) {
+			error_message(_(txt_group_bogus), groupname);
 			return NULL;
 		}
 
-		if (psGrp->attribute->mailing_list != NULL)
+		if (group->attribute->mailing_list != NULL)
 			*art_type = GROUP_TYPE_MAIL;
 
 		if (!can_post && *art_type == GROUP_TYPE_NEWS) {
@@ -1758,25 +1805,27 @@ check_moderated(
 			return NULL;
 		}
 
-		if (psGrp->moderated == 'x' || psGrp->moderated == 'n') {
-			error_message(_(txt_cannot_post_group), psGrp->name);
+		if (group->moderated == 'x' || group->moderated == 'n') {
+			error_message(_(txt_cannot_post_group), group->name);
 			return NULL;
 		}
 
-		if (psGrp->moderated == 'm') {
-			snprintf(mesg, sizeof(mesg), _(txt_group_is_moderated), group);
-			if (prompt_yn(cLINES, mesg, TRUE) != 1) {
+		if (group->moderated == 'm') {
+			char *prompt = fmt_string(_(txt_group_is_moderated), groupname);
+			if (prompt_yn(prompt, TRUE) != 1) {
 /*				Raw(FALSE); */
 				error_message(failmsg);
+				free(prompt);
 				return NULL;
 			}
+			free(prompt);
 		}
-	} while ((group = strtok(NULL, ",")) != NULL);
+	} while ((groupname = strtok(NULL, ",")) != NULL);
 
 	if (vnum > bnum)
-		return psretGrp;
+		return first_group;
 	else {
-		error_message(_(txt_not_in_active_file), group);
+		error_message(_(txt_not_in_active_file), groupname);
 		return NULL;
 	}
 }
@@ -1789,34 +1838,38 @@ check_moderated(
  */
 static t_bool
 create_normal_article_headers(
-	struct t_group *psGrp,
+	struct t_group *group,
 	const char *newsgroups,
 	int art_type)
 {
 	FILE *fp;
 	char from_name[HEADER_LEN];
+#ifdef FORGERY
 	char tmp[HEADER_LEN];
+#endif /* FORGERY */
+	char *prompt, *tmp2;
 
-	/* TODO: combine with other code in tin that does the ... truncation? */
 	/* Get subject for posting article - Limit the display if needed */
-	if (strlen(tinrc.default_post_subject) > DISPLAY_SUBJECT_LEN)
-		sprintf(tmp, "%.*s ...", DISPLAY_SUBJECT_LEN, tinrc.default_post_subject);
-	else
-		strncpy(tmp, tinrc.default_post_subject, sizeof(tmp) - 1);
+	tmp2 = strunc(tinrc.default_post_subject, DISPLAY_SUBJECT_LEN);
 
-	snprintf(mesg, sizeof(mesg), _(txt_post_subject), tmp);
+	prompt = fmt_string(_(txt_post_subject), tmp2);
 
-	if (!(prompt_string_default(mesg, tinrc.default_post_subject, _(txt_no_subject), HIST_POST_SUBJECT)))
+	if (!(prompt_string_default(prompt, tinrc.default_post_subject, _(txt_no_subject), HIST_POST_SUBJECT))) {
+		free(prompt);
+		free(tmp2);
 		return FALSE;
+	}
+	free(prompt);
+	free(tmp2);
 
-	if ((fp = fopen(article, "w")) == NULL) {
-		perror_message(_(txt_cannot_open), article);
+	if ((fp = fopen(article_name, "w")) == NULL) {
+		perror_message(_(txt_cannot_open), article_name);
 		return FALSE;
 	}
 
 	fchmod(fileno(fp), (mode_t) (S_IRUSR|S_IWUSR));
 
-	get_from_name(from_name, psGrp);
+	get_from_name(from_name, group);
 #ifdef FORGERY
 	make_path_header(tmp);
 	msg_add_header("Path", tmp);
@@ -1825,14 +1878,14 @@ create_normal_article_headers(
 	msg_add_header("Subject", tinrc.default_post_subject);
 
 	if (art_type == GROUP_TYPE_MAIL)
-		msg_add_header("To", psGrp->attribute->mailing_list);
+		msg_add_header("To", group->attribute->mailing_list);
 	else {
 		msg_add_header("Newsgroups", newsgroups);
 		ADD_MSG_ID_HEADER();
 	}
 
-	if (psGrp->attribute->followup_to != NULL && art_type == GROUP_TYPE_NEWS)
-		msg_add_header("Followup-To", psGrp->attribute->followup_to);
+	if (group->attribute->followup_to != NULL && art_type == GROUP_TYPE_NEWS)
+		msg_add_header("Followup-To", group->attribute->followup_to);
 	else {
 		if (tinrc.prompt_followupto)
 			msg_add_header("Followup-To", "");
@@ -1841,8 +1894,8 @@ create_normal_article_headers(
 	if (*reply_to)
 		msg_add_header("Reply-To", reply_to);
 
-	if (psGrp->attribute->organization != NULL)
-		msg_add_header("Organization", random_organization(psGrp->attribute->organization));
+	if (group->attribute->organization != NULL)
+		msg_add_header("Organization", random_organization(group->attribute->organization));
 
 	if (*my_distribution && art_type == GROUP_TYPE_NEWS)
 		msg_add_header("Distribution", my_distribution);
@@ -1850,15 +1903,15 @@ create_normal_article_headers(
 	msg_add_header("Summary", "");
 	msg_add_header("Keywords", "");
 
-	msg_add_x_headers(psGrp->attribute->x_headers);
+	msg_add_x_headers(group->attribute->x_headers);
 
 	start_line_offset = msg_write_headers(fp) + 1;
 	fprintf(fp, "\n");			/* add a newline to keep vi from bitching */
 	msg_free_headers();
 
-	start_line_offset += msg_add_x_body(fp, psGrp->attribute->x_body);
+	start_line_offset += msg_add_x_body(fp, group->attribute->x_body);
 
-	msg_write_signature(fp, FALSE, psGrp);
+	msg_write_signature(fp, FALSE, group);
 	fclose(fp);
 	cursoron();
 	return TRUE;
@@ -1874,7 +1927,7 @@ quick_post_article(
 {
 	char buf[HEADER_LEN];
 	int art_type = GROUP_TYPE_NEWS;
-	struct t_group *psGrp;
+	struct t_group *group;
 
 	msg_init_headers();
 	ClearScreen();
@@ -1893,7 +1946,7 @@ quick_post_article(
 	/*
 	 * Get groupname
 	 */
-	sprintf(buf, _(txt_post_newsgroups), tinrc.default_post_newsgroups);
+	snprintf(buf, sizeof(buf), _(txt_post_newsgroups), tinrc.default_post_newsgroups);
 	if (!(prompt_string_default(buf, tinrc.default_post_newsgroups, _(txt_no_newsgroups), HIST_POST_NEWSGROUPS)))
 		return;
 
@@ -1905,13 +1958,13 @@ quick_post_article(
 	/*
 	 * Check/see if any of the newsgroups are not postable.
 	 */
-	if ((psGrp = check_moderated(tinrc.default_post_newsgroups, &art_type, _(txt_exiting))) == NULL)
+	if ((group = check_moderated(tinrc.default_post_newsgroups, &art_type, _(txt_exiting))) == NULL)
 		return;
 
-	if (!create_normal_article_headers(psGrp, tinrc.default_post_newsgroups, art_type))
+	if (!create_normal_article_headers(group, tinrc.default_post_newsgroups, art_type))
 		return;
 
-	post_loop(POST_QUICK, psGrp, iKeyPostEdit, _(txt_posting), art_type, start_line_offset);
+	post_loop(POST_QUICK, group, POST_EDIT, _(txt_posting), art_type, start_line_offset);
 }
 
 
@@ -1924,9 +1977,9 @@ post_postponed_article(
 	const char *subject,
 	const char *newsgroups)
 {
-	char buf[LEN];
 	char *ng;
 	char *p;
+	char buf[LEN];
 
 	if (!can_post) {
 		info_message(_(txt_cannot_post));
@@ -1937,8 +1990,8 @@ post_postponed_article(
 	if ((p = strchr(ng, ',')) != NULL)
 		*p = '\0';
 
-	sprintf(buf, _("Posting: %.*s ..."), (int) (cCOLS - 14), subject);
-	post_loop(POST_POSTPONED, group_find(ng), (ask ? iKeyPostEdit : iKeyPostPost3), buf, GROUP_TYPE_NEWS, 0);
+	snprintf(buf, sizeof(buf), _("Posting: %.*s ..."), cCOLS - 14, subject); /* TODO: -> lang.c, use strunc() */
+	post_loop(POST_POSTPONED, group_find(ng), (ask ? POST_EDIT : GLOBAL_POST), buf, GROUP_TYPE_NEWS, 0);
 	free(ng);
 	return;
 }
@@ -1979,7 +2032,7 @@ fetch_postponed_article(
 {
 	FILE *in, *out;
 	FILE *tmp;
-	char *bufp = (char *) 0;
+	char *bufp = NULL;
 	char postponed_tmp[PATH_LEN];
 	char line[HEADER_LEN];
 	t_bool first_article;
@@ -2080,12 +2133,12 @@ pickup_postponed_articles(
 	t_bool ask,
 	t_bool all)
 {
-	char ch = 0;
 	char newsgroups[HEADER_LEN];
 	char subject[HEADER_LEN];
 	char question[HEADER_LEN];
 	int count = count_postponed_articles();
 	int i;
+	t_function func;
 
 	if (!count) {
 		if (!ask)
@@ -2095,52 +2148,58 @@ pickup_postponed_articles(
 
 	snprintf(question, sizeof(question), _(txt_prompt_see_postponed), count);
 
-	if (ask && prompt_yn(cLINES, question, TRUE) != 1)
+	if (ask && prompt_yn(question, TRUE) != 1)
 		return FALSE;
 
 	for (i = 0; i < count; i++) {
-		if (!fetch_postponed_article(article, subject, newsgroups))
+		if (!fetch_postponed_article(article_name, subject, newsgroups))
 			return TRUE;
 
 		if (!all) {
+			char *smsg;
 			char buf[LEN];
 			char keyall[MAXKEYLEN], keyno[MAXKEYLEN], keyoverride[MAXKEYLEN];
 			char keyquit[MAXKEYLEN], keyyes[MAXKEYLEN];
 
 			snprintf(buf, sizeof(buf), _(txt_postpone_repost),
-							printascii(keyyes, map_to_local(iKeyPromptYes, &menukeymap.post_postpone)),
-							printascii(keyoverride, map_to_local(iKeyPostponeOverride, &menukeymap.post_postpone)),
-							printascii(keyall, map_to_local(iKeyPostponeAll, &menukeymap.post_postpone)),
-							printascii(keyno, map_to_local(iKeyPromptNo, &menukeymap.post_postpone)),
-							printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.post_postpone)));
-
-			ch = prompt_slk_response(iKeyPromptYes, &menukeymap.post_postpone,
-					"%s", sized_message(buf, subject));
+					printascii(keyyes, func_to_key(PROMPT_YES, post_postpone_keys)),
+					printascii(keyoverride, func_to_key(POSTPONE_OVERRIDE, post_postpone_keys)),
+					printascii(keyall, func_to_key(POSTPONE_ALL, post_postpone_keys)),
+					printascii(keyno, func_to_key(PROMPT_NO, post_postpone_keys)),
+					printascii(keyquit, func_to_key(GLOBAL_QUIT, post_postpone_keys)));
+
+			func = prompt_slk_response(PROMPT_YES, post_postpone_keys,
+					"%s", sized_message(&smsg, buf, subject));
+			free(smsg);
 
-			if (ch == iKeyPostponeAll)
+			if (func == POSTPONE_ALL)
 				all = TRUE;
 		}
 
 		/* No else here since all changes in previous if */
 		if (all)
-			ch = iKeyPostponeOverride;
+			func = POSTPONE_OVERRIDE;
 
-		switch (ch) {
-			case iKeyPromptYes:
-			case iKeyPostponeOverride:
-				post_postponed_article(ch == iKeyPromptYes, subject, newsgroups);
+		switch (func) {
+			case PROMPT_YES:
+			case POSTPONE_OVERRIDE:
+				post_postponed_article(func == PROMPT_YES, subject, newsgroups);
 				Raw(TRUE);
 				break;
 
-			case iKeyPromptNo:
-			case iKeyQuit:
-			case iKeyAbort:
-				if (!append_mail(article, userid, postponed_articles_file)) {
+			case PROMPT_NO:
+			case GLOBAL_QUIT:
+			case GLOBAL_ABORT:
+				if (!append_mail(article_name, userid, postponed_articles_file)) {
 					/* TODO: : error -message */
 				}
-				unlink(article);
-				if (ch != iKeyPromptNo)
+				unlink(article_name);
+				if (func != PROMPT_NO)
 					return TRUE;
+				break;
+
+			default:
+				break;
 		}
 	}
 	return TRUE;
@@ -2163,10 +2222,10 @@ postpone_article(
  */
 t_bool
 post_article(
-	const char *group)
+	const char *groupname)
 {
 	int art_type = GROUP_TYPE_NEWS;
-	struct t_group *psGrp;
+	struct t_group *group;
 	t_bool redraw_screen = FALSE;
 
 	msg_init_headers();
@@ -2174,13 +2233,13 @@ post_article(
 	/*
 	 * Check that we can post to all the groups we want to
 	 */
-	if ((psGrp = check_moderated(group, &art_type, "")) == NULL)
+	if ((group = check_moderated(groupname, &art_type, "")) == NULL)
 		return redraw_screen;
 
-	if (!create_normal_article_headers(psGrp, group, art_type))
+	if (!create_normal_article_headers(group, groupname, art_type))
 		return redraw_screen;
 
-	return (post_loop(POST_NORMAL, psGrp, iKeyPostEdit, _(txt_posting), art_type, start_line_offset) != POSTED_NONE);
+	return (post_loop(POST_NORMAL, group, POST_EDIT, _(txt_posting), art_type, start_line_offset) != POSTED_NONE);
 }
 
 
@@ -2285,12 +2344,12 @@ is_crosspost(
 
 
 /*
- * Widespread news software like INN's nnrpd restricts the size of several
- * headers, notably the references header, to 512 characters. Oh well...
- * guess that's what son of RFC 1036 calls a "desperate last resort" :-/
- * From TIN's point of view, this could be HEADER_LEN.
+ * with folding there would not be a length limit, but currently we don't do
+ * folding and some of our code has a 2048 byte limit.  also there are
+ * several newsservers out there which do have some length limit, so
+ * shortening to 998 is a good idea.
  */
-#define MAXREFSIZE 512
+#define MAXREFSIZE 998
 
 
 /*
@@ -2322,12 +2381,12 @@ join_references(
 	 */
 	char *b, *c, *d;
 	const char *e;
-	int space;
+	int space = 0;
 
 	b = my_malloc(strlen(oldrefs) + strlen(newref) + 64);
 	c = b;
 	e = oldrefs;
-	space = 0;
+
 	while (*e) {
 		if (*e == ' ') {
 			space++, *c++ = ' ', e++;	/* keep existing spaces */
@@ -2405,26 +2464,27 @@ join_references(
 
 int /* return code is currently ignored! */
 post_response(
-	const char *group,
+	const char *groupname,
 	int respnum,
 	t_bool copy_text,
 	t_bool with_headers,
 	t_bool raw_data)
 {
 	FILE *fp;
-	char ch, *ptr;
+	char *ptr;
 	char bigbuf[HEADER_LEN];
 	char buf[HEADER_LEN];
 	char from_name[HEADER_LEN];
 	char initials[64];
 	int art_type = GROUP_TYPE_NEWS;
 	int ret_code = POSTED_NONE;
-	struct t_group *psGrp;
+	struct t_group *group;
 	struct t_header note_h = pgart.hdr;
 	t_bool use_followup_to = TRUE;
 #ifdef FORGERY
 	char line[HEADER_LEN];
 #endif /* FORGERY */
+	t_function func;
 
 	msg_init_headers();
 	wait_message(0, _(txt_post_a_followup));
@@ -2440,26 +2500,26 @@ post_response(
 		char keymail[MAXKEYLEN], keypost[MAXKEYLEN], keyquit[MAXKEYLEN];
 
 /*		clear_message(); */
-		ch = prompt_slk_response(iKeyPageMail, &menukeymap.post_mail_fup,
-				_(txt_resp_to_poster),
-				printascii(keymail, map_to_local(iKeyPostMail, &menukeymap.post_mail_fup)),
-				printascii(keypost, map_to_local(iKeyPostPost3, &menukeymap.post_mail_fup)),
-				printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.post_mail_fup)));
-		switch (ch) {
-			case iKeyPost:
-			case iKeyPostPost2:
-			case iKeyPostPost3:
+		func = prompt_slk_response(PAGE_MAIL, post_mail_fup_keys, _(txt_resp_to_poster),
+				printascii(keymail, func_to_key(POST_MAIL, post_mail_fup_keys)),
+				printascii(keypost, func_to_key(GLOBAL_POST, post_mail_fup_keys)),
+				printascii(keyquit, func_to_key(GLOBAL_QUIT, post_mail_fup_keys)));
+		switch (func) {
+			case GLOBAL_POST:
 				use_followup_to = FALSE;
 				break;
 
-			case iKeyQuit:
-			case iKeyAbort:
+			case GLOBAL_QUIT:
+			case GLOBAL_ABORT:
 				return ret_code;
 
+			case POST_MAIL:
+				return mail_to_author(groupname, respnum, copy_text, with_headers, FALSE);
+
 			default:
-				return mail_to_author(group, respnum, copy_text, with_headers, FALSE);
+				break;
 		}
-	} else if (note_h.followup && strcmp(note_h.followup, group) != 0
+	} else if (note_h.followup && strcmp(note_h.followup, groupname) != 0
 			&& strcmp(note_h.followup, note_h.newsgroups) != 0) {
 		char keyignore[MAXKEYLEN], keypost[MAXKEYLEN], keyquit[MAXKEYLEN];
 
@@ -2491,37 +2551,35 @@ post_response(
 		}
 		my_flush();
 
-		ch = prompt_slk_response(iKeyPostPost3, &menukeymap.post_ignore_fupto,
-					_(txt_prompt_fup_ignore),
-					printascii(keypost, map_to_local(iKeyPostPost3, &menukeymap.post_ignore_fupto)),
-					printascii(keyignore, map_to_local(iKeyPostIgnore, &menukeymap.post_ignore_fupto)),
-					printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.post_ignore_fupto)));
-		switch (ch) {
-			case iKeyQuit:
-			case iKeyAbort:
+		func = prompt_slk_response(GLOBAL_POST, post_ignore_fupto_keys,
+				_(txt_prompt_fup_ignore),
+				printascii(keypost, func_to_key(GLOBAL_POST, post_ignore_fupto_keys)),
+				printascii(keyignore, func_to_key(POST_IGNORE_FUPTO, post_ignore_fupto_keys)),
+				printascii(keyquit, func_to_key(GLOBAL_QUIT, post_ignore_fupto_keys)));
+		switch (func) {
+			case GLOBAL_QUIT:
+			case GLOBAL_ABORT:
 				return ret_code;
 
-			case iKeyPostIgnore:
+			case POST_IGNORE_FUPTO:
 				use_followup_to = FALSE;
 				break;
 
-			case iKeyPost:
-			case iKeyPostPost2:
-			case iKeyPostPost3:
+			case GLOBAL_POST:
 			default:
 				break;
 		}
 	}
 
-	if ((fp = fopen(article, "w")) == NULL) {
-		perror_message(_(txt_cannot_open), article);
+	if ((fp = fopen(article_name, "w")) == NULL) {
+		perror_message(_(txt_cannot_open), article_name);
 		return ret_code;
 	}
 
 	fchmod(fileno(fp), (mode_t) (S_IRUSR|S_IWUSR));
 
-	psGrp = group_find(group);
-	get_from_name(from_name, psGrp);
+	group = group_find(groupname);
+	get_from_name(from_name, group);
 #ifdef FORGERY
 	make_path_header(line);
 	msg_add_header("Path", line);
@@ -2533,24 +2591,23 @@ post_response(
 	msg_add_header("Subject", bigbuf);
 	free(ptr);
 
-	if (psGrp && psGrp->attribute->x_comment_to && note_h.from)
+	if (group && group->attribute->x_comment_to && note_h.from)
 		msg_add_header("X-Comment-To", note_h.from);
 	if (note_h.followup && use_followup_to) {
 		msg_add_header("Newsgroups", note_h.followup);
 		if (tinrc.prompt_followupto)
 			msg_add_header("Followup-To", (strchr(note_h.followup, ',') != NULL) ? note_h.followup : "");
 	} else {
-		if (psGrp && psGrp->attribute->mailing_list) {
-			msg_add_header("To", psGrp->attribute->mailing_list);
+		if (group && group->attribute->mailing_list) {
+			msg_add_header("To", group->attribute->mailing_list);
 			art_type = GROUP_TYPE_MAIL;
 		} else {
 			msg_add_header("Newsgroups", note_h.newsgroups);
 			if (tinrc.prompt_followupto)
-				msg_add_header("Followup-To",
-				(strchr(note_h.newsgroups, ',') != NULL) ? note_h.newsgroups : "");
-			if (psGrp && psGrp->attribute->followup_to != NULL) {
-				msg_add_header("Followup-To", psGrp->attribute->followup_to);
-			} else {
+				msg_add_header("Followup-To", (strchr(note_h.newsgroups, ',') != NULL) ? note_h.newsgroups : "");
+			if (group && group->attribute->followup_to != NULL)
+				msg_add_header("Followup-To", group->attribute->followup_to);
+			else {
 				if ((ptr = strchr(note_h.newsgroups, ',')))
 					msg_add_header("Followup-To", note_h.newsgroups);
 			}
@@ -2566,8 +2623,8 @@ post_response(
 	} else
 		msg_add_header("References", note_h.messageid);
 
-	if (psGrp && psGrp->attribute->organization != NULL)
-		msg_add_header("Organization", random_organization(psGrp->attribute->organization));
+	if (group && group->attribute->organization != NULL)
+		msg_add_header("Organization", random_organization(group->attribute->organization));
 
 	if (*reply_to)
 		msg_add_header("Reply-To", reply_to);
@@ -2580,17 +2637,17 @@ post_response(
 			msg_add_header("Distribution", my_distribution);
 	}
 
-	msg_add_x_headers(psGrp->attribute->x_headers);
+	msg_add_x_headers(group->attribute->x_headers);
 
 	start_line_offset = msg_write_headers(fp) + 1;
 	msg_free_headers();
-	start_line_offset += msg_add_x_body(fp, psGrp->attribute->x_body);
+	start_line_offset += msg_add_x_body(fp, group->attribute->x_body);
 
 	if (copy_text) {
 		if (arts[respnum].xref && is_crosspost(arts[respnum].xref)) {
-			if (strfquote(psGrp->name, respnum, buf, sizeof(buf), tinrc.xpost_quote_format))
+			if (strfquote(group->name, respnum, buf, sizeof(buf), tinrc.xpost_quote_format))
 				fprintf(fp, "%s\n", buf);
-		} else if (strfquote(group, respnum, buf, sizeof(buf), (psGrp && psGrp->attribute->news_quote_format != NULL) ? psGrp->attribute->news_quote_format : tinrc.news_quote_format))
+		} else if (strfquote(groupname, respnum, buf, sizeof(buf), (group && group->attribute->news_quote_format != NULL) ? group->attribute->news_quote_format : tinrc.news_quote_format))
 			fprintf(fp, "%s\n", buf);
 		start_line_offset++;
 
@@ -2609,7 +2666,7 @@ post_response(
 			fseek(pgart.raw, 0L, SEEK_SET);
 
 		if (with_headers && raw_data)
-			copy_body(pgart.raw, fp, (psGrp ? psGrp->attribute->quote_chars : tinrc.quote_chars), initials, TRUE);
+			copy_body(pgart.raw, fp, (group ? group->attribute->quote_chars : tinrc.quote_chars), initials, TRUE);
 		else {
 			if (raw_data) {
 				long offset = 0L;
@@ -2622,7 +2679,7 @@ post_response(
 						break;
 				}
 				fseek(pgart.raw, offset, SEEK_SET);
-				copy_body(pgart.raw, fp, (psGrp ? psGrp->attribute->quote_chars : tinrc.quote_chars), initials, TRUE);
+				copy_body(pgart.raw, fp, (group ? group->attribute->quote_chars : tinrc.quote_chars), initials, TRUE);
 			} else { /* cooked art */
 				resize_article(FALSE, &pgart);
 				if (with_headers) {
@@ -2643,20 +2700,20 @@ post_response(
 
 					fseek(pgart.cooked, pgart.cookl[i].offset, SEEK_SET); /* skip headers and header/body separator */
 				}
-				copy_body(pgart.cooked, fp, (psGrp ? psGrp->attribute->quote_chars : tinrc.quote_chars), initials, FALSE);
+				copy_body(pgart.cooked, fp, (group ? group->attribute->quote_chars : tinrc.quote_chars), initials, FALSE);
 			}
 		}
 	} else /* !copy_text */
 		fprintf(fp, "\n");	/* add a newline to keep vi from bitching */
 
-	msg_write_signature(fp, FALSE, psGrp);
+	msg_write_signature(fp, FALSE, group);
 	fclose(fp);
 
 	resize_article(TRUE, &pgart);	/* rebreak long lines */
 	if (raw_data)	/* we've been in raw mode, reenter it */
-		toggle_raw(psGrp);
+		toggle_raw(group);
 
-	return (post_loop(POST_RESPONSE, psGrp, iKeyPostEdit, _(txt_posting), art_type, start_line_offset));
+	return (post_loop(POST_RESPONSE, group, POST_EDIT, _(txt_posting), art_type, start_line_offset));
 }
 
 
@@ -2691,14 +2748,14 @@ create_mail_headers(
 
 	fchmod(fileno(fp), (mode_t) (S_IRUSR|S_IWUSR));
 
-	if (!tinrc.use_mailreader_i) {	/* tin should start editor */
+	if ((INTERACTIVE_NONE == tinrc.interactive_mailer) || (INTERACTIVE_WITH_HEADERS == tinrc.interactive_mailer)) {	/* tin should include headers for editing */
 		char from_buf[HEADER_LEN];
 		char *from_address;
 
-		if (!selmenu.max) /* called from select.c without any groups? */
+		if (curr_group && curr_group->attribute && curr_group->attribute->from && strlen(curr_group->attribute->from))
+			from_address = curr_group->attribute->from;
+		else /* i.e. called from select.c without any groups */
 			from_address = tinrc.mail_address;
-		else
-			from_address = CURR_GROUP.attribute->from;
 
 		if ((from_address == NULL) || !strlen(from_address)) {
 			get_from_name(from_buf, (struct t_group *) 0);
@@ -2729,6 +2786,9 @@ create_mail_headers(
 				msg_add_header("Bcc", strlen(from_address) ? from_address : userid);
 		}
 
+		if (curr_group && curr_group->attribute && curr_group->attribute->fcc && strlen(curr_group->attribute->fcc))
+			msg_add_header("Fcc", curr_group->attribute->fcc);
+
 		if (*default_organization)
 			msg_add_header("Organization", random_organization(default_organization));
 
@@ -2745,8 +2805,8 @@ create_mail_headers(
 			msg_add_header("X-Newsgroups", extra_hdrs->newsgroups);
 		}
 
-		if (selmenu.max && (CURR_GROUP.attribute->x_headers) != NULL)
-			msg_add_x_headers(CURR_GROUP.attribute->x_headers);
+		if (curr_group && curr_group->attribute && curr_group->attribute->x_headers && strlen(curr_group->attribute->x_headers))
+			msg_add_x_headers(curr_group->attribute->x_headers);
 	}
 	start_line_offset = msg_write_headers(fp) + 1;
 	msg_free_headers();
@@ -2763,36 +2823,42 @@ create_mail_headers(
 static int
 mail_loop(
 	const char *filename,		/* Temp. filename being used */
-	char ch,					/* default prompt char */
+	t_function func,		/* default function */
 	char *subject,
 	const char *groupname,		/* Newsgroup we are posting from */
-	const char *prompt)			/* If set, used for final query before posting */
+	const char *prompt,			/* If set, used for final query before posting */
+	FILE *articlefp)
 {
 	FILE *fp;
-#ifdef HAVE_PGP_GPG
-	char mail_to[HEADER_LEN];
-#endif /* HAVE_PGP_GPG */
 	int ret = POSTED_NONE;
-	long artchanged = 0L;
+	long artchanged;
 	struct t_header hdr;
 	struct t_group *group = (struct t_group *) 0;
+	t_bool is_changed = FALSE;
+#ifdef HAVE_PGP_GPG
+	char mail_to[HEADER_LEN];
+#endif /* HAVE_PGP_GPG */
 
 	if (groupname)
 		group = group_find(groupname);
 
 	forever {
-		switch (ch) {
-			case iKeyPostEdit:
-				artchanged = FILE_CHANGED(filename);
+		switch (func) {
+			case POST_EDIT:
+				artchanged = file_mtime(filename);
 
 				if (!(invoke_editor(filename, start_line_offset)))
 					return ret;
 
 				ret = POSTED_REDRAW;
-				if (((artchanged == FILE_CHANGED(filename)) && (prompt_yn(cLINES, _(txt_prompt_unchanged_mail), TRUE) > 0)) || (file_size(filename) <= 0L)) {
+				if (((artchanged == file_mtime(filename)) && (prompt_yn(_(txt_prompt_unchanged_mail), TRUE) > 0)) || (file_size(filename) <= 0L)) {
 					clear_message();
 					return ret;
 				}
+
+				if (artchanged != file_mtime(filename))
+					is_changed = TRUE;
+
 				if (!(fp = fopen(filename, "r"))) { /* Oops */
 					clear_message();
 					return ret;
@@ -2809,14 +2875,14 @@ mail_loop(
 				break;
 
 #ifdef HAVE_ISPELL
-			case iKeyPostIspell:
+			case POST_ISPELL:
 				invoke_ispell(filename, group);
 /*				ret = POSTED_REDRAW; TODO: is this needed, not that REDRAW does not imply OK */
 				break;
 #endif /* HAVE_ISPELL */
 
 #ifdef HAVE_PGP_GPG
-			case iKeyPostPGP:
+			case POST_PGP:
 				if (!(fp = fopen(filename, "r"))) { /* Oops */
 					clear_message();
 					return ret;
@@ -2830,34 +2896,34 @@ mail_loop(
 				break;
 #endif /* HAVE_PGP_GPG */
 
-			case iKeyQuit:
-			case iKeyAbort:
+			case GLOBAL_QUIT:
+			case GLOBAL_ABORT:
 				clear_message();
 				return ret;
 
-			case iKeyPostSend:
-			case iKeyPostSend2:
-			{
-				t_bool confirm = TRUE;
+			case POST_SEND:
+				{
+					t_bool confirm = TRUE;
 
-				if (prompt) {
-					clear_message();
-					if (prompt_yn(cLINES, prompt, FALSE) != 1)
-						confirm = FALSE;
-				}
+					if (prompt) {
+						clear_message();
+						if (prompt_yn(prompt, FALSE) != 1)
+							confirm = FALSE;
+					}
 
-				/* TODO: wrap article into message/rfc822? */
-				if (confirm && submit_mail_file(filename, group)) {
-					info_message(_(txt_articles_mailed), 1, _(txt_article_singular));
-					return POSTED_OK;
+					if (confirm && submit_mail_file(filename, group, articlefp, is_changed)) {
+						info_message(_(txt_articles_mailed), 1, _(txt_article_singular));
+						return POSTED_OK;
+					}
 				}
 				return ret;
-			}
+				/* NOTREACHED */
+				break;
 
 			default:
 				break;
 		}
-		ch = prompt_to_send(subject);
+		func = prompt_to_send(subject);
 	}
 
 	/* NOTREACHED */
@@ -2874,8 +2940,8 @@ add_mail_quote(
 	FILE *fp,
 	int respnum)
 {
-	char buf[HEADER_LEN];
 	char *s;
+	char buf[HEADER_LEN];
 	int line_count = 0;
 
 	if (strfquote(CURR_GROUP.name, respnum, buf, sizeof(buf), tinrc.mail_quote_format)) {
@@ -2902,35 +2968,37 @@ mail_to_someone(
 	const struct t_group *group)
 {
 	FILE *fp;
-	char ch = iKeyPostSend;
 	char nam[HEADER_LEN];
 	char subject[HEADER_LEN];
 	int ret_code = POSTED_NONE;
 	struct t_header note_h = artinfo->hdr;
+	t_bool mime_forward = group->attribute->mime_forward;
+	t_function func = POST_SEND;
 
 	clear_message();
 	snprintf(subject, sizeof(subject), "(fwd) %s\n", note_h.subj);
 
 	/*
 	 * don't add extra headers in the mail_to_someone() case as we include
-	 * the full original headers in the body of the mail
+	 * the full original headers in either the body of the mail or a separate
+	 * message/rfc822 MIME part.
 	 */
 	if ((fp = create_mail_headers(nam, TIN_LETTER_NAME, address, subject, NULL)) == NULL)
 		return ret_code;
 
-	rewind(artinfo->raw);
-	/* TODO: -> lang.c */
-	fprintf(fp, "-- forwarded message --\n");
-	copy_fp(artinfo->raw, fp);
-	/* TODO: -> lang.c */
-	fprintf(fp, "-- end of forwarded message --\n");
+	if (!mime_forward || INTERACTIVE_NONE != tinrc.interactive_mailer) {
+		rewind(artinfo->raw);
+		fprintf(fp, _(txt_forwarded));
+		copy_fp(artinfo->raw, fp);
+		fprintf(fp, _(txt_forwarded_end));
+	}
 
-	if (!tinrc.use_mailreader_i)
+	if (INTERACTIVE_NONE == tinrc.interactive_mailer)
 		msg_write_signature(fp, TRUE, &CURR_GROUP);
 
 	fclose(fp);
 
-	if (tinrc.use_mailreader_i) {	/* user wants to use his own mailreader */
+	if (INTERACTIVE_NONE != tinrc.interactive_mailer) {	/* user wants to use his own mailreader */
 		char buf[HEADER_LEN];
 		char *p;
 
@@ -2943,8 +3011,8 @@ mail_to_someone(
 			ret_code = POSTED_OK;
 	} else {
 		if (confirm_to_mail)
-			ch = prompt_to_send(subject);
-		ret_code = mail_loop(nam, ch, subject, group ? group->name : NULL, NULL);
+			func = prompt_to_send(subject);
+		ret_code = mail_loop(nam, func, subject, group ? group->name : NULL, NULL, mime_forward ? artinfo->raw : NULL);
 	}
 
 	if (tinrc.unlink_article)
@@ -2964,16 +3032,15 @@ mail_bug_report(
 	char tmesg[LEN];
 	char subject[HEADER_LEN];
 	t_bool ret_code = FALSE;
-	t_bool is_nntp = FALSE, is_nntp_only;
 
 	wait_message(0, _(txt_mail_bug_report));
-	sprintf(subject, "BUG REPORT %s\n", page_header);
+	snprintf(subject, sizeof(subject), "BUG REPORT %s\n", page_header);
 
 	if ((fp = create_mail_headers(nam, ".bugreport", bug_addr, subject, NULL)) == NULL)
 		return FALSE;
 
-	fprintf(fp, "VER1 : %s\n", page_header);	/* some ppl. trash the subject, so include version information in the body as well */
-#ifdef HAVE_SYS_UTSNAME_H
+	start_line_offset += tin_version_info(fp);
+#if defined(HAVE_SYS_UTSNAME_H) && defined(HAVE_UNAME)
 #	ifdef _AIX
 	fprintf(fp, "BOX1 : %s %s.%s", system_info.sysname, system_info.version, system_info.release);
 #	else
@@ -2985,16 +3052,7 @@ mail_bug_report(
 #	endif /* _AIX */
 #else
 	fprintf(fp, "BOX1 : Please enter the following information: Machine+OS");
-#endif /* HAVE_SYS_UTSNAME_H */
-
-#ifdef NNTP_ONLY
-	is_nntp_only = TRUE;
-#else
-	is_nntp_only = FALSE;
-#	ifdef NNTP_ABLE
-	is_nntp = TRUE;
-#	endif /* NNTP_ABLE */
-#endif /* NNTP_ONLY */
+#endif /* HAVE_SYS_UTSNAME_H && HAVE_UNAME */
 
 #ifdef DOMAIN_NAME
 	domain = DOMAIN_NAME;
@@ -3002,23 +3060,14 @@ mail_bug_report(
 	domain = "";
 #endif /* DOMAIN_NAME */
 
-	fprintf(fp, "\nCFG1 : active=%d, arts=%d, reread=%d, longfilenames=%s\n",
+	fprintf(fp, "\nCFG1 : active=%d, arts=%d, reread=%d, nntp_xover=%s\n",
 		DEFAULT_ACTIVE_NUM,
 		DEFAULT_ARTICLE_NUM,
 		tinrc.reread_active_file_secs,
-#ifdef HAVE_LONG_FILE_NAMES
-		bool_unparse(TRUE)
-#else
-		bool_unparse(FALSE)
-#endif /* HAVE_LONG_FILE_NAMES */
-		);
-	fprintf(fp, "CFG2 : nntp=%s, nntp_only=%s, nntp_xover=%s\n",
-		bool_unparse(is_nntp),
-		bool_unparse(is_nntp_only),
-		bool_unparse(xover_cmd != NULL));
-	fprintf(fp, "CFG3 : debug=%d, threading=%d\n", debug, tinrc.thread_articles);
-	fprintf(fp, "CFG4 : domain=[%s]\n", BlankIfNull(domain));
-	start_line_offset += 6;
+		bool_unparse(nntp_caps.over_cmd != NULL));
+	fprintf(fp, "CFG2 : debug=%d, threading=%d\n", debug, tinrc.thread_articles);
+	fprintf(fp, "CFG3 : domain=[%s]\n", BlankIfNull(domain));
+	start_line_offset += 4;
 
 	if (*bug_nntpserver1) {
 		fprintf(fp, "NNTP1: %s\n", bug_nntpserver1);
@@ -3028,23 +3077,26 @@ mail_bug_report(
 		fprintf(fp, "NNTP2: %s\n", bug_nntpserver2);
 		start_line_offset++;
 	}
-
+	if (nntp_caps.implementation){
+		fprintf(fp, "IMPLE: %s\n", nntp_caps.implementation);
+		start_line_offset++;
+	}
 	fprintf(fp, "\nPlease enter _detailed_ bug report, gripe or comment:\n\n");
 	start_line_offset += 2;
 
-	if (!tinrc.use_mailreader_i)
+	if (INTERACTIVE_NONE == tinrc.interactive_mailer)
 		msg_write_signature(fp, TRUE, (selmenu.curr == -1) ? NULL : &CURR_GROUP);
 
 	fclose(fp);
 
-	if (tinrc.use_mailreader_i) {	/* user wants to use his own mailreader */
+	if (INTERACTIVE_NONE != tinrc.interactive_mailer) {	/* user wants to use his own mailreader */
 		subject[strlen(subject) - 1] = '\0';	/* cut trailing '\n' */
 		strfmailer(mailer, subject, bug_addr, nam, buf, sizeof(buf), tinrc.mailer_format);
 		if (invoke_cmd(buf))
 			ret_code = TRUE;
 	} else {
 		snprintf(tmesg, sizeof(tmesg), _(txt_mail_bug_report_confirm), bug_addr);
-		ret_code = mail_loop(nam, iKeyPostEdit, subject, NULL, tmesg) ? TRUE : FALSE;
+		ret_code = mail_loop(nam, POST_EDIT, subject, NULL, tmesg, NULL) ? TRUE : FALSE;
 	}
 
 	unlink(nam);
@@ -3067,28 +3119,30 @@ mail_to_author(
 	char subject[HEADER_LEN];
 	char initials[64];
 	int ret_code = POSTED_NONE;
+	int i;
 	struct t_header note_h = pgart.hdr;
-	t_bool spamtrap_found = FALSE;
 
 	wait_message(0, _(txt_reply_to_author));
 	find_reply_to_addr(from_addr, FALSE, &pgart.hdr);
-	spamtrap_found = check_for_spamtrap(from_addr);
 
-	if (spamtrap_found) {
-		char ch;
+	i = gnksa_check_from(from_addr);
+
+	/* TODO: make gnksa error level configurable */
+	if (check_for_spamtrap(from_addr) || (i > GNKSA_OK && i < GNKSA_ILLEGAL_UNQUOTED_CHAR)) {
 		char keyabort[MAXKEYLEN], keycont[MAXKEYLEN];
+		t_function func;
 
-		ch = prompt_slk_response(iKeyPostContinue, &menukeymap.post_cont,
+		func = prompt_slk_response(POST_CONTINUE, post_continue_keys,
 				_(txt_warn_suspicious_mail),
-				printascii(keycont, map_to_local(iKeyPostContinue, &menukeymap.post_cont)),
-				printascii(keyabort, map_to_local(iKeyPostAbort, &menukeymap.post_cont)));
-		switch (ch) {
-			case iKeyPostAbort:
-			case iKeyAbort:
+				printascii(keycont, func_to_key(POST_CONTINUE, post_continue_keys)),
+				printascii(keyabort, func_to_key(POST_ABORT, post_continue_keys)));
+		switch (func) {
+			case POST_ABORT:
+			case GLOBAL_ABORT:
 				clear_message();
 				return ret_code;
 
-			case iKeyPostContinue:
+			case POST_CONTINUE:
 				break;
 
 			/* the user wants to continue anyway, so we do nothing special here */
@@ -3140,8 +3194,7 @@ mail_to_author(
 					 */
 					fseek(pgart.cooked, 0L, SEEK_SET);
 				} else { /* without headers */
-					int i = 0;
-
+					i = 0;
 					while (pgart.cookl[i].flags & C_HEADER) /* skip headers in cooked art if any */
 						i++;
 					if (i) /* cooked art contained any headers, so skip also the header/body seperator */
@@ -3154,7 +3207,7 @@ mail_to_author(
 	} else /* !copy_text */
 		fprintf(fp, "\n");	/* add a newline to keep vi from bitching */
 
-	if (!tinrc.use_mailreader_i)
+	if (INTERACTIVE_NONE == tinrc.interactive_mailer)
 		msg_write_signature(fp, TRUE, &CURR_GROUP);
 
 	fclose(fp);
@@ -3164,7 +3217,7 @@ mail_to_author(
 
 		find_reply_to_addr(mail_to, TRUE, &pgart.hdr);
 
-		if (tinrc.use_mailreader_i) {	/* user wants to use his own mailreader for reply */
+		if (INTERACTIVE_NONE != tinrc.interactive_mailer) {	/* user wants to use his own mailreader for reply */
 			char buf[HEADER_LEN];
 
 			subject[strlen(subject) - 1] = '\0'; /* cut trailing '\n' */
@@ -3172,10 +3225,10 @@ mail_to_author(
 			if (invoke_cmd(buf))
 				ret_code = POSTED_OK;
 		} else
-			ret_code = mail_loop(nam, iKeyPostEdit, subject, group, NULL);
+			ret_code = mail_loop(nam, POST_EDIT, subject, group, NULL, NULL);
 
 		/*
-		 * If use_mailreader_i=ON and the user changed the subject in his
+		 * If interactive_mailer!=NONE and the user changed the subject in his
 		 * mailreader, the entry generated here is wrong, strictly speaking.
 		 * But since we don't have a chance to get the final subject back from
 		 * the mailer I think this is the best solution. -dn, 2000-03-16
@@ -3241,9 +3294,6 @@ cancel_article(
 	int respnum)
 {
 	FILE *fp;
-	char ch, ch_default = iKeyPostCancel;
-	char option = iKeyPostCancel;
-	char option_default = iKeyPostCancel;
 	char buf[HEADER_LEN];
 	char cancel[HEADER_LEN];
 	char from_name[HEADER_LEN];
@@ -3259,6 +3309,8 @@ cancel_article(
 	int oldraw;
 	struct t_header note_h = pgart.hdr, hdr;
 	t_bool redraw_screen = FALSE;
+	t_function func;
+	t_function default_func = POST_CANCEL;
 
 	msg_init_headers();
 
@@ -3289,22 +3341,24 @@ cancel_article(
 		return redraw_screen;
 #endif /* FORGERY */
 	} else {
+		char *smsg;
 		char buff[LEN];
 		char keycancel[MAXKEYLEN], keyquit[MAXKEYLEN], keysupersede[MAXKEYLEN];
 
 		snprintf(buff, sizeof(buff), _(txt_cancel_article),
-					printascii(keycancel, map_to_local(iKeyPostCancel, &menukeymap.post_delete)),
-					printascii(keysupersede, map_to_local(iKeyPostSupersede, &menukeymap.post_delete)),
-					printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.post_delete)));
-
-		option = prompt_slk_response(option_default, &menukeymap.post_delete,
-						"%s", sized_message(buff, art->subject));
+				printascii(keycancel, func_to_key(POST_CANCEL, post_delete_keys)),
+				printascii(keysupersede, func_to_key(POST_SUPERSEDE, post_delete_keys)),
+				printascii(keyquit, func_to_key(GLOBAL_QUIT, post_delete_keys)));
+
+		func = prompt_slk_response(default_func, post_delete_keys,
+						"%s", sized_message(&smsg, buff, art->subject));
+		free(smsg);
 
-		switch (option) {
-			case iKeyPostCancel:
+		switch (func) {
+			case POST_CANCEL:
 				break;
 
-			case iKeyPostSupersede:
+			case POST_SUPERSEDE:
 				repost_article(note_h.newsgroups, respnum, TRUE, &pgart);
 				return TRUE; /* force screen redraw */
 
@@ -3330,11 +3384,11 @@ cancel_article(
 	if (!author) {
 		char line2[HEADER_LEN];
 
-		sprintf(line2, "cyberspam!%s", line);
+		snprintf(line2, sizeof(line2), "cyberspam!%s", line);
 		msg_add_header("Path", line2);
 		msg_add_header("From", from_name);
 		msg_add_header("Sender", note_h.from);
-		sprintf(line, "<cancel.%s", note_h.messageid + 1);
+		snprintf(line, sizeof(line), "<cancel.%s", note_h.messageid + 1);
 		msg_add_header("Message-ID", line);
 		msg_add_header("X-Cancelled-By", from_name);
 		/*
@@ -3345,9 +3399,9 @@ cancel_article(
 	} else {
 		msg_add_header("Path", line);
 		if (art->name)
-			sprintf(line, "%s <%s>", art->name, art->from);
+			snprintf(line, sizeof(line), "%s <%s>", art->name, art->from);
 		else
-			sprintf(line, "<%s>", art->from);
+			snprintf(line, sizeof(line), "<%s>", art->from);
 		msg_add_header("From", line);
 		ADD_CAN_KEY(note_h.messageid);
 	}
@@ -3356,7 +3410,7 @@ cancel_article(
 	ADD_MSG_ID_HEADER();
 	ADD_CAN_KEY(note_h.messageid);
 #endif /* FORGERY */
-	sprintf(buf, "cmsg cancel %s", note_h.messageid);
+	snprintf(buf, sizeof(buf), "cmsg cancel %s", note_h.messageid);
 	msg_add_header("Subject", buf);
 
 	/*
@@ -3366,7 +3420,7 @@ cancel_article(
 	msg_add_header("Newsgroups", note_h.newsgroups);
 	if (tinrc.prompt_followupto)
 		msg_add_header("Followup-To", "");
-	sprintf(buf, "cancel %s", note_h.messageid);
+	snprintf(buf, sizeof(buf), "cancel %s", note_h.messageid);
 	msg_add_header("Control", buf);
 
 	/* TODO: does this catch x-posts to moderated groups? */
@@ -3430,19 +3484,21 @@ cancel_article(
 
 	forever {
 		{
+			char *smsg;
 			char buff[LEN];
 			char keycancel[MAXKEYLEN], keyedit[MAXKEYLEN], keyquit[MAXKEYLEN];
 
 			snprintf(buff, sizeof(buff), _(txt_quit_cancel),
-						printascii(keyedit, map_to_local(iKeyPostEdit, &menukeymap.post_cancel)),
-						printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.post_cancel)),
-						printascii(keycancel, map_to_local(iKeyPostCancel, &menukeymap.post_cancel)));
+					printascii(keyedit, func_to_key(POST_EDIT, post_cancel_keys)),
+					printascii(keyquit, func_to_key(GLOBAL_QUIT, post_cancel_keys)),
+					printascii(keycancel, func_to_key(POST_CANCEL, post_cancel_keys)));
 
-			ch = prompt_slk_response(ch_default, &menukeymap.post_cancel, "%s", sized_message(buff, note_h.subj));
+			func = prompt_slk_response(default_func, post_cancel_keys, "%s", sized_message(&smsg, buff, note_h.subj));
+			free(smsg);
 		}
 
-		switch (ch) {
-			case iKeyPostEdit:
+		switch (func) {
+			case POST_EDIT:
 				invoke_editor(cancel, start_line_offset);
 				if (!(fp = fopen(cancel, "r"))) {
 					/* Oops */
@@ -3454,12 +3510,12 @@ cancel_article(
 				fclose(fp);
 				break;
 
-			case iKeyPostCancel:
+			case POST_CANCEL:
 				wait_message(1, _(txt_cancelling_art));
 				if (submit_news_file(cancel, group, a_message_id)) {
 					info_message(_(txt_art_cancel));
 					if (hdr.subj)
-						update_posted_info_file(group->name, iKeyPostCancel, hdr.subj, a_message_id);
+						update_posted_info_file(group->name, 'd', hdr.subj, a_message_id);
 					else
 						error_message(_(txt_error_header_line_missing), "Subject");
 					unlink(cancel);
@@ -3467,11 +3523,13 @@ cancel_article(
 				}
 				break;
 
-			case iKeyQuit:
-			case iKeyAbort:
+			case GLOBAL_QUIT:
+			case GLOBAL_ABORT:
 				unlink(cancel);
 				clear_message();
 				return redraw_screen;
+				/* NOTREACHED */
+				break;
 
 			default:
 				break;
@@ -3496,26 +3554,25 @@ cancel_article(
  */
 int
 repost_article(
-	const char *group,
+	const char *groupname,
 	int respnum,
 	t_bool supersede,
 	t_openartinfo *artinfo)
 {
 	FILE *fp;
-	char ch;
-	char ch_default = iKeyPostPost3;
 	char buf[HEADER_LEN];
 	char from_name[HEADER_LEN];
 	char full_name[128];
 	char user_name[128];
 	int art_type = GROUP_TYPE_NEWS;
 	int ret_code = POSTED_NONE;
-	struct t_group *psGrp;
+	struct t_group *group;
 	struct t_header note_h = artinfo->hdr;
 	t_bool force_command = FALSE;
 #	ifdef FORGERY
 	char line[HEADER_LEN];
 #	endif /* FORGERY */
+	t_function func, default_func = GLOBAL_POST;
 
 	msg_init_headers();
 
@@ -3527,18 +3584,18 @@ repost_article(
 	/*
 	 * Check if any of the newsgroups are moderated.
 	 */
-	if ((psGrp = check_moderated(group, &art_type, _(txt_art_not_posted))) == NULL)
+	if ((group = check_moderated(groupname, &art_type, _(txt_art_not_posted))) == NULL)
 		return ret_code;
 
-	if ((fp = fopen(article, "w")) == NULL) {
-		perror_message(_(txt_cannot_open), article);
+	if ((fp = fopen(article_name, "w")) == NULL) {
+		perror_message(_(txt_cannot_open), article_name);
 		return ret_code;
 	}
 	fchmod(fileno(fp), (mode_t) (S_IRUSR|S_IWUSR));
 
 	if (supersede) {
 		get_user_info(user_name, full_name);
-		get_from_name(from_name, psGrp);
+		get_from_name(from_name, group);
 #	ifndef FORGERY
 		if (FromSameUser)
 #	endif /* !FORGERY */
@@ -3558,7 +3615,7 @@ repost_article(
 			if (note_h.org)
 				msg_add_header("Organization", note_h.org);
 
-			sprintf(line, "<supersede.%s", note_h.messageid + 1);
+			snprintf(line, sizeof(line), "<supersede.%s", note_h.messageid + 1);
 			msg_add_header("Message-ID", line);
 			/* ADD_CAN_KEY(note_h.messageid); */ /* should we add key here? */
 #	else
@@ -3584,13 +3641,13 @@ repost_article(
 		}
 	} else { /* !supersede */
 		get_user_info(user_name, full_name);
-		get_from_name(from_name, psGrp);
+		get_from_name(from_name, group);
 		msg_add_header("From", from_name);
 		if (*reply_to)
 			msg_add_header("Reply-To", reply_to);
 	}
 	msg_add_header("Subject", note_h.subj);
-	msg_add_header("Newsgroups", group);
+	msg_add_header("Newsgroups", groupname);
 	ADD_MSG_ID_HEADER();
 
 	if (note_h.references) {
@@ -3598,8 +3655,8 @@ repost_article(
 		msg_add_header("References", buf);
 	}
 	if (NotSuperseding) {
-		if (psGrp->attribute->organization != NULL)
-			msg_add_header("Organization", random_organization(psGrp->attribute->organization));
+		if (group->attribute->organization != NULL)
+			msg_add_header("Organization", random_organization(group->attribute->organization));
 		else if (*default_organization)
 			msg_add_header("Organization", random_organization(default_organization));
 
@@ -3609,13 +3666,22 @@ repost_article(
 		if (*my_distribution)
 			msg_add_header("Distribution", my_distribution);
 
+	} else {
+		if (note_h.org)
+			msg_add_header("Organization", note_h.org);
+		else {
+			if (group->attribute->organization != NULL)
+				msg_add_header("Organization", random_organization(group->attribute->organization));
+			else if (*default_organization)
+				msg_add_header("Organization", random_organization(default_organization));
+		}
 	}
 
 	/*
 	 * some ppl. like X-Headers: in reposts
 	 * X-Headers got lost on supersede, re-add
 	 */
-	msg_add_x_headers(psGrp->attribute->x_headers);
+	msg_add_x_headers(group->attribute->x_headers);
 
 	start_line_offset = msg_write_headers(fp) + 1;
 	msg_free_headers();
@@ -3648,7 +3714,7 @@ repost_article(
 
 	/* only append signature when NOT superseding own articles */
 	if (NotSuperseding && tinrc.signature_repost)
-		msg_write_signature(fp, FALSE, psGrp);
+		msg_write_signature(fp, FALSE, group);
 
 	fclose(fp);
 
@@ -3656,15 +3722,16 @@ repost_article(
 	 * on supersede change default-key
 	 *
 	 * FIXME: this is only useful when entering the editor.
-	 * After leaving the editor it should be iKeyPostPost3
+	 * After leaving the editor it should be GLOBAL_POST
 	 */
 	if (Superseding) {
-		ch_default = iKeyPostEdit;
+		default_func = POST_EDIT;
 		force_command = TRUE;
 	}
 
-	ch = ch_default;
+	func = default_func;
 	if (!force_command) {
+		char *smsg;
 		char buff[LEN];
 		char keyedit[MAXKEYLEN], keypost[MAXKEYLEN];
 		char keypostpone[MAXKEYLEN], keyquit[MAXKEYLEN];
@@ -3677,22 +3744,23 @@ repost_article(
 #endif /* HAVE_PGP_GPG */
 
 		snprintf(buff, sizeof(buff), _(txt_quit_edit_xpost),
-						printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.post_post)),
-						printascii(keyedit, map_to_local(iKeyPostEdit, &menukeymap.post_post)),
+				printascii(keyquit, func_to_key(GLOBAL_QUIT, post_post_keys)),
+				printascii(keyedit, func_to_key(POST_EDIT, post_post_keys)),
 #ifdef HAVE_ISPELL
-						printascii(keyispell, map_to_local(iKeyPostIspell, &menukeymap.post_post)),
+				printascii(keyispell, func_to_key(POST_ISPELL, post_post_keys)),
 #endif /* HAVE_ISPELL */
 #ifdef HAVE_PGP_GPG
-						printascii(keypgp, map_to_local(iKeyPostPGP, &menukeymap.post_post)),
+				printascii(keypgp, func_to_key(POST_PGP, post_post_keys)),
 #endif /* HAVE_PGP_GPG */
-						printascii(keymenu, map_to_local(iKeyOptionMenu, &menukeymap.post_post)),
-						printascii(keypost, map_to_local(iKeyPostPost3, &menukeymap.post_post)),
-						printascii(keypostpone, map_to_local(iKeyPostPostpone, &menukeymap.post_post)));
-
-		ch = prompt_slk_response(ch_default, &menukeymap.post_post,
-			"%s", sized_message(buff, note_h.subj));
+				printascii(keymenu, func_to_key(GLOBAL_OPTION_MENU, post_post_keys)),
+				printascii(keypost, func_to_key(GLOBAL_POST, post_post_keys)),
+				printascii(keypostpone, func_to_key(POST_POSTPONE, post_post_keys)));
+
+		func = prompt_slk_response(default_func, post_post_keys,
+			"%s", sized_message(&smsg, buff, note_h.subj));
+		free(smsg);
 	}
-	return (post_loop(POST_REPOST, psGrp, ch, (Superseding ? _(txt_superseding_art) : _(txt_repost_an_article)), art_type, start_line_offset));
+	return (post_loop(POST_REPOST, group, func, (Superseding ? _(txt_superseding_art) : _(txt_repost_an_article)), art_type, start_line_offset));
 }
 
 
@@ -3700,20 +3768,22 @@ static void
 msg_add_x_headers(
 	const char *headers)
 {
-	FILE *fp;
+	FILE *fp = NULL;
 	char *ptr;
 	char file[PATH_LEN];
 	char line[HEADER_LEN];
+	char **x_hdrs = NULL;
+	int num_x_hdrs = 0;
+	t_bool a_pipe = FALSE;
+	int i;
 
 	if (!headers)
 		return;
 
-	if (headers[0] != '/' && headers[0] != '~') {
+	if (headers[0] != '/' && headers[0] != '~' && headers[0] != '!') {
 		strcpy(line, headers);
-		ptr = strchr(line, ':');
-		if (ptr) {
-			*ptr = '\0';
-			ptr++;
+		if ((ptr = strchr(line, ':')) != NULL) {
+			*ptr++ = '\0';
 			if (*ptr == ' ' || *ptr == '\t') {
 				msg_add_header(line, ptr);
 				return;
@@ -3727,19 +3797,48 @@ msg_add_x_headers(
 		if (!strfpath(headers, file, sizeof(file), &CURR_GROUP))
 			strcpy(file, headers);
 
-		if ((fp = fopen(file, "r")) != NULL) {
-			while (fgets(line, (int) sizeof(line), fp) != NULL) {
-				if (line[0] != '\n' && line[0] != '#') {
-					ptr = strchr(line, ':');
-					if (ptr) {
-						*ptr = '\0';
-						ptr++;
-					}
-					msg_add_header(line, ptr);
+#ifndef DONT_HAVE_PIPING
+		if (file[0] == '!') {
+			if ((fp = popen(file + 1, "r")) == NULL)
+				return;
+			else
+				a_pipe = TRUE;
+		}
+#endif /* !DONT_HAVE_PIPING */
+		if (!a_pipe && ((fp = fopen(file, "r")) == NULL))
+			return;
+
+		while (fgets(line, (int) sizeof(line), fp) != NULL) {
+			if (line[0] != '\n' && line[0] != '#') {
+				if (line[0] != ' ' && line[0] != '\t') {
+					x_hdrs = my_realloc(x_hdrs, (num_x_hdrs + 1) * sizeof(char *));
+					x_hdrs[num_x_hdrs] = my_malloc(strlen(line) + 1);
+					strcpy(x_hdrs[num_x_hdrs++], line);
+				} else {
+					if (!num_x_hdrs) /* folded line, but no previous header */
+						continue;
+					i = strlen(x_hdrs[num_x_hdrs - 1]);
+					x_hdrs[num_x_hdrs - 1] = my_realloc(x_hdrs[num_x_hdrs - 1], i + strlen(line) + 1);
+					strcpy(x_hdrs[num_x_hdrs - 1] + i, line);
 				}
 			}
-			fclose(fp);
 		}
+
+		if (num_x_hdrs) {
+			for (i = 0; i < num_x_hdrs; i++) {
+				if ((ptr = strchr(x_hdrs[i], ':')) != NULL) {
+					*ptr++ = '\0';
+					msg_add_header(x_hdrs[i], ptr);
+				}
+				free(x_hdrs[i]);
+			}
+			free(x_hdrs);
+		}
+
+		if (a_pipe)
+			pclose(fp);
+		else
+			fclose(fp);
 	}
 }
 
@@ -3794,90 +3893,105 @@ msg_add_x_body(
  * Add the User-Agent header after the other headers
  * Strip duplicate newsgroups. Only write followup header if it differs
  * from the newsgroups headers.
+ * Remove Fcc header and return pointer to it. (Must be freed by
+ * invoking function.)
  */
-void
+char *
 checknadd_headers(
 	const char *infile)
 {
 	FILE *fp_in, *fp_out;
+	char *fcc = NULL;
+	char *l;
+	char *ptr;
 	char newsgroups[HEADER_LEN];
 	char line[HEADER_LEN];
 	char outfile[PATH_LEN];
-	t_bool inhdrs = TRUE;
 
 	newsgroups[0] = '\0';
 
 	if ((fp_in = fopen(infile, "r")) == NULL)
-		return;
+		return NULL;
 
 #ifdef VMS
-	sprintf(outfile, "%s-%d", infile, (int) process_id);
+	snprintf(outfile, sizeof(outfile), "%s-%d", infile, (int) process_id);
 #else
-	sprintf(outfile, "%s.%d", infile, (int) process_id);
+	snprintf(outfile, sizeof(outfile), "%s.%d", infile, (int) process_id);
 #endif /* VMS */
 
 	if ((fp_out = fopen(outfile, "w")) == NULL) {
 		fclose(fp_in);
-		return;
+		return NULL;
 	}
 
-	while (fgets(line, (int) sizeof(line), fp_in) != NULL) {
-		if (inhdrs) {
-			if (line[0] == '\n') {			/* End of headers */
-				inhdrs = FALSE;
+	while ((l = tin_fgets(fp_in, TRUE)) != NULL) {
+		if (l[0] == '\0') /* end of headers */
+			break;
 
-				if (tinrc.advertising) {	/* Add after other headers */
-#ifdef HAVE_SYS_UTSNAME_H
+		if ((ptr = parse_header(l, "Newsgroups", FALSE, FALSE))) {
+			strip_double_ngs(ptr);
+			STRCPY(newsgroups, ptr);
+			snprintf(line, sizeof(line), "Newsgroups: %s\n", newsgroups);
+			fputs(line, fp_out);
+		} else if ((ptr = parse_header(l, "Followup-To", FALSE, FALSE))) {
+			strip_double_ngs(ptr);
+			/*
+			 * Only write followup header if not blank or followups != newsgroups
+			 */
+			if (*ptr && strcasecmp(newsgroups, ptr)) {
+				snprintf(line, sizeof(line), "Followup-To: %s\n", ptr);
+				fputs(line, fp_out);
+			}
+		} else if ((ptr = parse_header(l, "Fcc", FALSE, FALSE))) {
+			fcc = my_strdup(ptr);
+		} else if ((ptr = strchr(l, ':')) != NULL) { /* valid header? */
+			if (strlen(ptr) > 3) /* skip empty headers ": \n\0" */
+				fprintf(fp_out, "%s\n", l);
+		}
+	} /* end of headers */
+
+	if (tinrc.advertising) {	/* Add after other headers */
+		char suffix[HEADER_LEN];
+
+		suffix[0] = '\0';
+#if defined(HAVE_SYS_UTSNAME_H) && defined(HAVE_UNAME)
+		if (*system_info.release) {
 #	ifdef _AIX
-					fprintf(fp_out, "User-Agent: %s/%s-%s (\"%s\") (%s) (%s/%s.%s)\n",
-						PRODUCT, VERSION, RELEASEDATE, RELEASENAME, OSNAME,
-						system_info.sysname, system_info.version, system_info.release);
+		snprintf(suffix, sizeof(suffix), " (%s/%s.%s)",
+			system_info.sysname, system_info.version, system_info.release);
 #	else
 #		ifdef SEIUX
-						fprintf(fp_out, "User-Agent: %s/%s-%s (\"%s\") (%s) (%s/%s)\n",
-							PRODUCT, VERSION, RELEASEDATE, RELEASENAME, OSNAME,
-							system_info.version, system_info.release);
+			snprintf(suffix, sizeof(suffix), " (%s/%s)",
+				system_info.version, system_info.release);
 #		else
-					fprintf(fp_out, "User-Agent: %s/%s-%s (\"%s\") (%s) (%s/%s (%s))\n",
-						PRODUCT, VERSION, RELEASEDATE, RELEASENAME, OSNAME,
-						system_info.sysname, system_info.release, system_info.machine);
+			snprintf(suffix, sizeof(suffix), " (%s/%s (%s))",
+				system_info.sysname, system_info.release, system_info.machine);
 #		endif /* SEIUX */
 #	endif /* _AIX */
-#else
-					fprintf(fp_out, "User-Agent: %s/%s-%s (\"%s\") (%s)\n",
-						PRODUCT, VERSION, RELEASEDATE, RELEASENAME, OSNAME);
-#endif /* HAVE_SYS_UTSNAME_H */
-				}
-			} else {
-				char *ptr;
-
-				if ((ptr = parse_header(line, "Newsgroups", FALSE, FALSE))) {
-					strip_double_ngs(ptr);
-					strcpy(newsgroups, ptr);
-					sprintf(line, "Newsgroups: %s\n", newsgroups);
-				} else {
-					if ((ptr = parse_header(line, "Followup-To", FALSE, FALSE))) {
-						strip_double_ngs(ptr);
-						/*
-						 * Only write followup header if not blank or followups != newsgroups
-						 */
-						if (*ptr && strcasecmp(newsgroups, ptr))
-							sprintf(line, "Followup-To: %s\n", ptr);
-						else
-							*line = '\0';
-					}
-				}
-			}
 		}
-		fputs(line, fp_out);
+#endif /* HAVE_SYS_UTSNAME_H && HAVE_UNAME */
+#ifdef SYSTEM_NAME
+		if (!*suffix) {
+			if (strlen(SYSTEM_NAME))
+				snprintf(suffix, sizeof(suffix), " (%s)", SYSTEM_NAME);
+		}
+#endif /* SYSTEM_NAME */
+
+		fprintf(fp_out, "User-Agent: %s/%s-%s (\"%s\") (%s)%s\n",
+			PRODUCT, VERSION, RELEASEDATE, RELEASENAME, OSNAME, suffix);
 	}
+
+	fputs("\n", fp_out); /* header/body seperator */
+
+	while ((l = tin_fgets(fp_in, FALSE)) != NULL)
+		fprintf(fp_out, "%s\n", l);
 	fclose(fp_out);
 	fclose(fp_in);
 	rename_file(outfile, infile);
+	return fcc;
 }
 
 
-#ifndef M_AMIGA
 static t_bool
 insert_from_header(
 	const char *infile)
@@ -3892,9 +4006,9 @@ insert_from_header(
 
 	if ((fp_in = fopen(infile, "r")) != NULL) {
 #	ifdef VMS
-		sprintf(outfile, "%s-%d", infile, (int) process_id);
+		snprintf(outfile, sizeof(outfile), "%s-%d", infile, (int) process_id);
 #	else
-		sprintf(outfile, "%s.%d", infile, (int) process_id);
+		snprintf(outfile, sizeof(outfile), "%s.%d", infile, (int) process_id);
 #	endif /* VMS */
 		if ((fp_out = fopen(outfile, "w")) != NULL) {
 			strcpy(from_name, "From: ");
@@ -3922,11 +4036,11 @@ insert_from_header(
 					 * from submit_mail_file() so the 3rd
 					 * arg should perhaps be TRUE
 					 */
-#ifdef CHARSET_CONVERSION
+#	ifdef CHARSET_CONVERSION
 					p = rfc1522_encode(from_buff, txt_mime_charsets[tinrc.mm_network_charset], FALSE);
-#else
+#	else
 					p = rfc1522_encode(from_buff, tinrc.mm_charset, FALSE);
-#endif /* CHARSET_CONVERSION */
+#	endif /* CHARSET_CONVERSION */
 					if (GNKSA_OK != gnksa_check_from(p)) { /* error in address */
 						error_message(_(txt_invalid_from), from_buff);
 						free(p);
@@ -3940,11 +4054,11 @@ insert_from_header(
 				if (*line == '\0' && in_header) {
 					if (!from_found) {
 						/* Check the From: line */
-#ifdef CHARSET_CONVERSION
+#	ifdef CHARSET_CONVERSION
 						p = rfc1522_encode(from_name, txt_mime_charsets[tinrc.mm_network_charset], FALSE);
-#else
+#	else
 						p = rfc1522_encode(from_name, tinrc.mm_charset, FALSE);
-#endif /* CHARSET_CONVERSION */
+#	endif /* CHARSET_CONVERSION */
 						if (GNKSA_OK != gnksa_check_from(p + 6)) { /* error in address */
 							error_message(_(txt_invalid_from), from_name + 6);
 							free(p);
@@ -3970,7 +4084,6 @@ insert_from_header(
 	}
 	return FALSE;
 }
-#endif /* !M_AMIGA */
 
 
 /*
@@ -4021,40 +4134,39 @@ reread_active_after_posting(
 	void)
 {
 	int i;
-	long lMinOld;
-	long lMaxOld;
-	struct t_group *psGrp;
+	long old_min;
+	long old_max;
+	struct t_group *group;
 	t_bool modified = FALSE;
 
 	if (reread_active_for_posted_arts) {
 		reread_active_for_posted_arts = FALSE;
 
 		for_each_group(i) {
-			if ((psGrp = &active[i])) {
-				if (psGrp->subscribed && psGrp->art_was_posted) {
-					psGrp->art_was_posted = FALSE;
-
-					/* TODO: -> lang.c */
-					wait_message(0, _("Rereading %s..."), psGrp->name);
-					lMinOld = psGrp->xmin;
-					lMaxOld = psGrp->xmax;
-					group_get_art_info(psGrp->spooldir, psGrp->name, psGrp->type, &psGrp->count, &psGrp->xmax, &psGrp->xmin);
+			if ((group = &active[i])) {
+				if (group->subscribed && group->art_was_posted) {
+					group->art_was_posted = FALSE;
+
+					wait_message(0, _(txt_group_rereading), group->name);
+					old_min = group->xmin;
+					old_max = group->xmax;
+					group_get_art_info(group->spooldir, group->name, group->type, &group->count, &group->xmax, &group->xmin);
 
-					if (psGrp->newsrc.num_unread > psGrp->count) {
+					if (group->newsrc.num_unread > group->count) {
 #ifdef DEBUG
 						my_printf(cCRLF "Unread WRONG grp=[%s] unread=[%ld] count=[%ld]",
-							psGrp->name, psGrp->newsrc.num_unread, psGrp->count);
+							group->name, group->newsrc.num_unread, group->count);
 						my_flush();
 #endif /* DEBUG */
-						psGrp->newsrc.num_unread = psGrp->count;
+						group->newsrc.num_unread = group->count;
 					}
-					if (psGrp->xmin != lMinOld || psGrp->xmax != lMaxOld) {
+					if (group->xmin != old_min || group->xmax != old_max) {
 #ifdef DEBUG
 						my_printf(cCRLF "Min/Max DIFF grp=[%s] old=[%ld-%ld] new=[%ld-%ld]",
-							psGrp->name, lMinOld, lMaxOld, psGrp->xmin, psGrp->xmax);
+							group->name, old_min, old_max, group->xmin, group->xmax);
 						my_flush();
 #endif /* DEBUG */
-						expand_bitmap(psGrp, 0);
+						expand_bitmap(group, 0);
 						modified = TRUE;
 					}
 					clear_message();
@@ -4108,9 +4220,12 @@ update_active_after_posting(
 static t_bool
 submit_mail_file(
 	const char *file,
-	struct t_group *group)
+	struct t_group *group,
+	FILE *articlefp,
+	t_bool include_text)
 {
 	FILE *fp;
+	char *fcc;
 	char buf[HEADER_LEN];
 	char mail_to[HEADER_LEN];
 	struct t_header hdr;
@@ -4119,12 +4234,9 @@ submit_mail_file(
 	char subject[HEADER_LEN];
 #endif /* VMS */
 
-	checknadd_headers(file);
+	fcc = checknadd_headers(file);
 
-#ifndef M_AMIGA
-	if (insert_from_header(file))
-#endif /* !M_AMIGA */
-	{
+	if (insert_from_header(file)) {
 		if ((fp = fopen(file, "r"))) {
 			parse_rfc822_headers(&hdr, fp, NULL);
 			fclose(fp);
@@ -4132,7 +4244,11 @@ submit_mail_file(
 				wait_message(0, _(txt_mailing_to), mail_to);
 
 				/* Use group-attribute for mailing_list */
-				rfc15211522_encode(file, txt_mime_encodings[tinrc.mail_mime_encoding], group, tinrc.mail_8bit_header, TRUE);
+
+				if (articlefp != NULL)
+					compose_mail_mime_forwarded(file, articlefp, include_text, group);
+				else /* text/plain */
+					compose_mail_text_plain(file, group);
 
 				strfmailer(mailer, hdr.subj, mail_to, file, buf, sizeof(buf), tinrc.mailer_format);
 
@@ -4141,9 +4257,8 @@ submit_mail_file(
 					char *transport;
 
 					/* TODO: document env var */
-					if ((transport = getenv("MAIL$INTERNET_TRANSPORT")) == NULL)
-						transport = "smtp";
-					sprintf(buf, "mail/subject=\"%s\" %s %s%%\"%s\"", subject, file, transport, mail_to);
+					transport = getenv("MAIL$INTERNET_TRANSPORT");
+					snprintf(buf, sizeof(buf), "mail/subject=\"%s\" %s %s%%\"%s\"", subject, file, *transport ? transport : "smtp", mail_to);
 				}
 #endif /* VMS */
 				if (invoke_cmd(buf))
@@ -4152,6 +4267,18 @@ submit_mail_file(
 				error_message(_(txt_error_header_line_missing), "To");
 		}
 	}
+	if (NULL != fcc) {
+		if (mailed && strlen(fcc)) {
+			char a_mailbox[PATH_LEN];
+
+			if (0 == strfpath(fcc, a_mailbox, sizeof(a_mailbox), group))
+				STRCPY(a_mailbox, fcc);
+			if (!append_mail(file, userid, a_mailbox)) {
+				/* TODO: error handling */
+			}
+		}
+		FreeIfNeeded(fcc);
+	}
 	return mailed;
 }
 
@@ -4331,7 +4458,7 @@ address_in_list(
 	const char *address)
 {
 	char **addr_list;
-	char *curr_address = NULL, *this_address = NULL;
+	char *curr_address = NULL, *this_address;
 	t_bool found = FALSE;
 	unsigned int num_addr = 0, i;
 
@@ -4374,7 +4501,7 @@ get_recipients(
 {
 	char **to_addresses, **cc_addresses, **bcc_addresses, **all_addresses;
 	char *dest, *src;
-	unsigned int num_to = 0, num_cc = 0, num_bcc = 0, num_all = 0, j = 0, i;
+	unsigned int num_to = 0, num_cc = 0, num_bcc = 0, num_all, j = 0, i;
 
 	/* get individual e-mail addresses from To, Cc and Bcc headers */
 	to_addresses = split_address_list(hdr->to, &num_to);
@@ -4400,7 +4527,11 @@ get_recipients(
 
 	/* strip double addresses */
 	for (i = 0; i < (num_all - 1); i++) {
+		if (!all_addresses[i])
+			continue;
 		for (j = i + 1; j < num_all; j++) {
+			if (!all_addresses[j])
+				continue;
 			if (!strcasecmp(all_addresses[i], all_addresses[j]))
 				FreeAndNull(all_addresses[j]);
 		}
@@ -4449,7 +4580,7 @@ static const char *
 build_messageid(
 	void)
 {
-	int i = 0;
+	int i;
 	static char buf[1024]; /* Message-IDs are limited to 998-12+CRLF octets */
 	static unsigned long int seqnum = 0; /* we'd use a counter in tinrc */
 	time_t t = time(NULL);
@@ -4459,7 +4590,7 @@ build_messageid(
 	else
 		return '\0';
 
-	sprintf(buf, "<%sT", radix32(seqnum++));
+	snprintf(buf, sizeof(buf), "<%sT", radix32(seqnum++));
 	strcat(buf, radix32(t));
 	strcat(buf, "I");
 	strcat(buf, radix32(process_id));
@@ -4522,7 +4653,7 @@ build_canlock(
  * build_cankey(messageid, secret)
  * returns *(cancel-key) or NULL
  */
-const char *
+static const char *
 build_cankey(
 	const char *messageid,
 	const char *secret)
@@ -4562,11 +4693,13 @@ get_secret(
 	cancel_secret[0] = '\0';
 	joinpath(path_secret, homedir, SECRET_FILE);
 	if ((fp_secret = fopen(path_secret, "r")) == NULL) {
-		/* TODO: prompt for secret manually here? silently ignore? */
+#	ifdef DEBUG
+		/* TODO: prompt for secret manually here? */
 		my_fprintf(stderr, _(txt_cannot_open), path_secret);
 		my_fflush(stderr);
 		sleep(2);
-		return ((char *) 0);
+#	endif /* DEBUG */
+		return NULL;
 	} else {
 		(void) fread(cancel_secret, HEADER_LEN - 1, 1, fp_secret);
 		fclose(fp_secret);
@@ -4593,7 +4726,7 @@ add_headers(
 	FILE *fp_in;
 	char *line;
 	char outfile[PATH_LEN];
-	int fd_out = -1;
+	int fd_out;
 	t_bool inhdrs = TRUE, writesuccess = TRUE;
 	t_bool addmid = TRUE;
 	t_bool adddate = TRUE;
@@ -4615,6 +4748,7 @@ add_headers(
 				inhdrs = FALSE;
 				if (addmid) {
 					char msgidbuf[HEADER_LEN];
+
 					snprintf(msgidbuf, sizeof(msgidbuf), "Message-ID: %s\n", a_message_id);
 					if (write(fd_out, msgidbuf, strlen(msgidbuf)) == (ssize_t) -1) /* abort on write errors */ {
 						writesuccess = FALSE;
@@ -4626,14 +4760,14 @@ add_headers(
 					struct tm *gmdate;
 					char dateheader[50];
 #if defined(HAVE_SETLOCALE) && !defined(NO_LOCALE)
-					char *old_lc_all = (char *) 0, *old_lc_time = (char *) 0;
+					char *old_lc_all = NULL, *old_lc_time = NULL;
 
 					/* Unlocalized date-header */
 					if (getenv("LC_ALL") != NULL) {
-						old_lc_all = my_strdup(setlocale(LC_ALL, (char *) 0));
+						old_lc_all = my_strdup(setlocale(LC_ALL, NULL));
 						setlocale(LC_ALL, "POSIX");
 					} else {
-						old_lc_time = my_strdup(setlocale(LC_TIME, (char *) 0));
+						old_lc_time = my_strdup(setlocale(LC_TIME, NULL));
 						setlocale(LC_TIME, "POSIX");
 					}
 #endif /* HAVE_SETLOCALE && !NO_LOCALE */
diff -Nurp tin-1.6.2/src/prompt.c tin-1.8.0/src/prompt.c
--- tin-1.6.2/src/prompt.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/prompt.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : prompt.c
  *  Author    : I. Lea
  *  Created   : 1991-04-01
- *  Updated   : 2003-02-08
+ *  Updated   : 2005-10-19
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,9 +41,15 @@
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
+
+
+static char *prompt_slk_message;	/* prompt message for prompt_slk_redraw */
+
+/*
+ * Local prototypes
+ */
+static int prompt_list(int row, int col, int var, constext *help_text, constext *prompt_text, constext *list[], int size);
+
 
 /*
  *  prompt_num
@@ -56,20 +62,18 @@ prompt_num(
 	const char *prompt)
 {
 	char *p;
+	char tmp[LEN];
 	int num;
 
 	clear_message();
-
-	sprintf(mesg, "%c", ch);
-
-	if ((p = tin_getline(prompt, TRUE, mesg, 0, FALSE, HIST_OTHER)) != NULL) {
-		strcpy(mesg, p);
-		num = atoi(mesg);
+	snprintf(tmp, sizeof(tmp), "%c", ch);
+	if ((p = tin_getline(prompt, TRUE, tmp, 0, FALSE, HIST_OTHER)) != NULL) {
+		STRCPY(tmp, p);
+		num = atoi(tmp);
 	} else
 		num = -1;
 
 	clear_message();
-
 	return num;
 }
 
@@ -106,16 +110,13 @@ prompt_default_string(
 	char *p;
 
 	clear_message();
-
 	if ((p = tin_getline(prompt, FALSE, default_prompt, buf_len, FALSE, which_hist)) == NULL) {
 		buf[0] = '\0';
 		clear_message();
 		return FALSE;
 	}
 	strcpy(buf, p);
-
 	clear_message();
-
 	return TRUE;
 }
 
@@ -139,84 +140,105 @@ prompt_menu_string(
 	 * would lead to a 'n' answer to the reconnect prompt
 	 */
 	fflush(stdin);
-
 	MoveCursor(line, 0);
-
 	if ((p = tin_getline(prompt, FALSE, var, 0, FALSE, HIST_OTHER)) == NULL)
 		return FALSE;
 
 	strcpy(var, p);
-
 	return TRUE;
 }
 
 
 /*
  * prompt_yn
- * prompt user for 'y'es or 'n'o decision. "prompt" will be displayed in line
- * "line" giving the default answer "default_answer".
- * TODO: 'line' is constant - can we remove it ?
+ * prompt user for 'y'es or 'n'o decision. "prompt" will be displayed in the
+ * last line giving the default answer "default_answer".
  * The function returns 1 if the user decided "yes", -1 if the user wanted
- * to escape, or 0 for any other key or decision.
+ * to escape, or 0 for any other decision.
  */
 int
 prompt_yn(
-	int line,
 	const char *prompt,
 	t_bool default_answer)
 {
 	char *keyprompt;
 	char keyno[MAXKEYLEN], keyyes[MAXKEYLEN];
-	int ch = 'y', prompt_ch = 'y';
-	size_t maxlen;
-	t_bool yn_loop = TRUE;
+	int keyyes_len = 0, keyno_len = 0, maxlen;
+	t_function func;
+#if defined (MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wint_t yes, no, prompt_ch, ch;
+	wchar_t *wtmp;
+#else
+	char yes, no, prompt_ch;
+	int ch;
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 /*	fflush(stdin); */		/* Prevent finger trouble from making important decisions */
 
-	(void) printascii(keyyes, (default_answer ? toupper(map_to_local(iKeyPromptYes, &menukeymap.prompt_yn)) : map_to_local(iKeyPromptYes, &menukeymap.prompt_yn)));
-	(void) printascii(keyno, (!default_answer ? toupper(map_to_local(iKeyPromptNo, &menukeymap.prompt_yn)) : map_to_local(iKeyPromptNo, &menukeymap.prompt_yn)));
-	maxlen = MAX(strlen(keyyes), strlen(keyno));
+	yes = func_to_key(PROMPT_YES, prompt_keys);
+	no = func_to_key(PROMPT_NO, prompt_keys);
 
-	while (yn_loop) {
-		prompt_ch = map_to_local((default_answer ? iKeyPromptYes : iKeyPromptNo), &menukeymap.prompt_yn);
+#if defined (MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	printascii(keyyes, (default_answer ? towupper(yes) : yes));
+	if ((wtmp = char2wchar_t(keyyes))) {
+		keyyes_len = wcswidth(wtmp, wcslen(wtmp));
+		free(wtmp);
+	}
+	printascii(keyno, (!default_answer ? towupper(no) : no));
+	if ((wtmp = char2wchar_t(keyno))) {
+		keyno_len = wcswidth(wtmp, wcslen(wtmp));
+		free(wtmp);
+	}
+#else
+	printascii(keyyes, (default_answer ? toupper(yes) : yes));
+	printascii(keyno, (!default_answer ? toupper(no) : no));
+	keyyes_len = (int) strlen(keyyes);
+	keyno_len = (int) strlen(keyno);
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+	maxlen = MAX(keyyes_len, keyno_len);
+
+	do {
+		prompt_ch = (default_answer ? yes : no);
 		keyprompt = (default_answer ? keyyes : keyno);
 
 		if (!cmd_line) {
-			MoveCursor(line, 0);
+			MoveCursor(cLINES, 0);
 			CleartoEOLN();
 		}
-		my_printf("%s (%s/%s) %-*s", prompt, keyyes, keyno, (int) maxlen, keyprompt);
+		my_printf("%s (%s/%s) %-*s", prompt, keyyes, keyno, maxlen, keyprompt);
 		if (!cmd_line)
 			cursoron();
 		my_flush();
 		if (!cmd_line)
-			MoveCursor(line, (int) strlen(prompt) + strlen(keyyes) + strlen(keyno) + 5);
+			MoveCursor(cLINES, (int) strlen(prompt) + keyyes_len + keyno_len + 5);
 
+#if defined (MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		if (((ch = ReadWch()) == '\n') || (ch == '\r'))
+#else
 		if (((ch = (char) ReadCh()) == '\n') || (ch == '\r'))
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 			ch = prompt_ch;
 
-		yn_loop = FALSE; /* normal case: leave loop */
-
 		switch (ch) {
 			case ESC:	/* (ESC) common arrow keys */
 #	ifdef HAVE_KEY_PREFIX
 			case KEY_PREFIX:
 #	endif /* HAVE_KEY_PREFIX */
-				switch (get_arrow_key(ch)) {
-
+				switch (get_arrow_key((int) ch)) {
 					case KEYMAP_UP:
 					case KEYMAP_DOWN:
 						default_answer = bool_not(default_answer);
-						yn_loop = TRUE; /* don't leave loop */
+						ch = '\0';	/* set to a not bindable key to not leave the loop yet */
 						break;
 
 					case KEYMAP_LEFT:
-						ch = iKeyAbort;
+						ch = ESC;
 						break;
 
 					case KEYMAP_RIGHT:
 						ch = prompt_ch;
 						break;
+
 					default:
 						break;
 				}
@@ -225,20 +247,14 @@ prompt_yn(
 			default:
 				break;
 		}
-	}
+		func = key_to_func(ch, prompt_keys);
+	} while (func == NOT_ASSIGNED);
 
 	if (!cmd_line) {
-		if (line == cLINES)
-			clear_message();
-		else {
-			MoveCursor(line, (int) strlen(prompt));
-			my_fputc(((ch == iKeyAbort) ? prompt_ch : ch), stdout);
-		}
-		cursoroff();
+		clear_message();
 		my_flush();
 	}
-
-	return (tolower((unsigned char) map_to_default(ch, &menukeymap.prompt_yn)) == tolower((unsigned char)iKeyPromptYes)) ? 1 : (ch == iKeyAbort) ? -1 : 0;
+	return (func == PROMPT_YES) ? 1 : (func == GLOBAL_ABORT) ? -1 : 0;
 }
 
 
@@ -250,7 +266,7 @@ prompt_yn(
  * ESC is used to abort any changes, RET saves changes.
  * The new value is returned.
  */
-int
+static int
 prompt_list(
 	int row,
 	int col,
@@ -261,9 +277,13 @@ prompt_list(
 	int size)
 {
 	int ch, var_orig;
-	int i;
+	int i, offset;
+	int change;
 	int adjust = (strcasecmp(_(list[0]), _(txt_default)) == 0);
 	size_t width = 0;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wchar_t *wbuf;
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 	var += adjust;
 	size += adjust;
@@ -278,15 +298,68 @@ prompt_list(
 	show_menu_help(help_text);
 	cursoron();
 
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	if ((wbuf = char2wchar_t(_(prompt_text))) != NULL) {
+		if ((offset = wcswidth(wbuf, wcslen(wbuf) + 1)) == -1) /* something went wrong, use wcslen as fallback */
+			offset = (int) wcslen(wbuf);
+		free(wbuf);
+	} else
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+		offset = (int) strlen(_(prompt_text));
+
 	do {
-		MoveCursor(row, col + (int) strlen(_(prompt_text)));
-		if ((ch = (char) ReadCh()) == ' ') {
+		MoveCursor(row, col + offset);
+		ch = (char) ReadCh();
+
+		/*
+		 * change:
+		 *   1 = move to the next list element
+		 *   0 = do nothing
+		 *  -1 = move to the previous list element
+		 *
+		 *  if an arrow key was pressed change ch to an other value
+		 *  otherwise we will exit the while loop
+		 */
+		switch (ch) {
+			case ' ':
+				change = 1;
+				break;
+
+			case ESC:	/* (ESC) common arrow keys */
+#	ifdef HAVE_KEY_PREFIX
+			case KEY_PREFIX:
+#	endif /* HAVE_KEY_PREFIX */
+				switch (get_arrow_key(ch)) {
+					case KEYMAP_UP:
+						change = -1;
+						ch = ' ';
+						break;
 
+					case KEYMAP_DOWN:
+						change = 1;
+						ch = ' ';
+						break;
+
+					default:
+						change = 0;
+						break;
+				}
+				break;
+
+			default:
+				change = 0;
+				break;
+		}
+
+		if (change) {
 			/*
-			 * Increment list, looping around at the max
+			 * increment or decrement list, loop around at the limits
 			 */
-			++var;
-			var %= size;
+			var += change;
+			if (var < 0)
+				var = size - 1;
+			else
+				var %= size;
 
 			my_printf("%-*s", (int) width, _(list[var]));
 			my_flush();
@@ -295,32 +368,47 @@ prompt_list(
 
 	if (ch == ESC) {
 		var = var_orig;
-
 		my_printf("%-*s", (int) width, _(list[var]));
 		my_flush();
 	}
 
 	cursoroff();
-
 	return (var - adjust);
 }
 
 
 /*
- * Special case of prompt_list() Toggle between ON and OFF
+ * Special case of prompt_option_list() Toggle between ON and OFF
+ * The function returns TRUE, if the value was changed, FALSE otherwise.
  */
-void
-prompt_on_off(
-	int row,
-	int col,
-	t_bool *var,
-	constext *help_text,
-	constext *prompt_text)
+t_bool
+prompt_option_on_off(
+	enum option_enum option)
 {
-	t_bool ret;
+	char prompt[LEN];
+	t_bool *variable = OPT_ON_OFF_list[option_table[option].var_index];
+	t_bool old_value = *variable;
 
-	ret = prompt_list(row, col, (int) *var, help_text, _(prompt_text), txt_onoff, 2) ? TRUE : FALSE;
-	*var = (ret != 0);
+	fmt_option_prompt(prompt, sizeof(prompt), TRUE, option);
+	*variable = prompt_list(option_row(option), 0, *variable, option_table[option].txt->help, prompt, txt_onoff, 2) ? TRUE: FALSE;
+	return *variable != old_value;
+}
+
+
+/*
+ * The function returns TRUE, if the value was changed, FALSE otherwise.
+ */
+t_bool
+prompt_option_list(
+	enum option_enum option)
+{
+	char prompt[LEN];
+	int *variable = option_table[option].variable;
+	int old_value = *variable;
+
+	fmt_option_prompt(prompt, sizeof(prompt), TRUE, option);
+	*variable = prompt_list(option_row(option), 0, *variable, option_table[option].txt->help, prompt, option_table[option].opt_list, option_table[option].opt_count);
+	return *variable != old_value;
 }
 
 
@@ -334,10 +422,10 @@ prompt_on_off(
  */
 t_bool
 prompt_option_string(
-	int option) /* return value is always ignored */
+	enum option_enum option) /* return value is always ignored */
 {
-	char prompt[LEN];
 	char *variable = OPT_STRING_list[option_table[option].var_index];
+	char prompt[LEN];
 
 	show_menu_help(option_table[option].txt->help);
 	fmt_option_prompt(prompt, sizeof(prompt) - 1, TRUE, option);
@@ -355,7 +443,7 @@ prompt_option_string(
  */
 t_bool
 prompt_option_num(
-	int option) /* return value is always ignored */
+	enum option_enum option) /* return value is always ignored */
 {
 	char prompt[LEN];
 	char number[LEN];
@@ -365,17 +453,15 @@ prompt_option_num(
 	show_menu_help(option_table[option].txt->help);
 	MoveCursor(option_row(option), 0);
 	fmt_option_prompt(prompt, sizeof(prompt) - 1, TRUE, option);
-	sprintf(&number[0], "%d", *(option_table[option].variable));
+	snprintf(&number[0], sizeof(number), "%d", *(option_table[option].variable));
 
 	if ((p = tin_getline(prompt, 2, number, 0, FALSE, HIST_OTHER)) == NULL)
 		return FALSE;
 
-	strcpy(number, p);
+	STRCPY(number, p);
 	num = atoi(number);
 	*(option_table[option].variable) = num;
-
 	clear_message();
-
 	return TRUE;
 }
 
@@ -389,7 +475,7 @@ prompt_option_num(
  */
 t_bool
 prompt_option_char(
-	int option) /* return value is always ignored */
+	enum option_enum option) /* return value is always ignored */
 {
 	char prompt[LEN];
 	char input[2];
@@ -413,7 +499,6 @@ prompt_option_char(
 	} while (!*p);
 
 	*variable = p[0];
-
 	clear_message();
 	return TRUE;
 }
@@ -509,24 +594,34 @@ prompt_msgid(
 /*
  * Format a message such that it'll fit within the screen width
  * Useful for fitting long Subjects and newsgroup names into prompts
- * TODO: maybe add a '...' to the string to show it was truncated.
- *       See center_line()
+ * result will contain a pointer to the malloced memory containing the
+ * sized message
  */
 char *
 sized_message(
+	char **result,
 	const char *format,
 	const char *subject)
 {
-	/* The formatting info (%.*s) wastes 4 chars, but our prompt needs 1 char */
-	int have = cCOLS - strlen(format) + 4 - 1;
-	int want = strlen(subject);
-
-	if (want > 0 && subject[want - 1] == '\n')
-		want--;
-	if (have > want)
-		have = want;
-	sprintf(mesg, format, have, subject);
-	return mesg;
+	char *buf;
+	int max_len;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wchar_t *wformat;
+
+	if ((wformat = char2wchar_t(format)) != NULL) {
+		/* The formatting info (%s) wastes 2 chars, but our prompt needs 1 char */
+		max_len = cCOLS - wcswidth(wformat, wcslen(wformat) + 1) + 2 - 1;
+		free(wformat);
+	} else
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+		max_len = cCOLS - strlen(format) + 2 - 1;	/* The formatting info (%s) wastes 2 chars, but our prompt needs 1 char */
+
+	buf = strunc(subject, max_len);
+
+	*result = fmt_string(format, buf);
+	free(buf);
+
+	return *result;
 }
 
 
@@ -534,35 +629,110 @@ sized_message(
  * Implement the Single-Letter-Key mini menus at the bottom of the screen
  * eg, Press a)ppend, o)verwrite, q)uit :
  */
-int
+t_function
 prompt_slk_response(
-	int ch_default,
-	const t_menukeys /* char */ *responses,
+	t_function default_func,
+	const struct keylist keys,
 	const char *fmt,
 	...)
 {
 	va_list ap;
-	char ch;
 	char buf[LEN];
+	t_function func;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wchar_t ch;
+#else
+	char ch;
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 	va_start(ap, fmt);
-	vsnprintf(buf, sizeof(buf), fmt, ap);	/* We need to do this, else wait_message() will clobber us */
+	vsnprintf(buf, sizeof(buf), fmt, ap);
 	va_end(ap);
 
-	ch_default = map_to_local(ch_default, responses);
-	do {
-		wait_message(0, "%s%c", buf, ch_default);
+	prompt_slk_message = my_malloc(strlen(buf) + 2);
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	{
+		char *tmp;
+		wchar_t wtmp[2] = { '\0', '\0' };
+
+		wtmp[0] = func_to_key(default_func, keys);
+		tmp = wchar_t2char(wtmp);
+		snprintf(prompt_slk_message, strlen(buf) + 2, "%s%s", buf, tmp);
+		FreeIfNeeded(tmp);
+	}
+#else
+	snprintf(prompt_slk_message, strlen(buf) + 2, "%s%c", buf, func_to_key(default_func, keys));
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+
+	input_context = cPromptSLK;
 
-		/* Get the cursor _just_ right */
-		MoveCursor(cLINES, (int) strlen(buf));
+	do {
+		prompt_slk_redraw();		/* draw the prompt */
 
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		if ((ch = ReadWch()) == '\r' || ch == '\n')
+#else
 		if ((ch = ReadCh()) == '\r' || ch == '\n')
-			ch = ch_default;
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+			func = default_func;
+		else
+			func = key_to_func(ch, keys);
 
-	} while (!strchr(responses->localkeys, ch));
+		/*
+		 * TODO: ignore special-keys which are represented as a
+		 *       multibyte ESC-seq to avoid interpreting them as 'ESC' only
+		 *       like it's done in the ugly code below.
+		 */
+#if 0
+		if (ch == ESC) {
+			switch (get_arrow_key(ch)) {
+				case KEYMAP_UP:
+				case KEYMAP_DOWN:
+				case KEYMAP_LEFT:
+				case KEYMAP_RIGHT:
+				case KEYMAP_PAGE_DOWN:
+				case KEYMAP_PAGE_UP:
+				case KEYMAP_HOME:
+				case KEYMAP_END:
+					ch = '\0';
+					break;
+
+				default:
+					break;
+			}
+		}
+#endif /* 0 */
+	} while (func == NOT_ASSIGNED);
+
+	input_context = cNone;
+	FreeAndNull(prompt_slk_message);
 
 	clear_message();
-	return map_to_default(ch, responses);
+	return func;
+}
+
+
+/* (Re)draws the prompt message for prompt_slk_response() */
+void
+prompt_slk_redraw(
+	void)
+{
+	int column;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wchar_t *wtmp;
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+
+	wait_message(0, "%s", prompt_slk_message);
+
+	/* get the cursor _just_ right */
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	if ((wtmp = char2wchar_t(prompt_slk_message)) != NULL) {
+		column = wcswidth(wtmp, wcslen(wtmp) + 1) - 1;
+		free(wtmp);
+	} else
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+		column = (int) strlen(prompt_slk_message) - 1;
+	MoveCursor(cLINES, column);
 }
 
 
@@ -590,6 +760,7 @@ prompt_continue(
 #	endif /* HAVE_KEY_PREFIX */
 			(void) get_arrow_key(ch);
 			/* FALLTHROUGH */
+
 		default:
 			break;
 	}
diff -Nurp tin-1.6.2/src/read.c tin-1.8.0/src/read.c
--- tin-1.6.2/src/read.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/read.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,9 +3,9 @@
  *  Module    : read.c
  *  Author    : Jason Faultless <jason@altarstone.com>
  *  Created   : 1997-04-10
- *  Updated   : 2003-05-07
+ *  Updated   : 2005-07-02
  *
- * Copyright (c) 1997-2003 Jason Faultless <jason@altarstone.com>
+ * Copyright (c) 1997-2006 Jason Faultless <jason@altarstone.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,16 +40,13 @@
 #ifndef TNNTP_H
 #	include "tnntp.h"
 #endif /* !TNNTP_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
 
 
 /*
  * The initial and expansion sizes to use for allocating read data
  */
 #define INIT					512
-#define CHUNK					256
+#define RCHUNK					256
 
 /*
  * Global error flag. Set if something abnormal happens during file I/O
@@ -64,7 +61,7 @@ static int offset = 0;
  */
 static char *tin_read(char *buffer, size_t len, FILE *fp, t_bool header);
 #ifdef NNTP_ABLE
-	static t_bool wait_for_input(void /*FILE *fd*/);
+	static t_bool wait_for_input(void);
 #endif /* NNTP_ABLE */
 
 
@@ -77,7 +74,7 @@ static char *tin_read(char *buffer, size
  */
 static t_bool
 wait_for_input(
-	void /*FILE *fd*/)
+	void)
 {
 #	ifndef HAVE_SELECT
 #		ifdef VMS
@@ -149,12 +146,12 @@ wait_for_input(
 				}
 
 				if (ch == iKeyQuit || ch == 'z' || ch == iKeyAbort) {
-					if (prompt_yn(cLINES, _(txt_read_abort), FALSE) == 1)
+					if (prompt_yn(_(txt_read_abort), FALSE) == 1)
 						return TRUE;
 				}
 
 				if (ch == iKeyQuitTin) {
-					if (prompt_yn(cLINES, _(txt_read_exit), FALSE) == 1)
+					if (prompt_yn(_(txt_read_exit), FALSE) == 1)
 						tin_done(EXIT_SUCCESS);
 				}
 
@@ -171,11 +168,6 @@ wait_for_input(
 
 	}
 #	endif /* !HAVE_SELECT */
-#	ifdef M_AMIGA
-	return FALSE;
-/* work in progress */
-/*	return (WaitForChar(Input(), 0) == DOSTRUE) ? TRUE : FALSE; */
-#	endif /* M_AMIGA */
 /*
  * FIXME: insert !HAVE_SELECT code here - NB: we already have VMS specific
  *        code at the top of this function
@@ -215,7 +207,7 @@ tin_read(
 	partial_read = FALSE;
 
 #ifdef NNTP_ABLE
-	if (wait_for_input(/* fp */)) {			/* Check if okay to read */
+	if (wait_for_input()) {			/* Check if okay to read */
 		info_message(_("Aborting read, please wait..."));
 		drain_buffer(fp);
 		clear_message();
@@ -370,8 +362,8 @@ tin_fgets(
 	next = offset;
 
 	while (partial_read) {
-		if (next + CHUNK > size)
-			size = next + CHUNK;
+		if (next + RCHUNK > size)
+			size = next + RCHUNK;
 		temp = my_realloc(dynbuf, size * sizeof(*dynbuf));
 		dynbuf = temp;
 		temp = tin_read(dynbuf + next, size - next, fp, header); /* What if == 0? */
diff -Nurp tin-1.6.2/src/refs.c tin-1.8.0/src/refs.c
--- tin-1.6.2/src/refs.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/refs.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,12 +3,12 @@
  *  Module    : refs.c
  *  Author    : Jason Faultless <jason@altarstone.com>
  *  Created   : 1996-05-09
- *  Updated   : 2003-07-22
+ *  Updated   : 2005-07-20
  *  Notes     : Cacheing of message ids / References based threading
  *  Credits   : Richard Hodson <richard@macgyver.tele2.co.uk>
  *              hash_msgid, free_msgid
  *
- * Copyright (c) 1996-2003 Jason Faultless <jason@altarstone.com>
+ * Copyright (c) 1996-2006 Jason Faultless <jason@altarstone.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -61,6 +61,7 @@ static char *_get_references(struct t_ms
 static struct t_msgid *add_msgid(int key, const char *msgid, struct t_msgid *newparent);
 static struct t_msgid *find_next(struct t_msgid *ptr);
 static struct t_msgid *parse_references(char *r);
+static t_bool valid_msgid(const char *msgid);
 static unsigned int hash_msgid(const char *key);
 static void add_to_parent(struct t_msgid *ptr);
 static void build_thread(struct t_msgid *ptr);
@@ -97,10 +98,10 @@ static struct t_msgid *msgids[MSGID_HASH
  *
  *    When threading on Refs, a much better view of the original thread
  *    can be built up using this data, and threading is much faster
- *	   because all the article relationships are automatically available
- *	   to us.
+ *    because all the article relationships are automatically available
+ *    to us.
  *
- *	  NB: We don't cache msgids from the filter file.
+ * NB: We don't cache msgids from the filter file.
  */
 
 /*
@@ -177,6 +178,36 @@ add_to_parent(
 
 
 /*
+ * Checks if Message-ID has valid format
+ * Returns TRUE if it does, FALSE if it does not
+ *
+ * TODO: combine with post.c:damaged_id()?
+ */
+static t_bool
+valid_msgid(
+	const char *msgid)
+{
+	size_t mlen = 0;
+	t_bool at_present = 0;
+
+	if (!msgid || *msgid != '<')
+		return FALSE;
+
+	while (isascii((unsigned char) *msgid) && isgraph((unsigned char) *msgid) && !iscntrl((unsigned char) *msgid) && *msgid != '>') {
+		if (*msgid == '@')
+			at_present = TRUE;
+		mlen++;
+		msgid++;
+	}
+
+	if (!at_present || (*msgid != '>') || mlen <= 2 || *(msgid + 1))
+		return FALSE;
+
+	return TRUE;
+}
+
+
+/*
  * Adds or updates a message id in the cache.
  * We return a ptr to the msgid, whether located or newly created.
  *
@@ -207,7 +238,7 @@ add_msgid(
 	struct t_msgid *newparent)
 {
 	struct t_msgid *ptr;
-	struct t_msgid *i = NULL;
+	struct t_msgid *i;
 	unsigned int h;
 
 	if (!msgid) {
@@ -248,7 +279,6 @@ add_msgid(
 		 *         Change parent from null -> not-null & update ptrs
 		 */
 		if (i->parent == NULL) {
-
 			/*
 			 * Detect & ignore circular reference paths by looking for the
 			 * new parent in this thread
@@ -367,11 +397,17 @@ parse_references(
 	 * By definition, the head of the thread has no parent
 	 */
 	parent = NULL;
+
+	if (!valid_msgid(ptr))
+		return NULL;
+
 	current = add_msgid(REF_REF, ptr, parent);
 
 	while ((ptr = strtok(NULL, REF_SEP)) != NULL) {
-		parent = current;
-		current = add_msgid(REF_REF, ptr, parent);
+		if (valid_msgid(ptr)) {
+			parent = current;
+			current = add_msgid(REF_REF, ptr, parent);
+		}
 	}
 
 	return current;
@@ -646,7 +682,7 @@ dump_msgid_threads(
  */
 #define SKIP_ART(ptr)	\
 	(ptr && (ptr->article == ART_UNAVAILABLE || \
-		(arts[ptr->article].thread != ART_NORMAL || \
+		(arts[ptr->article].thread != ART_UNTHREADED || \
 			(tinrc.kill_level == KILL_NOTHREAD && arts[ptr->article].killed))))
 
 static struct t_msgid *
@@ -695,7 +731,6 @@ find_next(
 		 * a sibling if we can find one
 		 */
 		if (ptr->child == NULL && ptr->sibling == NULL) {
-
 			while (ptr != NULL && ptr->sibling == NULL)
 				ptr = ptr->parent;
 
@@ -734,13 +769,10 @@ build_thread(
 	 * Keep working through the thread, updating the ptrs as we go
 	 */
 	while ((newptr = find_next(ptr)) != NULL) {
-
 		arts[newptr->article].prev = ptr->article;
 		arts[ptr->article].thread = newptr->article;
-
 		ptr = newptr;
 	}
-
 }
 
 
@@ -874,7 +906,7 @@ void
 build_references(
 	struct t_group *group)
 {
-	char *s, *t;
+	char *s;
 	int i;
 	struct t_article *art;
 	struct t_msgid *refs;
@@ -914,33 +946,27 @@ build_references(
 			 *
 			 * TODO: do this in a single pass
 			 */
-			while (((s = strrchr(art->refs, ' ')) != NULL) && (!strcmp(art->msgid, s + 1))) {
-				/*
-				 * Remove circular reference to current article
-				 */
-				DEBUG_PRINT((dbgfd, "removing circular reference to%s\n", s));
-				*s = '\0';
-			}
-			while (((t = strrchr(art->refs, '\t')) != NULL) && (!strcmp(art->msgid, t + 1))) {
-				/*
-				 * Remove circular reference to current article
-				 */
-				DEBUG_PRINT((dbgfd, "removing circular reference to%s\n", t));
-				*t = '\0';
+			if ((s = strrchr(art->refs, '<')) != NULL) {
+				if (!strcmp(art->msgid, s)) {
+					/*
+					 * Remove circular reference to current article
+					 */
+					DEBUG_PRINT((dbgfd, "removing circular reference to: %s\n", s));
+					*s = '\0';
+				}
 			}
-			if (t > s)
-				s = t;
-
 			if (s != NULL) {
-				art->refptr = add_msgid(MSGID_REF, art->msgid, add_msgid(REF_REF, s + 1, NULL));
+				if (valid_msgid(art->msgid))
+					art->refptr = add_msgid(MSGID_REF, art->msgid, add_msgid(REF_REF, s, NULL));
 				*s = '\0';
 			} else {
-				art->refptr = add_msgid(MSGID_REF, art->msgid, add_msgid(REF_REF, art->refs, NULL));
+				if (valid_msgid(art->msgid))
+					art->refptr = add_msgid(MSGID_REF, art->msgid, add_msgid(REF_REF, art->refs, NULL));
 				FreeAndNull(art->refs);
 			}
 		} else
-			art->refptr = add_msgid(MSGID_REF, art->msgid, NULL);
-
+			if (valid_msgid(art->msgid))
+				art->refptr = add_msgid(MSGID_REF, art->msgid, NULL);
 		FreeAndNull(art->msgid);	/* Now cached - discard this */
 	}
 
@@ -961,7 +987,7 @@ build_references(
 
 		refs = parse_references(art->refs);
 
-		if (art->refptr->parent)
+		if (art->refptr && art->refptr->parent && valid_msgid(art->refptr->parent->txt))
 			add_msgid(REF_REF, art->refptr->parent->txt, refs);
 
 		FreeAndNull(art->refs);
diff -Nurp tin-1.6.2/src/regex.c tin-1.8.0/src/regex.c
--- tin-1.6.2/src/regex.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/regex.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,11 +3,11 @@
  *  Module    : regex.c
  *  Author    : Jason Faultless <jason@altarstone.com>
  *  Created   : 1997-02-21
- *  Updated   : 2003-04-03
+ *  Updated   : 2003-12-17
  *  Notes     : Regular expression subroutines
  *  Credits   :
  *
- * Copyright (c) 1997-2003 Jason Faultless <jason@altarstone.com>
+ * Copyright (c) 1997-2006 Jason Faultless <jason@altarstone.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -46,53 +46,56 @@
 /*
  * See if pattern is matched in string. Return TRUE or FALSE
  * if icase=TRUE then ignore case in the compare
+ * if a precompiled regex is provided it will be used instead of pattern
+ *
+ * If you use match_regex() with full regexes within a loop you should always
+ * provide a precompiled error because if the compilation of the regex fails
+ * an error message will be display on each execution of match_regex()
  */
 t_bool
 match_regex(
 	const char *string,
 	char *pattern,
+	struct regex_cache *cache,
 	t_bool icase)
 {
-	const char *errmsg;
 	int error;
-	pcre *re;
-	t_bool ret = FALSE;
+	struct regex_cache tmp_cache = { NULL, NULL };
+	struct regex_cache *ptr_cache;
 
-	mesg[0] = '\0';
+	if (!tinrc.wildcard)	/* wildmat matching */
+		return wildmat(string, pattern, icase);
 
-	/*
-	 * Compile the expression internally.
-	 */
-	if ((re = pcre_compile(pattern, (icase ? PCRE_CASELESS : 0), &errmsg, &error, NULL)) == NULL) {
-		sprintf(mesg, _(txt_pcre_error_at), errmsg, error, pattern);
-		return FALSE;
+	/* full regexes */
+	if (cache != NULL && cache->re != NULL)
+		ptr_cache = cache;	/* use the provided regex cache */
+	else {
+		/* compile the regex internally */
+		if (!compile_regex(pattern, &tmp_cache, (icase ? PCRE_CASELESS : 0)))
+			return FALSE;
+		ptr_cache = &tmp_cache;
 	}
 
-	/*
-	 * Since we are running the compare only once,
-	 * we don't need to use pcre_study() to improve
-	 * performance
-	 */
+	if ((error = pcre_exec(ptr_cache->re, ptr_cache->extra, string, strlen(string), 0, 0, NULL, 0)) >= 0) {
+		FreeIfNeeded(tmp_cache.re);
+		FreeIfNeeded(tmp_cache.extra);
+
+		return TRUE;
+	}
 
+#if 0
 	/*
-	 * Only a single compare is needed to see if a match exists
-	 *
-	 * pcre_exec(precompile pattern, hints pointer, string to match,
-	 *           length of string (string may contain '\0', but not in
-	 *           our case), startoffset, options,
-	 *           vector of offsets to be filled,
-	 *           number of elements in offsets);
-	 *
+	 * match_regex() is mostly used within loops and we don't want to display
+	 * an error message on each call
 	 */
-	if ((error = pcre_exec(re, NULL, string, strlen(string), 0, 0, NULL, 0)) >= 0)
-		ret = TRUE;
-	else {
-		if (error != PCRE_ERROR_NOMATCH)
-			sprintf(mesg, _(txt_pcre_error_num), error);
-	}
+	if (error != PCRE_ERROR_NOMATCH)
+		error_message(_(txt_pcre_error_num), error);
+#endif /* 0 */
 
-	free(re);
-	return ret;
+	FreeIfNeeded(tmp_cache.re);
+	FreeIfNeeded(tmp_cache.extra);
+
+	return FALSE;
 }
 
 
@@ -106,15 +109,27 @@ compile_regex(
 	int options)
 {
 	const char *regex_errmsg = 0;
-	int regex_errpos;
+	int regex_errpos, my_options = options;
 
-	if ((cache->re = pcre_compile(regex, options, &regex_errmsg, &regex_errpos, NULL)) == NULL)
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE) && (defined(PCRE_MAJOR) && PCRE_MAJOR >= 4)
+	if (IS_LOCAL_CHARSET("UTF-8")) {
+		int i;
+
+		pcre_config(PCRE_CONFIG_UTF8, &i);
+		if (i)
+			my_options |= PCRE_UTF8;
+	}
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE && PCRE_MAJOR && PCRE_MAJOR >= 4*/
+
+	if ((cache->re = pcre_compile(regex, my_options, &regex_errmsg, &regex_errpos, NULL)) == NULL)
 		error_message(_(txt_pcre_error_at), regex_errmsg, regex_errpos, regex);
 	else {
 		cache->extra = pcre_study(cache->re, 0, &regex_errmsg);
-		if (regex_errmsg != NULL)
+		if (regex_errmsg != NULL) {
+			/* we failed, clean up */
+			FreeAndNull(cache->re);
 			error_message(_(txt_pcre_error_text), regex_errmsg);
-		else
+		} else
 			return TRUE;
 	}
 	return FALSE;
diff -Nurp tin-1.6.2/src/rfc1524.c tin-1.8.0/src/rfc1524.c
--- tin-1.6.2/src/rfc1524.c	2003-08-24 02:43:01.000000000 +0200
+++ tin-1.8.0/src/rfc1524.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : rfc1524.c
  *  Author    : Urs Janssen <urs@tin.org>, Jason Faultless <jason@altarstone.com>
  *  Created   : 2000-05-15
- *  Updated   : 2002-08-24
+ *  Updated   : 2005-07-02
  *  Notes     : mailcap parsing as defined in RFC 1524
  *
- * Copyright (c) 2000-2003 Urs Janssen <urs@tin.org>, Jason Faultless <jason@altarstone.com>
+ * Copyright (c) 2000-2006 Urs Janssen <urs@tin.org>, Jason Faultless <jason@altarstone.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -37,9 +37,7 @@
 #ifndef TIN_H
 #	include "tin.h"
 #endif /* !TIN_H */
-#ifndef RFC2046_H
-#	include "rfc2046.h"
-#endif /* RFC2046_H */
+
 
 /* TODO: what about !unix systems? */
 #define DEFAULT_MAILCAPS "~/.mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap:/etc/mail/mailcap"
@@ -65,24 +63,23 @@ get_mailcap_entry(
 	t_part *part,
 	const char *path)
 {
-	FILE *fp = (FILE *) 0;
+	FILE *fp;
 	char *ptr, *ptr2, *nptr;
 	char buf[LEN];
 	char filename[LEN];	/* name of current mailcap file */
 	char mailcap[LEN];	/* full match */
-	char mailcaps[LEN];	/* possible mailcap files */
+	char *mailcaps = NULL;	/* possible mailcap files */
 	char wildcap[LEN];	/* basetype match */
 	t_mailcap *foo = (t_mailcap *) 0;
 
-	mailcaps[0] = '\0';
 	/* build list of mailcap files */
-	if ((ptr = getenv("MAILCAPS")) != NULL) {
-		if (strlen(ptr)) {
-			STRCPY(mailcaps, ptr);
-			strncat(mailcaps, ":", sizeof(mailcaps) - 1);
-		}
-	}
-	strncat(mailcaps, DEFAULT_MAILCAPS, sizeof(mailcaps) - 1);
+	if ((ptr = getenv("MAILCAPS")) != NULL && strlen(ptr))
+			mailcaps = my_strdup(ptr);
+	if (mailcaps != NULL) {
+		mailcaps = my_realloc(mailcaps, strlen(mailcaps) + strlen(DEFAULT_MAILCAPS) + 2);
+		strcat(strcat(mailcaps, ":"), DEFAULT_MAILCAPS);
+	} else
+		mailcaps = my_strdup(DEFAULT_MAILCAPS);
 
 	mailcap[0] = '\0';
 	wildcap[0] = '\0';
@@ -117,6 +114,7 @@ get_mailcap_entry(
 								foo = parse_mailcap_line(mailcap, part, path);
 								if (foo != NULL) {
 									fclose(fp); /* perfect match with test succeded (if given) */
+									free(mailcaps);
 									return foo;
 								}
 							} else {
@@ -133,6 +131,7 @@ get_mailcap_entry(
 					} /* else invalid mailcap line (no /), no action required */
 					if (strlen(wildcap)) {	/* we just had a wildmat match */
 						fclose(fp);
+						free(mailcaps);
 						return foo;
 					}
 				} /* while ((fgets(ptr, ... */
@@ -141,6 +140,7 @@ get_mailcap_entry(
 		} /* else strfpath() failed, no action required */
 		nptr = strtok(NULL, ":"); /* get next filename */
 	}
+	free(mailcaps);
 	foo = (t_mailcap *) 0; /* no match, weed out possible junk */
 	return foo;
 }
@@ -161,19 +161,19 @@ parse_mailcap_line(
 
 	/* malloc and init */
 	tmailcap = my_malloc(sizeof(t_mailcap));
-	tmailcap->type = (char *) 0;
-	tmailcap->command = (char *) 0;
+	tmailcap->type = NULL;
+	tmailcap->command = NULL;
 	tmailcap->needsterminal = FALSE;
 	tmailcap->copiousoutput = FALSE;
 	tmailcap->textualnewlines = 0;
-	tmailcap->description = (char *) 0;
-	tmailcap->test = (char *) 0;
-	tmailcap->nametemplate = (char *) 0;
-	tmailcap->compose = (char *) 0;
-	tmailcap->composetyped = (char *) 0;
-	tmailcap->edit = (char *) 0;
-	tmailcap->print = (char *) 0;
-	tmailcap->x11bitmap = (char *) 0;
+	tmailcap->description = NULL;
+	tmailcap->test = NULL;
+	tmailcap->nametemplate = NULL;
+	tmailcap->compose = NULL;
+	tmailcap->composetyped = NULL;
+	tmailcap->edit = NULL;
+	tmailcap->print = NULL;
+	tmailcap->x11bitmap = NULL;
 
 	optr = ptr = my_strdup(mailcap);
 
@@ -353,7 +353,7 @@ expand_mailcap_meta(
 	int quote = no_quote;
 	size_t linelen, space, olen;
 
-	if ((ptr = strchr(mailcap, '%')) == NULL) /* nothing to expand */
+	if (!(strchr(mailcap, '%'))) /* nothing to expand */
 		return my_strdup(mailcap); /* waste of mem, but simplyfies the frees */
 
 	linelen = LEN * 2;					/* initial maxlen */
diff -Nurp tin-1.6.2/src/rfc2045.c tin-1.8.0/src/rfc2045.c
--- tin-1.6.2/src/rfc2045.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/rfc2045.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : rfc2045.c
  *  Author    : Chris Blum <chris@resolution.de>
  *  Created   : 1995-09-01
- *  Updated   : 2003-02-01
+ *  Updated   : 2005-05-10
  *  Notes     : RFC 2045/2047 encoding
  *
- * Copyright (c) 1995-2003 Chris Blum <chris@resolution.de>
+ * Copyright (c) 1995-2006 Chris Blum <chris@resolution.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,7 +42,9 @@
 /*
  * local prototypes
  */
+static int put_rest(char **rest, char **line, int *max_line_len, const int offset);
 static unsigned char bin2hex(unsigned int x);
+static void set_rest(char **rest, const char *ptr);
 
 
 static unsigned char
@@ -212,3 +214,311 @@ rfc1521_encode(
 	} else if (line)
 		fputs(line, f);
 }
+
+
+/*
+ * Set everything in ptr as the rest of a physical line to be processed
+ * later.
+ */
+static void
+set_rest(
+	char **rest,
+	const char *ptr)
+{
+	char *old_rest = *rest;
+
+	if (ptr == NULL || strlen(ptr) == 0) {
+		FreeAndNull(*rest);
+		return;
+	}
+	*rest = my_strdup(ptr);
+	FreeIfNeeded(old_rest);
+}
+
+
+/*
+ * Copy things that were left over from the last decoding into the new line.
+ * If there's a newline in the rest, copy everything up to and including that
+ * newline into the expected buffer, adjust rest and return. If there's no
+ * newline in the rest, copy all of it to the expected buffer and return.
+ *
+ * Side effects: resizes line if necessary, adjusts max_line_len
+ * accordingly.
+ *
+ * This function returns the number of characters written to the line buffer.
+ */
+static int
+put_rest(
+	char **rest,
+	char **line,
+	int *max_line_len,
+	const int offset)
+{
+	char *my_rest = *rest;
+	char *ptr;
+	char c;
+	int put_chars = offset;
+
+	if ((ptr = my_rest) == NULL)
+		return put_chars;
+	if (strlen(my_rest) == 0) {
+		FreeAndNull(*rest);
+		return put_chars;
+	}
+
+	while ((c = *ptr++) && (c != '\n')) {
+		if ((c == '\r') && (*ptr == '\n'))
+			continue;	/* step over CRLF */
+		/*
+		 * Resize line if necessary. Keep in mind that we add LF and \0 later.
+		 */
+		if (put_chars >= *max_line_len - 2) {
+			if (*max_line_len == 0)
+				*max_line_len = LEN;
+			else
+				*max_line_len <<= 1;
+			*line = my_realloc(*line, *max_line_len);
+		}
+		(*line)[put_chars++] = c;
+	}
+	if (c == '\n') {
+		/*
+		 * FIXME: Adding a newline may be not correct. At least it may
+		 * be not what the author of that article intended.
+		 * Unfortunately, a newline is expected at the end of a line by
+		 * some other code in cook.c and even those functions invoking
+		 * this one rely on it.
+		 */
+		(*line)[put_chars++] = '\n';
+		set_rest(rest, ptr);
+	} else /* c == 0 */
+		/* rest is now empty */
+		FreeAndNull(*rest);
+
+	(*line)[put_chars] = '\0';	/* don't count the termining NULL! */
+	return put_chars;
+}
+
+
+/*
+ * Read a logical base64 encoded line into the specified line buffer.
+ * Logical lines can be split over several physical base64 encoded lines and
+ * a single physical base64 encoded line can contain serveral logical lines.
+ * This function keeps track of all these cases and always copies only one
+ * decoded line to the line buffer.
+ *
+ * Side effects: resizes line if necessary, adjusts max_line_len
+ * accordingly.
+ *
+ * This function returns the number of physical lines read or a negative
+ * value on error.
+ */
+int
+read_decoded_base64_line(
+	FILE *file,
+	char **line,
+	int *max_line_len,
+	const int max_lines_to_read,
+	char **rest)
+{
+	char *buf2;	/* holds the entire decoded line */
+	char *buf;	/* holds the entire encoded line*/
+	int count;
+	int lines_read = 0;
+	int put_chars;
+
+	/*
+	 * First of all, catch everything that is left over from the last decoding.
+	 * If there's a newline in that rest, copy everything up to and including
+	 * that newline in the expected buffer, adjust rest and return. If there's
+	 * no newline in the rest, copy all of it (modulo length of the buffer) to
+	 * the expected buffer and continue as if there was no rest.
+	 */
+	put_chars = put_rest(rest, line, max_line_len, 0);
+	if (put_chars && ((*line)[put_chars - 1] == '\n'))
+		return 0;	/* we didn't read any new lines but filled the line */
+
+	/*
+	 * At this point, either there was no rest or there was no newline in the
+	 * rest. In any case, we need to read further encoded lines and decode
+	 * them until we find a newline or there are no more (encoded or physical)
+	 * lines in this part of the posting. To be sure, now allocate memory for
+	 * the output if it wasn't already done.
+	 */
+	if (*max_line_len == 0) {
+		*max_line_len = LEN;
+		*line = my_malloc(*max_line_len);
+	}
+
+	/*
+	 * max_lines_to_read==0 occurs at end of an encoded part and if there was
+	 * no trailing newline in the encoded text. So we put one there and exit.
+	 * FIXME: Adding a newline may be not correct. At least it may be not
+	 * what the author of that article intended. Unfortunately, a newline is
+	 * expected at the end of a line by some other code in cook.c.
+	 */
+	if (max_lines_to_read <= 0) {
+		if (put_chars) {
+			(*line)[put_chars++] = '\n';
+			(*line)[put_chars] = '\0';
+		}
+		return max_lines_to_read;
+	}
+	/*
+	 * Ok, now read a new line from the original article.
+	 */
+	do {
+		if ((buf = tin_fgets(file, FALSE)) == NULL) {
+			/*
+			 * Premature end of file (or file error), leave loop. To prevent
+			 * re-invoking of this function, set the numbers of read lines to
+			 * the expected maximum that should be read at most.
+			 *
+			 * FIXME: Adding a newline may be not correct. At least it may be
+			 * not what the author of that article intended. Unfortunately, a
+			 * newline is expected at the end of a line by some other code in
+			 * cook.c.
+			 */
+			if (put_chars > *max_line_len - 2) {
+				*max_line_len <<= 1;
+				*line = my_realloc(*line, *max_line_len);
+			}
+			(*line)[put_chars++] = '\n';
+			(*line)[put_chars] = '\0';
+			return max_lines_to_read;
+		}
+		lines_read++;
+		buf2 = my_malloc(strlen(buf) + 1); /* decoded string is always shorter than encoded string, so this is safe */
+		count = mmdecode(buf, 'b', '\0', buf2);
+		buf2[count] = '\0';
+		FreeIfNeeded(*rest);
+		*rest = buf2;
+		put_chars = put_rest(rest, line, max_line_len, put_chars);
+		if (put_chars && ((*line)[put_chars - 1] == '\n')) /* end of logical line reached */
+			return lines_read;
+	} while (lines_read < max_lines_to_read);
+	/*
+	 * FIXME: Adding a newline may be not correct. At least it may be
+	 * not what the author of that article intended. Unfortunately, a
+	 * newline is expected at the end of a line by some other code in
+	 * cook.c.
+	 */
+	if (put_chars > *max_line_len - 2) {
+		*max_line_len <<= 1;
+		*line = my_realloc(*line, *max_line_len);
+	}
+	if ((0 == put_chars) || ('\n' != (*line)[put_chars - 1]))
+			(*line)[put_chars++] = '\n';
+	(*line)[put_chars] = '\0';
+	return lines_read;
+}
+
+
+/*
+ * Read a logical quoted-printable encoded line into the specified line
+ * buffer. Quoted-printable lines can be split over several physical lines,
+ * so this function collects all affected lines, concatenates and decodes
+ * them.
+ *
+ * Side effects: resizes line if necessary, adjusts max_line_len
+ * accordingly.
+ *
+ * This function returns the number of physical lines read or a negative
+ * value on error.
+ */
+int
+read_decoded_qp_line(
+	FILE *file,
+	char **line,					/* where to copy the decoded line */
+	int *max_line_len,				/* (maximum) line length */
+	const int max_lines_to_read)	/* don't read more physical lines than told here */
+{
+	char *buf, *buf2;
+	char *ptr;
+	char c;
+	int buflen = LEN;
+	int count;
+	int lines_read = 0;
+	size_t chars_to_add;
+
+	buf = my_malloc(buflen); /* initial internal line buffer */
+	*buf = '\0';
+	do {
+		if ((buf2 = tin_fgets(file, FALSE)) == NULL) {
+			/*
+			 * Premature end of file (or file error, leave loop. To prevent
+			 * re-invokation of this function, set the numbers of read lines
+			 * to the expected maximum that should be read at most.
+			 */
+			lines_read = max_lines_to_read;
+			break;
+		}
+		lines_read++;
+		if ((chars_to_add = strlen(buf2)) == 0) /* Empty line, leave loop. */
+			break;
+
+		/*
+		 * Strip trailing white space at the end of the line.
+		 * See RFC 2045, section 6.7, #3
+		 */
+		c = buf2[chars_to_add - 1];
+		while ((chars_to_add > 0) && ((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r'))) {
+			--chars_to_add;
+			c = (chars_to_add > 0 ? buf2[chars_to_add - 1] : '\0');
+		}
+
+		/*
+		 * '=' at the end of a line indicates a soft break meaning
+		 * that the following physical line "belongs" to this one.
+		 * (See RFC 2045, section 6.7, #5)
+		 *
+		 * Skip that equal sign now; since c holds this char, the
+		 * loop is not left but the next line is read and concatenated
+		 * with this one while the '=' is overwritten.
+		 */
+		if (c == '=') /* c is 0 when chars_to_add is 0 so this is safe */
+			buf2[--chars_to_add] = '\0';
+
+		/*
+		 * Join physical lines to a logical one; keep in mind that a LF is
+		 * added afterwards.
+		 */
+		if (chars_to_add > buflen - strlen(buf) - 2) {
+			buflen <<= 1;
+			buf = my_realloc(buf, buflen);
+		}
+		strncat(buf, buf2, buflen);
+	} while ((c == '=') && (lines_read < max_lines_to_read));
+	/*
+	 * re-add newline and NULL termination at end of line
+	 * FIXME: Adding a newline may be not correct. At least it may be not
+	 * what the author of that article intended. Unfortunately, a newline is
+	 * expected at the end of a line by some other code in cook.c.
+	 */
+	strcat(buf, "\n");
+
+	/*
+	 * Now decode complete (logical) line from buf to buf2 and copy it to the
+	 * buffer where the invoking function expects it. Don't decode directly
+	 * to the buffer of the other function to prevent buffer overruns and to
+	 * decide if the encoding was ok.
+	 */
+	buf2 = my_malloc(strlen(buf) + 1); /* Don't use realloc here, tin_fgets relies on its internal state! */
+	count = mmdecode(buf, 'q', '\0', buf2);
+
+	if (count >= 0) {
+		buf2[count] = '\0';
+		ptr = buf2;
+	} else	/* error in encoding: copy raw line */
+		ptr = buf;
+
+	if (*max_line_len < (int) strlen(ptr) + 1) {
+		*max_line_len = strlen(ptr) + 1;
+		*line = my_realloc(*line, *max_line_len);
+	}
+	strncpy(*line, ptr, *max_line_len);
+	(*line)[*max_line_len - 1] = '\0'; /* be sure to terminate string */
+	free(buf);
+	free(buf2);
+	return lines_read;
+}
diff -Nurp tin-1.6.2/src/rfc2046.c tin-1.8.0/src/rfc2046.c
--- tin-1.6.2/src/rfc2046.c	2003-08-26 15:14:34.000000000 +0200
+++ tin-1.8.0/src/rfc2046.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : rfc2046.c
  *  Author    : Jason Faultless <jason@altarstone.com>
  *  Created   : 2000-02-18
- *  Updated   : 2003-08-26
+ *  Updated   : 2005-07-02
  *  Notes     : RFC 2046 MIME article parsing
  *
- * Copyright (c) 2000-2003 Jason Faultless <jason@altarstone.com>
+ * Copyright (c) 2000-2006 Jason Faultless <jason@altarstone.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,9 +38,6 @@
 #ifndef TIN_H
 #	include "tin.h"
 #endif /* !TIN_H */
-#ifndef RFC2046_H
-#	include "rfc2046.h"
-#endif /* !RFC2046_H */
 
 
 /*
@@ -69,6 +66,7 @@ static void progress(int line_count);
  * Local variables
  */
 static int art_lines = 0;		/* lines in art on spool */
+static char *progress_mesg = NULL;	/* message progress() should display */
 
 #define PARAM_SEP	"; \n"
 /* default parameters for Content-Type */
@@ -82,8 +80,8 @@ static void
 progress(
 	int line_count)
 {
-	if (line_count && line_count % MODULO_COUNT_NUM == 0)
-		show_progress(mesg, line_count, art_lines);
+	if (progress_mesg != NULL && line_count && line_count % MODULO_COUNT_NUM == 0)
+		show_progress(progress_mesg, line_count, art_lines);
 }
 
 
@@ -195,7 +193,7 @@ get_token(
 	char *dest = my_strdup(source);
 	char *ptr = dest;
 
-	while (isascii(*ptr) && isprint(*ptr) && *ptr != ' ' && !strchr(ATTRIBUTE_DELIMS, *ptr))
+	while (isascii((int) *ptr) && isprint((int) *ptr) && *ptr != ' ' && !strchr(ATTRIBUTE_DELIMS, *ptr))
 		ptr++;
 	*ptr = '\0';
 
@@ -361,6 +359,13 @@ parse_content_type(
 	/* Look up major type */
 
 	/*
+	 * TODO: remove/ignore comments in the CT-header, currently
+	 *       we do not recognize
+	 *          Content-Type: (foo) text/plain; charset=us-ascii
+	 *       as "text/plain"
+	 */
+
+	/*
 	 * Unrecognised type, treat according to RFC
 	 */
 	if ((i = content_type(type)) == -1) {
@@ -610,17 +615,19 @@ parse_header(
 			int type;
 
 			if (gnksa_split_from(ptr, addr, name, &type) == GNKSA_OK) {
+				buffer_to_ascii(addr);
+
 				if (*name) {
 					if (type == GNKSA_ADDRTYPE_OLDSTYLE)
-						sprintf(ptr, "%s (%s)", addr, rfc1522_decode(name));
+						sprintf(ptr, "%s (%s)", addr, convert_to_printable(rfc1522_decode(name)));
 					else
-						sprintf(ptr, "%s <%s>", rfc1522_decode(name), addr);
+						sprintf(ptr, "%s <%s>", convert_to_printable(rfc1522_decode(name)), addr);
 				} else
 					sprintf(ptr, "%s", addr);
 			} else
-				return ptr;
+				return convert_to_printable(ptr);
 		} else
-			return (rfc1522_decode(ptr));
+			return (convert_to_printable(rfc1522_decode(ptr)));
 	}
 
 	return ptr;
@@ -896,6 +903,13 @@ parse_multipart_article(
 				if (*line == '\0') {		/* End of MIME headers */
 					state = M_BODY;
 					curr_part->offset = ftell(artinfo->raw);
+
+					if (curr_part->type == TYPE_MULTIPART) {	/* Complex multipart article */
+						int ret;
+
+						if ((ret = parse_multipart_article(infile, artinfo, curr_part, depth + 1, show_progress_meter)) != 0)
+							return ret;							/* User abort or EOF reached */
+					}
 					break;
 				}
 
@@ -906,15 +920,7 @@ parse_multipart_article(
 				unfold_header(line);
 				if ((ptr = parse_header(line, "Content-Type", FALSE, FALSE))) {
 					parse_content_type(ptr, curr_part);
-
-					if (curr_part->type == TYPE_MULTIPART) {	/* Complex multipart article */
-						int ret;
-
-						if ((ret = parse_multipart_article(infile, artinfo, curr_part, depth + 1, show_progress_meter)) != 0)
-							return ret;							/* User abort or EOF reached */
-						else
-							break;
-					}
+					break;
 				}
 				if ((ptr = parse_header(line, "Content-Transfer-Encoding", FALSE, FALSE))) {
 					curr_part->encoding = parse_content_encoding(ptr);
@@ -999,6 +1005,7 @@ dump_uue(
 	}
 }
 
+
 static void
 dump_art(
 	t_openartinfo *art)
@@ -1092,6 +1099,45 @@ error:
 }
 
 
+/*
+ * Open a mail/news article using NNTP ARTICLE command
+ * or directly off local spool
+ * Return:
+ *		A pointer to the open postprocessed file
+ *		NULL pointer if article open fails in some way
+ */
+FILE *
+open_art_fp(
+	struct t_group *group,
+	long art)
+{
+	FILE *art_fp;
+	char buf[NNTP_STRLEN];
+
+#ifdef NNTP_ABLE
+	if (read_news_via_nntp && group->type == GROUP_TYPE_NEWS) {
+		snprintf(buf, sizeof(buf), "ARTICLE %ld", art);
+		art_fp = nntp_command(buf, OK_ARTICLE, NULL, 0);
+	} else {
+#endif /* NNTP_ABLE */
+		char pbuf[PATH_LEN];
+		char fbuf[NAME_LEN + 1];
+		char group_path[PATH_LEN];
+
+		make_group_path(group->name, group_path);
+		joinpath(buf, group->spooldir, group_path);
+		snprintf(fbuf, sizeof(fbuf), "%ld", art);
+		joinpath(pbuf, buf, fbuf);
+
+		art_fp = fopen(pbuf, "r");
+#ifdef NNTP_ABLE
+	}
+#endif /* NNTP_ABLE */
+
+	return art_fp;
+}
+
+
 /*----------- art_open() and art_close() are the only interface ---------*/
 /*------------------------for accessing articles -------------------*/
 
@@ -1110,7 +1156,8 @@ art_open(
 	struct t_article *art,
 	struct t_group *group,
 	t_openartinfo *artinfo,
-	t_bool show_progress_meter)
+	t_bool show_progress_meter,
+	char *pmesg)
 {
 	FILE *fp;
 
@@ -1123,8 +1170,12 @@ art_open(
 	fprintf(stderr, "art_open(%p)\n", (void *) artinfo);
 #endif /* DEBUG_ART */
 
-	if (parse_rfc2045_article(fp, art->line_count, artinfo, show_progress_meter) != 0)
+	progress_mesg = pmesg;
+	if (parse_rfc2045_article(fp, art->line_count, artinfo, show_progress_meter) != 0) {
+		progress_mesg = NULL;
 		return ART_ABORT;
+	}
+	progress_mesg = NULL;
 
 	/*
 	 * TODO: compare art->msgid and artinfo->hdr.messageid and issue a
diff -Nurp tin-1.6.2/src/rfc2047.c tin-1.8.0/src/rfc2047.c
--- tin-1.6.2/src/rfc2047.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/rfc2047.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : rfc2047.c
  *  Author    : Chris Blum <chris@resolution.de>
  *  Created   : 1995-09-01
- *  Updated   : 2003-04-08
+ *  Updated   : 2005-07-02
  *  Notes     : MIME header encoding/decoding stuff
  *
- * Copyright (c) 1995-2003 Chris Blum <chris@resolution.de>
+ * Copyright (c) 1995-2006 Chris Blum <chris@resolution.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,9 +38,7 @@
 #ifndef TIN_H
 #	include "tin.h"
 #endif /* !TIN_H */
-#ifndef RFC2046_H
-#	include "rfc2046.h"
-#endif /* !RFC2046_H */
+
 
 #define isreturn(c) ((c) == '\r' || ((c) == '\n'))
 
@@ -71,16 +69,32 @@ static unsigned char base64_rank[256];
 static int base64_rank_table_built;
 static t_bool quoteflag;
 
+/* fixed prefix and default part for tin-generated MIME boundaries */
+static const char MIME_BOUNDARY_PREFIX[] = "=_tin=_";
+static const char MIME_BOUNDARY_DEFAULT_PART[] = "====____====____====____";
+/* required size of a buffer containing a MIME boundary, including the final '\0' */
+enum {
+	MIME_BOUNDARY_SIZE = sizeof(MIME_BOUNDARY_PREFIX) + sizeof(MIME_BOUNDARY_DEFAULT_PART) - 1
+};
+
 /*
  * local prototypes
  */
+static FILE *compose_message_rfc822(FILE *articlefp, t_bool *is_8bit);
+static FILE *compose_multipart_mixed(FILE *textfp, FILE *articlefp);
 static int do_b_encode(char *w, char *b, int max_ewsize, t_bool isstruct_head);
 static int sizeofnextword(char *w);
 static int which_encoding(char *w);
+static t_bool contains_8bit_characters(FILE *fp);
 static t_bool contains_nonprintables(char *w, t_bool isstruct_head);
+static t_bool contains_string(FILE *fp, const char *str);
 static t_bool rfc1522_do_encode(char *what, char **where, const char *charset, t_bool break_long_line);
+static t_bool split_mail(const char *filename, FILE **headerfp, FILE **textfp);
 static unsigned hex2bin(int x);
 static void build_base64_rank_table(void);
+static void do_rfc15211522_encode(FILE *f, constext * mime_encoding, struct t_group *group, t_bool allow_8bit_header, t_bool ismail, t_bool contains_headers);
+static void generate_mime_boundary(char *boundary, FILE *f, FILE *g);
+static void generate_random_mime_boundary(char *boundary, size_t len);
 static void str2b64(const char *from, char *to);
 
 
@@ -133,6 +147,9 @@ mmdecode(
 		int x;
 		unsigned hi, lo;
 
+		if (!what || !where) /* should not happen with 'q'-encoding */
+			return -1;
+
 		while (*what != delimiter) {
 			if (*what != '=') {
 				if (!delimiter || *what != '_')
@@ -165,12 +182,14 @@ mmdecode(
 		static int bits = 0;
 		unsigned char x;
 
-		build_base64_rank_table();
 		if (!what || !where) {		/* flush */
 			pattern = 0;
 			bits = 0;
 			return 0;
 		}
+
+		build_base64_rank_table();
+
 		while (*what != delimiter) {
 			x = base64_rank[(int) (*what++)];
 			/* ignore everything not in the alphabet, including '=' */
@@ -258,7 +277,7 @@ rfc1522_decode(
 				c++;
 				encoding = tolower((unsigned char)*c);
 				if (encoding == 'b')
-					(void) mmdecode((char *) 0, 'b', 0, (char *) 0);	/* flush */
+					(void) mmdecode(NULL, 'b', 0, NULL);	/* flush */
 				c++;
 				if (*c == '?') {
 					c++;
@@ -539,7 +558,7 @@ rfc1522_do_encode(
 		if (contains_nonprintables(what, isstruct_head) || isbroken_within) {
 			if (encoding == 'Q') {
 				if (!quoting) {
-					sprintf(buf2, "=?%s?%c?", charset, encoding);
+					snprintf(buf2, sizeof(buf2), "=?%s?%c?", charset, encoding);
 					ewsize = mystrcat(&t, buf2);
 					if (break_long_line) {
 						if (word_cnt == 2) {
@@ -563,7 +582,7 @@ rfc1522_do_encode(
 					if (is_EIGHT_BIT(what) || !isalnum((int)(unsigned char) *what))
 #endif /* 0 */
 					{
-						sprintf(buf2, "=%2.2X", *EIGHT_BIT(what));
+						snprintf(buf2, sizeof(buf2), "=%2.2X", *EIGHT_BIT(what));
 						*t++ = buf2[0];
 						*t++ = buf2[1];
 						*t++ = buf2[2];
@@ -608,7 +627,7 @@ rfc1522_do_encode(
 							*t++ = '_';
 							ewsize++;
 						} else {
-							sprintf(buf2, "=%2.2X", *EIGHT_BIT(what));
+							snprintf(buf2, sizeof(buf2), "=%2.2X", *EIGHT_BIT(what));
 							*t++ = buf2[0];
 							*t++ = buf2[1];
 							*t++ = buf2[2];
@@ -626,7 +645,7 @@ rfc1522_do_encode(
 				 * contain_nonprintables used in outer if-clause
 				 */
 				while (*what && (!isbetween(*what, isstruct_head) || rightafter_ew)) {
-					sprintf(buf2, "=?%s?%c?", charset, encoding);
+					snprintf(buf2, sizeof(buf2), "=?%s?%c?", charset, encoding);
 					ewsize = mystrcat(&t, buf2);
 
 					if (word_cnt == 2)
@@ -745,15 +764,20 @@ rfc1522_encode(
 }
 
 
-void
-rfc15211522_encode(
-	const char *filename,
+/*
+ * Helper function doing the hard work for rfc15211522_encode().
+ * Code moved from rfc15211522_encode(), with some adjustments to work on a
+ * file specified by a FILE* instead of a filename.
+ */
+static void
+do_rfc15211522_encode(
+	FILE *f,
 	constext * mime_encoding,
 	struct t_group *group,
 	t_bool allow_8bit_header,
-	t_bool ismail)
+	t_bool ismail,
+	t_bool contains_headers)
 {
-	FILE *f;
 	FILE *g;
 	char *c;
 	char *header;
@@ -763,7 +787,7 @@ rfc15211522_encode(
 	BodyPtr body_encode;
 	int i;
 #ifdef CHARSET_CONVERSION
-	int mmnwcharset = 0;
+	int mmnwcharset;
 
 	if (group) /* Posting */
 		mmnwcharset = group->attribute->mm_network_charset;
@@ -773,14 +797,10 @@ rfc15211522_encode(
 
 	if ((g = tmpfile()) == NULL)
 		return;
-	if ((f = fopen(filename, "r")) == NULL) {
-		fclose(g);
-		return;
-	}
 
 	quoteflag = FALSE;
 
-	while ((header = tin_fgets(f, TRUE))) {
+	while (contains_headers && (header = tin_fgets(f, TRUE))) {
 #ifdef CHARSET_CONVERSION
 		buffer_to_network(header, mmnwcharset);
 #endif /* CHARSET_CONVERSION */
@@ -821,13 +841,12 @@ rfc15211522_encode(
 			}
 		}
 	}
-	fclose(f);
-	rewind(g);
 
-	if ((f = fopen(filename, "w")) == NULL) {
-		fclose(g);
-		return;
-	}
+	rewind(g);
+	rewind(f);
+#ifdef HAVE_FTRUNCATE
+	ftruncate(fileno(f), 0);
+#endif /* HAVE_FTRUNCATE */
 
 	/* copy header */
 	while (fgets(buffer, 2048, g) && !isreturn(buffer[0]))
@@ -855,7 +874,8 @@ rfc15211522_encode(
 		 * now add MIME headers as necessary
 		 */
 		if (mime_headers_needed) {
-			fprintf(f, "MIME-Version: %s\n", MIME_SUPPORTED_VERSION);
+			if (contains_headers)
+				fprintf(f, "MIME-Version: %s\n", MIME_SUPPORTED_VERSION);
 #ifdef CHARSET_CONVERSION
 			fprintf(f, "Content-Type: text/plain; charset=%s\n", txt_mime_charsets[mmnwcharset]);
 #else
@@ -893,5 +913,354 @@ rfc15211522_encode(
 	}
 
 	fclose(g);
-	fclose(f);
+}
+
+
+void
+rfc15211522_encode(
+	const char *filename,
+	constext * mime_encoding,
+	struct t_group *group,
+	t_bool allow_8bit_header,
+	t_bool ismail)
+{
+	FILE *fp;
+
+	if ((fp = fopen(filename, "r+")) == NULL)
+		return;
+
+	do_rfc15211522_encode(fp, mime_encoding, group, allow_8bit_header, ismail, TRUE);
+
+	fclose(fp);
+}
+
+
+/*
+ * Generate a MIME boundary being unique with high probability, consisting
+ * of len - 1 random characters.
+ * This function is used as a last resort if anything else failed to
+ * generate a truly unique boundary.
+ */
+static void
+generate_random_mime_boundary(
+	char *boundary,
+	size_t len)
+{
+	size_t i;
+
+	srand((unsigned int) time(NULL));
+	for (i = 0; i < len - 1; i++)
+		boundary[i] = base64_alphabet[rand() % sizeof(base64_alphabet)];
+	boundary[len - 1] = '\0';
+}
+
+
+/*
+ * Generate a unique MIME boundary.
+ * boundary must have enough space for at least MIME_BOUNDARY_SIZE characters.
+ */
+static void
+generate_mime_boundary(
+	char *boundary,
+	FILE *f,
+	FILE *g)
+{
+	const char nice_chars[] = { '-', '_', '=' };
+	const size_t prefix_len = sizeof(MIME_BOUNDARY_PREFIX) - 1;
+	char *s;
+	size_t i = 0;
+	t_bool unique = FALSE;
+
+	/*
+	 * Choose MIME boundary as follows:
+	 *   - Always start with MIME_BOUNDARY_PREFIX.
+	 *   - Append MIME_BOUNDARY_DEFAULT_PART.
+	 *   - If necessary, change it from right to left, choosing from a set of
+	 *     `nice_chars' characters.
+	 *   - After that, if it is still not unique, replace MIME_BOUNDARY_DEFAULT_PART
+	 *     with random characters and hope the best.
+	 */
+
+	strcpy(boundary, MIME_BOUNDARY_PREFIX);
+	strcat(boundary, MIME_BOUNDARY_DEFAULT_PART);
+
+	s = boundary + MIME_BOUNDARY_SIZE - 2; /* set s to last character before '\0' */
+	do {
+		/*
+		 * Scan for entire boundary in both f and g.
+		 * When found: modify and redo.
+		 */
+		if (contains_string(f, boundary) || contains_string(g, boundary)) {
+			*s = nice_chars[i];
+			if ((i = (i + 1) % sizeof(nice_chars)) == 0)
+				--s;
+		} else
+			unique = TRUE;
+	} while (!unique && s >= boundary + prefix_len);
+
+	if (!unique)
+		generate_random_mime_boundary(boundary + prefix_len, sizeof(MIME_BOUNDARY_DEFAULT_PART));
+}
+
+
+/*
+ * Split mail into header and (optionally) body.
+ *
+ * If textfp is not NULL, everything behind the header is stored in it.
+ * Whenever an error is encountered, all files are closed and FALSE is returned.
+ */
+static t_bool
+split_mail(
+	const char *filename,
+	FILE **headerfp,
+	FILE **textfp)
+{
+	FILE *fp;
+	char *line;
+
+	if ((fp = fopen(filename, "r")) == NULL)
+		return FALSE;
+
+	/* Header */
+	if ((*headerfp = tmpfile()) == NULL) {
+		fclose(fp);
+		return FALSE;
+	}
+
+	while ((line = tin_fgets(fp, TRUE))) {
+		if (*line == '\0')
+			break;
+		else
+			fprintf(*headerfp, "%s\n", line);
+	}
+
+	/* Body */
+	if (textfp != NULL) {
+		if ((*textfp = tmpfile()) == NULL) {
+			fclose(fp);
+			fclose(*headerfp);
+			return FALSE;
+		}
+
+		while ((line = tin_fgets(fp, FALSE)))
+			fprintf(*textfp, "%s\n", line);
+	}
+
+	fclose(fp);
+	return TRUE;
+}
+
+
+/*
+ * Compose a mail consisting of a sole text/plain MIME part.
+ */
+void
+compose_mail_text_plain(
+	const char *filename,
+	struct t_group *group)
+{
+	rfc15211522_encode(filename, txt_mime_encodings[tinrc.mail_mime_encoding], group, tinrc.mail_8bit_header, TRUE);
+}
+
+
+/*
+ * Compose a mail consisting of an optional text/plain and a message/rfc822
+ * part.
+ *
+ * At this point, the file denoted by `filename' contains some common headers
+ * and any text the user entered. The file `articlefp' contains the forwarded
+ * article in raw form.
+ */
+void
+compose_mail_mime_forwarded(
+	const char *filename,
+	FILE *articlefp,
+	t_bool include_text,
+	struct t_group *group)
+{
+	FILE *fp;
+	FILE *headerfp;
+	FILE *textfp = NULL;
+	FILE *entityfp;
+	char *line;
+	constext* encoding = txt_mime_encodings[tinrc.mail_mime_encoding];
+	t_bool allow_8bit_header = tinrc.mail_8bit_header;
+	t_bool _8bit;
+
+	/* Split mail into headers and text */
+	if (!split_mail(filename, &headerfp, include_text ? &textfp : NULL))
+		return;
+
+	/* Encode header and text */
+	rewind(headerfp);
+	do_rfc15211522_encode(headerfp, encoding, group, allow_8bit_header, TRUE, TRUE);
+
+	if (textfp) {
+		rewind(textfp);
+		do_rfc15211522_encode(textfp, encoding, group, allow_8bit_header, TRUE, FALSE);
+	}
+
+	/* Compose top-level MIME entity */
+	if (include_text)
+		entityfp = compose_multipart_mixed(textfp, articlefp);
+	else
+		entityfp = compose_message_rfc822(articlefp, &_8bit);
+
+	if (entityfp == NULL) {
+		fclose(headerfp);
+		if (textfp)
+			fclose(textfp);
+		return;
+	}
+
+	/* Put it all together */
+	if ((fp = fopen(filename, "w")) == NULL)
+		return;
+
+	rewind(headerfp);
+	while ((line = tin_fgets(headerfp, TRUE))) {
+		if (*line != '\0')
+			fprintf(fp, "%s\n", line);
+	}
+	fprintf(fp, "MIME-Version: %s\n", MIME_SUPPORTED_VERSION);
+	rewind(entityfp);
+	copy_fp(entityfp, fp);
+
+	/* Clean up */
+	fclose(fp);
+	fclose(headerfp);
+	fclose(entityfp);
+	if (textfp)
+		fclose(textfp);
+}
+
+
+/*
+ * Compose a message/rfc822 MIME entity containing articlefp.
+ */
+static FILE *
+compose_message_rfc822(
+	FILE *articlefp,
+	t_bool *is_8bit)
+{
+	FILE *fp;
+
+	if ((fp = tmpfile()) == NULL)
+		return NULL;
+
+	*is_8bit = contains_8bit_characters(articlefp);
+
+	/* Header: CT, CD, CTE */
+	fprintf(fp, "Content-Type: message/rfc822\n");
+	fprintf(fp, "Content-Disposition: inline\n");
+	fprintf(fp, "Content-Transfer-Encoding: %s\n", *is_8bit ? txt_8bit : txt_7bit);
+	fputc('\n', fp);
+
+	/* Body: articlefp */
+	rewind(articlefp);
+	copy_fp(articlefp, fp);
+
+	return fp;
+}
+
+
+/*
+ * Compose a multipart/mixed MIME entity consisting of a text/plain and a
+ * message/rfc822 part.
+ */
+static FILE *
+compose_multipart_mixed(
+	FILE *textfp,
+	FILE *articlefp)
+{
+	FILE *fp;
+	FILE *messagefp;
+	char boundary[MIME_BOUNDARY_SIZE];
+	t_bool requires_8bit;
+
+	if ((fp = tmpfile()) == NULL)
+		return NULL;
+
+	/* First compose message/rfc822 part (needed for choosing the appropriate CTE) */
+	if ((messagefp = compose_message_rfc822(articlefp, &requires_8bit)) == NULL) {
+		fclose(fp);
+		return NULL;
+	}
+
+	requires_8bit = (requires_8bit || contains_8bit_characters(textfp));
+
+	/* Header: CT with multipart boundary, CTE */
+	generate_mime_boundary(boundary, textfp, articlefp);
+	fprintf(fp, "Content-Type: multipart/mixed; boundary=\"%s\"\n", boundary);
+	fprintf(fp, "Content-Transfer-Encoding: %s\n\n", requires_8bit ? txt_8bit : txt_7bit);
+
+	/*
+	 * preamble
+	 * TODO: -> lang.c
+	 */
+	fprintf(fp, _("This message has been composed in the 'multipart/mixed' MIME-format. If you\n\
+are reading this prefix, your mail reader probably has not yet been modified\n\
+to understand the new format, and some of what follows may look strange.\n\n"));
+
+	/*
+	 * Body: boundary+text, message/rfc822 part, closing boundary
+	 */
+	/* text */
+	fprintf(fp, "--%s\n", boundary);
+	rewind(textfp);
+	copy_fp(textfp, fp);
+	fputc('\n', fp);
+
+	/* message/rfc822 part */
+	fprintf(fp, "--%s\n", boundary);
+	rewind(messagefp);
+	copy_fp(messagefp, fp);
+	fputc('\n', fp);
+
+	/* closing boundary */
+	fprintf(fp, "--%s--\n", boundary);
+	/* TODO: insert an epilogue here? */
+
+	return fp;
+}
+
+
+/*
+ * Determines whether the file denoted by fp contains 8bit characters.
+ */
+static t_bool
+contains_8bit_characters(
+	FILE *fp)
+{
+	char *line;
+
+	rewind(fp);
+	while ((line = tin_fgets(fp, FALSE))) {
+		for ( ; *line != '\0'; line++) {
+			if (is_EIGHT_BIT(line))
+				return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
+
+/*
+ * Determines whether any line of the file denoted by fp contains str.
+ */
+static t_bool
+contains_string(
+	FILE *fp,
+	const char *str)
+{
+	char *line;
+
+	rewind(fp);
+	while ((line = tin_fgets(fp, FALSE))) {
+		if (strstr(line, str))
+			return TRUE;
+	}
+
+	return FALSE;
 }
diff -Nurp tin-1.6.2/src/save.c tin-1.8.0/src/save.c
--- tin-1.6.2/src/save.c	2003-08-26 20:26:16.000000000 +0200
+++ tin-1.8.0/src/save.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : save.c
  *  Author    : I. Lea & R. Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 2003-08-26
+ *  Updated   : 2005-07-02
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,12 +41,6 @@
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
-#ifndef RFC2046_H
-/* #	include "rfc2046.h" */
-#endif /* !RFC2046_H */
 
 #ifdef HAVE_UUDEVIEW_H
 #	ifndef __UUDEVIEW_H__
@@ -100,12 +94,12 @@ check_start_save_any_news(
 	FILE *artfp, *savefp;
 	FILE *fp_log = (FILE *) 0;
 	char *line;
-	char buf[LEN], logfile[LEN];
+	char buf[LEN];
 	char group_path[PATH_LEN];
 	char path[PATH_LEN];
-	char savefile[PATH_LEN];
+	char logfile[PATH_LEN], savefile[PATH_LEN];
 	char subject[HEADER_LEN];
-	int group_count;
+	int group_count = 0;
 	int i, j;
 	int art_count, hot_count;
 	int saved_arts = 0;					/* Total # saved arts */
@@ -148,14 +142,19 @@ check_start_save_any_news(
 			break;
 	}
 
-	group_count = 0;
-
 	/*
 	 * For each group we subscribe to...
 	 */
 	for (i = 0; i < selmenu.max; i++) {
 		art_count = hot_count = 0;
 		group = &active[my_group[i]];
+		/*
+		 * FIXME: workaround to get a valid CURR_GROUP
+		 * it also points to the currently processed group so that
+		 * the correct attributes are used
+		 * The correct fix is to get rid of CURR_GROUP
+		 */
+		selmenu.curr = i;
 
 		if (group->bogus || !group->subscribed)
 			continue;
@@ -203,10 +202,8 @@ check_start_save_any_news(
 					art_count++;
 					if (arts[j].score >= tinrc.score_select)
 						hot_count++;
-#if 0 /* is "-cZ" usefull? */
 					if (catchup)
 						art_mark(group, &arts[j], ART_READ);
-#endif /* 0 */
 					break;
 
 				case START_ANY_NEWS:
@@ -231,7 +228,7 @@ check_start_save_any_news(
 						continue;
 					}
 
-					if (function == MAIL_ANY_NEWS) {
+					if ((function == MAIL_ANY_NEWS) && ((INTERACTIVE_NONE == tinrc.interactive_mailer) || (INTERACTIVE_WITH_HEADERS == tinrc.interactive_mailer))) {
 						fprintf(savefp, "To: %s\n", mail_news_user);
 						fprintf(savefp, "Subject: %s\n", arts[j].subject);
 						/*
@@ -288,7 +285,10 @@ check_start_save_any_news(
 
 	switch (function) {
 		case CHECK_ANY_NEWS:
-			if (unread_news)
+			/*
+			 * TODO: shall we return 2 or 0 in the -cZ case?
+			 */
+			if (unread_news && !catchup)
 				return 2;
 			else {
 				if (verbose)
@@ -340,8 +340,8 @@ open_save_filename(
 	FILE *fp;
 	char keyappend[MAXKEYLEN], keyoverwrite[MAXKEYLEN], keyquit[MAXKEYLEN];
 	char mode[3];
-	int ch;
 	struct stat st;
+	t_function func;
 
 	strcpy(mode, "a+");
 
@@ -358,27 +358,31 @@ open_save_filename(
 		}
 /* TODO: will this get called every art? Should only be done once/batch */
 /* TODO: or add an option for defaulting on all future queries */
-		ch = prompt_slk_response(tinrc.default_save_mode,
-				&menukeymap.save_append_overwrite_quit,
+/* TODO: 'truncate' path if query exceeds screen-width */
+		func = prompt_slk_response((tinrc.default_save_mode == 'a' ? SAVE_APPEND_FILE : SAVE_OVERWRITE_FILE),
+				save_append_overwrite_keys,
 				_(txt_append_overwrite_quit), path,
-				printascii(keyappend, map_to_local(iKeySaveAppendFile, &menukeymap.save_append_overwrite_quit)),
-				printascii(keyoverwrite, map_to_local(iKeySaveOverwriteFile, &menukeymap.save_append_overwrite_quit)),
-				printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.save_append_overwrite_quit)));
+				printascii(keyappend, func_to_key(SAVE_APPEND_FILE, save_append_overwrite_keys)),
+				printascii(keyoverwrite, func_to_key(SAVE_OVERWRITE_FILE, save_append_overwrite_keys)),
+				printascii(keyquit, func_to_key(GLOBAL_QUIT, save_append_overwrite_keys)));
 
-		switch (ch) {
-			case iKeySaveOverwriteFile:
+		switch (func) {
+			case SAVE_OVERWRITE_FILE:
 				strcpy(mode, "w");
 				break;
 
-			case iKeyAbort:
-			case iKeyQuit:
+			case GLOBAL_ABORT:
+			case GLOBAL_QUIT:
 				wait_message(1, _(txt_art_not_saved));
 				return NULL;
 
-			default:	/* iKeySaveAppendFile */
+			default:	/* SAVE_APPEND_FILE */
 				break;
 		}
-		tinrc.default_save_mode = ch;
+		if (func == SAVE_OVERWRITE_FILE)
+			tinrc.default_save_mode = 'o';
+		else
+			tinrc.default_save_mode = 'a';
 	}
 
 	if ((fp = fopen(path, mode)) == NULL) {
@@ -438,7 +442,7 @@ save_and_process_art(
 	 * If using the auto-save feature on an article with Archive-Name,
 	 * the path will be: <original-path>/<archive-name>/<part|patch><part#>
 	 */
-	if (!is_mailbox && CURR_GROUP.attribute->auto_save && artptr->archive) {
+	if (!is_mailbox && curr_group->attribute->auto_save && artptr->archive) {
 		const char *partprefix;
 		char *ptr;
 		char archpath[PATH_LEN];
@@ -503,8 +507,7 @@ save_and_process_art(
 		 */
 	}
 
-	if (copy_fp(artinfo->raw, fp))
-		/* Write tailing newline or MMDF-mailbox seperator */
+	if (copy_fp(artinfo->raw, fp)) /* Write tailing newline or MMDF-mailbox seperator */
 		print_art_seperator_line(fp, is_mailbox);
 	else {
 		fclose(fp);
@@ -616,10 +619,7 @@ expand_save_filename(
 	char *outpath,
 	const char *path)
 {
-	int ret;
-	struct t_group *group = &CURR_GROUP;
-
-	ret = strfpath(path, outpath, PATH_LEN, group);
+	int ret = strfpath(path, outpath, PATH_LEN, curr_group);
 
 	/*
 	 * If no path exists or the above failed in some way, use sensible defaults
@@ -628,7 +628,7 @@ expand_save_filename(
 	if ((ret == 0) || !(strrchr(outpath, DIRSEP))) {
 		char buf[PATH_LEN];
 
-		if (!strfpath(group->attribute->savedir, buf, sizeof(buf), group))
+		if (!strfpath(curr_group->attribute->savedir, buf, sizeof(buf), curr_group))
 			joinpath(buf, homedir, DEFAULT_SAVEDIR);
 		joinpath(outpath, buf, path);
 		return FALSE;
@@ -646,7 +646,7 @@ expand_save_filename(
  */
 t_bool
 post_process_files(
-	int proc_type_ch,
+	t_function proc_type_func,
 	t_bool auto_delete)
 {
 	if (num_save < 1)
@@ -658,13 +658,13 @@ post_process_files(
 #endif /* USE_CURSES */
 	my_printf("%s%s", _(txt_post_processing), cCRLF);
 
-	switch (proc_type_ch) {
-		case iKeyPProcShar:
+	switch (proc_type_func) {
+		case POSTPROCESS_SHAR:
 			post_process_sh();
 			break;
 
 		/* This is the default, eg, with AUTOSAVE */
-		case iKeyPProcYes:
+		case POSTPROCESS_YES:
 		default:
 			post_process_uud();
 			break;
@@ -713,8 +713,8 @@ post_process_uud(
 {
 	FILE *fp_in;
 	char file_out_dir[PATH_LEN];
-	int i;
 	const char *eptr;
+	int i;
 	int count;
 	int errors = 0;
 	uulist *item;
@@ -734,13 +734,13 @@ post_process_uud(
 		}
 	}
 
+#	if 0
 	/*
 	 * uudeview's "intelligent" multi-part detection
 	 * From the uudeview docs: This function is a bunch of heuristics, and I
 	 * don't really trust them... should only be called as a last resort on
 	 * explicit user request
 	 */
-#	if 0
 	UUSmerge(0);
 	UUSmerge(1);
 	UUSmerge(99);
@@ -805,13 +805,13 @@ post_process_uud(
 	void)
 {
 	FILE *fp_in;
-	char file_out_dir[PATH_LEN];
-	int i;
 	FILE *fp_out = NULL;
 	char *filename = NULL;
+	char file_out_dir[PATH_LEN];
 	char path[PATH_LEN];
 	char s[LEN], t[LEN], u[LEN];
-	int state;
+	int state = INITIAL;
+	int i;
 	mode_t mode = 0;
 
 	/*
@@ -822,10 +822,7 @@ post_process_uud(
 	t[0] = '\0';
 	u[0] = '\0';
 
-	state = INITIAL;
-
 	for (i = 0; i < num_save; i++) {
-
 		if ((fp_in = fopen(save[i].path, "r")) == NULL)
 			continue;
 
@@ -856,7 +853,7 @@ post_process_uud(
 
 						filename = name;
 						expand_save_filename(path, filename);
-						filename = strrchr(path, DIRSEP) + 1;  /* ptr to filename portion */
+						filename = strrchr(path, DIRSEP) + 1;	/* ptr to filename portion */
 						if ((fp_out = fopen(path, "w")) == NULL) {
 							perror_message(_(txt_cannot_open), path);
 							return;
@@ -1202,7 +1199,8 @@ decode_save_one(
 	/*
 	 * Decode this message part if appropriate
 	 */
-	if (!(check_save_mime_type(part, CURR_GROUP.attribute->mime_types_to_save))) {
+	if (!(check_save_mime_type(part, curr_group->attribute->mime_types_to_save))) {
+		/* TODO: skip message if saving multiple files (e.g. save 't'agged) */
 		wait_message(1, "Skipped %s/%s", content_types[part->type], part->subtype);	/* TODO: better msg */
 		return TRUE;
 	}
@@ -1287,7 +1285,7 @@ decode_save_one(
 		}
 	} else {
 		snprintf(buf, sizeof(buf), _(txt_view_attachment), savepath, content_types[part->type], part->subtype);
-		if ((i = prompt_yn(cLINES, buf, TRUE)) == 1)
+		if ((i = prompt_yn(buf, TRUE)) == 1)
 			start_viewer(part, savepath);
 		else if (i == -1) {	/* Skip rest of attachments */
 			unlink(savepath);
@@ -1304,7 +1302,7 @@ decode_save_one(
 	}
 	if (!postproc) {
 		snprintf(buf, sizeof(buf), _(txt_save_attachment), savepath, content_types[part->type], part->subtype);
-		if ((i = prompt_yn(cLINES, buf, FALSE)) != 1) {
+		if ((i = prompt_yn(buf, FALSE)) != 1) {
 			unlink(savepath);
 			if (i == -1)	/* Skip rest of attachments */
 				return FALSE;
@@ -1453,7 +1451,7 @@ decode_save_mime(
 		 * the role of a multipart part. Check to see if we want to
 		 * save text and if not, skip this part.
 		 */
-		if ((ptr->type == TYPE_MULTIPART || ((NULL != ptr->uue) && (!check_save_mime_type(ptr, CURR_GROUP.attribute->mime_types_to_save)))))
+		if ((ptr->type == TYPE_MULTIPART || ((NULL != ptr->uue) && (!check_save_mime_type(ptr, curr_group->attribute->mime_types_to_save)))))
 			continue;
 
 		if (!(decode_save_one(ptr, art->raw, postproc)))
diff -Nurp tin-1.6.2/src/screen.c tin-1.8.0/src/screen.c
--- tin-1.6.2/src/screen.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/screen.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : screen.c
  *  Author    : I. Lea & R. Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 2003-08-03
+ *  Updated   : 2005-02-11
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,12 +42,11 @@
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
 
-char mesg[LEN];
-
 #ifndef USE_CURSES
 	struct t_screen *screen;
 #endif /* !USE_CURSES */
 
+
 /*
  * Move the cursor to the lower-left of the screen, where it won't be annoying
  */
@@ -61,6 +60,33 @@ stow_cursor(
 
 
 /*
+ * helper for the varius *_message() functions
+ * returns a pointer to an allocated buffer with the formated message
+ * must be freed if not needed anymore
+ */
+char *
+fmt_message(
+	const char *fmt,
+	va_list ap)
+{
+	char *msg;
+#ifdef HAVE_VASPRINTF
+
+	if (vasprintf(&msg, fmt, ap) == -1)	/* something went wrong */
+#endif /* HAVE_VASPRINTF */
+	{
+		size_t size = LEN;
+
+		msg = my_malloc(size);
+		/* TODO: realloc msg if necessary */
+		vsnprintf(msg, size, fmt, ap);
+	}
+
+	return msg;
+}
+
+
+/*
  * Centre a formatted colour message at the bottom of the screen
  */
 void
@@ -68,6 +94,7 @@ info_message(
 	const char *fmt,
 	...)
 {
+	char *buf;
 	va_list ap;
 
 	va_start(ap, fmt);
@@ -77,9 +104,9 @@ info_message(
 	fcol(tinrc.col_message);
 #endif /* HAVE_COLOR */
 
-	vsnprintf(mesg, sizeof(mesg), fmt, ap);
-
-	center_line(cLINES, FALSE, mesg);	/* center the message at screen bottom */
+	buf = fmt_message(fmt, ap);
+	center_line(cLINES, FALSE, buf);	/* center the message at screen bottom */
+	free(buf);
 
 #ifdef HAVE_COLOR
 	fcol(tinrc.col_normal);
@@ -99,6 +126,7 @@ wait_message(
 	const char *fmt,
 	...)
 {
+	char *buf;
 	va_list ap;
 
 	va_start(ap, fmt);
@@ -108,8 +136,9 @@ wait_message(
 	fcol(tinrc.col_message);
 #endif /* HAVE_COLOR */
 
-	vsnprintf(mesg, sizeof(mesg), fmt, ap);
-	my_fputs(mesg, stdout);
+	buf = fmt_message(fmt, ap);
+	my_fputs(buf, stdout);
+	free(buf);
 
 #ifdef HAVE_COLOR
 	fcol(tinrc.col_normal);
@@ -132,16 +161,18 @@ error_message(
 	const char *fmt,
 	...)
 {
+	char *buf;
 	va_list ap;
 
 	va_start(ap, fmt);
 
 	errno = 0;
 	clear_message();
-	vsnprintf(mesg, sizeof(mesg), fmt, ap);
 
-	my_fputs(mesg, stderr);	/* don't use my_fprintf() here due to %format chars */
+	buf = fmt_message(fmt, ap);
+	my_fputs(buf, stderr);	/* don't use my_fprintf() here due to %format chars */
 	my_fflush(stderr);
+	free(buf);
 
 	if (cmd_line) {
 		my_fputc('\n', stderr);
@@ -165,7 +196,7 @@ perror_message(
 	const char *fmt,
 	...)
 {
-	char buf[LEN];
+	char *buf;
 	int err;
 	va_list ap;
 
@@ -174,12 +205,13 @@ perror_message(
 
 	clear_message();
 
-	vsnprintf(buf, sizeof(buf), fmt, ap);
+	if ((buf = fmt_message(fmt, ap)) != NULL) {
+		error_message("%s: Error: %s", buf, strerror(err));
+		free(buf);
+	}
 
 	va_end(ap);
 
-	error_message("%s: Error: %s", buf, strerror(err));
-
 	return;
 }
 
@@ -199,47 +231,31 @@ clear_message(
 }
 
 
-#define TRUNC_TAIL	" ..."
 void
 center_line(
 	int line,
 	t_bool inverse,
 	const char *str)
 {
-	char buffer[256];
 	int pos;
 	int len;
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 	int width;
-	wchar_t wbuffer[256];	/* needs same number of elements as buffer */
-	wchar_t wbuffer2[256];
-	wchar_t suffix_buf[6];	/* space for TRUNC_TAIL */
+	wchar_t *wbuffer;
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
-	STRCPY(buffer, str);
-
-	/* protect terminal... */
-	convert_to_printable(buffer);
-
+	len = strlen(str);
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	if ((len = mbstowcs(wbuffer, buffer, ARRAY_SIZE(wbuffer) - 1)) <= 0)
-		len = strlen(buffer);
-	else
-		wbuffer[ARRAY_SIZE(wbuffer) - 1] = (wchar_t) '\0';
-	if ((width = wcswidth(wbuffer, ARRAY_SIZE(wbuffer) - 1)) <= 0)
-		width = len;
-#else
-	len = strlen(buffer);
+	if ((wbuffer = char2wchar_t(str)) != NULL) {
+		if ((width = wcswidth(wbuffer, wcslen(wbuffer) + 1)) > 0)
+			len = width;
+		free(wbuffer);
+	}
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 	if (!cmd_line) {
-#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-		if (cCOLS >= width)
-			pos = (cCOLS - width) / 2;
-#else
 		if (cCOLS >= len)
 			pos = (cCOLS - len) / 2;
-#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 		else
 			pos = 1;
 
@@ -250,23 +266,14 @@ center_line(
 		}
 	}
 
-#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	if (width >= cCOLS) {
-		wcspart(wbuffer2, wbuffer, cCOLS - 6, ARRAY_SIZE(wbuffer2) - 5, TRUE);
-		mbstowcs(suffix_buf, TRUNC_TAIL, ARRAY_SIZE(suffix_buf) - 1);
-		wcsncat(wbuffer2, suffix_buf, 4);
-		wcstombs(buffer, wbuffer2, sizeof(buffer) - 1);
-	}
-#else
 	if (len >= cCOLS) {
-		char *buf;
+		char *buffer;
 
-		buf = my_strdup(buffer);
-		snprintf(buffer, sizeof(buffer), "%-.*s%s", cCOLS - 6, buf, TRUNC_TAIL);
-		free(buf);
-	}
-#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-	my_fputs(buffer, stdout);
+		buffer = strunc(str, cCOLS - 2);
+		my_fputs(buffer, stdout);
+		free(buffer);
+	} else
+		my_fputs(str, stdout);
 
 	if (cmd_line)
 		my_flush();
@@ -406,6 +413,7 @@ spin_cursor(
 }
 
 
+#define DISPLAY_FMT "%s %3d%% "
 /*
  * progressmeter in %
  */
@@ -420,7 +428,6 @@ show_progress(
 	time_t curr_time;
 	static char last_display[LEN];
 	static const char *last_txt;
-	static int last_length;
 	static int last_ratio;
 	static long last_total;
 	static time_t last_update;
@@ -431,6 +438,7 @@ show_progress(
 	static int sum;
 	static struct timeval last_time;
 	static struct timeval this_time;
+	char *display_format;
 	int time_diff;
 	int secs_left;
 	long count_diff;
@@ -441,7 +449,6 @@ show_progress(
 
 	/* If this is a new progress meter, start recalculating */
 	if ((last_txt != txt) || (last_total != total)) {
-		last_length = 0;
 		last_ratio = -1;
 		last_display[0] = '\0';
 		last_update = time(NULL) - 2;
@@ -459,11 +466,12 @@ show_progress(
 	last_update = curr_time;
 
 #ifdef HAVE_GETTIMEOFDAY
-	if (last_length == 0) {
+	display_format = my_malloc(strlen(DISPLAY_FMT) + strlen(_(txt_remaining)) + 1);
+	strcpy(display_format, DISPLAY_FMT);
+
+	if (last_ratio == -1) {
 		/* Don't print a "time remaining" this time */
-		snprintf(display, sizeof(display), "%s %3d%%", txt, ratio);
-		display[sizeof(display) - 1] = '\0';
-		last_length = strlen(txt) + 5;
+		snprintf(display, sizeof(display), display_format, txt, ratio);
 
 		/* Reset the variables */
 		sum = average = samples = 0;
@@ -505,20 +513,22 @@ show_progress(
 		if (secs_left < 0)
 			secs_left = 0;
 
-		/* TODO: -> lang.c, difficult with hardcoded last_length */
-		snprintf(display, sizeof(display), "%s %3d%% (%d:%02d remaining)", txt, ratio, secs_left / 60, secs_left % 60);
-		last_length = strlen(txt) + 21 + secs_left / 600;
+		strcat(display_format, _(txt_remaining));
+		snprintf(display, sizeof(display), display_format, txt, ratio, secs_left / 60, secs_left % 60);
 	}
+	free(display_format);
 
 	last_count = count;
 	gettimeofday(&last_time, NULL);
 
-#else /* HAVE_GETTIMEOFDAY */
+#else
 	snprintf(display, sizeof(display), "%s %3d%%", txt, ratio);
 #endif /* HAVE_GETTIMEOFDAY */
 
 	/* Only display text if it changed from last time */
 	if (strcmp(display, last_display)) {
+		char *tmp;
+
 		clear_message();
 		MoveCursor(cLINES, 0);
 
@@ -526,7 +536,13 @@ show_progress(
 		fcol(tinrc.col_message);
 #	endif /* HAVE_COLOR */
 
-		my_printf("%s", display);
+		/*
+		 * TODO: depending on the length of the newsgroup name
+		 * it's possible to cut away a great part of the progress meter
+		 * perhaps we should shorten the newsgroup name instead?
+		 */
+		my_printf("%s", sized_message(&tmp, "%s", display));
+		free(tmp);
 
 #	ifdef HAVE_COLOR
 		fcol(tinrc.col_normal);
diff -Nurp tin-1.6.2/src/search.c tin-1.8.0/src/search.c
--- tin-1.6.2/src/search.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/search.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : search.c
  *  Author    : I. Lea & R. Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 2003-05-15
+ *  Updated   : 2005-07-02
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,9 +38,7 @@
 #ifndef TIN_H
 #	include "tin.h"
 #endif /* !TIN_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
+
 
 /*
  * local prototypes
@@ -53,15 +51,10 @@ static int search_group(t_bool forward, 
 
 
 /*
- * The search function may place error text into mesg
- */
-#define MATCH_MSG	(mesg[0] ? mesg : _(txt_no_match))
-
-/*
  * Kludge to maintain some internal state for body search
  */
-static int total_cnt = 0, curr_cnt = 0;
 int srch_lineno = -1;
+static int total_cnt = 0, curr_cnt = 0;
 
 /*
  * Used by article and body search - this saves passing around large numbers
@@ -69,7 +62,7 @@ int srch_lineno = -1;
  */
 static int srch_offsets[6];
 static int srch_offsets_size = ARRAY_SIZE(srch_offsets);
-static struct regex_cache srch_regex;
+static struct regex_cache search_regex = { NULL, NULL };
 
 
 /*
@@ -92,8 +85,7 @@ get_search_pattern(
 	if (repeat) {
 		*forward = last_forward;
 		my_strncpy(def, last_pattern, LEN);
-	}
-	else {
+	} else {
 		sprintf(tmpbuf, (*forward ? fwd_msg : bwd_msg), def);
 
 		if (!prompt_string_default(tmpbuf, def, _(txt_no_search_string), which_hist))
@@ -104,15 +96,26 @@ get_search_pattern(
 
 		/* HIST_BODY_SEARCH doesn't exist, hence i_key_search_last is set directly in search_body() */
 		if (which_hist == HIST_AUTHOR_SEARCH)
-			i_key_search_last = *forward ? iKeySearchAuthF : iKeySearchAuthB;
+			last_search = *forward ? GLOBAL_SEARCH_AUTHOR_FORWARD : GLOBAL_SEARCH_AUTHOR_BACKWARD;
 		else
-			i_key_search_last = *forward ? iKeySearchSubjF : iKeySearchSubjB;
+			last_search = *forward ? GLOBAL_SEARCH_SUBJECT_FORWARD : GLOBAL_SEARCH_SUBJECT_BACKWARD;
 	}
 
 	wait_message(0, _(txt_searching));
 
 	stow_cursor();
 
+#ifdef HAVE_UNICODE_NORMALIZATION
+	/* normalize search pattern */
+	if (IS_LOCAL_CHARSET("UTF-8")) {
+		char *tmp;
+
+		tmp = normalize(def);
+		my_strncpy(def, tmp, LEN);
+		free(tmp);
+	}
+#endif /* HAVE_UNICODE_NORMALIZATION */
+
 	if (tinrc.wildcard) {			/* ie, not wildmat() */
 		strcpy(def, quote_wild_whitespace(def));
 		return def;
@@ -130,39 +133,55 @@ get_search_pattern(
 /*
  * called by config.c
  */
-int
+enum option_enum
 search_config(
 	t_bool forward,
 	t_bool repeat,
-	int current,
-	int last)
+	enum option_enum current,
+	enum option_enum last)
 {
-	char *buf;
-	int n;
-	int incr;
-	int result = current;
+	char *pattern, *buf;
+	enum option_enum n = current;
+	enum option_enum result = current;
 
-	if (!(buf = get_search_pattern(&forward, repeat, _(txt_search_forwards), _(txt_search_backwards), tinrc.default_search_config, HIST_CONFIG_SEARCH)))
+	if (!(pattern = get_search_pattern(&forward, repeat, _(txt_search_forwards), _(txt_search_backwards), tinrc.default_search_config, HIST_CONFIG_SEARCH)))
 		return result;
 
-	incr = forward ? 1 : -1;
+	if (tinrc.wildcard && !(compile_regex(pattern, &search_regex, PCRE_CASELESS)))
+		return result;
 
-	current += incr;
-	n = current;
 	do {
-		if (n < 0)
+		if (n == 0 && !forward)
 			n = last;
 		else {
-			if (n > last)
+			if (n == last && forward)
 				n = 0;
+			else
+				n += forward ? 1 : -1;
 		}
-		if (REGEX_MATCH(_(option_table[n].txt->opt), buf, TRUE)) {
-			result = n;
-			break;
+		/* search only visible options */
+		if (option_is_visible(n)) {
+#ifdef HAVE_UNICODE_NORMALIZATION
+			if (IS_LOCAL_CHARSET("UTF-8"))
+				buf = normalize(_(option_table[n].txt->opt));
+			else
+#endif /* HAVE_UNICODE_NORMALIZATION */
+				buf = my_strdup(_(option_table[n].txt->opt));
+
+			if (match_regex(buf, pattern, &search_regex, TRUE)) {
+				result = n;
+				free(buf);
+				break;
+			}
+			free(buf);
 		}
-		n += incr;
 	} while (n != current);
+
 	clear_message();
+	if (tinrc.wildcard) {
+		FreeAndNull(search_regex.re);
+		FreeAndNull(search_regex.extra);
+	}
 	return result;
 }
 
@@ -178,8 +197,8 @@ search_active(
 	t_bool repeat)
 {
 	char *buf;
+	char *ptr;
 	char buf2[LEN];
-	char *ptr = buf2;
 	int i;
 
 	if (!selmenu.max) {
@@ -190,6 +209,9 @@ search_active(
 	if (!(buf = get_search_pattern(&forward, repeat, _(txt_search_forwards), _(txt_search_backwards), tinrc.default_search_group, HIST_GROUP_SEARCH)))
 		return -1;
 
+	if (tinrc.wildcard && !(compile_regex(buf, &search_regex, PCRE_CASELESS)))
+		return -1;
+
 	i = selmenu.curr;
 
 	do {
@@ -210,12 +232,20 @@ search_active(
 		} else
 			ptr = active[my_group[i]].name;
 
-		if (REGEX_MATCH(ptr, buf, TRUE)) {
+		if (match_regex(ptr, buf, &search_regex, TRUE)) {
+			if (tinrc.wildcard) {
+				FreeAndNull(search_regex.re);
+				FreeAndNull(search_regex.extra);
+			}
 			return i;
 		}
 	} while (i != selmenu.curr);
 
-	info_message(MATCH_MSG);
+	if (tinrc.wildcard) {
+		FreeAndNull(search_regex.re);
+		FreeAndNull(search_regex.extra);
+	}
+	info_message(_(txt_no_match));
 	return -1;
 }
 
@@ -232,10 +262,11 @@ body_search(
 	int i,
 	char *searchbuf)
 {
-	char *line;
+	static char msg[LEN];	/* show_progress needs a constant message buffer */
+	char *line, *tmp;
 	t_openartinfo artinfo;
 
-	switch (art_open(TRUE, &arts[i], curr_group, &artinfo, FALSE)) {
+	switch (art_open(TRUE, &arts[i], curr_group, &artinfo, FALSE, NULL)) {
 		case ART_ABORT:					/* User 'q'uit */
 			art_close(&artinfo);
 			return -1;
@@ -256,11 +287,18 @@ body_search(
 	/*
 	 * Now search the body
 	 */
-	sprintf(mesg, _(txt_searching_body), ++curr_cnt, total_cnt);
-	show_progress(mesg, curr_cnt, total_cnt);
-	while ((line = tin_fgets(artinfo.cooked, FALSE)) != NULL) {
+	snprintf(msg, sizeof(msg), _(txt_searching_body), ++curr_cnt, total_cnt);
+	show_progress(msg, curr_cnt, total_cnt);
+	while ((tmp = tin_fgets(artinfo.cooked, FALSE)) != NULL) {
+#ifdef HAVE_UNICODE_NORMALIZATION
+		if (IS_LOCAL_CHARSET("UTF-8"))
+			line = normalize(tmp);
+		else
+#endif /* HAVE_UNICODE_NORMALIZATION */
+			line = my_strdup(tmp);
+
 		if (tinrc.wildcard) {
-			if (pcre_exec(srch_regex.re, srch_regex.extra, line, strlen(line), 0, 0, srch_offsets, srch_offsets_size) != PCRE_ERROR_NOMATCH) {
+			if (pcre_exec(search_regex.re, search_regex.extra, line, strlen(line), 0, 0, srch_offsets, srch_offsets_size) != PCRE_ERROR_NOMATCH) {
 				srch_lineno = i;
 				art_close(&pgart);		/* Switch the pager over to matched art */
 				pgart = artinfo;
@@ -268,6 +306,7 @@ body_search(
 				if (debug == 2)
 					fprintf(stderr, "art_switch(%p = %p)\n", (void *) &pgart, (void *) &artinfo);
 #endif /* DEBUG */
+				free(line);
 
 				return 1;
 			}
@@ -276,10 +315,12 @@ body_search(
 				srch_lineno = i;
 				art_close(&pgart);		/* Switch the pager over to matched art */
 				pgart = artinfo;
+				free(line);
 				return 1;
 			}
 		}
 		i++;
+		free(line);
 	}
 
 	if (tin_errno != 0) {			/* User abort */
@@ -288,7 +329,7 @@ body_search(
 	}
 
 	art_close(&artinfo);
-/*	info_message(MATCH_MSG); */
+/*	info_message(_(txt_no_match)); */
 	return 0;
 }
 
@@ -302,15 +343,32 @@ author_search(
 	int i,
 	char *searchbuf)
 {
-	char buf[LEN];
-	char *ptr = buf;
+	char *buf, *tmp;
 
 	if (arts[i].name == NULL)
-		ptr = arts[i].from;
-	else
-		snprintf(buf, sizeof(buf), "%s <%s>", arts[i].name, arts[i].from);
+		tmp = my_strdup(arts[i].from);
+	else {
+		size_t len = strlen(arts[i].from) + strlen(arts[i].name) + 4;
+
+		tmp = my_malloc(len);
+		snprintf(tmp, len, "%s <%s>", arts[i].name, arts[i].from);
+	}
 
-	return (REGEX_MATCH(ptr, searchbuf, TRUE)) ? 1 : 0;
+#ifdef HAVE_UNICODE_NORMALIZATION
+	if (IS_LOCAL_CHARSET("UTF-8")) {
+		buf = normalize(tmp);
+		free(tmp);
+	} else
+#endif /* HAVE_UNICODE_NORMALIZATION */
+		buf = tmp;
+
+	if (match_regex(buf, searchbuf, &search_regex, TRUE)) {
+		free(buf);
+		return 1;
+	}
+
+	free(buf);
+	return 0;
 }
 
 
@@ -323,7 +381,22 @@ subject_search(
 	int i,
 	char *searchbuf)
 {
-	return (REGEX_MATCH(arts[i].subject, searchbuf, TRUE)) ? 1 : 0;
+	char *buf;
+
+#ifdef HAVE_UNICODE_NORMALIZATION
+	if (IS_LOCAL_CHARSET("UTF-8"))
+		buf = normalize(arts[i].subject);
+	else
+#endif /* HAVE_UNICODE_NORMALIZATION */
+		buf = my_strdup(arts[i].subject);
+
+	if (match_regex(buf, searchbuf, &search_regex, TRUE)) {
+		free(buf);
+		return 1;
+	}
+
+	free(buf);
+	return 0;
 }
 
 
@@ -337,13 +410,19 @@ search_group(
 	char *searchbuff,
 	int (*search_func) (int i, char *searchbuff))
 {
-	int i;
+	int i, ret;
 
 	if (grpmenu.curr < 0) {
 		info_message(_(txt_no_arts));
 		return -1;
 	}
 
+	/*
+	 * precompile if we're using full regex
+	 */
+	if (tinrc.wildcard && !(compile_regex(searchbuff, &search_regex, PCRE_CASELESS)))
+		return -1;
+
 	i = current_art;
 
 	do {
@@ -356,10 +435,16 @@ search_group(
 		}
 
 		/* Only search displayed articles */
-		if (CURR_GROUP.attribute->show_only_unread && arts[i].status != ART_UNREAD)
+		if (curr_group->attribute->show_only_unread && arts[i].status != ART_UNREAD)
 			continue;
 
-		switch (search_func(i, searchbuff)) {
+		ret = search_func(i, searchbuff);
+		if (tinrc.wildcard && (ret == 1 || ret == -1)) {
+			/* we will exit soon, clean up */
+			FreeAndNull(search_regex.re);
+			FreeAndNull(search_regex.extra);
+		}
+		switch (ret) {
 			case 1:								/* Found */
 				clear_message();
 				return i;
@@ -369,6 +454,10 @@ search_group(
 		}
 	} while (i != current_art);
 
+	if (tinrc.wildcard) {
+		FreeAndNull(search_regex.re);
+		FreeAndNull(search_regex.extra);
+	}
 	info_message(_(txt_no_match));
 	return -1;
 }
@@ -380,22 +469,29 @@ search_group(
  */
 int
 search(
-	int key,
+	t_function func,
 	int current_art,
-	t_bool forward,
 	t_bool repeat)
 {
 	char *buf = NULL;
 	int (*search_func) (int i, char *searchbuff) = author_search;
+	t_bool forward;
+
+	if (func == GLOBAL_SEARCH_SUBJECT_FORWARD || func == GLOBAL_SEARCH_AUTHOR_FORWARD)
+		forward = TRUE;
+	else
+		forward = FALSE;
 
-	switch (key) {
-		case SEARCH_SUBJ:
+	switch (func) {
+		case GLOBAL_SEARCH_SUBJECT_FORWARD:
+		case GLOBAL_SEARCH_SUBJECT_BACKWARD:
 			if (!(buf = get_search_pattern(&forward, repeat, _(txt_search_forwards), _(txt_search_backwards), tinrc.default_search_subject, HIST_SUBJECT_SEARCH)))
 				return -1;
 			search_func = subject_search;
 			break;
 
-		case SEARCH_AUTH:
+		case GLOBAL_SEARCH_AUTHOR_FORWARD:
+		case GLOBAL_SEARCH_AUTHOR_BACKWARD:
 		default:
 			if (!(buf = get_search_pattern(&forward, repeat, _(txt_author_search_forwards), _(txt_author_search_backwards), tinrc.default_search_author, HIST_AUTHOR_SEARCH)))
 				return -1;
@@ -421,27 +517,23 @@ search_article(
 	int reveal_ctrl_l_lines,
 	FILE *fp)
 {
-	char *pattern, *ptr;
-	int i;
-	struct regex_cache srch;
+	char *pattern, *ptr, *tmp;
+	int i = start_line;
+	int tmp_srch_offsets[2];
+	t_bool wrap = FALSE;
+	t_bool match = FALSE;
 
 	if (!(pattern = get_search_pattern(&forward, repeat, _(txt_search_forwards), _(txt_search_backwards), tinrc.default_search_art, HIST_ART_SEARCH)))
-		return FALSE;
+		return 0;
 
-	if (tinrc.wildcard && !(compile_regex(pattern, &srch, PCRE_CASELESS)))
+	if (tinrc.wildcard && !(compile_regex(pattern, &search_regex, PCRE_CASELESS)))
 		return -1;
 
 	srch_lineno = -1;
-	i = start_line;
 
 	forever {
-		if (forward) {
-			if (++i == lines)
-				break;
-		} else {
-			if (--i < 0)
-				break;
-		}
+		if (i == start_line && wrap)
+			break;
 
 		/*
 		 * TODO: consider not searching some line types?
@@ -453,23 +545,72 @@ search_article(
 		if ((line[i].flags&C_CTRLL) && i > reveal_ctrl_l_lines)
 			break;
 
-		ptr = tin_fgets(fp, FALSE);
+		tmp = tin_fgets(fp, FALSE);
+		if (!forward && srch_offsets[0] >= 0) {
+			tmp[srch_offsets[0]] = '\0';	/* ignore anything on this line after the last match */
+			srch_offsets[1] = 0;	/* start backwards search at the beginning of the line */
+		}
+
+#ifdef HAVE_UNICODE_NORMALIZATION
+		if (IS_LOCAL_CHARSET("UTF-8"))
+			ptr = normalize(tmp);
+		else
+#endif /* HAVE_UNICODE_NORMALIZATION */
+			ptr = my_strdup(tmp);
 
 		if (tinrc.wildcard) {
-			if (pcre_exec(srch.re, srch.extra, ptr, strlen(ptr), 0, 0,
-								srch_offsets, srch_offsets_size) != PCRE_ERROR_NOMATCH) {
+			while (pcre_exec(search_regex.re, search_regex.extra, ptr, strlen(ptr), srch_offsets[1], 0, srch_offsets, srch_offsets_size) != PCRE_ERROR_NOMATCH) {
+				match = TRUE;
+				if (forward)
+					break;
+				else {
+					tmp_srch_offsets[0] = srch_offsets[0];
+					tmp_srch_offsets[1] = srch_offsets[1];
+				}
+			}
+			if (match) {
+				if (!forward) {
+					srch_offsets[0] = tmp_srch_offsets[0];
+					srch_offsets[1] = tmp_srch_offsets[1];
+				}
 				srch_lineno = i;
+				FreeAndNull(search_regex.re);
+				FreeAndNull(search_regex.extra);
+				free(ptr);
 				return i;
 			}
 		} else {
 			if (wildmatpos(ptr, pattern, TRUE, srch_offsets, srch_offsets_size)) {
 				srch_lineno = i;
+				free(ptr);
 				return i;
 			}
 		}
+		free(ptr);
+
+		if (forward) {
+			if (i >= lines - 1) {
+				i = 0;
+				wrap = TRUE;
+			} else
+				i++;
+		} else {
+			if (i <= 0) {
+				i = lines - 1;
+				wrap = TRUE;
+			} else
+				i--;
+		}
+
+		/* search at the beginning of the line */
+		srch_offsets[1] = 0;
 	}
 
 	info_message(_(txt_no_match));
+	if (tinrc.wildcard) {
+		FreeAndNull(search_regex.re);
+		FreeAndNull(search_regex.extra);
+	}
 	return -1;
 }
 
@@ -490,7 +631,7 @@ search_body(
 {
 	char *buf;
 	int i;
-	t_bool forward_fake;
+	t_bool forward_fake = TRUE;
 
 	if (!(buf = get_search_pattern(
 			&forward_fake,				/* we pass a dummy var since body search has no `forward' */
@@ -501,7 +642,7 @@ search_body(
 			HIST_ART_SEARCH
 	))) return -1;
 
-	i_key_search_last = iKeySearchBody;	/* store last search type for repeated search */
+	last_search = GLOBAL_SEARCH_BODY;	/* store last search type for repeated search */
 	total_cnt = curr_cnt = 0;			/* Reset global counter of articles done */
 
 	/*
@@ -517,12 +658,6 @@ search_body(
 		}
 	}
 
-	/*
-	 * Pre-compile if we're using full regex
-	 */
-	if (tinrc.wildcard && !(compile_regex(buf, &srch_regex, PCRE_CASELESS)))
-		return -1;
-
 	srch_lineno = -1;
 	return search_group(1, current_art, buf, body_search);
 }
@@ -544,3 +679,15 @@ get_search_vectors(
 	srch_lineno = -1;			/* We can only retrieve this info once */
 	return i;
 }
+
+
+/*
+ * Reset offsets so that the next search starts at the beginning of the line.
+ * This function is needed to access srch_offsets from within other modules.
+ */
+void
+reset_srch_offsets(
+	void)
+{
+	srch_offsets[0] = srch_offsets[1] = 0;
+}
diff -Nurp tin-1.6.2/src/select.c tin-1.8.0/src/select.c
--- tin-1.6.2/src/select.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/select.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : select.c
  *  Author    : I. Lea & R. Skrenta
  *  Created   : 1991-04-01
- *  Updated   : 2003-07-20
+ *  Updated   : 2005-07-02
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>, Rich Skrenta <skrenta@pbm.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,21 +41,21 @@
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
+
 
 /*
  * Local prototypes
  */
+static t_function select_left(void);
+static t_function select_right(void);
 static int active_comp(t_comptype p1, t_comptype p2);
 static int reposition_group(struct t_group *group, int default_num);
 static int save_restore_curr_group(t_bool saving);
-static int select_left(void);
-static int select_right(void);
 static t_bool pos_next_unread_group(t_bool redraw);
 static t_bool yanked_out = TRUE;
+static void build_gline(int i);
 static void catchup_group(struct t_group *group, t_bool goto_next_unread_group);
+static void draw_group_arrow(void);
 static void read_groups(void);
 static void select_done(void);
 static void select_quit(void);
@@ -70,24 +70,26 @@ static void yank_active_file(void);
  * selmenu.curr = index (start at 0) of cursor position on menu,
  *                or -1 when no groups visible on screen
  * selmenu.max = Total # of groups in my_group[]
- * selmenu.first, selmenu.last are static here
+ * selmenu.first is static here
  */
-t_menu selmenu = { 1, 0, 0, 0, show_selection_page, draw_group_arrow };
+t_menu selmenu = { 1, 0, 0, show_selection_page, draw_group_arrow, build_gline };
 
+static int groupname_len;	/* max. group name length */
 
-static int
+
+static t_function
 select_left(
 	void)
 {
-	return iKeyQuit;
+	return GLOBAL_QUIT;
 }
 
 
-static int
+static t_function
 select_right(
 	void)
 {
-	return iKeySelectReadGrp;
+	return SELECT_ENTER_GROUP;
 }
 
 
@@ -98,7 +100,8 @@ selection_page(
 {
 	char buf[LEN];
 	char key[MAXKEYLEN];
-	int i, n, ch;
+	int i, n;
+	t_function func;
 
 	selmenu.curr = start_groupnum;
 
@@ -107,7 +110,6 @@ selection_page(
 #endif /* READ_CHAR_HACK */
 
 	ClearScreen();
-	set_groupname_len(FALSE);	/* find longest subscribed to groupname */
 
 	/*
 	 * If user specified only 1 cmd line groupname (eg. tin -r alt.sources)
@@ -116,6 +118,7 @@ selection_page(
 	if (num_cmd_line_groups == 1)
 		select_read_group();
 
+	cursoroff();
 	show_selection_page();	/* display group selection page */
 
 	forever {
@@ -129,59 +132,68 @@ selection_page(
 
 		set_xclick_on();
 
-		switch ((ch = handle_keypad(select_left, select_right, &menukeymap.select_nav))) {
-			case iKeyAbort:		/* Abort */
+		switch ((func = handle_keypad(select_left, select_right, global_mouse_action, select_keys))) {
+			case GLOBAL_ABORT:		/* Abort */
 				break;
 
-			case '1': case '2': case '3': case '4': case '5':
-			case '6': case '7': case '8': case '9':
+			case DIGIT_1:
+			case DIGIT_2:
+			case DIGIT_3:
+			case DIGIT_4:
+			case DIGIT_5:
+			case DIGIT_6:
+			case DIGIT_7:
+			case DIGIT_8:
+			case DIGIT_9:
 				if (selmenu.max)
-					prompt_item_num(ch, _(txt_select_group));
+					prompt_item_num(func_to_key(func, select_keys), _(txt_select_group));
 				else
 					info_message(_(txt_no_groups));
 				break;
 
 #ifndef NO_SHELL_ESCAPE
-			case iKeyShellEscape:
+			case GLOBAL_SHELL_ESCAPE:
 				do_shell_escape();
 				break;
 #endif /* !NO_SHELL_ESCAPE */
 
-			case iKeyFirstPage:	/* show first page of groups */
+			case GLOBAL_FIRST_PAGE:		/* show first page of groups */
 				top_of_list();
 				break;
 
-			case iKeyLastPage:	/* show last page of groups */
+			case GLOBAL_LAST_PAGE:		/* show last page of groups */
 				end_of_list();
 				break;
 
-			case iKeyPageUp:		/* page up */
-			case iKeyPageUp2:
-			case iKeyPageUp3:
+			case GLOBAL_PAGE_UP:
 				page_up();
 				break;
 
-			case iKeyPageDown:		/* page down */
-			case iKeyPageDown2:
-			case iKeyPageDown3:
+			case GLOBAL_PAGE_DOWN:
 				page_down();
 				break;
 
-			case iKeyUp:		/* line up */
-			case iKeyUp2:
+			case GLOBAL_LINE_UP:
 				move_up();
 				break;
 
-			case iKeyDown:		/* line down */
-			case iKeyDown2:
+			case GLOBAL_LINE_DOWN:
 				move_down();
 				break;
 
-			case iKeySelectSortActive:	/* Sort active groups */
+			case GLOBAL_SCROLL_DOWN:
+				scroll_down();
+				break;
+
+			case GLOBAL_SCROLL_UP:
+				scroll_up();
+				break;
+
+			case SELECT_SORT_ACTIVE:	/* sort active groups */
 				sort_active_file();
 				break;
 
-			case iKeySetRange:	/* set range */
+			case GLOBAL_SET_RANGE:
 				if (selmenu.max) {
 					if (set_range(SELECT_LEVEL, 1, selmenu.max, selmenu.curr + 1))
 						show_selection_page();
@@ -189,42 +201,40 @@ selection_page(
 					info_message(_(txt_no_groups));
 				break;
 
-			case iKeySearchSubjF:	/* search forward */
-			case iKeySearchSubjB:	/* search backward */
-			case iKeySearchRepeat:
-				if (ch == iKeySearchRepeat && i_key_search_last != iKeySearchSubjF && i_key_search_last != iKeySearchSubjB)
-					info_message(_(txt_bad_command), printascii(key, map_to_local(iKeyHelp, &menukeymap.select_nav)));
+			case GLOBAL_SEARCH_SUBJECT_FORWARD:
+			case GLOBAL_SEARCH_SUBJECT_BACKWARD:
+			case GLOBAL_SEARCH_REPEAT:
+				if (func == GLOBAL_SEARCH_REPEAT && last_search != GLOBAL_SEARCH_SUBJECT_FORWARD && last_search != GLOBAL_SEARCH_SUBJECT_BACKWARD)
+					info_message(_(txt_bad_command), printascii(key, key_to_func(GLOBAL_HELP, select_keys)));
 				else {
-					if ((i = search_active((ch == iKeySearchSubjF), (ch == iKeySearchRepeat))) != -1) {
+					if ((i = search_active((func == GLOBAL_SEARCH_SUBJECT_FORWARD), (func == GLOBAL_SEARCH_REPEAT))) != -1) {
 						move_to_item(i);
 						clear_message();
 					}
 				}
 				break;
 
-			case iKeySelectReadGrp:	/* go into group */
-			case iKeySelectReadGrp2:
+			case SELECT_ENTER_GROUP:		/* go into group */
 				select_read_group();
 				break;
 
-			case iKeySelectEnterNextUnreadGrp:	/* enter next group containing unread articles */
-			case iKeySelectEnterNextUnreadGrp2:
+			case SELECT_ENTER_NEXT_UNREAD_GROUP:	/* enter next group containing unread articles */
 				if (pos_next_unread_group(FALSE))
 					read_groups();
 				break;							/* Nothing more to do at the moment */
 
-			case iKeyRedrawScr:		/* redraw */
+			case GLOBAL_REDRAW_SCREEN:
 				my_retouch();					/* TODO: not done elsewhere, maybe should be in show_selection_page */
 				set_xclick_off();
 				show_selection_page();
 				break;
 
-			case iKeySelectResetNewsrc:	/* reset .newsrc */
+			case SELECT_RESET_NEWSRC:		/* reset .newsrc */
 				if (no_write) {
 					info_message(_(txt_info_no_write));
 					break;
 				}
-				if (prompt_yn(cLINES, _(txt_reset_newsrc), FALSE) == 1) {
+				if (prompt_yn(_(txt_reset_newsrc), FALSE) == 1) {
 					reset_newsrc();
 					sync_active_file();
 					selmenu.curr = 0;
@@ -232,47 +242,61 @@ selection_page(
 				}
 				break;
 
-			case iKeySelectCatchup:	/* catchup - mark all articles as read */
-			case iKeySelectCatchupNextUnread:	/* and goto next unread group */
+			case CATCHUP:			/* catchup - mark all articles as read */
+			case CATCHUP_NEXT_UNREAD:	/* and goto next unread group */
 				if (selmenu.max)
-					catchup_group(&CURR_GROUP, (ch == iKeySelectCatchupNextUnread));
+					catchup_group(&CURR_GROUP, (func == CATCHUP_NEXT_UNREAD));
 				else
 					info_message(_(txt_no_groups));
 				break;
 
-			case iKeySelectToggleDescriptions:	/* toggle newsgroup descriptions */
+			case GLOBAL_EDIT_FILTER:
+				if (!invoke_editor(filter_file, FILTER_FILE_OFFSET))
+					break;
+				(void) read_filter_file(filter_file);
+				break;
+
+			case SELECT_TOGGLE_DESCRIPTIONS:	/* toggle newsgroup descriptions */
 				show_description = bool_not(show_description);
 				if (show_description)
 					read_descriptions(TRUE);
-				set_groupname_len(FALSE);
 				show_selection_page();
 				break;
 
-			case iKeySelectGoto:			/* prompt for a new group name */
-				if ((n = choose_new_group()) >= 0) {
-					set_groupname_len(FALSE);
-					move_to_item(n);
+			case SELECT_GOTO:			/* prompt for a new group name */
+				{
+					int oldmax = selmenu.max;
+
+					if ((n = choose_new_group()) >= 0) {
+						/*
+						 * If a new group was added and it is on the actual screen
+						 * draw it. If it is off screen the redraw will handle it.
+						 */
+						if (oldmax != selmenu.max && n >= selmenu.first && n < selmenu.first + NOTESLINES)
+							build_gline(n);
+						move_to_item(n);
+					}
 				}
 				break;
 
-			case iKeyHelp:					/* help */
+			case GLOBAL_HELP:
 				show_help_page(SELECT_LEVEL, _(txt_group_select_com));
 				show_selection_page();
 				break;
 
-			case iKeyToggleHelpDisplay:		/* toggle mini help menu */
+			case GLOBAL_TOGGLE_HELP_DISPLAY:	/* toggle mini help menu */
 				toggle_mini_help(SELECT_LEVEL);
 				show_selection_page();
 				break;
 
-			case iKeyToggleInverseVideo:	/* toggle inverse video */
+			case GLOBAL_TOGGLE_INVERSE_VIDEO:
 				toggle_inverse_video();
 				show_selection_page();
 				show_inverse_video_status();
 				break;
 
 #ifdef HAVE_COLOR
-			case iKeyToggleColor:			/* toggle color */
+			case GLOBAL_TOGGLE_COLOR:
 				if (toggle_color()) {
 					show_selection_page();
 					show_color_status();
@@ -280,12 +304,12 @@ selection_page(
 				break;
 #endif /* HAVE_COLOR */
 
-			case iKeyToggleInfoLastLine:	/* display group description */
+			case GLOBAL_TOGGLE_INFO_LAST_LINE:	/* display group description */
 				tinrc.info_in_last_line = bool_not(tinrc.info_in_last_line);
 				show_selection_page();
 				break;
 
-			case iKeySelectMoveGrp:	/* reposition group within group list */
+			case SELECT_MOVE_GROUP:			/* reposition group within group list */
 				/* TODO: move all this to reposition_group() */
 				if (!selmenu.max) {
 					info_message(_(txt_no_groups));
@@ -305,7 +329,7 @@ selection_page(
 				n = selmenu.curr;
 				selmenu.curr = reposition_group(&active[my_group[n]], n);
 				HpGlitch(erase_arrow());
-				if (selmenu.curr < selmenu.first || selmenu.curr >= selmenu.last || selmenu.curr != n)
+				if (selmenu.curr < selmenu.first || selmenu.curr >= selmenu.first + NOTESLINES - 1 || selmenu.curr != n)
 					show_selection_page();
 				else {
 					i = selmenu.curr;
@@ -317,51 +341,54 @@ selection_page(
 				}
 				break;
 
-			case iKeyOptionMenu:	/* option menu */
+			case GLOBAL_OPTION_MENU:
 				(void) change_config_file(NULL);
 				read_attributes_files();
 				show_selection_page();
 				break;
 
-			case iKeySelectNextUnreadGrp:	/* goto next unread group */
+			case SELECT_NEXT_UNREAD_GROUP:		/* goto next unread group */
 				pos_next_unread_group(TRUE);
 				break;
 
-			case iKeyQuit:	/* quit */
+			case GLOBAL_QUIT:			/* quit */
 				select_done();
 				break;
 
-			case iKeyQuitTin:	/* quit, no ask */
+			case GLOBAL_QUIT_TIN:			/* quit, no ask */
 				select_quit();
 				break;
 
-			case iKeySelectQuitNoWrite:	/* quit, but don't save configuration */
-				if (prompt_yn(cLINES, _(txt_quit_no_write), TRUE) == 1)
+			case SELECT_QUIT_NO_WRITE:		/* quit, but don't save configuration */
+				if (prompt_yn(_(txt_quit_no_write), TRUE) == 1)
 					tin_done(EXIT_SUCCESS);
 				show_selection_page();
 				break;
 
-			case iKeySelectToggleReadDisplay:
+			case SELECT_TOGGLE_READ_DISPLAY:
 				/*
 				 * If in tinrc.show_only_unread_groups mode toggle all
 				 * subscribed to groups and only groups that contain unread
 				 * articles
 				 */
 				tinrc.show_only_unread_groups = bool_not(tinrc.show_only_unread_groups);
+				/*
+				 * as we effectively do a yank out on each change, set yanked_out accordingly
+				 */
+				yanked_out = TRUE;
 				wait_message(0, _(txt_reading_groups), (tinrc.show_only_unread_groups) ? _("unread") : _("all"));
 
 				toggle_my_groups(NULL);
-				set_groupname_len(FALSE);
 				show_selection_page();
 				if (tinrc.show_only_unread_groups)
 					info_message(_(txt_show_unread));
 				break;
 
-			case iKeySelectBugReport:
+			case GLOBAL_BUGREPORT:
 				bug_report();
 				break;
 
-			case iKeySelectSubscribe:	/* subscribe to current group */
+			case SELECT_SUBSCRIBE:			/* subscribe to current group */
 				if (!selmenu.max) {
 					info_message(_(txt_no_groups));
 					break;
@@ -378,7 +405,7 @@ selection_page(
 				}
 				break;
 
-			case iKeySelectSubscribePat:	/* subscribe to groups matching pattern */
+			case SELECT_SUBSCRIBE_PATTERN:		/* subscribe to groups matching pattern */
 				if (no_write) {
 					info_message(_(txt_info_no_write));
 					break;
@@ -386,7 +413,7 @@ selection_page(
 				subscribe_pattern(_(txt_subscribe_pattern), _(txt_subscribing), _(txt_subscribed_num_groups), TRUE);
 				break;
 
-			case iKeySelectUnsubscribe:	/* unsubscribe to current group */
+			case SELECT_UNSUBSCRIBE:		/* unsubscribe to current group */
 				if (!selmenu.max) {
 					info_message(_(txt_no_groups));
 					break;
@@ -396,14 +423,14 @@ selection_page(
 					break;
 				}
 				if (CURR_GROUP.subscribed) {
-					mark_screen(SELECT_LEVEL, selmenu.curr - selmenu.first, 2, CURR_GROUP.newgroup ? "N" : "u");
+					mark_screen(selmenu.curr, 2, CURR_GROUP.newgroup ? "N" : "u");
 					subscribe(&CURR_GROUP, UNSUBSCRIBED, TRUE);
 					info_message(_(txt_unsubscribed_to), CURR_GROUP.name);
 					move_down();
 				} else if (CURR_GROUP.bogus && tinrc.strip_bogus == BOGUS_SHOW) {
 					/* Bogus groups aren't subscribed to avoid confusion */
 					/* Note that there is no way to remove the group from active[] */
-					sprintf(buf, _(txt_remove_bogus), CURR_GROUP.name);
+					snprintf(buf, sizeof(buf), _(txt_remove_bogus), CURR_GROUP.name);
 					write_newsrc();					/* save current newsrc */
 					delete_group(CURR_GROUP.name);		/* remove bogus group */
 					read_newsrc(newsrc, TRUE);			/* reload newsrc */
@@ -413,7 +440,7 @@ selection_page(
 				}
 				break;
 
-			case iKeySelectUnsubscribePat:	/* unsubscribe to groups matching pattern */
+			case SELECT_UNSUBSCRIBE_PATTERN:	/* unsubscribe to groups matching pattern */
 				if (no_write) {
 					info_message(_(txt_info_no_write));
 					break;
@@ -422,13 +449,13 @@ selection_page(
 								_(txt_unsubscribing), _(txt_unsubscribed_num_groups), FALSE);
 				break;
 
-			case iKeyVersion:	/* show tin version */
+			case GLOBAL_VERSION:			/* show tin version */
 				info_message(cvers);
 				break;
 
-			case iKeyPost:	/* post a basenote */
+			case GLOBAL_POST:			/* post a basenote */
 				if (!selmenu.max) {
-					sprintf(buf, _(txt_post_newsgroups), tinrc.default_post_newsgroups);
+					snprintf(buf, sizeof(buf), _(txt_post_newsgroups), tinrc.default_post_newsgroups);
 					if (!prompt_string_default(buf, tinrc.default_post_newsgroups, _(txt_no_newsgroups), HIST_POST_NEWSGROUPS))
 						break;
 					if (group_find(tinrc.default_post_newsgroups) == NULL) {
@@ -461,8 +488,7 @@ selection_page(
 					show_selection_page();
 				break;
 
-			case iKeyPostponed:
-			case iKeyPostponed2:	/* post postponed article */
+			case GLOBAL_POSTPONED:			/* post postponed article */
 				if (can_post) {
 					if (pickup_postponed_articles(FALSE, FALSE))
 						show_selection_page();
@@ -470,37 +496,40 @@ selection_page(
 					info_message(_(txt_cannot_post));
 				break;
 
-			case iKeyDisplayPostHist:	/* display messages posted by user */
+			case GLOBAL_DISPLAY_POST_HISTORY:	/* display messages posted by user */
 				if (user_posted_messages())
 					show_selection_page();
 				break;
 
-			case iKeySelectYankActive:	/* yank in/out rest of groups from active */
+			case SELECT_YANK_ACTIVE:		/* yank in/out rest of groups from active */
 				yank_active_file();
 				break;
 
-			case iKeySelectSyncWithActive:	/* Re-read active file to see if any new news */
+			case SELECT_SYNC_WITH_ACTIVE:		/* Re-read active file to see if any new news */
 				sync_active_file();
 				if (!yanked_out)
 					yank_active_file();			/* yank out if yanked in */
 				break;
 
-			case iKeySelectMarkGrpUnread:
-			case iKeySelectMarkGrpUnread2:	/* mark group unread */
+			case SELECT_MARK_GROUP_UNREAD:
 				if (!selmenu.max) {
 					info_message(_(txt_no_groups));
 					break;
 				}
 				grp_mark_unread(&CURR_GROUP);
-				if (CURR_GROUP.newsrc.num_unread)
-					strcpy(mesg, tin_ltoa(CURR_GROUP.newsrc.num_unread, 5));
-				else
-					strcpy(mesg, "     ");
-				mark_screen(SELECT_LEVEL, selmenu.curr - selmenu.first, 9, mesg);
+				{
+					char tmp[6];
+
+					if (CURR_GROUP.newsrc.num_unread)
+						STRCPY(tmp, tin_ltoa(CURR_GROUP.newsrc.num_unread, 5));
+					else
+						STRCPY(tmp, "     ");
+					mark_screen(selmenu.curr, 9, tmp);
+				}
 				break;
 
 			default:
-				info_message(_(txt_bad_command), printascii(key, map_to_local(iKeyHelp, &menukeymap.select_nav)));
+				info_message(_(txt_bad_command), printascii(key, func_to_key(GLOBAL_HELP, select_keys)));
 		}
 	}
 }
@@ -511,12 +540,7 @@ show_selection_page(
 	void)
 {
 	char buf[LEN];
-	char tmp[10];
-	char active_name[255];
-	char group_descript[255];
-	char subs;
-	int i, j, n;
-	int blank_len;
+	int i, len;
 
 	signal_context = cSelect;
 	currmenu = &selmenu;
@@ -526,96 +550,129 @@ show_selection_page(
 	else
 		snprintf(buf, sizeof(buf), "%s (%d%s)", _(txt_group_selection), selmenu.max, (tinrc.show_only_unread_groups ? _(" R") : ""));
 
-	MoveCursor(0, 0);		/* top left corner */
-	CleartoEOLN();
-	show_title(buf);
-	MoveCursor(1, 0);
-	CleartoEOLN();
-	MoveCursor(INDEX_TOP, 0);
-
 	if (selmenu.curr < 0)
 		selmenu.curr = 0;
 
+	ClearScreen();
 	set_first_screen_item();
+	show_title(buf);
+
+	/*
+	 * calculate max length of groupname field
+	 * if yanked in (yanked_out == FALSE) check all groups in active file
+	 * otherwise just subscribed to groups
+	 */
+	if (yanked_out) {
+		for (i = 0; i < selmenu.max; i++) {
+			if ((len = strlen(active[my_group[i]].name)) > groupname_len)
+				groupname_len = len;
+			if (show_description && groupname_len > tinrc.groupname_max_length) {
+				/* no need to search further, we have reached max length */
+				groupname_len = tinrc.groupname_max_length;
+				break;
+			}
+		}
+	} else {
+		for_each_group(i) {
+			if ((len = strlen(active[i].name)) > groupname_len)
+				groupname_len = len;
+			if (show_description && groupname_len > tinrc.groupname_max_length) {
+				/* no need to search further, we have reached max length */
+				groupname_len = tinrc.groupname_max_length;
+				break;
+			}
+		}
+	}
+	if (groupname_len >= (cCOLS - SELECT_MISC_COLS))
+		groupname_len = cCOLS - SELECT_MISC_COLS - 1;
+	if (groupname_len < 0)
+		groupname_len = 0;
+
+	for (i = selmenu.first; i < selmenu.first + NOTESLINES && i < selmenu.max; i++)
+		build_gline(i);
+
+	show_mini_help(SELECT_LEVEL);
+
+	if (selmenu.max <= 0) {
+		info_message(_(txt_no_groups));
+		return;
+	}
+
+	draw_group_arrow();
+}
 
-	blank_len = (MIN(cCOLS, (int) sizeof(group_descript)) - (groupname_len + SELECT_MISC_COLS)) + (show_description ? 2 : 4);
 
-	for (j = 0, i = selmenu.first; i < selmenu.last; i++, j++) {
+static void
+build_gline(
+	int i)
+{
+	char tmp[10];
+	char active_name[255];
+	char group_descript[255];
+	char subs;
 #ifdef USE_CURSES
-		char sptr[BUFSIZ];
+	char sptr[BUFSIZ];
 #else
-		char *sptr = screen[j].col;
+	char *sptr = screen[INDEX2SNUM(i)].col;
 #endif /* USE_CURSES */
-		if (active[my_group[i]].inrange)
-			strcpy(tmp, "    #");
-		else if (active[my_group[i]].newsrc.num_unread) {
-			strcpy(tmp, tin_ltoa(active[my_group[i]].newsrc.num_unread, 5));
-		} else
-			strcpy(tmp, "     ");
+	int n, blank_len;
 
-		n = my_group[i];
+	blank_len = (MIN(cCOLS, (int) sizeof(group_descript)) - (groupname_len + SELECT_MISC_COLS)) + (show_description ? 2 : 4);
 
-		/*
-		 * Display a flag for this group if needed
-		 * . Bogus groups are dumped immediately
-		 * . Normal subscribed groups may be
-		 *   ' ' normal, 'X' not postable, 'M' moderated, '=' renamed
-		 * . Newgroups are 'N'
-		 * . Unsubscribed groups are 'u'
-		 */
-		if (active[n].bogus)					/* Group is not in active list */
-			subs = 'D';
-		else if (active[n].subscribed)			/* Important that this preceeds Newgroup */
-			subs = group_flag(active[n].moderated);
-		else
-			subs = ((active[n].newgroup) ? 'N' : 'u'); /* New (but unsubscribed) group or unsubscribed group */
+	if (active[my_group[i]].inrange)
+		strcpy(tmp, "    #");
+	else if (active[my_group[i]].newsrc.num_unread) {
+		strcpy(tmp, tin_ltoa(active[my_group[i]].newsrc.num_unread, 5));
+	} else
+		strcpy(tmp, "     ");
 
-		strncpy(active_name, active[n].name, groupname_len);
-		active_name[groupname_len] = '\0';
+	n = my_group[i];
 
-		if (blank_len > (int) (sizeof(group_descript) - 1))
-			blank_len = sizeof(group_descript) - 1;
+	/*
+	 * Display a flag for this group if needed
+	 * . Bogus groups are dumped immediately
+	 * . Normal subscribed groups may be
+	 *   ' ' normal, 'X' not postable, 'M' moderated, '=' renamed
+	 * . Newgroups are 'N'
+	 * . Unsubscribed groups are 'u'
+	 */
+	if (active[n].bogus)					/* Group is not in active list */
+		subs = 'D';
+	else if (active[n].subscribed)			/* Important that this preceeds Newgroup */
+		subs = group_flag(active[n].moderated);
+	else
+		subs = ((active[n].newgroup) ? 'N' : 'u'); /* New (but unsubscribed) group or unsubscribed group */
 
-		if (show_description) {
-			if (active[n].description) {
-				strncpy(group_descript, active[n].description, blank_len);
-				group_descript[blank_len] = '\0';
-				sprintf(sptr, "  %c %s %s  %-*.*s  %-*.*s%s",
-				         subs, tin_ltoa(i + 1, 4), tmp,
-				         groupname_len, groupname_len, active_name,
-				         blank_len, blank_len, group_descript, cCRLF);
-			} else
-				sprintf(sptr, "  %c %s %s  %-*.*s  %s",
-				         subs, tin_ltoa(i + 1, 4), tmp,
-				         (groupname_len + blank_len),
-				         (groupname_len + blank_len), active[n].name, cCRLF);
-		} else {
-			if (tinrc.draw_arrow)
-				sprintf(sptr, "  %c %s %s  %-*.*s%s", subs, tin_ltoa(i + 1, 4), tmp, groupname_len, groupname_len, active_name, cCRLF);
-			else
-				sprintf(sptr, "  %c %s %s  %-*.*s%*s%s", subs, tin_ltoa(i + 1, 4), tmp, groupname_len, groupname_len, active_name, blank_len, " ", cCRLF);
-		}
-		if (tinrc.strip_blanks)
-			strcat(strip_line(sptr), cCRLF);
+	strncpy(active_name, active[n].name, groupname_len);
+	active_name[groupname_len] = '\0';
 
-		CleartoEOLN();
-		my_fputs(sptr, stdout);
+	if (show_description) {
+		if (active[n].description) {
+			strncpy(group_descript, active[n].description, blank_len);
+			group_descript[blank_len] = '\0';
+			sprintf(sptr, "  %c %s %s  %-*.*s  %-*.*s%s",
+				 subs, tin_ltoa(i + 1, 4), tmp,
+				 groupname_len, groupname_len, active_name,
+				 blank_len, blank_len, group_descript, cCRLF);
+		} else
+			sprintf(sptr, "  %c %s %s  %-*.*s  %s",
+				 subs, tin_ltoa(i + 1, 4), tmp,
+				 (groupname_len + blank_len),
+				 (groupname_len + blank_len), active[n].name, cCRLF);
+	} else {
+		if (tinrc.draw_arrow)
+			sprintf(sptr, "  %c %s %s  %-*.*s%s", subs, tin_ltoa(i + 1, 4), tmp, groupname_len, groupname_len, active_name, cCRLF);
+		else
+			sprintf(sptr, "  %c %s %s  %-*.*s%*s%s", subs, tin_ltoa(i + 1, 4), tmp, groupname_len, groupname_len, active_name, blank_len, " ", cCRLF);
 	}
+	if (tinrc.strip_blanks)
+		strcat(strip_line(sptr), cCRLF);
 
-	CleartoEOS();
-	show_mini_help(SELECT_LEVEL);
-
-	if (selmenu.max <= 0) {
-		info_message(_(txt_no_groups));
-		return;
-	} else if (selmenu.last == selmenu.max)
-		info_message(_(txt_end_of_groups));
-
-	draw_group_arrow();
+	WriteLine(INDEX2LNUM(i), sptr);
 }
 
 
-void
+static void
 draw_group_arrow(
 	void)
 {
@@ -627,6 +684,8 @@ draw_group_arrow(
 			info_message(_(txt_group_aliased), CURR_GROUP.aliasedto);
 		else if (tinrc.info_in_last_line)
 			info_message("%s", CURR_GROUP.description ? CURR_GROUP.description : _(txt_no_description));
+		else if (selmenu.curr == selmenu.max - 1)
+			info_message(_(txt_end_of_groups));
 	}
 }
 
@@ -644,36 +703,35 @@ static void
 yank_active_file(
 	void)
 {
-	if (yanked_out) {										/* Yank in */
-		if (selmenu.max == num_active)						/* All groups currently present? */
-			info_message(_(txt_yanked_none));
-		else {
-			int i;
-			int prevmax = selmenu.max;
-
-			save_restore_curr_group(TRUE);					/* Save group position */
-
-			/*
-			 * Reset counter and load all the groups in active[] into my_group[]
-			 */
-			selmenu.max = 0;
-			for_each_group(i)
-				my_group[selmenu.max++] = i;
+	if (yanked_out && selmenu.max == num_active) {			/* All groups currently present? */
+		info_message(_(txt_yanked_none));
+		return;
+	}
 
-			selmenu.curr = save_restore_curr_group(FALSE);	/* Restore previous group position */
-			set_groupname_len(yanked_out);
-			show_selection_page();
-			info_message(_(txt_yanked_groups), selmenu.max-prevmax, PLURAL(selmenu.max-prevmax, txt_group));
-		}
-	} else {												/* Yank out */
+	if (yanked_out) {						/* Yank in */
+		int i;
+		int prevmax = selmenu.max;
+
+		save_restore_curr_group(TRUE);				/* Save group position */
+
+		/*
+		 * Reset counter and load all the groups in active[] into my_group[]
+		 */
+		selmenu.max = 0;
+		for_each_group(i)
+			my_group[selmenu.max++] = i;
+
+		selmenu.curr = save_restore_curr_group(FALSE);	/* Restore previous group position */
+		yanked_out = bool_not(yanked_out);
+		show_selection_page();
+		info_message(_(txt_yanked_groups), selmenu.max-prevmax, PLURAL(selmenu.max-prevmax, txt_group));
+	} else {							/* Yank out */
 		toggle_my_groups(NULL);
 		HpGlitch(erase_arrow());
-		set_groupname_len(yanked_out);
+		yanked_out = bool_not(yanked_out);
 		show_selection_page();
 		info_message(_(txt_yanked_sub_groups));
 	}
-
-	yanked_out = bool_not(yanked_out);
 }
 
 
@@ -754,12 +812,16 @@ int
 choose_new_group(
 	void)
 {
+	char *prompt;
 	int idx;
 
-	sprintf(mesg, _(txt_newsgroup), tinrc.default_goto_group);
+	prompt = fmt_string(_(txt_newsgroup), tinrc.default_goto_group);
 
-	if (!(prompt_string_default(mesg, tinrc.default_goto_group, "", HIST_GOTO_GROUP)))
+	if (!(prompt_string_default(prompt, tinrc.default_goto_group, "", HIST_GOTO_GROUP))) {
+		free(prompt);
 		return -1;
+	}
+	free(prompt);
 
 	str_trim(tinrc.default_goto_group);
 
@@ -837,7 +899,7 @@ reposition_group(
 
 	/* Have already trapped no_write at this point */
 
-	sprintf(buf, _(txt_newsgroup_position), group->name,
+	snprintf(buf, sizeof(buf), _(txt_newsgroup_position), group->name,
 		(tinrc.default_move_group ? tinrc.default_move_group : default_num + 1));
 
 	if (!prompt_string(buf, pos, HIST_MOVE_GROUP))
@@ -895,15 +957,18 @@ catchup_group(
 	struct t_group *group,
 	t_bool goto_next_unread_group)
 {
-	if ((!TINRC_CONFIRM_ACTION) || prompt_yn(cLINES, sized_message(_(txt_mark_group_read), group->name), TRUE) == 1) {
+	char *smsg = NULL;
+
+	if ((!TINRC_CONFIRM_ACTION) || prompt_yn(sized_message(&smsg, _(txt_mark_group_read), group->name), TRUE) == 1) {
 		grp_mark_read(group, NULL);
-		mark_screen(SELECT_LEVEL, selmenu.curr - selmenu.first, 9, "     ");
+		mark_screen(selmenu.curr, 9, "     ");
 
 		if (goto_next_unread_group)
 			pos_next_unread_group(TRUE);
 		else
 			move_down();
 	}
+	FreeIfNeeded(smsg);
 }
 
 
@@ -1002,47 +1067,6 @@ read_groups(
 
 
 /*
- * Calculate max length of groupname field for group selection level.
- * If all_groups is TRUE check all groups in active file otherwise
- * just subscribed to groups.
- */
-void
-set_groupname_len(
-	t_bool all_groups)
-{
-	int len;
-	int i;
-
-	groupname_len = 0;
-
-	if (all_groups) {
-		for_each_group(i) {
-			if ((len = strlen(active[i].name)) > groupname_len)
-				groupname_len = len;
-		}
-	} else {
-		for (i = 0; i < selmenu.max; i++) {
-			if ((len = strlen(active[my_group[i]].name)) > groupname_len)
-				groupname_len = len;
-		}
-	}
-
-	if (groupname_len >= (cCOLS - SELECT_MISC_COLS)) {
-		groupname_len = cCOLS - SELECT_MISC_COLS - 1;
-		if (groupname_len < 0)
-			groupname_len = 0;
-	}
-
-	/*
-	 * If newsgroups descriptions are ON then cut off groupnames
-	 * to specified max. length otherwise display full length
-	 */
-	if (show_description && groupname_len > tinrc.groupname_max_length)
-		groupname_len = tinrc.groupname_max_length;
-}
-
-
-/*
  * Toggle my_group[] between all groups / only unread groups
  * We make a special case for Newgroups (always appear, at the top)
  * and Bogus groups if tinrc.strip_bogus = BOGUS_SHOW
@@ -1182,7 +1206,6 @@ subscribe_pattern(
 
 	if (subscribe_num) {
 		toggle_my_groups(NULL);
-		set_groupname_len(FALSE);
 		show_selection_page();
 		info_message(result, subscribe_num);
 	} else
@@ -1206,9 +1229,9 @@ static void
 select_done(
 	void)
 {
-	if (!TINRC_CONFIRM_TO_QUIT || prompt_yn(cLINES, _(txt_quit), TRUE) == 1)
+	if (!TINRC_CONFIRM_TO_QUIT || prompt_yn(_(txt_quit), TRUE) == 1)
 		select_quit();
-	if (!no_write && prompt_yn(cLINES, _(txt_save_config), TRUE) == 1) {
+	if (!no_write && prompt_yn(_(txt_save_config), TRUE) == 1) {
 		write_config_file(local_config_file);
 		write_newsrc();
 	}
diff -Nurp tin-1.6.2/src/sigfile.c tin-1.8.0/src/sigfile.c
--- tin-1.6.2/src/sigfile.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/sigfile.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : sigfile.c
  *  Author    : M. Gleason & I. Lea
  *  Created   : 1992-10-17
- *  Updated   : 2003-03-14
+ *  Updated   : 2003-09-19
  *  Notes     : Generate random signature for posting/mailing etc.
  *
- * Copyright (c) 1992-2003 Mike Gleason
+ * Copyright (c) 1992-2006 Mike Gleason
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,11 +41,7 @@
 
 #define MAXLOOPS 1000
 
-#ifndef M_AMIGA
-#	define CURRENTDIR "."
-#else
-#	define CURRENTDIR ""
-#endif /* !M_AMIGA */
+#define CURRENTDIR "."
 
 static char sigfile[PATH_LEN];
 
@@ -80,6 +76,7 @@ msg_write_signature(
 			FILE *pipe_fp;
 			char *sigcmd;
 			char cmd[PATH_LEN];
+
 			fprintf(fp, "\n%s", tinrc.sigdashes ? SIGDASHES : "\n");
 			sigcmd = my_malloc(strlen(thisgroup->attribute->sigfile + 1) + strlen(thisgroup->name) + 4);
 			sprintf(sigcmd, "%s \"%s\"", thisgroup->attribute->sigfile + 1, thisgroup->name);
@@ -217,12 +214,7 @@ thrashdir(
 	 * consider all entries starting with "." non-entries
 	 */
 	cwd = my_malloc(PATH_LEN);
-#ifndef M_AMIGA
-	if (numentries < 3 || cwd == NULL)
-#else
-	if (numentries == 0 || cwd == NULL)
-#endif /* !M_AMIGA */
-	{
+	if (numentries < 3 || cwd == NULL) {
 		CLOSEDIR(dirp);
 		return -1;
 	}
diff -Nurp tin-1.6.2/src/signal.c tin-1.8.0/src/signal.c
--- tin-1.6.2/src/signal.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/signal.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : signal.c
  *  Author    : I.Lea
  *  Created   : 1991-04-01
- *  Updated   : 2003-05-15
+ *  Updated   : 2004-06-21
  *  Notes     : signal handlers for different modes and window resizing
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -106,6 +106,7 @@ static void _CDECL signal_handler(SIG_AR
 #endif /* SIGTSTP */
 
 int signal_context = cMain;
+int input_context = cNone;
 int need_resize = cNo;
 /*
  * # lines of non-static data available for display
@@ -157,9 +158,9 @@ static const struct {
 #	ifdef SIGTERM
 	{ SIGTERM,	"SIGTERM" },	/* termination */
 #	endif /* SIGTERM */
-#	ifdef SIGWINCH
+#	if defined(SIGWINCH) && !(defined(USE_CURSES) && defined(KEY_RESIZE))
 	{ SIGWINCH,	"SIGWINCH" },	/* window-size change */
-#	endif /* SIGWINCH */
+#	endif /* SIGWINCH && !(USE_CURSES && KEY_RESIZE) */
 };
 #endif /* !__LCLINT__ */
 
@@ -209,9 +210,9 @@ allow_resize(
 	if (!allow)
 		sa.sa_flags |= SA_RESTART;
 #	endif /* SA_RESTART */
-#	ifdef SIGWINCH
+#	if defined(SIGWINCH) && !(defined(USE_CURSES) && defined(KEY_RESIZE))
 	sigaction(SIGWINCH, &sa, &osa);
-#	endif /* SIGWINCH */
+#	endif /* SIGWINCH && !(USE_CURSES && KEY_RESIZE) */
 #	ifdef SIGTSTP
 	sigaction(SIGTSTP, &sa, &osa);
 #	endif /* SIGTSTP */
@@ -275,28 +276,46 @@ handle_resize(
 			ClearScreen();
 			show_art_msg(curr_group->name);
 			break;
+
 		case cConfig:
-			refresh_config_page(-1);
+			refresh_config_page(SIGNAL_HANDLER);
 			break;
+
 		case cFilter:
 			refresh_filter_menu();
 			break;
+
 		case cInfopager:
 			display_info_page(0);
 			break;
+
 		case cGroup:
 		case cSelect:
 		case cThread:
 			ClearScreen();
 			currmenu->redraw();
 			break;
+
 		case cPage:
 			resize_article(TRUE, &pgart);
 			draw_page(curr_group->name, 0);
 			break;
+
 		case cMain:
 			break;
 	}
+	switch (input_context) {
+		case cGetline:
+			gl_redraw();
+			break;
+
+		case cPromptSLK:
+			prompt_slk_redraw();
+			break;
+
+		default:
+			break;
+	}
 	my_fflush(stdout);
 #endif /* SIGWINCH || SIGTSTP */
 }
@@ -347,12 +366,10 @@ signal_handler(
 	switch (sig) {
 #ifdef SIGINT
 		case SIGINT:
-#	if !defined(M_AMIGA) && !defined(__SASC)
 			if (!batch_mode) {
 				RESTORE_HANDLER(sig, signal_handler);
 				return;
 			}
-#	endif /* !M_AMIGA && !__SASC */
 			break;
 #endif /* SIGINT */
 
@@ -400,20 +417,24 @@ signal_handler(
 #ifdef SIGTERM
 		case SIGTERM:
 #endif /* SIGTERM */
+#if defined(SIGHUP) || defined(SIGUSR1) || defined(SIGTERM)
 			dangerous_signal_exit = TRUE;
 			tin_done(-sig);
 			/* NOTREACHED */
 			break;
+#endif /* SIGHUP || SIGUSR1 || SIGTERM */
 
 #ifdef SIGBUS
 		case SIGBUS:
-#endif /*S IGBUS */
+#endif /* SIGBUS */
 #ifdef SIGSEGV
 		case SIGSEGV:
 #endif /* SIGSEGV */
+#if defined(SIGBUS) || defined(SIGSEGV)
 			my_fprintf(stderr, _(txt_send_bugreport), tin_progname, VERSION, RELEASEDATE, RELEASENAME, OSNAME, bug_addr);
 			my_fflush(stderr);
 			break;
+#endif /* SIGBUS || SIGSEGV */
 
 		default:
 			break;
@@ -444,9 +465,9 @@ set_signal_catcher(
 		sigdisp(SIGTSTP, flag ? signal_handler : SIG_DFL);
 #endif /* SIGTSTP */
 
-#ifdef SIGWINCH
+#if defined(SIGWINCH) && !(defined(USE_CURSES) && defined(KEY_RESIZE))
 	sigdisp(SIGWINCH, flag ? signal_handler : SIG_DFL);
-#endif /* SIGWINCH */
+#endif /* SIGWINCH && !(USE_CURSES && KEY_RESIZE) */
 }
 
 
@@ -529,10 +550,6 @@ set_win_size(
 			*num_cols = win.ws_col;
 	}
 #		else
-#			ifdef M_AMIGA
-	AmiGetWinSize(num_lines, num_cols);
-	(*num_lines)--;
-#			endif /* M_AMIGA */
 #		endif /* TIOCGWINSZ */
 #	endif /* TIOCGSIZE */
 
@@ -542,11 +559,6 @@ set_win_size(
 
 #endif /* HAVE_XCURSES */
 
-	set_subj_from_size(*num_cols);
-
-	/* FIXME: values do differ for different languages */
-	RIGHT_POS = *num_cols - 20;
-	MORE_POS = *num_cols - 15;
 	set_noteslines(*num_lines);
 	return (*num_lines != old_lines || *num_cols != old_cols);
 }
diff -Nurp tin-1.6.2/src/strftime.c tin-1.8.0/src/strftime.c
--- tin-1.6.2/src/strftime.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/strftime.c	2005-12-02 12:07:37.000000000 +0100
@@ -12,7 +12,7 @@
  *              tm = localtime(&secs);
  *              num = strftime(buf, sizeof(buf), "%a %d-%m-%y %H:%M:%S", tm);
  *
- * Copyright (c) 1991-2003 Arnold Robbins <arnold@skeeve.com>
+ * Copyright (c) 1991-2006 Arnold Robbins <arnold@skeeve.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -143,7 +143,7 @@ my_strftime(
 			break;
 
 		case 'c':	/* appropriate date and time representation */
-			sprintf(tbuf, "%s %s %2d %02d:%02d:%02d %d",
+			snprintf(tbuf, sizeof(tbuf), "%s %s %2d %02d:%02d:%02d %d",
 				days_a[timeptr->tm_wday],
 				months_a[timeptr->tm_mon],
 				timeptr->tm_mday,
@@ -154,11 +154,11 @@ my_strftime(
 			break;
 
 		case 'd':	/* day of the month, 01 - 31 */
-			sprintf(tbuf, "%02d", timeptr->tm_mday);
+			snprintf(tbuf, sizeof(tbuf), "%02d", timeptr->tm_mday);
 			break;
 
 		case 'H':	/* hour, 24-hour clock, 00 - 23 */
-			sprintf(tbuf, "%02d", timeptr->tm_hour);
+			snprintf(tbuf, sizeof(tbuf), "%02d", timeptr->tm_hour);
 			break;
 
 		case 'I':	/* hour, 12-hour clock, 01 - 12 */
@@ -167,19 +167,19 @@ my_strftime(
 				i = 12;
 			else if (i > 12)
 				i -= 12;
-			sprintf(tbuf, "%02d", i);
+			snprintf(tbuf, sizeof(tbuf), "%02d", i);
 			break;
 
 		case 'j':	/* day of the year, 001 - 366 */
-			sprintf(tbuf, "%03d", timeptr->tm_yday + 1);
+			snprintf(tbuf, sizeof(tbuf), "%03d", timeptr->tm_yday + 1);
 			break;
 
 		case 'm':	/* month, 01 - 12 */
-			sprintf(tbuf, "%02d", timeptr->tm_mon + 1);
+			snprintf(tbuf, sizeof(tbuf), "%02d", timeptr->tm_mon + 1);
 			break;
 
 		case 'M':	/* minute, 00 - 59 */
-			sprintf(tbuf, "%02d", timeptr->tm_min);
+			snprintf(tbuf, sizeof(tbuf), "%02d", timeptr->tm_min);
 			break;
 
 		case 'p':	/* am or pm based on 12-hour clock */
@@ -187,15 +187,15 @@ my_strftime(
 			break;
 
 		case 'S':	/* second, 00 - 61 */
-			sprintf(tbuf, "%02d", timeptr->tm_sec);
+			snprintf(tbuf, sizeof(tbuf), "%02d", timeptr->tm_sec);
 			break;
 
 		case 'w':	/* weekday, Sunday == 0, 0 - 6 */
-			sprintf(tbuf, "%d", timeptr->tm_wday);
+			snprintf(tbuf, sizeof(tbuf), "%d", timeptr->tm_wday);
 			break;
 
 		case 'x':	/* appropriate date representation */
-			sprintf(tbuf, "%s %s %2d %d",
+			snprintf(tbuf, sizeof(tbuf), "%s %s %2d %d",
 				days_a[timeptr->tm_wday],
 				months_a[timeptr->tm_mon],
 				timeptr->tm_mday,
@@ -203,7 +203,7 @@ my_strftime(
 			break;
 
 		case 'X':	/* appropriate time representation */
-			sprintf(tbuf, "%02d:%02d:%02d",
+			snprintf(tbuf, sizeof(tbuf), "%02d:%02d:%02d",
 				timeptr->tm_hour,
 				timeptr->tm_min,
 				timeptr->tm_sec);
@@ -211,11 +211,11 @@ my_strftime(
 
 		case 'y':	/* year without a century, 00 - 99 */
 			i = timeptr->tm_year % 100;
-			sprintf(tbuf, "%d", i);
+			snprintf(tbuf, sizeof(tbuf), "%d", i);
 			break;
 
 		case 'Y':	/* year with century */
-			sprintf(tbuf, "%d", timeptr->tm_year + 1900);
+			snprintf(tbuf, sizeof(tbuf), "%d", timeptr->tm_year + 1900);
 			break;
 
 #	ifdef SYSV_EXT
@@ -230,23 +230,23 @@ my_strftime(
 			break;
 
 		case 'D':	/* date as %m/%d/%y */
-			my_strftime(tbuf, sizeof tbuf, "%m/%d/%y", timeptr);
+			my_strftime(tbuf, sizeof(tbuf), "%m/%d/%y", timeptr);
 			break;
 
 		case 'e':	/* day of month, blank padded */
-			sprintf(tbuf, "%2d", timeptr->tm_mday);
+			snprintf(tbuf, sizeof(tbuf), "%2d", timeptr->tm_mday);
 			break;
 
 		case 'r':	/* time as %I:%M:%S %p */
-			my_strftime(tbuf, sizeof tbuf, "%I:%M:%S %p", timeptr);
+			my_strftime(tbuf, sizeof(tbuf), "%I:%M:%S %p", timeptr);
 			break;
 
 		case 'R':	/* time as %H:%M */
-			my_strftime(tbuf, sizeof tbuf, "%H:%M", timeptr);
+			my_strftime(tbuf, sizeof(tbuf), "%H:%M", timeptr);
 			break;
 
 		case 'T':	/* time as %H:%M:%S */
-			my_strftime(tbuf, sizeof tbuf, "%H:%M:%S", timeptr);
+			my_strftime(tbuf, sizeof(tbuf), "%H:%M:%S", timeptr);
 			break;
 #	endif /* SYSV_EXT */
 
diff -Nurp tin-1.6.2/src/string.c tin-1.8.0/src/string.c
--- tin-1.6.2/src/string.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/string.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : string.c
  *  Author    : Urs Janssen <urs@tin.org>
  *  Created   : 1997-01-20
- *  Updated   : 2003-05-14
+ *  Updated   : 2005-11-04
  *  Notes     :
  *
- * Copyright (c) 1997-2003 Urs Janssen <urs@tin.org>
+ * Copyright (c) 1997-2006 Urs Janssen <urs@tin.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,28 +38,63 @@
 #ifndef TIN_H
 #	include "tin.h"
 #endif /* !TIN_H */
+#ifdef HAVE_UNICODE_NORMALIZATION
+#	ifdef HAVE_LIBICUUC
+#		if defined(HAVE_UNICODE_UNORM_H) && !defined(UNORM_H)
+#			include <unicode/unorm.h>
+#		endif /* HAVE_UNICODE_UNORM_H && !UNORM_H */
+#		if defined(HAVE_UNICODE_USTRING_H) && !defined(USTRING_H)
+#			include <unicode/ustring.h>
+#		endif /* HAVE_UNICODE_USTRING_H && !USTRING_H */
+#	else
+#		if defined(HAVE_LIBIDN) && defined(HAVE_STRINGPREP_H) && !defined(_STRINGPREP_H)
+#			include <stringprep.h>
+#		endif /* HAVE_LIBIDN && HAVE_STRINGPREP_H && !_STRINGPREP_H */
+#	endif /* HAVE_LIBICUUC */
+#endif /* HAVE_UNICODE_NORMALIZATION */
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+#	if defined(HAVE_UNICODE_UBIDI_H) && !defined(UBIDI_H)
+#		include <unicode/ubidi.h>
+#	endif /* HAVE_UNICODE_UBIDI_H && !UBIDI_H */
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && !NO_LOCALE */
 
 /*
  * this file needs some work
  */
 
 /*
+ * local prototypes
+ */
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	static UChar *char2UChar(const char *str);
+	static char *UChar2char(const UChar *ustr);
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && !NO_LOCALE */
+
+
+/*
  * special ltoa()
- * converts value into a string with a len of digits
- * last char may be one of the following
- * Kilo, Mega, Giga, Terra
+ * converts value into a string with a maxlen of digits (usualy should be
+ * >=4), last char may be one of the following:
+ * 'K'ilo, 'M'ega, 'G'iga, 'T'erra, 'P'eta, 'E'xa, 'Z'etta, 'Y'otta,
+ * 'X'ona, 'W'eka, 'V'unda, 'U'da (these last 4 are no official SI-prefixes)
+ * or 'e' if an error occurs
  */
 char *
 tin_ltoa(
 	long value,
 	int digits)
 {
-	static char buffer[256];
-	static const char power[] = " KMGT";
+	static char buffer[64];
+	static const char power[] = { ' ', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', 'X', 'W', 'V', 'U', '\0' };
 	int len;
-	int i = 0;
+	size_t i = 0;
+
+	if (digits <= 0) {
+		buffer[0] = 'e';
+		return buffer;
+	}
 
-	sprintf(buffer, "%ld", value);
+	snprintf(buffer, sizeof(buffer), "%ld", value);
 	len = (int) strlen(buffer);
 
 	while (len > digits) {
@@ -67,14 +102,24 @@ tin_ltoa(
 		i++;
 	}
 
+	if (i >= strlen(power)) {	/* buffer is to small */
+		buffer[(digits & 0x7f) - 1] = 'e';
+		buffer[(digits & 0x7f)] = '\0';
+		return buffer;
+	}
+
 	if (i) {
 		while (len < (digits - 1))
 			buffer[len++] = ' ';
 
-		buffer[digits - 1] = power[i];
+		if (digits > len)
+			buffer[digits - 1] = power[i];
+		else /* overflow */
+			buffer[digits - 1] = 'e';
+
 		buffer[digits] = '\0';
 	} else
-		sprintf(buffer, "%*ld", digits, value);
+		snprintf(buffer, sizeof(buffer), "%*ld", digits, value);
 
 	return buffer;
 }
@@ -104,6 +149,43 @@ my_strdup(
 
 
 /*
+ * strtok that understands empty tokens
+ * ie 2 adjacent delims count as two delims around a \0
+ */
+char *
+tin_strtok(
+	char *str,
+	const char *delim)
+{
+	static char *buff;
+	char *oldbuff, *ptr;
+
+	/*
+	 * First call, setup static ptr
+	 */
+	if (str)
+		buff = str;
+
+	/*
+	 * If not at end of string find ptr to next token
+	 * If delim found, break off token
+	 */
+	if (buff && (ptr = strpbrk(buff, delim)) != NULL)
+		*ptr++ = '\0';
+	else
+		ptr = NULL;
+
+	/*
+	 * Advance position in string to next token
+	 * return current token
+	 */
+	oldbuff = buff;
+	buff = ptr;
+	return oldbuff;
+}
+
+
+/*
  * strncpy that stops at a newline and null terminates
  */
 void
@@ -203,7 +285,7 @@ strpbrk(
 				return ptr1;
 		}
 	}
-	return (char *) 0;
+	return NULL;
 }
 #endif /* !HAVE_STRPBRK */
 
@@ -383,6 +465,28 @@ strncasecmp(
 }
 #endif /* !HAVE_STRNCASECMP */
 
+#ifndef HAVE_STRSEP
+/*
+ * strsep() is not mandatory in ANSI-C
+ */
+char *strsep(
+	char **stringp,
+	const char *delim)
+{
+	char *s = *stringp;
+	char *p;
+
+	if (!s)
+		return NULL;
+
+	if ((p = strpbrk(s, delim)) != NULL)
+		*p++ = '\0';
+
+	*stringp = p;
+	return s;
+}
+#endif /* !HAVE_STRSEP */
+
 
 /*
  * str_trim - leading and trailing whitespace
@@ -401,6 +505,9 @@ str_trim(
 	char *wp;		/* writing string pointer */
 	char *ls;		/* last space */
 
+	if (string == NULL)
+		return NULL;
+
 	for (rp = wp = ls = string; isspace((int) *rp); rp++)		/* Skip leading space */
 		;
 
@@ -474,11 +581,11 @@ sh_format(
 	const char *fmt,
 	...)
 {
-	int result = 0;
 	char *src;
 	char temp[20];
-	va_list ap;
+	int result = 0;
 	int quote = 0;
+	va_list ap;
 
 	va_start(ap, fmt);
 
@@ -509,7 +616,7 @@ sh_format(
 				break;
 
 			case 'd':
-				sprintf(temp, "%d", va_arg(ap, int));
+				snprintf(temp, sizeof(temp), "%d", va_arg(ap, int));
 				src = temp;
 				break;
 
@@ -561,16 +668,6 @@ sh_format(
 
 #ifndef HAVE_STRERROR
 #	ifdef HAVE_SYS_ERRLIST
-#		ifdef M_AMIGA
-#			ifndef sys_errlist
-				extern char *__sys_errlist[];
-#				define sys_errlist	__sys_errlist
-#			endif /* !sys_errlist */
-#		else
-#			ifdef DECL_SYS_ERRLIST
-				extern char *sys_errlist[];
-#			endif /* DECL_SYS_ERRLIST */
-#		endif /* M_AMIGA */
 		extern int sys_nerr;
 #	endif /* HAVE_SYS_ERRLIST */
 char *
@@ -583,7 +680,7 @@ my_strerror(
 	if (n >= 0 && n < sys_nerr)
 		return sys_errlist[n];
 #	endif /* HAVE_SYS_ERRLIST */
-	sprintf(temp, "Errno: %d", n);
+	snprintf(temp, sizeof(temp), "Errno: %d", n);
 	return temp;
 }
 #endif /* !HAVE_STRERROR */
@@ -612,46 +709,437 @@ strrstr(
 	}
 	return NULL;
 }
-#endif /* HAVE_STRRSTR */
+#endif /* !HAVE_STRRSTR */
 
 
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 /*
- * copy wide-chars from '*from' to '*to' until 'columns' columns are filled
- * pad with spaces if necessary
+ * convert from char* to wchar_t*
  */
-void
+wchar_t *
+char2wchar_t(
+	const char *str)
+{
+	size_t len;
+	wchar_t *wstr;
+
+	len = mbstowcs(NULL, str, 0);
+	if (len == (size_t) (-1))
+		return NULL;
+
+	wstr = my_malloc(sizeof(wchar_t) * (len + 1));
+	mbstowcs(wstr, str, len + 1);
+
+	return wstr;
+}
+
+
+/*
+ * convert from wchar_t* to char*
+ */
+char *
+wchar_t2char(
+	const wchar_t *wstr)
+{
+	char *str;
+	size_t len;
+
+	len = wcstombs(NULL, wstr, 0);
+	if (len == (size_t) (-1))
+		return NULL;
+
+	str = my_malloc(len + 1);
+	wcstombs(str, wstr, len + 1);
+
+	return str;
+}
+
+
+/*
+ * returns a new string fitting into 'columns' columns
+ * if pad is TRUE the resulting string will be filled with spaces if necessary
+ */
+wchar_t *
 wcspart(
-	wchar_t *to,
-	const wchar_t *from,
+	const wchar_t *wstr,
 	int columns,
-	int size_to,
 	t_bool pad)
 {
-	int n, i = 0;
+	int used = 0;
 	wchar_t *ptr, *wbuf;
 
-	/* make sure all characters in from are printable */
-	wbuf = my_malloc(size_to * sizeof(wchar_t));
-	wcsncpy(wbuf, from, size_to);
-	wbuf[size_to - 1] = (wchar_t) '\0';
+	wbuf = my_wcsdup(wstr);
+	/* make sure all characters in wbuf are printable */
 	ptr = wconvert_to_printable(wbuf);
 
-	to[0] = (wint_t) '\0';
-	while (*ptr && i < size_to && wcswidth(to, size_to - 1) + wcwidth(*ptr) <= columns) {
-		to[i] = *ptr;
-		ptr++;
-		to[++i] = (wint_t) '\0';
-	}
+	/* terminate wbuf after 'columns' columns */
+	while (*ptr && used + wcwidth(*ptr) <= columns)
+		used += wcwidth(*ptr++);
+	*ptr = (wchar_t) '\0';
 
 	/* pad with spaces */
 	if (pad) {
-		n = columns - wcswidth(to, size_to - 1) + (int) wcslen(to);
-		for (; i < MIN(n, size_to - 1); i++)
-			to[i] = (wint_t) ' ';
-		to[i] = (wint_t) '\0';
-	}
+		int gap;
+
+		gap = columns - wcswidth(wbuf, wcslen(wbuf) + 1);
+		assert(gap >= 0);
+		wbuf = my_realloc(wbuf, sizeof(wchar_t) * (wcslen(wbuf) + gap + 1));
+		ptr = wbuf + wcslen(wbuf); /* set ptr again to end of wbuf */
+
+		while (gap-- > 0)
+			*ptr++ = (wchar_t) ' ';
 
-	free(wbuf);
+		*ptr = (wchar_t) '\0';
+	} else
+		wbuf = my_realloc(wbuf, sizeof(wchar_t) * (wcslen(wbuf) + 1));
+
+	return wbuf;
 }
 #endif /* MULTIBYTE_ABLE && !NOLOCALE */
+
+
+#define TRUNC_TAIL	"..."
+/*
+ * shortens 'mesg' that it occupies at most 'len' screen positions.
+ * If it was nessary to truncate 'mesg', " ..." is appended to the
+ * resulting string (still 'len' screen positions wide).
+ * The resulting string is stored in 'buf'.
+ */
+char *
+strunc(
+	const char *message,
+	int len)
+{
+	char *tmp;
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+	wchar_t *wmessage, *wbuf;
+
+	if ((wmessage = char2wchar_t(message)) != NULL) {
+		wbuf = wstrunc(wmessage, len);
+		free(wmessage);
+
+		if ((tmp = wchar_t2char(wbuf)) != NULL) {
+			free(wbuf);
+
+			return tmp;
+		}
+		free(wbuf);
+	}
+	/* something went wrong using wide-chars, default back to normal chars */
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+
+	if ((int) strlen(message) <= len)
+		tmp = my_strdup(message);
+	else {
+		tmp = my_malloc(len + 1);
+		snprintf(tmp, len + 1, "%-.*s%s", len - 3, message, TRUNC_TAIL);
+	}
+
+	return tmp;
+}
+
+
+/*
+ * if you use UTF-8 as local charset and want to use
+ * U+2026 (HORIZONTAL_ELLIPSIS) instead of "..." uncomment
+ * the following define
+ */
+/* #define USE_UTF8_HORIZONTAL_ELLIPSIS 1 */
+
+#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+/* the wide-char equivalent of strunc() */
+wchar_t *
+wstrunc(
+	const wchar_t *wmessage,
+	int len)
+{
+	wchar_t *wtmp;
+
+	/* make sure all characters are printable */
+	wtmp = my_wcsdup(wmessage);
+	wconvert_to_printable(wtmp);
+
+	if (wcswidth(wtmp, wcslen(wtmp)) > len) {
+		/* wtmp must be truncated */
+		wchar_t *wtmp2, *tail;
+
+#	ifdef USE_UTF8_HORIZONTAL_ELLIPSIS
+		if (IS_LOCAL_CHARSET("UTF-8")) {
+			/*
+			 * use U+2026 (HORIZONTAL ELLIPSIS) instead of "..."
+			 * we gain two additional screen positions
+			 */
+			tail = my_malloc(sizeof(wchar_t) * 2);
+			tail[0] = 8230; /* U+2026 */
+			tail[1] = 0;	/* \0 */
+		} else
+#	endif /* USE_UTF8_HORIZONTAL_ELLIPSIS */
+			tail = char2wchar_t(TRUNC_TAIL);
+
+		wtmp2 = wcspart(wtmp, len - wcslen(tail), FALSE);
+		free(wtmp);
+		wtmp = my_realloc(wtmp2, sizeof(wchar_t) * (wcslen(wtmp2) + wcslen(tail) + 1));	/* wtmp2 isn't valid snymore and doesn't have to be free()ed */
+		wcscat(wtmp, tail);
+		free(tail);
+	}
+
+	return wtmp;
+}
+
+
+/*
+ * duplicates a wide-char string
+ */
+wchar_t *
+my_wcsdup(
+	const wchar_t *wstr)
+{
+	size_t len = wcslen(wstr) + 1;
+	void *ptr = my_malloc(sizeof(wchar_t) * len);
+
+	memcpy(ptr, wstr, sizeof(wchar_t) * len);
+	return (wchar_t *) ptr;
+}
+#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+
+
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+/*
+ * convert from char* (UTF-8) to UChar* (UTF-16)
+ * ICU expects strings as UChar*
+ */
+static UChar *
+char2UChar(
+	const char *str)
+{
+	int32_t needed;
+	UChar *ustr;
+	UErrorCode status = U_ZERO_ERROR;
+
+	u_strFromUTF8(NULL, 0, &needed, str, -1, &status);
+	status = U_ZERO_ERROR;		/* reset status */
+	ustr = my_malloc(sizeof(UChar) * (needed + 1));
+	u_strFromUTF8(ustr, needed + 1, NULL, str, -1, &status);
+
+	if (U_FAILURE(status)) {
+		/* clean up and return NULL */
+		free(ustr);
+		return NULL;
+	}
+	return ustr;
+}
+
+
+/*
+ * convert from UChar* (UTF-16) to char* (UTF-8)
+ */
+static char *
+UChar2char(
+	const UChar *ustr)
+{
+	char *str;
+	int32_t needed;
+	UErrorCode status = U_ZERO_ERROR;
+
+	u_strToUTF8(NULL, 0, &needed, ustr, -1, &status);
+	status = U_ZERO_ERROR;		/* reset status */
+	str = my_malloc(needed + 1);
+	u_strToUTF8(str, needed + 1, NULL, ustr, -1, &status);
+
+	if (U_FAILURE(status)) {
+		/* clean up and return NULL */
+		free(str);
+		return NULL;
+	}
+	return str;
+}
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && !NO_LOCALE */
+
+
+#ifdef HAVE_UNICODE_NORMALIZATION
+/*
+ * unicode normalization
+ *
+ * str: the string to normalize (must be UTF-8)
+ * returns the normalized string
+ * if the normalization failed a copy of the original string will be returned
+ *
+ * don't forget to free() the allocated memory if not needed anymore
+ */
+char *
+normalize(
+	const char *str)
+{
+	char *buf, *tmp;
+
+	/* make sure str is valid UTF-8 */
+	tmp = my_strdup(str);
+	utf8_valid(tmp);
+
+	if (tinrc.normalization_form == NORMALIZE_NONE) /* normalization is disabled */
+		return tmp;
+
+#	ifdef HAVE_LIBICUUC
+	{ /* ICU */
+		int32_t needed, norm_len;
+		UChar *ustr, *norm;
+		UErrorCode status = U_ZERO_ERROR;
+		UNormalizationMode mode;
+
+		switch (tinrc.normalization_form) {
+			case NORMALIZE_NFD:
+				mode = UNORM_NFD;
+				break;
+
+			case NORMALIZE_NFC:
+				mode = UNORM_NFC;
+				break;
+
+			case NORMALIZE_NFKD:
+				mode = UNORM_NFKD;
+				break;
+
+			case NORMALIZE_NFKC:
+			default:
+				mode = UNORM_NFKC;
+		}
+
+		/* convert to UTF-16 which is used internally by ICU */
+		if ((ustr = char2UChar(tmp)) == NULL) /* something went wrong, return the original string (as valid UTF8) */
+			return tmp;
+
+		needed = unorm_normalize(ustr, -1, mode, 0 , NULL, 0, &status);
+		status = U_ZERO_ERROR;		/* reset status */
+		norm_len = needed + 1;
+		norm = my_malloc(sizeof(UChar) * norm_len);
+		needed = unorm_normalize(ustr, -1, mode, 0 , norm, norm_len, &status);
+		if (U_FAILURE(status)) {
+			/* something went wrong, return the original string (as valid UTF8) */
+			free(ustr);
+			free(norm);
+			return tmp;
+		}
+
+		/* convert back to UTF-8 */
+		if ((buf = UChar2char(norm)) == NULL) /* something went wrong, return the original string (as valid UTF8) */
+			buf = tmp;
+
+		free(ustr);
+		free(norm);
+		return buf;
+	}
+#	else
+#		ifdef HAVE_LIBIDN
+	/* libidn */
+
+	buf = stringprep_utf8_nfkc_normalize(tmp, -1);
+	if (buf == NULL) /* normalization failed, return the original string (as valid UTF8) */
+		buf = tmp;
+
+	return buf;
+#		endif /* HAVE_LIBIDN */
+#	endif /* HAVE_LIBICUUC */
+}
+#endif /* HAVE_UNICODE_NORMALIZATION */
+
+
+/*
+ * returns a pointer to allocated buffer containing the formated string
+ * must be freed if not needed anymore
+ */
+char *
+fmt_string(
+	const char *fmt,
+	...) {
+	char *str;
+	va_list ap;
+
+	va_start(ap, fmt);
+#ifdef HAVE_VASPRINTF
+	if (vasprintf(&str, fmt, ap) == -1)	/* something went wrong */
+#endif /* HAVE_VASPRINTF */
+	{
+		size_t size = LEN;
+
+		str = my_malloc(size);
+		/* TODO: realloc str if necessary */
+		vsnprintf(str, size, fmt, ap);
+	}
+	va_end(ap);
+
+	return str;
+}
+
+
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && defined(HAVE_UNICODE_UBIDI_H) && !defined(NO_LOCALE)
+/*
+ * prepare a string with bi-directional text for display
+ * (converts from logical order to visual order)
+ *
+ * str: original string (in UTF-8)
+ * is_rtl: pointer to a t_bool where the direction of the resulting string
+ * will be stored (left-to-right = FALSE, right-to-left = TRUE)
+ * returns a pointer to the reordered string.
+ * In case of error NULL is returned and the value of is_rtl indefinite
+ */
+char *
+render_bidi(
+	const char *str,
+	t_bool *is_rtl)
+{
+	char *tmp;
+	int32_t ustr_len;
+	UBiDi *bidi_data;
+	UChar *ustr, *ustr_reordered;
+	UErrorCode status = U_ZERO_ERROR;
+
+	*is_rtl = FALSE;
+
+	/* make sure str is valid UTF-8 */
+	tmp = my_strdup(str);
+	utf8_valid(tmp);
+
+	if ((ustr = char2UChar(tmp)) == NULL) {
+		free(tmp);
+		return NULL;
+	}
+	free(tmp);	/* tmp is not needed anymore */
+
+	bidi_data = ubidi_open();
+	ubidi_setPara(bidi_data, ustr, -1, UBIDI_DEFAULT_LTR, NULL, &status);
+	if (U_FAILURE(status)) {
+		ubidi_close(bidi_data);
+		free(ustr);
+		return NULL;
+	}
+
+	ustr_len = u_strlen(ustr) + 1;
+	ustr_reordered = my_malloc(sizeof(UChar) * ustr_len);
+	ubidi_writeReordered(bidi_data, ustr_reordered, ustr_len, UBIDI_REMOVE_BIDI_CONTROLS|UBIDI_DO_MIRRORING, &status);
+	if (U_FAILURE(status)) {
+		ubidi_close(bidi_data);
+		free(ustr);
+		free(ustr_reordered);
+		return NULL;
+	}
+
+	/*
+	 * determine the direction of the text
+	 * is the bidi level even => left-to-right
+	 * is the bidi level odd  => right-to-left
+	 */
+	*is_rtl = (t_bool) (ubidi_getParaLevel(bidi_data) & 1);
+	ubidi_close(bidi_data);
+
+	/*
+	 * No need to check the return value. In both cases we must clean up
+	 * and return the returned value, will it be a pointer to the
+	 * resulting string or NULL in case of failure.
+	 */
+	tmp = UChar2char(ustr_reordered);
+	free(ustr);
+	free(ustr_reordered);
+
+	return tmp;
+}
+#endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && HAVE_UNICODE_UBIDI_H && !NO_LOCALE */
diff -Nurp tin-1.6.2/src/tags.c tin-1.8.0/src/tags.c
--- tin-1.6.2/src/tags.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/tags.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : tags.c
  *  Author    : Jason Faultless <jason@altarstone.com>
  *  Created   : 1999-12-06
- *  Updated   : 2003-07-19
+ *  Updated   : 2005-05-10
  *  Notes     : Split out from other modules
  *
- * Copyright (c) 1999-2003 Jason Faultless <jason@altarstone.com>
+ * Copyright (c) 1999-2006 Jason Faultless <jason@altarstone.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -85,8 +85,8 @@ look_for_multipart_info(
 	int *offset)
 {
 	MultiPartInfo tmp;
-	char *subj = (char *) 0;
-	char *pch = (char *) 0;
+	char *subj;
+	char *pch;
 
 	*offset = 0;
 
@@ -137,7 +137,7 @@ get_multiparts(
 {
 	MultiPartInfo tmp, tmp2;
 	MultiPartInfo *info = 0;
-	int i = 0;
+	int i;
 	int part_index;
 
 	/* entry assertions */
@@ -208,7 +208,7 @@ tag_multipart(
 	int base_index)
 {
 	MultiPartInfo *info = 0;
-	int i = 0;
+	int i;
 	const int qty = get_multiparts(base_index, &info);
 
 	/* check for failure... */
@@ -253,7 +253,7 @@ line_is_tagged(
 {
 	int code = 0;
 
-	if (CURR_GROUP.attribute->thread_arts) {
+	if (curr_group->attribute->thread_arts) {
 		int i;
 		for (i = n; i >= 0; i = arts[i].thread) {
 			if (arts[i].tagged > code)
@@ -354,6 +354,7 @@ set_range(
 	int curr)
 {
 	char *range;
+	char *prompt;
 	int artnum;
 	int i;
 	int depth;
@@ -380,10 +381,13 @@ set_range(
 #if 0
 	error_message("Min=[%d] Max=[%d] Cur=[%d] DefRng=[%s]", min, max, curr, range);
 #endif /* 0 */
-	sprintf(mesg, _(txt_enter_range), range);
+	prompt = fmt_string(_(txt_enter_range), range);
 
-	if (!(prompt_string_default(mesg, range, _(txt_range_invalid), HIST_OTHER)))
+	if (!(prompt_string_default(prompt, range, _(txt_range_invalid), HIST_OTHER))) {
+		free(prompt);
 		return FALSE;
+	}
+	free(prompt);
 
 	/*
 	 * Parse range string
@@ -465,19 +469,20 @@ parse_range(
 	*range_end = -1;
 
 	while (*ptr && state != DONE) {
-		if (isdigit(*ptr)) {
+		if (isdigit((int) *ptr)) {
 			if (state == FINDMAX) {
 				*range_end = atoi(ptr);
 				state = DONE;
 			} else
 				*range_start = atoi(ptr);
-			while (isdigit(*ptr))
+			while (isdigit((int) *ptr))
 				ptr++;
 		} else {
 			switch (*ptr) {
 				case '-':
 					state = FINDMAX;
 					break;
+
 				case '.':
 					if (state == FINDMAX) {
 						*range_end = curr;
@@ -485,12 +490,14 @@ parse_range(
 					} else
 						*range_start = curr;
 					break;
+
 				case '$':
 					if (state == FINDMAX) {
 						*range_end = max;
 						state = DONE;
 					}
 					break;
+
 				default:
 					break;
 			}
@@ -519,12 +526,12 @@ do_auto_select_arts(
 #	ifdef DEBUG_NEWSRC
 			debug_print_comment("group.c: X command");
 #	endif /* DEBUG_NEWSRC */
-			art_mark(&CURR_GROUP, &arts[i], ART_READ);
+			art_mark(curr_group, &arts[i], ART_READ);
 			arts[i].zombie = TRUE;
 		}
 	}
-	if (CURR_GROUP.attribute->show_only_unread)
-		find_base(&CURR_GROUP);
+	if (curr_group->attribute->show_only_unread)
+		find_base(curr_group);
 
 	grpmenu.curr = 0;
 	show_group_page();
@@ -543,12 +550,12 @@ undo_auto_select_arts(
 #	ifdef DEBUG_NEWSRC
 			debug_print_comment("group.c: + command");
 #	endif /* DEBUG_NEWSRC */
-			art_mark(&CURR_GROUP, &arts[i], ART_UNREAD);
+			art_mark(curr_group, &arts[i], ART_UNREAD);
 			arts[i].zombie = FALSE;
 		}
 	}
-	if (CURR_GROUP.attribute->show_only_unread)
-		find_base(&CURR_GROUP);
+	if (curr_group->attribute->show_only_unread)
+		find_base(curr_group);
 
 	grpmenu.curr = 0;	/* do we want this? */
 	show_group_page();
@@ -578,7 +585,7 @@ arts_selected(
 	int i;
 
 	for_each_art(i) {
-		 if (arts[i].selected)
+		if (arts[i].selected)
 			return TRUE;
 	}
 
diff -Nurp tin-1.6.2/src/tcurses.c tin-1.8.0/src/tcurses.c
--- tin-1.6.2/src/tcurses.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/tcurses.c	2005-12-02 12:07:37.000000000 +0100
@@ -1,13 +1,13 @@
 /*
  *  Project   : tin - a Usenet reader
  *  Module    : tcurses.c
- *  Author    : Thomas Dickey <dickey@herndon4.his.com>
+ *  Author    : Thomas Dickey <dickey@invisible-island.net>
  *  Created   : 1997-03-02
- *  Updated   : 2003-08-03
+ *  Updated   : 2004-06-07
  *  Notes     : This is a set of wrapper functions adapting the termcap
  *	             interface of tin to use SVr4 curses (e.g., ncurses).
  *
- * Copyright (c) 1997-2003 Thomas Dickey <dickey@herndon4.his.com>
+ * Copyright (c) 1997-2006 Thomas Dickey <dickey@invisible-island.net>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -49,6 +49,10 @@
 #		define KEY_MIN KEY_BREAK	/* SVr3 curses */
 #	endif /* !KEY_MIN */
 
+#	ifndef KEY_CODE_YES
+#		define KEY_CODE_YES (KEY_MIN - 1)	/* PDCurses */
+#	endif /* !KEY_CODE_YES */
+
 #	include "trace.h"
 
 int cLINES;
@@ -375,14 +379,14 @@ highlight_string(
 	 * offsets calculate now the correct starting column
 	 */
 	if (col > 0) {
-		wchar_t wtmp[LEN];
+		wchar_t *wtmp;
 
 		MoveCursor(row, 0);
 		my_innstr(tmp, cCOLS);
 		tmp[col] = '\0';
-		if (mbstowcs(wtmp, tmp, ARRAY_SIZE(wtmp) - 1) != (size_t) -1) {
-			wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-			col = wcswidth(wtmp, ARRAY_SIZE(wtmp));
+		if ((wtmp = char2wchar_t(tmp)) != NULL) {
+			col = wcswidth(wtmp, wcslen(wtmp) + 1);
+			free(wtmp);
 		}
 	}
 #	endif /* MULTIBYTE_ABLE && !NO_LOCALE */
@@ -423,7 +427,7 @@ word_highlight_string(
 	char tmp[LEN];
 	int wsize = size;
 #		if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	wchar_t wtmp[LEN];
+	wchar_t *wtmp;
 
 	/*
 	 * In a multibyte locale we get byte offsets instead of character offsets
@@ -433,9 +437,9 @@ word_highlight_string(
 		MoveCursor(row, 0);
 		my_innstr(tmp, cCOLS);
 		tmp[col] = '\0';
-		if (mbstowcs(wtmp, tmp, ARRAY_SIZE(wtmp) - 1) != (size_t) -1) {
-			wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-			col = wcswidth(wtmp, ARRAY_SIZE(wtmp));
+		if ((wtmp = char2wchar_t(tmp)) != NULL) {
+			col = wcswidth(wtmp, wcslen(wtmp) + 1);
+			free(wtmp);
 		}
 	}
 #		endif /* MULTIBYTE_ABLE && !NO_LOCALE */
@@ -445,9 +449,9 @@ word_highlight_string(
 
 #		if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 	tmp[size] = '\0';
-	if (mbstowcs(wtmp, tmp, ARRAY_SIZE(wtmp) - 1) != (size_t) -1) {
-		wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-		wsize = wcswidth(wtmp, ARRAY_SIZE(wtmp));
+	if ((wtmp = char2wchar_t(tmp)) != NULL) {
+		wsize = wcswidth(wtmp, wcslen(wtmp) + 1);
+		free(wtmp);
 	}
 #		endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
@@ -508,21 +512,31 @@ ReadCh(
 	if (cmd_line)
 		ch = cmdReadCh();
 	else {
-#	if 0
 again:
-#	endif /* 0 */
 		allow_resize(TRUE);
+#	if defined(KEY_RESIZE) && defined(USE_CURSES)
+		if ((ch = getch()) == KEY_RESIZE)
+			need_resize = cYes;
+#		if 0
+		/*
+		 * disable checking for ERR until all callers of ReadCh() doesn't
+		 * depend on ERR for redrawing
+		 */
+		if (ch == ERR)
+			goto again;
+#		endif /* 0 */
+#	else
 		ch = getch();
+#	endif /* KEY_RESIZE && USE_CURSES */
 		allow_resize(FALSE);
 		if (need_resize) {
 			handle_resize((need_resize == cRedraw) ? TRUE : FALSE);
-#	if 0
-			if (need_resize == cRedraw) {
-				need_resize = cNo;
-				goto again;				/* Shouldn't fall through if doing resize */
-			}
-#	endif /* 0 */
 			need_resize = cNo;
+#	if defined(KEY_RESIZE) && defined(USE_CURSES)
+			if (ch == KEY_RESIZE)
+				goto again;
+#	endif /* KEY_RESIZE && USE_CURSES */
+
 		}
 		if (ch == KEY_BACKSPACE)
 			ch = '\010';	/* fix for Ctrl-H - show headers */
@@ -547,12 +561,23 @@ ReadWch(
 	if (cmd_line)
 		wch = cmdReadWch();
 	else {
+again:
 		allow_resize(TRUE);
 #		ifdef HAVE_NCURSESW
+#			if defined(KEY_RESIZE) && defined(USE_CURSES)
+		if ((res = get_wch(&wch)) == KEY_CODE_YES && wch == KEY_RESIZE)
+			need_resize = cYes;
+		if (res == ERR)
+			goto again;
+#			else
 		res = get_wch(&wch);
+#			endif /* KEY_RESIZE && USE_CURSES */
 #		else
 		wch = (wint_t) getch();
 
+		if (wch == (wint_t) ERR)
+			goto again;
+
 		if (wch < KEY_MIN) {
 			/* read in the multibyte sequence */
 			char *mbs = my_malloc(MB_CUR_MAX + 1);
@@ -575,13 +600,22 @@ ReadWch(
 				return WEOF; /* error */
 			else
 				res = OK;
-		} else
+		} else {
 			res = KEY_CODE_YES;
+#			if defined(KEY_RESIZE) && defined(USE_CURSES)
+			if (wch == KEY_RESIZE)
+				need_resize = cYes;
+#			endif /* KEY_RESIZE && USE_CURSES */
+		}
 #		endif /* HAVE_NCURSESW */
 		allow_resize(FALSE);
 		if (need_resize) {
 			handle_resize((need_resize == cRedraw) ? TRUE : FALSE);
 			need_resize = cNo;
+#		if defined(KEY_RESIZE) && defined(USE_CURSES)
+			if (wch == KEY_RESIZE)
+				goto again;
+#		endif /* KEY_RESIZE && USE_CURSES */
 		}
 		if (wch == KEY_BACKSPACE)
 			wch = (wint_t) '\010';	/* fix for Ctrl-H - show headers */
@@ -615,9 +649,9 @@ my_printf(
 		vprintf(fmt, ap);
 		if (flag)
 			Raw(TRUE);
-	} else {
-		vwprintw(stdscr, (char *) fmt, ap);
-	}
+	} else
+		vwprintw(stdscr, fmt, ap);
+
 	va_end(ap);
 }
 
@@ -639,9 +673,9 @@ my_fprintf(
 		vfprintf(stream, fmt, ap);
 		if (flag)
 			Raw(TRUE);
-	} else {
-		vwprintw(stdscr, (char *) fmt, ap);
-	}
+	} else
+		vwprintw(stdscr, fmt, ap);
+
 	va_end(ap);
 }
 
@@ -656,9 +690,8 @@ my_fputc(
 		if (_inraw && ch == '\n')
 			fputc('\r', fp);
 		fputc(ch, fp);
-	} else {
+	} else
 		addch((unsigned char) ch);
-	}
 }
 
 
@@ -675,7 +708,7 @@ my_fputs(
 		} else
 			fputs(str, fp);
 	} else {
-		addstr((char *) str);
+		addstr(str);
 	}
 }
 
@@ -715,6 +748,32 @@ my_fputwc(
 #		endif /* HAVE_NCURSESW */
 	}
 }
+
+
+void
+my_fputws(
+	const wchar_t *wstr,
+	FILE *fp)
+{
+	if (cmd_line) {
+		if (_inraw) {
+			while (*wstr)
+				my_fputwc(*wstr++, fp);
+		} else
+			fputws(wstr, fp);
+	} else {
+#		ifdef HAVE_NCURSESW
+		addwstr(wstr);
+#		else
+		char *mbs;
+
+		if ((mbs = wchar_t2char(wstr)) != NULL) {
+			addstr(mbs);
+			free(mbs);
+		}
+#		endif /* HAVE_NCURSESW */
+	}
+}
 #	endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
 
diff -Nurp tin-1.6.2/src/thread.c tin-1.8.0/src/thread.c
--- tin-1.6.2/src/thread.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/thread.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : thread.c
  *  Author    : I. Lea
  *  Created   : 1991-04-01
- *  Updated   : 2003-08-10
+ *  Updated   : 2005-07-27
  *  Notes     :
  *
- * Copyright (c) 1991-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1991-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,17 +41,9 @@
 #ifndef TCURSES_H
 #	include "tcurses.h"
 #endif /* !TCURSES_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
 
-#define INDEX2TNUM(i)	((i) % NOTESLINES)
-#define INDEX2LNUM(i)	(INDEX_TOP + INDEX2TNUM(i))
 
-#define EXPIRED(a) ((a)->article == ART_UNAVAILABLE || arts[(a)->article].thread == ART_EXPIRED)
-
-/* sizeof the tagged/art mark area */
-#define MAGIC		3
+#define IS_EXPIRED(a) ((a)->article == ART_UNAVAILABLE || arts[(a)->article].thread == ART_EXPIRED)
 
 int thread_basenote = 0;				/* Index in base[] of basenote */
 static int thread_respnum = 0;			/* Index in arts[] of basenote ie base[thread_basenote] */
@@ -60,32 +52,66 @@ t_bool show_subject;
 /*
  * Local prototypes
  */
+static char get_art_mark(struct t_article *art);
 static int enter_pager(int art, t_bool ignore_unavail, int level);
-static int thread_catchup(int ch);
-static int thread_left(void);
-static int thread_right(void);
+static int mark_art_read(struct t_group *group);
+static int thread_catchup(t_function func);
 static int thread_tab_pressed(void);
 static t_bool find_unexpired(struct t_msgid *ptr);
 static t_bool has_sibling(struct t_msgid *ptr);
+static t_function thread_left(void);
+static t_function thread_right(void);
 static void build_tline(int l, struct t_article *art);
 static void draw_thread_arrow(void);
+static void draw_thread_item(int item);
 static void make_prefix(struct t_msgid *art, char *prefix, int maxlen);
 static void show_thread_page(void);
 static void update_thread_page(void);
-static int mark_art_read(struct t_group *group);
 
 
 /*
  * thdmenu.curr		Current screen cursor position in thread
  * thdmenu.max		Essentially = # threaded arts in current thread
  * thdmenu.first	Response # at top of screen
- * thdmenu.last		Response # at end of screen
  */
-static t_menu thdmenu = {0, 0, 0, 0, show_thread_page, draw_thread_arrow };
+static t_menu thdmenu = {0, 0, 0, show_thread_page, draw_thread_arrow, draw_thread_item };
+
+/* TODO: find a better solution */
+static int ret_code = 0;		/* Set to < 0 when it is time to leave this menu */
+
+/*
+ * returns the mark which should be used for this article
+ */
+static char
+get_art_mark(
+	struct t_article *art)
+{
+	if (art->inrange) {
+		return tinrc.art_marked_inrange;
+	} else if (art->status == ART_UNREAD) {
+		return (art->selected ? tinrc.art_marked_selected : (tinrc.recent_time && ((time((time_t) 0) - art->date) < (tinrc.recent_time * DAY))) ? tinrc.art_marked_recent : tinrc.art_marked_unread);
+	} else if (art->status == ART_WILL_RETURN) {
+		return tinrc.art_marked_return;
+	} else if (art->killed && tinrc.kill_level != KILL_NOTHREAD) {
+		return tinrc.art_marked_killed;
+	} else {
+		if (/* tinrc.kill_level != KILL_UNREAD && */ art->score >= tinrc.score_select)
+			return tinrc.art_marked_read_selected; /* read hot chil^H^H^H^H article */
+		else
+			return tinrc.art_marked_read;
+	}
+}
+
 
 /*
  * Build one line of the thread page display. Looks long winded, but
  * there are a lot of variables in the format for the output
+ *
+ * WARNING: some other code expects to find the article mark (ART_MARK_READ,
+ * ART_MARK_SELECTED, etc) at MARK_OFFSET from beginning of the line.
+ * So, if you change the format used in this routine, be sure to check that
+ * the value of MARK_OFFSET (tin.h) is still correct.
+ * Yes, this is somewhat kludgy.
  */
 static void
 build_tline(
@@ -97,76 +123,79 @@ build_tline(
 	int rest_of_line = cCOLS;
 	int len_from, len_subj;
 	struct t_msgid *ptr;
-#ifdef USE_CURSES
-	char buff[BUFSIZ];
-#else
-	char *buff = screen[INDEX2TNUM(l)].col;
-#endif /* USE_CURSES */
+	char *buffer;
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-	wchar_t wtmp[BUFSIZ], wtmp2[BUFSIZ];
+	wchar_t *wtmp, *wtmp2;
 	char tmp[BUFSIZ];
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 
+#ifdef USE_CURSES
+	/*
+	 * Allocate line buffer
+	 * make it the same size like in !USE_CURSES case to simplify some code
+	 */
+#	if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
+		buffer = my_malloc(cCOLS * MB_CUR_MAX + 2);
+#	else
+		buffer = my_malloc(cCOLS + 2);
+#	endif /* MULTIBYTE_ABLE && !NO_LOCALE */
+#else
+	buffer = screen[INDEX2SNUM(l)].col;
+#endif /* USE_CURSES */
+
 	/*
 	 * Start with 2 spaces for ->
 	 * then index number of the message and whitespace (2+4+1 chars)
 	 */
-	sprintf(buff, "  %s ", tin_ltoa(l + 1, 4));
+#if 0 /* usefull? see also group.c:build_sline() */
+	if (!tinrc.draw_arrow)
+		sprintf(buffer, "%s ", tin_ltoa(l + 1, 6));
+	else
+#endif /* 0 */
+	sprintf(buffer, "  %s ", tin_ltoa(l + 1, 4));
 	rest_of_line -= 7;
 
 	/*
 	 * Add the article flags, tag number, or whatever (3 chars)
 	 */
 	rest_of_line -= 3;
-	if (art->tagged)
-		strcat(buff, tin_ltoa(art->tagged, 3));
-	else {
-		strcat(buff, "   ");
-		if (art->inrange) {
-			mark = tinrc.art_marked_inrange;
-		} else if (art->status == ART_UNREAD) {
-			mark = (art->selected ? tinrc.art_marked_selected : (tinrc.recent_time && ((time((time_t) 0) - art->date) < (tinrc.recent_time * DAY))) ? tinrc.art_marked_recent : tinrc.art_marked_unread);
-		} else if (art->status == ART_WILL_RETURN) {
-			mark = tinrc.art_marked_return;
-		} else if (art->killed && tinrc.kill_level != KILL_NOTHREAD) {
-			mark = tinrc.art_marked_killed;
-		} else {
-			if (/* tinrc.kill_level != KILL_UNREAD && */ art->score >= tinrc.score_select)
-				mark = tinrc.art_marked_read_selected; /* read hot chil^H^H^H^H article */
-			else
-				mark = tinrc.art_marked_read;
-		}
-		buff[MARK_OFFSET] = mark;			/* insert mark */
+	if (art->tagged) {
+		strcat(buffer, tin_ltoa(art->tagged, 3));
+		mark = '\0';
+	} else {
+		strcat(buffer, "   ");
+		mark = get_art_mark(art);
+		buffer[MARK_OFFSET] = mark;			/* insert mark */
 	}
 
-	strcat(buff, "  ");					/* 2 more spaces */
+	strcat(buffer, "  ");					/* 2 more spaces */
 	rest_of_line -= 2;
 
 	/*
 	 * Add the number of lines and/or the score if enabled
 	 * (inside "[,]", 1+4[+1+6]+1+2 chars total)
 	 */
-	if (tinrc.show_info != SHOW_INFO_NOTHING) { /* add [ */
-		strcat(buff, "[");
+	if (curr_group->attribute->show_info != SHOW_INFO_NOTHING) { /* add [ */
+		strcat(buffer, "[");
 		rest_of_line--;
 	}
 
-	if (tinrc.show_info == SHOW_INFO_LINES || tinrc.show_info == SHOW_INFO_BOTH) { /* add lines */
-		strcat(buff, ((art->line_count != -1) ? tin_ltoa(art->line_count, 4): "   ?"));
+	if (curr_group->attribute->show_info == SHOW_INFO_LINES || curr_group->attribute->show_info == SHOW_INFO_BOTH) { /* add lines */
+		strcat(buffer, ((art->line_count != -1) ? tin_ltoa(art->line_count, 4): "   ?"));
 		rest_of_line -= 4;
 	}
 
-	if (tinrc.show_info == SHOW_INFO_SCORE || tinrc.show_info == SHOW_INFO_BOTH) {
+	if (curr_group->attribute->show_info == SHOW_INFO_SCORE || curr_group->attribute->show_info == SHOW_INFO_BOTH) {
 		if (tinrc.show_info == SHOW_INFO_BOTH) { /* insert a separator if show lines and score */
-			strcat(buff, ",");
+			strcat(buffer, ",");
 			rest_of_line--;
 		}
-		strcat(buff, tin_ltoa(art->score, 6));
+		strcat(buffer, tin_ltoa(art->score, 6));
 		rest_of_line -= 6;
 	}
 
-	if (tinrc.show_info != SHOW_INFO_NOTHING) { /* add closing ] and two spaces */
-		strcat(buff, "]  ");
+	if (curr_group->attribute->show_info != SHOW_INFO_NOTHING) { /* add closing ] and two spaces */
+		strcat(buffer, "]  ");
 		rest_of_line -= 3;
 	}
 
@@ -178,12 +207,12 @@ build_tline(
 	 * Add the subject and author information if required
 	 */
 	if (show_subject) {
-		if (CURR_GROUP.attribute->show_author == SHOW_FROM_NONE)
+		if (curr_group->attribute->show_author == SHOW_FROM_NONE)
 				len_from = 0;
 		else {
 			len_from = rest_of_line;
 
-			if (CURR_GROUP.attribute->show_author == SHOW_FROM_BOTH)
+			if (curr_group->attribute->show_author == SHOW_FROM_BOTH)
 				len_from /= 2; /* if SHOW_FROM_BOTH use 50% for author info */
 			else
 				len_from /= 3; /* otherwise use 33% for author info */
@@ -199,12 +228,12 @@ build_tline(
 		 * Insert tree-structure strings "`->", "+->", ...
 		 */
 
-		make_prefix(art->refptr, buff + strlen(buff), len_subj);
+		make_prefix(art->refptr, buffer + strlen(buffer), len_subj);
 
 		/*
 		 * Copy in the subject up to where the author (if any) starts
 		 */
-		gap = cCOLS - strlen(buff) - len_from; /* gap = gap (no. of chars) between tree and author/border of window */
+		gap = cCOLS - strlen(buffer) - len_from; /* gap = gap (no. of chars) between tree and author/border of window */
 
 		if (len_from)	/* Leave gap before author */
 			gap -= 2;
@@ -214,26 +243,25 @@ build_tline(
 		 * Hide subject if same as parent's.
 		 */
 		if (gap > 0) {
-			size_t len = strlen(buff);
-			for (ptr = art->refptr->parent; ptr && EXPIRED(ptr); ptr = ptr->parent)
+			size_t len = strlen(buffer);
+
+			for (ptr = art->refptr->parent; ptr && IS_EXPIRED(ptr); ptr = ptr->parent)
 				;
 			if (!(ptr && arts[ptr->article].subject == art->subject)) {
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-				if (mbstowcs(wtmp2, art->subject, ARRAY_SIZE(wtmp2) - 1) != (size_t) -1) {
-					wtmp2[ARRAY_SIZE(wtmp2) - 1] = (wchar_t) '\0';
-					wcspart(wtmp, wtmp2, gap, ARRAY_SIZE(wtmp), TRUE);
-					if (wcstombs(tmp, wtmp, sizeof(tmp) - 1) != (size_t) -1)
-#	ifdef USE_CURSES
-						strncat(buff, tmp, sizeof(buff) - len - 1);
-#	else
-						strncat(buff, tmp, cCOLS * MB_CUR_MAX - len - 1);
-#	endif /* USE_CURSES */
+				if ((wtmp = char2wchar_t(art->subject)) != NULL) {
+					wtmp2 = wcspart(wtmp, gap, TRUE);
+					if (wcstombs(tmp, wtmp2, sizeof(tmp) - 1) != (size_t) -1)
+						strncat(buffer, tmp, cCOLS * MB_CUR_MAX - len - 1);
+
+					free(wtmp);
+					free(wtmp2);
 				}
 			}
 #else
-				strncat(buff, art->subject, gap);
+				strncat(buffer, art->subject, gap);
 			}
-			buff[len + gap] = '\0';	/* Just in case */
+			buffer[len + gap] = '\0';	/* Just in case */
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 		}
 
@@ -242,17 +270,17 @@ build_tline(
 		 */
 		if (len_from) {
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-			if (mbstowcs(wtmp, buff, ARRAY_SIZE(wtmp) - 1) != (size_t) -1) {
-				wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-				fill = cCOLS - len_from - wcswidth(wtmp, ARRAY_SIZE(wtmp) - 1);
+			if ((wtmp = char2wchar_t(buffer)) != NULL) {
+				fill = cCOLS - len_from - wcswidth(wtmp, wcslen(wtmp) + 1);
+				free(wtmp);
 			} else
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-				fill = cCOLS - len_from - strlen(buff);
+				fill = cCOLS - len_from - strlen(buffer);
 
-			gap = strlen(buff);
+			gap = strlen(buffer);
 			for (i = 0; i < fill; i++)
-				buff[gap + i] = ' ';
-			buff[gap + fill] = '\0';
+				buffer[gap + i] = ' ';
+			buffer[gap + fill] = '\0';
 
 			/*
 			 * Now add the author info at the end. This will be 0 terminated
@@ -260,18 +288,16 @@ build_tline(
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 			get_author(TRUE, art, tmp, sizeof(tmp) - 1);
 
-			if (mbstowcs(wtmp2, tmp, ARRAY_SIZE(wtmp2) - 1) != (size_t) -1) {
-				wtmp2[ARRAY_SIZE(wtmp2) - 1] = (wchar_t) '\0';
-				wcspart(wtmp, wtmp2, len_from, ARRAY_SIZE(wtmp), TRUE);
-				if (wcstombs(tmp, wtmp, sizeof(tmp) - 1) != (size_t) -1)
-#	ifdef USE_CURSES
-					strncat(buff, tmp, sizeof(buff) - strlen(buff) - 1);
-#	else
-					strncat(buff, tmp, cCOLS * MB_CUR_MAX - strlen(buff) - 1);
-#	endif /* USE_CURSES */
+			if ((wtmp = char2wchar_t(tmp)) != NULL) {
+				wtmp2 = wcspart(wtmp, len_from, TRUE);
+				if (wcstombs(tmp, wtmp2, sizeof(tmp) - 1) != (size_t) -1)
+					strncat(buffer, tmp, cCOLS * MB_CUR_MAX - strlen(buffer) - 1);
+
+				free(wtmp);
+				free(wtmp2);
 			}
 #else
-			get_author(TRUE, art, buff + strlen(buff), len_from);
+			get_author(TRUE, art, buffer + strlen(buffer), len_from);
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 		}
 
@@ -279,115 +305,77 @@ build_tline(
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
 		get_author(TRUE, art, tmp, sizeof(tmp) - 1);
 
-		if (mbstowcs(wtmp2, tmp, ARRAY_SIZE(wtmp2) - 1) != (size_t) -1) {
-			wtmp2[ARRAY_SIZE(wtmp2) - 1] = (wchar_t) '\0';
-			wcspart(wtmp, wtmp2, cCOLS - strlen(buff), ARRAY_SIZE(wtmp), TRUE);
-			if (wcstombs(tmp, wtmp, sizeof(tmp) - 1) != (size_t) -1)
-#	ifdef USE_CURSES
-				strncat(buff, tmp, sizeof(buff) - strlen(buff) - 1);
-#	else
-				strncat(buff, tmp, cCOLS * MB_CUR_MAX - strlen(buff) - 1);
-#	endif /* USE_CURSES */
+		if ((wtmp = char2wchar_t(tmp)) != NULL) {
+			wtmp2 = wcspart(wtmp, cCOLS - strlen(buffer), TRUE);
+			if (wcstombs(tmp, wtmp2, sizeof(tmp) - 1) != (size_t) -1)
+				strncat(buffer, tmp, cCOLS * MB_CUR_MAX - strlen(buffer) - 1);
+
+			free(wtmp);
+			free(wtmp2);
 		}
 #else
-		get_author(TRUE, art, buff + strlen(buff), cCOLS - strlen(buff));
+		get_author(TRUE, art, buffer + strlen(buffer), cCOLS - strlen(buffer));
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
 	}
 
 	/* protect display from non-displayable characters (e.g., form-feed) */
-	convert_to_printable(buff);
+	convert_to_printable(buffer);
 
 	if (!tinrc.strip_blanks) {
 		/*
 		 * Pad to end of line so that inverse bar looks 'good'
 		 */
 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
-		if (mbstowcs(wtmp, buff, ARRAY_SIZE(wtmp) - 1) != (size_t) -1) {
-			wtmp[ARRAY_SIZE(wtmp) - 1] = (wchar_t) '\0';
-			fill = cCOLS - wcswidth(wtmp, ARRAY_SIZE(wtmp) - 1);
+		if ((wtmp = char2wchar_t(buffer)) != NULL) {
+			fill = cCOLS - wcswidth(wtmp, wcslen(wtmp) + 1);
+			free(wtmp);
 		} else
 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
-			fill = cCOLS - strlen(buff);
+			fill = cCOLS - strlen(buffer);
 
-		gap = strlen(buff);
+		gap = strlen(buffer);
 		for (i = 0; i < fill; i++)
-			buff[gap + i] = ' ';
+			buffer[gap + i] = ' ';
 
-		buff[gap + fill] = '\0';
+		buffer[gap + fill] = '\0';
 	}
 
-	WriteLine(INDEX2LNUM(l), buff);
-}
-
+	WriteLine(INDEX2LNUM(l), buffer);
 
-/*
- * Update a line on the group or thread screen.
- * This only puts to the screen, the hard work is done by build_*line()
- * i is an index into base[]
- * If 'magic' is != 0 then only a partial redraw of width=magic is done.
- * This is intended to redraw the art_mark/tag/unread counts that change
- * more frequently than the rest of the line
- */
-void
-draw_line(
-	int i,
-	int magic)
-{
-	int startpos = (!magic) ? 0 : (MARK_OFFSET - 2);
-	int tlen;
 #ifdef USE_CURSES
-	char buffer[BUFSIZ];
-	char *s = screen_contents(INDEX2LNUM(i), startpos, buffer);
-#else
-	char *s = &(screen[INDEX2TNUM(i)].col[startpos]);
+	free(buffer);
 #endif /* USE_CURSES */
 
-	if (tinrc.strip_blanks)
-		 strip_line(s);
-	if (!magic) {
-		tlen = strlen(s);	/* note new line length */
-		CleartoEOLN();
-	} else
-		tlen = magic;
-
-	MoveCursor(INDEX2LNUM(i), startpos);
-	if (tlen)
-		my_printf("%.*s", tlen, s);
+	if (mark == tinrc.art_marked_selected)
+		draw_mark_selected(l);
+}
 
-	/*
-	 * It is somewhat less efficient to go back and redo the art mark
-	 * if selected, but it is more readable
-	 *
-	 * we don't highlight read_selected arts, as one might have set
-	 * art_mark_read_selected = art_mark_read...
-	 */
-	if (s[MARK_OFFSET-startpos] == tinrc.art_marked_selected) {
-		MoveCursor(INDEX2LNUM(i), MARK_OFFSET);
-		StartInverse();	/* ToggleInverse() doesn't work correct with ncurses4.x */
-		my_fputc(s[MARK_OFFSET-startpos], stdout);
-		EndInverse();		/* ToggleInverse() doesn't work correct with ncurses4.x */
-	}
-	MoveCursor(INDEX2LNUM(i) + 1, 0);
+
+static void
+draw_thread_item(
+	int item)
+{
+	build_tline(item, &arts[find_response(thread_basenote, item)]);
 	return;
 }
 
 
-static int
+static t_function
 thread_left(
 	void)
 {
 	if (tinrc.thread_catchup_on_exit)
-		return iKeyCatchupLeft;			/* ie, not via 'c' or 'C' */
+		return SPECIAL_CATCHUP_LEFT;			/* ie, not via 'c' or 'C' */
 	else
-		return iKeyQuit;
+		return GLOBAL_QUIT;
 }
 
 
-static int
+static t_function
 thread_right(
 	void)
 {
-	return iKeyThreadReadArt;
+	return THREAD_READ_ARTICLE;
 }
 
 
@@ -413,10 +401,10 @@ thread_page(
 	t_pagerinfo *page)			/* !NULL if we must go direct to the pager */
 {
 	char key[MAXKEYLEN];
-	int ret_code = 0;			/* Set to < 0 when it is time to leave this menu */
-	int ch = 0;
+	char mark[] = { '\0', '\0' };
 	int i, n;
-	t_bool repeat_search = FALSE;
+	t_bool repeat_search;
+	t_function func;
 
 	thread_respnum = respnum;		/* Bodge to make this variable global */
 
@@ -432,6 +420,8 @@ thread_page(
 	 * or an explicit thread_depth has been specified
 	 */
 	thdmenu.curr = thdmenu.max;
+	/* reset the first item on screen to 0 */
+	thdmenu.first = 0;
 
 	if (thread_depth)
 		thdmenu.curr = thread_depth;
@@ -466,42 +456,50 @@ thread_page(
 	/* Now we know where the cursor is, actually put something on the screen */
 	show_thread_page();
 
+	/* reset ret_code */
+	ret_code = 0;
 	while (ret_code >= 0) {
 		set_xclick_on();
-		if ((ch = handle_keypad(thread_left, thread_right, &menukeymap.thread_nav)) == iKeySearchRepeat) {
-			ch = i_key_search_last;
+		if ((func = handle_keypad(thread_left, thread_right, global_mouse_action, thread_keys)) == GLOBAL_SEARCH_REPEAT) {
+			func = last_search;
 			repeat_search = TRUE;
-		}
-		else
+		} else
 			repeat_search = FALSE;
 
-		switch (ch) {
-			case iKeyAbort:			/* Abort */
+		switch (func) {
+			case GLOBAL_ABORT:			/* Abort */
 				break;
 
-			case '1': case '2': case '3': case '4': case '5':
-			case '6': case '7': case '8': case '9':
+			case DIGIT_1:
+			case DIGIT_2:
+			case DIGIT_3:
+			case DIGIT_4:
+			case DIGIT_5:
+			case DIGIT_6:
+			case DIGIT_7:
+			case DIGIT_8:
+			case DIGIT_9:
 				if (thdmenu.max == 1)
 					info_message(_(txt_no_responses));
 				else
-					prompt_item_num(ch, _(txt_select_art));
+					prompt_item_num(func_to_key(func, thread_keys), _(txt_select_art));
 				break;
 
 #ifndef NO_SHELL_ESCAPE
-			case iKeyShellEscape:
+			case GLOBAL_SHELL_ESCAPE:
 				do_shell_escape();
 				break;
 #endif /* !NO_SHELL_ESCAPE */
 
-			case iKeyFirstPage:	/* show first page of articles */
+			case GLOBAL_FIRST_PAGE:		/* show first page of articles */
 				top_of_list();
 				break;
 
-			case iKeyLastPage:	/* show last page of articles */
+			case GLOBAL_LAST_PAGE:		/* show last page of articles */
 				end_of_list();
 				break;
 
-			case iKeyLastViewed:	/* show last viewed article */
+			case GLOBAL_LAST_VIEWED:	/* show last viewed article */
 				if (this_resp < 0 || (which_thread(this_resp) == -1)) {
 					info_message(_(txt_no_last_message));
 					break;
@@ -509,36 +507,46 @@ thread_page(
 				ret_code = enter_pager(this_resp, FALSE, THREAD_LEVEL);
 				break;
 
-			case iKeySetRange:	/* set range */
+			case GLOBAL_SET_RANGE:		/* set range */
 				if (set_range(THREAD_LEVEL, 1, thdmenu.max, thdmenu.curr + 1))
 					show_thread_page();
 				break;
 
-			case iKeyPipe:			/* pipe article to command */
+			case GLOBAL_PIPE:			/* pipe article(s) to command */
 				if (thread_basenote >= 0)
 					feed_articles(FEED_PIPE, THREAD_LEVEL, group, find_response(thread_basenote, thdmenu.curr));
 				break;
 
-			case iKeyThreadMail:	/* mail article to somebody */
+#ifndef DISABLE_PRINTING
+			case GLOBAL_PRINT:			/* print article(s) */
+				if (thread_basenote >= 0)
+					feed_articles(FEED_PRINT, THREAD_LEVEL, group, find_response(thread_basenote, thdmenu.curr));
+				break;
+#endif /* !DISABLE_PRINTING */
+
+			case THREAD_MAIL:	/* mail article(s) to somebody */
 				if (thread_basenote >= 0)
 					feed_articles(FEED_MAIL, THREAD_LEVEL, group, find_response(thread_basenote, thdmenu.curr));
 				break;
 
-			case iKeyThreadSave:	/* save articles with prompting */
+			case THREAD_SAVE:	/* save articles with prompting */
 				if (thread_basenote >= 0)
 					feed_articles(FEED_SAVE, THREAD_LEVEL, group, find_response(thread_basenote, thdmenu.curr));
 				break;
 
-			case iKeyThreadAutoSave:	/* Auto-save articles without prompting */
+			case THREAD_AUTOSAVE:	/* Auto-save articles without prompting */
 				if (thread_basenote >= 0)
 					feed_articles(FEED_AUTOSAVE, THREAD_LEVEL, group, (int) base[grpmenu.curr]);
 				break;
 
-#if 0 /* FIXME: crsr-position after kill */
-			case iKeyThreadAutoSel:
-			case iKeyThreadAutoKill:
+			case GLOBAL_MENU_FILTER_SELECT:
+			case GLOBAL_MENU_FILTER_KILL:
+				/*
+				 * FIXME: a filter which kills all remaining messages in a thread
+				 *        is 'troublesome'
+				 */
 				n = find_response(thread_basenote, thdmenu.curr);
-				filter_menu((ch == iKeyThreadAutoKill) ? FILTER_KILL : FILTER_SELECT, group, &arts[n]);
+				filter_menu(func, group, &arts[n]);
 				if (filter_articles(group)) {
 					make_threads(group, FALSE);
 					if ((n = next_unread(n)) == -1) {
@@ -549,68 +557,85 @@ thread_page(
 				}
 				show_thread_page();
 				break;
-#endif /* 0 */
 
-			case iKeyThreadReadArt:
-			case iKeyThreadReadArt2:	/* read current article within thread */
+			case GLOBAL_EDIT_FILTER:
+				if (!invoke_editor(filter_file, FILTER_FILE_OFFSET))
+					break;
+				unfilter_articles();
+				(void) read_filter_file(filter_file);
+				if (filter_articles(group)) {
+					make_threads(group, FALSE);
+					if ((n = next_unread(n)) == -1) {
+						ret_code = GRP_EXIT;
+						break;
+					}
+					fixup_thread(n, TRUE);
+				}
+				show_thread_page();
+				break;
+
+			case THREAD_READ_ARTICLE:	/* read current article within thread */
 				ret_code = enter_pager(find_response(thread_basenote, thdmenu.curr), FALSE, THREAD_LEVEL);
 				break;
 
-			case iKeyThreadReadNextArtOrThread:
+			case THREAD_READ_NEXT_ARTICLE_OR_THREAD:
 				ret_code = thread_tab_pressed();
 				break;
 
-			case iKeyPost:	/* post a basenote */
+			case GLOBAL_POST:		/* post a basenote */
 				if (post_article(group->name))
 					show_thread_page();
 				break;
 
-			case iKeyRedrawScr:		/* redraw screen */
+			case GLOBAL_REDRAW_SCREEN:	/* redraw screen */
 				my_retouch();
 				set_xclick_off();
 				show_thread_page();
 				break;
 
-			case iKeyDown:		/* line down */
-			case iKeyDown2:
+			case GLOBAL_LINE_DOWN:
 				move_down();
 				break;
 
-			case iKeyUp:
-			case iKeyUp2:		/* line up */
+			case GLOBAL_LINE_UP:
 				move_up();
 				break;
 
-			case iKeyPageUp:		/* page up */
-			case iKeyPageUp2:
-			case iKeyPageUp3:
+			case GLOBAL_PAGE_UP:
 				page_up();
 				break;
 
-			case iKeyPageDown:		/* page down */
-			case iKeyPageDown2:
-			case iKeyPageDown3:
+			case GLOBAL_PAGE_DOWN:
 				page_down();
 				break;
 
-			case iKeyCatchupLeft:				/* come here when exiting thread via <- */
-			case iKeyThreadCatchup:				/* catchup thread, move to next one */
-			case iKeyThreadCatchupNextUnread:	/* -> next with unread arts */
-				ret_code = thread_catchup(ch);
+			case GLOBAL_SCROLL_DOWN:
+				scroll_down();
 				break;
 
-			case iKeyThreadMarkArtRead: /* mark article as read */
+			case GLOBAL_SCROLL_UP:
+				scroll_up();
+				break;
+
+			case SPECIAL_CATCHUP_LEFT:				/* come here when exiting thread via <- */
+			case CATCHUP:				/* catchup thread, move to next one */
+			case CATCHUP_NEXT_UNREAD:	/* -> next with unread arts */
+				ret_code = thread_catchup(func);
+				break;
+
+			case THREAD_MARK_ARTICLE_READ: /* mark article as read */
 				ret_code = mark_art_read(group);
 				break;
 
-			case iKeyThreadToggleSubjDisplay:	/* toggle display of subject & subj/author */
+			case THREAD_TOGGLE_SUBJECT_DISPLAY:	/* toggle display of subject & subj/author */
 				if (show_subject) {
-					toggle_subject_from();
+					if (++curr_group->attribute->show_author > SHOW_FROM_BOTH)
+						curr_group->attribute->show_author = SHOW_FROM_NONE;
 					show_thread_page();
 				}
 				break;
 
-			case iKeyOptionMenu:
+			case GLOBAL_OPTION_MENU:
 				change_config_file(group);
 				n = find_response(thread_basenote, thdmenu.curr);
 				if (which_thread(n) == -1) /* We have lost the thread */
@@ -622,55 +647,44 @@ thread_page(
 				}
 				break;
 
-			case iKeyHelp:					/* help */
+			case GLOBAL_HELP:					/* help */
 				show_help_page(THREAD_LEVEL, _(txt_thread_com));
 				show_thread_page();
 				break;
 
-			/* TODO: assign a new key here */
-			case iKeyGroupKill:
-				n = find_response(thread_basenote, thdmenu.curr);
-				filter_menu(FILTER_KILL, group, &arts[n]);
-				show_thread_page();
-				break;
-
-			case iKeyLookupMessage:
+			case GLOBAL_LOOKUP_MESSAGEID:
 				if ((n = prompt_msgid()) != ART_UNAVAILABLE)
 					ret_code = enter_pager(n, FALSE, THREAD_LEVEL);
 				break;
 
-			case iKeySearchBody:			/* search article body */
+			case GLOBAL_SEARCH_BODY:			/* search article body */
 				if ((n = search_body(group, find_response(thread_basenote, thdmenu.curr), repeat_search)) != -1) {
 					fixup_thread(n, FALSE);
 					ret_code = enter_pager(n, FALSE, THREAD_LEVEL);
 				}
 				break;
 
-			case iKeySearchSubjF:			/* subject search */
-			case iKeySearchSubjB:
-				if ((n = search(SEARCH_SUBJ, find_response(thread_basenote, thdmenu.curr), (ch == iKeySearchSubjF), repeat_search)) != -1)
-					fixup_thread(n, TRUE);
-				break;
-
-			case iKeySearchAuthF:			/* author search */
-			case iKeySearchAuthB:
-				if ((n = search(SEARCH_AUTH, find_response(thread_basenote, thdmenu.curr), (ch == iKeySearchAuthF), repeat_search)) != -1)
+			case GLOBAL_SEARCH_AUTHOR_FORWARD:			/* author search */
+			case GLOBAL_SEARCH_AUTHOR_BACKWARD:
+			case GLOBAL_SEARCH_SUBJECT_FORWARD:			/* subject search */
+			case GLOBAL_SEARCH_SUBJECT_BACKWARD:
+				if ((n = search(func, find_response(thread_basenote, thdmenu.curr), repeat_search)) != -1)
 					fixup_thread(n, TRUE);
 				break;
 
-			case iKeyToggleHelpDisplay:		/* toggle mini help menu */
+			case GLOBAL_TOGGLE_HELP_DISPLAY:		/* toggle mini help menu */
 				toggle_mini_help(THREAD_LEVEL);
 				show_thread_page();
 				break;
 
-			case iKeyToggleInverseVideo:	/* toggle inverse video */
+			case GLOBAL_TOGGLE_INVERSE_VIDEO:	/* toggle inverse video */
 				toggle_inverse_video();
 				show_thread_page();
 				show_inverse_video_status();
 				break;
 
 #ifdef HAVE_COLOR
-			case iKeyToggleColor:		/* toggle color */
+			case GLOBAL_TOGGLE_COLOR:		/* toggle color */
 				if (toggle_color()) {
 					show_thread_page();
 					show_color_status();
@@ -678,25 +692,24 @@ thread_page(
 				break;
 #endif /* HAVE_COLOR */
 
-			case iKeyQuit:				/* return to previous level */
+			case GLOBAL_QUIT:			/* return to previous level */
 				ret_code = GRP_EXIT;
 				break;
 
-			case iKeyQuitTin:			/* quit */
+			case GLOBAL_QUIT_TIN:			/* quit */
 				ret_code = GRP_QUIT;
 				break;
 
-			case iKeyThreadTag:			/* tag/untag article */
+			case THREAD_TAG:			/* tag/untag article */
 				/* Find index of current article */
 				if ((n = find_response(thread_basenote, thdmenu.curr)) < 0)
 					break;
 				else {
 					t_bool tagged;
 
-					if ((tagged = tag_article(n))) {
-						build_tline(thdmenu.curr, &arts[n]);	/* Update just this line */
-						draw_line(thdmenu.curr, MAGIC);
-					} else
+					if ((tagged = tag_article(n)))
+						mark_screen(thdmenu.curr, MARK_OFFSET - 2, tin_ltoa((&arts[n])->tagged, 3));
+					else
 						update_thread_page();						/* Must update whole page */
 
 					/* Automatically advance to next art if not at end of thread */
@@ -709,62 +722,61 @@ thread_page(
 				}
 				break;
 
-			case iKeyThreadBugReport:
+			case GLOBAL_BUGREPORT:
 				bug_report();
 				break;
 
-			case iKeyThreadUntag:			/* untag all articles */
+			case THREAD_UNTAG:			/* untag all articles */
 				if (grpmenu.curr >= 0 && untag_all_articles())
 					update_thread_page();
 				break;
 
-			case iKeyVersion:			/* version */
+			case GLOBAL_VERSION:			/* version */
 				info_message(cvers);
 				break;
 
-			case iKeyThreadMarkArtUnread:		/* mark article as unread */
+			case MARK_ARTICLE_UNREAD:	/* mark article as unread */
 				n = find_response(thread_basenote, thdmenu.curr);
 				art_mark(group, &arts[n], ART_WILL_RETURN);
-				build_tline(thdmenu.curr, &arts[n]);
-				draw_line(thdmenu.curr, MAGIC);
-				info_message(_(txt_marked_as_unread), _(txt_article_upper));
+				mark[0] = get_art_mark(&arts[n]);
+				mark_screen(thdmenu.curr, MARK_OFFSET, mark);
 				draw_thread_arrow();
+				info_message(_(txt_marked_as_unread), _(txt_article_upper));
 				break;
 
-			case iKeyThreadMarkThdUnread:		/* mark thread as unread */
+			case MARK_THREAD_UNREAD:		/* mark thread as unread */
 				thd_mark_unread(group, base[thread_basenote]);
 				update_thread_page();
 				info_message(_(txt_marked_as_unread), _(txt_thread_upper));
 				break;
 
-			case iKeyThreadSelArt:		/* mark article as selected */
-			case iKeyThreadToggleArtSel:		/* toggle article as selected */
+			case THREAD_SELECT_ARTICLE:		/* mark article as selected */
+			case THREAD_TOGGLE_ARTICLE_SELECTION:		/* toggle article as selected */
 				if ((n = find_response(thread_basenote, thdmenu.curr)) < 0)
 					break;
-				arts[n].selected = (!(ch == iKeyThreadToggleArtSel && arts[n].selected));	/* TODO: optimise? */
+				arts[n].selected = (!(func == THREAD_TOGGLE_ARTICLE_SELECTION && arts[n].selected));	/* TODO: optimise? */
 /*				update_thread_page(); */
-				build_tline(thdmenu.curr, &arts[n]);
-				draw_line(thdmenu.curr, MAGIC);
+				mark[0] = get_art_mark(&arts[n]);
+				mark_screen(thdmenu.curr, MARK_OFFSET, mark);
 				if (thdmenu.curr + 1 < thdmenu.max)
 					move_down();
 				else
 					draw_thread_arrow();
 				break;
 
-			case iKeyThreadReverseSel:		/* reverse selections */
+			case THREAD_REVERSE_SELECTIONS:		/* reverse selections */
 				for_each_art_in_thread(i, thread_basenote)
 					arts[i].selected = bool_not(arts[i].selected);
 				update_thread_page();
 				break;
 
-			case iKeyThreadUndoSel:		/* undo selections */
+			case THREAD_UNDO_SELECTIONS:		/* undo selections */
 				for_each_art_in_thread(i, thread_basenote)
 					arts[i].selected = FALSE;
 				update_thread_page();
 				break;
 
-			case iKeyPostponed:
-			case iKeyPostponed2:		/* post postponed article */
+			case GLOBAL_POSTPONED:		/* post postponed article */
 				if (can_post) {
 					if (pickup_postponed_articles(FALSE, FALSE))
 						show_thread_page();
@@ -772,18 +784,18 @@ thread_page(
 					info_message(_(txt_cannot_post));
 				break;
 
-			case iKeyDisplayPostHist:	/* display messages posted by user */
+			case GLOBAL_DISPLAY_POST_HISTORY:	/* display messages posted by user */
 				if (user_posted_messages())
 					show_thread_page();
 				break;
 
-			case iKeyToggleInfoLastLine:		/* display subject in last line */
+			case GLOBAL_TOGGLE_INFO_LAST_LINE:		/* display subject in last line */
 				tinrc.info_in_last_line = bool_not(tinrc.info_in_last_line);
 				show_thread_page();
 				break;
 
 			default:
-				info_message(_(txt_bad_command), printascii(key, map_to_local(iKeyHelp, &menukeymap.thread_nav)));
+				info_message(_(txt_bad_command), printascii(key, func_to_key(GLOBAL_HELP, thread_keys)));
 		}
 	} /* ret_code >= 0 */
 
@@ -798,48 +810,34 @@ static void
 show_thread_page(
 	void)
 {
+	char *title;
 	int i, art;
 
 	signal_context = cThread;
 	currmenu = &thdmenu;
 
 	ClearScreen();
-
 	set_first_screen_item();
 
-	art = find_response(thread_basenote, thdmenu.first);
-
 	/*
 	 * If threading by Refs, it helps to see the subject line
 	 */
-	show_subject = ((arts[thread_respnum].archive != NULL) || (CURR_GROUP.attribute->thread_arts == THREAD_REFS) || (CURR_GROUP.attribute->thread_arts == THREAD_BOTH));
+	show_subject = ((arts[thread_respnum].archive != NULL) || (curr_group->attribute->thread_arts == THREAD_REFS) || (curr_group->attribute->thread_arts == THREAD_BOTH));
 
 	if (show_subject)
-		snprintf(mesg, sizeof(mesg), _(txt_stp_list_thread), grpmenu.curr + 1, grpmenu.max);
+		title = fmt_string(_(txt_stp_list_thread), grpmenu.curr + 1, grpmenu.max);
 	else
-		snprintf(mesg, sizeof(mesg), _(txt_stp_thread), cCOLS - 23, arts[thread_respnum].subject);
-
-	/*
-	 * Slight misuse of the 'mesg' buffer here. We need to clear it so that progress messages
-	 * are displayed correctly
-	 */
-	show_title(mesg);
-	mesg[0] = '\0';
+		title = fmt_string(_(txt_stp_thread), cCOLS - 23, arts[thread_respnum].subject);
+	show_title(title);
+	free(title);
 
-	MoveCursor(INDEX_TOP, 0);
-
-	for (i = thdmenu.first; i < thdmenu.last; ++i) {
+	art = find_response(thread_basenote, thdmenu.first);
+	for (i = thdmenu.first; i < thdmenu.first + NOTESLINES && i < thdmenu.max; ++i) {
 		build_tline(i, &arts[art]);
-		draw_line(i, 0);
 		art = next_response(art);
 	}
 
-	CleartoEOS();
 	show_mini_help(THREAD_LEVEL);
-
-	if (thdmenu.last == thdmenu.max)
-		info_message(_(txt_end_of_thread));
-
 	draw_thread_arrow();
 }
 
@@ -848,14 +846,22 @@ static void
 update_thread_page(
 	void)
 {
-	int i, j, the_index;
+	char mark[] = { '\0', '\0' };
+	int i, the_index;
 
 	the_index = find_response(thread_basenote, thdmenu.first);
 	assert(thdmenu.first != 0 || the_index == thread_respnum);
 
-	for (j = 0, i = thdmenu.first; j < NOTESLINES && i < thdmenu.last; ++i, ++j) {
-		build_tline(i, &arts[the_index]);
-		draw_line(i, MAGIC);
+	for (i = thdmenu.first; i < thdmenu.first + NOTESLINES && i < thdmenu.max; ++i) {
+		if ((&arts[the_index])->tagged)
+			mark_screen(i, MARK_OFFSET - 2, tin_ltoa((&arts[the_index])->tagged, 3));
+		else {
+			mark[0] = get_art_mark(&arts[the_index]);
+			mark_screen(i, MARK_OFFSET - 2, "  ");	/* clear space used by tag numbering */
+			mark_screen(i, MARK_OFFSET, mark);
+			if (mark[0] == tinrc.art_marked_selected)
+				draw_mark_selected(i);
+		}
 		if ((the_index = next_response(the_index)) == -1)
 			break;
 	}
@@ -872,6 +878,8 @@ draw_thread_arrow(
 
 	if (tinrc.info_in_last_line)
 		info_message("%s", arts[find_response(thread_basenote, thdmenu.curr)].subject);
+	else if (thdmenu.curr == thdmenu.max - 1)
+		info_message(_(txt_end_of_thread));
 }
 
 
@@ -942,9 +950,10 @@ which_thread(
 	for (i = n; arts[i].prev >= 0; i = arts[i].prev)
 		;
 	/* Find in base[] */
-	for (j = 0; j < grpmenu.max; j++)
+	for (j = 0; j < grpmenu.max; j++) {
 		if (base[j] == i)
 			return j;
+	}
 
 	error_message(_(txt_cannot_find_base_art), n);
 	return -1;
@@ -987,10 +996,7 @@ num_of_responses(
 	int oldi = -3;
 	int sum = 0;
 
-	assert(n < grpmenu.max);
-
-	if (n < 0)
-		n = 0;
+	assert(n < grpmenu.max && n >= 0);
 
 	for_each_art_in_thread(i, n) {
 		assert(i != ART_EXPIRED);
@@ -1017,7 +1023,10 @@ get_score_of_thread(
 	int score = 0;
 
 	for (i = n; i >= 0; i = arts[i].thread) {
-		if (arts[i].status != ART_READ || arts[i].killed == ART_KILLED_UNREAD) {
+		/*
+		 * TODO: do we want to take the score of read articles into account?
+		 */
+		if (arts[i].status != ART_READ || arts[i].killed == ART_KILLED_UNREAD /* || tinrc.kill_level == KILL_THREAD */) {
 			if (tinrc.thread_score == THREAD_SCORE_MAX) {
 				/* we use the maximum article score for the complete thread */
 				if ((arts[i].score > score) && (arts[i].score > 0))
@@ -1094,7 +1103,7 @@ stat_thread(
 		if (arts[i].killed)
 			++sbuf->killed;
 
-		if ((CURR_GROUP.attribute->thread_arts == THREAD_MULTI) && global_get_multipart_info(i, &minfo) && (minfo.total >= 1)) {
+		if ((curr_group->attribute->thread_arts == THREAD_MULTI) && global_get_multipart_info(i, &minfo) && (minfo.total >= 1)) {
 			sbuf->multipart_compare_len = minfo.subject_compare_len;
 			sbuf->multipart_total = minfo.total;
 			sbuf->multipart_have++;
@@ -1263,7 +1272,7 @@ static t_bool
 find_unexpired(
 	struct t_msgid *ptr)
 {
-	return ptr && (!EXPIRED(ptr) || find_unexpired(ptr->child) || find_unexpired(ptr->sibling));
+	return ptr && (!IS_EXPIRED(ptr) || find_unexpired(ptr->child) || find_unexpired(ptr->sibling));
 }
 
 
@@ -1275,7 +1284,7 @@ has_sibling(
 		if (find_unexpired(ptr->sibling))
 			return TRUE;
 		ptr = ptr->parent;
-	} while (ptr && EXPIRED(ptr));
+	} while (ptr && IS_EXPIRED(ptr));
 	return FALSE;
 }
 
@@ -1300,7 +1309,7 @@ make_prefix(
 	struct t_msgid *ptr;
 
 	for (ptr = art->parent; ptr; ptr = ptr->parent)
-		depth += (!EXPIRED(ptr) ? 1 : 0);
+		depth += (!IS_EXPIRED(ptr) ? 1 : 0);
 
 	if ((depth == 0) || (maxlen < 1)) {
 		prefix[0] = '\0';
@@ -1327,7 +1336,7 @@ make_prefix(
 	buf[--prefix_ptr] = (has_sibling(art) ? '+' : '`');
 
 	for (ptr = art->parent; prefix_ptr > 1; ptr = ptr->parent) {
-		if (EXPIRED(ptr))
+		if (IS_EXPIRED(ptr))
 			continue;
 		buf[--prefix_ptr] = ' ';
 		buf[--prefix_ptr] = (has_sibling(ptr) ? '|' : ' ');
@@ -1352,7 +1361,7 @@ make_prefix(
  */
 static int
 thread_catchup(
-	int ch)
+	t_function func)
 {
 	char buf[LEN];
 	int i, n;
@@ -1366,23 +1375,28 @@ thread_catchup(
 	}
 
 	if (i != -1) {				/* still unread arts in this thread */
-		snprintf(buf, sizeof(buf), _(txt_mark_thread_read), (ch == iKeyThreadCatchupNextUnread) ? _(txt_enter_next_thread) : "");
-		if ((!TINRC_CONFIRM_ACTION) || (pyn = prompt_yn(cLINES, buf, TRUE)) == 1)
-			thd_mark_read(&CURR_GROUP, base[thread_basenote]);
+		/*
+		 * TODO: if (group->attribute->thread_arts == THREAD_NONE)
+		 *          snprintf(buf, sizeof(buf), _("Mark article as read%s?"), (func == CATCHUP_NEXT_UNREAD) ? _(" and enter next unread article") : "");
+		 *       else
+		 */
+		snprintf(buf, sizeof(buf), _(txt_mark_thread_read), (func == CATCHUP_NEXT_UNREAD) ? _(txt_enter_next_thread) : "");
+		if ((!TINRC_CONFIRM_ACTION) || (pyn = prompt_yn(buf, TRUE)) == 1)
+			thd_mark_read(curr_group, base[thread_basenote]);
 	}
 
-	switch (ch) {
-		case iKeyThreadCatchup:				/* 'c' */
+	switch (func) {
+		case CATCHUP:				/* 'c' */
 			if (pyn == 1)
 				return GRP_NEXT;
 			break;
 
-		case iKeyThreadCatchupNextUnread:	/* 'C' */
+		case CATCHUP_NEXT_UNREAD:	/* 'C' */
 			if (pyn == 1)
 				return GRP_NEXTUNREAD;
 			break;
 
-		case iKeyCatchupLeft:			/* <- thread catchup on exit */
+		case SPECIAL_CATCHUP_LEFT:			/* <- thread catchup on exit */
 			switch (pyn) {
 				case -1:				/* ESC from prompt, stay in group */
 					break;
@@ -1425,7 +1439,7 @@ enter_pager(
 	int i;
 
 again:
-	switch ((i = show_page(&CURR_GROUP, art, &thdmenu.curr))) {
+	switch ((i = show_page(curr_group, art, &thdmenu.curr))) {
 		/* These exit to previous menu level */
 		case GRP_QUIT:				/* 'Q' all the way out */
 		case GRP_RETSELECT:			/* 'T' back to select menu */
@@ -1514,38 +1528,42 @@ mark_art_read(
 	struct t_group *group)
 {
 	char keytagged[MAXKEYLEN], keycurrent[MAXKEYLEN], keyquit[MAXKEYLEN];
-	int ch = iKeyMarkReadCur;
-	int n = -1, cnt = 0;
+	int n, cnt = 0;
 	int tmp_num_of_tagged_arts = num_of_tagged_arts;
+	t_function func = MARK_READ_CURRENT;
 
 	if (!tinrc.mark_ignore_tags && got_tagged_unread_arts()) {
-		ch = prompt_slk_response(iKeyMarkReadTag,
-				&menukeymap.mark_read_tagged_current,
+		func = prompt_slk_response(MARK_READ_TAGGED,
+				mark_read_keys,
 				_(txt_mark_art_read_tagged_current),
-				printascii(keytagged, map_to_local(iKeyMarkReadTag, &menukeymap.mark_read_tagged_current)),
-				printascii(keycurrent, map_to_local(iKeyMarkReadCur, &menukeymap.mark_read_tagged_current)),
-				printascii(keyquit, map_to_local(iKeyQuit, &menukeymap.mark_read_tagged_current)));
+				printascii(keytagged, func_to_key(MARK_READ_TAGGED, mark_read_keys)),
+				printascii(keycurrent, func_to_key(MARK_READ_CURRENT, mark_read_keys)),
+				printascii(keyquit, func_to_key(GLOBAL_QUIT, mark_read_keys)));
 	}
 
-	switch (ch) {
-		case iKeyMarkReadTag: /* mark tagged unread articles as read */
+	switch (func) {
+		case MARK_READ_TAGGED: /* mark tagged unread articles as read */
 			cnt = mark_tagged_read(group);
 			show_thread_page();
 			n = find_response(thread_basenote, thdmenu.curr);
 			break;
 
-		case iKeyMarkReadCur: /* mark current article as read */
+		case MARK_READ_CURRENT: /* mark current article as read */
 			n = find_response(thread_basenote, thdmenu.curr);
 			if ((arts[n].status == ART_UNREAD) || (arts[n].status == ART_WILL_RETURN)) {
+				char mark[] = { '\0', '\0' };
+
 				art_mark(group, &arts[n], ART_READ);
-				build_tline(thdmenu.curr, &arts[n]);
-				draw_line(thdmenu.curr, MAGIC);
+				mark[0] = get_art_mark(&arts[n]);
+				mark_screen(thdmenu.curr, MARK_OFFSET, mark);
 			}
 			break;
 
-		case iKeyQuit: /* cancel operation */
-		case iKeyAbort:
+		case GLOBAL_QUIT: /* cancel operation */
+		case GLOBAL_ABORT:
+		default:
 			return 0;
+			/* NOTREACHED */
 			break;
 	}
 
@@ -1554,7 +1572,7 @@ mark_art_read(
 	else
 		fixup_thread(n, TRUE);	/* We may be in the next thread now */
 
-	if (ch == iKeyMarkReadTag)
+	if (func == MARK_READ_TAGGED)
 		info_message(_(txt_marked_tagged_arts_as_read), cnt, tmp_num_of_tagged_arts, PLURAL(tmp_num_of_tagged_arts, txt_article));
 
 	return 0;
diff -Nurp tin-1.6.2/src/tincfg.tbl tin-1.8.0/src/tincfg.tbl
--- tin-1.6.2/src/tincfg.tbl	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/tincfg.tbl	2005-06-28 10:31:24.000000000 +0200
@@ -2,10 +2,10 @@
 ;   Module    : tincfg.tbl
 ;   Author    : Thomas E. Dickey
 ;   Created   : 1996-11-01
-;   Updated   : 2003-08-10
+;   Updated   : 2005-06-20
 ;   Notes     : #defines and structs for config.c
 ;
-; Copyright (c) 1996-2003 Thomas E. Dickey <dickey@invisible-island.net>
+; Copyright (c) 1996-2005 Thomas E. Dickey <dickey@invisible-island.net>
 ; All rights reserved.
 ;
 ; Redistribution and use in source and binary forms, with or without
@@ -43,6 +43,7 @@
 	inverse_okay			OPT_ON_OFF
 	strip_blanks			OPT_ON_OFF
 	thread_articles			txt_threading	THREAD_MAX+1
+	thread_perc			OPT_NUM
 	sort_article_type		txt_sort_a_type	SORT_ARTICLES_BY_LINES_ASCEND+1
 	sort_threads_type		txt_sort_t_type	SORT_THREADS_BY_SCORE_ASCEND+1
 	pos_first_unread		OPT_ON_OFF
@@ -123,7 +124,9 @@
 	col_from			txt_colors	MAX_COLOR+1
 	col_title			txt_colors	MAX_COLOR+1
 	col_signature			txt_colors	MAX_COLOR+1
+	col_urls			txt_colors	MAX_COLOR+1
 #endif
+	url_highlight			OPT_ON_OFF
 	word_highlight			OPT_ON_OFF
 	word_h_display_marks		txt_marks	MAX_MARK+1
 #ifdef HAVE_COLOR
@@ -201,7 +204,7 @@
 	editor_format			OPT_STRING
 	inews_prog			OPT_STRING
 	mailer_format			OPT_STRING
-	use_mailreader_i		OPT_ON_OFF
+	interactive_mailer		txt_interactive_mailers NUM_INTERACTIVE_MAILERS
 	unlink_article			OPT_ON_OFF
 	posted_articles_file		OPT_STRING
 	keep_dead_articles		OPT_ON_OFF
@@ -214,3 +217,16 @@
 	use_slrnface			OPT_ON_OFF
 #endif
 	url_handler			OPT_STRING
+	date_format			OPT_STRING
+#ifdef HAVE_UNICODE_NORMALIZATION
+#	ifdef HAVE_LIBICUUC
+		normalization_form		txt_normalization_forms NORMALIZE_NFD+1
+#	else
+#		ifdef HAVE_LIBIDN
+			normalization_form		txt_normalization_forms 2
+#		endif
+#	endif
+#endif
+#if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && defined(HAVE_UNICODE_UBIDI_H) && !defined(NO_LOCALE)
+	render_bidi			OPT_ON_OFF
+#endif
diff -Nurp tin-1.6.2/src/tmpfile.c tin-1.8.0/src/tmpfile.c
--- tin-1.6.2/src/tmpfile.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/tmpfile.c	2005-12-02 12:07:37.000000000 +0100
@@ -53,10 +53,10 @@ FILE *
 tmpfile(
 	void)
 {
-	sigset_t set, oset;
 	FILE *fp;
-	int sverrno, fd = -1;
 	char buf[sizeof(_PATH_TMP) + sizeof(TRAILER)];
+	int sverrno, fd = -1;
+	sigset_t set, oset;
 
 	(void) memcpy(buf, _PATH_TMP, sizeof(_PATH_TMP) - 1);
 	(void) memcpy(buf + sizeof(_PATH_TMP) - 1, TRAILER, sizeof(TRAILER));
@@ -79,7 +79,7 @@ tmpfile(
 		(void) unlink(buf);
 		u = umask(0);
 		(void) umask(u);
-		(void) fchmod(fd, 0666 & ~u);
+		(void) fchmod(fd, (S_IRUGO|S_IWUGO) & ~u);
 	}
 
 	(void) sigprocmask(SIG_SETMASK, &oset, NULL);
diff -Nurp tin-1.6.2/src/trace.c tin-1.8.0/src/trace.c
--- tin-1.6.2/src/trace.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/trace.c	2005-12-02 12:07:37.000000000 +0100
@@ -1,12 +1,12 @@
 /*
  *  Project   : tin - a Usenet reader
  *  Module    : trace.c
- *  Author    : Thomas Dickey <dickey@herndon4.his.com>
+ *  Author    : Thomas Dickey <dickey@invisible-island.net>
  *  Created   : 1997-03-22
  *  Updated   : 2001-07-22
  *  Notes     : debugging support via TRACE macro.
  *
- * Copyright (c) 1997-2003 Thomas Dickey <dickey@herndon4.his.com>
+ * Copyright (c) 1997-2006 Thomas Dickey <dickey@invisible-island.net>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -78,7 +78,7 @@ _nc_visbuf(const char *s)
 {
 	return (char *) s;
 }
-#endif /* NCURSES_VERSION */
+#endif /* !HAVE__TRACEF */
 
 char *
 tin_tracechar(
diff -Nurp tin-1.6.2/src/version.c tin-1.8.0/src/version.c
--- tin-1.6.2/src/version.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/version.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : version.c
  *  Author    : U. Janssen
  *  Created   : 2003-05-11
- *  Updated   : 2003-06-27
+ *  Updated   : 2005-07-02
  *  Notes     :
  *
- * Copyright (c) 2003 Urs Janssen <urs@tin.org>
+ * Copyright (c) 2003-2006 Urs Janssen <urs@tin.org>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -41,20 +41,21 @@
 #ifndef VERSION_H
 #	include "version.h"
 #endif /* !VERSION_H */
-#ifndef MENUKEYS_H
-#	include "menukeys.h"
-#endif /* !MENUKEYS_H */
+
 
 /*
- * line    is the entire line we should check
- * skip    must the the leading portion of the version line not including the
- *         version number (which must be a dotted triple)
- * verson  is the version number (dotted triple) we expect to match
+ * line     is the entire line we should check
+ * skip     must be the leading portion of the version line not including the
+ *          version number (which must be a dotted triple)
+ * version  is the version number (dotted triple) we expect to match
  *
  * returns RC_IGNORE     1st args dotted triple matches 3rd arg
  *         RC_UPGRADE    1st args dotted triple is older than 3rd arg
  *         RC_DOWNGRADE  1st args dotted triple is newer than 3rd arg
- *         RC_ERROR      3rd args is not a dotted triple (usage error)
+ *         RC_ERROR      3rd arg is not a dotted triple (usage error)
+ *
+ * Don't make the arguments to sscanf() consts, as some old systems require
+ * them to writable (but do not change them)
  */
 int
 check_upgrade(
@@ -63,20 +64,28 @@ check_upgrade(
 	const char *version)
 {
 	char *format;
-	const char *fmt = "%d.%d.%d";	/* we are expecting dotted triples */
+	char *lskip = my_strdup(skip);
+	char *lversion = my_strdup(version);
+	char fmt[10];
 	int rc_majorv, rc_minorv, rc_subv; /* version numbers in the file */
 	int c_majorv, c_minorv, c_subv;	/* version numbers we require */
-	size_t len = strlen(skip) + strlen(fmt) + 1; /* format buffer len */
+	size_t len;
 
 	rc_majorv = rc_minorv = rc_subv = c_majorv = c_minorv = c_subv = -1;
-	format = my_malloc(strlen(skip) + 10);
-	snprintf(format, len, "%s%s", skip, fmt);
+	strcpy(fmt, "%d.%d.%d"); /* we are expecting dotted triples */
+	len = strlen(lskip) + strlen(fmt) + 1; /* format buffer len */
+	format = my_malloc(len + 1);
+	snprintf(format, len, "%s%s", lskip, fmt);
 	sscanf(line, format, &rc_majorv, &rc_minorv, &rc_subv);
 	free(format);
+	free(lskip);
 
 	/* we can't parse our own version number - should never happen */
-	if (sscanf(version, fmt, &c_majorv, &c_minorv, &c_subv) != 3)
+	if (sscanf(lversion, fmt, &c_majorv, &c_minorv, &c_subv) != 3) {
+		free(lversion);
 		return RC_ERROR;
+	}
+	free(lversion);
 
 	if (c_majorv == rc_majorv && c_minorv == rc_minorv && c_subv == rc_subv)
 		return RC_IGNORE;
@@ -115,11 +124,15 @@ upgrade_prompt_quit(
 	}
 
 	error_message(_(txt_return_key));
-	/* TODO: document, use something unbuffered here */
+
+	/*
+	 * TODO: document, use something unbuffered here
+	 * NOTE: these keys can not be remapped
+	 */
 	switch (getchar()) {
-		case iKeyQuit:
-		case iKeyQuitTin:
-		case iKeyAbort:
+		case 'q':
+		case 'Q':
+		case ESC:
 			giveup();
 			/* NOTREACHED */
 			break;
diff -Nurp tin-1.6.2/src/wildmat.c tin-1.8.0/src/wildmat.c
--- tin-1.6.2/src/wildmat.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/wildmat.c	2005-12-02 12:07:37.000000000 +0100
@@ -143,8 +143,6 @@ wildmat(
 		return TRUE;
 #endif /* OPTIMIZE_JUST_STAR */
 
-	mesg[0] = '\0';
-
 	if (icase) {
 		txt = my_strdup(text);
 		str_lwr(txt);
@@ -192,8 +190,6 @@ wildmatpos(
 	}
 #endif /* OPTIMIZE_JUST_STAR */
 
-	mesg[0] = '\0';
-
 	txt = my_strdup(text);
 	if (icase) {
 		str_lwr(txt);
diff -Nurp tin-1.6.2/src/xface.c tin-1.8.0/src/xface.c
--- tin-1.6.2/src/xface.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/xface.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : xface.c
  *  Author    : Joshua Crawford & Drazen Kacar
  *  Created   : 2003-04-27
- *  Updated   : 2003-06-27
+ *  Updated   : 2004-07-27
  *  Notes     :
  *
- * Copyright (c) Joshua Crawford <mortarn@softhome.net> & Drazen Kacar <dave@willfork.com>
+ * Copyright (c) 2003-2006 Joshua Crawford <mortarn@softhome.net> & Drazen Kacar <dave@willfork.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -106,7 +106,7 @@ slrnface_start(
 		/* We'll abuse fifo filename memory here. It's long enough. */
 		sprintf(fifo, "%s/.slrnfaces/README", ptr);
 		if ((fp = fopen(fifo, "w")) != NULL) {
-	      fputs(_("This directory is used to create named pipes for communication between\n"
+			fputs(_("This directory is used to create named pipes for communication between\n"
 "slrnface and its parent process. It should normally be empty because\n"
 "the pipe is deleted right after it has been opened by both processes.\n\n"
 "File names generated by slrnface have the form \"hostname.pid\". It is\n"
@@ -127,7 +127,7 @@ slrnface_start(
 	}
 
 	unlink(fifo);
-	if (mkfifo(fifo, 0600) < 0) {
+	if (mkfifo(fifo, (S_IRUSR|S_IWUSR)) < 0) {
 		perror_message(_("Can't run slrnface: failed to create %s"), fifo);
 		unlink(fifo);
 		free(fifo);
@@ -146,9 +146,9 @@ slrnface_start(
 			 *              "-yOffsetChar", tinrc.xfacey,
 			 *              "-ink", tinrc.xfacefg,
 			 *              "-paper", tinrc.xfacebg,
-			 *              fifo, (char *) 0);
+			 *              fifo, NULL);
 			 */
-			execlp("slrnface", "slrnface", fifo, (char *) 0);
+			execlp("slrnface", "slrnface", fifo, NULL);
 			/* This is child, exit on error. */
 			giveup();
 			/* NOTREACHED */
@@ -165,7 +165,7 @@ slrnface_start(
 
 				switch (WEXITSTATUS(status)) {
 					case 0:	/* All fine, open the pipe */
-						slrnface_fd = open(fifo, O_WRONLY, 0600);
+						slrnface_fd = open(fifo, O_WRONLY, (S_IRUSR|S_IWUSR));
 						write(slrnface_fd, "start\n", strlen("start\n"));
 						message = NULL;
 						break;
diff -Nurp tin-1.6.2/src/xref.c tin-1.8.0/src/xref.c
--- tin-1.6.2/src/xref.c	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/src/xref.c	2005-12-02 12:07:37.000000000 +0100
@@ -3,10 +3,10 @@
  *  Module    : xref.c
  *  Author    : I. Lea & H. Brugge
  *  Created   : 1993-07-01
- *  Updated   : 2003-03-14
+ *  Updated   : 2005-05-04
  *  Notes     :
  *
- * Copyright (c) 1993-2003 Iain Lea <iain@bricbrac.de>
+ * Copyright (c) 1993-2006 Iain Lea <iain@bricbrac.de>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,15 +38,9 @@
 #ifndef TIN_H
 #	include "tin.h"
 #endif /* !TIN_H */
-
-/* dbmalloc checks memset() parameters, so we'll use it to check the assignments */
-#ifdef USE_DBMALLOC
-#	define BIT_OR(n, b, mask)	memset(n + NOFFSET(b), n[NOFFSET(b)] | (mask), 1)
-#	define BIT_AND(n, b, mask)	memset(n + NOFFSET(b), n[NOFFSET(b)] & (mask), 1)
-#else
-#	define BIT_OR(n, b, mask)	n[NOFFSET(b)] |= mask
-#	define BIT_AND(n, b, mask)	n[NOFFSET(b)] &= mask
-#endif /* USE_DBMALLOC */
+#ifndef NEWSRC_H
+#	include "newsrc.h"
+#endif /* !NEWSRC_H */
 
 /*
  * local prototypes
@@ -54,6 +48,33 @@
 #if defined(NNTP_ABLE) && defined(XHDR_XREF)
 	static void read_xref_header(struct t_article *art);
 #endif /* NNTP_ABLE && XHDR_XREF */
+static FILE *open_overview_fmt_fp(void);
+
+
+/*
+ * Open the NEWSLIBDIR/overview.fmt file locally or send LIST OVERVIEW.FMT
+ */
+static FILE *
+open_overview_fmt_fp(
+	void)
+{
+	char line[NNTP_STRLEN];
+
+#ifdef NNTP_ABLE
+	if (read_news_via_nntp && !read_saved_news) {
+		if (!nntp_caps.over_cmd)
+			return (FILE *) 0;
+
+		snprintf(line, sizeof(line), "LIST %s", OVERVIEW_FMT);
+		return (nntp_command(line, OK_GROUPS, NULL, 0));
+	} else {
+#endif /* NNTP_ABLE */
+		joinpath(line, libdir, OVERVIEW_FMT);
+		return (fopen(line, "r"));
+#ifdef NNTP_ABLE
+	}
+#endif /* NNTP_ABLE */
+}
 
 
 /*
@@ -69,14 +90,11 @@ overview_xref_support(
 
 	if ((fp = open_overview_fmt_fp()) != NULL) {
 		while ((ptr = tin_fgets(fp, FALSE)) != NULL) {
-
-			if (STRNCASECMPEQ(ptr, "Xref:full", 9)) {
+#if defined(DEBUG) && defined(NNTP_ABLE)
+			debug_nntp("<<<", ptr);
+#endif /* DEBUG && NNTP_ABLE */
+			if (!supported && STRNCASECMPEQ(ptr, "Xref:full", 9))
 				supported = TRUE;
-#ifdef NNTP_ABLE
-				drain_buffer(fp);
-#endif /* NNTP_ABLE */
-				break;
-			}
 		}
 		TIN_FCLOSE(fp);
 		/*
@@ -102,40 +120,35 @@ static void
 read_xref_header(
 	struct t_article *art)
 {
-	/* xref_supported means already supported in xover record */
-	if (!xref_supported && read_news_via_nntp && art && !art->xref) {
-		FILE *fp;
-		char *ptr, *q;
-		char buf[HEADER_LEN];
-		long artnum = 0L;
-
-		snprintf(buf, sizeof(buf), "XHDR XREF %ld", art->artnum);
-		if ((fp = nntp_command(buf, OK_HEAD, NULL, 0)) == NULL)
-			return;
+	FILE *fp;
+	char *ptr, *q;
+	char buf[HEADER_LEN];
+	long artnum;
 
-		while ((ptr = tin_fgets(fp, FALSE)) != NULL) {
+	snprintf(buf, sizeof(buf), "XHDR XREF %ld", art->artnum);
+	if ((fp = nntp_command(buf, OK_HEAD, NULL, 0)) == NULL)
+		return;
+
+	while ((ptr = tin_fgets(fp, FALSE)) != NULL) {
+		while (*ptr && isspace((int) *ptr))
+			ptr++;
+		if (*ptr == '.')
+			break;
+		/*
+		 * read the article number
+		 */
+		artnum = atol(ptr);
+		if ((artnum == art->artnum) && !art->xref && !strstr(ptr, "(none)")) {
+			if ((q = strchr(ptr, ' ')) == NULL)	/* skip article number */
+				continue;
+			ptr = q;
 			while (*ptr && isspace((int) *ptr))
 				ptr++;
-			if (*ptr == '.')
-				break;
-			/*
-			 * read the article number
-			 */
-			artnum = atol(ptr);
-			if ((artnum == art->artnum) && !art->xref && !strstr(ptr, "(none)")) {
-				q = strchr(ptr, ' ');	/* skip article number */
-				if (q == NULL)
-					continue;
-				ptr = q;
-				while (*ptr && isspace((int) *ptr))
-					ptr++;
-				q = strchr(ptr, '\n');
-				if (q)
-					*q = '\0';
-				art->xref = my_strdup(ptr);
-			}
+			q = strchr(ptr, '\n');
+			if (q)
+				*q = '\0';
+			art->xref = my_strdup(ptr);
 		}
-
 	}
 	return;
 }
@@ -151,13 +164,18 @@ art_mark_xref_read(
 	struct t_article *art)
 {
 	char *xref_ptr;
-	char *group;
+	char *groupname;
 	char *ptr, c;
 	long artnum;
-	struct t_group *psGrp;
+	struct t_group *group;
+#ifdef DEBUG
+	char *debug_mesg;
+#endif /* DEBUG */
 
 #if defined(NNTP_ABLE) && defined(XHDR_XREF)
-	read_xref_header(art);
+	/* xref_supported => xref info was already read in xover record */
+	if (!xref_supported && read_news_via_nntp && art && !art->xref)
+		read_xref_header(art);
 #endif /* NNTP_ABLE && XHDR_XREF */
 
 	if (art->xref == NULL)
@@ -178,7 +196,7 @@ art_mark_xref_read(
 		while (*xref_ptr == ' ')
 			xref_ptr++;
 
-		group = xref_ptr;
+		groupname = xref_ptr;
 		while (*xref_ptr != ':' && *xref_ptr)
 			xref_ptr++;
 
@@ -195,37 +213,39 @@ art_mark_xref_read(
 
 		c = *ptr;
 		*ptr = '\0';
-		psGrp = group_find(group);
+		group = group_find(groupname);
 
 #ifdef DEBUG
 		if (debug == 3) {
-			sprintf(mesg, "LOOKUP Xref: [%s:%ld] active=[%s] num_unread=[%ld]",
-				group, artnum,
-				(psGrp ? psGrp->name : ""),
-				(psGrp ? psGrp->newsrc.num_unread : 0));
+			debug_mesg = fmt_string("LOOKUP Xref: [%s:%ld] active=[%s] num_unread=[%ld]",
+				groupname, artnum,
+				(group ? group->name : ""),
+				(group ? group->newsrc.num_unread : 0));
 #	ifdef DEBUG_NEWSRC
-			debug_print_comment(mesg);
-			debug_print_bitmap(psGrp, NULL);
+			debug_print_comment(debug_mesg);
+			debug_print_bitmap(group, NULL);
 #	endif /* DEBUG_NEWSRC */
-			error_message(mesg);
+			error_message(debug_mesg);
+			free(debug_mesg);
 		}
 #endif /* DEBUG */
 
-		if (psGrp && psGrp->newsrc.xbitmap) {
-			if (artnum >= psGrp->newsrc.xmin && artnum <= psGrp->xmax) {
-				if (!((NTEST(psGrp->newsrc.xbitmap, artnum - psGrp->newsrc.xmin) == ART_READ) ? TRUE : FALSE)) {
-					NSET0(psGrp->newsrc.xbitmap, artnum - psGrp->newsrc.xmin);
-					if (psGrp->newsrc.num_unread > 0)
-						psGrp->newsrc.num_unread--;
+		if (group && group->newsrc.xbitmap) {
+			if (artnum >= group->newsrc.xmin && artnum <= group->xmax) {
+				if (!((NTEST(group->newsrc.xbitmap, artnum - group->newsrc.xmin) == ART_READ) ? TRUE : FALSE)) {
+					NSET0(group->newsrc.xbitmap, artnum - group->newsrc.xmin);
+					if (group->newsrc.num_unread > 0)
+						group->newsrc.num_unread--;
 #ifdef DEBUG
 					if (debug == 3) {
-						sprintf(mesg, "FOUND!Xref: [%s:%ld] marked READ num_unread=[%ld]",
-							group, artnum, psGrp->newsrc.num_unread);
+						debug_mesg = fmt_string("FOUND!Xref: [%s:%ld] marked READ num_unread=[%ld]",
+							groupname, artnum, group->newsrc.num_unread);
 #	ifdef DEBUG_NEWSRC
-						debug_print_comment(mesg);
-						debug_print_bitmap(psGrp, NULL);
+						debug_print_comment(debug_mesg);
+						debug_print_bitmap(group, NULL);
 #	endif /* DEBUG_NEWSRC */
-						wait_message(2, mesg);
+						wait_message(2, debug_mesg);
+						free(debug_mesg);
 					}
 #endif /* DEBUG */
 				}
diff -Nurp tin-1.6.2/tin.spec tin-1.8.0/tin.spec
--- tin-1.6.2/tin.spec	2003-08-10 15:27:35.000000000 +0200
+++ tin-1.8.0/tin.spec	2005-12-02 12:01:24.936916760 +0100
@@ -1,10 +1,10 @@
 Name: tin
 Summary: tin - an easy-to-use USENET news reader
-Version: 1.6.0
+Version: 1.8.0
 Release: 1
 Copyright: BSD
 Group: Applications/News
-Source: ftp://ftp.tin.org/pub/news/clients/tin/v1.6/%{name}-%{version}.tar.bz2
+Source: ftp://ftp.tin.org/pub/news/clients/tin/v1.8/%{name}-%{version}.tar.bz2
 Buildroot: /var/tmp/%{name}-%{version}-%{release}
 Packager: Dirk Nimmich <nimmich@muenster.de>
 
diff -Nurp tin-1.6.2/tools/tinews.pl tin-1.8.0/tools/tinews.pl
--- tin-1.6.2/tools/tinews.pl	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/tools/tinews.pl	2005-12-02 12:10:14.018760547 +0100
@@ -4,7 +4,7 @@
 # signs the article and posts it.
 #
 #
-# Copyright (c) 2002-2003 Urs Janssen <urs@tin.org>,
+# Copyright (c) 2002-2006 Urs Janssen <urs@tin.org>,
 #                         Marc Brockschmidt <marc@marcbrockschmidt.de>
 #
 # Redistribution and use in source and binary forms, with or without
@@ -32,50 +32,61 @@
 # POSSIBILITY OF SUCH DAMAGE.
 #
 #
-# TODO: - add pgp6 support
-#       - add debug mode which doesn't dele tmp-files and is verbose
+# TODO: - FIXME add debug mode which doesn't delete tmp-files and is verbose
+#         (e.g. warns about missing mime-headers if body contains 8bit
+#          chars)
+#       - add pgp6 support
+#       - check for ~/.newsauth (and ~/.nntpauth?) and use username/password
+#         if found
+#       - check for /etc/nntpserver (and /etc/news/server)
+#       - allow config in ~/.tinewsrc
+#       - add $PGPOPTS, $PGPPATH, $GNUPGHOME support
 #       - cleanup, remove duplicated code
-#       - turn off echoing if prompting for password
-#       - check for ~/.newsauth and use username/password if found
 #
 # version Number
-my $version = "1.1.0";
+my $version = "1.1.7";
 
-# TODO: put into a "my %config('NNTPServer' => 'news', ... );" array
-my $NNTPServer	= 'news';		# your NNTP servers name
-my $NNTPUser	= '';
-my $NNTPPass	= '';
-my $PGPSigner	= '';			# sign as who?
-my $PGPPass	= '';			# pgp2 only
-my $PathtoPGPPass = '';			# pgp2, pgp5 and gpg
+my %config;
 
-my $pgp		= '/usr/bin/pgp';	# path to pgp
-my $PGPVersion	= '2';			# Use 2 for 2.X, 5 for PGP > 2.X and GPG for GPG
+$config{'NNTPServer'}	= 'news';	# your NNTP servers name
+$config{'NNTPPort'}	= 119;		# NNTP-port
+$config{'NNTPUser'}	= '';
+$config{'NNTPPass'}	= '';
 
-my $Interactive = 1;			# allow interactive usage
+$config{'PGPSigner'}	= '';		# sign as who?
+$config{'PGPPass'}	= '';		# pgp2 only
+$config{'PathtoPGPPass'}= '';		# pgp2, pgp5 and gpg
 
-my $sendmail	= '| /usr/sbin/sendmail -i -t'; # set to '' to disable mail-actions
+$config{'pgp'}		= '/usr/bin/pgp';# path to pgp
+$config{'PGPVersion'}	= '2';		# Use 2 for 2.X, 5 for PGP > 2.X and GPG for GPG
 
-my @PGPSignHeaders = ('From', 'Newsgroups', 'Subject', 'Control',
+$config{'Interactive'}	= "yes";	# allow interactive usage
+
+$config{'add_signature'}= "yes";	# Add ~/.signature to posting if there is no sig
+
+$config{'sendmail'}	= '| /usr/sbin/sendmail -i -t'; # set to '' to disable mail-actions
+
+$config{'PGPSignHeaders'} = ['From', 'Newsgroups', 'Subject', 'Control',
 	'Supersedes', 'Followup-To', 'Date', 'Sender', 'Approved',
 	'Message-ID', 'Reply-To', 'Cancel-Key', 'Also-Control',
-	'Distribution');
-my @PGPorderheaders = ('from', 'newsgroups', 'subject', 'control',
+	'Distribution'];
+$config{'PGPorderheaders'} = ['from', 'newsgroups', 'subject', 'control',
 	'supersedes', 'followup-To', 'date', 'organization', 'lines',
 	'sender', 'approved', 'distribution', 'message-id',
 	'references', 'reply-to', 'mime-version', 'content-type',
 	'content-transfer-encoding', 'summary', 'keywords', 'cancel-lock',
-	'cancel-key', 'also-control', 'x-pgp', 'user-agent');
+	'cancel-key', 'also-control', 'x-pgp', 'user-agent'];
 
-my $pgptmpf	= 'pgptmp';		# temporary file for PGP.
+$config{'pgptmpf'}	= 'pgptmp';	# temporary file for PGP.
 
-my $pgpheader	= 'X-PGP-Sig';
-my $pgpbegin	= '-----BEGIN PGP SIGNATURE-----';	# Begin of PGP-Signature
-my $pgpend	= '-----END PGP SIGNATURE-----';	# End of PGP-Signature
+$config{'pgpheader'}	= 'X-PGP-Sig';
+$config{'pgpbegin'}	= '-----BEGIN PGP SIGNATURE-----';	# Begin of PGP-Signature
+$config{'pgpend'}	= '-----END PGP SIGNATURE-----';	# End of PGP-Signature
 
 ################################################################################
 
 use strict;
+use Getopt::Long qw(GetOptions);
 use Net::NNTP;
 use Time::Local;
 use Term::ReadLine;
@@ -83,29 +94,105 @@ use Term::ReadLine;
 my $pname = $0;
 $pname =~ s#^.*/##;
 
+my %cli_headers;
+
+$config{'NNTPServer'} = $ENV{'NNTPSERVER'} if ($ENV{'NNTPSERVER'});
+$config{'NNTPPort'} = $ENV{'NNTPPORT'} if ($ENV{'NNTPPORT'});
+
+# Get options:
+$Getopt::Long::ignorecase=0;
+GetOptions('A|V|W|O|no-organization|h|headers' => [], #do nothing
+	'debug|D|N'	=> \$config{'debug'}, #XXX
+	'port|p=i'	=> \$config{'NNTPPort'},
+	'no-sign|X'	=> \$config{'no_sign'},
+	'no-control|R'	=> \$config{'no_control'},
+	'no-signature|S'	=> \$config{'no_signature'},
+	'approved|a=s'	=> \$config{'approved'},
+	'control|c=s'	=> \$config{'control'},
+	'distribution|d=s'	=> \$config{'distribution'},
+	'expires|e=s'	=> \$config{'expires'},
+	'from|f=s'	=> \$config{'from'},
+	'followupto|w=s'	=> \$config{'followup-to'},
+	'newsgroups|n=s'	=> \$config{'newsgroups'},
+	'replyto|r=s'	=> \$config{'reply-to'},
+	'subject|t=s'	=> \$config{'subject'},
+	'references|F=s'	=> \$config{'references'},
+	'organization|o=s'	=> \$config{'organization'},
+	'path|x=s'	=> \$config{'path'},
+	'help|H'	=> \$config{'help'}
+);
+
+foreach (@ARGV) {
+	print STDERR "Unknown argument $_.";
+	usage();
+}
+
+usage() if($config{'help'});
+
 my $term = new Term::ReadLine 'tinews';
+my $attribs = $term->Attribs;
 my $in_header = 1;
 my (@Header, %Header, @Body, $PGPCommand);
 
-$NNTPServer = $ENV{'NNTPSERVER'} if ($ENV{'NNTPSERVER'});
-$PGPSigner = $ENV{'SIGNER'} if ($ENV{'SIGNER'});
+if (! $config{'no_sign'}) {
+	$config{'PGPSigner'} = $ENV{'SIGNER'} if ($ENV{'SIGNER'});
 
-$PathtoPGPPass = $ENV{'PGPPASSFILE'} if ($ENV{'PGPPASSFILE'});
-if ($PathtoPGPPass) {
-	open (PGPPass, "$PathtoPGPPass") or die ("$0: Can't open $PathtoPGPPass: $!");
-	# TODO: ignore any errors if running $Interactive as we can prompt
-	#       the user later?
-	chomp ($PGPPass = <PGPPass>);
-	close(PGPPass);
-}
-if ($PGPVersion eq '2') {
-	$PGPPass = $ENV{'PGPPASS'} if ($ENV{'PGPPASS'});
+	$config{'PathtoPGPPass'} = $ENV{'PGPPASSFILE'} if ($ENV{'PGPPASSFILE'});
+	if ($config{'PathtoPGPPass'}) {
+		open (PGPPass, $config{'PathtoPGPPass'}) or
+			$config{'Interactive'} && die ("$0: Can't open ".$config{'PathtoPGPPass'}.": $!");
+		chomp ($config{'PGPPass'} = <PGPPass>);
+		close(PGPPass);
+	}
+	if ($config{'PGPVersion'} eq '2') {
+		$config{'PGPPass'} = $ENV{'PGPPASS'} if ($ENV{'PGPPASS'});
+	}
 }
 
 
 # Read the message and split the header
 readarticle(\%Header, \@Body);
 
+# Add signature if there is none
+if (!$config{'no_signature'}) {
+	if ($config{'add_signature'} && !grep /^-- /, @Body) {
+		if (-r (glob("~/.signature"))[0]) {
+			my $l = 0;
+			push @Body, "-- \n";
+			open SIGNATURE, (glob("~/.signature"))[0] or die "Can't open ~/.signature: $!";
+			while (<SIGNATURE>){
+				die "~/.signature longer than 4 lines!" if (++$l > 4);
+				push @Body, $_;
+			}
+			close SIGNATURE;
+		} else {
+			warn "Tried to add ~/.signature, but ~/.signature is not readable";
+		}
+	}
+}
+
+# import headers set in the environment
+if (!defined($Header{'reply-to'})) {
+	if ($ENV{'REPLYTO'}) {
+		chomp ($Header{'reply-to'} = "Reply-To: " . $ENV{'REPLYTO'});
+		$Header{'reply-to'} .= "\n";
+	}
+}
+foreach ('DISTRIBUTION', 'ORGANIZATION') {
+	if (!defined($Header{lc($_)}) && $ENV{$_}) {
+		chomp ($Header{lc($_)} = ucfirst($_).": " . $ENV{$_});
+		$Header{lc($_)} .= "\n";
+	}
+}
+
+# overwrite headers if specified via cmd-line
+foreach ('Approved', 'Control', 'Distribution', 'Expires',
+	'From', 'Followup-To', 'Newsgroups',' Reply-To', 'Subject',
+	'References', 'Organization', 'Path') {
+	next if (!defined($config{lc($_)}));
+	chomp ($Header{lc($_)} = $_ . ": " . $config{lc($_)});
+	$Header{lc($_)} .= "\n";
+}
 
 # verify/add/remove headers
 foreach ('From', 'Subject') {
@@ -119,20 +206,13 @@ if (defined($Header{'user-agent'})) {
 	$Header{'user-agent'} = $Header{'user-agent'}." ".$pname."/".$version."\n";
 }
 
-delete $Header{'x-pgp-key'} if (defined($Header{'x-pgp-key'}));
+delete $Header{'x-pgp-key'} if (!$config{'no_sign'} && defined($Header{'x-pgp-key'}));
 
-if (!defined($Header{'organization'})) {
-	if ($ENV{'ORGANIZATION'}) {
-		chomp ($Header{'organization'} = "Organization: " . $ENV{'ORGANIZATION'});
-		$Header{'organization'} .= "\n";
-	}
-}
 
-if (!defined($Header{'reply-to'})) {
-	if ($ENV{'REPLYTO'}) {
-		chomp ($Header{'reply-to'} = "Reply-To: " . $ENV{'REPLYTO'});
-		$Header{'reply-to'} .= "\n";
-	}
+# No control messages allowed when using -R|--no-control
+if ($config{'no_control'} and $Header{control}) {
+	print STDERR "No control messages allowed.\n";
+	exit 1;
 }
 
 if (defined($Header{'newsgroups'}) && !defined($Header{'message-id'})) {
@@ -151,7 +231,7 @@ if (!defined($Header{'message-id'})) {
 }
 
 # set Posted-And-Mailed if we send a mailcopy to someone else
-if ($sendmail && defined($Header{'newsgroups'}) && (defined($Header{'to'}) || defined($Header{'cc'}) || defined($Header{'bcc'}))) {
+if ($config{'sendmail'} && defined($Header{'newsgroups'}) && (defined($Header{'to'}) || defined($Header{'cc'}) || defined($Header{'bcc'}))) {
 	foreach ('to', 'bcc', 'cc') {
 		if (defined($Header{$_}) && $Header{$_} ne $Header{'from'}) {
 			$Header{'posted-and-mailed'} = "Posted-And-Mailed: yes\n";
@@ -160,11 +240,13 @@ if ($sendmail && defined($Header{'newsgr
 	}
 }
 
-if (!$PGPSigner) {
-	chomp ($PGPSigner = $Header{'from'});
-	$PGPSigner =~ s/^[^\s:]+: (.*)/$1/;
+if (! $config{'no_sign'}) {
+	if (!$config{'PGPSigner'}) {
+		chomp ($config{'PGPSigner'} = $Header{'from'});
+		$config{'PGPSigner'} =~ s/^[^\s:]+: (.*)/$1/;
+	}
+	$PGPCommand = getpgpcommand($config{'PGPVersion'});
 }
-$PGPCommand = getpgpcommand($PGPVersion);
 
 # (re)move mail-headers
 my ($To, $Cc, $Bcc, $Newsgroups) = '';
@@ -174,19 +256,27 @@ $Bcc = $Header{'bcc'} if (defined($Heade
 delete $Header{$_} foreach ('to', 'cc', 'bcc');
 $Newsgroups = $Header{'newsgroups'} if (defined($Header{'newsgroups'}));
 
-# sign article
-my $SignedMessageR = signarticle(\%Header, \@Body);
+my $MessageR = [];
+
+if ($config{'no_sign'}) {
+	# don't sign article
+	push @$MessageR, $Header{$_} for (keys %Header);
+	push @$MessageR, "\n", @Body;
+} else {
+	# sign article
+	$MessageR = signarticle(\%Header, \@Body);
+}
 
 # post article
-postarticle($SignedMessageR) if ($Newsgroups);
+postarticle($MessageR) if ($Newsgroups);
 
 # mail article
-if (($To || $Cc || $Bcc) && $sendmail) {
-	open(MAIL, $sendmail) || die "$!";
-	unshift @$SignedMessageR, "$To" if ($To);
-	unshift @$SignedMessageR, "$Cc" if ($Cc);
-	unshift @$SignedMessageR, "$Bcc" if ($Bcc);
-	print(MAIL @$SignedMessageR);
+if (($To || $Cc || $Bcc) && $config{'sendmail'}) {
+	open(MAIL, $config{'sendmail'}) || die "$!";
+	unshift @$MessageR, "$To" if ($To);
+	unshift @$MessageR, "$Cc" if ($Cc);
+	unshift @$MessageR, "$Bcc" if ($Bcc);
+	print(MAIL @$MessageR);
 	close(MAIL);
 }
 
@@ -218,19 +308,6 @@ sub readarticle {
 	}
 }
 
-#-------- sub askuser
-# askuser uses Term::Readline to ask the user a question and returns his
-# answer(s).
-#
-# Receives:
-# 	- $AnsRef: A reference to a scalar which will hold the answer.
-# 	- $Question: A scalar containing the question.
-sub askuser {
-	my ($AnsRef, $Question) = @_;
-	$$AnsRef = $term->readline($Question);
-}
-
-
 #-------- sub getdate
 # getdate generates a date and returns it.
 #
@@ -260,12 +337,13 @@ sub getdate {
 #-------- sub AuthonNNTP
 # AuthonNNTP opens the connection to a Server and returns a Net::NNTP-Object.
 #
-# User, Password and Server are defined before as global
-# scalars ($NNTPServer, $NNTPUser, $NNTPPass). If no values
-# for user or password are defined, the sub will try to
-# ask the user (only if $Interactive is != 0).
+# User, Password and Server are defined before as elements
+# of the global hash %config. If no values for user or password
+# are defined, the sub will try to ask the user (only if
+# $config{'Interactive'} is != 0).
 sub AuthonNNTP {
-	my $Server = Net::NNTP->new($NNTPServer, Reader => 1, Debug => 0) or die "$0: Can't connect to $NNTPServer!\n";
+	my $Server = Net::NNTP->new($config{'NNTPServer'}, Reader => 1, Debug => 0, Port => $config{'NNTPPort'})
+		or die "$0: Can't connect to ".$config{'NNTPServer'}.":".$config{'NNTPPort'}."!\n";
 	my $ServerMsg = "";
 	my $ServerCod = $Server->code();
 
@@ -278,17 +356,18 @@ sub AuthonNNTP {
 
 	# read access - try auth
 	if ($ServerCod == 201) {
-		if ($NNTPPass eq "") {
-			if ($Interactive) {
-				askuser(\$NNTPUser, "Your Username at $NNTPServer: ");
-				askuser(\$NNTPPass, "Password for $NNTPUser at $NNTPServer: ");
+		if ($config{'NNTPPass'} eq "") {
+			if ($config{'Interactive'}) {
+				$config{'NNTPUser'} = $term->readline("Your Username at ".$config{'NNTPServer'}.": ");
+				$attribs->{redisplay_function} = $attribs->{shadow_redisplay};
+				$config{'NNTPPass'} = $term->readline("Password for ".$config{'NNTPUser'}." at ".$config{'NNTPServer'}.": ");
 			} else {
 				$ServerMsg = $Server->message();
 				$Server->quit();
 				die ($0.": ".$ServerCod." ".$ServerMsg."\n");
 			}
 		}
-		$Server->authinfo($NNTPUser, $NNTPPass);
+		$Server->authinfo($config{'NNTPUser'}, $config{'NNTPPass'});
 		$ServerCod = $Server->code();
 		$ServerMsg = $Server->message();
 		if ($ServerCod != 281) { # auth failed
@@ -300,17 +379,18 @@ sub AuthonNNTP {
 	$Server->post();
 	$ServerCod = $Server->code();
 	if ($ServerCod == 480) {
-		if ($NNTPPass eq "") {
-			if ($Interactive) {
-				askuser(\$NNTPUser, "Your Username at $NNTPServer: ");
-				askuser(\$NNTPPass, "Password for $NNTPUser at $NNTPServer: ");
+		if ($config{'NNTPPass'} eq "") {
+			if ($config{'Interactive'}) {
+				$config{'NNTPUser'} = $term->readline("Your Username at ".$config{'NNTPServer'}.": ");
+				$attribs->{redisplay_function} = $attribs->{shadow_redisplay};
+				$config{'NNTPPass'} = $term->readline("Password for ".$config{'NNTPUser'}." at ".$config{'NNTPServer'}.": ");
 			} else {
 				$ServerMsg = $Server->message();
 				$Server->quit();
 				die ($0.": ".$ServerCod." ".$ServerMsg."\n");
 			}
 		}
-		$Server->authinfo($NNTPUser, $NNTPPass);
+		$Server->authinfo($config{'NNTPUser'}, $config{'NNTPPass'});
 		$Server->post();
 	}
 	return $Server;
@@ -327,26 +407,26 @@ sub getpgpcommand {
 	my $PGPCommand;
 
 	if ($PGPVersion eq '2') {
-		if ($PGPPass) {
-			$PGPCommand = "PGPPASS=\"".$PGPPass."\" ".$pgp." -z -u \"".$PGPSigner."\" +verbose=0 language='en' -saft <".$pgptmpf.".txt >".$pgptmpf.".txt.asc";
-		} elsif ($Interactive) {
-			$PGPCommand = $pgp." -z -u \"".$PGPSigner."\" +verbose=0 language='en' -saft <".$pgptmpf.".txt >".$pgptmpf.".txt.asc";
+		if ($config{'PGPPass'}) {
+			$PGPCommand = "PGPPASS=\"".$config{'PGPPass'}."\" ".$config{'pgp'}." -z -u \"".$config{'PGPSigner'}."\" +verbose=0 language='en' -saft <".$config{'pgptmpf'}.".txt >".$config{'pgptmpf'}.".txt.asc";
+		} elsif ($config{'Interactive'}) {
+			$PGPCommand = $config{'pgp'}." -z -u \"".$config{'PGPSigner'}."\" +verbose=0 language='en' -saft <".$config{'pgptmpf'}.".txt >".$config{'pgptmpf'}.".txt.asc";
 		} else {
 			die "$0: Passphrase is unknown!\n";
 		}
 	} elsif ($PGPVersion eq '5') {
-		if ($PathtoPGPPass) {
-			$PGPCommand = "PGPPASSFD=42 ".$pgp."s -u \"".$PGPSigner."\" -t --armor -o ".$pgptmpf.".txt.asc -z -f < ".$pgptmpf.".txt 42<".$PathtoPGPPass;
-		} elsif ($Interactive) {
-			$PGPCommand = $pgp."s -u \"".$PGPSigner."\" -t --armor -o ".$pgptmpf.".txt.asc -z -f < ".$pgptmpf.".txt";
+		if ($config{'PathtoPGPPass'}) {
+			$PGPCommand = "PGPPASSFD=42 ".$config{'pgp'}."s -u \"".$config{'PGPSigner'}."\" -t --armor -o ".$config{'pgptmpf'}.".txt.asc -z -f < ".$config{'pgptmpf'}.".txt 42<".$config{'PathtoPGPPass'};
+		} elsif ($config{'Interactive'}) {
+			$PGPCommand = $config{'pgp'}."s -u \"".$config{'PGPSigner'}."\" -t --armor -o ".$config{'pgptmpf'}.".txt.asc -z -f < ".$config{'pgptmpf'}.".txt";
 		} else {
 			die "$0: Passphrase is unknown!\n";
 		}
 	} elsif ($PGPVersion =~ m/GPG/io) {
-		if ($PathtoPGPPass) {
-			$PGPCommand = $pgp." --digest-algo MD5 -a -u \"".$PGPSigner."\" -o ".$pgptmpf.".txt.asc --no-tty --batch --passphrase-fd 42 42<".$PathtoPGPPass." --clearsign ".$pgptmpf.".txt";
-		} elsif ($Interactive) {
-			$PGPCommand = $pgp." --digest-algo MD5 -a -u \"".$PGPSigner."\" -o ".$pgptmpf.".txt.asc --no-secmem-warning --no-batch --clearsign ".$pgptmpf.".txt";
+		if ($config{'PathtoPGPPass'}) {
+			$PGPCommand = $config{'pgp'}." --digest-algo MD5 -a -u \"".$config{'PGPSigner'}."\" -o ".$config{'pgptmpf'}.".txt.asc --no-tty --batch --passphrase-fd 42 42<".$config{'PathtoPGPPass'}." --clearsign ".$config{'pgptmpf'}.".txt";
+		} elsif ($config{'Interactive'}) {
+			$PGPCommand = $config{'pgp'}." --digest-algo MD5 -a -u \"".$config{'PGPSigner'}."\" -o ".$config{'pgptmpf'}.".txt.asc --no-secmem-warning --no-batch --clearsign ".$config{'pgptmpf'}.".txt";
 		} else {
 			die "$0: Passphrase is unknown!\n";
 		}
@@ -396,7 +476,7 @@ sub signarticle {
 	my ($HeaderR, $BodyR) = @_;
 	my (@pgphead, @pgpbody, $pgphead, $pgpbody, $header, $signheaders, @signheaders);
 
-	foreach (@PGPSignHeaders) {
+	foreach (@{$config{'PGPSignHeaders'}}) {
 		if (defined($$HeaderR{lc($_)}) && $$HeaderR{lc($_)} =~ m/^[^\s:]+: .+/o) {
 			push @signheaders, $_;
 		}
@@ -405,8 +485,8 @@ sub signarticle {
 	$pgpbody = join ("", @$BodyR);
 
 	# Delete and create the temporary pgp-Files
-	unlink "$pgptmpf.txt";
-	unlink "$pgptmpf.txt.asc";
+	unlink $config{'pgptmpf'}.".txt";
+	unlink $config{'pgptmpf'}.".txt.asc";
 	$signheaders = join(",", @signheaders);
 
 	$pgphead = "X-Signed-Headers: $signheaders\n";
@@ -416,35 +496,34 @@ sub signarticle {
 		}
 	}
 
-	open(FH, ">" . $pgptmpf . ".txt") or die "$0: can't open $pgptmpf: $!\n";
+	open(FH, ">" . $config{'pgptmpf'} . ".txt") or die "$0: can't open ".$config{'pgptmpf'}.": $!\n";
 	print FH $pgphead, "\n", $pgpbody;
-	print FH "\n" if ($PGPVersion =~ m/GPG/io);	# workaround a pgp/gpg incompatibility - should IMHO be fixed in pgpverify
+	print FH "\n" if ($config{'PGPVersion'} =~ m/GPG/io);	# workaround a pgp/gpg incompatibility - should IMHO be fixed in pgpverify
 	close(FH) or warn "$0: Couldn't close TMP: $!\n";
 
 	# Start PGP, then read the signature;
 	`$PGPCommand`;
 
-	open (FH, "<" . $pgptmpf . ".txt.asc") or die "$0: can't open ".$pgptmpf.".txt.asc: $!\n";
-	$/ = "$pgpbegin\n";
+	open (FH, "<" . $config{'pgptmpf'} . ".txt.asc") or die "$0: can't open ".$config{'pgptmpf'}.".txt.asc: $!\n";
+	$/ = "\n".$config{'pgpbegin'}."\n";
 	$_ = <FH>;
-	unless (m/\Q$pgpbegin\E$/o) {
-		unlink $pgptmpf . ".txt";
-		unlink $pgptmpf . ".txt.asc";
-		die "$0: $pgpbegin not found in ".$pgptmpf.".txt.asc\n"
+	unless (m/\Q$config{'pgpbegin'}\E$/o) {
+		unlink $config{'pgptmpf'} . ".txt";
+		unlink $config{'pgptmpf'} . ".txt.asc";
+		die "$0: ".$config{'pgpbegin'}." not found in ".$config{'pgptmpf'}.".txt.asc\n"
 	}
-	unlink($pgptmpf . ".txt") or warn "$0: Couldn't unlink $pgptmpf.txt: $!\n";
+	unlink($config{'pgptmpf'} . ".txt") or warn "$0: Couldn't unlink ".$config{'pgptmpf'}.".txt: $!\n";
 
 	$/ = "\n";
 	$_ = <FH>;
 	unless (m/^Version: (\S+)(?:\s(\S+))?/o) {
-		unlink $pgptmpf . ".txt";
-		unlink $pgptmpf . ".txt.asc";
+		unlink $config{'pgptmpf'} . ".txt.asc";
 		die "$0: didn't find PGP Version line where expected.\n";
 	}
 	if (defined($2)) {
-		$$HeaderR{$pgpheader} = $1."-".$2." ".$signheaders;
+		$$HeaderR{$config{'pgpheader'}} = $1."-".$2." ".$signheaders;
 	} else {
-		$$HeaderR{$pgpheader} = $1." ".$signheaders;
+		$$HeaderR{$config{'pgpheader'}} = $1." ".$signheaders;
 	}
 	do {			# skip other pgp headers like
 		$_ = <FH>;	# "charset:"||"comment:" until empty line
@@ -452,25 +531,24 @@ sub signarticle {
 
 	while (<FH>) {
 		chomp;
-		last if /^\Q$pgpend\E$/;
-		$$HeaderR{$pgpheader} .= "\n\t$_";
+		last if /^\Q$config{'pgpend'}\E$/;
+		$$HeaderR{$config{'pgpheader'}} .= "\n\t$_";
 	}
-	$$HeaderR{$pgpheader} .= "\n" unless ($$HeaderR{$pgpheader} =~ /\n$/s);
+	$$HeaderR{$config{'pgpheader'}} .= "\n" unless ($$HeaderR{$config{'pgpheader'}} =~ /\n$/s);
 
 	$_ = <FH>;
 	unless (eof(FH)) {
-		unlink $pgptmpf . ".txt";
-		unlink $pgptmpf . ".txt.asc";
-		die "$0: unexpected data following $pgpend\n";
+		unlink $config{'pgptmpf'} . ".txt.asc";
+		die "$0: unexpected data following ".$config{'pgpend'}."\n";
 	}
 	close(FH);
-	unlink "$pgptmpf.txt.asc";
+	unlink $config{'pgptmpf'} . ".txt.asc";
 
-	my $tmppgpheader = $pgpheader . ": " . $$HeaderR{$pgpheader};
-	delete $$HeaderR{$pgpheader};
+	my $tmppgpheader = $config{'pgpheader'} . ": " . $$HeaderR{$config{'pgpheader'}};
+	delete $$HeaderR{$config{'pgpheader'}};
 
 	@pgphead = ();
-	foreach $header (@PGPorderheaders) {
+	foreach $header (@{$config{PGPorderheaders}}) {
 		if ($$HeaderR{$header} && $$HeaderR{$header} ne "\n") {
 			push(@pgphead, "$$HeaderR{$header}");
 			delete $$HeaderR{$header};
@@ -484,7 +562,7 @@ sub signarticle {
 		}
 	}
 
-	push @pgphead, ("X-PGP-Key: " . $PGPSigner . "\n"), $tmppgpheader;
+	push @pgphead, ("X-PGP-Key: " . $config{'PGPSigner'} . "\n"), $tmppgpheader;
 	undef $tmppgpheader;
 
 	@pgpbody = split /$/m, $pgpbody;
@@ -492,6 +570,29 @@ sub signarticle {
 	return \@pgpmessage;
 }
 
+
+sub usage {
+	print $pname." ".$version."\n";
+	print "Usage: ".$pname." [OPTS] < article\n";
+	print "  -a string  set Approved:-header to string\n";
+	print "  -c string  set Control:-header to string\n";
+	print "  -d string  set Distribution:-header to string\n";
+	print "  -e string  set Expires:-header to string\n";
+	print "  -f string  set From:-header to string\n";
+	print "  -n string  set Newsgroups:-header to string\n";
+	print "  -o string  set Organization:-header to string\n";
+	print "  -p port    use port as NNTP port [default=".$config{'NNTPPort'}."]\n";
+	print "  -r string  set Reply-To:-header to string\n";
+	print "  -t string  set Subject:-header to string\n";
+	print "  -w string  set Followup-To:-header to string\n";
+	print "  -x string  set Path:-header to string\n";
+	print "  -H         show help\n";
+	print "  -R         disallow control messages\n";
+	print "  -S         do not append \$HOME/.signature\n";
+	print "  -X         do not sign article\n";
+	exit 0;
+}
+
 __END__
 
 =head1 NAME
@@ -500,7 +601,7 @@ tinews.pl - Post and sign an article via
 
 =head1 SYNOPSIS
 
-B<tinews.pl> E<lt> I<input>
+B<tinews.pl> [B<OPTIONS>] E<lt> I<input>
 
 =head1 DESCRIPTION
 
@@ -513,7 +614,89 @@ to the article and send out the mail-cop
 
 =head1 OPTIONS
 
-None.
+=over 4
+
+=item -B<a> C<Approved> | --B<approved> C<Approved>
+
+Set the article header field Approved: to the given value.
+
+=item -B<c> C<Control> | --B<control> C<Control>
+
+Set the article header field Control: to the given value.
+
+=item -B<d> C<Distribution> | --B<distribution> C<Distribution>
+
+Set the article header field Distribution: to the given value.
+
+=item -B<e> C<Expires> | --B<expires> C<Expires>
+
+Set the article header field Expires: to the given value.
+
+=item -B<f> C<From> | --B<from> C<From>
+
+Set the article header field From: to the given value.
+
+=item -B<n> C<Newsgroups> | --B<newsgroups> C<Newsgroups>
+
+Set the article header field Newsgroups: to the given value.
+
+=item -B<o> C<Organization> | --B<organization> C<Organization>
+
+Set the article header field Organization: to the given value.
+
+=item -B<p> C<port> | --B<port> C<port>
+
+use C<port> as NNTP-port
+
+=item -B<r> C<Reply-To> | --B<replyto> C<Reply-To>
+
+Set the article header field Reply-To: to the given value.
+
+=item -B<t> C<Subject> | --B<subject> C<Subject>
+
+Set the article header field Subject: to the given value.
+
+=item -B<w> C<Followup-To> | --B<followupto> C<Followup-To>
+
+Set the article header field Followup-To: to the given value.
+
+=item -B<x> C<Path> | --B<path> C<Path>
+
+Set the article header field Path: to the given value.
+
+=item -B<H> | --B<help>
+
+Show help-page.
+
+=item -B<R> | --B<no-control>
+
+Restricted mode, disallow control-messages.
+
+=item -B<S> | --B<no-signature>
+
+Do not append F<$HOME/.signature>
+
+=item -B<X> | --B<no-sign>
+
+Do not sign the article.
+
+=item -B<A> -B<V> -B<W>
+
+These options are accepted for compatibility reasons but ignored.
+
+=item -B<h> | --B<headers>
+
+These options are accepted for compatibility reasons but ignored.
+
+=item -B<O> | --B<no-organization>
+
+These options are accepted for compatibility reasons but ignored.
+
+=item -B<D> | -B<N> | --B<debug>
+
+These options are accepted but do not have any functionality yet.
+
+=back
 
 =head1 EXIT STATUS
 
@@ -521,7 +704,7 @@ The following exit values are returned:
 
 =over 4
 
-=item S< 0> 
+=item S< 0>
 
 Successful completion.
 
@@ -539,6 +722,12 @@ An error occurred.
 
 Set to override the NNTP server configured in the source.
 
+=item B<$NNTPPORT>
+
+The NNTP TCP-port to post news to. This variable only needs to be set if the
+TCP-port is not 119 (the default). The '-B<p>' command-line option overrides
+B<$NNTPPORT>.
+
 =item B<$PGPPASS>
 
 Set to override the passphrase configured in the source (used for
@@ -558,11 +747,19 @@ From:-field will be used.
 
 Set the article header field Reply-To: to the return address specified by
 the variable if there isn't already a Reply-To: header in the article.
+The '-B<r>' command-line option overrides B<$REPLYTO>.
 
 =item B<$ORGANIZATION>
 
 Set the article header field Organization: to the contents of the variable
-if there isn't already a Organization: header in the article.
+if there isn't already a Organization: header in the article. The '-B<o>'
+command-line option overrides B<$ORGANIZATION>.
+
+=item B<$DISTRIBUTION>
+
+Set the article header field Distribution: to the contents of the variable
+if there isn't already a Distribution: header in the article. The '-B<d>'
+command-line option overrides B<$DISTRIBUTION>.
 
 =back
 
@@ -572,23 +769,24 @@ if there isn't already a Organization: h
 
 =item F<pgptmp.txt>
 
-Temporary file used to store the reformated article
+Temporary file used to store the reformatted article
 
 =item F<pgptmp.txt.asc>
 
-Temporary file used to store the reformated and signed article
+Temporary file used to store the reformatted and signed article
 
 =item F<$PGPPASSFILE>
 
 The passphrase file to be used for B<pgp>(1) or B<gpg>(1).
 
+=item F<$HOME/.signature>
+
+Signature-file which will be automatically included.
+
 =back
 
 =head1 SECURITY
 
-If interactive usage is configured and B<tinews.pl> prompts for the
-NNTP-password the input is echoed to the terminal.
-
 If you've configured or entered a password, even if the variable that
 contained that password has been erased, it may be possible for someone to
 find that password, in plaintext, in a core dump. In short, if serious
@@ -600,7 +798,8 @@ B<tinews.pl> is designed to be used with
 B<pgp>(1)-5 and B<gpg>(1).
 
 B<tinews.pl> requires the following standard modules to be installed:
-B<Net::NNTP>(3pm), B<Time::Local>(3pm) and B<Term::Readline>(3pm).
+B<Getopt::Long>(3pm), B<Net::NNTP>(3pm), B<Time::Local>(3pm) and
+B<Term::Readline>(3pm).
 
 =head1 AUTHOR
 
@@ -609,7 +808,7 @@ Marc Brockschmidt E<lt>marc@marcbrocksch
 
 =head1 SEE ALSO
 
-B<pgp>(1), B<gpg>(1), B<pgps>(1), B<Net::NNTP>(3pm), B<Time::Local>(3pm),
-B<Term::Readline>(3pm)
+B<pgp>(1), B<gpg>(1), B<pgps>(1), B<Getopt::Long>(3pm), B<Net::NNTP>(3pm),
+B<Time::Local>(3pm), B<Term::Readline>(3pm)
 
 =cut
diff -Nurp tin-1.6.2/tools/url_handler.sh tin-1.8.0/tools/url_handler.sh
--- tin-1.6.2/tools/url_handler.sh	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/tools/url_handler.sh	2005-07-08 17:13:49.000000000 +0200
@@ -25,6 +25,7 @@ case $method in
 			( netscape -remote openURL\($url\) || netscape $url ) || exit 1
 		fi
 		;;
+
 	ftp)
 		if test x$DISPLAY = x; then
 			target=`echo $url | sed 's;^.*://\([^/]*\)/*\(.*\);\1:/\2;'`
@@ -33,18 +34,22 @@ case $method in
 			( netscape -remote openURL\($url\) || netscape $url ) || exit 1
 		fi
 		;;
+
 	mailto)
-		# mutt can't handle mailto:-URLs with embedet subject
-		if test `echo $url | grep -c '\?'` -eq 0 ; then
-			( mutt `echo $url | sed 's;^[^:]*:\(.*\);\1;'` ) || exit 1
-		else
-			if test x$DISPLAY = x; then
-				lynx $url || exit 1
-			else
-				( netscape -remote openURL\($url\) || netscape $url ) || exit 1
-			fi
-		fi
+		( mutt `echo $url` ) || exit 1
+		# ( pine -url `echo $url` ) || exit 1
+#		# old mutts can't handle mailto:-URLs with embedet subject
+#		if test `echo $url | grep -c '\?'` -eq 0 ; then
+#			( mutt `echo $url | sed 's;^[^:]*:\(.*\);\1;'` ) || exit 1
+#		else
+#			if test x$DISPLAY = x; then
+#				lynx $url || exit 1
+#			else
+#				( netscape -remote openURL\($url\) || netscape $url ) || exit 1
+#			fi
+#		fi
 		;;
+
 	news|snews)
 		# usualy ment for reading news on the local server
 		if test x$DISPLAY = x; then
@@ -53,12 +58,14 @@ case $method in
 			( netscape -remote openURL\($url\) || netscape $url ) || exit 1
 		fi
 		;;
+
 	nntp)
 		# usualy ment for reading news via NNTP
 		# needs a special case as netscape can't handle nntp-URLs
 		# *sigh*
 		lynx $url || exit 1
 		;;
+
 esac
 
 exit 0
diff -Nurp tin-1.6.2/tools/w2r.pl tin-1.8.0/tools/w2r.pl
--- tin-1.6.2/tools/w2r.pl	2003-08-10 15:27:36.000000000 +0200
+++ tin-1.8.0/tools/w2r.pl	2005-06-28 10:31:20.000000000 +0200
@@ -18,7 +18,7 @@
 require 5.004;
 
 # version Number
-# $VERSION = "0.2.6";
+# $VERSION = "0.2.7";
 
 while (defined($line = <>)) {
 	chomp $line;
@@ -92,13 +92,15 @@ sub w2p {
 	}
 
 	# common abbreviations
-	#
-	# replace [0-9] with [\d] in the first []
 	# TODO: make this global
+	# replace [0-9] with [\d] in the first []
+	# replace [a-zA-Z0-9_] with [\w] in the first []
+	# replace [a-zA-Z0-9] with [^\W_] in the first []
+	# replace [a-zA-Z] with [^\W\d_] in the first []
 	$rval =~ s/^([^\[]*)\[0-9\]/$1\[\\d\]/o;
-	# replace [a-zA-Z_] with [\w] in the first []
-	# TODO: make this global
 	$rval =~ s/([^\[]*)\[a-za-z0-9_\]/$1\[\\w\]/io;
+	$rval =~ s/([^\[]*)\[a-za-z0-9\]/$1\[^\\W_\]/io;
+	$rval =~ s/([^\[]*)\[a-za-z\]/$1\[^\\W\\d_\]/io;
 
 	# optimizations
 	#
